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()

1. Análisis exploratorios

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:

  1. El consumo semanal de verdura.
  2. El consumo semanal de comida grasa.

¿Cuáles son las principales características que observa en estos gráficos?

Estructura de las variables

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

  • La encuesta se realizo en una población de chicos entre 12 y 18 años. La edad media es de 15 años. La mayoria de las observaciones se encuentran entre los 13 y 17 años.
  • Las distribuciones de la edad y la altura son muy cercanas a la normal.
  • La altura promedio es de 1.65 cm aproximadamente.
  • La distribución del peso esta sesgada a derecha, ya que la media del peso se encuentra en los 55 kgs, entendiendo que hay una cierta relación con la edad, donde el peso es menor que en una población adulta.
  • El consumo de comida rápida diario general parece ser muy saludable. La distribución esta sesgada nuevamente a derecha, indicando que lo mas común es un consuma bajo de comida rápida.
  • En general la mayoría no consume alcohol, pero hay un número importante que consume 5 tragos al día.
  • Hay un alto porcentaje de individuos que realizar actividad física 2 o 7 días a la semana. siendo un poco mas alto que el porcentaje que no hace ninguna actividad.

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

  • Resulta alarmante que el mayor consumo de alcohol se encuentre entre los 13 y 17 años. Inicialmente lo más coherente seria que comience en edades mayores pero no es este el caso.
  • Los mayores consumidores de grasa se encuentran entre los 13 y 17 años, con media en individuos de 15 años de edad. Lo mismo sucede con el consumo de frutas, verduras, gaseosas y snacks. Esto podráa deberse a que no existe una gran correlación de estas variables con la edad.

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:

  • Tenemos algunos valores atípicos: Alturas debajo de 136 cms, pesos por arriba de los 91kg, consumo de comida rápida por superiores a las 2 veces semanales.
  • Las distribuciones peso, altura y edad son claramente separables ya que no se solapan. Esto no sucede con consumo de alcohol, nª de días de actividad-física/consume-comida-rapida, para las cuales sus medianas son mas cercanas.

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.

Correlacion de variables numericas

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:

  • El grado de consumo de frutas, verduras y snacks.
  • la actividad física semanal.
  • El nivel educativo.

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.

Apetura por genero

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.

Frecuencia de hambre mensual vs. consumo de frutas y verduras

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

  • La categoría Nunca tiene hambre esta dominada por los que consumen grasas entre 0 y 3 veces por semana. Luego los que consumen mas de 3 veces por semana son muy pocos, lo que indica que a mayor consuma de grasas mas hambre produce.
  • La categoría Casi simple tiene hambre tiene una menor cantidad de individuos que consumen grasas entre 0 y 3 veces por día. Esto indica que al consumir mas grasas tiene mas hambre.
  • La categoría Casi simple tiene hambre para el consumo de verduras/frutas se aprecia que esta dominada por los que consumen entre o 3 veces a la semana. Esto nos dice que los que consumen pocas verduras/frutas tiene mas hambre ya que consumes mas grasas.
 

Realizado por Adrian Marino

adrianmarino@gmail.com