UNIVERSIDAD NACIONAL AGRARIA LA MOLINA
FACULTAD DE ECONOMÍA Y PLANIFICACIÓN
DEPARTAMENTO ACADÉMICO DE ESTADÍSTICA INFORMÁTICA

Práctica Calificada 1

CURSO: Técnicas Multivariadas
DOCENTE: Miranda Villagomez Clodomiro Fernando

ALUMNOS:
Colca Balbin, Josue Jeremías - 20220761
Jesús Mamani, Angelo Miguel - 20220767
Landa Cordova, Valeria Estefany - 20220768
Ramos Orue, Selene Milagros - 20220777
Sanchez Perez, Omar Zenon - 20211938
Sandoval Hurtado, Nagiely - 20220780

2025

1. ANÁLISIS DE CORRESPONDENCIA SIMPLE

Análisis Simple de Correspondencia entre Carreras Profesionales y Motivos de Elección Vocacional

Contexto:

El presente análisis tiene como objetivo explorar la relación entre las carreras universitarias elegidas por los estudiantes y las razones que motivaron su elección.

Se ha recopilado información de estudiantes que eligieron una de las siguientes carreras: Medicina, Ingeniería, Derecho y Psicología. Para cada carrera, se han registrado las frecuencias asociadas a distintos motivos de elección, tales como vocación, prestigio, empleabilidad, ingresos potenciales e influencia familiar.

Variables:

Variable Tipo Descripción
Carrera Categórica nominal Representa la carrera universitaria elegida por el estudiante. Las categorías son: Medicina, Ingeniería, Derecho y Psicología.
Razon Categórica nominal Motivo por el cual el estudiante eligió su carrera. Las categorías son: Vocación, Prestigio, Empleabilidad, Ingresos potenciales e Influencia familiar.
Frecuencia Cuantitativa discreta Número de estudiantes que eligieron una combinación específica de carrera y razón. Esta variable representa la cantidad de observaciones por celda en la tabla cruzada.

Objetivo:

Analizar la relación entre nivel de ingreso y percepción de inflación mediante un análisis de correspondencia simple (ACS).

ANÁLISIS:

1. Lectura de datos

## Rows: 25
## Columns: 3
## $ Carrera    <chr> "Medicina", "Medicina", "Medicina", "Medicina", "Medicina",…
## $ Razon      <chr> "Vocación", "Prestigio", "Empleabilidad", "Ingresos potenci…
## $ Frecuencia <dbl> 35, 40, 25, 30, 20, 20, 25, 40, 35, 15, 15, 30, 20, 25, 30,…
datos %>%
  mutate_at(vars(Carrera, Razon),factor) %>%
  glimpse()
## Rows: 25
## Columns: 3
## $ Carrera    <fct> Medicina, Medicina, Medicina, Medicina, Medicina, Ingenierí…
## $ Razon      <fct> Vocación, Prestigio, Empleabilidad, Ingresos potenciales, I…
## $ Frecuencia <dbl> 35, 40, 25, 30, 20, 20, 25, 40, 35, 15, 15, 30, 20, 25, 30,…

2. Crear tabla de contingencia (frecuencias)

datos.acs <- xtabs(Frecuencia ~ Razon + Carrera, data = datos)
tabla=addmargins(datos.acs)
tabla
##                       Carrera
## Razon                  Administración Derecho Ingeniería Medicina Psicología
##   Empleabilidad                    35      20         40       25         20
##   Influencia familiar              20      30         15       20         25
##   Ingresos potenciales             40      25         35       30         15
##   Prestigio                        20      30         25       40         15
##   Vocación                         10      15         20       35         45
##   Sum                             125     120        135      150        120
##                       Carrera
## Razon                  Sum
##   Empleabilidad        140
##   Influencia familiar  110
##   Ingresos potenciales 145
##   Prestigio            130
##   Vocación             125
##   Sum                  650
  • INTERPRETACIÓN: 35 estudiantes estudian admnistracion por la empleabilidad.

3. Exploración visual - Balloonplot con frecuencias absolutas

Verificar si ya es tabla y mostrar estructura

datos <- data.frame(
  Carrera = rep(c("Psicologia", "Medicina", "Ingenieria", "Derecho", "Administracion"), each = 5),
  Razon = rep(c("Vocacion", "Prestigio", "Empleabilidad+", "Ingresos", "Influencia"), times = 5),
  Frecuencia = c(45,15,20,15,25,35,40,25,30,20,20,25,40,35,15,15,30,20,25,30,10,20,35,40,20)
)

datos.acs <- xtabs(Frecuencia ~ Carrera + Razon, data = datos)
dt <- datos.acs
dt
##                 Razon
## Carrera          Empleabilidad+ Influencia Ingresos Prestigio Vocacion
##   Administracion             35         20       40        20       10
##   Derecho                    20         30       25        30       15
##   Ingenieria                 40         15       35        25       20
##   Medicina                   25         20       30        40       35
##   Psicologia                 20         25       15        15       45
str(dt)
##  'xtabs' num [1:5, 1:5] 35 20 40 25 20 20 30 15 20 25 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ Carrera: chr [1:5] "Administracion" "Derecho" "Ingenieria" "Medicina" ...
##   ..$ Razon  : chr [1:5] "Empleabilidad+" "Influencia" "Ingresos" "Prestigio" ...
##  - attr(*, "call")= language xtabs(formula = Frecuencia ~ Carrera + Razon, data = datos)
balloonplot(t(dt),
            dotcolor="green",
            main ="Razones que influyen y Carrera universitaria", 
            xlab ="Carrera", 
            ylab="Razón",
            label = T, cum.margins=F, 
            label.lines=F, show.margins = T)

  • Interpretación: En el gráfico podemos observar que el tamaño del circulo va de acuerdo a la concentración de estudiantes, entonces podemos decir que 45 estudiantes eligieron por vocación la carrera de psicología.

4. Proporciones relativas (total)

dt1 <- prop.table(dt)
round(dt1,3)
##                 Razon
## Carrera          Empleabilidad+ Influencia Ingresos Prestigio Vocacion
##   Administracion          0.054      0.031    0.062     0.031    0.015
##   Derecho                 0.031      0.046    0.038     0.046    0.023
##   Ingenieria              0.062      0.023    0.054     0.038    0.031
##   Medicina                0.038      0.031    0.046     0.062    0.054
##   Psicologia              0.031      0.038    0.023     0.023    0.069
balloonplot(t(dt1), 
            main ="Razones que influyen y Carrera universitaria", 
            xlab ="Carrera", 
            ylab="Razón",
            label = T, cum.margins=F, 
            label.lines=F, show.margins = T)

  • Interpretación: El gráfico muestra que el tamaño de los círculos es proporcional a la concentración relativa de los estudiantes. En este sentido, se observa que los estudiantes que eligen la carrera de psicología por vocación presenta la mayor proporción en comparacíon del todo el grupo.

5. Perfiles columna (% filas)

dt2 <- prop.table(dt1,margin=2) 
round(dt2,3)
##                 Razon
## Carrera          Empleabilidad+ Influencia Ingresos Prestigio Vocacion
##   Administracion          0.250      0.182    0.276     0.154    0.080
##   Derecho                 0.143      0.273    0.172     0.231    0.120
##   Ingenieria              0.286      0.136    0.241     0.192    0.160
##   Medicina                0.179      0.182    0.207     0.308    0.280
##   Psicologia              0.143      0.227    0.103     0.115    0.360
tabla
##                       Carrera
## Razon                  Administración Derecho Ingeniería Medicina Psicología
##   Empleabilidad                    35      20         40       25         20
##   Influencia familiar              20      30         15       20         25
##   Ingresos potenciales             40      25         35       30         15
##   Prestigio                        20      30         25       40         15
##   Vocación                         10      15         20       35         45
##   Sum                             125     120        135      150        120
##                       Carrera
## Razon                  Sum
##   Empleabilidad        140
##   Influencia familiar  110
##   Ingresos potenciales 145
##   Prestigio            130
##   Vocación             125
##   Sum                  650
balloonplot(t(dt2), 
            main ="Razones que influyen y Carrera universitaria", 
            xlab ="Carrera", 
            ylab="Razón",
            dotcolor="skyblue",
            label = T, cum.margins=F, 
            label.lines=F, show.margins = FALSE)

  • INTERPRETACIÓN: El 25 % de los estudiantes de administración, estudian esa carrera por empleabilidad

6. Perfiles filas (% columnas)

dt3 <- prop.table(dt1,margin=1) 
round(dt3,3)
##                 Razon
## Carrera          Empleabilidad+ Influencia Ingresos Prestigio Vocacion
##   Administracion          0.280      0.160    0.320     0.160    0.080
##   Derecho                 0.167      0.250    0.208     0.250    0.125
##   Ingenieria              0.296      0.111    0.259     0.185    0.148
##   Medicina                0.167      0.133    0.200     0.267    0.233
##   Psicologia              0.167      0.208    0.125     0.125    0.375
balloonplot(t(dt3), 
            main ="Razones que influyen y carrera universitaria", 
            xlab ="Carrera", 
            ylab="Razón",
            dotcolor="bisque2",
            label = T, cum.margins=F, 
            label.lines=F, show.margins = FALSE)

  • Interpretación:28.0% de los estudiantes de Administración mencionaron empleabilidad como la razón principal.

7. Cálculo de masas totales, filas o columnas

tabla
##                       Carrera
## Razon                  Administración Derecho Ingeniería Medicina Psicología
##   Empleabilidad                    35      20         40       25         20
##   Influencia familiar              20      30         15       20         25
##   Ingresos potenciales             40      25         35       30         15
##   Prestigio                        20      30         25       40         15
##   Vocación                         10      15         20       35         45
##   Sum                             125     120        135      150        120
##                       Carrera
## Razon                  Sum
##   Empleabilidad        140
##   Influencia familiar  110
##   Ingresos potenciales 145
##   Prestigio            130
##   Vocación             125
##   Sum                  650
140/650
## [1] 0.2153846
125/650
## [1] 0.1923077
  • INTERPRETACIÓN: * El 21.5% de los estudiantes eligieron la carrera por empleabilidad * El 19.2% de los estudiantes eligieron la carrera de Administración’

8. Tabla cruzada con porcentaje y totales.

CrossTable(datos.acs,
           prop.t=T,
           prop.r=TRUE,
           prop.c=TRUE,
           prop.chisq=FALSE)
## 
##  
##    Cell Contents
## |-------------------------|
## |                       N |
## |           N / Row Total |
## |           N / Col Total |
## |         N / Table Total |
## |-------------------------|
## 
##  
## Total Observations in Table:  650 
## 
##  
##                | Razon 
##        Carrera | Empleabilidad+ |     Influencia |       Ingresos |      Prestigio |       Vocacion |      Row Total | 
## ---------------|----------------|----------------|----------------|----------------|----------------|----------------|
## Administracion |             35 |             20 |             40 |             20 |             10 |            125 | 
##                |          0.280 |          0.160 |          0.320 |          0.160 |          0.080 |          0.192 | 
##                |          0.250 |          0.182 |          0.276 |          0.154 |          0.080 |                | 
##                |          0.054 |          0.031 |          0.062 |          0.031 |          0.015 |                | 
## ---------------|----------------|----------------|----------------|----------------|----------------|----------------|
##        Derecho |             20 |             30 |             25 |             30 |             15 |            120 | 
##                |          0.167 |          0.250 |          0.208 |          0.250 |          0.125 |          0.185 | 
##                |          0.143 |          0.273 |          0.172 |          0.231 |          0.120 |                | 
##                |          0.031 |          0.046 |          0.038 |          0.046 |          0.023 |                | 
## ---------------|----------------|----------------|----------------|----------------|----------------|----------------|
##     Ingenieria |             40 |             15 |             35 |             25 |             20 |            135 | 
##                |          0.296 |          0.111 |          0.259 |          0.185 |          0.148 |          0.208 | 
##                |          0.286 |          0.136 |          0.241 |          0.192 |          0.160 |                | 
##                |          0.062 |          0.023 |          0.054 |          0.038 |          0.031 |                | 
## ---------------|----------------|----------------|----------------|----------------|----------------|----------------|
##       Medicina |             25 |             20 |             30 |             40 |             35 |            150 | 
##                |          0.167 |          0.133 |          0.200 |          0.267 |          0.233 |          0.231 | 
##                |          0.179 |          0.182 |          0.207 |          0.308 |          0.280 |                | 
##                |          0.038 |          0.031 |          0.046 |          0.062 |          0.054 |                | 
## ---------------|----------------|----------------|----------------|----------------|----------------|----------------|
##     Psicologia |             20 |             25 |             15 |             15 |             45 |            120 | 
##                |          0.167 |          0.208 |          0.125 |          0.125 |          0.375 |          0.185 | 
##                |          0.143 |          0.227 |          0.103 |          0.115 |          0.360 |                | 
##                |          0.031 |          0.038 |          0.023 |          0.023 |          0.069 |                | 
## ---------------|----------------|----------------|----------------|----------------|----------------|----------------|
##   Column Total |            140 |            110 |            145 |            130 |            125 |            650 | 
##                |          0.215 |          0.169 |          0.223 |          0.200 |          0.192 |                | 
## ---------------|----------------|----------------|----------------|----------------|----------------|----------------|
## 
## 

9. Test Chi-cuadrado para independencia

  • H0:Las variables Razon y Carrera obtenidas son independientes
  • H1:Las variables Razon y Carrera obtenidas no son independientes
prueba <- chisq.test(datos.acs)
prueba
## 
##  Pearson's Chi-squared test
## 
## data:  datos.acs
## X-squared = 76.03, df = 16, p-value = 8.57e-10
qchisq(0.05,16,lower.tail=FALSE)
## [1] 26.29623
  • Interpretación: Existen evidencia estadisticamente suficiente para afirmar que las razones y las carreras obtenidas no son independientes. Es decir, hay una relación entre la razón de escoger una carrera y la carrera.
prueba$observed
##                 Razon
## Carrera          Empleabilidad+ Influencia Ingresos Prestigio Vocacion
##   Administracion             35         20       40        20       10
##   Derecho                    20         30       25        30       15
##   Ingenieria                 40         15       35        25       20
##   Medicina                   25         20       30        40       35
##   Psicologia                 20         25       15        15       45
prueba$expected
##                 Razon
## Carrera          Empleabilidad+ Influencia Ingresos Prestigio Vocacion
##   Administracion       26.92308   21.15385 27.88462        25 24.03846
##   Derecho              25.84615   20.30769 26.76923        24 23.07692
##   Ingenieria           29.07692   22.84615 30.11538        27 25.96154
##   Medicina             32.30769   25.38462 33.46154        30 28.84615
##   Psicologia           25.84615   20.30769 26.76923        24 23.07692
tabla
##                       Carrera
## Razon                  Administración Derecho Ingeniería Medicina Psicología
##   Empleabilidad                    35      20         40       25         20
##   Influencia familiar              20      30         15       20         25
##   Ingresos potenciales             40      25         35       30         15
##   Prestigio                        20      30         25       40         15
##   Vocación                         10      15         20       35         45
##   Sum                             125     120        135      150        120
##                       Carrera
## Razon                  Sum
##   Empleabilidad        140
##   Influencia familiar  110
##   Ingresos potenciales 145
##   Prestigio            130
##   Vocación             125
##   Sum                  650
  • Interpretación: Vocación es la razón más común para elegir Psicología (45 personas vs. ≈ 23 esperadas). → Mucho mayor a lo esperado, hay una fuerte asociación aquí.

Analisis de Correspondencias Simple con el paquete FactoMiner

1. Análisis de Correspondencias Simple con FactoMineR

res.ca = CA(datos.acs,ncp=7,graph=TRUE,axes = c(1,2))

# print(res.ca)
  • Explicación de los ejes:

  • Dim 1 (Eje horizontal): Explica el 67.22% de la inercia (variabilidad) total, siendo el eje más importante.

  • Dim 2 (Eje vertical): Explica el 20.26% de la inercia, siendo el segundo eje en importancia.

2. Resumen e indicadores clave

summary(res.ca)
## 
## Call:
## CA(X = datos.acs, ncp = 7, graph = TRUE, axes = c(1, 2)) 
## 
## The chi square of independence between the two variables is equal to 76.0301 (p-value =  8.570115e-10 ).
## 
## Eigenvalues
##                        Dim.1   Dim.2   Dim.3   Dim.4
## Variance               0.079   0.024   0.014   0.001
## % of var.             67.225  20.257  11.610   0.908
## Cumulative % of var.  67.225  87.482  99.092 100.000
## 
## Rows
##                  Iner*1000    Dim.1    ctr   cos2    Dim.2    ctr   cos2  
## Administracion |    26.074 | -0.346 29.244  0.882 | -0.077  4.758  0.043 |
## Derecho        |    15.988 | -0.048  0.550  0.027 |  0.272 57.505  0.852 |
## Ingenieria     |    14.011 | -0.196 10.165  0.570 | -0.152 20.248  0.342 |
## Medicina       |    11.999 |  0.111  3.638  0.238 |  0.080  6.178  0.122 |
## Psicologia     |    48.897 |  0.490 56.403  0.907 | -0.120 11.311  0.055 |
##                 Dim.3    ctr   cos2  
## Administracion  0.091 11.626  0.061 |
## Derecho         0.099 13.421  0.114 |
## Ingenieria     -0.061  5.607  0.054 |
## Medicina       -0.181 55.614  0.629 |
## Psicologia      0.101 13.732  0.038 |
## 
## Columns
##                  Iner*1000    Dim.1    ctr   cos2    Dim.2    ctr   cos2  
## Empleabilidad+ |    16.652 | -0.212 12.338  0.583 | -0.174 27.443  0.390 |
## Influencia     |    14.784 |  0.103  2.272  0.121 |  0.172 21.236  0.340 |
## Ingresos       |    18.009 | -0.276 21.587  0.943 | -0.045  1.921  0.025 |
## Prestigio      |    14.395 | -0.040  0.412  0.022 |  0.210 37.141  0.611 |
## Vocacion       |    53.129 |  0.509 63.391  0.938 | -0.123 12.258  0.055 |
##                 Dim.3    ctr   cos2  
## Empleabilidad+  0.014  0.299  0.002 |
## Influencia      0.217 58.580  0.538 |
## Ingresos        0.004  0.028  0.000 |
## Prestigio      -0.162 38.499  0.363 |
## Vocacion       -0.043  2.594  0.007 |

