Para iniciar se borran todos los objetos en memoria y cargan las bibliotecas necesarias para realiza el análisis exploratorio:
options(warn=-1)
rm(list=ls())
gc()## used (Mb) gc trigger (Mb) max used (Mb)
## Ncells 468586 25.1 1006041 53.8 665551 35.6
## Vcells 876576 6.7 8388608 64.0 1813089 13.9
options(warn=-2)# install.packages("pacman")
library(pacman)
p_load(tidyverse)
p_load_gh('adrianmarino/commons')
import('../src/dataset.R')## [1] "-> '../src/dataset.R' script loadded successfuly!"
import('../src/preprocessing.R')## [1] "-> '../src/preprocessing.R' script loadded successfuly!"
import('../src/plot.R')## [1] "-> '../src/plot.R' script loadded successfuly!"
train_set <- load_train_set() %>% preprocess()Leer el archivo “encuesta_salud_train.csv”. ¿Qué puede mencionar sobre su estructura y variables? ¿Cómo es la correlación entre las variables numéricas? Utilice y analice en detalle algún gráfico que sirva para sacar conclusiones sobre la asociación de variables realizando apertura por género. En particular, ¿cómo es la correlación entre la variable a explicar (peso) y el resto de las variables numéricas? Para las categorías de la variable frecuencia de hambre mensual, analice gráficamente la distribución en términos de frecuencia relativa de:
¿Cuáles son las principales características que observa en estos gráficos?
glimpse(train_set)## Rows: 7,024
## Columns: 15
## $ edad <int> 17, 15, 15, 16, 17, 15, 13, 17, 17, 16, …
## $ genero <fct> Femenino, Masculino, Masculino, Masculin…
## $ nivel_educativo <fct> 2do año/11vo grado nivel Polimodal o 4to…
## $ altura <int> 165, 178, 172, 170, 170, 178, 156, 163, …
## $ peso <int> 62, 62, 62, 65, 75, 88, 46, 60, 57, 51, …
## $ frecuencia_hambre_mensual <fct> Rara vez, Rara vez, Nunca, Nunca, Rara v…
## $ dias_consumo_comida_rapida <int> 0, 0, 3, 1, 1, 2, 0, 0, 0, 3, 4, 2, 1, 1…
## $ edad_consumo_alcohol <fct> 14 o 15 años, 7 años o menos, Nunca tomé…
## $ consumo_diario_alcohol <dbl> 5.0, 4.0, 0.0, 0.0, 0.0, 5.0, 1.0, 0.5, …
## $ dias_actividad_fisica_semanal <int> 7, 7, 7, 7, 0, 7, 0, 2, 7, 3, 2, 2, 7, 1…
## $ consumo_semanal_frutas <fct> No comí frutas durante los últimos 7 día…
## $ consumo_semanal_verdura <fct> 4 a 6 veces durante los últimos 7 días, …
## $ consumo_semanal_gaseosas <fct> 1 a 3 veces durante los últimos 7 días, …
## $ consumo_semanal_snacks <fct> 1 a 3 veces durante los últimos 7 días, …
## $ consumo_semanal_comida_grasa <fct> No comí comida alta en grasa en los últi…
Tenemos tanto variable numéricas como categóricas:
Numéricas
Edad: Medida en años.
Altura: Medida en cms.
Peso: Medida en kgs.
Días consumo comida rápida: Medida en Días/Semana.
Días actividad física semanal: Medida en Días/Semana.
Consumo diario alcohol: Medida en Tragos/Día.
Categóricas
Genero: No ordinal.
Nivel educativo: De tipo ordinal. El orden seria 8, 9, 1, 2, 3 llevándolo a la medida polimodal.
Frecuencia hambre mensual: De tipo ordinal.
Edad consumo alcohol: Es la edad de inicio de consumo de alcohol. Es claramente ordinal. Medida en años.
Consumo semanal frutas: Categórica ordinal. Medida en Veces/Semana.
Consumo semanal verdura: Categórica ordinal. Medida en Veces/Semana.
Consumo_semanal_gaseosas: Categórica ordinal. Medida en Veces/Semana.
Consumo semanal snacks: Categórica ordinal. Medida en Veces/Semana.
Consumo semanal comida grasa: Categórica ordinal. Medida en Veces/Semana.
A continuación abreviamos los valores de la variables categóricas y los llevamos a una única unidad de media, ya sea veces/semana o veces/día:
train_set2 <- train_set %>% shorten_values()
show_values(train_set2 %>% select(-altura, -peso))## _________
## edad n
## =========
## 12 16
## 13 1135
## 14 1529
## 15 1580
## 16 1608
## 17 1107
## 18 49
## ¯¯¯¯¯¯¯¯¯
## ______________
## genero n
## ==============
## Femenino 3764
## Masculino 3260
## ¯¯¯¯¯¯¯¯¯¯¯¯¯¯
## ____________________
## nivel_educativo n
## ====================
## 8 887
## 9 1367
## 1 1582
## 2 1738
## 3 1350
## NA 100
## ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
## ______________________________
## frecuencia_hambre_mensual n
## ==============================
## Nunca 4844
## Rara vez 1447
## Algunas veces 589
## Casi siempre 78
## Siempre 27
## NA 39
## ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
## _______________________________
## dias_consumo_comida_rapida n
## ===============================
## 0 4405
## 1 1368
## 2 620
## 3 289
## 4 122
## 5 64
## 6 26
## 7 130
## ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
## _________________________
## edad_consumo_alcohol n
## =========================
## 0 1444
## <=7 361
## 8-9 345
## 10-11 713
## 12-13 2040
## 14-15 1848
## 16-17 271
## >=18 2
## ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
## ___________________________
## consumo_diario_alcohol n
## ===========================
## 0 2760
## 0.5 608
## 1 647
## 2 614
## 3 583
## 4 385
## 5 1427
## ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
## __________________________________
## dias_actividad_fisica_semanal n
## ==================================
## 0 1107
## 1 895
## 2 1168
## 3 931
## 4 659
## 5 689
## 6 300
## 7 1275
## ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
## ___________________________
## consumo_semanal_frutas n
## ===========================
## 0 1320
## <=3 2286
## 4-6 942
## 7 973
## 14 759
## 21 336
## >=28 388
## NA 20
## ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
## ____________________________
## consumo_semanal_verdura n
## ============================
## 0 610
## <=3 1929
## 4-6 1510
## 7 1227
## 14 993
## 21 264
## >=28 448
## NA 43
## ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
## _____________________________
## consumo_semanal_gaseosas n
## =============================
## 0 1520
## <=3 2398
## 4-6 1025
## 7 701
## 14 503
## 21 281
## >=28 571
## NA 25
## ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
## ___________________________
## consumo_semanal_snacks n
## ===========================
## 0 2162
## <=3 3144
## 4-6 623
## 7 604
## 14 231
## 21 100
## >=28 134
## NA 26
## ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
## _________________________________
## consumo_semanal_comida_grasa n
## =================================
## 0 1523
## <=3 3215
## 4-6 1079
## 7 643
## 14 267
## 21 104
## >=28 142
## NA 51
## ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Por otro lado, se encontraron valores faltantes. Estos no estaban expresados por valores NA o NULL, sino que están definidos explícitamente como “Data perdido”. En el paso anterior se transformaron a NA.
A continuación se visualiza el número y porcentaje de faltantes por variable:
missings_summary(train_set2)Se aprecia hay 7 variables con valores faltantes. Por otro lado, la variable con mayor número de faltantes llega al 1.4% del total(nivel educativo). Dado que tenemos tan poco valores faltantes se decidió eliminarlos. A continuación se eliminan las observaciones con valores faltantes y se vuelve a realizar el reporte para constrastar:
raw_train_set_count <- nrow(train_set2)
train_set3 <- train_set2 %>% process_missings() %>% drop_na()## Note: Using an external vector in selections is ambiguous.
## ℹ Use `all_of(many_misings_columns)` instead of `many_misings_columns` to silence this message.
## ℹ See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
## This message is displayed once per session.
missings_summary(train_set3)print(paste('Total faltantes: ', (1 - (nrow(na.omit(train_set3)) / raw_train_set_count)) * 100, "%"))## [1] "Total faltantes: 3.82972665148064 %"
Finalemnte se filtraron todas las observaciones con valores faltantes (un total de 3.8%).
A continuación vamos a analizar cada variable por separados comenzando por la variables numéricas:
hist_plots(train_set3, bins = c(7.5, 20, 20, 8.5, 7.5, 8.5))Observaciones
Edad vs consumos
A continuación se visualizan los niveles de consumo según la edad del individuo.
`
train_set3 %>%
mutate(
edad = as.factor(edad),
peso = as.factor(cut(peso, breaks=c(20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150), right = FALSE)),
alcohol = as.integer(consumo_diario_alcohol),
grasas = as.integer(consumo_semanal_comida_grasa),
frutas = as.integer(consumo_semanal_frutas),
gaseosas = as.integer(consumo_semanal_gaseosas),
snacks = as.integer(consumo_semanal_snacks),
verduras = as.integer(consumo_semanal_verdura)
) %>% segmented_bar_plots(
columns = c('alcohol', 'grasas', 'frutas', 'gaseosas', 'snacks', 'verduras'),
segmented_by = 'edad'
)Observaciones
Luego, si comparamos las distribuciones por medio de un box-plot comparativo:
box_plots(
train_set3,
title = 'Comparativas de distribuciones para las variables numéricas'
)Se puede observar que:
A continuación se realizan barplots para las variables categóricas:
bar_plots(train_set3)Luego podemos observar que:
El dataset tiene un sesgo de genero del 15%. Siendo números tan elevados entiendo que podríamos asumir que es un sesgo bajo.
La mayoría de los individuos están en 2 año del polimodal. Lo contrario sucede con 8vo año, donde se encuentra el menor numero de individuos.
Excluyendo a los individuos que nunca tiene hambre, las categorías mas importantes son Rara vez y Algunas veces, los cuales están dentro de los parámetros normales.
Lo mas frecuente es comenzar a consumir alcohol entre las 12-13 años seguido de 14-15 años. Por otro lado en menor porcentaje(-32%) hay una gran cantidad de individuos que no han comenzaron a consumir alcohol. Finalmente en menor medida existen individuos que consumen alcohol antes de los 7 años de edad, lo cual es preocupante.
El mayor porcentaje de individuos consumen hasta 3 frutas por semana, seguido de aquellos que no consumen.
A diferencia de las frutas, el consumo de verduras es mayor. Quienes no consumen verduras bajan a la mitad vs. frutas. La mayoría consume verduras hasta 3 veces por semana seguido de 4 a 7.
La mayoría consume gaseosas hasta 3 veces por semana y se aprecia un porcentaje importante para aquellos que no consumen. E tercer grupo de mayor consumo, son aquellos que consumen entre 4 a 7 días a la semana, siendo menos del 50% al comparalo con aquellos que consumen hasta 3 veces por semana.
La mayoría consume snasks es hasta 3 veces a la semana o directamente. no se consumen.
Se aprecia un patrón en la moda del consumo hasta 3 veces por semana en grasas, snacks, gaseosas, frutas y verduras.
A continuación analizamos las correlaciones entre las variables numéricas:
corr_plot(train_set3, title='Correlación de variables numéricas')Observaciones
A primera vista se puede observar que la altura es un factor importante para determinar el peso. Por otro lado se aprecia una relación en menor medida entre el peso y la edad. Esto ultimo también sucede con la altura y la edad, pero en menor medida. Por ultimo también se aprecia una relación considerable entre la edad y el consumo de alcohol, entendiendo que a mayor edad el consumo de alcohol es mayor(Correlación positiva). También existe una relación muy baja entre el peso y el consumo de alcohol o comida rápida. Esto puede deberse a que en general la mayoría realiza actividad física toda la semana, lo cual puede influir a que estas relaciones sean débiles.
A continúan vamos a analizar la relación entre variables realizando una apertura por genero. Para realizar este paso vamos seleccionar las variables que mejor discriminan el peso, entendiendo que son las mas importantes para nuestro análisis ya que el gráfico ggpairs no es legible con muchas variables.
fi_result <- features_importance(train_set3, target_column)
plot_features_importance(fi_result) Era de esperable que la altura influya en el peso como vimos anteriormente. Luego la edad también influye ya que contamos con individuos entre los 12 y 18 años. Otros factores importantes son:
Para ser mas equitativos tomamos las 6 variables mas importantes para determinar el peso para ambas métricas:
most_important_variables <- important_variables_set(fi_result, top=5)## Selecting by %IncMSE
## Selecting by IncNodePurity
most_important_variables <- most_important_variables[most_important_variables != 'nivel_educativo']
most_important_variables## [1] "altura" "edad"
## [3] "genero" "edad_consumo_alcohol"
## [5] "dias_actividad_fisica_semanal" "consumo_semanal_frutas"
## [7] "consumo_semanal_verdura"
Comparamos las distribuciones del peso para ambos generos:
ggplot(train_set3, aes(x=genero, y=peso, fill=genero)) + geom_boxplot()ggplot(train_set3, aes(x=genero, y=altura, fill=genero)) + geom_boxplot()Se aprecia que la media del peso masculino es mayor al femenino, tal vez por una diferencia en su musculatura o debido a la altura promedio en ambos géneros.
A continuación veamos la relación entre las variables mas importantes segregando por genero:
train_set3 %>%
select(c(most_important_variables, peso)) %>%
pairs_plot('genero') +
labs(title = 'Correlación de variables mas importantes segmentadas por género')Observaciones
Se aprecia que los masculinos tiene una relación mas fuerte entre su altura y el consumo de frutas/verduras que los femeninos. En comprensible que al ser mas altos en promedio requieran mayor alimento. Por otro lado, se puede apreciar el consumo de frutas y verduras es muy parece en ambos sexos, aunque el consumo de verduras es mayor en todos los casos.
La altura parase discriminar bien al peso, ya que ambos grupos están no están están bien separados en el scatter
altura vs. peso.
Las medias de las distribuciones de las alturas según el genero también estén bien separadas constatando que la altura los masculino es mayor.
Las edades tienen varias moda una por cada año: 8vo, 9no, 1ro, 2do, y 3ro. Las edades están bien balanceadas entre ambos sexos, sus medias son prácticamente iguales.
El consumo de alcohol parece ser liberalmente superior en individuos masculino.
El número de individuos por genero esta sesgado, tenemos mas femeninos que masculinos, pero es una sesgo bajo.
La mayor correlación como ya vimos anteriormente esta dada entre altura-peso y edad-peso.
Las individuos masculinos son los que realizan mas actividad física.
mosaic_plot(
train_set3,
column = 'frecuencia_hambre_mensual',
segmented_by = 'consumo_semanal_verdura',
title = 'Frecuencia de hambre vs consumo de verduras'
)mosaic_plot(
train_set3,
column = 'frecuencia_hambre_mensual',
segmented_by = 'consumo_semanal_frutas',
title = 'Frecuencia de hambre vs consumo de frutas'
)Observaciones
Realizado por Adrian Marino
adrianmarino@gmail.com