data_obesidad = read.csv("/Users/macbookair/Desktop/R (MASTER)/ObesityDataSet_raw_and_data_sinthetic.csv", header = T)
str(data_obesidad)
## 'data.frame': 2111 obs. of 17 variables:
## $ Gender : chr "Female" "Female" "Male" "Male" ...
## $ Age : num 21 21 23 27 22 29 23 22 24 22 ...
## $ Height : num 1.62 1.52 1.8 1.8 1.78 1.62 1.5 1.64 1.78 1.72 ...
## $ Weight : num 64 56 77 87 89.8 53 55 53 64 68 ...
## $ family_history_with_overweight: chr "yes" "yes" "yes" "no" ...
## $ FAVC : chr "no" "no" "no" "no" ...
## $ FCVC : num 2 3 2 3 2 2 3 2 3 2 ...
## $ NCP : num 3 3 3 3 1 3 3 3 3 3 ...
## $ CAEC : chr "Sometimes" "Sometimes" "Sometimes" "Sometimes" ...
## $ SMOKE : chr "no" "yes" "no" "no" ...
## $ CH2O : num 2 3 2 2 2 2 2 2 2 2 ...
## $ SCC : chr "no" "yes" "no" "no" ...
## $ FAF : num 0 3 2 2 0 0 1 3 1 1 ...
## $ TUE : num 1 0 1 0 0 0 0 0 1 1 ...
## $ CALC : chr "no" "Sometimes" "Frequently" "Frequently" ...
## $ MTRANS : chr "Public_Transportation" "Public_Transportation" "Public_Transportation" "Walking" ...
## $ NObeyesdad : chr "Normal_Weight" "Normal_Weight" "Normal_Weight" "Overweight_Level_I" ...
summary(data_obesidad)
## Gender Age Height Weight
## Length:2111 Min. :14.00 Min. :1.450 Min. : 39.00
## Class :character 1st Qu.:19.95 1st Qu.:1.630 1st Qu.: 65.47
## Mode :character Median :22.78 Median :1.700 Median : 83.00
## Mean :24.31 Mean :1.702 Mean : 86.59
## 3rd Qu.:26.00 3rd Qu.:1.768 3rd Qu.:107.43
## Max. :61.00 Max. :1.980 Max. :173.00
## family_history_with_overweight FAVC FCVC
## Length:2111 Length:2111 Min. :1.000
## Class :character Class :character 1st Qu.:2.000
## Mode :character Mode :character Median :2.386
## Mean :2.419
## 3rd Qu.:3.000
## Max. :3.000
## NCP CAEC SMOKE CH2O
## Min. :1.000 Length:2111 Length:2111 Min. :1.000
## 1st Qu.:2.659 Class :character Class :character 1st Qu.:1.585
## Median :3.000 Mode :character Mode :character Median :2.000
## Mean :2.686 Mean :2.008
## 3rd Qu.:3.000 3rd Qu.:2.477
## Max. :4.000 Max. :3.000
## SCC FAF TUE CALC
## Length:2111 Min. :0.0000 Min. :0.0000 Length:2111
## Class :character 1st Qu.:0.1245 1st Qu.:0.0000 Class :character
## Mode :character Median :1.0000 Median :0.6253 Mode :character
## Mean :1.0103 Mean :0.6579
## 3rd Qu.:1.6667 3rd Qu.:1.0000
## Max. :3.0000 Max. :2.0000
## MTRANS NObeyesdad
## Length:2111 Length:2111
## Class :character Class :character
## Mode :character Mode :character
##
##
##
length(unique(data_obesidad$NCP))
## [1] 635
Esto es raro, deberían de ser menos valores.
Como parte de nuestro análisis exploratorio descubrimos que a partir de la fila 500 muchas de las variables tienen decimales que no deberían de estar ahí (hay que quitarlos y en el peso y altura dejarlo con 2 decimales)
columnas_a_truncar = c('Age','NCP', 'FCVC','CH2O','FAF', 'TUE') # Lista de columnas a truncar
# Creamos un nuevo dataframe con valores truncados
tabla_truncada = data_obesidad
tabla_truncada[, columnas_a_truncar] = lapply(tabla_truncada[, columnas_a_truncar], trunc)
colSums(is.na(tabla_truncada))
## Gender Age
## 0 0
## Height Weight
## 0 0
## family_history_with_overweight FAVC
## 0 0
## FCVC NCP
## 0 0
## CAEC SMOKE
## 0 0
## CH2O SCC
## 0 0
## FAF TUE
## 0 0
## CALC MTRANS
## 0 0
## NObeyesdad
## 0
No tenemos nulos
(FAVC) Frequent consumption of high caloric food (YES/NO)
(FCVC) Frequency of consumption of vegetables 1 = never, 2= sometimes, 3= always
(NCP) Number of main meals: 1-2 = 1, 3=2, >3=
(CAEC) Consumption of food between meals: no, sometimes, frequenlty, always
(CH20) Consumption of water daily: < 1 lt =1, 1-2=2, >2 = 3
(SCC) Calories consumption monitoring: si/no
(FAF) Physical activity frequency: NO =0, 1-2days=1, 2-4days=2, 4-5days=3
(CALC) Consumption of alcohol: NO/SOMETIMES/FREQUENTLY/ALWAYS
(TUE) Time Using technology devices: 0-2 = 0, 3-5 = 1, >5=2
(MTrans) = Public_Transportation/Automobile/Walking/Motorbike/Bike
Nota: Los valores numéricos que representan a un grupo se han asignado asumiento un orden ascendente. Estas variables deben ser transformadas a factor para trabajar con ellas.
variables_a_factor = c('FCVC', "NCP", "CH2O", 'FAF', 'TUE')
# Utilizamos lapply para convertir las variables a factor
tabla_truncada[, variables_a_factor] = lapply(tabla_truncada[, variables_a_factor], as.factor)
Comprobamos el cambio
str(tabla_truncada)
## 'data.frame': 2111 obs. of 17 variables:
## $ Gender : chr "Female" "Female" "Male" "Male" ...
## $ Age : num 21 21 23 27 22 29 23 22 24 22 ...
## $ Height : num 1.62 1.52 1.8 1.8 1.78 1.62 1.5 1.64 1.78 1.72 ...
## $ Weight : num 64 56 77 87 89.8 53 55 53 64 68 ...
## $ family_history_with_overweight: chr "yes" "yes" "yes" "no" ...
## $ FAVC : chr "no" "no" "no" "no" ...
## $ FCVC : Factor w/ 3 levels "1","2","3": 2 3 2 3 2 2 3 2 3 2 ...
## $ NCP : Factor w/ 4 levels "1","2","3","4": 3 3 3 3 1 3 3 3 3 3 ...
## $ CAEC : chr "Sometimes" "Sometimes" "Sometimes" "Sometimes" ...
## $ SMOKE : chr "no" "yes" "no" "no" ...
## $ CH2O : Factor w/ 3 levels "1","2","3": 2 3 2 2 2 2 2 2 2 2 ...
## $ SCC : chr "no" "yes" "no" "no" ...
## $ FAF : Factor w/ 4 levels "0","1","2","3": 1 4 3 3 1 1 2 4 2 2 ...
## $ TUE : Factor w/ 3 levels "0","1","2": 2 1 2 1 1 1 1 1 2 2 ...
## $ CALC : chr "no" "Sometimes" "Frequently" "Frequently" ...
## $ MTRANS : chr "Public_Transportation" "Public_Transportation" "Public_Transportation" "Walking" ...
## $ NObeyesdad : chr "Normal_Weight" "Normal_Weight" "Normal_Weight" "Overweight_Level_I" ...
Ahora verificaremos que los valores numéricos de las variables que represantan a alguna clase sean en efecto los que nosotros consideramos que son
length(unique(tabla_truncada$FCVC))
## [1] 3
table(tabla_truncada$FCVC)
##
## 1 2 3
## 202 1257 652
FCVC Frequency of consumption of vegetables 1 = never | 2 = sometimes| 3 = always
length(unique(tabla_truncada$NCP))
## [1] 4
table(tabla_truncada$NCP)
##
## 1 2 3 4
## 395 285 1362 69
NCP Number of main meals: 1-2 = 1 | 3 = 2 | >3 = 3 | desconocido = 4
length(unique(tabla_truncada$CH2O))
## [1] 3
table(tabla_truncada$CH2O)
##
## 1 2 3
## 769 1180 162
CH20 Consumption of water daily: < 1 lt = 1 | 1-2 lt = 2 | >2 = 3
length(unique(tabla_truncada$FAF))
## [1] 4
table(tabla_truncada$FAF)
##
## 0 1 2 3
## 1011 724 301 75
FAF Physical activity frequency: NO = 0 | 1-2 days = 1 | 2-4 days = 2 | 4-5 days = 3
length(unique(tabla_truncada$TUE))
## [1] 3
table(tabla_truncada$TUE)
##
## 0 1 2
## 1415 587 109
TUE Time Using technology devices: 0-2 = 0 | 3-5 = 1 | >5 = 2
barplot(table(tabla_truncada$SMOKE), col = "skyblue", main = "Fumas?")
Es notable la diferencia, son muchas más las personas que no fuman que las que sí fuman. Esto puede ser un problema cuando entrenemos el modelo pues todo indica que no habrán muchos registros que nos den información sobre las personas que sí fuman.
length(unique(tabla_truncada$SMOKE))
## [1] 2
table(tabla_truncada$SMOKE)
##
## no yes
## 2067 44
Son solamente 44 personas que sí fuman contra 2067 que no
# Ordenamos la talla de menor a mayor pues están en orden alfabético y eso no ayuda visualmente
orden_deseado = c("Insufficient_Weight", "Normal_Weight", "Overweight_Level_I", "Overweight_Level_II", "Obesity_Type_I", "Obesity_Type_II", "Obesity_Type_III")
# Convertimos la columna a un factor con el orden deseado
tabla_truncada$NObeyesdad = factor(tabla_truncada$NObeyesdad, levels = orden_deseado)
tabla_contingencia = table(tabla_truncada$Gender, tabla_truncada$NObeyesdad)
# Creamos el gráfico de barras
barplot(tabla_contingencia, col = c("lightblue", "lightpink"), main = "Talla por Género", las=2, beside = TRUE, legend.text = TRUE, args.legend = list(x = "topright", bty = "n"),cex.names = 0.5)
Es interesante ver cómo en “bajo de peso” son más las mujeres y después en “sobrepeso nivel 3” práctivamente se invierten. En el otro extremo del espectro tenemos en “obesidad tipo 2” casi solo hombres y en “obesidad tipo 3” casi solo mujeres. El resto parecen estar más o menos al mismo nivel.
tabla_contingencia2 = table(tabla_truncada$FAVC, tabla_truncada$NObeyesdad)
# Creamos el gráfico de barras
barplot(tabla_contingencia2, col = c("lightgreen", "red"), main = "Talla por Alto consumo calórico", las=2, beside = TRUE, legend.text = TRUE, args.legend = list(x = "topright", bty = "n"),cex.names = 0.5)
Aquí es interesante como la mayoría de los encuestados, sin importar la talla que tengan, afirman tener un alto consumo calórico.
tabla_contingencia3 = table(tabla_truncada$TUE, tabla_truncada$NObeyesdad)
# Creamos el gráfico de barras
barplot(tabla_contingencia3, col = c("lightyellow", "orange", "black"), main = "Talla por Tiempo usando electrónicos", las=2, beside = TRUE, legend.text = TRUE, args.legend = list(x = "topright", bty = "n"),cex.names = 0.5)
Contrario a lo que podría pensarse, las personas que se encuentran en el espectro de sobrepeso-obesidad parecen no pasar tantas horas de su día utilizando aparatos electrónicos, o al menos eso dicen en las encuestas.
tabla_contingencia4 = table(tabla_truncada$CH2O, tabla_truncada$NObeyesdad)
# Crear el gráfico de barras
barplot(tabla_contingencia4, col = c("lightblue", "yellow", "blue"), main = "Talla por consumo de H2O", las=2, beside = TRUE, legend.text = TRUE, args.legend = list(x = "topright", bty = "n"),cex.names = 0.5)
Todas las clases parecen tener un grupo predominante de personas que cosumen una cantidad media de agua.
tabla_contingencia5 = table(tabla_truncada$SMOKE, tabla_truncada$Gender)
# Creamos el gráfico de barras
barplot(tabla_contingencia5, col = c("lightgreen", "red"), main = "Fumadores por género", las=2, beside = TRUE, legend.text = TRUE, args.legend = list(x = "topright", bty = "n"))
Muy similar en hombres y mujeres, los hombres parecen tener un poco más de fumadores, pero la diferencia es apenas perceptible.
tabla_contingencia6 = table(tabla_truncada$SMOKE, tabla_truncada$NObeyesdad)
# Creamos el gráfico de barras
barplot(tabla_contingencia6, col = c("lightgreen", "red"), main = "Fumadores por Talla", las=2, beside = TRUE, legend.text = TRUE, args.legend = list(x = "topright", bty = "n"),cex.names = 0.5)
La mayor cantidad de fumadores parecen concentarse en las personas con peso normal y obesidad tipo 2, que curiosamente es también donde más hombres hay, así que probablemente el modelo de fumadores tienda a poner a los que sí fuman entre esos dos grupos. (hombres y obesidad tipo 2)
tabla_contingencia7 = table(tabla_truncada$SCC, tabla_truncada$NObeyesdad)
# Creamos el gráfico de barras
barplot(tabla_contingencia7, col = c("lightgreen", "red"), main = "Control de calorias por Talla", las=2, beside = TRUE, legend.text = TRUE, args.legend = list(x = "topright", bty = "n"),cex.names = 0.5)
Vemos que la mayoría de las personas que sí llevan un control calórico se encuentran en “Peso insuficiente”, “Peso normal” y “Sobrepeso nivel 1”. De cualquier forma la gente que hace control de calorías es relativamente poca, veámoslo en números.
length(unique(tabla_truncada$SCC))
## [1] 2
table(tabla_truncada$SCC)
##
## no yes
## 2015 96
Solo 96 personas que sí hacen control de calorías frente a 2015 que no, igual que con los fumadores, el modelo tendrá pocos registros de los cuales aprender. Lo que queda claro es que los hombres tendrán máyor tendencia a ser fumadores mientras que la probabilidad de que las mujeres hagan control de calorías será mayor.
tabla_contingencia8 = table(tabla_truncada$SCC, tabla_truncada$Gender)
# Creamos el gráfico de barras
barplot(tabla_contingencia8, col = c("lightgreen", "red"), main = "Control de calorías por género", las=2, beside = TRUE, legend.text = TRUE, args.legend = list(x = "topright", bty = "n"))
Parece que las mujeres tienen más personas que hacen control de calorías, este grafico es prácticamente inverso al de fumadores.
Tras evaluar visualmente el dataset y hacer algunas investigaciones alternativas concluímos que las variables que mejor se ajustarán para nuestros modelos son las siguientes:
Para el modelo de Fumador:
Variables como SMOKE, FAF (actividad fisica) y CALC (consumo de alcohol) que se considera una estrecha relación si el estilo de vida es saludable o no, ejemplo un atleta o una persona que hace ejercicio regularmente es muy poco probable que consuma cigarro o alcohol ya que esto puede afectar su rendimiento.
Para el modelo del autocontrol en la ingesta calórica:
Calories consumption monitoring (SCC) variable que nos indicará que tan consciente se encuentra el individuo en el consumo de sus propios alimentos.
Para el modelo del grado de obesidad:
Variables como Age, FAVC (consumo de alimentos alto en calorías) , FCVC (consumo de verduras), FAF (actividad física), TUE (uso de dispositivos) MTRANS (transporte que emplea) y NObeyesdad Que nos dará una idea del consumo energético , el nivel de sedentarismo ejemplo: el que usa automóvil o motocicleta tiende a caminar o moverse menos, entre más edad menos movilidad y por proceso biológico natural la generación y acumulación de grasa es mayor. Además la variable NObeyesdad es por si sola una agrupación creada con el IMC que a su vez fue creado a partir de las variables peso y estatura (que pueden ser eliminadas por la misma razón)
Consideramos que el resto de las variables no tienen la misma relevancia para la elaboración los modelos y por eso vamos a presindir de ellas. En el siguiente HTML iniciamos con la creación de los modelos.
.