Interpretación del Análisis de Correspondencias Simple

El análisis de correspondencia simple (ACS) se realizó para explorar la relación entre las variables categóricas Carrera y Razón. A continuación, se presentan los principales hallazgos:

  1. Prueba de independencia

El valor del estadístico chi-cuadrado fue de 45.51 con un p-valor = 8.43e-06, lo que indica que existe una asociación significativa entre las variables Carrera y Razón. Por tanto, no son independientes.

  1. Varianza explicada

Las dos primeras dimensiones explican el 97.6% de la inercia total (variación), lo cual permite una adecuada interpretación de los datos en un plano bidimensional:

  • Dimensión 1: 74.09% de la varianza
  • Dimensión 2: 23.53% de la varianza
  1. Análisis de las filas (Carreras)
  • Psicología: Tiene una alta representación en la Dimensión 1 (cos² = 0.973) y contribuye fuertemente a la varianza. Se encuentra asociada principalmente con la razón Vocación.
  • Ingeniería: Contribuye a ambas dimensiones (especialmente a la Dim. 2) y está relacionada con Empleabilidad e Ingresos .
  • Derecho: Tiene representación moderada en ambas dimensiones. Se asocia con razones como Prestigio e Influencia familiar.
  1. Análisis de las columnas (Razones)
  • Vocación: Es la razón con mayor contribución a la Dim. 1 (cos² = 0.987) y está claramente asociada con la carrera de Psicología.
  • Empleabilidad e Ingresos potenciales: Se relacionan principalmente con Ingeniería.
  • Prestigio: Contribuye más a la Dim. 2 y parece estar asociada con Derecho.
  • Influencia familiar: Tiene buena representación en la Dim. 1, posiblemente asociada a carreras como Psicología o Derecho.
  1. Conclusión general

El ACS permitió identificar asociaciones entre carreras y razones de elección. La representación gráfica muestra cómo ciertas razones están fuertemente vinculadas con carreras específicas, por ejemplo, Vocación con Psicología y Empleabilidad con Ingeniería, lo que evidencia patrones de preferencia estudiantil según motivaciones particulares.

Filas

res1 <- data.frame(Masa=res.ca$call$marge.row, Inercia=res.ca$row$inertia,
                   abs=round(res.ca$row$contrib,4),rel=round(res.ca$row$cos2,4))
rbind(res1,Total=colSums(res1))
##                     Masa    Inercia abs.Dim.1 abs.Dim.2 abs.Dim.3 abs.Dim.4
## Administracion 0.1923077 0.02607446   29.2438    4.7576   11.6258   35.1420
## Derecho        0.1846154 0.01598781    0.5501   57.5050   13.4215   10.0619
## Ingenieria     0.2076923 0.01401135   10.1653   20.2480    5.6069   43.2106
## Medicina       0.2307692 0.01199902    3.6380    6.1780   55.6137   11.4934
## Psicologia     0.1846154 0.04889674   56.4028   11.3113   13.7322    0.0922
## Total          1.0000000 0.11696938  100.0000   99.9999  100.0001  100.0001
##                rel.Dim.1 rel.Dim.2 rel.Dim.3 rel.Dim.4
## Administracion    0.8819    0.0432    0.0605    0.0143
## Derecho           0.0271    0.8523    0.1140    0.0067
## Ingenieria        0.5705    0.3424    0.0543    0.0328
## Medicina          0.2384    0.1220    0.6294    0.0102
## Psicologia        0.9070    0.0548    0.0381    0.0000
## Total             2.6249    1.4147    0.8963    0.0640

Interpretación:

  • Masa: Representa el peso relativo de cada fila (carrera) en la tabla. Medicina es la más frecuente (29.7%) y Derecho la menos (18.5%).

  • Inercia: Indica la variabilidad explicada por cada fila. Psicología presenta la mayor inercia 0.0489), lo que sugiere una mayor contribución a la dispersión del gráfico de correspondencias.

  • Aporte absoluto a las dimensiones (abs):

    • Psicología aporta un 56.4%% a la Dim.1, mostrando una fuerte influencia sobre esa dimensión.
  • Coseno cuadrado (rel): Mide la calidad de la representación de las filas en cada dimensión.

    • Psicología tiene una excelente representación en Dim.1 (cos² = de 0.907), lo que confirma su fuerte asociación con esta dimensión.

Conclusión:
Cada carrera está representada principalmente en distintas dimensiones, lo que sugiere distintos patrones de asociación con las razones de elección. Por ejemplo: - Psicología se vincula fuertemente con variables asociadas a la vocación o interés personal (Dim.1).

  • Derecho se asocia con factores posiblemente ligados a prestigio o tradición familiar (Dim.2).

  • Medicina muestra un perfil complejo, influido por múltiples dimensiones, con énfasis en la Dim.3.

  • Ingeniería parece conectar más con razones prácticas como la empleabilidad o demanda del mercado (Dim.4).

Columnas

res2 <- data.frame(Masa=res.ca$call$marge.col, Inercia=res.ca$col$inertia,
                   abs=round(res.ca$col$contrib,4),rel=round(res.ca$col$cos2,4))
rbind(res2,Total=colSums(res2))
##                     Masa    Inercia abs.Dim.1 abs.Dim.2 abs.Dim.3 abs.Dim.4
## Empleabilidad+ 0.2153846 0.01665242   12.3380   27.4426    0.2990   38.3819
## Influencia     0.1692308 0.01478438    2.2722   21.2364   58.5801    0.9882
## Ingresos       0.2230769 0.01800865   21.5870    1.9212    0.0278   54.1563
## Prestigio      0.2000000 0.01439459    0.4119   37.1414   38.4989    3.9478
## Vocacion       0.1923077 0.05312934   63.3909   12.2584    2.5941    2.5258
## Total          1.0000000 0.11696938  100.0000  100.0000   99.9999  100.0000
##                rel.Dim.1 rel.Dim.2 rel.Dim.3 rel.Dim.4
## Empleabilidad+    0.5826    0.3905    0.0024    0.0245
## Influencia        0.1209    0.3404    0.5381    0.0007
## Ingresos          0.9426    0.0253    0.0002    0.0319
## Prestigio         0.0225    0.6114    0.3632    0.0029
## Vocacion          0.9382    0.0547    0.0066    0.0005
## Total             2.6068    1.4223    0.9105    0.0605
#str(res.ca)
res.ca$eig
##        eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.078632131             67.2245426                          67.22454
## dim 2 0.023694799             20.2572664                          87.48181
## dim 3 0.013580118             11.6099767                          99.09179
## dim 4 0.001062333              0.9082143                         100.00000
res.ca$eig[,1]
##       dim 1       dim 2       dim 3       dim 4 
## 0.078632131 0.023694799 0.013580118 0.001062333
sum(res.ca$eig[,1])
## [1] 0.1169694
  • La suma de todos los eigenvalores (aquí, 0.1169694) es la inercia total.
  • (0.07863 / 0.11697) * 100 ≈ 67.22%, cuadra perfecto con la tabla: eso valida que los datos están bien calculados.

Scree Plot de los Autovalores

eig.val <- get_eigenvalue(res.ca)
eig.val
##        eigenvalue variance.percent cumulative.variance.percent
## Dim.1 0.078632131       67.2245426                    67.22454
## Dim.2 0.023694799       20.2572664                    87.48181
## Dim.3 0.013580118       11.6099767                    99.09179
## Dim.4 0.001062333        0.9082143                   100.00000
fviz_screeplot(res.ca, addlabels = TRUE, ylim = c(0, 90))

Interpretación:

  • La Dimensión 1 explica el 74.1% de la inercia total. Esto indica que existe un eje principal muy fuerte que resume la mayor parte de la asociación entre las variables Carrera y Razón.

  • La Dimensión 2 explica un 23.5% adicional, lo que refuerza la utilidad de un análisis bidimensional al capturar relaciones secundarias importantes.

  • La Dimensión 3 sólo contribuye con un 2.4%, lo cual es estadísticamente irrelevante en términos de interpretación práctica.

Conclusión:
Las dos primeras dimensiones juntas explican el 97.6% de la varianza total. Por lo tanto, el uso de un plano bidimensional es suficiente para representar y analizar visualmente las asociaciones más relevantes entre las categorías de las variables estudiadas.

Graficos- Biplot

Primera forma - usando plot.CA de FactoMineR

plot.CA(res.ca) # Mapa Simetrico

plot.CA(res.ca, axes = c(1,2), col.row = "blue", col.col = "red")

plot.CA(res.ca,mass=c(T,T))

  • El mapa sugiere que

  • Quienes valoran estabilidad económica prefieren Ingeniería/Administración.

  • Quienes buscan reconocimiento eligen Medicina/Derecho.

  • La vocación es más relevante en Psicología.

Segunda forma - usando fviz_ca_biplot de factoextra

fviz_ca_biplot(res.ca, repel = T)

fviz_ca_biplot(res.ca, repel = T) + theme_minimal()

  • El eje horizontal (DIM1) separa claramente:

    • Derecho: asociado a prestigio/influencia (izquierda)
    • Ingeniería/Administración: asociadas a empleabilidad/ingresos (derecha)
  • El eje vertical (DIM2) diferencia aspectos de status social vs. utilidad práctica

2. ANÁLISIS DE CORRESPONDENCIA SIMPLE CON DATOS SUMPLEMENTARIOS

library(FactoMineR)
library(factoextra)
library(ggplot2)
library(fastGraph)

Contexto

En el sector gastronómico, la percepción del cliente respecto a diversos atributos como la calidad de la comida, el ambiente, el servicio o el precio, juega un papel crucial en la competitividad de los restaurantes. En mercados donde existen múltiples opciones, comprender cómo se perciben estos atributos en diferentes establecimientos se vuelve fundamental para orientar decisiones estratégicas y mejorar la experiencia del consumidor.

Actualmente, un grupo de restaurantes ha sido evaluado en función de diversos atributos de servicio, con el propósito de identificar sus fortalezas y debilidades relativas. Además, se cuenta con un perfil “Ideal”, que representa las expectativas o preferencias óptimas del consumidor en relación con los mismos atributos.

Comparar la percepción de los restaurantes con respecto a este perfil ideal resulta clave para identificar cuáles establecimientos están más alineados con las preferencias del público objetivo. No obstante, incluir este perfil ideal directamente en el análisis podría sesgar la estructura real observada entre los restaurantes. Por ello, se emplea una técnica que permita conservar intacta la relación entre los restaurantes evaluados, mientras se proyecta el perfil ideal en ese mismo espacio para efectos comparativos.

Objetivo general

Aplicar un Análisis de Correspondencias Simples (ACS) para explorar las asociaciones entre un conjunto de restaurantes (R1 a R9) y los atributos que los caracterizan, incorporando un perfil denominado “Ideal” como columna suplementaria, con el fin de evaluar su alineación con los restaurantes reales y los atributos más valorados desde el punto de vista del consumidor.

1. Lectura de Datos

# Leer los datos
library(readxl)
datos <- read_excel("restaurante.xlsx")

datos$Restaurante <- factor(datos$Restaurante,
                            levels = c(paste0("R", 1:9), "Ideal"))
#  Crear tabla de contingencia
datoss <- xtabs(Valor ~ Atributo + Restaurante, data = datos)

# Ver la tabla resultante
addmargins(datoss)
##                    Restaurante
## Atributo              R1   R2   R3   R4   R5   R6   R7   R8   R9 Ideal  Sum
##   Acceso              12   14   13   15   11   13   12   16   15    14  135
##   Ambiente            14   19   17   18   15   44   16   20   21    44  228
##   Calidad de comida    9   14   20   16   25   19    4   13   52    52  224
##   Precio              22   18   21   30   28   21   17   20   23    30  230
##   Rapidez             19   25   18   23   24   21   16   20   22    25  213
##   Servicio            12   14   13   18   42   15   13   11   40    42  220
##   Trato               20   22   19   21   27   18   17   19   23    27  213
##   Variedad del menú   29   27   23   25   26   27   22   23   25    29  256
##   Sum                137  153  144  166  198  178  117  142  221   263 1719

2. Prueba de Independencia Chi-Cuadrado

chisq.test(datoss[,-10])
## 
##  Pearson's Chi-squared test
## 
## data:  datoss[, -10]
## X-squared = 119.5, df = 56, p-value = 1.682e-06
qchisq(0.05,56,lower.tail=FALSE)
## [1] 74.46832
shadeDist(74.46832, "dchisq", 56, lower.tail=FALSE,col = c("black", "red") )

Hipótesis:

  • H₀: No existe asociación significativa entre los atributos y los restaurantes. Es decir, son independientes.
  • H₁: Existe asociación significativa entre los atributos y los restaurantes. Es decir, no son independientes.

Resultados de la prueba:

  • Valor de la prueba (Chi-cuadrado): 119.5
  • Grados de libertad (gl): 56
  • Valor crítico con α = 0.05: 74.47
  • Valor-p: 1.682 × 10⁻⁶

Decisión:

Como:

  • \(\chi^2_{\text{calculado}} = 119.5 > \chi^2_{\text{crítico}} = 74.47\)

  • \(p\text{-valor} = 1.682 \times 10^{-6} < 0.05\)

Se rechaza la hipótesis nula (H₀).

Conclusión:
Con un nivel de significación del 5%, existe evidencia estadística para afirmar que hay una relación entre los atributos evaluados y los restaurantes. Por lo tanto, los atributos y los restaurantes no son independientes.

3. Análisis de Correspondencias Simples (ACS)

  • Análisis de Correspondencias Simples (ACS) sobre la matriz datoss usando la función CA() del paquete FactoMineR
res.ca2 <- CA(datoss, ncp = 4, graph = FALSE, col.sup = 10)

4. Scree Plot (Autovalores)

eig_vals <- get_eigenvalue(res.ca2); eig_vals
##         eigenvalue variance.percent cumulative.variance.percent
## Dim.1 4.994930e-02        60.856987                    60.85699
## Dim.2 2.094911e-02        25.523873                    86.38086
## Dim.3 7.098507e-03         8.648645                    95.02951
## Dim.4 2.228348e-03         2.714964                    97.74447
## Dim.5 1.110077e-03         1.352491                    99.09696
## Dim.6 6.450813e-04         0.785951                    99.88291
## Dim.7 9.610261e-05         0.117089                   100.00000
# Suma de Autovalores
cat("La suma total de eigenvalues:", sum(eig_vals[,1]))
## La suma total de eigenvalues: 0.08207653
# Porcentaje de la varianza
eig_vals[,1] / sum(eig_vals[,1]) * 100
##     Dim.1     Dim.2     Dim.3     Dim.4     Dim.5     Dim.6     Dim.7 
## 60.856987 25.523873  8.648645  2.714964  1.352491  0.785951  0.117089
fviz_screeplot(res.ca2, addlabels = TRUE, ylim = c(0, 80)) + 
  ggtitle("Porcentaje de Inercia Explicada por Dimensión")

  • Las primeras dos dimensiones explican la mayoría de la inercia
    • Dimensión 1: Explica aproximadamente 60.9% de la variabilidad.
    • Dimensión 2: Aporta 25.5%.
    • Juntas explican un 86.4%, lo cual es muy alto y sugiere que gran parte de la estructura de los datos se concentra en estas dos dimensione.
  • La Dimensión 3 tiene una contribución moderada
    • Dimensión 3 aporta un 8.6%.
    • Aunque es menor, agregar la dimensión 3 lleva el total a 95.03%.
  • A partir de la dimensión 4, eñ aporte es marginal
    • Las dimensiones 4 en adelante aportan menos del 3% cada una.
    • Esto indica que hay poco valor agregado en conservar más allá de la dimensión
cat("Varianza acumulada primeras 2 dimensiones:", sum(eig_vals[1:2, 2]), "%\n")
## Varianza acumulada primeras 2 dimensiones: 86.38086 %

5. Biplot Filas, Columnas y Columna Suplementaria

fviz_ca_biplot(res.ca2, axes = c(1,2), repel = T) + 
  theme_light()+
  ggtitle("Biplot ACS: Filas, Columnas y Columna Suplementaria")

Interpretación:

  • Los triángulos rojos (▲) representan restaurantes.
  • Los puntos azules (●) representan atributos.
    • R6 está muy cerca de Ambiente, lo que indica que se destaca fuertemente en este atributo.
    • R1 y R7 están próximos a Variedad del menú, Acceso y Rapidez, lo cual sugiere buena percepción en esos atributos.
    • R4 está más cercano a Trato, Precio lo que sugiere una percepción favorable.
    • R2 está más cercano a Rapidez, Acceso, Variedad del menú lo que sugiere una percepción favorable.
    • R9 está más cercano a Calidad de comida, lo que sugiere una percepción favorable en ese aspecto.
    • R5 está más aislado, lo que puede interpretarse como que no se destaca claramente en ningún atributo, o tiene poca relacion con el Servicio.
  • El punto marrón denominado “Ideal” representa un perfil ideal de evaluación, proyectado como fila suplementaria.
    • Está más cerca de: Calidad de comida, Servicio. Por tanto, estos son los atributos más valorados en el perfil ideal.
    • Está mas alejado de: Ambiente, Acceso, Variedad del menú,Trato, Precio, Servicio, Rapidez, etc., lo que indica que esos atributos no son centrales en el perfil ideal.
    • El restaurante más cercano al Ideal es R9, lo que sugiere que R9 es el más alineado con las expectativas del perfil ideal.

6. Resumen Detallado de Resultados

summary(res.ca2, nb.dec = 3, ncp = 4)
## 
## Call:
## CA(X = datoss, ncp = 4, col.sup = 10, graph = FALSE) 
## 
## The chi square of independence between the two variables is equal to 119.5034 (p-value =  1.682474e-06 ).
## 
## Eigenvalues
##                        Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6   Dim.7
## Variance               0.050   0.021   0.007   0.002   0.001   0.001   0.000
## % of var.             60.857  25.524   8.649   2.715   1.352   0.786   0.117
## Cumulative % of var.  60.857  86.381  95.030  97.744  99.097  99.883 100.000
## 
## Rows
##                     Iner*1000    Dim.1    ctr   cos2    Dim.2    ctr   cos2  
## Acceso            |     3.453 |  0.148  3.641  0.527 |  0.025  0.247  0.015 |
## Ambiente          |    19.072 |  0.208 10.961  0.287 | -0.314 59.505  0.654 |
## Calidad de comida |    26.863 | -0.429 43.522  0.809 | -0.165 15.380  0.120 |
## Precio            |     3.900 |  0.074  1.494  0.191 |  0.103  6.942  0.373 |
## Rapidez           |     2.466 |  0.102  2.668  0.540 |  0.059  2.139  0.182 |
## Servicio          |    19.135 | -0.347 29.511  0.770 |  0.104  6.265  0.069 |
## Trato             |     2.117 |  0.058  0.847  0.200 |  0.108  7.053  0.698 |
## Variedad del menú |     5.071 |  0.154  7.356  0.725 |  0.058  2.468  0.102 |
##                    Dim.3    ctr   cos2    Dim.4    ctr   cos2  
## Acceso             0.107 13.307  0.274 |  0.002  0.009  0.000 |
## Ambiente          -0.094 15.829  0.059 | -0.007  0.241  0.000 |
## Calidad de comida  0.126 26.408  0.070 | -0.004  0.071  0.000 |
## Precio             0.003  0.019  0.000 | -0.110 75.095  0.429 |
## Rapidez            0.021  0.813  0.023 |  0.035  7.224  0.065 |
## Servicio          -0.157 42.458  0.158 |  0.013  0.874  0.001 |
## Trato              0.005  0.054  0.002 |  0.033  6.319  0.067 |
## Variedad del menú  0.022  1.112  0.016 |  0.038 10.168  0.045 |
## 
## Columns
##                     Iner*1000    Dim.1    ctr   cos2    Dim.2    ctr   cos2  
## R1                |     6.132 |  0.190  6.798  0.554 |  0.144  9.368  0.320 |
## R2                |     3.287 |  0.130  3.541  0.538 |  0.035  0.601  0.038 |
## R3                |     1.391 |  0.011  0.026  0.009 | -0.018  0.158  0.024 |
## R4                |     2.658 |  0.066  0.992  0.186 |  0.087  4.094  0.323 |
## R5                |    13.747 | -0.238 15.362  0.558 |  0.156 15.882  0.242 |
## R6                |    16.991 |  0.166  6.705  0.197 | -0.318 58.967  0.727 |
## R7                |     6.108 |  0.234  8.783  0.718 |  0.103  4.086  0.140 |
## R8                |     3.535 |  0.166  5.372  0.759 | -0.014  0.090  0.005 |
## R9                |    28.227 | -0.415 52.421  0.928 | -0.097  6.754  0.050 |
##                    Dim.3    ctr   cos2    Dim.4    ctr   cos2  
## R1                 0.038  1.943  0.022 |  0.009  0.343  0.001 |
## R2                 0.045  2.993  0.065 |  0.094 41.715  0.283 |
## R3                 0.110 16.732  0.854 | -0.026  2.915  0.047 |
## R4                 0.025  1.004  0.027 | -0.099 49.918  0.418 |
## R5                -0.141 38.289  0.198 |  0.000  0.000  0.000 |
## R6                -0.101 17.424  0.073 | -0.011  0.715  0.001 |
## R7                -0.080  7.210  0.084 |  0.028  2.865  0.010 |
## R8                 0.070  6.738  0.135 | -0.001  0.006  0.000 |
## R9                 0.060  7.668  0.019 |  0.015  1.523  0.001 |
## 
## Supplementary column
##                      Dim.1   cos2    Dim.2   cos2    Dim.3   cos2    Dim.4
## Ideal             | -0.254  0.534 | -0.225  0.422 | -0.058  0.028 | -0.028
##                     cos2  
## Ideal              0.007 |
  • Interpretación de filas (atributos):
    • Ctr → El 29.511% de la inercia (variabilidad) de la dimension 1 lo explica Servicio.
    • Cos2 → El 0.698 de la inercia (variabilidad) de Trato lo explica la dimension 2.
    • Calidad aporta el 43.52% a la Dim 1, es la categoria que más contribuye en esa dimensión.
    • Dim 1:
      • Calidad de comida y Servicio tienen alta contribución y alto cos2, indicando que esta dimensión puede estar asociada a la calidad percibida y servicio.
    • Dim 2:
      • Ambiente tiene la mayor contribución (59.5%) y un cos2 alto (0.654), su interpretación estará muy ligada a esta dimensión.
    • Dim 4:
      • Precio tiene cierta contribución (75.09%) y cos2 (0.429) en Dim 4, podría indicar que esta dimensión está relacionada con la percepción de precio.
  • Interpretación de columnas (restaurantes):
    • Ctr → El 15.362% de la inercia (variabilidad) de la dimension 1 lo explica R5.
    • Cos2 → El 0.727 de la inercia (variabilidad) de R6 lo explica la dimension 2.
    • Dim 1:
      • R9 tiene una altísima contribución (52.42%) y un cos2 muy alto (0.928), es muy representativa en esta dimensión.
    • Dim 2:
      • R6 tiene gran contribución (58.97%) y alto cos2 (0.727).
  • Columna suplementaria “Ideal”:
    • Esta categoría suplementaria está bastante bien representada en las dos primeras dimensiones (cos2 > 0.4).

7. Calidad de Representación (cos2)

