INTRODUCCIÓN

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.

COMPRESIÓN DEL NEGOCIO

Calidad Vino Tinto

Nivel de Obesidad

COMPRESIÓN DE LOS DATOS

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"

VARIABLES POR CASO

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

PREPARACIÓN DE DATOS

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.

Modelado

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.

Regresión Logística Multinomial (Obesidad)

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.

Evaluacion

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

DESPLIEGUE

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

Nivel de obesidad

# 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

Conclusiones

Calidad de vino

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.

Nivel de obesidad

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.