Noviembre 2018
sparklyr
hace fácil el big dataFactoMineR
y factoextra
nos ayudan a extraer información útil.¿La satisfacción de nuestros clientes está relacionada con dónde viven, qué edad tienen o de dónde vienen ? Consideramos 4 variables
library(sparklyr) library(tidyverse) library(FactoMineR) library(factoextra) library(cowplot)
sc <- spark_connect(master = "local")
Ejemplo de datos
datos_tbl <- datos_tbl %>% mutate( tiene_incidencia = ifelse(is.na(tiene_incidencia), "Sin_incidencia", "Incidencia"), tiene_alguna_porta = ifelse(is.na(tiene_alguna_porta), "no porta", "porta"), entrada = ifelse( is.na(entrada) | entrada == "" | entrada == "NA" , "Sin_porta", entrada ), prov = ifelse(is.na(prov) | prov == "" | prov == "NA", "Prov_desconocida", prov), edad = case_when( edad < 0 ~ "Edad_desconocida", edad < 35 ~ "18-35", edad < 45 ~ "35-44", edad < 55 ~ "45-54", edad < 65 ~ "55-64", edad >= 65 ~ ">64", TRUE ~ "Edad_desconocida" ) )
dat_agrup <- datos_tbl %>% group_by(nps_cat, prov, entrada, edad) %>% count() dat_agrup
La tabla con las frecuencias es suficientemente pequeña para tratarla en local. Con FactoMineR
podemos usar las frecuencias como ponderación de las filas.
dat_mca <- dat_agrup %>% collect() # traemos a local dat_mca <- dat_mca %>% filter(prov != "Prov_desconocida", edad!="Edad_desconocida") res_mca <- MCA(dat_mca[1:4], ncp = 100, row.w = dat_mca$n, graph = FALSE)
fviz_mca_var(res_mca, repel=TRUE, select.var = list(contrib = 20))
En vez de considerar la tabla multivía construimos una tabla a 2 vías
De esta forma estandarizamos
Construimos las tablas de contingencia que necesitamos en spark, usando la función sdf_pivot
tabla_edad <- datos_tbl %>% select(nps_cat, edad, prov) %>% sdf_pivot(nps_cat ~ edad , fun.aggregate = list(edad = "count")) tabla_edad <- collect(tabla_edad) tabla_edad
res_ca <- CA(mat_final, ncp = 10, graph = FALSE)
fviz_screeplot(res_ca)
fviz_ca_row(res_ca)
fviz_contrib(res_ca , choice = "col", axes = c(1,2))
fviz_ca_biplot(res_ca, repel = TRUE, select.col = list(contrib = 20 ), col.col = "contrib", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), arrows = c(TRUE, FALSE))
fviz_ca_biplot(res_ca, repel = TRUE, select.col = list(name = c("18-35","35-44","45-54","55-64", "Incidencia", "Sin_incidencia" ,"Porta_Comp_A","Porta_Comp_B","Porta_Comp_C")), arrows = c(TRUE, FALSE))