Ejemplo de clasificación estadística usando un dataset de asteroides

| Última modificación: 8 de julio de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

Vamos a ver un ejemplo de clasificación estadística usando un conjunto de datos cuya categoría es la clasificación de asteroides.

Los datos de entrada son sobre asteroides NeoWs. NeoWs (Near Earth Object Web Service) es un servicio web RESTful para información de asteroides cercanos a la Tierra. Con NeoWs, un usuario puede buscar asteroides según su fecha de aproximación más cercana a la Tierra o buscar un asteroide específico con su identificación de cuerpo pequeño JPL de la NASA, así como explorar el conjunto de datos general.

Ejemplo de clasificación estadística

Leemos el dataset:

#ejemplo de clasificación estadística
library (tidyverse, warn.conflicts = FALSE)
df_asteroids <- read.csv ('./data/nasa_asteroids.csv')
str (df_asteroids)

La columna Hazardous nos dice si el asteroide es potencialmente peligroso o no.

table (df_asteroids$Hazardous)

False: 3932

True: 755

Vamos a ver si existen asteroides duplicados:

head (sort (table (df_asteroids$Name), decreasing = T), 10)

3102762

7

3748472

7

2277810

6

3772993

6

2136818

5

3117468

5

3566465

5

3608620

5

3738932

5

2003362

4

paste ("Hay", nrow (df_asteroids), "entradas para", length (unique (df_asteroids$Name)), "asteroides")

‘Hay 4687 entradas para 3692 asteroides’

Nos quedamos solo con un asteroide por nombre:

#ejemplo de clasificación estadística
df_asteroids <- df_asteroids l>
arrange (desc (Close.Approach.Date)) l> 
distinct (Name, .keep_all = TRUE)
dm (df_asteroids)

3692 . 40

Borramos columnas que no necesitamos para nuestro algoritmo de clasificación:

#ejemplo de clasificación estadística
df_asteroids $Neo.Reference.ID <- NULL
df_asteroids$Name <- NULL
df_asteroids$Equinox <- NULL
df_asteroids$0rbiting.Body <- NULL
df_asteroids$0rbit.ID <- NULL
df_asteroids$Epoch.Date.Close.Approach <- NULL

Calculamos la correlación y vemos la relación entre variables.

Con esto vemos muy fácilmente cuáles y cuántas áreas están correlacionadas y observamos que algunas tienen una correlación exageradamente alta:

#ejemplo de clasificación estadística
cor_asteroides <- df_asteroids %>% dplyr::select (where (is.numeric)) %>% cor()
library (corrplot)
library (RColorBrewer)
options (repr.plot.height = 5, repr.plot.width = 8, repr.plot.res = 200)
corrplot (cor_asteroides, type = "upper", order = "hclust", col = brewer.pal (n = 8, name = "RdYLBu"), tl.cex = 0.8)

corrplot 0.90 loaded

ejemplo de clasificación estadística

Vemos, por ejemplo, que hay correlaciones perfectas que tenemos que quitar, como el diámetro en pies y el diámetro en metros, que están muy correlacionadas, es decir, son lo mismo.

df_asteroids %>% select (starts_with ("Est.Dia")) %>% cor ()

Nos quedamos con las columnas que son numéricas, calculamos la correlación y sobre esta matriz de correlación eliminamos las columnas que tienen una correlación superior a 0.95:

#ejemplo de clasificación estadística
library (caret)
df_asteroids_numeric <- df_asteroids dplyr::select (where (is.numeric))
cor_asteroides <- df_asteroids_numeric cor ()
col_to_remove = findCorrelation (cor_asteroides, cutoff = 0.95)
df_asteroids_reduced = df_asteroids_numeric [ , c (col_to_remove)]
df_asteroids_reduced$Hazardous <- df_asteroids$Hazardous
str (df_asteroids_reduced)

Loading required package: lattice

findCorrelation
table (df_asteroids_reduced$Hazardous)

False: 3116

True: 576

#ejemplo de clasificación estadística
df_asteroids_reduced$Hazardous <- as.factor (df_asteroids_reduced$Hazardous)
idx <- sample (1 : nrow (df_asteroids_reduced), * 0.7 nrow(df_asteroids_reduced)*0.7)
df_train <- df_asteroids_reduced [ idx, ]
df_test <- df_asteroids_reduced [ -idx, ]
table (df_train$Hazardous)

False: 2158

True: 426

head (df_train)
model_reglog <- glm (formula = Hazardous~., df_train, family = binomial ())
summary (model_reglog)

Warning message:

“glm.fit: fitted probabilities numerically 0 or 1 occurred”

pred_train <- predict (model_reglog, df_train)
table (real = df_train$Hazardous, factor (pred_train > 0, labels = c ("False", "True")))
realFalseTrue
False210751
True56370
caret :: confusionMatrix (data = factor (predict (model_reglog, df_train) > 0, labels = c ("False", "True")),
reference = df_train$Hazardous,
positive = 'True')

Aquí tenemos los resultados: un 95% para train.

df_test$pred <- predict (model_reglog, df_test)
df_test$pred_factor <- factor (df_test$pred > 0, labels = c ("False", "True"))
table (pred = df_test$pred_factor, real = df_test$Hazardous)
predFalseTrue
False93427
True24123
caret :: confusionMatrix (data = df_test$pred_factor,
reference = df_testsHazardous, positive = 'True')

Confusion Matrix and Statistics

Reference

PredictionFalseTrue
False 93427
True24123

Para test también son bastante buenos: 95%.

Ahora que hemos visto este ejemplo de clasificación en estadística, podemos subir al siguiente nivel y seguir aprendiendo. En KeepCoding tenemos el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación intensiva en la que adquirirás todas las herramientas necesarias para incursionar rápidamente en el mercado laboral del Big Data. ¡Anímate a cambiar tu vida y solicita más información!

Sandra Navarro

Business Intelligence & Big Data Advisor & Coordinadora del Bootcamp en Data Science, Big Data & Machine Learning.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado