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
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")))
real | False | True |
False | 2107 | 51 |
True | 56 | 370 |
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)
pred | False | True |
False | 934 | 27 |
True | 24 | 123 |
caret :: confusionMatrix (data = df_test$pred_factor, reference = df_testsHazardous, positive = 'True')
Confusion Matrix and Statistics
Reference
Prediction | False | True |
False | 934 | 27 |
True | 24 | 123 |
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!