fviz_ca_row(res.ca2, col.row = "cos2", repel = T,
            gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")) +
  ggtitle("Calidad de representación (cos2) de las filas")

  • Atributos mejor representados:
    • Ambiente, Calidad de comida, Variedad del menú, Trato y Servicio son los mejor representados (color rojo o naranja fuerte). Esto indica que:
      • Su posición en el plano refleja sus relaciones con los restaurantes.
  • Atributos con menor representación:
    • Precio, Acceso tienen colores más cercanos al azul o verde.
      • Esto significa que su posición en el plano puede no reflejar completamente su comportamiento real en los datos.
  • Relevancia de los atributos en la variabilidad total:
    • Los atributos más cercanos al centro (como Variedad del menú, Rapidez, Acceso) tienen menos contribución al posicionamiento general.
    • Los más alejados del origen (como Ambiente, Calidad de comida, Servicio) explican más de la variabilidad en las respuestas de los restaurantes.
fviz_ca_col(res.ca2, col.col = "cos2", repel = T,
            gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")) +
  ggtitle("Calidad de representación (cos2) de las columnas")

  • Ideal:
    • El punto “Ideal” aparece también en este gráfico y tiene un cos² medio-alto (color marrón).
    • Esto indica que el perfil ideal está razonablemente bien representado en el plano.
  • Restaurantes bien representados (cos² altos):
    • Estos puntos se visualizan en tonos naranja/rojo:
    • R1, R7, R6, R9, R5 → están bien representados.
    • R1 y R7 están juntos en la parte superior derecha → pueden compartir un perfil similar.
    • R9 (izquierda) tiene un perfil distintivo, alineado con el punto “Ideal” y su buena representación confirma que esta conclusión es correcta
  • Restaurantes moderadamente representados (cos² intermedios):
    • R2, R4, R8
  • Restaurante bajamente representado:
    • R3 tiene un cos² bajo (color azul claro), lo que significa que su posición en el biplot no refleja fielmente su perfil de atributos. Cualquier inferencia basada en su ubicación debe tomarse con precaución.

3. ANÁLISIS DE CORRESPONDENCIA MÚLTIPLE

Presentación de datos

Este estudio simulado se enfoca en analizar cómo las características sociodemográficas y hábitos digitales de las personas adultas (mayores de 18 años) se relacionan con la satisfacción con los servicios digitales y su uso de tecnología. La información podría haber sido obtenida mediante una encuesta aplicada en zonas urbanas y rurales del país.

Variable Tipo Descripción
Género Cualitativa nominal Sexo de la persona encuestada: Masculino o Femenino.
N_edu Cualitativa ordinal Nivel más alto de educación alcanzado: Primaria, Secundaria, Técnico, Universitario, Postgrado.
Ocupacion Cualitativa nominal Actividad principal de la persona: Empleado, Desempleado, Estudiante, Independiente, Ama de casa.
Uso_Tec Cualitativa ordinal Frecuencia de uso de tecnologías digitales: Nunca, Rara vez, A veces, Frecuentemente, Siempre.
Satisf_Serv Cualitativa ordinal Grado de satisfacción con los servicios digitales utilizados: Muy insatisfecho, Insatisfecho, Neutral, Satisfecho, Muy satisfecho.
Zona Cualitativa nominal Tipo de área donde reside la persona: Urbana o Rural.
library(readxl)
data <- read_excel("data_tec.xlsx")
data <- data %>%
  mutate(across(everything(), as.factor))
Y <- data %>% select(Genero, N_edu, Ocupacion, Uso_Tec, Satisf_Serv, Zona)
str(Y)
## tibble [525 × 6] (S3: tbl_df/tbl/data.frame)
##  $ Genero     : Factor w/ 2 levels "Femenino","Masculino": 2 1 1 1 2 1 2 1 2 2 ...
##  $ N_edu      : Factor w/ 5 levels "Postgrado","Primaria",..: 5 4 1 4 4 2 4 3 5 5 ...
##  $ Ocupacion  : Factor w/ 5 levels "Ama de casa",..: 3 4 5 3 5 3 1 3 1 3 ...
##  $ Uso_Tec    : Factor w/ 5 levels "A veces","Frecuentemente",..: 5 1 4 2 5 1 5 5 5 2 ...
##  $ Satisf_Serv: Factor w/ 5 levels "Insatisfecho",..: 5 2 2 2 4 5 5 5 4 3 ...
##  $ Zona       : Factor w/ 2 levels "Rural","Urbana": 2 2 2 2 2 2 2 2 2 2 ...

Análisis descriptivo

1. Tablas de fresuencia

Tablas de frecuencia simple

table(Y$Genero)
## 
##   F   M 
## 266 259
table(Y$N_edu)
## 
##     Postgrado      Primaria    Secundaria       Técnico Universitario 
##            68            57           140           102           158
table(Y$Ocupacion)
## 
##   Ama de casa   Desempleado      Empleado    Estudiante Independiente 
##            45            55           174           137           114
table(Y$Uso_Tec)
## 
##        A veces Frecuentemente          Nunca       Rara vez        Siempre 
##             98            182             26             53            166
table(Y$Satisf_Serv)
## 
##     Insatisfecho Muy insatisfecho   Muy satisfecho          Neutral 
##               88               58               77              119 
##       Satisfecho 
##              183
table(Y$Zona)
## 
##  Rural Urbana 
##    111    414

Tablas cruzadas

  • ¿Hay diferencias de género en el uso de tecnología?
table(Y$Genero, Y$Uso_Tec)  
##    
##     A veces Frecuentemente Nunca Rara vez Siempre
##   F      54             97     6       29      80
##   M      44             85    20       24      86

El análisis de frecuencias revela que, si bien no hay diferencias significativas en el uso frecuente o siempre de tecnología entre géneros, se identifican brechas clave:

  • No uso de tecnología:

Los hombres representan el 77% (20/26) de los casos que nunca usan tecnología, frente al 23% (6/26) en mujeres. Esta disparidad (3.5:1) podría asociarse a factores culturales o muestrales, aunque requiere pruebas estadísticas para confirmar su significancia (ver prueba chi-cuadrado adjunta).

  • Patrones similares en uso activo:

Mujeres y hombres muestran proporciones comparables en uso frecuente (F: 36.5%, M: 32.8%) y siempre (F: 30.1%, M: 33.2%), sugiriendo que la adopción tecnológica cotidiana es independiente del género.

  • Uso ocasional (A veces/Rara vez):

Las mujeres tienden a reportar un uso más intermitente (A veces: 54 vs 44; Rara vez: 29 vs 24), pero estas diferencias son marginales.

  • ¿La satisfacción varía por zona?
table(Y$Zona, Y$Satisf_Serv)  
##         
##          Insatisfecho Muy insatisfecho Muy satisfecho Neutral Satisfecho
##   Rural            25               11             17      30         28
##   Urbana           63               47             60      89        155

La satisfacción es marcadamente mayor en zonas urbanas (37.4% satisfechos vs. 25.2% en rurales), mientras que la insatisfacción casi duplica en zonas rurales (22.5% vs. 15.2% urbanos). Esto sugiere desigualdades en la calidad o acceso a servicios digitales por área geográfica.

  • ¿El nivel de uso tecnológico varía según la ocupación?
table(Y$Ocupacion,Y$Uso_Tec)
##                
##                 A veces Frecuentemente Nunca Rara vez Siempre
##   Ama de casa         6             20     2        3      14
##   Desempleado        11             17     3        6      18
##   Empleado           30             69     4       21      50
##   Estudiante         32             46    11       10      38
##   Independiente      19             30     6       13      46

El análisis revela que:

  • Empleados son los mayores usuarios frecuentes (68.4% usa tecnología Frecuentemente/Siempre), reflejando posiblemente necesidades laborales.

  • Estudiantes muestran una paradoja: aunque el 61.3% usa tecnología frecuentemente, un 8% no la usa nunca (vs. 2.3% en empleados), sugiriendo brechas en acceso o preferencias.

  • Amas de casa e independientes tienen los patrones más heterogéneos, con mayor proporción en A veces/Rara vez (20-30%), indicando uso menos sistemático.

2. Visualización de relaciones entre variables

library(GGally)
# Matriz de gráficos para variables categóricas
Y %>% 
  ggpairs(cardinality_threshold = 70) +
  theme(axis.text.x = element_text(size = 5, angle = 50, hjust = 1),
        axis.text.y = element_text(size = 5))

El análisis revela brechas digitales significativas, donde los hombres presentan mayor proporción de no uso de tecnología (77% de los casos “Nunca”), mientras que las mujeres tienden a un uso más intermitente (“A veces/Rara vez”). El menor nivel educativo se asocia claramente con un uso menos frecuente y menor satisfacción con los servicios digitales. Por otro lado, la educación superior y la residencia urbana emergen como factores positivos, vinculados a un mayor uso tecnológico (“Siempre”) y mayor satisfacción. Si bien el género no influye en el uso frecuente de tecnología, sí marca diferencias en la no adopción. La ocupación (empleados, estudiantes, etc.) muestra patrones diferenciados, pero sin una relación clara que pueda establecerse sin pruebas estadísticas adicionales como el chi-cuadrado, lo que sugiere la necesidad de análisis más profundos para comprender estas dinámicas.

3. Gráfico de pastel (por variable categórica)

par(mfrow = c(2,2), mai = c(0.1, 0, 0.2, 0)) 
for (i in 1:6){
  cat <- levels(Y[[i]])
  per <- tabulate(Y[[i]]) / nrow(Y) * 100
  eti <- paste(cat, round(per,1), sep=" ")
  pie(summary(Y[[i]]), eti, 
      col = hcl.colors ( 6,"Set3"),
      main = colnames(Y)[i])
}

Preparación para el ACM

1. Matriz disyuntiva

Y <- as.data.frame(lapply(Y, factor))
Z <- acm.disjonctif(Y)
Z[seq(0,nrow(Z),50),]  # Muestra de registros
##     Genero.F Genero.M N_edu.Postgrado N_edu.Primaria N_edu.Secundaria
## 50         0        1               0              0                0
## 100        1        0               0              0                0
## 150        0        1               0              0                0
## 200        1        0               0              0                1
## 250        0        1               0              0                1
## 300        0        1               0              0                0
## 350        1        0               0              0                1
## 400        1        0               0              0                0
## 450        1        0               0              0                0
## 500        1        0               0              0                1
##     N_edu.Técnico N_edu.Universitario Ocupacion.Ama de casa
## 50              0                   1                     0
## 100             1                   0                     1
## 150             0                   1                     1
## 200             0                   0                     0
## 250             0                   0                     0
## 300             0                   1                     0
## 350             0                   0                     0
## 400             0                   1                     0
## 450             1                   0                     0
## 500             0                   0                     0
##     Ocupacion.Desempleado Ocupacion.Empleado Ocupacion.Estudiante
## 50                      0                  1                    0
## 100                     0                  0                    0
## 150                     0                  0                    0
## 200                     0                  1                    0
## 250                     0                  0                    1
## 300                     0                  1                    0
## 350                     0                  0                    1
## 400                     0                  1                    0
## 450                     0                  1                    0
## 500                     0                  1                    0
##     Ocupacion.Independiente Uso_Tec.A veces Uso_Tec.Frecuentemente
## 50                        0               0                      0
## 100                       0               1                      0
## 150                       0               1                      0
## 200                       0               1                      0
## 250                       0               0                      1
## 300                       0               0                      0
## 350                       0               0                      0
## 400                       0               0                      1
## 450                       0               1                      0
## 500                       0               0                      0
##     Uso_Tec.Nunca Uso_Tec.Rara vez Uso_Tec.Siempre Satisf_Serv.Insatisfecho
## 50              0                1               0                        0
## 100             0                0               0                        0
## 150             0                0               0                        0
## 200             0                0               0                        0
## 250             0                0               0                        0
## 300             0                0               1                        0
## 350             0                1               0                        0
## 400             0                0               0                        0
## 450             0                0               0                        0
## 500             0                1               0                        1
##     Satisf_Serv.Muy insatisfecho Satisf_Serv.Muy satisfecho Satisf_Serv.Neutral
## 50                             0                          0                   0
## 100                            0                          0                   0
## 150                            1                          0                   0
## 200                            0                          0                   0
## 250                            0                          1                   0
## 300                            0                          0                   0
## 350                            0                          0                   0
## 400                            0                          0                   1
## 450                            0                          1                   0
## 500                            0                          0                   0
##     Satisf_Serv.Satisfecho Zona.Rural Zona.Urbana
## 50                       1          0           1
## 100                      1          0           1
## 150                      0          1           0
## 200                      1          0           1
## 250                      0          0           1
## 300                      1          0           1
## 350                      1          1           0
## 400                      0          0           1
## 450                      0          0           1
## 500                      0          1           0

En esta matriz Cada fila (individuo) muestra combinaciones únicas de categorías activas (1) e inactivas (0). Permitiendo identificar patrones de coexistencia. Facilitando el cálculo de distancias entre perfiles, la presencia/ausencia de categorías permite medir similitudes entre individuos o grupos.

La matriz disyuntiva revela la diversidad de perfiles en la muestra y prepara el terreno para el ACM, donde se analizarán asociaciones entre categorías y su representación en dimensiones factoriales.

2. Tabla de Burt

B <- acm.burt(Y,Y)  # Tabla de Burt
# Visualizar tabla
head(B,10)
##                       Genero.F Genero.M N_edu.Postgrado N_edu.Primaria
## Genero.F                   266        0              36             26
## Genero.M                     0      259              32             31
## N_edu.Postgrado             36       32              68              0
## N_edu.Primaria              26       31               0             57
## N_edu.Secundaria            72       68               0              0
## N_edu.Técnico               58       44               0              0
## N_edu.Universitario         74       84               0              0
## Ocupacion.Ama de casa       25       20               8              5
## Ocupacion.Desempleado       26       29               6              6
## Ocupacion.Empleado          90       84              21             16
##                       N_edu.Secundaria N_edu.Técnico N_edu.Universitario
## Genero.F                            72            58                  74
## Genero.M                            68            44                  84
## N_edu.Postgrado                      0             0                   0
## N_edu.Primaria                       0             0                   0
## N_edu.Secundaria                   140             0                   0
## N_edu.Técnico                        0           102                   0
## N_edu.Universitario                  0             0                 158
## Ocupacion.Ama de casa                6            11                  15
## Ocupacion.Desempleado               21            14                   8
## Ocupacion.Empleado                  44            33                  60
##                       Ocupacion.Ama de casa Ocupacion.Desempleado
## Genero.F                                 25                    26
## Genero.M                                 20                    29
## N_edu.Postgrado                           8                     6
## N_edu.Primaria                            5                     6
## N_edu.Secundaria                          6                    21
## N_edu.Técnico                            11                    14
## N_edu.Universitario                      15                     8
## Ocupacion.Ama de casa                    45                     0
## Ocupacion.Desempleado                     0                    55
## Ocupacion.Empleado                        0                     0
##                       Ocupacion.Empleado Ocupacion.Estudiante
## Genero.F                              90                   72
## Genero.M                              84                   65
## N_edu.Postgrado                       21                   19
## N_edu.Primaria                        16                   17
## N_edu.Secundaria                      44                   37
## N_edu.Técnico                         33                   21
## N_edu.Universitario                   60                   43
## Ocupacion.Ama de casa                  0                    0
## Ocupacion.Desempleado                  0                    0
## Ocupacion.Empleado                   174                    0
##                       Ocupacion.Independiente Uso_Tec.A veces
## Genero.F                                   53              54
## Genero.M                                   61              44
## N_edu.Postgrado                            14              17
## N_edu.Primaria                             13              11
## N_edu.Secundaria                           32              26
## N_edu.Técnico                              23              18
## N_edu.Universitario                        32              26
## Ocupacion.Ama de casa                       0               6
## Ocupacion.Desempleado                       0              11
## Ocupacion.Empleado                          0              30
##                       Uso_Tec.Frecuentemente Uso_Tec.Nunca Uso_Tec.Rara vez
## Genero.F                                  97             6               29
## Genero.M                                  85            20               24
## N_edu.Postgrado                           25             4                7
## N_edu.Primaria                            19             2                5
## N_edu.Secundaria                          48             6               13
## N_edu.Técnico                             33             6               12
## N_edu.Universitario                       57             8               16
## Ocupacion.Ama de casa                     20             2                3
## Ocupacion.Desempleado                     17             3                6
## Ocupacion.Empleado                        69             4               21
##                       Uso_Tec.Siempre Satisf_Serv.Insatisfecho
## Genero.F                           80                       40
## Genero.M                           86                       48
## N_edu.Postgrado                    15                       14
## N_edu.Primaria                     20                       17
## N_edu.Secundaria                   47                       12
## N_edu.Técnico                      33                       17
## N_edu.Universitario                51                       28
## Ocupacion.Ama de casa              14                        8
## Ocupacion.Desempleado              18                       12
## Ocupacion.Empleado                 50                       33
##                       Satisf_Serv.Muy insatisfecho Satisf_Serv.Muy satisfecho
## Genero.F                                        32                         44
## Genero.M                                        26                         33
## N_edu.Postgrado                                 12                         13
## N_edu.Primaria                                   5                          6
## N_edu.Secundaria                                 9                         24
## N_edu.Técnico                                   14                         15
## N_edu.Universitario                             18                         19
## Ocupacion.Ama de casa                            6                          4
## Ocupacion.Desempleado                            6                         10
## Ocupacion.Empleado                              22                         23
##                       Satisf_Serv.Neutral Satisf_Serv.Satisfecho Zona.Rural
## Genero.F                               60                     90         59
## Genero.M                               59                     93         52
## N_edu.Postgrado                        13                     16          9
## N_edu.Primaria                         12                     17         12
## N_edu.Secundaria                       41                     54         30
## N_edu.Técnico                          23                     33         26
## N_edu.Universitario                    30                     63         34
## Ocupacion.Ama de casa                   7                     20          7
## Ocupacion.Desempleado                  13                     14         17
## Ocupacion.Empleado                     42                     54         38
##                       Zona.Urbana
## Genero.F                      207
## Genero.M                      207
## N_edu.Postgrado                59
## N_edu.Primaria                 45
## N_edu.Secundaria              110
## N_edu.Técnico                  76
## N_edu.Universitario           124
## Ocupacion.Ama de casa          38
## Ocupacion.Desempleado          38
## Ocupacion.Empleado            136

La intersección entre Genero.M y Uso_Tec.Nunca muestra una frecuencia alta comparada con Genero.F, lo cual confirma el hallazgo previo de que los hombres representan la mayoría de los no usuarios de tecnología (20 hombres vs. 6 mujeres). Tambien, Se observa una clara asociación entre mayores niveles educativos (como N_edu.Universitario y N_edu.Postgrado) con un uso más frecuente de tecnología (Uso_Tec.Frecuentemente y Uso_Tec.Siempre), lo que sugiere que la formación académica impulsa la integración digital.

Las personas en zona urbana (Zona.Urbana) tienen mayor representación en las categorías de satisfacción positiva, mientras que la zona rural muestra más casos en las categorías de insatisfacción, confirmando posibles desigualdades de acceso o calidad en los servicios digitales.

En conjunto, la Tabla de Burt permite visualizar cómo se relacionan las distintas dimensiones categóricas

3. Cálculo de masas marginales

summary(Y)
##  Genero            N_edu             Ocupacion             Uso_Tec   
##  F:266   Postgrado    : 68   Ama de casa  : 45   A veces       : 98  
##  M:259   Primaria     : 57   Desempleado  : 55   Frecuentemente:182  
##          Secundaria   :140   Empleado     :174   Nunca         : 26  
##          Técnico      :102   Estudiante   :137   Rara vez      : 53  
##          Universitario:158   Independiente:114   Siempre       :166  
##            Satisf_Serv      Zona    
##  Insatisfecho    : 88   Rural :111  
##  Muy insatisfecho: 58   Urbana:414  
##  Muy satisfecho  : 77               
##  Neutral         :119               
##  Satisfecho      :183

Masa marginal fila

1/525  
## [1] 0.001904762

\[\text{Masa marginal} = \frac{1}{525} \approx 0.00190 \text{ (o 0.190%)}\]

Cada individuo aporta el 0.190% del peso total del análisis, lo que refleja una contribución equitativa y sin sesgos individuales al modelo.

Ejecución ACM

1. Análisis con dudi.acm()

acm <- dudi.acm(Y, scannf = FALSE, nf = 18);acm
## Duality diagramm
## class: acm dudi
## $call: dudi.acm(df = Y, scannf = FALSE, nf = 18)
## 
## $nf: 18 axis-components saved
## $rank: 18
## eigen values: 0.2217 0.2166 0.2023 0.195 0.1861 ...
##   vector length mode    content       
## 1 $cw    24     numeric column weights
## 2 $lw    525    numeric row weights   
## 3 $eig   18     numeric eigen values  
## 
##   data.frame nrow ncol content             
## 1 $tab       525  24   modified array      
## 2 $li        525  18   row coordinates     
## 3 $l1        525  18   row normed scores   
## 4 $co        24   18   column coordinates  
## 5 $c1        24   18   column normed scores
## other elements: cr

Se muestra 18 valores propios (\(eig\)), correspondientes a las 18 dimensiones posibles del espacio factorial, ya que el rango del análisis es 18, determinado por el número total de categorías menos el número de variables. Además, existen 8 componentes principales los cuales fueron retenidos y almacenados, los cuales explicaran progresivamente la inercia (variabilidad) total del sistema.

La matriz de datos fue transformada internamente en una tabla modificada de tamaño 525 × 24 ($tab), lo cual corresponde a los 525 individuos y 24 categorías activas (niveles de variables).

Se generaron coordenadas para:

Las filas (individuos), tanto crudas (\(li\)) como normalizadas (\(l1\)), en las 8 dimensiones seleccionadas.

Las columnas (categorías), con sus posiciones factoriales (\(co\)) y versiones normalizadas (\(c1\)).

2. Valores Propios e inercia

barplot(acm$eig, cex.axis=0.6, col="purple4",
        cex.names = 0.8,       # tamaño de nombres de ejes
        ylab = "Valor propio (Eigenvalue)",
        main = "Valores propios por dimensión")

eiglst <- data.frame(
  vp = acm$eig,
  porce = acm$eig*100/sum(acm$eig),
  acupor = cumsum(acm$eig)*100/sum(acm$eig)
  
)

eiglst 
##           vp    porce     acupor
## 1  0.2216939 7.389797   7.389797
## 2  0.2165597 7.218658  14.608455
## 3  0.2022752 6.742508  21.350963
## 4  0.1950104 6.500348  27.851311
## 5  0.1861138 6.203793  34.055104
## 6  0.1817665 6.058883  40.113987
## 7  0.1766213 5.887377  46.001364
## 8  0.1729536 5.765119  51.766483
## 9  0.1677653 5.592178  57.358661
## 10 0.1637801 5.459336  62.817996
## 11 0.1609389 5.364628  68.182625
## 12 0.1526381 5.087936  73.270561
## 13 0.1504866 5.016219  78.286780
## 14 0.1382377 4.607923  82.894703
## 15 0.1369274 4.564246  87.458949
## 16 0.1311909 4.373029  91.831978
## 17 0.1298047 4.326824  96.158802
## 18 0.1152359 3.841198 100.000000

La inercia se distribuye de forma relativamente uniforme entre las primeras dimensiones, sin una dimensión que concentre gran parte de la variabilidad,es decir, ninguna supera el 10%. Esto indica que el conjunto de variables categóricas es complejo y que la estructura de datos está dispersa en múltiples dimensiones.

Por ello, se justifica conservar al menos las 5 a 8 primeras dimensiones para captar una representación sustancial de las relaciones entre categorías. Esto también sugiere que los patrones latentes en los datos no están dominados por unas pocas variables, sino que existe una diversidad de factores explicativos relevantes.

3. Gráfico factorial

selin <- seq(25,445,25)  # Selección de individuos múltiplos de 25
plot(acm, Tcol = TRUE, roweti = as.character(selin), 
     cframe = 1, cex.row = 0.6, cex.global = 0.8, gg = TRUE)

Este gráfico factorial respresenta las dos primeras dimensiones (con una inercia acumulada del 14.6%), permiteiendo visualizar las relaciones entre las categorías sociodemográficas, el uso de tecnología y la satisfacción con los servicios digitales.

Las categorías como “Universitario”, “Empleado”, “Uso_Tec.Siempre” y “Satisfecho” tienden a ubicarse en una misma zona, lo que sugiere un perfil asociado a mayor integración digital y satisfacción con los servicios. En oposición, categorías como “Primaria”, “Ama de casa”, “Uso_Tec.Nunca” y “Muy insatisfecho” aparecen en otro sector del gráfico, reflejando un perfil de vulnerabilidad digital, con bajo uso tecnológico y menor satisfacción. Asimismo, la residencia rural se aproxima a este segundo grupo, indicando una posible desigualdad territorial.

4. Análisis con ca::mjca

cm <- mjca(Y, lambda='indicator', nd=NA)
plot(cm)

Masas de los Individuos

head(cm$rowmass, 8)
## [1] 0.001904762 0.001904762 0.001904762 0.001904762 0.001904762 0.001904762
## [7] 0.001904762 0.001904762

El Análisis de Correspondencias Múltiples (ACM) asignó una masa constante de 0.19% a cada individuo (n = 525), lo que garantiza que todos los participantes contribuyeron equitativamente al modelo. Esta uniformidad refuerza la validez de los patrones identificados, como la asociación entre mayores horas de internet y niveles educativos altos, ya que no están influenciados por observaciones atípicas o desbalanceadas.

Masas de las Categorías

cm$colmass
##  [1] 0.084444444 0.082222222 0.021587302 0.018095238 0.044444444 0.032380952
##  [7] 0.050158730 0.014285714 0.017460317 0.055238095 0.043492063 0.036190476
## [13] 0.031111111 0.057777778 0.008253968 0.016825397 0.052698413 0.027936508
## [19] 0.018412698 0.024444444 0.037777778 0.058095238 0.035238095 0.131428571

Se observa que la categoría Zona_Residencia.Urbana (13.1%) tiene el mayor peso, coincidiendo con su predominio en la muestra. Otras categorías relevantes incluyen Uso_Tecnologia.Frecuentemenete (5.57%) y Ocupacion.Empleado (5.52%).

En contraste, categorías como Uso_Tecnologia.Siempre (0.82%) muestran una representación marginal, lo que sugiere limitaciones para generalizar conclusiones sobre estos grupos.

Inercia de las Categorías

cm$colinertia
##  [1] 0.014178281 0.014561478 0.024953412 0.025247384 0.021350928 0.022757100
##  [7] 0.019964597 0.026018898 0.025653006 0.019048844 0.021240014 0.022418709
## [13] 0.022993801 0.018818763 0.027399823 0.025576192 0.019415623 0.024408440
## [19] 0.025221448 0.024353241 0.022049926 0.019376465 0.022697553 0.006085576

El análisis de inercias identificó que:

  1. Los no usuarios de tecnología (Uso_Tecnologia.Siempre, inercia=0.02739) y usuarios con ocupación Ama de casa (Rara vez, 0.02601) son los principales diferenciadores de perfiles, a pesar de su baja frecuencia. Esto revela que la no adopción tecnológica crea patrones únicos en la población.

  2. Grupos vulnerables digitalmente: Desempleado (0.02565) y personas con educación primaria (0.02524) muestran comportamientos distintivos, destacando posibles brechas de acceso o habilidades.

  3. Variables poco relevantes: La zona urbana (inercias=0.00608), aunque predominante (78.9%), no explica diferencias significativas. El género muestra contribuciones mínimas (F:0.01417, M:0.01456), indicando que no es un factor discriminante en este estudio.

5. Análisis con FactoMineR::MCA

fit2 <- MCA(Y)

Cuadro Resumen de Dimensiones

summary(fit2, nb.dec=1, ncp=8)
## 
## Call:
## MCA(X = Y) 
## 
## 
## Eigenvalues
##                      Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6 Dim.7 Dim.8 Dim.9
## Variance               0.2   0.2   0.2   0.2   0.2   0.2   0.2   0.2   0.2
## % of var.              7.4   7.2   6.7   6.5   6.2   6.1   5.9   5.8   5.6
## Cumulative % of var.   7.4  14.6  21.4  27.9  34.1  40.1  46.0  51.8  57.4
##                      Dim.10 Dim.11 Dim.12 Dim.13 Dim.14 Dim.15 Dim.16 Dim.17
## Variance                0.2    0.2    0.2    0.2    0.1    0.1    0.1    0.1
## % of var.               5.5    5.4    5.1    5.0    4.6    4.6    4.4    4.3
## Cumulative % of var.   62.8   68.2   73.3   78.3   82.9   87.5   91.8   96.2
##                      Dim.18
## Variance                0.1
## % of var.               3.8
## Cumulative % of var.  100.0
## 
## Individuals (the 10 first)
##                 Dim.1  ctr cos2   Dim.2  ctr cos2   Dim.3  ctr cos2   Dim.4
## 1             |  -0.4  0.1  0.1 |  -0.3  0.1  0.1 |   0.5  0.2  0.1 |  -0.4
## 2             |  -0.3  0.1  0.0 |   0.2  0.1  0.0 |  -1.0  0.9  0.3 |   0.1
## 3             |  -0.2  0.1  0.0 |   0.2  0.0  0.0 |  -0.7  0.5  0.1 |  -0.4
## 4             |  -0.2  0.0  0.0 |   0.8  0.6  0.2 |  -0.4  0.2  0.1 |  -0.5
## 5             |   0.6  0.3  0.1 |  -0.4  0.1  0.1 |   0.4  0.1  0.1 |   0.0
## 6             |  -0.2  0.0  0.0 |   0.1  0.0  0.0 |  -0.2  0.0  0.0 |   0.2
## 7             |  -0.4  0.2  0.1 |  -0.2  0.0  0.0 |   0.3  0.1  0.0 |  -0.3
## 8             |   0.1  0.0  0.0 |  -0.4  0.1  0.1 |  -0.1  0.0  0.0 |  -0.5
## 9             |  -0.3  0.1  0.0 |   0.0  0.0  0.0 |   0.5  0.2  0.1 |  -0.2
## 10            |  -0.1  0.0  0.0 |   0.2  0.0  0.0 |   0.0  0.0  0.0 |  -0.1
##                ctr cos2   Dim.5  ctr cos2  
## 1              0.2  0.1 |  -0.3  0.1  0.1 |
## 2              0.0  0.0 |   0.6  0.4  0.1 |
## 3              0.1  0.0 |   0.7  0.5  0.1 |
## 4              0.3  0.1 |   0.4  0.2  0.1 |
## 5              0.0  0.0 |   0.3  0.1  0.0 |
## 6              0.0  0.0 |  -0.3  0.1  0.0 |
## 7              0.1  0.0 |   0.9  0.9  0.3 |
## 8              0.3  0.2 |  -0.3  0.1  0.1 |
## 9              0.0  0.0 |   0.0  0.0  0.0 |
## 10             0.0  0.0 |  -0.5  0.3  0.1 |
## 
## Categories (the 10 first)
##                 Dim.1   ctr  cos2 v.test   Dim.2   ctr  cos2 v.test   Dim.3
## F             |   0.1   0.6   0.0    2.8 |   0.2   2.2   0.1    5.5 |  -0.5
## M             |  -0.1   0.6   0.0   -2.8 |  -0.2   2.3   0.1   -5.5 |   0.5
## Postgrado     |  -0.5   2.5   0.0   -4.5 |   0.6   3.1   0.0    4.9 |  -1.1
## Primaria      |  -0.1   0.0   0.0   -0.4 |   0.4   1.2   0.0    3.0 |   0.9
## Secundaria    |   0.6   8.2   0.1    8.8 |  -0.6   7.7   0.1   -8.5 |  -0.2
## Técnico       |   0.3   1.4   0.0    3.4 |   0.3   1.2   0.0    3.2 |   0.0
## Universitario |  -0.5   6.3   0.1   -7.9 |   0.0   0.0   0.0   -0.2 |   0.4
## Ama de casa   |  -1.0   7.1   0.1   -7.3 |   0.6   2.3   0.0    4.1 |   0.0
## Desempleado   |   1.1   9.5   0.1    8.6 |   0.2   0.3   0.0    1.4 |   0.1
## Empleado      |   0.0   0.0   0.0   -0.2 |   0.5   6.3   0.1    8.0 |   0.1
##                 ctr  cos2 v.test   Dim.4   ctr  cos2 v.test   Dim.5   ctr  cos2
## F              10.1   0.2  -11.4 |  -0.3   4.5   0.1   -7.4 |   0.0   0.1   0.0
## M              10.3   0.2   11.4 |   0.3   4.6   0.1    7.4 |   0.0   0.1   0.0
## Postgrado      13.0   0.2   -9.7 |   0.8   6.5   0.1    6.8 |   0.2   0.4   0.0
## Primaria        7.0   0.1    7.1 |   1.1  11.4   0.2    8.9 |  -0.2   0.3   0.0
## Secundaria      1.3   0.0   -3.4 |  -0.1   0.1   0.0   -0.8 |  -0.5   5.8   0.1
## Técnico         0.0   0.0   -0.5 |  -0.4   2.3   0.0   -4.2 |   1.3  28.8   0.4
## Universitario   4.0   0.1    6.0 |  -0.4   5.0   0.1   -6.6 |  -0.4   4.3   0.1
## Ama de casa     0.0   0.0    0.0 |  -0.3   0.7   0.0   -2.2 |   1.0   7.0   0.1
## Desempleado     0.1   0.0    0.9 |   0.7   4.9   0.1    5.8 |   1.1  10.9   0.1
## Empleado        0.3   0.0    1.7 |  -0.6   9.6   0.2   -9.4 |  -0.5   6.6   0.1
##               v.test  
## F                0.8 |
## M               -0.8 |
## Postgrado        1.6 |
## Primaria        -1.5 |
## Secundaria      -6.8 |
## Técnico         14.5 |
## Universitario   -6.0 |
## Ama de casa      6.7 |
## Desempleado      8.4 |
## Empleado        -7.6 |
## 
## Categorical variables (eta2)
##                 Dim.1 Dim.2 Dim.3 Dim.4 Dim.5  
## Genero        |   0.0   0.1   0.2   0.1   0.0 |
## N_edu         |   0.2   0.2   0.3   0.3   0.4 |
## Ocupacion     |   0.4   0.2   0.1   0.2   0.3 |
## Uso_Tec       |   0.1   0.3   0.2   0.3   0.2 |
## Satisf_Serv   |   0.4   0.5   0.3   0.2   0.1 |
## Zona          |   0.2   0.0   0.1   0.0   0.0 |

El resumen factorial revela que las primeras ocho dimensiones del Análisis de Correspondencias Múltiples explican en conjunto el 51.8% de la variabilidad total, lo que indica una estructura compleja en las relaciones entre las variables categóricas.

Las variables que más contribuyen a estas dimensiones son el nivel educativo, la ocupación, el uso de tecnología y la satisfacción con los servicios digitales. Las categorías “Desempleado”, “Secundaria”, “Técnico” y “Ama de casa” destacan por su alta contribución a la construcción de las primeras dimensiones, reflejando perfiles diferenciados en el uso y percepción de los servicios digitales.

Además, el valor cos2 muestra que estas categorías están bien representadas en el plano factorial, lo que refuerza su relevancia en la segmentación de los grupos. En contraste, variables como género y zona de residencia aportan poca varianza, lo que indica que no son ejes principales en la diferenciación de perfiles digitales dentro de esta muestra.

Graficos Factoriales

fviz_mca_var(fit2, col.var = "darkorchid")

Identificando los perfiles sociodigitales a partir de la proximidad y dirección de las categorías sobre las dos primeras dimensiones se observa que en el cuadrante superior derecho, se observa un agrupamiento de “Femenino”, “Tecnico”, “Desempleado”, “Rural” y “Neutral”, lo que sugiere un perfil femenino con educación Tecnica, Desempleada y ubicada en zona Rural, asociada a satisfacción neutral con los servicios digitales. En contraposición, en el cuadrante inferior izquierdo se posicionan “Urbano”, “Masculino”, representa claramente la no integración digital. “Estudiante”, “Universitario”, “Satisfecho”, “Rara vez” y “Nunca”, este extremo izquierdo, con “Nunca” y “Rara vez”, representa claramente la no integración digital.

Grafico de valores propios

fviz_eig(fit2, addlabels=TRUE, hjust = 0.5, barfill="white", barcolor ="purple3", linecolor ="red") + theme_minimal()

El gráfico de valores propios indica que la información contenida en las variables categóricas está distribuida de forma relativamente homogénea entre las dimensiones factoriales, sin que una sola domine el análisis. Las primeras dos dimensiones explican conjuntamente alrededor del 12.1% de la variabilidad total (6.1% y 6%, respectivamente), lo cual confirma que la estructura de los datos es compleja y multidimensional. Esto sugiere que para captar una representación fiel de los patrones subyacentes en los datos, es necesario considerar al menos las primeras cinco u ocho dimensiones. La pendiente suave de la curva roja (línea de inercia acumulada) refuerza esta conclusión, mostrando que no existe un punto de quiebre abrupto, sino una contribución progresiva de cada eje al entendimiento global del sistema.

Prueba de independencia Chi-cuadrado

  • \(H₀\): No existe asociación entre el nivel educativo y la satisfacción con los servicios digitales; ambas variables son independientes.

  • \(H₁\): Existe asociación entre el nivel educativo y la satisfacción con los servicios digitales; ambas variables no son independientes.

tabla <- table(Y$N_edu,Y$Satisf_Serv)
chisq.test(tabla)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla
## X-squared = 30.229, df = 16, p-value = 0.01685

1. Valor p con función pchisq

pchisq(30.229, 16, lower.tail = FALSE)
## [1] 0.0168504

La prueba de independencia chi-cuadrado aplicada a las variables Ocupación y Uso de Tecnología arroja un valor de \(X^2 =30.229\) con 16 grados de libertad y un valor-p de 0.01685. Dado que el valor-p es menor que 0.05, se rechaza la hipótesis nula, lo que indica que existe una asociación estadísticamente significativa entre el nivel educativo y la satisfacción con los servicios digitales. Este resultado sugiere que la percepción de satisfacción no es aleatoria frente al nivel educativo alcanzado: ciertos niveles educativos tienden a reportar mayores (o menores) niveles de satisfacción. Esto podría deberse a diferencias en expectativas, competencias digitales o experiencias previas con los servicios. Por ejemplo, personas con educación universitaria o de postgrado podrían tener mayor capacidad para aprovechar los servicios digitales, lo que se traduce en niveles más altos de satisfacción.

2. Visualización

shadeDist(30.229, dist = "dchisq", df = 16, lower.tail = FALSE, col = c("purple4", "red4"))

3. Visualización de la prueba con ggstatsplot

ggbarstats(
  data = Y,
  x = N_edu,
  y = Satisf_Serv,
  label = "both",
  label.args = list(size = 2.5)  # Ajusta el tamaño aquí
)

A continuación, se india una asociación estadísticamente significativa entre entre el nivel educativo y la satisfacción con los servicios digitales. A nivel visual, se observa que las personas con nivel universitario y secundaria representan proporciones más altas dentro de las categorías de “Satisfecho” y “Muy satisfecho”, mientras que quienes tienen solo educación primaria o postgrado se distribuyen más en los extremos (Insatisfecho y Muy insatisfecho), lo que sugiere una percepción polarizada en estos grupos. Además, la categoría “Neutral” muestra una alta concentración de personas con educación secundaria (34%) y técnica (19%), posiblemente indicando una experiencia digital aceptable pero no destacada. Aunque el tamaño del efecto (Cramér’s V = 0.11) es pequeño, el patrón general sugiere que a mayor nivel educativo, tiende a aumentar la satisfacción con los servicios digitales, aunque no de forma lineal ni uniforme. En conjunto, este gráfico apoya la idea de que la educación influye en la percepción y aprovechamiento de los servicios digitales, pero también señala la necesidad de explorar otros factores que expliquen las diferencias dentro de los mismos niveles.

Conclusión

Este estudio permitió analizar la relación entre características sociodemográficas y hábitos digitales en personas adultas, con un enfoque en el uso de tecnologías digitales y la satisfacción con los servicios asociados. Los análisis descriptivos mostraron patrones claros: las personas con niveles educativos más altos, empleo formal y residencia en zonas urbanas tienden a reportar un mayor uso de tecnología y una mayor satisfacción. Por el contrario, los individuos con menor nivel educativo, amas de casa, personas desempleadas o residentes en zonas rurales presentaron menores niveles de uso y mayor insatisfacción, lo que sugiere una posible brecha digital estructural.

El Análisis de Correspondencias Múltiples (ACM), tanto con ade4, ca como con FactoMineR, confirmó estas tendencias, revelando agrupaciones bien definidas entre categorías asociadas a inclusión digital (como “Universitario”, “Empleado”, “Siempre”, “Satisfecho”) y otras vinculadas a exclusión digital (como “Primaria”, “Ama de casa”, “Nunca”, “Muy insatisfecho”). Las pruebas de chi-cuadrado evidenciaron asociaciones significativas entre variables como nivel educativo y satisfacción, aunque con tamaños de efecto pequeños, lo cual indica que las relaciones son reales pero no determinantes por sí solas. Además, la ocupación no mostró asociación significativa con el uso tecnológico, lo que sugiere que este comportamiento puede depender más de factores como la educación, el acceso y la experiencia previa.

Finalmente, las visualizaciones reforzaron la complejidad del fenómeno: las brechas digitales no responden a una única causa, sino a una combinación de factores estructurales, sociales y tecnológicos. Por tanto, se recomienda profundizar con análisis multivariados y modelos predictivos, así como considerar variables complementarias como ingreso, habilidades digitales o acceso a dispositivos, para una comprensión más integral del ecosistema digital en la población.

4. ANÁLISIS DISCRIMINANTE LINEAL SIMPLE

Introduccion

La diabetes es una de las enfermedades crónicas con mayor prevalencia a nivel mundial, afectando la calidad de vida de millones de personas. Su diagnóstico temprano es crucial para implementar intervenciones médicas y hábitos de vida que reduzcan complicaciones futuras. En este contexto, el uso de herramientas estadísticas como el Análisis Discriminante Lineal (LDA, por sus siglas en inglés) permite construir modelos predictivos que ayuden a clasificar correctamente a los individuos con o sin esta enfermedad, a partir de variables clínicas y antecedentes personales.

El presente trabajo tiene como objetivo aplicar el Análisis Discriminante Lineal a un conjunto de datos provisto por el National Institute of Diabetes and Digestive and Kidney Diseases, el cual contiene información clínica de 768 mujeres de etnia Pima mayores de 21 años. Las variables incluyen medidas como la glucosa en plasma, la presión arterial, el índice de masa corporal, entre otras.

Variables de estudio

Variable Tipo Descripción
Pregnancies Cuantitativa discreta Número de veces que la paciente ha estado embarazada
Glucose Cuantitativa continua Concentración de glucosa en plasma a las 2 horas tras una prueba oral
BloodPressure Cuantitativa continua Presión arterial diastólica en milímetros de mercurio (mm Hg)
SkinThickness Cuantitativa continua Espesor del pliegue cutáneo del tríceps en milímetros (mm)
Insulin Cuantitativa continua Nivel de insulina sérica a las 2 horas en micro unidades por mililitro (μU/mL)
BMI Cuantitativa continua Índice de masa corporal (peso/talla²) en kg/m²
DiabetesPedigreeFunction Cuantitativa continua Indicador del historial familiar de diabetes (valor sin unidad)
Age Cuantitativa discreta Edad de la paciente en años
Outcome Categórica binaria Diagnóstico de diabetes (Diabetes / No_Diabetes)

1. Lectura de datos

# Leer los datos (asumiendo que están en un archivo CSV)
diabetes <- read.csv("diabetes.csv")

# Ver estructura inicial
head(diabetes)
##   Pregnancies Glucose BloodPressure SkinThickness Insulin  BMI
## 1           6     148            72            35       0 33.6
## 2           1      85            66            29       0 26.6
## 3           8     183            64             0       0 23.3
## 4           1      89            66            23      94 28.1
## 5           0     137            40            35     168 43.1
## 6           5     116            74             0       0 25.6
##   DiabetesPedigreeFunction Age Outcome
## 1                    0.627  50       1
## 2                    0.351  31       0
## 3                    0.672  32       1
## 4                    0.167  21       0
## 5                    2.288  33       1
## 6                    0.201  30       0
dim(diabetes)
## [1] 768   9
str(diabetes)
## 'data.frame':    768 obs. of  9 variables:
##  $ Pregnancies             : int  6 1 8 1 0 5 3 10 2 8 ...
##  $ Glucose                 : int  148 85 183 89 137 116 78 115 197 125 ...
##  $ BloodPressure           : int  72 66 64 66 40 74 50 0 70 96 ...
##  $ SkinThickness           : int  35 29 0 23 35 0 32 0 45 0 ...
##  $ Insulin                 : int  0 0 0 94 168 0 88 0 543 0 ...
##  $ BMI                     : num  33.6 26.6 23.3 28.1 43.1 25.6 31 35.3 30.5 0 ...
##  $ DiabetesPedigreeFunction: num  0.627 0.351 0.672 0.167 2.288 ...
##  $ Age                     : int  50 31 32 21 33 30 26 29 53 54 ...
##  $ Outcome                 : int  1 0 1 0 1 0 1 0 1 1 ...
# Convertir Outcome a factor y establecer niveles
diabetes$Outcome <- factor(diabetes$Outcome, levels = c(0, 1), labels = c("No_Diabetes", "Diabetes"))

# Establecer Diabetes como categoría de referencia (positivo)
diabetes$Outcome <- relevel(diabetes$Outcome, ref = "Diabetes")

# Verificar la categoría de referencia
contrasts(diabetes$Outcome)
##             No_Diabetes
## Diabetes              0
## No_Diabetes           1

2. Análisis Descriptivo

tbl_summary(diabetes,
            by = Outcome,
            statistic = all_continuous() ~ "{mean} ({sd})") %>%
  add_ci()
Characteristic Diabetes
N = 268
1
95% CI No_Diabetes
N = 500
1
95% CI
Pregnancies 5 (4) 4.4, 5.3 3 (3) 3.0, 3.6
Glucose 141 (32) 137, 145 110 (26) 108, 112
BloodPressure 71 (21) 68, 73 68 (18) 67, 70
SkinThickness 22 (18) 20, 24 20 (15) 18, 21
Insulin 100 (139) 84, 117 69 (99) 60, 77
BMI 35 (7) 34, 36 30 (8) 30, 31
DiabetesPedigreeFunction 0.55 (0.37) 0.51, 0.60 0.43 (0.30) 0.40, 0.46
Age 37 (11) 36, 38 31 (12) 30, 32
Abbreviation: CI = Confidence Interval
1 Mean (SD)

2.1 Histogramas y gráficos de densidad

plot_histogram(diabetes)

plot_density(diabetes)

2.2 Histogramas y gráficos de densidad

plot_qq(diabetes)

plot_qq(diabetes, by = 'Outcome')

plot_qq(diabetes, by = 'Outcome', ncol = 2, ggtheme = theme_dark())

2.3 Boxplots por grupo

plot_boxplot(diabetes, by = 'Outcome')

2.4 Componentes principales

plot_prcomp(diabetes)

2.5 Análisis descriptivo por grupo

describeBy(diabetes[,-9], diabetes$Outcome)
## 
##  Descriptive statistics by group 
## group: Diabetes
##                          vars   n   mean     sd median trimmed   mad   min
## Pregnancies                 1 268   4.87   3.74   4.00    4.60  4.45  0.00
## Glucose                     2 268 141.26  31.94 140.00  141.69 35.58  0.00
## BloodPressure               3 268  70.82  21.49  74.00   73.99 11.86  0.00
## SkinThickness               4 268  22.16  17.68  27.00   21.61 19.27  0.00
## Insulin                     5 268 100.34 138.69   0.00   73.64  0.00  0.00
## BMI                         6 268  35.14   7.26  34.25   34.84  5.71  0.00
## DiabetesPedigreeFunction    7 268   0.55   0.37   0.45    0.50  0.31  0.09
## Age                         8 268  37.07  10.97  36.00   36.28 11.86 21.00
##                             max  range  skew kurtosis   se
## Pregnancies               17.00  17.00  0.50    -0.47 0.23
## Glucose                  199.00 199.00 -0.49     1.35 1.95
## BloodPressure            114.00 114.00 -1.92     4.53 1.31
## SkinThickness             99.00  99.00  0.11    -0.25 1.08
## Insulin                  846.00 846.00  1.82     4.20 8.47
## BMI                       67.10  67.10  0.00     4.60 0.44
## DiabetesPedigreeFunction   2.42   2.33  1.70     4.40 0.02
## Age                       70.00  49.00  0.58    -0.38 0.67
## ------------------------------------------------------------ 
## group: No_Diabetes
##                          vars   n   mean    sd median trimmed   mad   min
## Pregnancies                 1 500   3.30  3.02   2.00    2.88  2.97  0.00
## Glucose                     2 500 109.98 26.14 107.00  108.87 23.72  0.00
## BloodPressure               3 500  68.18 18.06  70.00   69.97 11.86  0.00
## SkinThickness               4 500  19.66 14.89  21.00   19.08 16.31  0.00
## Insulin                     5 500  68.79 98.87  39.00   49.19 57.82  0.00
## BMI                         6 500  30.30  7.69  30.05   30.37  7.19  0.00
## DiabetesPedigreeFunction    7 500   0.43  0.30   0.34    0.38  0.22  0.08
## Age                         8 500  31.19 11.67  27.00   28.98  7.41 21.00
##                             max  range  skew kurtosis   se
## Pregnancies               13.00  13.00  1.11     0.65 0.13
## Glucose                  197.00 197.00  0.17     1.85 1.17
## BloodPressure            122.00 122.00 -1.80     5.58 0.81
## SkinThickness             60.00  60.00  0.03    -1.05 0.67
## Insulin                  744.00 744.00  2.48     9.30 4.42
## BMI                       57.30  57.30 -0.66     2.99 0.34
## DiabetesPedigreeFunction   2.33   2.25  1.99     6.01 0.01
## Age                       81.00  60.00  1.56     1.91 0.52

2.5 Análisis descriptivo por grupo

ggscatmat(data = diabetes, color = "Outcome", alpha = 0.4) +
  theme_bw() +
  labs(title = "Correlación por pares") +
  theme(plot.title = element_text(size = 16, face = "bold"),
        axis.text = element_blank(),
        strip.text = element_text(colour = "black", size = 8, face = 2))

ggpairs(diabetes, mapping = ggplot2::aes(color = Outcome), alpha = 0.4, 
        lower = list(continuous = "smooth"), 
        diag = list(continuous = "bar"), 
        axisLabels = "none")

2.6 Boxplot para todas las variables

df.m <- melt(diabetes, id.var = "Outcome")
ggplot(data = df.m, aes(x = variable, y = value)) + 
  geom_boxplot(aes(fill = Outcome)) + 
  facet_wrap(~ variable, scales = "free") +
  theme(axis.text.x = element_blank())

3. Seleccion de variables

3.1 Criterio de lambda de Wilks para selección de variables

greedy.wilks(Outcome ~ ., data = diabetes)
## Formula containing included variables: 
## 
## Outcome ~ Glucose + BMI + Pregnancies + DiabetesPedigreeFunction + 
##     BloodPressure + Age
## <environment: 0x000001b771db38b0>
## 
## 
## Values calculated in each step of the selection procedure: 
## 
##                       vars Wilks.lambda F.statistics.overall p.value.overall
## 1                  Glucose    0.7823018            213.16175    8.935432e-43
## 2                      BMI    0.7445276            131.24858    9.872099e-50
## 3              Pregnancies    0.7172781            100.37925    8.783711e-55
## 4 DiabetesPedigreeFunction    0.7077126             78.78031    5.910232e-56
## 5            BloodPressure    0.7012579             64.92376    1.762995e-56
## 6                      Age    0.6982123             54.82107    2.917434e-56
##   F.statistics.diff p.value.diff
## 1        213.161752 8.935432e-43
## 2         38.812869 7.691106e-10
## 3         29.024475 9.521767e-08
## 4         10.312757 1.376453e-03
## 5          7.013840 8.255335e-03
## 6          3.319493 6.885480e-02

3.2 Selección de variables con Boruta

set.seed(123)
boruta <- Boruta(Outcome ~ ., data = diabetes, doTrace = 2)
print(boruta)
## Boruta performed 99 iterations in 47.08333 secs.
##  7 attributes confirmed important: Age, BMI, DiabetesPedigreeFunction,
## Glucose, Insulin and 2 more;
##  No attributes deemed unimportant.
##  1 tentative attributes left: BloodPressure;
plot(boruta, cex.axis = 0.7)

Para el análisis posterior, se seleccionaron las siguientes variables: Glucose, BMI, Pregnancies, DiabetesPedigreeFunction, Age.

  • Glucose: Es el principal indicador clínico para el diagnóstico de diabetes. Mostró la mayor capacidad discriminativa.

  • BMI (Índice de Masa Corporal): Está fuertemente asociado con obesidad, un factor de riesgo clave en diabetes tipo 2.

  • DiabetesPedigreeFunction: Representa predisposición genética, lo cual incrementa la probabilidad de desarrollar la enfermedad.

  • Age: Aunque marginalmente significativa en Wilks, fue confirmada por Boruta. El riesgo de diabetes aumenta con la edad.

diabetes_sel <- diabetes[, c("Glucose", "BMI", "Age", "DiabetesPedigreeFunction", "Outcome")]

Estas fueron elegidas por cumplir con criterios estadísticos (greedy Wilks y Boruta) y relevancia clínica

4. Supuestos básicos

4.1 Prueba de homogeneidad de matrices de varianzas-covarianzas

G1 <- subset(diabetes_sel, Outcome == "No_Diabetes")
dim(G1)
## [1] 500   5
G2 <- subset(diabetes_sel, Outcome == "Diabetes")
dim(G2)
## [1] 268   5
var(G1[,-5]) # Grupo No Diabetes
##                              Glucose        BMI         Age
## Glucose                  683.3623246 26.4844529  69.5468938
## BMI                       26.4844529 59.1338701   3.2362745
## Age                       69.5468938  3.2362745 136.1341683
## DiabetesPedigreeFunction   0.7470368  0.1625226   0.1453953
##                          DiabetesPedigreeFunction
## Glucose                                0.74703675
## BMI                                    0.16252256
## Age                                    0.14539533
## DiabetesPedigreeFunction               0.08945202
var(G2[,-5]) # Grupo Diabetes
##                               Glucose         BMI         Age
## Glucose                  1020.1394572  11.6957488  34.5294594
## BMI                        11.6957488  52.7506932 -14.9773995
## Age                        34.5294594 -14.9773995 120.3025882
## DiabetesPedigreeFunction    0.3148521   0.3698551  -0.3598839
##                          DiabetesPedigreeFunction
## Glucose                                 0.3148521
## BMI                                     0.3698551
## Age                                    -0.3598839
## DiabetesPedigreeFunction                0.1386479
boxM(diabetes_sel[, -5], diabetes_sel[, 5])
## 
##  Box's M-test for Homogeneity of Covariance Matrices
## 
## data:  diabetes_sel[, -5]
## Chi-Sq (approx.) = 51.674, df = 10, p-value = 1.311e-07
  • Hipótesis nula (H₀): Las matrices de varianzas-covarianzas poblacionales son iguales en ambos grupos.

  • Hipótesis alternativa (H₁): Las matrices de varianzas-covarianzas no son iguales en los grupos.

Rechazamos la hipótesis nula de igualdad de matrices de varianzas-covarianzas entre los grupos.

Conclusión: Las relaciones entre las variables difieren significativamente entre personas con y sin diabetes.

Esto sugiere que las relaciones entre variables no son homogéneas, por lo tanto, técnicas como el Análisis Discriminante Lineal (LDA) podrían verse afectadas, ya que suponen homogeneidad de covarianzas.

4.2 Prueba de Normalidad multivariada

4.2.1 Para el grupo No Diabetes

royston_test_no <- mvn(data = G1[,-5], mvnTest = "royston", multivariatePlot = "qq")

royston_test_no
## $multivariateNormality
##      Test        H      p value MVN
## 1 Royston 287.9169 4.382438e-61  NO
## 
## $univariateNormality
##               Test                 Variable Statistic   p value Normality
## 1 Anderson-Darling         Glucose             3.0876  <0.001      NO    
## 2 Anderson-Darling           BMI               3.1343  <0.001      NO    
## 3 Anderson-Darling           Age              33.2199  <0.001      NO    
## 4 Anderson-Darling DiabetesPedigreeFunction   19.7391  <0.001      NO    
## 
## $Descriptives
##                            n       Mean    Std.Dev  Median    Min     Max
## Glucose                  500 109.980000 26.1411998 107.000  0.000 197.000
## BMI                      500  30.304200  7.6898550  30.050  0.000  57.300
## Age                      500  31.190000 11.6676548  27.000 21.000  81.000
## DiabetesPedigreeFunction 500   0.429734  0.2990853   0.336  0.078   2.329
##                              25th      75th       Skew Kurtosis
## Glucose                  93.00000 125.00000  0.1720738 1.850134
## BMI                      25.40000  35.30000 -0.6619120 2.991773
## Age                      23.00000  37.00000  1.5621923 1.912165
## DiabetesPedigreeFunction  0.22975   0.56175  1.9942203 6.011764
  • Hipótesis nula (H₀): Las variables siguen una distribución normal multivariada.

  • Hipótesis alternativa (H₁): Las variables no siguen una distribución normal multivariada.

Resultado Valor
Estadístico Royston 287.92
Valor p < 0.001

Conclusión: Se rechaza H₀ → No hay normalidad multivariada

Además, todas las variables individualmente (según Anderson-Darling) también rechazan la normalidad univariada.

4.2.2 Para el grupo Diabetes

royston_test_yes <- mvn(data = G2[,-5], mvnTest = "royston", multivariatePlot = "qq")

royston_test_yes
## $multivariateNormality
##      Test        H      p value MVN
## 1 Royston 155.3682 1.437786e-32  NO
## 
## $univariateNormality
##               Test                 Variable Statistic   p value Normality
## 1 Anderson-Darling         Glucose             1.2535  0.0029      NO    
## 2 Anderson-Darling           BMI               3.3238  <0.001      NO    
## 3 Anderson-Darling           Age               3.1190  <0.001      NO    
## 4 Anderson-Darling DiabetesPedigreeFunction    8.3062  <0.001      NO    
## 
## $Descriptives
##                            n      Mean    Std.Dev  Median    Min    Max
## Glucose                  268 141.25746 31.9396221 140.000  0.000 199.00
## BMI                      268  35.14254  7.2629672  34.250  0.000  67.10
## Age                      268  37.06716 10.9682537  36.000 21.000  70.00
## DiabetesPedigreeFunction 268   0.55050  0.3723545   0.449  0.088   2.42
##                              25th    75th          Skew   Kurtosis
## Glucose                  119.0000 167.000 -0.4900236113  1.3504302
## BMI                       30.8000  38.775  0.0005901686  4.5960971
## Age                       28.0000  44.000  0.5751511067 -0.3834211
## DiabetesPedigreeFunction   0.2625   0.728  1.7031407840  4.3966539
  • Hipótesis nula (H₀): Las variables siguen una distribución normal multivariada.

  • Hipótesis alternativa (H₁): Las variables no siguen una distribución normal multivariada.

Resultado Valor
Estadístico Royston 155.37
Valor p < 0.001

Conclusión: Se rechaza H₀ → No hay normalidad multivariada

Al igual que el grupo anterior, todas las variables univariadas también violan la normalidad.

4.3 Outliers

4.3.1 Para el grupo No Diabetes

outliers_no <- mvn(data = G1[,-5], mvnTest = "hz", multivariateOutlierMethod = "quan")

4.3.2 Para el grupo Diabetes

outliers_yes <- mvn(data = G2[,-5], mvnTest = "hz", multivariateOutlierMethod = "quan")

4.4 Supuesto del poder discriminante de cada variable

Variable Glucose

mod.dca <- lm(diabetes_sel$Glucose ~ diabetes_sel$Outcome)
summary(aov(mod.dca))
##                       Df Sum Sq Mean Sq F value Pr(>F)    
## diabetes_sel$Outcome   1 170689  170689   213.2 <2e-16 ***
## Residuals            766 613375     801                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Hipótesis:

  • \(H_0\): La media de glucosa es igual entre los grupos (Diabetes y No Diabetes).
  • \(H_1\): Las medias de glucosa difieren entre al menos dos grupos.

Resultado del ANOVA:

Estadístico F = 213.2

Valor-p = < 2e-16

Conclusión:

Dado que el valor-p es menor que 0.05, se rechaza \(H_0\) . Por lo tanto, la glucosa presenta diferencias significativas entre los grupos de personas con y sin diabetes.

Variable BMI

mod.dca <- lm(diabetes_sel$BMI ~ diabetes_sel$Outcome)
summary(aov(mod.dca))
##                       Df Sum Sq Mean Sq F value Pr(>F)    
## diabetes_sel$Outcome   1   4084    4084   71.77 <2e-16 ***
## Residuals            766  43592      57                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Hipótesis:

  • \(H_0\): La media de BMI es igual entre los grupos (Diabetes y No Diabetes).
  • \(H_1\): Las medias de BMI difieren entre al menos dos grupos.

Resultado del ANOVA:

Estadístico F = 71.77

Valor-p = < 2e-16

Conclusión:

El valor-p es menor que 0.05, por lo que se rechaza \(H_0\) . Esto indica que el BMI difiere significativamente entre los grupos de estudio.

Variable Age

mod.dca <- lm(diabetes_sel$Age ~ diabetes_sel$Outcome)
summary(aov(mod.dca))
##                       Df Sum Sq Mean Sq F value   Pr(>F)    
## diabetes_sel$Outcome   1   6027    6027   46.14 2.21e-11 ***
## Residuals            766 100052     131                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Hipótesis:

  • \(H_0\): La media de Age es igual entre los grupos (Diabetes y No Diabetes).
  • \(H_1\): Las medias de Age difieren entre al menos dos grupos.

Resultado del ANOVA:

Estadístico F = 46.14

Valor-p = < 2.21e-11

Conclusión:

Se observa un valor-p menor a 0.05, por tanto, se rechaza \(H_0\). Esto sugiere que la edad es significativamente distinta entre personas con y sin diabetes.

Variable DiabetesPedigreeFunction

mod.dca <- lm(diabetes_sel$DiabetesPedigreeFunction ~ diabetes_sel$Outcome)
summary(aov(mod.dca))
##                       Df Sum Sq Mean Sq F value   Pr(>F)    
## diabetes_sel$Outcome   1   2.54  2.5447   23.87 1.25e-06 ***
## Residuals            766  81.66  0.1066                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Hipótesis:

  • \(H_0\): La media de índice genético es igual entre los grupos (Diabetes y No Diabetes).
  • \(H_1\): Las medias de índice genético difieren entre al menos dos grupos.

Resultado del ANOVA:

Estadístico F = 23.87

Valor-p = < 06-11

Conclusión:

Dado que el valor-p < 0.05, se rechaza \(H_0\) . Por tanto, el índice genético muestra diferencias significativas entre los grupos.

5. Estimación de la Función Discriminante Lineal

5.1 Prueba Global

# MANOVA para evaluar si hay diferencias significativas entre grupos

modelo.adj <- manova(data=diabetes_sel, cbind(Glucose,BMI,Age,DiabetesPedigreeFunction) ~ Outcome)
summary(modelo.adj,test="Wilks")
##            Df   Wilks approx F num Df den Df    Pr(>F)    
## Outcome     1 0.72114   73.762      4    763 < 2.2e-16 ***
## Residuals 766                                             
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Existen diferencias estadísticamente significativas en los perfiles metabólicos entre pacientes diabéticos y no diabéticos, lo que valida el uso de estas variables para un diagnóstico diferencial.

5.2 Pruebas Individuales

# División de datos en entrenamiento (70%) y prueba (30%)
set.seed(10) # Para reproducibilidad
suscrip_split <- initial_split(diabetes_sel, prop = 0.70, strata = Outcome)
suscrip_train <- training(suscrip_split)
suscrip_test <- testing(suscrip_split)

# Verificación de proporciones en los conjuntos
prop.table(table(diabetes_sel$Outcome))      # Proporciones originales
## 
##    Diabetes No_Diabetes 
##   0.3489583   0.6510417
prop.table(table(suscrip_train$Outcome))     # Proporciones en entrenamiento
## 
##    Diabetes No_Diabetes 
##   0.3482309   0.6517691
prop.table(table(suscrip_test$Outcome))      # Proporciones en prueba
## 
##    Diabetes No_Diabetes 
##   0.3506494   0.6493506

La estratificación mantuvo las proporciones originales (~35% Diabetes, ~65% No_Diabetes) en ambos conjuntos, lo que es importante para evitar sesgos

6. Modelo

6.1 Construcción del Modelo

table(suscrip_train$Outcome) # 187 Diabetes, 350 No_Diabetes de 537 observaciones
## 
##    Diabetes No_Diabetes 
##         187         350
modelo <- lda(Outcome ~ Glucose + BMI + Age + DiabetesPedigreeFunction,
              prior = c(187/537, 350/537), 
              data = suscrip_train)  
print(modelo)
## Call:
## lda(Outcome ~ Glucose + BMI + Age + DiabetesPedigreeFunction, 
##     data = suscrip_train, prior = c(187/537, 350/537))
## 
## Prior probabilities of groups:
##    Diabetes No_Diabetes 
##   0.3482309   0.6517691 
## 
## Group means:
##              Glucose      BMI      Age DiabetesPedigreeFunction
## Diabetes    140.5668 35.29786 37.64171                0.5592513
## No_Diabetes 110.5171 30.32914 31.32286                0.4277714
## 
## Coefficients of linear discriminants:
##                                  LD1
## Glucose                  -0.02370747
## BMI                      -0.05868070
## Age                      -0.02850240
## DiabetesPedigreeFunction -0.68228612

6.2 Importancia de las variables

6.2.1 Analisis Univariado con greedy wilks

wilk.ind <- function(modelo, data){
  vars <- all.vars(modelo)
  dif <- list()
  for(i in 2:length(vars)){
    dif[[i-1]] <- greedy.wilks(as.formula(paste0(vars[1], "~", vars[i])),
                               data=data,niveau = 1)$results
  }
  wilk <- bind_rows(dif, .id = "column_label")[,1:4]
  wilk
}

wilk.ind(Outcome ~ Glucose+BMI+Age+DiabetesPedigreeFunction, data= suscrip_train)
##   column_label                     vars Wilks.lambda F.statistics.overall
## 1            1                  Glucose    0.8025743            131.60495
## 2            2                      BMI    0.9088321             53.66760
## 3            3                      Age    0.9360838             36.53001
## 4            4 DiabetesPedigreeFunction    0.9638005             20.09412

Glucose es la variable que individualmente mejor discrimina entre grupos,seguida de Age, BMI y DiabetesPedigreeFunction.

6.2.2 Analisis Multivariado con greedy wilks

greedy.wilks(Outcome ~ Glucose+BMI+Age+DiabetesPedigreeFunction, data= suscrip_train, niveau = 0.1)
## Formula containing included variables: 
## 
## Outcome ~ Glucose + BMI + Age + DiabetesPedigreeFunction
## <environment: 0x000001b78ac56900>
## 
## 
## Values calculated in each step of the selection procedure: 
## 
##                       vars Wilks.lambda F.statistics.overall p.value.overall
## 1                  Glucose    0.8025743            131.60495    2.169870e-27
## 2                      BMI    0.7612277             83.74919    2.314164e-32
## 3                      Age    0.7397040             62.51951    1.201935e-34
## 4 DiabetesPedigreeFunction    0.7301229             49.16112    3.352557e-35
##   F.statistics.diff p.value.diff
## 1        131.604953 2.169870e-27
## 2         29.004567 1.083147e-07
## 3         15.509104 9.299354e-05
## 4          6.981234 8.478954e-03

Todas las variables son significativas (p < 0.1) en el modelo conjunto

6.2.3 Analisis mediante Random Forest

rf = randomForest(Outcome ~ Glucose+BMI+Age+DiabetesPedigreeFunction, data= suscrip_train)
vip(rf)

Jerarquía de factores de riesgo:

  • Glucosa: Marcador metabólico directo

  • Edad: Factor de riesgo no modificable

  • BMI: Indicador de obesidad

  • Historial familiar: Factor genético

6.3 Evaluación de Modelo

## Evaluación de la función discriminante
modelo.adj1 <- manova(data=suscrip_train, cbind(Glucose,BMI,Age,DiabetesPedigreeFunction) ~ Outcome)
summary(modelo.adj1,test="Wilks")
##            Df   Wilks approx F num Df den Df    Pr(>F)    
## Outcome     1 0.73012   49.161      4    532 < 2.2e-16 ***
## Residuals 535                                             
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Autovalor y varianza explicada
summary((modelo.adj1),test="Wilks")$Eigenvalues#el primero
##              [,1]          [,2]         [,3]         [,4]
## Outcome 0.3696325 -5.551115e-17 6.850697e-18 6.850697e-18
lambda=0.3696325
eta2=lambda/(1+lambda)
eta2
## [1] 0.2698771
# El 26.99% de la variabilidad total es explicada por la función discriminante
# Esto indica una capacidad discriminante moderada-fuerte

#Correlacion canonica
eta = sqrt(eta2)
eta
## [1] 0.519497
# Como se aproxima a 1 entonces la FD tiene gran capacidad explicativa.

# Cálculo de coeficientes estandarizados

summary((modelo.adj1),test="Wilks")$SS
## $Outcome
##                              Glucose         BMI        Age
## Glucose                  110056.5022 18197.84216 23142.6913
## BMI                       18197.8422  3009.01312  3826.6439
## Age                       23142.6913  3826.64391  4866.4472
## DiabetesPedigreeFunction    481.5428    79.62311   101.2589
##                          DiabetesPedigreeFunction
## Glucose                                 481.54284
## BMI                                      79.62311
## Age                                     101.25887
## DiabetesPedigreeFunction                  2.10695
## 
## $Residuals
##                              Glucose        BMI          Age
## Glucose                  447401.3116 13636.8519 34860.541467
## BMI                       13636.8519 29996.1619 -3570.836458
## Age                       34860.5415 -3570.8365 71271.511795
## DiabetesPedigreeFunction    323.3097   154.1833     8.289668
##                          DiabetesPedigreeFunction
## Glucose                                323.309730
## BMI                                    154.183332
## Age                                      8.289668
## DiabetesPedigreeFunction                56.096909
std.b.Glucose=(sqrt(summary(modelo.adj1)$SS$Residuals[1,1]/535))*modelo$scaling[1,1]
std.b.BMI=(sqrt(summary(modelo.adj1)$SS$Residuals[2,2]/535))*modelo$scaling[2,1]
std.b.Age=(sqrt(summary(modelo.adj1)$SS$Residuals[3,3]/535))*modelo$scaling[3,1]
std.b.DiabetesPedigreeFunction=(sqrt(summary(modelo.adj1)$SS$Residuals[4,4]/535))*modelo$scaling[4,1]

# Matriz de covarianza residual y correlaciones
SCPC.residual <- summary((modelo.adj1), test = "Wilks")$SS$Residuals
SCPC.residual.varianzas <- SCPC.residual/535
SCPC.residual.correlaciones <- cov2cor(SCPC.residual.varianzas)

# Cálculo de la matriz de estructura (correlaciones entre variables y función discriminante)
l.Glucose=SCPC.residual.correlaciones[1,1]*std.b.Glucose+
  SCPC.residual.correlaciones[1,2]*std.b.BMI+
  SCPC.residual.correlaciones[1,3]*std.b.Age+
  SCPC.residual.correlaciones[1,4]*std.b.DiabetesPedigreeFunction

l.BMI=SCPC.residual.correlaciones[2,1]*std.b.Glucose+
  SCPC.residual.correlaciones[2,2]*std.b.BMI+
  SCPC.residual.correlaciones[2,3]*std.b.Age+
  SCPC.residual.correlaciones[2,4]*std.b.DiabetesPedigreeFunction

l.Age=SCPC.residual.correlaciones[1,3]*std.b.Glucose+
  SCPC.residual.correlaciones[2,3]*std.b.BMI+
  SCPC.residual.correlaciones[3,3]*std.b.Age+
  SCPC.residual.correlaciones[4,3]*std.b.DiabetesPedigreeFunction

l.DiabetesPedigreeFunction=SCPC.residual.correlaciones[1,3]*std.b.Glucose+
  SCPC.residual.correlaciones[2,3]*std.b.BMI+
  SCPC.residual.correlaciones[3,3]*std.b.Age+
  SCPC.residual.correlaciones[4,3]*std.b.DiabetesPedigreeFunction

rbind(l.Glucose,l.BMI,l.Age,l.DiabetesPedigreeFunction)
##                                  [,1]
## l.Glucose                  -0.8157820
## l.BMI                      -0.5209477
## l.Age                      -0.4297966
## l.DiabetesPedigreeFunction -0.4297966

7. Predicción de nuevos casos

# Lectura de datos sintéticos para predicción
datosn <- read_excel("synthetic_diabetes_data.xlsx")

# Predicción con el modelo LDA
clase <- predict(modelo, datosn)$class
proba <- predict(modelo, datosn)$posterior

# Combinación de resultados
datonsnp <- cbind(datosn, clase, proba)
datonsnp
##    Glucose  BMI Age DiabetesPedigreeFunction       clase  Diabetes No_Diabetes
## 1      172 35.0  73                    1.462    Diabetes 0.9600617  0.03993826
## 2      162 32.1  22                    0.175 No_Diabetes 0.4233135  0.57668645
## 3       84 27.7  40                    2.121 No_Diabetes 0.3432640  0.65673602
## 4      176 37.8  48                    1.179    Diabetes 0.9134218  0.08657817
## 5      141 22.9  67                    1.048    Diabetes 0.6816701  0.31832992
## 6       90 27.7  27                    2.324 No_Diabetes 0.3179638  0.68203620
## 7      172 30.0  64                    1.845    Diabetes 0.9433229  0.05667713
## 8      191 32.9  28                    0.884    Diabetes 0.8115893  0.18841075
## 9      144 43.2  67                    1.469    Diabetes 0.9390769  0.06092312
## 10     157 24.8  55                    1.350    Diabetes 0.7709068  0.22909325
## 11     186 34.7  34                    2.407    Diabetes 0.9519088  0.04809122
## 12     169 37.2  37                    2.127    Diabetes 0.9258376  0.07416237
## 13     173 20.0  56                    1.894    Diabetes 0.8637641  0.13623586
## 14     122 37.6  70                    1.395    Diabetes 0.8451363  0.15486367
## 15      71 23.9  60                    1.508 No_Diabetes 0.2437875  0.75621245
## 16     157 20.5  24                    2.417    Diabetes 0.6668253  0.33317473
## 17     107 48.4  22                    1.557    Diabetes 0.6104859  0.38951406
## 18     199 48.9  26                    0.762    Diabetes 0.9381533  0.06184665
## 19      90 44.0  74                    0.811    Diabetes 0.6998680  0.30013204
## 20     127 28.1  62                    0.497    Diabetes 0.5167367  0.48326334
  • Casos con Probabilidad_Diabetes > 70%: Alto riesgo, requieren confirmación con HbA1c
  • Casos con probabilidades 50-70%: Riesgo intermedio, indicado seguimiento estrecho
  • Casos <30%: Bajo riesgo, mantenerse en screening rutinario

8. Clase y Probabilidad predicha de los datos reales

8.1 Predicción para una observación

head(suscrip_train,11)
##    Glucose  BMI Age DiabetesPedigreeFunction  Outcome
## 1       78 31.0  26                    0.248 Diabetes
## 2      197 30.5  53                    0.158 Diabetes
## 3      125  0.0  54                    0.232 Diabetes
## 4      189 30.1  59                    0.398 Diabetes
## 5      100 30.0  32                    0.484 Diabetes
## 6      118 45.8  31                    0.551 Diabetes
## 7      107 29.6  31                    0.254 Diabetes
## 8      115 34.6  32                    0.529 Diabetes
## 9      196 39.8  41                    0.451 Diabetes
## 10     119 29.0  29                    0.263 Diabetes
## 11     125 31.1  41                    0.205 Diabetes
clase.pred <-predict(modelo,diabetes_sel[10,-5])
clase.pred
## $class
## [1] No_Diabetes
## Levels: Diabetes No_Diabetes
## 
## $posterior
##    Diabetes No_Diabetes
## 10 0.068208    0.931792
## 
## $x
##         LD1
## 10 1.367172

Se aplicó el modelo de análisis discriminante lineal (LDA) previamente entrenado para predecir la presencia o ausencia de diabetes. En este caso, se utilizó la función predict() sobre la observación número 10, obteniéndose los siguientes resultados:

  • Clase predicha: No_Diabetes
  • Probabilidades posteriores:
-    *Diabetes*: 6.82%

-    *No_Diabetes*: 93.18%
  • Valor proyectado en la dimensión discriminante (LD1): 1.367

El modelo asignó la clase No_Diabetes a esta observación, basándose en la mayor probabilidad posterior.
La alta probabilidad asociada a la clase No_Diabetes (93.18%) indica que la observación presenta características más similares a las de los individuos no diabéticos en el espacio definido por el modelo discriminante.

8.2 Predicción para los datos de entrenamiento

# Valores estimados con la ecuacion discriminante
fd.pred <- predict(modelo,suscrip_train[,-5])$x

# Clase predicha
clase.pred <-predict(modelo,suscrip_train[,-5])$class

# Probabilidad predicha
proba.pred  <-round(predict(modelo,suscrip_train[,-5])$posterior,5)

# Almacenamiento de datos con clase y probabilidad predicha
datosf=cbind(suscrip_train,fd.pred,clase.pred,proba.pred)
head(datosf,30)
##    Glucose  BMI Age DiabetesPedigreeFunction  Outcome          LD1  clase.pred
## 1       78 31.0  26                    0.248 Diabetes  1.449471961 No_Diabetes
## 2      197 30.5  53                    0.158 Diabetes -2.050535462    Diabetes
## 3      125  0.0  54                    0.232 Diabetes  1.367171892 No_Diabetes
## 4      189 30.1  59                    0.398 Diabetes -2.172166502    Diabetes
## 5      100 30.0  32                    0.484 Diabetes  0.654554431 No_Diabetes
## 6      118 45.8  31                    0.551 Diabetes -0.716545754    Diabetes
## 7      107 29.6  31                    0.254 Diabetes  0.697502637 No_Diabetes
## 8      115 34.6  32                    0.529 Diabetes -0.001691668 No_Diabetes
## 9      196 39.8  41                    0.451 Diabetes -2.430439500    Diabetes
## 10     119 29.0  29                    0.263 Diabetes  0.499085657 No_Diabetes
## 11     125 31.1  41                    0.205 Diabetes -0.068844810 No_Diabetes
## 12     147 39.4  43                    0.257 Diabetes -1.169942561    Diabetes
## 13     102 32.9  46                    0.665 Diabetes -0.085561900 No_Diabetes
## 14      90 38.2  27                    0.503 Diabetes  0.539995975 No_Diabetes
## 15     111 37.1  56                    1.390 Diabetes -1.325069467    Diabetes
## 16     180 42.0  25                    1.893 Diabetes -2.708035734    Diabetes
## 17     103 39.1  31                    0.344 Diabetes  0.173460156 No_Diabetes
## 18     176 33.7  58                    0.467 Diabetes -2.093795258    Diabetes
## 19     187 37.7  41                    0.254 Diabetes -1.959432459    Diabetes
## 20     133 32.9  39                    0.270 Diabetes -0.351473607 No_Diabetes
## 21     114 32.8  42                    0.258 Diabetes  0.027516597 No_Diabetes
## 22     109 32.5  38                    0.855 Diabetes -0.129657070 No_Diabetes
## 23     100 32.9  28                    0.867 Diabetes  0.337074427 No_Diabetes
## 24     126 43.4  42                    0.583 Diabetes -1.100731382    Diabetes
## 25     131 43.2  26                    0.270 Diabetes -0.537938639 No_Diabetes
## 26     136 37.1  43                    0.153 Diabetes -0.703237053    Diabetes
## 27     163 39.0  33                    1.222 Diabetes -1.899171892    Diabetes
## 28      95 37.4  24                    0.247 Diabetes  0.728575634 No_Diabetes
## 29     171 33.3  24                    0.199 Diabetes -0.799851381    Diabetes
## 30     160 30.5  39                    0.588 Diabetes -1.067708573    Diabetes
##    Diabetes No_Diabetes
## 1   0.06184     0.93816
## 2   0.85054     0.14946
## 3   0.06821     0.93179
## 4   0.86919     0.13081
## 5   0.15358     0.84642
## 6   0.50991     0.49009
## 7   0.14660     0.85340
## 8   0.29506     0.70494
## 9   0.90228     0.09772
## 10  0.18112     0.81888
## 11  0.31316     0.68684
## 12  0.64958     0.35042
## 13  0.31776     0.68224
## 14  0.17352     0.82648
## 15  0.69313     0.30687
## 16  0.92933     0.07067
## 17  0.25086     0.74914
## 18  0.85741     0.14259
## 19  0.83518     0.16482
## 20  0.39523     0.60477
## 21  0.28738     0.71262
## 22  0.33006     0.66994
## 23  0.21376     0.78624
## 24  0.62925     0.37075
## 25  0.45317     0.54683
## 26  0.50567     0.49433
## 27  0.82434     0.17566
## 28  0.14172     0.85828
## 29  0.53638     0.46362
## 30  0.61939     0.38061
  • Se aplicó el modelo a todo el conjunto de entrenamiento para analizar su comportamiento general:

    • Se calcularon los valores de la función discriminante (LD1) para cada observación.

    • Se obtuvieron las clases predichas y las probabilidades asociadas a cada clase.

    • Se construyó una tabla (datosf) que contiene:

      • Las variables originales.

      • El valor de LD1.

      • La clase predicha por el modelo.

      • Las probabilidades de pertenencia a cada clase (Diabetes y No_Diabetes).

  • Con lo realizado podemos comprender cómo el modelo clasifica los datos con los que fue entrenado, analizar la confianza en sus predicciones y explorar el comportamiento del discriminante lineal.

8.3 Gráfico de la densidad e histograma

library(ggplot2)
a=ggplot(datosf) +
  aes(x = proba.pred[,1], fill = Outcome) +
  geom_histogram(bins = 30L) +
  scale_fill_brewer(palette = "Spectral") +
  theme_minimal()

b=ggplot(datosf, aes(x = proba.pred[,1], fill = Outcome)) + 
  geom_density(alpha = 0.6)+
  scale_fill_brewer(palette = "Spectral") +
  theme_minimal()

a + b

De los gráficos obtenidos podemos observar:

  • La mayoría de los casos No_Diabetes tienen probabilidades bajas (cerca de 0.0).
  • Los casos Diabetes tienen una distribución más dispersa, concentrada a partir de 0.4 en adelante.
  • El modelo LDA diferencia razonablemente bien entre las clases, especialmente en los extremos de probabilidad (muy baja o muy alta).
  • Sin embargo, en el rango medio (probabilidades entre 0.4 y 0.6), hay bastante ambigüedad. Esto puede llevar a errores de clasificación.

8.4 Gráfico de partición todas las variables

partimat(Outcome~.,data=suscrip_train,method="lda",nplots.vert=2,
         image.colors = c("darkgoldenrod1", "skyblue2"))

  • Cada subgráfico muestra un plano 2D de dos variables predictoras a la vez (por ejemplo: Glucosa vs IMC, Edad vs Pedigree, etc.), con la frontera de decisión trazada por el modelo LDA.

    • Zona azul → Región clasificada como No_Diabetes.

    • Zona amarilla → Región clasificada como Diabetes.

    • “D” representa observaciones de la clase Diabetes.

    • “N” representa observaciones de la clase No_Diabetes.

    • Color negro: La observación fue clasificada correctamente por el modelo LDA.

    • Color rojo: La observación fue clasificada incorrectamente.

    • Las fronteras entre ambas regiones son líneas rectas, como corresponde al LDA.

  • Los subgráficos con menor tasa de error aparente (app. error rate) muestran que esas variables son más informativas para separar clases.
    Por ejemplo:

    • Glucosa vs IMC (arriba a la izquierda): error 0.246 → Buena separación: la mayoría de los D están en la zona amarilla y los N en la azul.

    • Edad vs Pedigree (abajo a la derecha): error 0.333 → Peor separación: los puntos D y N están muy mezclados.

    • Esto sugiere que “Glucosa” e “IMC” aportan más poder discriminativo que “Edad” y “DiabetesPedigreeFunction”.

9. Matriz o tabla de confusión

Se denomina matriz de confusión porque permite observar no solo las predicciones correctas del modelo, sino también los casos en los que este se equivoca o se “confunde” al clasificar a los pacientes.

  • Predicciones correctas:

    • Verdaderos positivos (VP): pacientes que realmente tienen diabetes y el modelo los clasifica correctamente como Diabetes.

    • Verdaderos negativos (VN): pacientes que no tienen diabetes y el modelo los clasifica correctamente como No_Diabetes.

  • Errores o confusiones del modelo:

    • Error tipo I (falso positivo - FP): el modelo clasifica a un paciente como Diabetes, pero en realidad no tiene diabetes.

    • Error tipo II (falso negativo - FN): el modelo clasifica a un paciente como No_Diabetes, pero en realidad sí tiene diabetes.

# Trabajando con la data de prueba

d2 = suscrip_test %>% 
  mutate(pred_probs = predict(modelo, suscrip_test[,-5])$posterior[,1]) %>%
  mutate(pred_classes = ifelse(pred_probs > 0.5, 'Diabetes', 'No_Diabetes')) %>%
  mutate(Outcome = factor(Outcome, levels = c('Diabetes', 'No_Diabetes')),
         pred_classes = factor(pred_classes, levels = c('Diabetes', 'No_Diabetes')))

# Tabla o matriz de confusión

cm2 = xtabs(data = d2, ~ pred_classes + Outcome)
confusionMatrix(cm2, mode = 'everything', positive = 'Diabetes')
## Confusion Matrix and Statistics
## 
##              Outcome
## pred_classes  Diabetes No_Diabetes
##   Diabetes          41          13
##   No_Diabetes       40         137
##                                           
##                Accuracy : 0.7706          
##                  95% CI : (0.7109, 0.8232)
##     No Information Rate : 0.6494          
##     P-Value [Acc > NIR] : 4.558e-05       
##                                           
##                   Kappa : 0.4543          
##                                           
##  Mcnemar's Test P-Value : 0.0003551       
##                                           
##             Sensitivity : 0.5062          
##             Specificity : 0.9133          
##          Pos Pred Value : 0.7593          
##          Neg Pred Value : 0.7740          
##               Precision : 0.7593          
##                  Recall : 0.5062          
##                      F1 : 0.6074          
##              Prevalence : 0.3506          
##          Detection Rate : 0.1775          
##    Detection Prevalence : 0.2338          
##       Balanced Accuracy : 0.7098          
##                                           
##        'Positive' Class : Diabetes        
## 
Métrica Operación Descripción
Accuracy (TP + TN) / Total Proporción total de predicciones correctas. Para nuestro caso nos dio un valor de 0.7706, esto significa que el modelo logró clasificar correctamente el 77.06% de los casos del conjunto de prueba.
Tasa de error aparente (FP + FN) / Total La tasa de error (0.2294) indica que el modelo cometió errores en el 22.94% de las predicciones realizadas sobre el conjunto de prueba ya sea al diagnosticar diabetes en personas sanas (falsos positivos) o al no detectar diabetes en pacientes que sí la tienen (falsos negativos).
Sensibilidad TP / (TP + FN) Capacidad para detectar correctamente los casos positivos (Diabetes). Con un valor de 0.5062 indica que el modelo fue capaz de identificar correctamente el 50.62% de los pacientes que realmente tienen diabetes.
Especificidad TN / (TN + FP) La especificidad (0.9133) indica que el modelo identificó correctamente el 91.33% de los pacientes que no tienen diabetes.
Balance Accuracy (Sensibilidad + Especificidad) / 2 Es una medida más robusta que el Accuracy (Ambas clases (Diabetes y No_Diabetes) reciben igual consideración). Para nuestro caso el BA = 0.7097 es sólo un 6.09% inferior que el Accuracy. Esto sugiere que las clases están relativamente balanceadas.
Precision (Pos Pred Value) TP / (FP + TP) Probabilidad de que un paciente clasificado como negativo realmente lo sea. En nuestro caso: VPpos = 0.7592 quiere decir que el 75.92% de los pacientes diagnosticados por el modelo con diabetes realmente tienen diabetes.
Precision (Neg Pred Value) TN / (TN + FN) Falsos positivos: diagnosticar diabetes cuando no hay. Un VPneg = 0.7740 quiere decir que el 77.4% de pacientes clasificados por el modelo como no diagnosticados con diabetes realmente no tienen la enfermedad.
Prevalencia (TP + FN) / Total Proporción de casos positivos reales en la muestra. En este caso, la prevalencia es de 35.06%, lo que indica que aproximadamente 1 de cada 3 pacientes del conjunto de prueba presenta la condición.
Detection Rate TP / Total Proporción de positivos que el modelo identificó correctamente. En este caso, el modelo logró detectar correctamente la diabetes en el 17.75% de todos los pacientes evaluados.
Detection Prevalence (DP) o Apparent Prevalence (TP + FP) / Total Proporción de casos positivos predichos por el modelo. En este caso, el modelo predijo diabetes en el 23.38% de los pacientes del conjunto de prueba.
  • Prueba de Mc Nemar.

H₀: No hay diferencia significativa entre los errores de predicción en pacientes con y sin diagnóstico de diabetes.
H₁: Existe una diferencia significativa entre los errores de predicción en pacientes con y sin diagnóstico de diabetes.

tabla=table(Clase_Predicha=clase.pred1,Real=suscrip_test$Outcome)

mcnemar.test(tabla)
## 
##  McNemar's Chi-squared test with continuity correction
## 
## data:  tabla
## McNemar's chi-squared = 12.755, df = 1, p-value = 0.0003551

Dado que el p-value es mucho menor que 0.05, se rechaza la hipótesis nula. Esto indica que sí existe una diferencia significativa entre los errores de predicción en las dos clases, es decir, el modelo comete errores de forma desigual entre pacientes con y sin diabetes.

  • Coeficiente Kappa de Cohen

El coeficiente Kappa evalúa el grado de acuerdo entre las predicciones del modelo y los valores reales, ajustando por el acuerdo esperado por azar.

datosf1=cbind(suscrip_test,clase.pred1,proba.pred1)

datos_kappa=datosf1[,c(5,6)]
library(psych)
cohen.kappa(datos_kappa, w=NULL,n.obs=NULL,alpha=.05,levels=NULL)
## Call: cohen.kappa1(x = x, w = w, n.obs = n.obs, alpha = alpha, levels = levels, 
##     w.exp = w.exp)
## 
## Cohen Kappa and Weighted Kappa correlation coefficients and confidence boundaries 
##                  lower estimate upper
## unweighted kappa  0.33     0.45  0.58
## weighted kappa    0.33     0.45  0.58
## 
##  Number of subjects = 231

El coeficiente Kappa de Cohen fue de 0.45, indicando un acuerdo moderado entre las predicciones del modelo y el diagnóstico real de diabetes. Esto sugiere que el modelo logra un rendimiento aceptable en la clasificación de pacientes, aunque existe espacio para mejorar la concordancia.

  • Prueba de Kolmogorov Smirnov

H₀: Las distribuciones de los diagnosticos observados y predichos no difieren.
H₁: Las distribuciones de los diagnósticos observados y predichos sí difieren significativamente.

library(tidyverse)
datos_ks=datosf1[,c(5,6)]
datos_ks1=mutate(datos_ks,Outcome=as.numeric(Outcome),
                 clase.pred1=as.numeric(clase.pred1))

datos_ks2=mutate(datos_ks1,Outcome1=Outcome-1,
                 clase.pred2=clase.pred1-1)

ks.test(x=datos_ks1$Outcome, y=datos_ks1$clase.pred1)
## 
##  Asymptotic two-sample Kolmogorov-Smirnov test
## 
## data:  datos_ks1$Outcome and datos_ks1$clase.pred1
## D = 0.11688, p-value = 0.0852
## alternative hypothesis: two-sided
ks.test(x=datos_ks2$Outcome1, y=datos_ks2$clase.pred2)
## 
##  Asymptotic two-sample Kolmogorov-Smirnov test
## 
## data:  datos_ks2$Outcome1 and datos_ks2$clase.pred2
## D = 0.11688, p-value = 0.0852
## alternative hypothesis: two-sided

La prueba de Kolmogorov-Smirnov de dos muestras arrojó un p-valor de 0.0852, lo cual indica que no existen diferencias estadísticamente significativas entre la distribución de los resultados reales (Outcome) y los predichos (clase.pred1) por el modelo, al nivel común de significancia del 5% (α = 0.05). Esto sugiere que el modelo reproduce razonablemente bien la distribución de los diagnósticos de diabetes observados en la muestra. Sin embargo, dado que el p-valor se encuentra relativamente cerca del umbral (0.05), no se puede afirmar con total certeza que las distribuciones sean idénticas.

  • No Information Rate (NIR)

Es el Accuracy que se obtendría si siempre predijera la clase mayoritaria. Con esta data la clase mayoritaria es ‘No_Diabetes’ (17+133= 150). El NIR ayuda a verificar si el Accuracy del modelo (0.7706) es mejor que el del modelo base sin información (0.6494). Para verificar si la diferencia (0.7706-0.6494=0.1341) es significativa se halla el p-value [Acc > NIR] con una prueba binomial.


table(suscrip_test$Outcome)
## 
##    Diabetes No_Diabetes 
##          81         150
(NIR = 150/231)
## [1] 0.6493506

H₀: La precisión del modelo <= NIR
H₁: La precisión del modelo > NIR

binom.test(
  x = 178,     # Número de clasificaciones correctas
  n = 231,     # Número de ensayos
  p = 0.6494,  # Probabilidad del suceso esperado (en las hipótesis)
  alternative = 'greater')
## 
##  Exact binomial test
## 
## data:  178 and 231
## number of successes = 178, number of trials = 231, p-value = 4.587e-05
## alternative hypothesis: true probability of success is greater than 0.6494
## 95 percent confidence interval:
##  0.7204151 1.0000000
## sample estimates:
## probability of success 
##              0.7705628

La prueba binomial indica que el modelo de clasificación obtiene una proporción de aciertos significativamente mayor (77.06%) que la proporción que se obtendría simplemente eligiendo la clase mayoritaria (64.94%). Con un p-valor de 4.587e-05, se concluye que el modelo tiene un desempeño predictivo superior al azar.”

10. Curva ROC y Area bajo la curva

library(ROSE)
roc.curve(suscrip_test$Outcome, proba.pred1[,1],lty=2,lwd=1.8,col="blue" ,
          main="ROC curves")

## Area under the curve (AUC): 0.845

Este valor cae dentro del rango 0.80–0.90, lo que se considera un modelo bueno en términos de capacidad de discriminación.

Significa que, dado un par de individuos (uno con diabetes y otro sin), el modelo tiene aproximadamente un 84.5% de probabilidad de asignar una probabilidad más alta al que realmente tiene diabetes.

library(caTools)
colAUC(proba.pred1[,1],datosf1$Outcome,plotROC = TRUE)
##                               [,1]
## Diabetes vs. No_Diabetes 0.8446091
abline(0, 1,col="gold",lty=7)

  • La curva negra con puntos (type="b" por defecto en plotROC) se sitúa por encima de la diagonal dorada en prácticamente todo el gráfico. Esto indica que el modelo tiene una capacidad predictiva real y efectiva.

  • La curva sube rápidamente en el eje Y (sensibilidad), lo cual es deseable.

  • Un valor de 0.8446 es un buen resultado, cercano al 85% de discriminación.

  • El rendimiento sigue siendo consistente independientemente del paquete utilizado (ROSE vs caTools), lo cual valida elmodelo.

11. Conclusiones

  • El modelo LDA ha logrado una exactitud (accuracy) decente (aproximadamente 78%), lo cual es superior al No Information Rate (NIR) — la tasa que se obtendría si siempre se predijera la clase mayoritaria.

  • Sin embargo, la sensibilidad es baja (≈ 50.6%), lo que indica que el modelo tiene dificultades para identificar correctamente todos los casos con diabetes. En otras palabras, falsos negativos (personas con diabetes clasificadas como “No Diabetes”) siguen siendo un problema importante.

  • El modelo usa solo 4 variables: Glucosa, IMC, Edad y DiabetesPedigreeFunction.

  • Visualmente, Glucosa e IMC parecen ser los más discriminantes, ya que generan las regiones con menor error en los gráficos de partición.

  • El modelo LDA proporciona una base razonable para clasificar casos de diabetes, con buena precisión general pero baja sensibilidad, lo que sugiere que identifica bien a personas sin diabetes, pero necesita mejorar la detección de casos positivos. El análisis visual confirma que algunas variables ayudan más que otras, y que hay oportunidad de mejora con métodos más complejos o con ajuste de umbrales.