Para este informe se empleara la metodología CRISP-DM (Cross-Industry Standard Process for Data Mining), la cual, es un enfoque estructurado ampliamente utilizado en proyectos de minería de datos y ciencia de datos. Esta metodología permite desarrollar soluciones analíticas eficaces, asegurando que las decisiones técnicas estén alineadas con los objetivos del negocio.
En esta ocasión, se aplicará la metodología CRISP-DM a dos casos prácticos de diferente indole, demostrando su flexibilidad y utilidad:
Caso No. 1: Calidad del Vino Tinto
Objetivo del negocio:
Una bodega productora de vino desea clasificar automáticamente sus productos en función de su calidad. El objetivo es construir un modelo que permita predecir si un vino es de alta calidad o baja calidad en función de características fisicoquímicas como el alcohol, el pH, la densidad, entre otras. Esto permitirá tomar decisiones más informadas en procesos de control de calidad, segmentación de productos y estrategias de comercialización.
Caso No. 2: Nivel de Obesidad
Objetivo del negocio:
Una entidad de salud pública busca identificar patrones de comportamiento asociados a diferentes niveles de obesidad, con el fin de diseñar campañas de prevención personalizadas. El objetivo del modelo es clasificar a los individuos en distintas categorías de obesidad (normal, sobrepeso, obesidad, etc.) a partir de datos como índice de masa corporal, edad, frecuencia de consumo de vegetales, y actividad física. Esta información será clave para orientar estrategias de salud preventiva y mejorar la atención médica personalizada.
Calidad Vino Tinto
Clasificar el vino en “alta calidad” o “baja calidad”.
Se define alta calidad como, calidad >= 7 y baja si es menor.
Nivel de Obesidad
En esta fase de la metodología se almacenan los datos de cada caso.
if (!require("readxl")) install.packages("readxl")
if (!require("dplyr")) install.packages("dplyr")
library(readxl)
library(dplyr)
vino <- read_excel("C:/Users/David Rivera/OneDrive/5/io/vino_tinto_calidad_tt.xlsx")
obesidad <- read_excel("C:/Users/David Rivera/OneDrive/5/io/ObesityDataSet.xlsx")
cat("Resumen de Vino Tinto:\n")
## Resumen de Vino Tinto:
head(vino)
## # A tibble: 6 × 12
## acidez_fija acidez_volatil acido_citrico azucar_residual cloruros
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 7.4 0.7 0 1.9 0.076
## 2 7.8 0.88 0 2.6 0.098
## 3 7.8 0.76 0.04 2.3 0.092
## 4 11.2 0.28 0.56 1.9 0.075
## 5 7.4 0.7 0 1.9 0.076
## 6 7.4 0.66 0 1.8 0.075
## # ℹ 7 more variables: dioxido_azufre_libre <dbl>, dioxido_azufre_total <dbl>,
## # densidad <dbl>, ph <dbl>, sulfitos <dbl>, alcohol <dbl>, calidad <dbl>
summary(vino)
## acidez_fija acidez_volatil acido_citrico azucar_residual
## Min. : 4.60 Min. :0.1200 Min. :0.000 Min. : 0.900
## 1st Qu.: 7.10 1st Qu.:0.3900 1st Qu.:0.090 1st Qu.: 1.900
## Median : 7.90 Median :0.5200 Median :0.260 Median : 2.200
## Mean : 8.32 Mean :0.5278 Mean :0.271 Mean : 2.539
## 3rd Qu.: 9.20 3rd Qu.:0.6400 3rd Qu.:0.420 3rd Qu.: 2.600
## Max. :15.90 Max. :1.5800 Max. :1.000 Max. :15.500
## cloruros dioxido_azufre_libre dioxido_azufre_total densidad
## Min. :0.01200 Min. : 1.00 Min. : 6.00 Min. :0.9901
## 1st Qu.:0.07000 1st Qu.: 7.00 1st Qu.: 22.00 1st Qu.:0.9956
## Median :0.07900 Median :14.00 Median : 38.00 Median :0.9968
## Mean :0.08747 Mean :15.87 Mean : 46.47 Mean :0.9967
## 3rd Qu.:0.09000 3rd Qu.:21.00 3rd Qu.: 62.00 3rd Qu.:0.9978
## Max. :0.61100 Max. :72.00 Max. :289.00 Max. :1.0037
## ph sulfitos alcohol calidad
## Min. :2.740 Min. :0.3300 Min. : 8.40 Min. :3.000
## 1st Qu.:3.210 1st Qu.:0.5500 1st Qu.: 9.50 1st Qu.:5.000
## Median :3.310 Median :0.6200 Median :10.20 Median :6.000
## Mean :3.311 Mean :0.6581 Mean :10.42 Mean :5.636
## 3rd Qu.:3.400 3rd Qu.:0.7300 3rd Qu.:11.10 3rd Qu.:6.000
## Max. :4.010 Max. :2.0000 Max. :14.90 Max. :8.000
str(vino)
## tibble [1,599 × 12] (S3: tbl_df/tbl/data.frame)
## $ acidez_fija : num [1:1599] 7.4 7.8 7.8 11.2 7.4 7.4 7.9 7.3 7.8 7.5 ...
## $ acidez_volatil : num [1:1599] 0.7 0.88 0.76 0.28 0.7 0.66 0.6 0.65 0.58 0.5 ...
## $ acido_citrico : num [1:1599] 0 0 0.04 0.56 0 0 0.06 0 0.02 0.36 ...
## $ azucar_residual : num [1:1599] 1.9 2.6 2.3 1.9 1.9 1.8 1.6 1.2 2 6.1 ...
## $ cloruros : num [1:1599] 0.076 0.098 0.092 0.075 0.076 0.075 0.069 0.065 0.073 0.071 ...
## $ dioxido_azufre_libre: num [1:1599] 11 25 15 17 11 13 15 15 9 17 ...
## $ dioxido_azufre_total: num [1:1599] 34 67 54 60 34 40 59 21 18 102 ...
## $ densidad : num [1:1599] 0.998 0.997 0.997 0.998 0.998 ...
## $ ph : num [1:1599] 3.51 3.2 3.26 3.16 3.51 3.51 3.3 3.39 3.36 3.35 ...
## $ sulfitos : num [1:1599] 0.56 0.68 0.65 0.58 0.56 0.56 0.46 0.47 0.57 0.8 ...
## $ alcohol : num [1:1599] 9.4 9.8 9.8 9.8 9.4 9.4 9.4 10 9.5 10.5 ...
## $ calidad : num [1:1599] 5 5 5 6 5 5 5 7 7 5 ...
colnames(vino)
## [1] "acidez_fija" "acidez_volatil" "acido_citrico"
## [4] "azucar_residual" "cloruros" "dioxido_azufre_libre"
## [7] "dioxido_azufre_total" "densidad" "ph"
## [10] "sulfitos" "alcohol" "calidad"
cat("\nResumen de Datos de Obesidad:\n")
##
## Resumen de Datos de Obesidad:
head(obesidad)
## # A tibble: 6 × 17
## Género Edad `Estatura (m)` `Peso (kg)` `Antecedentes familiares de sobrepeso`
## <chr> <dbl> <dbl> <dbl> <chr>
## 1 Female 21 1.62 64 yes
## 2 Female 21 1.52 56 yes
## 3 Male 23 1.8 77 yes
## 4 Male 27 1.8 87 no
## 5 Male 22 1.78 89.8 no
## 6 Male 29 1.62 53 no
## # ℹ 12 more variables:
## # `¿Consume frecuentemente alimentos altos en calorías?` <chr>,
## # `Frecuencia del consumo de vegetales (1-3)` <dbl>,
## # `Número de comidas principales al día` <dbl>,
## # `¿Consume alimentos entre comidas?` <chr>, `¿Fuma?` <chr>,
## # `Consumo diario de agua (1-3)` <dbl>,
## # `¿Monitorea su consumo calórico?` <chr>, …
summary(obesidad)
## Género Edad Estatura (m) Peso (kg)
## 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
## Antecedentes familiares de sobrepeso
## Length:2111
## Class :character
## Mode :character
##
##
##
## ¿Consume frecuentemente alimentos altos en calorías?
## Length:2111
## Class :character
## Mode :character
##
##
##
## Frecuencia del consumo de vegetales (1-3) Número de comidas principales al día
## Min. :1.000 Min. :1.000
## 1st Qu.:2.000 1st Qu.:2.659
## Median :2.386 Median :3.000
## Mean :2.419 Mean :2.686
## 3rd Qu.:3.000 3rd Qu.:3.000
## Max. :3.000 Max. :4.000
## ¿Consume alimentos entre comidas? ¿Fuma?
## Length:2111 Length:2111
## Class :character Class :character
## Mode :character Mode :character
##
##
##
## Consumo diario de agua (1-3) ¿Monitorea su consumo calórico?
## Min. :1.000 Length:2111
## 1st Qu.:1.585 Class :character
## Median :2.000 Mode :character
## Mean :2.008
## 3rd Qu.:2.477
## Max. :3.000
## Frecuencia de actividad física (hrs/semana)
## Min. :0.0000
## 1st Qu.:0.1245
## Median :1.0000
## Mean :1.0103
## 3rd Qu.:1.6667
## Max. :3.0000
## Horas diarias en dispositivos tecnológicos Frecuencia de consumo de alcohol
## Min. :0.0000 Length:2111
## 1st Qu.:0.0000 Class :character
## Median :0.6253 Mode :character
## Mean :0.6579
## 3rd Qu.:1.0000
## Max. :2.0000
## Medio de transporte habitual Nivel de obesidad
## Length:2111 Length:2111
## Class :character Class :character
## Mode :character Mode :character
##
##
##
str(obesidad)
## tibble [2,111 × 17] (S3: tbl_df/tbl/data.frame)
## $ Género : chr [1:2111] "Female" "Female" "Male" "Male" ...
## $ Edad : num [1:2111] 21 21 23 27 22 29 23 22 24 22 ...
## $ Estatura (m) : num [1:2111] 1.62 1.52 1.8 1.8 1.78 1.62 1.5 1.64 1.78 1.72 ...
## $ Peso (kg) : num [1:2111] 64 56 77 87 89.8 53 55 53 64 68 ...
## $ Antecedentes familiares de sobrepeso : chr [1:2111] "yes" "yes" "yes" "no" ...
## $ ¿Consume frecuentemente alimentos altos en calorías?: chr [1:2111] "no" "no" "no" "no" ...
## $ Frecuencia del consumo de vegetales (1-3) : num [1:2111] 2 3 2 3 2 2 3 2 3 2 ...
## $ Número de comidas principales al día : num [1:2111] 3 3 3 3 1 3 3 3 3 3 ...
## $ ¿Consume alimentos entre comidas? : chr [1:2111] "Sometimes" "Sometimes" "Sometimes" "Sometimes" ...
## $ ¿Fuma? : chr [1:2111] "no" "yes" "no" "no" ...
## $ Consumo diario de agua (1-3) : num [1:2111] 2 3 2 2 2 2 2 2 2 2 ...
## $ ¿Monitorea su consumo calórico? : chr [1:2111] "no" "yes" "no" "no" ...
## $ Frecuencia de actividad física (hrs/semana) : num [1:2111] 0 3 2 2 0 0 1 3 1 1 ...
## $ Horas diarias en dispositivos tecnológicos : num [1:2111] 1 0 1 0 0 0 0 0 1 1 ...
## $ Frecuencia de consumo de alcohol : chr [1:2111] "no" "Sometimes" "Frequently" "Frequently" ...
## $ Medio de transporte habitual : chr [1:2111] "Public_Transportation" "Public_Transportation" "Public_Transportation" "Walking" ...
## $ Nivel de obesidad : chr [1:2111] "Normal_Weight" "Normal_Weight" "Normal_Weight" "Overweight_Level_I" ...
colnames(obesidad)
## [1] "Género"
## [2] "Edad"
## [3] "Estatura (m)"
## [4] "Peso (kg)"
## [5] "Antecedentes familiares de sobrepeso"
## [6] "¿Consume frecuentemente alimentos altos en calorías?"
## [7] "Frecuencia del consumo de vegetales (1-3)"
## [8] "Número de comidas principales al día"
## [9] "¿Consume alimentos entre comidas?"
## [10] "¿Fuma?"
## [11] "Consumo diario de agua (1-3)"
## [12] "¿Monitorea su consumo calórico?"
## [13] "Frecuencia de actividad física (hrs/semana)"
## [14] "Horas diarias en dispositivos tecnológicos"
## [15] "Frecuencia de consumo de alcohol"
## [16] "Medio de transporte habitual"
## [17] "Nivel de obesidad"
Nivel de Obesidad
Variable dependiente (Y):
Nivel de obesidad (categórica multinomial):
Categorías: Bajo peso, Peso normal, Sobrepeso I y II, Obesidad I, II y III
Variables independientes (X):
Género (categórica)
Edad (numérica continua)
Estatura (m) (numérica continua)
Peso (kg) (numérica continua)
Antecedentes familiares de sobrepeso (categórica binaria)
¿Consume frecuentemente alimentos altos en calorías? (categórica binaria)
Frecuencia del consumo de vegetales (1-3) (ordinal)
Número de comidas principales al día (numérica discreta)
¿Consume alimentos entre comidas? (ordinal)
¿Fuma? (binaria)
Consumo diario de agua (1-3) (ordinal)
¿Monitorea su consumo calórico? (binaria)
Frecuencia de actividad física (numérica continua)
Horas diarias en dispositivos tecnológicos (numérica continua)
Frecuencia de consumo de alcohol (ordinal)
Medio de transporte habitual (categórica)
Calidad Vino Tinto
Variable dependiente (Y):
calidad: Escala ordinal de 0 a 10 (en esta base, usualmente entre 3 y 8). Se refiere a una evaluación sensorial del vino.
Variables independientes (X):
acidez_fija
acidez_volatil
acido_citrico
azucar_residual
cloruros
dioxido_azufre_libre
dioxido_azufre_total
densidad
ph
sulfitos
alcohol
Calidad Vino Tinto (regresión lineal)
vino$alta_calidad <- ifelse(vino$calidad >= 7, 1, 0)
table(vino$alta_calidad)
##
## 0 1
## 1382 217
vino_modelo <- vino %>%
select(acidez_fija, acidez_volatil, acido_citrico, azucar_residual, cloruros,
dioxido_azufre_libre, dioxido_azufre_total, densidad, ph, sulfitos,
alcohol, alta_calidad)
En el conjunto de datos del vino tinto, se construyó una variable binaria llamada alta calidad, que clasifica los vinos como de alta calidad (1) si la puntuación es 7 o más, y como de baja calidad (0) si es menor. Se seleccionaron únicamente las variables fisicoquímicas más relevantes para alimentar el modelo predictivo.
Nivel de Obesidad (regresión logística)
if (!require("dplyr")) install.packages("dplyr")
library(dplyr)
obesidad_modelo <- obesidad %>%
select(Edad,
`Estatura (m)`,
`Peso (kg)`,
`Frecuencia del consumo de vegetales (1-3)`,
`Número de comidas principales al día`,
`Frecuencia de actividad física (hrs/semana)`,
`Horas diarias en dispositivos tecnológicos`,
`Nivel de obesidad`) %>%
mutate(`Nivel de obesidad` = as.factor(`Nivel de obesidad`)) %>%
rename(obesidad = `Nivel de obesidad`)
if (!require("nnet")) install.packages("nnet")
library(nnet)
modelo_obesidad <- multinom(obesidad ~ ., data = obesidad_modelo)
## # weights: 63 (48 variable)
## initial value 4107.816325
## iter 10 value 3784.929644
## iter 20 value 2676.629506
## iter 30 value 2183.178192
## iter 40 value 1674.198146
## iter 50 value 664.863863
## iter 60 value 450.093666
## iter 70 value 297.894693
## iter 80 value 251.635453
## iter 90 value 227.001496
## iter 100 value 214.962598
## final value 214.962598
## stopped after 100 iterations
summary(modelo_obesidad)
## Call:
## multinom(formula = obesidad ~ ., data = obesidad_modelo)
##
## Coefficients:
## (Intercept) Edad `Estatura (m)` `Peso (kg)`
## Normal_Weight 149.1959 -0.106693743 -168.3084 2.755956
## Obesity_Type_I 533.3039 -0.003188446 -637.1029 7.959989
## Obesity_Type_II 559.5863 0.838231192 -850.1915 10.947624
## Obesity_Type_III 369.2120 -2.445549005 -852.0743 11.601470
## Overweight_Level_I 256.3103 -0.084379727 -289.8348 4.167055
## Overweight_Level_II 369.9666 -0.040716857 -436.9454 5.920504
## `Frecuencia del consumo de vegetales (1-3)`
## Normal_Weight -2.861399
## Obesity_Type_I -3.584458
## Obesity_Type_II 4.554679
## Obesity_Type_III 41.550672
## Overweight_Level_I -3.471878
## Overweight_Level_II -3.921218
## `Número de comidas principales al día`
## Normal_Weight -0.7640413
## Obesity_Type_I -2.3928242
## Obesity_Type_II -5.1016609
## Obesity_Type_III 29.4160961
## Overweight_Level_I -1.1935359
## Overweight_Level_II -1.8060193
## `Frecuencia de actividad física (hrs/semana)`
## Normal_Weight -0.1714356
## Obesity_Type_I -1.9166569
## Obesity_Type_II -5.9444520
## Obesity_Type_III -25.5580003
## Overweight_Level_I -0.3386706
## Overweight_Level_II -0.2578752
## `Horas diarias en dispositivos tecnológicos`
## Normal_Weight -0.1586607
## Obesity_Type_I 2.4762183
## Obesity_Type_II -4.8702639
## Obesity_Type_III -2.5182976
## Overweight_Level_I 0.2008974
## Overweight_Level_II 1.7161974
##
## Std. Errors:
## (Intercept) Edad `Estatura (m)` `Peso (kg)`
## Normal_Weight 4.387553 0.09029187 4.730251 0.1209647
## Obesity_Type_I 4.872935 0.11336491 3.845935 0.1462601
## Obesity_Type_II 0.991656 0.25697678 6.172156 0.1485107
## Obesity_Type_III 1.043263 0.82667589 6.129299 0.1763169
## Overweight_Level_I 6.653039 0.09806726 7.237389 0.1231154
## Overweight_Level_II 4.023780 0.10435300 4.465863 0.1351929
## `Frecuencia del consumo de vegetales (1-3)`
## Normal_Weight 0.9472431
## Obesity_Type_I 1.4288934
## Obesity_Type_II 1.9867105
## Obesity_Type_III 7.5420383
## Overweight_Level_I 1.0436909
## Overweight_Level_II 1.1494918
## `Número de comidas principales al día`
## Normal_Weight 0.5707032
## Obesity_Type_I 0.8825464
## Obesity_Type_II 1.9092068
## Obesity_Type_III 6.5718701
## Overweight_Level_I 0.6383929
## Overweight_Level_II 0.7065303
## `Frecuencia de actividad física (hrs/semana)`
## Normal_Weight 0.5456989
## Obesity_Type_I 0.8422481
## Obesity_Type_II 1.4887115
## Obesity_Type_III 4.1250484
## Overweight_Level_I 0.6064493
## Overweight_Level_II 0.6884678
## `Horas diarias en dispositivos tecnológicos`
## Normal_Weight 0.7261815
## Obesity_Type_I 1.1056796
## Obesity_Type_II 1.8130396
## Obesity_Type_III 3.1920586
## Overweight_Level_I 0.8114112
## Overweight_Level_II 0.9203771
##
## Residual Deviance: 429.9252
## AIC: 525.9252
Para el caso de obesidad, se seleccionaron variables clave como edad, estatura, peso, número de comidas diarias, entre otras. La variable dependiente nivel obesidad fue convertida a un factor categórico para permitir la clasificación multinomial. Esto permite que el modelo identifique patrones según diferentes niveles de obesidad.
Regresión Logística Calidad de vino
if (!require("dplyr")) install.packages("dplyr")
library(dplyr)
modelo_vino <- glm(alta_calidad ~ ., data = vino, family = "binomial")
summary(modelo_vino)
##
## Call:
## glm(formula = alta_calidad ~ ., family = "binomial", data = vino)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.856e+02 5.834e+06 0.000 1.000
## acidez_fija 1.260e-01 7.104e+03 0.000 1.000
## acidez_volatil 5.297e-01 3.734e+04 0.000 1.000
## acido_citrico 6.315e-01 4.025e+04 0.000 1.000
## azucar_residual 8.288e-02 3.957e+03 0.000 1.000
## cloruros -4.719e-01 1.418e+05 0.000 1.000
## dioxido_azufre_libre -1.221e-02 6.443e+02 0.000 1.000
## dioxido_azufre_total 4.780e-03 2.557e+02 0.000 1.000
## densidad -1.363e+02 5.956e+06 0.000 1.000
## ph 6.040e-01 5.428e+04 0.000 1.000
## sulfitos 3.365e-01 3.206e+04 0.000 1.000
## alcohol -4.954e-02 7.173e+03 0.000 1.000
## calidad 4.889e+01 1.069e+04 0.005 0.996
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1.2699e+03 on 1598 degrees of freedom
## Residual deviance: 3.4961e-08 on 1586 degrees of freedom
## AIC: 26
##
## Number of Fisher Scoring iterations: 25
Se implemento un modelo de regresión logística para predecir si un vino pertenece a la categoría de alta calidad. Los coeficientes del modelo muestran la influencia de cada variable de sus componentes en la probabilidad de que el vino sea bien valorado o por el contrario mal. Por ejemplo, el contenido de alcohol suele tener un efecto positivo en la calidad, mientras que la acidez volátil podría reducirla.
library(nnet)
modelo_obesidad <- multinom(obesidad ~ ., data = obesidad_modelo)
## # weights: 63 (48 variable)
## initial value 4107.816325
## iter 10 value 3784.929644
## iter 20 value 2676.629506
## iter 30 value 2183.178192
## iter 40 value 1674.198146
## iter 50 value 664.863863
## iter 60 value 450.093666
## iter 70 value 297.894693
## iter 80 value 251.635453
## iter 90 value 227.001496
## iter 100 value 214.962598
## final value 214.962598
## stopped after 100 iterations
summary(modelo_obesidad)
## Call:
## multinom(formula = obesidad ~ ., data = obesidad_modelo)
##
## Coefficients:
## (Intercept) Edad `Estatura (m)` `Peso (kg)`
## Normal_Weight 149.1959 -0.106693743 -168.3084 2.755956
## Obesity_Type_I 533.3039 -0.003188446 -637.1029 7.959989
## Obesity_Type_II 559.5863 0.838231192 -850.1915 10.947624
## Obesity_Type_III 369.2120 -2.445549005 -852.0743 11.601470
## Overweight_Level_I 256.3103 -0.084379727 -289.8348 4.167055
## Overweight_Level_II 369.9666 -0.040716857 -436.9454 5.920504
## `Frecuencia del consumo de vegetales (1-3)`
## Normal_Weight -2.861399
## Obesity_Type_I -3.584458
## Obesity_Type_II 4.554679
## Obesity_Type_III 41.550672
## Overweight_Level_I -3.471878
## Overweight_Level_II -3.921218
## `Número de comidas principales al día`
## Normal_Weight -0.7640413
## Obesity_Type_I -2.3928242
## Obesity_Type_II -5.1016609
## Obesity_Type_III 29.4160961
## Overweight_Level_I -1.1935359
## Overweight_Level_II -1.8060193
## `Frecuencia de actividad física (hrs/semana)`
## Normal_Weight -0.1714356
## Obesity_Type_I -1.9166569
## Obesity_Type_II -5.9444520
## Obesity_Type_III -25.5580003
## Overweight_Level_I -0.3386706
## Overweight_Level_II -0.2578752
## `Horas diarias en dispositivos tecnológicos`
## Normal_Weight -0.1586607
## Obesity_Type_I 2.4762183
## Obesity_Type_II -4.8702639
## Obesity_Type_III -2.5182976
## Overweight_Level_I 0.2008974
## Overweight_Level_II 1.7161974
##
## Std. Errors:
## (Intercept) Edad `Estatura (m)` `Peso (kg)`
## Normal_Weight 4.387553 0.09029187 4.730251 0.1209647
## Obesity_Type_I 4.872935 0.11336491 3.845935 0.1462601
## Obesity_Type_II 0.991656 0.25697678 6.172156 0.1485107
## Obesity_Type_III 1.043263 0.82667589 6.129299 0.1763169
## Overweight_Level_I 6.653039 0.09806726 7.237389 0.1231154
## Overweight_Level_II 4.023780 0.10435300 4.465863 0.1351929
## `Frecuencia del consumo de vegetales (1-3)`
## Normal_Weight 0.9472431
## Obesity_Type_I 1.4288934
## Obesity_Type_II 1.9867105
## Obesity_Type_III 7.5420383
## Overweight_Level_I 1.0436909
## Overweight_Level_II 1.1494918
## `Número de comidas principales al día`
## Normal_Weight 0.5707032
## Obesity_Type_I 0.8825464
## Obesity_Type_II 1.9092068
## Obesity_Type_III 6.5718701
## Overweight_Level_I 0.6383929
## Overweight_Level_II 0.7065303
## `Frecuencia de actividad física (hrs/semana)`
## Normal_Weight 0.5456989
## Obesity_Type_I 0.8422481
## Obesity_Type_II 1.4887115
## Obesity_Type_III 4.1250484
## Overweight_Level_I 0.6064493
## Overweight_Level_II 0.6884678
## `Horas diarias en dispositivos tecnológicos`
## Normal_Weight 0.7261815
## Obesity_Type_I 1.1056796
## Obesity_Type_II 1.8130396
## Obesity_Type_III 3.1920586
## Overweight_Level_I 0.8114112
## Overweight_Level_II 0.9203771
##
## Residual Deviance: 429.9252
## AIC: 525.9252
Se aplicó una regresión logística multinomial para clasificar a las personas según su nivel de obesidad. El modelo calcula la probabilidad de pertenecer a cada categoría en función de características como el peso, la estatura o la actividad física. Por ejemplo, a mayor peso y menor actividad, aumenta la probabilidad de pertenecer a las categorías de obesidad tipo II o III.
Calidad de vino
library(caret)
pred_vino <- predict(modelo_vino, type = "response")
clase_vino <- ifelse(pred_vino > 0.5, 1, 0)
confusionMatrix(as.factor(clase_vino), as.factor(vino$alta_calidad))
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 1382 0
## 1 0 217
##
## Accuracy : 1
## 95% CI : (0.9977, 1)
## No Information Rate : 0.8643
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 1
##
## Mcnemar's Test P-Value : NA
##
## Sensitivity : 1.0000
## Specificity : 1.0000
## Pos Pred Value : 1.0000
## Neg Pred Value : 1.0000
## Prevalence : 0.8643
## Detection Rate : 0.8643
## Detection Prevalence : 0.8643
## Balanced Accuracy : 1.0000
##
## 'Positive' Class : 0
##
El modelo de vino logró una buena precisión al clasificar los productos según su calidad. La matriz de confusión muestra cuántos vinos fueron correctamente etiquetados como de alta o baja calidad. El accuracy general indica que el modelo tiene un buen desempeño en tareas de clasificación binaria.
Nivel de obesidad
pred_obesidad <- predict(modelo_obesidad)
confusionMatrix(pred_obesidad, obesidad_modelo$obesidad)
## Confusion Matrix and Statistics
##
## Reference
## Prediction Insufficient_Weight Normal_Weight Obesity_Type_I
## Insufficient_Weight 269 3 0
## Normal_Weight 3 278 0
## Obesity_Type_I 0 0 346
## Obesity_Type_II 0 0 4
## Obesity_Type_III 0 0 0
## Overweight_Level_I 0 6 0
## Overweight_Level_II 0 0 1
## Reference
## Prediction Obesity_Type_II Obesity_Type_III Overweight_Level_I
## Insufficient_Weight 0 0 0
## Normal_Weight 0 0 4
## Obesity_Type_I 6 0 0
## Obesity_Type_II 289 0 0
## Obesity_Type_III 2 324 0
## Overweight_Level_I 0 0 275
## Overweight_Level_II 0 0 11
## Reference
## Prediction Overweight_Level_II
## Insufficient_Weight 0
## Normal_Weight 0
## Obesity_Type_I 0
## Obesity_Type_II 0
## Obesity_Type_III 0
## Overweight_Level_I 15
## Overweight_Level_II 275
##
## Overall Statistics
##
## Accuracy : 0.9739
## 95% CI : (0.9662, 0.9803)
## No Information Rate : 0.1663
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.9696
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: Insufficient_Weight Class: Normal_Weight
## Sensitivity 0.9890 0.9686
## Specificity 0.9984 0.9962
## Pos Pred Value 0.9890 0.9754
## Neg Pred Value 0.9984 0.9951
## Prevalence 0.1288 0.1360
## Detection Rate 0.1274 0.1317
## Detection Prevalence 0.1288 0.1350
## Balanced Accuracy 0.9937 0.9824
## Class: Obesity_Type_I Class: Obesity_Type_II
## Sensitivity 0.9858 0.9731
## Specificity 0.9966 0.9978
## Pos Pred Value 0.9830 0.9863
## Neg Pred Value 0.9972 0.9956
## Prevalence 0.1663 0.1407
## Detection Rate 0.1639 0.1369
## Detection Prevalence 0.1667 0.1388
## Balanced Accuracy 0.9912 0.9854
## Class: Obesity_Type_III Class: Overweight_Level_I
## Sensitivity 1.0000 0.9483
## Specificity 0.9989 0.9885
## Pos Pred Value 0.9939 0.9291
## Neg Pred Value 1.0000 0.9917
## Prevalence 0.1535 0.1374
## Detection Rate 0.1535 0.1303
## Detection Prevalence 0.1544 0.1402
## Balanced Accuracy 0.9994 0.9684
## Class: Overweight_Level_II
## Sensitivity 0.9483
## Specificity 0.9934
## Pos Pred Value 0.9582
## Neg Pred Value 0.9918
## Prevalence 0.1374
## Detection Rate 0.1303
## Detection Prevalence 0.1360
## Balanced Accuracy 0.9708
En el caso del modelo de obesidad, la matriz de confusión revela qué tan bien el modelo distingue entre los distintos niveles. El modelo tiene mejor rendimiento en clases con más datos (como peso normal), pero puede presentar errores entre clases similares (por ejemplo, sobrepeso I y II).
Calidad Vino Tinto
if (!require("readxl")) install.packages("readxl")
if (!require("glmnet")) install.packages("glmnet")
library(readxl)
library(glmnet)
vino <- read_excel("C:/Users/David Rivera/OneDrive/5/io/vino_tinto_calidad_tt.xlsx")
vino$alta_calidad <- ifelse(vino$calidad >= 7, 1, 0)
X <- model.matrix(alta_calidad ~ . - calidad, data = vino)[, -1]
y <- vino$alta_calidad
modelo_vino <- glmnet(X, y, family = "binomial", alpha = 0)
predecir_calidad_vino <- function(acidez_fija, acidez_volatil, acido_citrico, azucar_residual,
cloruros, dioxido_azufre_libre, dioxido_azufre_total,
densidad, ph, sulfitos, alcohol) {
datos_vino <- data.frame(acidez_fija = acidez_fija,
acidez_volatil = acidez_volatil,
acido_citrico = acido_citrico,
azucar_residual = azucar_residual,
cloruros = cloruros,
dioxido_azufre_libre = dioxido_azufre_libre,
dioxido_azufre_total = dioxido_azufre_total,
densidad = densidad,
ph = ph,
sulfitos = sulfitos,
alcohol = alcohol)
X_nuevo <- model.matrix(~ ., data = datos_vino)[, -1]
prob <- predict(modelo_vino, newx = X_nuevo, s = 0.01, type = "response")
clase <- ifelse(prob >= 0.5, "Alta calidad", "Baja calidad")
cat("Probabilidad de alta calidad:", round(prob, 3), "\nClasificación:", clase)
}
predecir_calidad_vino(acidez_fija = 6.5,
acidez_volatil = 0.2,
acido_citrico = 0.5,
azucar_residual = 2.2,
cloruros = 0.04,
dioxido_azufre_libre = 20,
dioxido_azufre_total = 80,
densidad = 0.9935,
ph = 3.4,
sulfitos = 0.7,
alcohol = 13.0)
## Probabilidad de alta calidad: 0.617
## Clasificación: Alta calidad
# Instalar y cargar paquetes
if (!require("readxl")) install.packages("readxl")
if (!require("glmnet")) install.packages("glmnet")
library(readxl)
library(glmnet)
vino <- read_excel("C:/Users/David Rivera/OneDrive/5/io/vino_tinto_calidad_tt.xlsx")
vino$alta_calidad <- ifelse(vino$calidad >= 7, 1, 0)
X <- model.matrix(alta_calidad ~ . - calidad, data = vino)[, -1]
y <- vino$alta_calidad
modelo_vino <- glmnet(X, y, family = "binomial", alpha = 0)
predecir_calidad_vino <- function(acidez_fija, acidez_volatil, acido_citrico, azucar_residual,
cloruros, dioxido_azufre_libre, dioxido_azufre_total,
densidad, ph, sulfitos, alcohol) {
datos_vino <- data.frame(acidez_fija = acidez_fija,
acidez_volatil = acidez_volatil,
acido_citrico = acido_citrico,
azucar_residual = azucar_residual,
cloruros = cloruros,
dioxido_azufre_libre = dioxido_azufre_libre,
dioxido_azufre_total = dioxido_azufre_total,
densidad = densidad,
ph = ph,
sulfitos = sulfitos,
alcohol = alcohol)
X_nuevo <- model.matrix(~ ., data = datos_vino)[, -1]
prob <- predict(modelo_vino, newx = X_nuevo, s = 0.01, type = "response")
clase <- ifelse(prob >= 0.5, "Alta calidad", "Baja calidad")
cat("Probabilidad de alta calidad:", round(prob, 3), "\nClasificación:", clase)
}
predecir_calidad_vino(acidez_fija = 6.8,
acidez_volatil = 0.45,
acido_citrico = 0.2,
azucar_residual = 2.2,
cloruros = 0.065,
dioxido_azufre_libre = 14,
dioxido_azufre_total = 45,
densidad = 0.9968,
ph = 3.45,
sulfitos = 0.5,
alcohol = 10.3)
## Probabilidad de alta calidad: 0.04
## Clasificación: Baja calidad
# Instalar y cargar paquetes necesarios
if (!require("readxl")) install.packages("readxl")
if (!require("dplyr")) install.packages("dplyr")
if (!require("nnet")) install.packages("nnet")
library(readxl)
library(dplyr)
library(nnet)
obesidad <- read_excel("C:/Users/David Rivera/OneDrive/5/io/ObesityDataSet.xlsx")
obesidad_modelo <- obesidad %>%
select(Edad,
`Estatura (m)`,
`Peso (kg)`,
`Frecuencia del consumo de vegetales (1-3)`,
`Número de comidas principales al día`,
`Frecuencia de actividad física (hrs/semana)`,
`Horas diarias en dispositivos tecnológicos`,
`Nivel de obesidad`) %>%
rename(obesidad = `Nivel de obesidad`) %>%
mutate(obesidad = as.factor(obesidad))
modelo_obesidad <- multinom(obesidad ~ ., data = obesidad_modelo)
## # weights: 63 (48 variable)
## initial value 4107.816325
## iter 10 value 3784.929644
## iter 20 value 2676.629506
## iter 30 value 2183.178192
## iter 40 value 1674.198146
## iter 50 value 664.863863
## iter 60 value 450.093666
## iter 70 value 297.894693
## iter 80 value 251.635453
## iter 90 value 227.001496
## iter 100 value 214.962598
## final value 214.962598
## stopped after 100 iterations
predecir_nivel_obesidad <- function(Edad, Estatura, Peso, Vegetales, Comidas,
Actividad, Pantalla) {
datos <- data.frame(
Edad = Edad,
`Estatura.m.` = Estatura,
`Peso.kg.` = Peso,
`Frecuencia.del.consumo.de.vegetales..1.3.` = Vegetales,
`Número.de.comidas.principales.al.día` = Comidas,
`Frecuencia.de.actividad.física..hrs.semana.` = Actividad,
`Horas.diarias.en.dispositivos.tecnológicos` = Pantalla
)
colnames(datos) <- colnames(obesidad_modelo)[1:7]
clase <- predict(modelo_obesidad, newdata = datos)
cat("Clasificación estimada:", as.character(clase))
}
# 5. Ejecutar ejemplo de prueba
predecir_nivel_obesidad(Edad = 25,
Estatura = 1.75,
Peso = 67,
Vegetales = 3,
Comidas = 3,
Actividad = 5,
Pantalla = 2)
## Clasificación estimada: Normal_Weight
En el análisis de la calidad del vino tinto, se construyó un modelo de regresión logística binaria con regularización, capaz de clasificar los productos en función de sus características fisicoquímicas. El modelo mostró un buen desempeño al identificar variables clave como el alcohol, la acidez volátil y la densidad como factores determinantes en la percepción de calidad. Además, se desarrolló una función predictiva que permite ingresar los parámetros de un nuevo vino y obtener una clasificación inmediata, lo cual resulta útil para procesos de control de calidad y toma de decisiones comerciales. Esta aplicación concreta demuestra cómo la analítica puede integrarse de forma práctica en contextos productivos reales.
En el caso del nivel de obesidad, se implementó un modelo de regresión logística multinomial para predecir categorías de peso corporal a partir de variables físicas y de comportamiento. El modelo evidenció que factores como el peso, la actividad física, el tiempo frente a pantallas y el consumo de vegetales son claves en la clasificación. Se desarrolló una función que permite estimar de forma directa el nivel de obesidad de una persona, a partir de datos fácilmente recolectables, lo cual representa una herramienta potencialmente valiosa para campañas de prevención en salud pública, educación nutricional o triaje en instituciones de salud. Este caso resalta cómo la ciencia de datos puede contribuir significativamente al diseño de estrategias preventivas personalizadas.