Presentación de David García Almenzar (@dgalmenzar) en la reunión de Usuarios de R de Almería del 12 de enero de 2017.
Uno de los retos más importantes en el análisis de datos y sobre el que menos se suele hablar es la preparación de los mismos, vamos a ver 4 procesos fundamentales:
1. Tratamiento de valores perdidos o erróneos
2. Definición de tipologías
3. Tratamiento de outliers
4. Reducción de la dimensionalidad
2. Usuarios-R
Almería
@dgalmenzar@almeriarusers almeriarusers.wordpress.com
PRESENTACIÓN
David Garcia Almenzar
Licenciado en Matemáticas por la Universidad de Almería
Máster en Estadística Aplicada com R Software por la Universidad Rey Juan Carlos de Madrid
Data Scientist en el dpto. de Inteligencia de Negocio de Cajamar
Miembro de Cajamar Data Lab
@dgalmenzar www.linkedin.com/in/david-garcia-almenzar-159499129
3. Usuarios-R
Almería
@dgalmenzar@almeriarusers almeriarusers.wordpress.com
INTRODUCCIÓN
Uno de los retos más importantes en el análisis de datos y sobre el que menos se suele hablar es la
preparación de los mismos, vamos a ver 4 procesos fundamentales:
Tratamiento de valores perdidos o erróneos
Definición de tipologías
Tratamiento de outliers
Reducción de la dimensionalidad
Para ello vamos a trabajar sobre la BD del reto de Predictive Modelling de la PythonHack 2016.
Hemos ralizado diversas modificaciones en las variables para incluir valores perdidos y erróneos.
bd <- read.table(“DIRECTORIO/Archivo.txt", header = TRUE, quote=""",sep = "|", dec=",")
4. Usuarios-R
Almería
@dgalmenzar@almeriarusers almeriarusers.wordpress.com
TRATAMIENTO DE VALORES PERDIDOS O ERRÓNEOS
Lo primero que debemos hacer una vez tenemos nuestra BD en R es visualizarla, para ello
disponemos de las funciones:
• head(): nos muestra las primeras filas de la BD
• str(): nos indica el tipo de variable y nos muestra los primeros valores de cada una
• Summary(): hace un breve resumen de la variable según su tipo y nos indica, si los hay, cuantos
valores perdidos localiza.
Para tratar los valores perdidos tenemos tres opciones:
• Eliminar el registro en el que se encuentra dicho valor: na.omit()
bd<-bd[!is.na(bd$TARGET),]
bd<-na.omit(bd)
• Recodificar el valor a otro que nos interese: is.na()
bd<-bd[is.na(bd)]<-0
• Estimar el valor a través del resto de variables, para ello podemos usar, por ejemplo el paquete
mice.
bd<-mice(bd, method="sample")
En nuestro ejemplo, dado que tenemos suficientes registros hemos optado por eliminarlos.
5. Usuarios-R
Almería
@dgalmenzar@almeriarusers almeriarusers.wordpress.com
TRATAMIENTO DE VALORES PERDIDOS O ERRÓNEOS
Para tratar los valores erróneos disponemos del paquete clickR que nos permite, con las funciones
fix, corregir fechas, números y factores.
Para corregir fechas
bd$DATE <- fix.dates(bd$DATE, cent = "19")
Para corregir niveles de un factor
bd$DEMO <- fix.levels(bd$DEMO, levels=c("BAJA", "MEDIA", "ALTA"), k=5, plot=TRUE)
y estas categorías pasan a NAs
ALTA BAJA MEDIA
6. Usuarios-R
Almería
@dgalmenzar@almeriarusers almeriarusers.wordpress.com
DEFINICION DE TIPOLOGÍAS
Variable Descripción Tipo
Id Identificador de cliente categórica (eliminar)
Socio_Demo_01-05 Variables sociodemográficas 01-02 cat 03-05 num
Imp_Cons_01-17 Importe de consumos habituales numérica
Imp_Sal_01-21 Importe de los saldos de los distintos productos numérica
Ind_prod_01-23 Tenencia de los distintos productos financieros categórica
Ind_Tend_01-09 Tendencia los principales productos financieros categórica
Num_Oper_01-23 Número de operaciones en los distintos productos numérica
Target Variable objetivo categórica
Una vez corregidos los valores pasamos a definir la tipología de las variables para poder trabajar
con ellas en los modelos. Para ello hacemos uso de las funcionalidades que nos da el paquete dplyr
para trabajar con BD, en nuestro caso las variables tienen la siguientes categorias:
Separamos las variables categóricas de las numéricas:
bd_factor <- select(bd, -starts_with("IMP"), -starts_with("NUM"), -SOCIO_DEMO_03, -SOCIO_DEMO_04, -SOCIO_DEMO_05)
bd_numeric <- select(bd,starts_with("IMP"), starts_with("NUM"), SOCIO_DEMO_03, SOCIO_DEMO_04, SOCIO_DEMO_05)
Asignamos la tipología a las variables
bd_factor<- data.frame(apply(bd_factor, 2, as.factor))
bd_numeric<- data.frame(apply(bd_numeric, 2, as.numeric))
Volvemos a unir la BD
bd <- bind_cols(bd_factor,bd_numeric)
Eliminamos las variables que no entran en el estudio
bd <- select(bd,-ID)
7. Usuarios-R
Almería
@dgalmenzar@almeriarusers almeriarusers.wordpress.com
TRATAMIENTO DE OUTLIERS
Los outliers son un problema que se da en las variables numéricas y que provocan en los modelos
errores de clasificación pudiendo provocar incluso que la creación del modelo aborte. Podemos
abordarlos de dos formas, eliminando el registro que contenga un outlier o recodificando el valor
de dicho registro a un máximo más acorde con los valores.
Realizamos gráfico de la variable a tratar
bd %>% filter(IMP_SAL_01 > 0) %>%
ggplot(aes(x = TARGET, y = IMP_SAL_01, fill= TARGET)) +
scale_x_discrete("Target") +
scale_y_continuous("Variable") +
geom_boxplot()
Detectamos los outliers
bd %>% filter(IMP_SAL_01 > 0) -> datosfilter
out <- which(bd$IMP_SAL_01 %in%
boxplot.stats(datosfilter$IMP_SAL_01)$out)
Vemos cuantos son
length(out)
Eliminamos los outliers
bd <- bd[-out,]
O recodificamos valores
bd$IMP_SAL_01[bd$IMP_SAL_01] <- 3000
Antes de limpiar outliers
Después de limpiar outliers
8. Usuarios-R
Almería
@dgalmenzar@almeriarusers almeriarusers.wordpress.com
TRATAMIENTO DE OUTLIERS
En las variables categóricas no tenemos outliers como tal pero si algo aproximado, las categorias
que no tengan una representación mínima pueden generar problemas en la modelización, por
tanto es aconsejable recodificarlas, o según el problema, eliminarlas.
Visualizamos las categorias
ggplot(bd, aes(x= IND_PROD_02, group = TARGET )) +
geom_bar(aes(y = ..prop.., fill = factor(..x..)), stat = "count") +
geom_text(aes(label = scales::percent(..prop..), y = ..prop..), stat = "count", vjust = -.5) +
labs(y = "Percent", fill = "IND_PROD_01") +
facet_grid(~TARGET) +
scale_y_continuous(labels = scales::percent)
Recodificamos aquellas categorías que tienen poca
presencia uniendola a otra que tenga una distribución
similar para el 0 y el 1
bd$ IND_PROD_02[bd$ IND_PROD_02==‘2’] <- ‘0’
9. Usuarios-R
Almería
@dgalmenzar@almeriarusers almeriarusers.wordpress.com
REDUCCIÓN DE LA DIMENSIONALIDAD
Normalmente las BDs que trabajamos tienen un elevado número de variables que pueden aportar
o no información a nuestro modelo y que pueden estar o no relacionadas entre si. Con la
reducción de dimensiones lo que pretendemos es eliminar toda esta información redundante e
innecesaria que afecta tanto a los tiempos de ejecución como a la calidad del modelo.
ANALISIS DE CORRELACIONES
Este análisis se aplica únicamente a variables numéricas y con él detectamos que variables tienen
una alta correlacción,para ello usamos la función findCorrelation del paquete Caret. Una vez
detectadas, eliminamos las mismas.
Seleccionamos las variables y visualizamos el cuadro de
correlaciones
nums <- sapply(bd, is.numeric)
train.corr <- cor(bd[,nums])
corrplot(train.corr, tl.cex = 0.5)
Calculamos las correlaciones altas
indcorr <- findCorrelation(train.corr,cutoff = 0.70)
names(bd[,nums][indcorr])
Eliminamos las variables correlacionadas
eliminar<-names(bd[,nums][indcorr])
bd <- bd[ , !names(clientcs3) %in% eliminar]
10. Usuarios-R
Almería
@dgalmenzar@almeriarusers almeriarusers.wordpress.com
REDUCCIÓN DE LA DIMENSIONALIDAD
VARIABLES CON VARIANZA NULA
Este análisis nos permite detectar que variables tienen una varianza casi nula lo que implica que no
pueden aportar información a la clasificación (son muy semejantes a una constante), para ello
usamos la función nearZeroVar del paquete Caret.
Equiparamos los 0 a los 1
indY <- which("TARGET" == names(bd))
set.seed(1976)
bd_down <- downSample(x = bd[,-indY], y = bd$TARGET)
table(bd_down$Class)
prop.table(table(bd_down$Class))
Eliminamos variables con varianza nula
ind.zero.var = nearZeroVar(bd_down, freqCut = 99/1, uniqueCut = 10)
names(bd_down[,ind.zero.var])
bd_down <- bd_down[,-ind.zero.var]
11. Usuarios-R
Almería
@dgalmenzar@almeriarusers almeriarusers.wordpress.com
COMPARACIÓN Y RESULTADO
Al principio de nuestro ejemplo partíamos de una BD con 471.839 filas y 100 columnas y, tras
aplicar los procesos de depuración de los datos nos ha quedado una BD con 257.576 registros y 56
columnas. Estos son los resultados obtenidos tras al trabajo de limpieza realizado:
VARIABLES ELIMINADAS POR CORRELACION ALTA VARIABLES ELIMINADAS POR VARIANZA CASI NULA
NUM_OPER_21 IMP_SAL_21 IND_PROD_04 IMP_SAL_06 IMP_CONS_07 NUM_OPER_08
NUM_OPER_18 NUM_OPER_23 IND_PROD_06 IMP_SAL_07 IMP_CONS_09 NUM_OPER_09
IMP_SAL_09 IMP_SAL_19 IND_TEND_08 IMP_SAL_08 IMP_CONS_13 NUM_OPER_22
IMP_SAL_14 IMP_SAL_18 IND_PROD_08 IMP_SAL_11 IMP_CONS_14 NUM_OPER_24
NUM_OPER_02 IND_TEND_01 IMP_CONS_02 IMP_CONS_15
NUM_OPER_17 IMP_SAL_03 IMP_CONS_03 IMP_CONS_16
NUM_OPER_03 IMP_SAL_16 IMP_CONS_04 NUM_OPER_05
IMP_SAL_12 IMP_SAL_15 IMP_CONS_05 NUM_OPER_06
NUM_OPER_10 IMP_SAL_20 IMP_CONS_06 NUM_OPER_07
VARIABLES QUE ENTRARIAN EN EL MODELO
SOCIO_DEMO_01 IND_PROD_01 IND_PROD_02 IND_PROD_03 IND_TEND_09 IND_TEND_02 IND_PROD_05 IND_PROD_07
IND_PROD_11 IND_TEND_07 IND_TEND_04 IND_TEND_06 IND_TEND_03 IND_TEND_05 SOCIO_DEMO_02 IND_PROD_09
IND_PROD_19 IND_PROD_12 IND_PROD_13 IND_PROD_14 IND_PROD_15 IND_PROD_16 IND_PROD_17 IND_PROD_18
IMP_SAL_04 IND_PROD_20 IND_PROD_21 IND_PROD_22 IND_PROD_23 IMP_SAL_01 IMP_SAL_02 IMP_SAL_17
IMP_CONS_01 IMP_SAL_05 IMP_SAL_10 IMP_SAL_13 IMP_CONS_08 IMP_CONS_10 IMP_CONS_12 IMP_CONS_17
NUM_OPER_19 NUM_OPER_11 NUM_OPER_12 NUM_OPER_13 NUM_OPER_14 NUM_OPER_04 NUM_OPER_15 NUM_OPER_16
IND_PROD_10 NUM_OPER_20 SOCIO_DEMO_03 SOCIO_DEMO_04 SOCIO_DEMO_05 IND_PROD_10 TARGET
12. Usuarios-R
Almería
@dgalmenzar@almeriarusers almeriarusers.wordpress.com
APRENDIENDO A DEPURAR DATOS
MUCHAS GRACIAS
“El comercio no trata sobre mercancías, trata sobre información. Las mercancías se sientan en el
almacén hasta que la información las mueve.”
C. J. Cherryh, escritor.
“Ya no estamos en la era de la información. Estamos en la era de la gestión de la información.”
Chris Hardwick, actor.