Grupo 1. Proyecto final Modelos Estadísticos Multivariados

Author

Gina Buvoli, Linda Herrera, Andres Vargas

Resumen

Este artículo presenta un estudio detallado del Análisis de Componentes Principales (PCA) y la Regresión Logística Multinomial (MLR), dos técnicas estadísticas fundamentales en el campo de la ciencia de datos. El objetivo es proporcionar un análisis práctico para cada tema. En el caso de PCA, se analizan datos de de señales obtenidas de un torno CNC durante un mes de trabajo que reporta medidas como presión y temperatura a lo largo de un día. Para la MLR, se realiza un análisis práctico utilizando un conjunto de datos que incluye información para la estimación de niveles de obesidad en individuos de México, Perú y Colombia, basado en sus hábitos alimenticios y condición física. Los datos contienen 17 atributos y 2.111 registros, etiquetados con la variable de clase NObesity (Nivel de Obesidad). Las conclusiones de este estudio buscan sustentar y explicar con datos la utilidad y aplicación de estas técnicas estadísticas.

Introducción

El análisis de componentes principales (PCA) y la regresión logística multinomial (MLR) son técnicas estadísticas ampliamente utilizadas en el análisis de datos multivariantes. PCA es una técnica de reducción de dimensionalidad que permite identificar patrones en los datos y expresar los datos de alta dimensión en un espacio de menor dimensión sin perder información significativa. Por otro lado, MLR es una extensión de la regresión logística utilizada para predecir el resultado de una variable categórica con más de dos categorías.

El uso de PCA es común en áreas donde los datos de alta dimensión son frecuentes, como en la manufactura y en la monitorización de máquinas. Por ejemplo, los datos recopilados de un torno CNC durante un mes de trabajouna máquina que mide presión, temperatura y otras variables a lo largo del tiempo pueden ser analizados con PCA para identificar las principales fuentes de variabilidad.

La MLR se aplica en situaciones donde se necesita clasificar observaciones en más de dos categorías. Un caso práctico es la clasificación del nivel de obesidad de diferentes personas a nivel mundial, con el fin de aplicar medidas que ayuden a prevenir enfermedades como diabetes, cancer, entre otras.

Objetivos

Análisis de Componentes Principales (PCA):

  • Identificar Patrones en el Funcionamiento del Torno CNC: Detectar cualquier comportamiento anómalo o patrones en los datos que puedan indicar problemas operativos.

  • Reducción de Dimensionalidad: Simplificar el conjunto de datos de señales, eliminando redundancias y resaltando las variables más importantes que explican la mayor parte de la variabilidad en los datos.

Regresión Logística Multinomial (MLR):

  • Realizar un análisis de clasificación de niveles de obesidad utilizando MLR.

  • Determinar las características más importantes que influyen en la clasificación de los niveles de obesidad.

  • Evaluar el rendimiento del modelo y su capacidad para predecir correctamente las categorías de obesidad.

Marco Teórico

1. Análisis de Componentes Principales

El Análisis de Componentes Principales (PCA) es una técnica de reducción de dimensionalidad utilizada en estadística y aprendizaje automático. Su objetivo principal es transformar un conjunto de variables posiblemente correlacionadas en un conjunto de valores de variables linealmente no correlacionadas llamadas componentes principales. Este proceso se realiza de manera que la primera componente principal tenga la mayor varianza posible (es decir, captura la mayor parte de la variabilidad en los datos), seguida de la segunda componente, y así sucesivamente.

Utilidad de PCA

  1. Reducción de Dimensionalidad: Simplifica conjuntos de datos grandes y complejos, reduciendo el número de variables a considerar sin perder demasiada información.

  2. Eliminación de Redundancia: Al transformar variables correlacionadas en componentes no correlacionadas, se elimina la redundancia en los datos.

  3. Visualización de Datos: Permite la visualización de datos de alta dimensionalidad en 2D o 3D, facilitando la comprensión de estructuras subyacentes y patrones en los datos.

  4. Preprocesamiento de Datos: Es común en el preprocesamiento de datos antes de aplicar algoritmos de aprendizaje automático para mejorar el rendimiento y reducir el tiempo de cómputo.

Aplicaciones de PCA

  1. Reconocimiento de Patrones y Visión por Computadora: Para la reducción de dimensionalidad en imágenes y videos.

  2. Análisis Genómico: En biología y medicina para reducir la dimensionalidad de datos genéticos.

  3. Finanzas: Para la simplificación de portafolios de activos y análisis de riesgos.

  4. Compresión de Datos: Para reducir el tamaño de los datos manteniendo la mayor cantidad de información posible.

  5. Control de Calidad y Mantenimiento Predictivo: En industrias manufactureras para el monitoreo y análisis de señales de máquinas.

Definición de las componentes Principales

Note

La fundamentación teórica de este tema se puede encontrar en los apuntes de Humberto LLinás Solano: ANÁLISIS DE COMPONENTES PRINCIPALES - Teoría

La j𝑗-ésima componente principal es:

\[ Y_j=α_{j1}X_1+α_{j2}X_2+⋯+α_{jK}X_K=α^T_jX \] la cual tiene la varianza más grande entre todas las siguientes. Aquí, \(α_j=(α_{j1},α_{j12},…,α_{j1K})^T\) y es un vector con módulo 1 (o sea, ortonomal). Es decir, debe cumplir la condición:

\[ α^T_jα_j=\sum _{k=1}^Kα^2_{jk}=1 \]

2. Regresión Logística Multinomial

Note

En el texto a continuación se encontrarán fragmentos tomados directamente del trabajo de grado de Mariano Brage Escalona para optar su título en Matemáticas de la Universiad de Lagunas, titulado: Análisis de datos categóricos: regresión logística y multinomial (julio, 2020)

La regresión logística multinomial es una extensión de la regresión logística que se utiliza cuando la variable dependiente tiene tres o más categorías.

En la regresión logística multinomial, se modelan las probabilidades de pertenecer a cada categoría en comparación con una categoría de referencia.

Diferencias entre la Regresión Logística Binomial y la Regresión Logística Multinomial

Las principales diferencias con la regresión logística binomial son:

  1. Variable Dependiente: En la regresión logística multinomial, la variable dependiente tiene más de dos categorías, mientras que en la regresión logística binomial, solo tiene dos categorías.

  2. Interpretación de Coeficientes: En la regresión logística multinomial, se comparan las categorías con una categoría de referencia, lo que implica interpretaciones diferentes de los coeficientes en comparación con la regresión logística binomial.

Formulación del modelo

Sea \(Y\) una variable respuesta categórica con \(J\) categorías y sean \(\pi_1\), \(\pi_2\), \(\ldots\), \(\pi_J\) las probabilidades asociadas, tal que:

\[\sum_{j=1}^{J} \pi_j = 1 \\\]

Este modelo se construye tomando como respuesta base una de las categorías, por ejemplo, la última, \(J\), y se define un modelo logit con respecto a ella:

\[log(\frac{\pi_j}{\pi_J})= \alpha_j + \sum_{k=1}^{K} \beta_{jk}X_{jk}, \quad j=1, \ldots, J - 1\ \]

El modelo tiene \(J - 1\) ecuaciones con sus propios parámetros.

Cada uno de estos parámetros expresa el efecto con respecto a la categoría de referencia. Cuando \(J = 2\), se simplifica a una única ecuación, obteniendo el modelo logístico binomial que ya conocemos.

Utilizando la ecuación anterior y fijando dos categorías cualesquiera, \(a\) y \(b\), se tiene que:

\[ \begin{aligned} \log\frac{\pi_a}{\pi_b} &= \log \left(\frac{\frac{\pi_a}{\pi_J}}{\frac{\pi_b}{\pi_J}}\right) \\ &= \log \frac{\pi_a}{\pi_J} - \log \frac{\pi_b}{\pi_J} \\ &= \alpha_a + \beta_{1a}X_1 + \cdots + \beta_{ka}X_K - \alpha_b - \beta_{1b}X_1 - \cdots - \beta_{kb}X_K \\ &= (\alpha_a - \alpha_b) + (\beta_{1a} - \beta_{1b})X_1 + \cdots + (\beta_{ka} - \beta_{kb})X_K \end{aligned} \]

Así se obtiene la ecuación logit de la categoría \(a\) con respecto a una categoría \(b\) cualquiera, \(\alpha =\alpha_a - \alpha_b\), \(\beta_1 = \beta_{1a} - \beta_{1b}\), \(\ldots\) y \(\beta_k = \beta_{ka} - \beta_{kb}\).

Los parámetros del modelo se estiman utilizando el método de máxima verosimilitud como en el caso de regresión logística. Después de calcular estos parámetros, se pueden calcular las probabilidades predichas de cada categoría despejando \(\pi_j\) de la ecuación anterior.

\[\hat{\pi}_j = \frac{e^{\alpha_{ji} + \sum_{i=1}^{n} \beta_j X_i}}{1 + \sum_{h=1}^{J-1} e^{\alpha_h + \sum_{i=1}^{n} \beta_h X_i}}, \quad j = 1, \ldots, J\]

Probabilidades de pertenecer a cada clase

La probabilidad de pertenecer a un sector específico según el modelo de Regresión Logística Multinomial se determina a través de la fórmula que proporciona las probabilidades de pertenencia a las clases.

Se calcula el valor de la variable dependiente para cada clase y se utiliza el modelo logit para obtener las probabilidades predichas de pertenencia a cada categoría. Finalmente, se despejan las probabilidades de pertenencia a las clases basadas en los coeficientes del modelo.

Probabilidad de pertenencia a una clase específica

\[ \pi_{in} = \frac{e^{Z_{in}}}{1 + e^{Z_{i2}} + \cdots + e^{Z_{ik-1}}} \]

Valor de la variable dependiente para cada clase

\[ Z_{in} = Z_{n0} + \beta_{i1}X_{i1} + \beta_{i2}X_{i2} + \cdots + \beta_{ij}X_{ij} \]

Donde:

\(\pi_{in}\) es la probabilidad de pertenencia del caso \(i\) a la clase \(n\)

\(Z_{in}\) es el valor de la variable dependiente \(Z\) correspondiente a la clase \(n\) en el caso \(i\).

\(\beta_{nj}\) es el coeficiente de la variable independiente \(j\) para la clase \(n\).

\(X_{ij}\) es el valor de la variable independiente \(j\) para el caso \(i\).

Regresión Multinomial Ordinal

Un caso particular que se utiliza cuando las categorías de la variable respuesta tienen orden y cumplen la prueba de líneas paralelas, es decir, que el comportamiento de las variables independientes en cada categoría de la variable \(Y\) es igual.

Esta regresión proporciona modelos más sencillos de interpretar que el modelo multinomial. Esto se debe a que la solución de los coeficientes \(\beta_i\) es la misma para todas las ecuaciones y la única diferencia es el coeficiente \(\alpha\).

El modelo de regresión ordinal, a diferencia del multinomial, acumula las probabilidades de las categorías anteriores y no utiliza la última categoría como referencia, pues la probabilidad acumulada es igual a 1. De esta forma, el modelo de regresión ordinal puede ser escrito como:

\[logit(P(Y \le j)) = \ln \left(\frac{P(Y \le j)}{1 - P(Y \le j)}\right) = \ln \left(\frac{\pi_1 + \cdots + \pi_j}{\pi_{j+1} + \cdots + \pi_J}\right)\]

Medidas de bondad de ajuste

Contraste sobre los parámetros

Dada una muestra de tamaño \(n\) de las variables \(Y_{ji}\) y \(X_k\) con \(i = 1\), \(\ldots\), \(n\) tamaño de la muestra, \(j = 1\), \(\ldots\), \(J\) número de categorías de \(Y\) y \(k = 1\), \(\ldots\), \(K\) número de variables regresoras \(X\), se puede definir en función de estas los valores de \(Z\) y \(\pi\). La función de verosimilitud del modelo \(V\) queda definida como:

\[ V = \prod_{i=1}^{n} p_{1i}^{Y_{1i}} \cdots p_{Ji}^{1-\sum_{j=1}^{J-1} Y_{ji}}\]

De igual modo que en regresión logística, se busca maximizar la verosimilitud, o de forma equivalente, minimizar la distancia \(L\):

\[ L = -2 \ln(V)\]

Para evaluar la significación de cada una de las variables, principalmente se utilizan el estadístico de Wald y el estadístico condicional de razón de verosimilitud.

Es decir, se realiza el siguiente contraste de hipótesis:

\[ \left\{ \begin{aligned} H_0 : \beta_{jk} &= 0 \\ H_a : \beta_{jk} &\neq 0 \end{aligned} \right. \]

Utilizando el estadístico de Wald que sigue una distribución \(\chi^2_1\), se puede contrastar si cada uno de los estimadores de los parámetros son significativamente distintos de 0. Una variable se considera significativa si \(Z_{Wald}> \chi^2_{1;\alpha}\), es decir, se rechaza la hipótesis nula.

Significación de cada variable regresora

Este contraste de hipótesis estudia qué ocurre en el modelo si se elimina una variable regresora del modelo, es decir, se evalúa si los coeficientes que acompañan a dicha variable son nulos. Para ello, se calcula la distancia del modelo eliminando la variable regresora \(X_i\), \(L_{-i}\). Realizando la diferencia entre las distancias del modelo sin la correspondiente variable \(X_i\) y el modelo final, $L_f$, obteniendo un estadístico que se distribuye como una \(\chi^2_{(k-1)(J-1)}\), siendo \(k\) el número de variables regresoras. Se rechaza la hipótesis nula si \(p(\chi^2_2 > L_{-i} - L_f)\).

Contraste de bondad de ajuste del modelo

Se puede probar que ninguna variable del modelo es significativa utilizando la razón de verosimilitudes que se utilizó en el capítulo anterior, que consiste en la diferencia entre las distancias inicial y final. Este estadístico sigue una distribución \(\chi^2_{k(J-1)}\), siendo \(k\) el número de variables regresoras del modelo. El p-valor de este test vendrá dado por\(p(\chi^2_{k(J-1)} > L_0 - L_f)\), siendo \(k\) el número de variables regresoras. Con esta prueba se estudia si todos los coeficientes \(\beta\) son nulos.

Medidas tipo \(R^2\)

La calidad de ajuste del modelo multinomial se puede medir utilizando los coeficientes de determinación pseudo \(R^2\).

Se utilizan los pseudo \(R^2_{MF}\), \(R^2_{CS}\) y \(R^2_N\). Para comparar modelos multinomiales con diferente número de variables regresoras se introducen coeficientes pseudo \(R^2\) ajustados. El más conocido es el de Mc-Fadden (Pando y San Martín (2004) [8]), definido como:

\(Adj - R^2_{MF} = 1 - \frac{0.5L_f + k + 1}{0.5L_0 + 1}, \quad\) siendo \(k\), el número de variables regresoras.

Tasa de clasificaciones correctas

Otra forma de cuantificar la bondad de ajuste del modelo consiste en comparar los resultados obtenidos por este frente a los observados, obteniendo así una matriz de clasificación. De forma que el número de individuos de cada categoría bien clasificados se contabiliza en la diagonal de esta matriz. Calculando la traza de la matriz, dividiendo por el número total y multiplicando por 100, se obtiene el porcentaje de aciertos o también llamado tasa de clasificaciones correctas.

Limitaciones de la regresión multinomial

  • Interpretación de coeficientes: La interpretación de los coeficientes en la regresión multinomial puede ser más compleja que en otros modelos, ya que se comparan múltiples categorías con una categoría de referencia, lo que puede dificultar la comprensión de la influencia de las variables independientes en cada categoría.

  • Requisitos de linealidad: La regresión multinomial asume una relación lineal entre las variables independientes y la variable dependiente, lo que puede no ser realista en todos los casos y limitar la capacidad del modelo para capturar relaciones no lineales.

  • Sensibilidad a la categorización: La elección de la categoría de referencia puede afectar los resultados y la interpretación del modelo, lo que requiere cuidado al seleccionar la categoría base para evitar sesgos en las conclusiones.

A pesar de estas limitaciones, la regresión multinomial sigue siendo una herramienta valiosa para analizar variables categóricas con múltiples categorías y proporciona información útil para comprender las relaciones entre las variables independientes y la variable dependiente en un contexto multinomial.

Metodología

1. Análisis de Componentes Principales (PCA)

Recopilación de Datos: Se recolectarán datos de una máquina que registra varias medidas como presión, temperatura y otras variables a lo largo de un día.

Preprocesamiento de Datos: Se limpiarán y normalizarán los datos para asegurar que todas las variables estén en la misma escala y sean comparables.

Aplicación de PCA: Se calcularán los componentes principales utilizando la matriz de covarianza de los datos normalizados. También se interpretarán los componentes principales en términos de las variables originales.

Análisis de Resultados: Se analizarán los componentes principales para identificar las principales fuentes de variabilidad. Se crearán gráficos para visualizar los componentes principales y su relación con las variables originales.

Utilidad Posterior del Análisis

El análisis mediante PCA puede tener varias utilidades posteriores:

  1. Mantenimiento Predictivo: Utilizar los componentes principales para predecir fallos antes de que ocurran, permitiendo el mantenimiento proactivo de la máquina.

  2. Facilitar la Visualización y Monitoreo: Permitir a los ingenieros y técnicos visualizar el estado de la máquina en 2D o 3D, facilitando la identificación rápida de posibles problemas.

  3. Optimización del Rendimiento: Identificar parámetros operativos que afecten significativamente el rendimiento del torno CNC, permitiendo ajustes y mejoras en el proceso.

  4. Monitoreo Continuo: Implementar un sistema de monitoreo continuo basado en los componentes principales para alertar sobre cualquier desviación del comportamiento normal de la máquina.

  5. Análisis Histórico y Trazabilidad: Mantener un registro histórico de los datos procesados, facilitando la trazabilidad y análisis retrospectivo en caso de fallos.

2. Regresión Logística Multinomial (MLR)

Recopilación de Datos: Se obtendrán datos que contiene información para estimar los niveles de obesidad en individuos de México, Perú y Colombiael.

Preprocesamiento de Datos: Se limpiarán y codificarán las variables categóricas. Se dividirán los datos en conjuntos de entrenamiento y prueba.

Construcción del Modelo: Se ajustará un modelo de regresión logística multinomial utilizando el conjunto de entrenamiento. Se seleccionarán las características más relevantes utilizando métodos de selección de características.

Evaluación del Modelo: Se evaluará el rendimiento del modelo utilizando métricas como la precisión, el recall y la puntuación F1.

Análisis de Resultados: Se interpretarán los coeficientes del modelo para entender la influencia de cada característica en la clasificación. Se generarán gráficos y tablas para visualizar los resultados.

Casos Prácticos

1. Análisis de Componentes Principales (PCA)

Librerias

Loading required package: ggplot2
Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa

Attaching package: 'ade4'
The following object is masked from 'package:FactoMineR':

    reconst
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.2     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ lubridate 1.9.2     ✔ tibble    3.2.1
✔ purrr     1.0.1     ✔ tidyr     1.3.0
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Attaching package: 'EnvStats'


The following objects are masked from 'package:stats':

    predict, predict.lm


Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 

corrplot 0.92 loaded


Attaching package: 'textshape'


The following object is masked from 'package:lubridate':

    duration


The following object is masked from 'package:dplyr':

    combine


The following object is masked from 'package:purrr':

    flatten


The following object is masked from 'package:tibble':

    column_to_rownames



Attaching package: 'psych'


The following object is masked from 'package:outliers':

    outlier


The following objects are masked from 'package:ggplot2':

    %+%, alpha

Iniciaremos leyendo los datos de un archivo CSV.

# Leer los datos del archivo 
datos <- read.csv("https://drive.google.com/uc?id=1fn7RTwUVFeXwa-8TYnHGYbxCm-hIQjrh", header = TRUE)
knitr::kable (head(datos))
time driveLoad.EJE.X driveLoad.EJE.Z driveLoad.EJE.U driveLoad.EJE.W driveLoad.CABEZAL actFeedRate.VELO.Cabezal actFeedRate.VELO.Eje.X actFeedRate.VELO.Eje.Z actFeedRate.VELO.Eje.U actFeedRate.VELO.Eje.W cmdFeedRate.VELO.Cabezal actSpeed_Cabezal
01.10.2023 13:32:46.000000 0.885544 1.059860 1.043600 1.77577 26.15470 102478.000 -33.5687 -11.0669 30.1035 22.6673 100800 284.662000
01.10.2023 13:32:56.000000 0.885544 1.059860 1.043600 1.77577 26.15470 102478.000 -33.5687 -11.0669 30.1035 22.6673 100800 284.662000
01.10.2023 13:33:06.000000 1.413420 0.915699 1.217590 1.77460 23.19210 52120.400 34.9625 17.3966 0.0000 0.0000 100800 144.779000
01.10.2023 13:33:16.000000 1.413420 0.915699 1.217590 1.77460 23.19210 52120.400 34.9625 17.3966 0.0000 0.0000 100800 144.779000
01.10.2023 13:33:26.000000 0.767860 0.150078 0.800358 1.18003 4.36691 329.965 0.0000 0.0000 0.0000 0.0000 100800 0.916569
01.10.2023 13:33:36.000000 2.084710 1.386930 1.217560 1.17059 43.70920 94897.400 -31.7185 -33.3408 -29.9724 -13.3515 100800 263.604000

Breve descripción de los datos:

knitr::kable(describe(datos))
vars n mean sd median trimmed mad min max range skew kurtosis se
time* 1 518400 2.592005e+05 1.496493e+05 2.592005e+05 2.592005e+05 1.921450e+05 1.00000e+00 5.18400e+05 5.183990e+05 0.0000000 -1.2000069 207.8462974
driveLoad.EJE.X 2 518363 1.241059e+00 4.963294e-01 1.106420e+00 1.196917e+00 5.040247e-01 5.04364e-01 2.32992e+00 1.825556e+00 0.6036782 -0.8218979 0.0006894
driveLoad.EJE.Z 3 518363 9.215821e-01 5.169796e-01 9.687040e-01 9.179519e-01 6.100691e-01 1.29139e-01 1.98340e+00 1.854261e+00 -0.0519099 -1.2036028 0.0007181
driveLoad.EJE.U 4 518363 1.086253e+00 1.352032e-01 1.078930e+00 1.091687e+00 1.577486e-01 6.24487e-01 1.40520e+00 7.807130e-01 -0.2170217 -0.5394510 0.0001878
driveLoad.EJE.W 5 518363 1.551459e+00 2.863846e-01 1.620290e+00 1.544392e+00 3.943271e-01 9.12188e-01 3.63530e+00 2.723112e+00 0.0421726 -1.3672902 0.0003978
driveLoad.CABEZAL 6 518363 2.524803e+01 1.083301e+01 2.701370e+01 2.620514e+01 5.835217e+00 0.00000e+00 4.69896e+01 4.698960e+01 -0.8458550 0.5572283 0.0150464
actFeedRate.VELO.Cabezal 7 518363 6.920164e+04 3.945343e+04 9.425500e+04 7.367641e+04 1.222552e+04 -9.69458e+00 1.02542e+05 1.025517e+05 -0.6937238 -1.1618736 54.7983850
actFeedRate.VELO.Eje.X 8 518363 2.445828e-01 2.897126e+01 0.000000e+00 1.315471e-01 4.718864e+01 -4.47583e+01 3.93632e+01 8.412150e+01 0.0064481 -1.7087483 0.0402393
actFeedRate.VELO.Eje.Z 9 518363 6.144407e-01 1.778376e+01 0.000000e+00 1.189596e+00 2.310988e+01 -3.87537e+01 3.78874e+01 7.664110e+01 -0.2118239 -0.7669251 0.0247005
actFeedRate.VELO.Eje.U 10 518363 3.113340e-02 1.889538e+01 0.000000e+00 4.248180e-02 1.764057e+00 -3.02185e+01 3.96278e+01 6.984630e+01 -0.0492337 -0.5822513 0.0262445
actFeedRate.VELO.Eje.W 11 518363 1.824750e-02 1.585174e+01 0.000000e+00 -1.480633e+00 1.975312e+01 -2.72862e+01 2.60441e+02 2.877272e+02 0.7915455 0.2357255 0.0220171
cmdFeedRate.VELO.Cabezal 12 518363 1.008000e+05 0.000000e+00 1.008000e+05 1.008000e+05 0.000000e+00 1.00800e+05 1.00800e+05 0.000000e+00 NaN NaN 0.0000000
actSpeed_Cabezal 13 518363 1.922268e+02 1.095929e+02 2.618190e+02 2.046567e+02 3.396192e+01 -2.69294e-02 2.84840e+02 2.848669e+02 -0.6937237 -1.1618738 0.1522177

Podemos observar que existen variables con una escala muy superior al resto, por ejemplo, la variable ‘actFeedRate.VELO.Cabezal’, eso lo consideraremos posteriormente dado que será necesario escalar los datos para no dar más peso a estas variables.

# Ver el resumen completo del dataset para entender la distribución de los datos incluyendo NA 
knitr::kable(summary(datos))
time driveLoad.EJE.X driveLoad.EJE.Z driveLoad.EJE.U driveLoad.EJE.W driveLoad.CABEZAL actFeedRate.VELO.Cabezal actFeedRate.VELO.Eje.X actFeedRate.VELO.Eje.Z actFeedRate.VELO.Eje.U actFeedRate.VELO.Eje.W cmdFeedRate.VELO.Cabezal actSpeed_Cabezal
Length:518400 Min. :0.5044 Min. :0.1291 Min. :0.6245 Min. :0.9122 Min. : 0.00 Min. : -9.69 Min. :-44.7583 Min. :-38.7537 Min. :-30.21850 Min. :-27.28620 Min. :100800 Min. : -0.02693
Class :character 1st Qu.:0.7974 1st Qu.:0.5304 1st Qu.:0.9933 1st Qu.:1.2649 1st Qu.:23.19 1st Qu.: 32840.20 1st Qu.:-31.9336 1st Qu.:-10.6563 1st Qu.: -0.11203 1st Qu.:-13.35150 1st Qu.:100800 1st Qu.: 91.22290
Mode :character Median :1.1064 Median :0.9687 Median :1.0789 Median :1.6203 Median :27.01 Median : 94255.00 Median : 0.0000 Median : 0.0000 Median : 0.00000 Median : 0.00000 Median :100800 Median :261.81900
NA Mean :1.2411 Mean :0.9216 Mean :1.0862 Mean :1.5515 Mean :25.25 Mean : 69201.64 Mean : 0.2446 Mean : 0.6144 Mean : 0.03113 Mean : 0.01825 Mean :100800 Mean :192.22678
NA 3rd Qu.:1.5306 3rd Qu.:1.3464 3rd Qu.:1.2032 3rd Qu.:1.7735 3rd Qu.:30.96 3rd Qu.:102415.00 3rd Qu.: 31.7226 3rd Qu.: 16.6624 3rd Qu.: 1.40449 3rd Qu.: 11.07560 3rd Qu.:100800 3rd Qu.:284.48700
NA Max. :2.3299 Max. :1.9834 Max. :1.4052 Max. :3.6353 Max. :46.99 Max. :102542.00 Max. : 39.3632 Max. : 37.8874 Max. : 39.62780 Max. :260.44100 Max. :100800 Max. :284.84000
NA NA’s :37 NA’s :37 NA’s :37 NA’s :37 NA’s :37 NA’s :37 NA’s :37 NA’s :37 NA’s :37 NA’s :37 NA’s :37 NA’s :37

Dado que vemos que todas las columnas tienen 37 datos \(NA's\), procederemos a verificar cuales son estos datos y si es pertinente eliminar esas observaciones. La presencia de datos nulos puede causar varios problemas técnicos al realizar PCA, como la incapacidad para Calcular la Matriz de Covarianza; PCA se basa en la matriz de covarianza (o matriz de correlación) de las variables del conjunto de datos. La matriz de covarianza es esencial para determinar los autovalores y autovectores que definen las componentes principales. La presencia de datos nulos impide el cálculo correcto de esta matriz, ya que las operaciones matemáticas con valores nulos no son definidas.

# Contar NA en cada columna 
na_count <- sapply(datos, function(x) sum(is.na(x)))  

# Ver el conteo de NA 
print(na_count)  
                    time          driveLoad.EJE.X          driveLoad.EJE.Z 
                       0                       37                       37 
         driveLoad.EJE.U          driveLoad.EJE.W        driveLoad.CABEZAL 
                      37                       37                       37 
actFeedRate.VELO.Cabezal   actFeedRate.VELO.Eje.X   actFeedRate.VELO.Eje.Z 
                      37                       37                       37 
  actFeedRate.VELO.Eje.U   actFeedRate.VELO.Eje.W cmdFeedRate.VELO.Cabezal 
                      37                       37                       37 
        actSpeed_Cabezal 
                      37 
# Ver el total de NA en el dataset 
total_na <- sum(na_count) 
print(paste("Total de NA en el dataset:", total_na))  
[1] "Total de NA en el dataset: 444"
# Porcentaje de NA por columna 
na_percentage <- na_count / nrow(datos) * 100 
print(na_percentage)  
                    time          driveLoad.EJE.X          driveLoad.EJE.Z 
             0.000000000              0.007137346              0.007137346 
         driveLoad.EJE.U          driveLoad.EJE.W        driveLoad.CABEZAL 
             0.007137346              0.007137346              0.007137346 
actFeedRate.VELO.Cabezal   actFeedRate.VELO.Eje.X   actFeedRate.VELO.Eje.Z 
             0.007137346              0.007137346              0.007137346 
  actFeedRate.VELO.Eje.U   actFeedRate.VELO.Eje.W cmdFeedRate.VELO.Cabezal 
             0.007137346              0.007137346              0.007137346 
        actSpeed_Cabezal 
             0.007137346 
# Eliminar posibles valores NA 
datos <- na.omit(datos)  

# Asegurarse de que todas las columnas son numéricas 
datos[] <- lapply(datos, as.numeric)
Warning in lapply(datos, as.numeric): NAs introducidos por coerción

Antes de proceder con el Análisis de Componentes Principales (PCA), es crucial asegurarnos de que no existan columnas en nuestro conjunto de datos que tengan varianza cero. La razón detrás de esto es que PCA se basa en la varianza de las variables para identificar las componentes principales que capturan la mayor parte de la variabilidad en los datos.

Una columna con varianza cero contiene el mismo valor constante para todas las observaciones. Esto significa que no hay dispersión ni variabilidad en los datos de esa columna. Técnicamente, esta falta de variabilidad implica que:

  1. Incapacidad de Contribuir a la Varianza Total: Una variable con varianza cero no puede contribuir a la varianza total del conjunto de datos. Dado que PCA busca componentes que expliquen la varianza, una variable sin varianza no puede ser descompuesta en componentes principales significativos.

  2. Singularidad de la Matriz de Covarianza: Como se ha mencionado anteriormente la matriz de covarianza es una parte esencial del PCA. La presencia de columnas con varianza cero puede llevar a una matriz de covarianza singular (no invertible), lo que imposibilita el cálculo correcto de los autovalores y autovectores necesarios para el PCA.

# Identificar y eliminar columnas con varianza cero 
variances <- apply(datos, 2, var, na.rm = TRUE) 
constant_columns <- names(variances[variances == 0])  

# Ver qué columnas son constantes 
print(constant_columns)
[1] NA                         "cmdFeedRate.VELO.Cabezal"
# Eliminar estas columnas de los datos 
datos <- datos[, !names(datos) %in% constant_columns]
# Asegurarse de que todas las columnas son numéricas antes de calcular la varianza 
datos[] <- lapply(datos, function(x) as.numeric(as.character(x))) 

# Calcular la varianza para cada columna, excluyendo NA 
variances <- sapply(datos, function(x) var(x, na.rm = TRUE))  

# Identificar columnas con varianza cero o que son NA (pueden haber sido pasadas por alto si todos excepto uno son NA) 
zero_variance_cols <- names(variances[variances == 0 | is.na(variances)])  

# Imprimir las columnas de varianza cero para revisión 
print(zero_variance_cols)
[1] "time"
# Eliminar columnas de varianza cero 
datos <- datos[, !(names(datos) %in% zero_variance_cols)]

PCA

#Realizar PCA 
res.pca <- PCA(datos, scale.unit = TRUE, graph = FALSE)
res.pca
**Results for the Principal Component Analysis (PCA)**
The analysis was performed on 518363 individuals, described by 11 variables
*The results are available in the following objects:

   name               description                          
1  "$eig"             "eigenvalues"                        
2  "$var"             "results for the variables"          
3  "$var$coord"       "coord. for the variables"           
4  "$var$cor"         "correlations variables - dimensions"
5  "$var$cos2"        "cos2 for the variables"             
6  "$var$contrib"     "contributions of the variables"     
7  "$ind"             "results for the individuals"        
8  "$ind$coord"       "coord. for the individuals"         
9  "$ind$cos2"        "cos2 for the individuals"           
10 "$ind$contrib"     "contributions of the individuals"   
11 "$call"            "summary statistics"                 
12 "$call$centre"     "mean of the variables"              
13 "$call$ecart.type" "standard error of the variables"    
14 "$call$row.w"      "weights for the individuals"        
15 "$call$col.w"      "weights for the variables"          

Eigenvalores / Varianzas

Los eigenvalores cuantifican la cantidad de variación capturada por cada componente principal. Generalmente, los eigenvalores son más altos para los primeros componentes principales y disminuyen para los componentes siguientes. Esto significa que los primeros componentes principales representan las direcciones con mayor variabilidad en el conjunto de datos. Al analizar los eigenvalores, podemos determinar cuántos componentes principales deben ser considerados para nuestro análisis. A continuación, utilizaremos la función get_eigenvalue del paquete factoextra para obtener estos eigenvalores y la proporción de varianza retenida por los componentes principales (PC).

eig.val <- get_eigenvalue(res.pca) 
eig.val
         eigenvalue variance.percent cumulative.variance.percent
Dim.1  3.930895e+00     3.573541e+01                    35.73541
Dim.2  2.936661e+00     2.669692e+01                    62.43233
Dim.3  2.051088e+00     1.864625e+01                    81.07858
Dim.4  1.000849e+00     9.098630e+00                    90.17721
Dim.5  7.828642e-01     7.116947e+00                    97.29416
Dim.6  1.815664e-01     1.650604e+00                    98.94476
Dim.7  5.800338e-02     5.273035e-01                    99.47206
Dim.8  3.211876e-02     2.919887e-01                    99.76405
Dim.9  1.506227e-02     1.369297e-01                    99.90098
Dim.10 1.089203e-02     9.901849e-02                   100.00000
Dim.11 1.538237e-11     1.398397e-10                   100.00000

El análisis de componentes principales (PCA) ha proporcionado los eigenvalores y la proporción de varianza explicada por cada componente principal. A continuación, se detallan las primeras cuatro componentes principales que capturan la mayor parte de la variabilidad en los datos:

  1. Dim.1 (Componente Principal 1)

    • Eigenvalue: 3.930895

    • Varianza Explicada: 35.73541%

    • Varianza Acumulada: 35.73541%

    La primera componente principal captura aproximadamente el 35.74% de la variabilidad total en los datos. Esta componente representa la dirección con mayor variabilidad y es la más significativa en la explicación de los datos.

  2. Dim.2 (Componente Principal 2)

    • Eigenvalue: 2.936661

    • Varianza Explicada: 26.69692%

    • Varianza Acumulada: 62.43233%

    La segunda componente principal explica aproximadamente el 26.70% de la variabilidad total, llevando la varianza acumulada a 62.43%. Esta componente captura una parte importante de la variabilidad que no está capturada por la primera componente.

  3. Dim.3 (Componente Principal 3)

    • Eigenvalue: 2.051088

    • Varianza Explicada: 18.64625%

    • Varianza Acumulada: 81.07858%

    La tercera componente principal explica el 18.65% de la variabilidad total, aumentando la varianza acumulada a 81.08%. Esto significa que las tres primeras componentes principales juntas explican la mayoría de la variabilidad en los datos.

  4. Dim.4 (Componente Principal 4)

    • Eigenvalue: 1.000849

    • Varianza Explicada: 9.09863%

    • Varianza Acumulada: 90.17721%

    La cuarta componente principal explica aproximadamente el 9.10% de la variabilidad, llevando la varianza acumulada a 90.18%. Aunque esta componente agrega información valiosa, su contribución es menor en comparación con las tres primeras.

A medida que seguimos analizando las dimensiones nos damos cuenta de que contribuyen en menor medida a explicar la variabilidad de los datos.

A continuación, un Scree plot que ilustra lo comentado anteriormente.

fviz_eig(res.pca, addlabels = TRUE)

Las primeras tres componentes principales capturan aproximadamente el 81.08% de la variabilidad total en los datos. Estas componentes son las más significativas para explicar la estructura subyacente de los datos y representan la mayor variabilidad. Además, observamos un punto de inflexión (el “codo”) en el gráfico de eigenvalores, lo que indica que las tres primeras componentes son las más relevantes. Por lo tanto, enfocarse en estas tres componentes será suficiente para representar la mayoría de la variabilidad en los datos, facilitando análisis posteriores y reduciendo la dimensionalidad del conjunto de datos.

Análisis Detallado de las Variables

A continuación, procederemos a obtener los resultados para las variables, incluyendo información sobre las coordenadas, correlaciones entre variables y ejes (dimensiones), coseno cuadrado, y contribuciones.

Obtener esta información detallada de las variables nos permite:

  • Interpretar Componentes Principales: Entender qué variables contribuyen más a cada componente principal, facilitando una interpretación más clara de los componentes.

  • Identificar Variables Relevantes: Determinar qué variables tienen mayor influencia en los datos, lo cual es útil para la reducción de dimensionalidad y selección de características.

  • Evaluar Calidad de Representación: Utilizar el coseno cuadrado para evaluar cómo bien los componentes principales representan cada variable, ayudando a decidir cuántos componentes retener.

  • Comprender Relaciones: Analizar las correlaciones entre variables y componentes para comprender las relaciones subyacentes en los datos y cómo las variables originales se relacionan en el espacio reducido.

var <- get_pca_var(res.pca) 
var
Principal Component Analysis Results for variables
 ===================================================
  Name       Description                                    
1 "$coord"   "Coordinates for the variables"                
2 "$cor"     "Correlations between variables and dimensions"
3 "$cos2"    "Cos2 for the variables"                       
4 "$contrib" "contributions of the variables"               
  1. Coordenadas de las Variables

Las coordenadas de las variables en el espacio de los componentes principales nos indican la posición de cada variable respecto a los ejes definidos por los componentes. Estas coordenadas son esenciales para entender cómo las variables originales se proyectan en el nuevo espacio reducido.

    var$coord
                               Dim.1      Dim.2         Dim.3       Dim.4
driveLoad.EJE.X           0.57872537 -0.6294335  0.1627894055  0.06680505
driveLoad.EJE.Z           0.90382144 -0.1514967  0.2382622506  0.03844144
driveLoad.EJE.U           0.19748273 -0.2728894 -0.0563461153  0.92723348
driveLoad.EJE.W           0.28794272  0.8676297  0.0003546814  0.12911577
driveLoad.CABEZAL         0.80321658 -0.4133152  0.1078123508  0.01356165
actFeedRate.VELO.Cabezal  0.95536212  0.1621534 -0.0114417820 -0.18161090
actFeedRate.VELO.Eje.X   -0.10197224  0.3488054  0.9038574969  0.08558891
actFeedRate.VELO.Eje.Z   -0.06812909  0.5965955  0.7828143761  0.10507616
actFeedRate.VELO.Eje.U    0.36847743  0.7762068 -0.2410582408  0.07094483
actFeedRate.VELO.Eje.W    0.18910982  0.6219067 -0.6818299762  0.17007994
actSpeed_Cabezal          0.95536211  0.1621535 -0.0114419258 -0.18161093
                                Dim.5
driveLoad.EJE.X           0.435715036
driveLoad.EJE.Z           0.296334512
driveLoad.EJE.U          -0.118065651
driveLoad.EJE.W          -0.321905926
driveLoad.CABEZAL        -0.385259975
actFeedRate.VELO.Cabezal -0.137306337
actFeedRate.VELO.Eje.X    0.114248045
actFeedRate.VELO.Eje.Z   -0.004484642
actFeedRate.VELO.Eje.U    0.401408819
actFeedRate.VELO.Eje.W    0.165246748
actSpeed_Cabezal         -0.137306310
    fviz_pca_var(res.pca, col.var = "coord",              
                 gradient.cols = c("green", "brown", "blue"),              
                 repel= TRUE # Evita traslapamiento de textos              
                 )

Los resultados de las coordenadas (var$coord) muestran cómo cada variable se proyecta en el espacio de los componentes principales. A continuación, se presenta un resumen de estos resultados para las primeras tres dimensiones (componentes principales):

Dim.1 (Componente Principal 1)

  • driveLoad.EJE.X: 0.5787

  • driveLoad.EJE.Z: 0.9038

  • driveLoad.EJE.U: 0.1975

  • driveLoad.EJE.W: 0.2879

  • driveLoad.CABEZAL: 0.8032

  • actFeedRate.VELO.Cabezal: 0.9554

  • actFeedRate.VELO.Eje.X: -0.1020

  • actFeedRate.VELO.Eje.Z: -0.0681

  • actFeedRate.VELO.Eje.U: 0.3685

  • actFeedRate.VELO.Eje.W: 0.1891

  • actSpeed_Cabezal: 0.9554

La primera componente principal está dominada por las variables driveLoad.EJE.Z, actFeedRate.VELO.Cabezal, actSpeed_Cabezal, y driveLoad.CABEZAL, indicando que estas variables explican una gran parte de la variabilidad en esta dimensión.

Dim.2 (Componente Principal 2)

  • driveLoad.EJE.X: -0.6294

  • driveLoad.EJE.Z: -0.1515

  • driveLoad.EJE.U: -0.2729

  • driveLoad.EJE.W: 0.8676

  • driveLoad.CABEZAL: -0.4133

  • actFeedRate.VELO.Cabezal: 0.1622

  • actFeedRate.VELO.Eje.X: 0.3488

  • actFeedRate.VELO.Eje.Z: 0.5966

  • actFeedRate.VELO.Eje.U: 0.7762

  • actFeedRate.VELO.Eje.W: 0.6219

  • actSpeed_Cabezal: 0.1622

La segunda componente principal está influenciada fuertemente por las variables driveLoad.EJE.W, actFeedRate.VELO.Eje.U, actFeedRate.VELO.Eje.W, y actFeedRate.VELO.Eje.Z, sugiriendo que estas variables son importantes en esta dimensión.

Dim.3 (Componente Principal 3)

  • driveLoad.EJE.X: 0.1628

  • driveLoad.EJE.Z: 0.2383

  • driveLoad.EJE.U: -0.0563

  • driveLoad.EJE.W: 0.0004

  • driveLoad.CABEZAL: 0.1078

  • actFeedRate.VELO.Cabezal: -0.0114

  • actFeedRate.VELO.Eje.X: 0.9039

  • actFeedRate.VELO.Eje.Z: 0.7828

  • actFeedRate.VELO.Eje.U: -0.2411

  • actFeedRate.VELO.Eje.W: -0.6818

  • actSpeed_Cabezal: -0.0114

La tercera componente principal tiene altas contribuciones de actFeedRate.VELO.Eje.X y actFeedRate.VELO.Eje.Z, indicando que estas variables capturan la variabilidad explicada por esta dimensión.

Las coordenadas de las variables en los componentes principales nos permiten entender qué variables son más importantes en cada dimensión y cómo se proyectan en el espacio reducido. Las primeras tres componentes principales capturan la mayor parte de la variabilidad en los datos, con contribuciones significativas de variables como driveLoad.EJE.Z, actFeedRate.VELO.Cabezal, actSpeed_Cabezal, driveLoad.EJE.W, actFeedRate.VELO.Eje.U, actFeedRate.VELO.Eje.X, y actFeedRate.VELO.Eje.Z.

  1. Coseno Cuadrado (Cos2)

El coseno cuadrado de una variable respecto a un componente principal mide la calidad de la representación de la variable en ese componente. Es decir, indica qué proporción de la varianza de una variable se explica por un componente específico. Un coseno cuadrado alto implica que el componente principal representa bien la variable.

var$cos2
                               Dim.1      Dim.2        Dim.3        Dim.4
driveLoad.EJE.X          0.334923058 0.39618647 2.650039e-02 0.0044629144
driveLoad.EJE.Z          0.816893204 0.02295124 5.676890e-02 0.0014777443
driveLoad.EJE.U          0.038999429 0.07446865 3.174885e-03 0.8597619236
driveLoad.EJE.W          0.082911010 0.75278123 1.257989e-07 0.0166708828
driveLoad.CABEZAL        0.645156872 0.17082946 1.162350e-02 0.0001839184
actFeedRate.VELO.Cabezal 0.912716780 0.02629374 1.309144e-04 0.0329825204
actFeedRate.VELO.Eje.X   0.010398338 0.12166522 8.169584e-01 0.0073254607
actFeedRate.VELO.Eje.Z   0.004641573 0.35592615 6.127983e-01 0.0110409999
actFeedRate.VELO.Eje.U   0.135775620 0.60249706 5.810908e-02 0.0050331692
actFeedRate.VELO.Eje.W   0.035762524 0.38676797 4.648921e-01 0.0289271858
actSpeed_Cabezal         0.912716762 0.02629376 1.309177e-04 0.0329825317
                                Dim.5
driveLoad.EJE.X          1.898476e-01
driveLoad.EJE.Z          8.781414e-02
driveLoad.EJE.U          1.393950e-02
driveLoad.EJE.W          1.036234e-01
driveLoad.CABEZAL        1.484252e-01
actFeedRate.VELO.Cabezal 1.885303e-02
actFeedRate.VELO.Eje.X   1.305262e-02
actFeedRate.VELO.Eje.Z   2.011201e-05
actFeedRate.VELO.Eje.U   1.611290e-01
actFeedRate.VELO.Eje.W   2.730649e-02
actSpeed_Cabezal         1.885302e-02
    corrplot(var$cos2,           
             is.corr=FALSE,             
             tl.col = "black",           
             bg = "lightblue",        #Color del fondo          
             tl.srt = 90,          
             title="Matriz de correlaciones",           
             mar=c(0,0,4,0),        
             #Ubicación del título         
             )

# cos2 total de las variables sobre Dim.1, Dim.2 y Dim.3 
    fviz_cos2(res.pca, choice = "var", axes = 1:3)

#Color por valores cos2: calidad sobre el mapa factorial 
    fviz_pca_var(res.pca, col.var = "cos2",              
                 gradient.cols = c("green", "brown", "blue"),              
                 title="Gradiente de las variables por cos2",              
                 repel = TRUE # Evita traslapamiento de textos              
                 )

Los resultados del coseno cuadrado (var$cos2) nos indican la calidad de la representación de cada variable en los componentes principales. A continuación, se presenta un resumen de estos resultados para las primeras tres dimensiones (componentes principales):

Dim.1 (Componente Principal 1)

-   **driveLoad.EJE.X**: 0.3349

-   **driveLoad.EJE.Z**: 0.8169

-   **driveLoad.EJE.U**: 0.0390

-   **driveLoad.EJE.W**: 0.0829

-   **driveLoad.CABEZAL**: 0.6452

-   **actFeedRate.VELO.Cabezal**: 0.9127

-   **actFeedRate.VELO.Eje.X**: 0.0104

-   **actFeedRate.VELO.Eje.Z**: 0.0046

-   **actFeedRate.VELO.Eje.U**: 0.1358

-   **actFeedRate.VELO.Eje.W**: 0.0358

-   **actSpeed_Cabezal**: 0.9127

La primera componente principal representa muy bien a las variables actFeedRate.VELO.Cabezal, actSpeed_Cabezal, driveLoad.EJE.Z, y driveLoad.CABEZAL, con cosenos cuadrados altos indicando una buena calidad de representación.

Dim.2 (Componente Principal 2)

-   **driveLoad.EJE.X**: 0.3962

-   **driveLoad.EJE.Z**: 0.0230

-   **driveLoad.EJE.U**: 0.0745

-   **driveLoad.EJE.W**: 0.7528

-   **driveLoad.CABEZAL**: 0.1708

-   **actFeedRate.VELO.Cabezal**: 0.0263

-   **actFeedRate.VELO.Eje.X**: 0.1217

-   **actFeedRate.VELO.Eje.Z**: 0.3559

-   **actFeedRate.VELO.Eje.U**: 0.6025

-   **actFeedRate.VELO.Eje.W**: 0.3868

-   **actSpeed_Cabezal**: 0.0263

La segunda componente principal tiene una alta calidad de representación para driveLoad.EJE.W, actFeedRate.VELO.Eje.U, y actFeedRate.VELO.Eje.W, sugiriendo que estas variables son bien representadas en esta dimensión.

**Dim.3 (Componente Principal 3)**

-   **driveLoad.EJE.X**: 0.0265

-   **driveLoad.EJE.Z**: 0.0568

-   **driveLoad.EJE.U**: 0.0032

-   **driveLoad.EJE.W**: 0.0000

-   **driveLoad.CABEZAL**: 0.0116

-   **actFeedRate.VELO.Cabezal**: 0.0001

-   **actFeedRate.VELO.Eje.X**: 0.8170

-   **actFeedRate.VELO.Eje.Z**: 0.6128

-   **actFeedRate.VELO.Eje.U**: 0.0581

-   **actFeedRate.VELO.Eje.W**: 0.4649

-   **actSpeed_Cabezal**: 0.0001

La tercera componente principal representa muy bien a las variables actFeedRate.VELO.Eje.X, actFeedRate.VELO.Eje.Z, y actFeedRate.VELO.Eje.W, con cosenos cuadrados altos.

Los cosenos cuadrados (cos2) nos ayudan a evaluar cuan bien estan representadas las variables en las componentes principales. Las primeras tres componentes principales representan bien la mayoría de las variables, especialmente driveLoad.EJE.Z, actFeedRate.VELO.Cabezal, actSpeed_Cabezal, y driveLoad.EJE.U. Esto sugiere que estas componentes capturan la mayoría de la variabilidad y estructura en los datos, proporcionando una buena calidad de representación para las variables más importantes.

  1. Contribuciones de las Variables

Las contribuciones de las variables a los componentes principales cuantifican la importancia de cada variable en la formación de los componentes. Esta información nos permite identificar qué variables tienen mayor influencia en cada componente, ayudando a interpretar los componentes de manera más precisa.

var$contrib
                              Dim.1      Dim.2        Dim.3       Dim.4
driveLoad.EJE.X           8.5202745 13.4910526 1.292017e+00  0.44591275
driveLoad.EJE.Z          20.7813531  0.7815419 2.767746e+00  0.14764903
driveLoad.EJE.U           0.9921259  2.5358273 1.547903e-01 85.90323894
driveLoad.EJE.W           2.1092145 25.6339171 6.133279e-06  1.66567370
driveLoad.CABEZAL        16.4124670  5.8171326 5.666995e-01  0.01837623
actFeedRate.VELO.Cabezal 23.2190568  0.8953617 6.382681e-03  3.29545338
actFeedRate.VELO.Eje.X    0.2645285  4.1429779 3.983050e+01  0.73192449
actFeedRate.VELO.Eje.Z    0.1180793 12.1200969 2.987675e+01  1.10316313
actFeedRate.VELO.Eje.U    3.4540636 20.5163985 2.833086e+00  0.50288984
actFeedRate.VELO.Eje.W    0.9097807 13.1703310 2.266564e+01  2.89026402
actSpeed_Cabezal         23.2190563  0.8953625 6.382841e-03  3.29545450
                               Dim.5
driveLoad.EJE.X          24.25038585
driveLoad.EJE.Z          11.21703369
driveLoad.EJE.U           1.78057673
driveLoad.EJE.W          13.23644931
driveLoad.CABEZAL        18.95925825
actFeedRate.VELO.Cabezal  2.40821201
actFeedRate.VELO.Eje.X    1.66728988
actFeedRate.VELO.Eje.Z    0.00256903
actFeedRate.VELO.Eje.U   20.58199067
actFeedRate.VELO.Eje.W    3.48802351
actSpeed_Cabezal          2.40821107
corrplot(var$contrib,           
             is.corr=FALSE,             
             tl.col = "black",           
             tl.srt = 90,           
             bg = "lightblue",        
             title="Matriz de correlaciones",
             mar=c(0,0,4,0)          
             )

fviz_contrib(res.pca, choice = "var", axes = 1:3, top = 11)

(1/length(datos))*100
[1] 9.090909
fviz_pca_var(res.pca, col.var = "contrib",               
             repel= TRUE,              
             gradient.cols = c("green", "brown", "blue"),              
             )

Los resultados de las contribuciones (var$contrib) nos indican la importancia de cada variable en la formación de los componentes principales. A continuación, se presenta un resumen de estos resultados para las primeras cuatro dimensiones (componentes principales):

Dim.1 (Componente Principal 1)

  • driveLoad.EJE.X: 8.52%

  • driveLoad.EJE.Z: 20.78%

  • driveLoad.EJE.U: 0.99%

  • driveLoad.EJE.W: 2.11%

  • driveLoad.CABEZAL: 16.41%

  • actFeedRate.VELO.Cabezal: 23.22%

  • actFeedRate.VELO.Eje.X: 0.26%

  • actFeedRate.VELO.Eje.Z: 0.12%

  • actFeedRate.VELO.Eje.U: 3.45%

  • actFeedRate.VELO.Eje.W: 0.91%

  • actSpeed_Cabezal: 23.22%

En la primera componente principal, las variables actFeedRate.VELO.Cabezal, actSpeed_Cabezal, driveLoad.EJE.Z, y driveLoad.CABEZAL son las que más contribuyen, con porcentajes significativos.

Dim.2 (Componente Principal 2)

  • driveLoad.EJE.X: 13.49%

  • driveLoad.EJE.Z: 0.78%

  • driveLoad.EJE.U: 2.54%

  • driveLoad.EJE.W: 25.63%

  • driveLoad.CABEZAL: 5.82%

  • actFeedRate.VELO.Cabezal: 0.90%

  • actFeedRate.VELO.Eje.X: 4.14%

  • actFeedRate.VELO.Eje.Z: 12.12%

  • actFeedRate.VELO.Eje.U: 20.52%

  • actFeedRate.VELO.Eje.W: 13.17%

  • actSpeed_Cabezal: 0.90%

La segunda componente principal tiene altas contribuciones de driveLoad.EJE.W, actFeedRate.VELO.Eje.U, y actFeedRate.VELO.Eje.Z, indicando su importancia en esta dimensión.

Dim.3 (Componente Principal 3)

  • driveLoad.EJE.X: 1.29%

  • driveLoad.EJE.Z: 2.77%

  • driveLoad.EJE.U: 0.15%

  • driveLoad.EJE.W: 0.00%

  • driveLoad.CABEZAL: 0.57%

  • actFeedRate.VELO.Cabezal: 0.01%

  • actFeedRate.VELO.Eje.X: 39.83%

  • actFeedRate.VELO.Eje.Z: 29.88%

  • actFeedRate.VELO.Eje.U: 2.83%

  • actFeedRate.VELO.Eje.W: 22.67%

  • actSpeed_Cabezal: 0.01%

La tercera componente principal está dominada por actFeedRate.VELO.Eje.X, actFeedRate.VELO.Eje.Z, y actFeedRate.VELO.Eje.W, que tienen contribuciones muy altas.

Dim.4 (Componente Principal 4)

  • driveLoad.EJE.X: 0.45%

  • driveLoad.EJE.Z: 0.15%

  • driveLoad.EJE.U: 85.90%

  • driveLoad.EJE.W: 1.67%

  • driveLoad.CABEZAL: 0.02%

  • actFeedRate.VELO.Cabezal: 3.30%

  • actFeedRate.VELO.Eje.X: 0.73%

  • actFeedRate.VELO.Eje.Z: 1.10%

  • actFeedRate.VELO.Eje.U: 0.50%

  • actFeedRate.VELO.Eje.W: 2.89%

  • actSpeed_Cabezal: 3.30%

La cuarta componente principal está casi exclusivamente influenciada por driveLoad.EJE.U, que explica la mayor parte de la varianza en esta dimensión.

Las contribuciones (contrib) nos indican qué variables son más influyentes en la formación de cada componente principal. Las primeras tres componentes principales están principalmente influenciadas por actFeedRate.VELO.Cabezal, actSpeed_Cabezal, driveLoad.EJE.Z, driveLoad.EJE.W, actFeedRate.VELO.Eje.X, actFeedRate.VELO.Eje.Z, y driveLoad.EJE.U. Estas variables son cruciales para explicar la variabilidad y estructura subyacente en los datos. En el caso de la cuarta dimension esta casi exclusivamente influenciada por una sola variable driveLoad.EJE.U.

Relación entre componentes

# Crear 3 clúster (centers = 3) 
set.seed(123) 
res2.km <- kmeans(datos, centers = 3, nstart = 25)  
# Extraer etiquetas de los clúster  
cluster_labels <- res2.km$cluster  
# Añadir etiquetas de los clúster a los datos originales 
datos$Cluster <- cluster_labels  
gr <- as.factor(datos$Cluster) 
gr_name <- "Clusters"
fviz_pca_ind(res.pca,              
             geom.ind = "point", 
             # mostrar solo puntos (no "texto")              
             col.ind = gr   ,    
             # color por grupos              
             palette = c("blue", "brown", "green"),              
             addEllipses = TRUE, # concentración de elipses              
             legend.title = gr_name             
             )

2. Regresión Logística Multinomial (MLR)

Se realiza el caso práctico sobre el conjunto de datos Estimation of Obesity Levels Based On Eating Habits and Physical Condition. El conjunto de datos que tienes contiene información para estimar los niveles de obesidad en individuos de México, Perú y Colombia, basada en sus hábitos alimenticios y condición física. Variable de Clase: NObesity (Nivel de Obesidad) con las siguientes categorías:

  • Insufficient Weight

  • Normal Weight

  • Overweight Level I

  • Overweight Level II

  • Obesity Type I

  • Obesity Type II

  • Obesity Type III

    Variables de Conjunto de Datos:

Para construir un modelo de regresión logística multinomial en R, utilizaremos el paquete nnet que contiene la función multinom() para ajustar modelos de regresión logística multinomial.

Librerías

Loading required package: lattice
Registered S3 method overwritten by 'lava':
  method         from    
  print.estimate EnvStats

Attaching package: 'caret'
The following object is masked from 'package:purrr':

    lift
Loading required package: proto

Análisis Descriptivo de los Datos

df <- read.csv("https://drive.google.com/uc?id=1MVxkFHDPswVlbOc1puw6mlwhs3bhyobX") 
str(df) 
'data.frame':   2111 obs. of  17 variables:
 $ Gender                        : chr  "Female" "Female" "Male" "Male" ...
 $ Age                           : num  21 21 23 27 22 29 23 22 24 22 ...
 $ Height                        : num  1.62 1.52 1.8 1.8 1.78 1.62 1.5 1.64 1.78 1.72 ...
 $ Weight                        : num  64 56 77 87 89.8 53 55 53 64 68 ...
 $ family_history_with_overweight: chr  "yes" "yes" "yes" "no" ...
 $ FAVC                          : chr  "no" "no" "no" "no" ...
 $ FCVC                          : num  2 3 2 3 2 2 3 2 3 2 ...
 $ NCP                           : num  3 3 3 3 1 3 3 3 3 3 ...
 $ CAEC                          : chr  "Sometimes" "Sometimes" "Sometimes" "Sometimes" ...
 $ SMOKE                         : chr  "no" "yes" "no" "no" ...
 $ CH2O                          : num  2 3 2 2 2 2 2 2 2 2 ...
 $ SCC                           : chr  "no" "yes" "no" "no" ...
 $ FAF                           : num  0 3 2 2 0 0 1 3 1 1 ...
 $ TUE                           : num  1 0 1 0 0 0 0 0 1 1 ...
 $ CALC                          : chr  "no" "Sometimes" "Frequently" "Frequently" ...
 $ MTRANS                        : chr  "Public_Transportation" "Public_Transportation" "Public_Transportation" "Walking" ...
 $ NObeyesdad                    : chr  "Normal_Weight" "Normal_Weight" "Normal_Weight" "Overweight_Level_I" ...
knitr::kable(head(df)) 
Gender Age Height Weight family_history_with_overweight FAVC FCVC NCP CAEC SMOKE CH2O SCC FAF TUE CALC MTRANS NObeyesdad
Female 21 1.62 64.0 yes no 2 3 Sometimes no 2 no 0 1 no Public_Transportation Normal_Weight
Female 21 1.52 56.0 yes no 3 3 Sometimes yes 3 yes 3 0 Sometimes Public_Transportation Normal_Weight
Male 23 1.80 77.0 yes no 2 3 Sometimes no 2 no 2 1 Frequently Public_Transportation Normal_Weight
Male 27 1.80 87.0 no no 3 3 Sometimes no 2 no 2 0 Frequently Walking Overweight_Level_I
Male 22 1.78 89.8 no no 2 1 Sometimes no 2 no 0 0 Sometimes Public_Transportation Overweight_Level_II
Male 29 1.62 53.0 no yes 2 3 Sometimes no 2 no 0 0 Sometimes Automobile Normal_Weight
knitr::kable(summary(df))
Gender Age Height Weight family_history_with_overweight FAVC FCVC NCP CAEC SMOKE CH2O SCC FAF TUE CALC MTRANS NObeyesdad
Length:2111 Min. :14.00 Min. :1.450 Min. : 39.00 Length:2111 Length:2111 Min. :1.000 Min. :1.000 Length:2111 Length:2111 Min. :1.000 Length:2111 Min. :0.0000 Min. :0.0000 Length:2111 Length:2111 Length:2111
Class :character 1st Qu.:19.95 1st Qu.:1.630 1st Qu.: 65.47 Class :character Class :character 1st Qu.:2.000 1st Qu.:2.659 Class :character Class :character 1st Qu.:1.585 Class :character 1st Qu.:0.1245 1st Qu.:0.0000 Class :character Class :character Class :character
Mode :character Median :22.78 Median :1.700 Median : 83.00 Mode :character Mode :character Median :2.386 Median :3.000 Mode :character Mode :character Median :2.000 Mode :character Median :1.0000 Median :0.6253 Mode :character Mode :character Mode :character
NA Mean :24.31 Mean :1.702 Mean : 86.59 NA NA Mean :2.419 Mean :2.686 NA NA Mean :2.008 NA Mean :1.0103 Mean :0.6579 NA NA NA
NA 3rd Qu.:26.00 3rd Qu.:1.768 3rd Qu.:107.43 NA NA 3rd Qu.:3.000 3rd Qu.:3.000 NA NA 3rd Qu.:2.477 NA 3rd Qu.:1.6667 3rd Qu.:1.0000 NA NA NA
NA Max. :61.00 Max. :1.980 Max. :173.00 NA NA Max. :3.000 Max. :4.000 NA NA Max. :3.000 NA Max. :3.0000 Max. :2.0000 NA NA NA

El conjunto de datos no está depurado y podría estar normalizado, lo que puede dificultar su comprensión. Podemos ver los datos sin procesar para comprender mejor los datos normalizados.

# Verificar datos faltantes 
sum(is.na(df)) 
[1] 0
df <- na.omit(df)
# Gráfico de dispersión 
ggplot(df, aes(x = Weight, y = Height, color = Gender)) +
  geom_point() +
  labs(title = "Weight vs Height by Gender",        x = "Weight",        y = "Height") +
  theme_minimal()

El gráfico sugiere que hay diferencias notables en las distribuciones de peso y altura entre hombres y mujeres. Se observan algunos outliers, especialmente en los hombres, con alturas superiores a 1.9 metros y pesos superiores a 120 kg. En las mujeres, también hay algunos outliers con pesos que superan los 90 kg, aunque son menos frecuentes.

# Gráfico de dispersión 
ggplot(df, aes(x = Weight, y = Age, color = Gender)) +
  geom_point() +
  labs(title = "Weight vs Age by Gender",        x = "Weight",        y = "Age") +
  theme_minimal()

Podemos visualizar claramente una relación entre GÉNERO, ALTURA, PESO. El gráfico nos da un indicio de que la edad y el género son factores importantes en la distribución del peso, con hombres mostrando mayor variabilidad y generalmente mayor peso en todos los grupos de edad en comparación con las mujeres.

ggplot(df, aes(x = Weight, y = Height, color = SMOKE)) +
  geom_point() +   labs(title = "Weight vs Height by SMOKE",        x = "Weight",        y = "Height") +
  theme_minimal()

Aunque fumar puede influir en la distribución del peso y la altura, la mayoría de las personas no fuman y muestran una mayor variabilidad en estas medidas. Estos datos sugieren que otras variables pueden tener un impacto más significativo en el peso y la altura que el hecho de fumar.

ggplot(df, aes(x = Weight, y = Age, color = FCVC)) +
  geom_point() +
  labs(title = "Weight vs Age by FCVC",        x = "Weight",        y = "Age") +
  theme_minimal() 

Un mayor consumo de vegetales está asociado con un peso más saludable, especialmente entre los individuos más jóvenes. Las personas entre 20 y 30 años son más conscientes de sus hábitos alimentarios y tienden a consumir más vegetales.

Ahora análizamos la variable dependiente para ver si existe algún tipo de patrón o dato atípico que podamos identificar.

# Contar los valores únicos en la columna NObeyesdad 
knitr::kable(table(df$NObeyesdad)) 
Var1 Freq
Insufficient_Weight 272
Normal_Weight 287
Obesity_Type_I 351
Obesity_Type_II 297
Obesity_Type_III 324
Overweight_Level_I 290
Overweight_Level_II 290
ggplot(df, aes(x = NObeyesdad, y = Weight, fill = Gender)) +
  geom_boxplot() +
  labs(title = "Weight vs NObeyesdad by Gender",
       x = "NObeyesdad",
       y = "Weight") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Existen diferencias significativas en la distribución del peso por género en todas las categorías de obesidad, con hombres generalmente pesando más que las mujeres.

ggplot(df, aes(x = NObeyesdad, y = Age, fill = Gender)) +
  geom_boxplot() + 
  labs(title = "Age vs NObeyesdad",
       x = "NObeyesdad",
       y = "Age") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) 

Existen diferencias significativas en la distribución de la edad por género en todas las categorías de obesidad, con hombres y mujeres mostrando variabilidad en diferentes medidas.

ggplot(df, aes(x = Weight, y = NObeyesdad, color = family_history_with_overweight)) +
  geom_point(alpha = 0.2) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(title = "Weight vs NObeyesdad",
       x = "Weight", 
       y = "NObeyesdad") +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

El gráfico indica que el historial familiar de sobrepeso tiene una fuerte asociación con el peso y la categoría de obesidad en los individuos.

ggplot(df, aes(x = Weight, y = NObeyesdad, color = Age)) +
  geom_point(alpha = 0.2) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(title = "Weight vs NObeyesdad",
       x = "Weight", 
       y = "NObeyesdad") + 
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'
Warning: The following aesthetics were dropped during statistical transformation: colour
ℹ This can happen when ggplot fails to infer the correct grouping structure in
  the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
  variable into a factor?

La obesidad es una condición que afecta a individuos de todas las edades y presenta una gran variabilidad en términos de peso.

Preparación de datos para el análisis predictivo

División de datos:

df$combined_factors <- interaction(df$CAEC, df$CALC, df$MTRANS, drop = TRUE) 
set.seed(123)  # Fija la semilla para reproducibilidad 
trainIndex <- createDataPartition(df$combined_factors, p = 0.7, list = FALSE)  
# Crear conjuntos de entrenamiento y prueba 
traindf <- df[trainIndex, ] 
testdf <- df[-trainIndex, ]  
# Elimina la columna combinada ya que no se necesita más 
traindf$combined_factors <- NULL 
testdf$combined_factors <- NULL
summary(traindf$NObeyesdad) 
   Length     Class      Mode 
     1494 character character 
summary(testdf$NObeyesdad)
   Length     Class      Mode 
      617 character character 

Estadísticas de Chi-cuadrado y Cramer’s V

Esta prueba estadística tiene como objetivo evaluar si hay una asociación significativa entre las variables categóricas independientes y la variable dependiente (NObeyesdad).

  1. Chi-squared Statistic (statistic): El valor de la estadística Chi-cuadrado es una medida de la asociación entre las variables. Valores más altos indican una mayor desviación de la hipótesis nula, lo que sugiere una asociación más fuerte entre las variables.
  2. El p-valor: indica la probabilidad de obtener una asociación tan fuerte como la observada (o más fuerte) si la hipótesis nula fuera verdadera (es decir, no hay asociación entre las variables).
  3. El valor de Cramer’s V: es una medida de la fuerza de la asociación entre las variables, ajustada por el tamaño de la tabla de contingencia. Cramer’s V varía de 0 a 1, donde 0 indica ninguna asociación y 1 indica una asociación perfecta.
# Variables categóricas en el conjunto de entrenamiento 
traindf_cat <- traindf[, c("Gender", "family_history_with_overweight", "FAVC", "CAEC", "SMOKE", "SCC", "CALC", "MTRANS", "NObeyesdad")]  
# Estadísticas de Chi-cuadrado 
CHIS <- lapply(traindf_cat[, -9], function(x) chisq.test(traindf_cat$NObeyesdad, x))  
# Resultados de Chi-cuadrado 
CHIs_table <- do.call(rbind, lapply(CHIS, function(x) c(x$statistic, x$p.value))) 
CHIs_table <- as.data.frame(CHIs_table) 
colnames(CHIs_table) <- c("statistic", "p.value") 
CHIs_table$Variable <- rownames(CHIs_table)  
# Número de niveles para cada variable 
level <- traindf_cat %>%   
  summarise_all(n_distinct) 
level <- as.data.frame(t(level)) 
level$Variable <- rownames(level)  
# Combinar las tablas 
CHIs_table <- merge(CHIs_table, level, by = "Variable")  
# Calcular el valor de Cramer's V 
CHIs_table$statistic <- as.numeric(CHIs_table$statistic) 
CHIs_table$p.value <- as.numeric(CHIs_table$p.value) 
CHIs_table$Cramers_Value <- sqrt((CHIs_table$statistic / nrow(traindf)) / pmin(CHIs_table$V1, n_distinct(traindf$NObeyesdad) - 1))  
# Tabla 
knitr::kable(CHIs_table) 
Variable statistic p.value V1 Cramers_Value
CAEC 555.36023 0.00e+00 4 0.3048471
CALC 251.72984 0.00e+00 4 0.2052400
family_history_with_overweight 448.14948 0.00e+00 2 0.3872765
FAVC 165.42559 0.00e+00 2 0.2352941
Gender 461.96684 0.00e+00 2 0.3932014
MTRANS 206.84301 0.00e+00 5 0.1664026
SCC 94.00453 0.00e+00 2 0.1773716
SMOKE 31.14030 2.38e-05 2 0.1020872

Con este análisis de Chi-cuadrado logramos identificar asociaciones significativas entre las variables categóricas y la variable dependiente (NObeyesdad). El valor de Cramer’s V proporciona una medida de la fuerza de estas asociaciones.

  • Hay asociaciones significativas entre todas las variables categóricas analizadas y NObeyesdad.

  • La fuerza de estas asociaciones varía, siendo más fuerte para family_history_with_overweight y Gender, y más débil para SMOKE.

Este tipo de análisis es útil para identificar variables que tienen una relación significativa con la variable de interés, lo que facilita análisis adicionales y la construcción de modelos predictivos.

Modelo Regresión Logística Multinomial

Ahora trabajaremos en la predicción de NObeyesdad (característica categórica). Para ello utilizaremos la regresión logística multinomial.

{r} # Convertir la variable dependiente a factor} traindf$NObeyesdad <- as.factor(traindf$NObeyesdad) testdf$NObeyesdad <- as.factor(testdf$NObeyesdad)

# Ajustar el modelo de regresión logística multinomial 
# Modelo de training 
modelo <- multinom(NObeyesdad ~ ., data = traindf)
# weights:  175 (144 variable)
initial  value 2907.189763 
iter  10 value 2488.772808
iter  20 value 1488.822020
iter  30 value 1110.275006
iter  40 value 910.854584
iter  50 value 670.955623
iter  60 value 414.360624
iter  70 value 261.721719
iter  80 value 173.646963
iter  90 value 100.296324
iter 100 value 66.461406
final  value 66.461406 
stopped after 100 iterations
# Resumen del modelo 
summary(modelo) 
Call:
multinom(formula = NObeyesdad ~ ., data = traindf)

Coefficients:
                    (Intercept)  GenderMale       Age     Height    Weight
Normal_Weight         130.23102   -4.132299 0.5382209  -160.6125  3.979171
Obesity_Type_I        319.96239  -26.741438 1.4567232  -831.5932 13.254104
Obesity_Type_II        86.70635   -2.473855 5.7144900 -1097.8806 20.712774
Obesity_Type_III     -248.55236 -219.352293 1.3072568  -711.9919 17.125789
Overweight_Level_I    112.06300  -12.988623 0.8093446  -377.2131  7.235395
Overweight_Level_II   198.14059  -14.364934 1.0719379  -586.1240  9.822651
                    family_history_with_overweightyes     FAVCyes       FCVC
Normal_Weight                              -3.7603400  -2.5110742  -3.640494
Obesity_Type_I                             -2.7505710  -5.1738631  -1.252217
Obesity_Type_II                           -67.7601364 -13.1667928 -18.801604
Obesity_Type_III                          -39.3227646  25.9358361  54.542910
Overweight_Level_I                         -3.2959413   0.2986984  -2.313902
Overweight_Level_II                         0.3503592  -2.1688311  -3.510102
                          NCP CAECFrequently      CAECno CAECSometimes
Normal_Weight       -3.999432       4.643538    8.529265      8.324392
Obesity_Type_I      -2.460743      17.519373  -38.905115     28.884071
Obesity_Type_II     -6.566804     -24.546766   23.305606     27.895616
Obesity_Type_III    20.092811      89.133671  154.258159     52.334291
Overweight_Level_I  -3.010555      12.026671   21.660296     22.035584
Overweight_Level_II -3.512905      22.191732 -280.474123     30.112543
                     SMOKEyes       CH2O     SCCyes         FAF         TUE
Normal_Weight        67.50578  -5.451618  6.5040860   0.2933047  -0.7346791
Obesity_Type_I       68.20949  -6.431176 28.5707913  -4.0044755   2.9359126
Obesity_Type_II     115.63359 -49.885677  0.7670158 -12.0507625   9.7474921
Obesity_Type_III    -11.76962  -9.763883 82.0642999 -19.6698307 -10.2801121
Overweight_Level_I   57.37816  -5.609532 19.3704994  -0.2240437   1.0308586
Overweight_Level_II  61.30096  -5.801992 17.2617254  -0.9369715   2.0915402
                    CALCFrequently    CALCno CALCSometimes MTRANSBike
Normal_Weight            -67.39020 -53.29409     -56.25186  180.98190
Obesity_Type_I           102.37179 118.44348     115.73276 -150.07308
Obesity_Type_II          -58.38658  86.97093      52.09053   13.48936
Obesity_Type_III        -131.85850 -70.87554     -57.88101   85.22243
Overweight_Level_I        55.96293  73.41235      70.63977  187.54888
Overweight_Level_II      112.89549 127.42587     122.18825 -209.26885
                    MTRANSMotorbike MTRANSPublic_Transportation MTRANSWalking
Normal_Weight              98.81827                    5.118099     -2.595335
Obesity_Type_I             98.37230                   22.752375     -8.879434
Obesity_Type_II           -17.97378                   58.900973     24.395209
Obesity_Type_III           68.45296                   12.036144     63.738053
Overweight_Level_I         93.12087                   11.190714     -2.253137
Overweight_Level_II        94.85033                   16.522744    -10.604356

Std. Errors:
                    (Intercept) GenderMale       Age   Height    Weight
Normal_Weight          6.923948   2.172401 0.1491274 3.557217 0.2642851
Obesity_Type_I         8.658318   4.584115 0.2661807 4.657919 0.2616659
Obesity_Type_II        2.821670   9.920433 0.7017425 3.932277 0.3101780
Obesity_Type_III       2.273817   4.707140 0.6202936 3.302918 0.3528793
Overweight_Level_I     5.496096   3.418050 0.1889979 3.839354 0.2452003
Overweight_Level_II    5.597931   3.570605 0.2163787 3.284844 0.2172375
                    family_history_with_overweightyes  FAVCyes     FCVC
Normal_Weight                                1.480612 2.790529 1.289747
Obesity_Type_I                               4.090108 4.548207 3.353363
Obesity_Type_II                              9.004774 7.909698 5.109190
Obesity_Type_III                             6.891591 7.745953 5.635085
Overweight_Level_I                           2.316906 3.556587 2.326272
Overweight_Level_II                          2.747373 3.680680 2.590194
                         NCP CAECFrequently        CAECno CAECSometimes
Normal_Weight       1.262461      3.0367962  2.324760e+00      3.400245
Obesity_Type_I      2.186517      5.5332662  1.003320e-02      3.600031
Obesity_Type_II     4.130878      0.1227225  2.390440e-04      8.034040
Obesity_Type_III    5.763644      7.5999192  2.542579e-15      4.602540
Overweight_Level_I  1.678693      4.0316501  1.997409e+00      4.203245
Overweight_Level_II 1.765283      3.8809857 5.022257e-114      3.549087
                        SMOKEyes     CH2O      SCCyes       FAF      TUE
Normal_Weight        8.589796887 1.607060 5.778592254 0.8701309 1.122068
Obesity_Type_I      10.499234026 2.895932 8.160930671 1.6171369 2.340071
Obesity_Type_II      0.000239044 4.587169 0.000239044 4.3708967 3.651567
Obesity_Type_III     7.313306465 7.599730 0.304454582 6.5298594 4.284351
Overweight_Level_I   5.009136277 2.234182 5.929536441 1.2310934 1.827217
Overweight_Level_II  4.915764898 2.442679 6.204739080 1.3252580 1.956870
                    CALCFrequently   CALCno CALCSometimes   MTRANSBike
Normal_Weight         4.416833e+00 2.302073      2.537786 2.309130e+00
Obesity_Type_I        9.001066e+00 5.085677      4.752461 1.383757e-13
Obesity_Type_II       9.697128e+00 6.788495      6.831676          NaN
Obesity_Type_III      7.202213e-15 8.139851      7.005700 2.423504e-15
Overweight_Level_I    4.054864e+00 2.880709      2.855466 2.309130e+00
Overweight_Level_II   4.304892e+00 2.859802      2.833191 0.000000e+00
                    MTRANSMotorbike MTRANSPublic_Transportation MTRANSWalking
Normal_Weight          1.135219e+01                    2.319842      5.216351
Obesity_Type_I         1.790313e-01                    4.483621      8.758251
Obesity_Type_II        1.922932e-14                    7.711773      9.334884
Obesity_Type_III       2.600233e-15                    6.141680      4.707104
Overweight_Level_I     5.862494e+00                    3.014329      6.067655
Overweight_Level_II    6.168308e+00                    3.358659      7.811853

Residual Deviance: 132.9228 
AIC: 420.9228 

La regresión logística multinomial extiende la regresión logística para manejar variables dependientes categóricas con más de dos niveles. La ecuación para cada categoría \(j\) comparación con la categoría de referencia \(j^*\) se puede expresar como:

\[\log\left(\frac{P(Y = j)}{P(Y = y^*)}\right) = \beta_{0j} + \beta_{1j}X_1 + \beta_{2j}X_2 + \cdots + \beta_{pj}X_p\] Donde:

  • \(P(Y = j)\): Es la probabilidad de pertenecer a la categoría \(j\).

  • \(\beta_{0,j}\): es el intercepto para la categoría \(j\).

  • \(\beta_{ij}\): es el coeficiente para la variable independiente \(X_i\) en la categoría \(j\).

Interpretación de los Coeficientes

Los coeficientes indican cómo cada variable explicativa (género, edad, altura, peso, hábitos alimenticios, etc.) afecta las probabilidades de pertenecer a diferentes categorías de NObeyesdad en comparación con la categoría de referencia. La magnitud y el signo de cada coeficiente proporcionan información sobre la dirección y la fuerza de estas asociaciones.

  • Obesity_Type_I:

    Intercepto: 319.96239, indica el logit base para esta categoría.

    GenderMale: -26.741438, ser hombre disminuye la probabilidad de estar en Obesity_Type_I.

    Age: 1.4567232, mayor edad aumenta la probabilidad de estar en Obesity_Type_I.

    Height: -831.5932, mayor altura disminuye la probabilidad de estar en Obesity_Type_I.

    Weight: 13.254104, mayor peso aumenta la probabilidad de estar en Obesity_Type_I.

  • Normal_Weight:

    Intercepto: 130.23102, indica el logit base para esta categoría.

    GenderMale: -4.132299, ser hombre disminuye la probabilidad de estar en Normal_Weight.

    Age: 0.5382209, mayor edad aumenta la probabilidad de estar en Normal_Weight.

    Height: -160.6125, mayor altura disminuye la probabilidad de estar en Normal_Weight.

    Weight: 3.979171, mayor peso aumenta la probabilidad de estar en Normal_Weight.

Errores Estándar

Los errores estándar miden la precisión de los coeficientes estimados. Coeficientes con errores estándar relativamente pequeños son más precisos. Por ejemplo, para la categoría Obesity_Type_I:

  • GenderMale (SE: 3.682049): Este error estándar indica que el coeficiente es relativamente preciso, pero hay cierta variabilidad en su estimación.
  • Age (SE: 0.2529448): Este error estándar es bastante pequeño, indicando que la estimación del coeficiente es precisa.

Residual Deviance y AIC

  • Residual Deviance: Este valor mide la bondad de ajuste del modelo. Un deviance residual más bajo indica un mejor ajuste. La deviance residual es 132.9228. Este valor, por sí solo, no proporciona mucha información a menos que se compare con otro modelo (modelo Nulo).

  • AIC (Akaike Information Criterion): 444.7616.ndefined El AIC penaliza por la complejidad del modelo, balanceando la bondad de ajuste y el número de parámetros.

Comentarios Generales:

  1. Género: Ser hombre disminuye significativamente las probabilidades de pertenecer a las categorías de obesidad (Obesity_Type_I, Obesity_Type_II, etc.) en comparación con la categoría de referencia.

  2. Edad: La edad tiene un efecto positivo en las probabilidades de pertenecer a las categorías de obesidad. A medida que la edad aumenta, también lo hace la probabilidad de pertenecer a estas categorías.

  3. Altura y Peso: La altura y el peso tienen efectos significativos en las probabilidades de pertenecer a las categorías de obesidad. Por ejemplo, un mayor peso está asociado con una mayor probabilidad de pertenecer a las categorías de obesidad.

  4. Variables Categóricas: Variables como family_history_with_overweight, FAVC, CAEC, etc., también tienen coeficientes significativos que indican cómo estas variables afectan las probabilidades de pertenecer a diferentes categorías de obesidad.

  5. Precisión del Modelo: El modelo parece tener un buen ajuste, dado el deviance residual y el AIC. Los coeficientes son en su mayoría precisos, con errores estándar relativamente pequeños.

    Significancia Estadística

Los errores estándar proporcionan una medida de la precisión de los coeficientes estimados. Coeficientes con errores estándar pequeños son más precisos. Los valores \(z\) y los valores \(p\) se pueden calcular para determinar la significancia estadística de cada coeficiente.

$z = \beta/SE$

Valores z altos (positivos o negativos) indican que el coeficiente es significativamente diferente de cero. Un valor p bajo (típicamente < 0.05) indica que podemos rechazar la hipótesis nula de que el coeficiente es igual a cero.

z <- summary(modelo)$coefficients/summary(modelo)$standard.errors 
p <- (1-pnorm(abs(z),0,1))*2 
p
                    (Intercept)   GenderMale          Age Height Weight
Normal_Weight                 0 5.714751e-02 3.072203e-04      0      0
Obesity_Type_I                0 5.427624e-09 4.432697e-08      0      0
Obesity_Type_II               0 8.030749e-01 4.440892e-16      0      0
Obesity_Type_III              0 0.000000e+00 3.507593e-02      0      0
Overweight_Level_I            0 1.446906e-04 1.849764e-05      0      0
Overweight_Level_II           0 5.743476e-05 7.270707e-07      0      0
                    family_history_with_overweightyes      FAVCyes         FCVC
Normal_Weight                            1.109413e-02 0.3681968747 0.0047629787
Obesity_Type_I                           5.012696e-01 0.2553038551 0.7088350288
Obesity_Type_II                          5.284662e-14 0.0959847566 0.0002332722
Obesity_Type_III                         1.157265e-08 0.0008130654 0.0000000000
Overweight_Level_I                       1.548633e-01 0.9330687054 0.3198906671
Overweight_Level_II                      8.985247e-01 0.5556953339 0.1753696651
                             NCP CAECFrequently       CAECno CAECSometimes
Normal_Weight       0.0015351004   1.262419e-01 0.0002436154  1.435823e-02
Obesity_Type_I      0.2604124687   1.544498e-03 0.0000000000  1.110223e-15
Obesity_Type_II     0.1119052960   0.000000e+00 0.0000000000  5.162545e-04
Obesity_Type_III    0.0004900636   0.000000e+00 0.0000000000  0.000000e+00
Overweight_Level_I  0.0729102563   2.853781e-03 0.0000000000  1.584007e-07
Overweight_Level_II 0.0465915182   1.077434e-08 0.0000000000  0.000000e+00
                        SMOKEyes         CH2O       SCCyes         FAF
Normal_Weight       3.774758e-15 0.0006931022 0.2603566658 0.736055787
Obesity_Type_I      8.214673e-11 0.0263670691 0.0004636495 0.013276129
Obesity_Type_II     0.000000e+00 0.0000000000 0.0000000000 0.005832618
Obesity_Type_III    1.075413e-01 0.1988736593 0.0000000000 0.002592847
Overweight_Level_I  0.000000e+00 0.0120466045 0.0010877764 0.855592488
Overweight_Level_II 0.000000e+00 0.0175367017 0.0054021249 0.479559893
                            TUE CALCFrequently CALCno CALCSometimes MTRANSBike
Normal_Weight       0.512625694   0.000000e+00      0  0.000000e+00          0
Obesity_Type_I      0.209614721   0.000000e+00      0  0.000000e+00          0
Obesity_Type_II     0.007598698   1.733232e-09      0  2.442491e-14        NaN
Obesity_Type_III    0.016419448   0.000000e+00      0  2.220446e-16          0
Overweight_Level_I  0.572639262   0.000000e+00      0  0.000000e+00          0
Overweight_Level_II 0.285151245   0.000000e+00      0  0.000000e+00          0
                    MTRANSMotorbike MTRANSPublic_Transportation MTRANSWalking
Normal_Weight                     0                2.736809e-02   0.618809342
Obesity_Type_I                    0                3.884060e-07   0.310660787
Obesity_Type_II                   0                2.220446e-14   0.008966255
Obesity_Type_III                  0                5.002527e-02   0.000000000
Overweight_Level_I                0                2.052176e-04   0.710387507
Overweight_Level_II               0                8.678912e-07   0.174631904
  1. Género y Edad: Son variables consistentemente significativas en la mayoría de las categorías de peso, indicando que son factores importantes para predecir el peso.

  2. Historial Familiar con Sobrepeso: Tiene una fuerte asociación con la obesidad, especialmente en los tipos más severos.

  3. Consumo de Comida y Hábitos Alimenticios: Variables como el consumo frecuente de vegetales y el número de comidas por día muestran significancia en algunas categorías, sugiriendo que los hábitos alimenticios juegan un papel importante en el control del peso.

  4. Estilo de Vida: Factores como el ejercicio (FAF y TUE) y la monitorización de la ingesta calórica también muestran cierta significancia, indicando que un estilo de vida activo y consciente de la dieta puede influir en el peso.

  5. Modo de Transporte: Muestra asociaciones significativas en algunos casos, sugiriendo que la elección del transporte podría estar relacionada con los niveles de actividad física y, por ende, con el peso.

Datos Entrenamiento

# Predicción en los datos de entrenamiento 
train_predictions <- predict(modelo, traindf) 
# Evaluar la precisión del modelo en los datos de entrenamiento 
mean(train_predictions == traindf$NObeyesdad)
[1] 0.9872825
# Generar la matriz de confusión 
conf_matrix <- confusionMatrix(as.factor(train_predictions), as.factor(traindf$NObeyesdad))  
# Convertir la matriz de confusión a un data frame 
conf_matrix_df <- as.data.frame(conf_matrix$table)  
# Renombrar las columnas para claridad 
colnames(conf_matrix_df) <- c("Predicted", "Actual", "Freq")  

# Crear el gráfico 
ggplot(data = conf_matrix_df, aes(x = Actual, y = Predicted)) +
  geom_tile(aes(fill = Freq), color = "white") +
  geom_text(aes(label = Freq), vjust = 1) +
  scale_fill_gradient(low = "white", high = "blue") +
  theme_minimal() +
  labs(title = "Matriz de Confusión", x = "Actual", y = "Predicted") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  coord_fixed(ratio = 1.2)

La matriz de confusión es una herramienta poderosa para evaluar el rendimiento de los modelos de clasificación. En este caso, parece que el modelo predice correctamente la mayoría de las categorías, con algunas áreas de mejora en la distinción de categorías adyacentes o similares en características.

Datos de Test

# Predicción en los datos de prueba 
test_predictions <- predict(modelo, testdf)
# Evaluar la precisión del modelo en los datos de prueba 
mean(test_predictions == testdf$NObeyesdad)
[1] 0.9286872
# Generar la matriz de confusión 
conf_matrix <- confusionMatrix(as.factor(test_predictions), as.factor(testdf$NObeyesdad))  
# Convertir la matriz de confusión a un data frame 
conf_matrix_df <- as.data.frame(conf_matrix$table)  
# Renombrar las columnas para claridad 
colnames(conf_matrix_df) <- c("Predicted", "Actual", "Freq")  

# Crear el gráfico 
ggplot(data = conf_matrix_df, aes(x = Actual, y = Predicted)) +
  geom_tile(aes(fill = Freq), color = "white") +
  geom_text(aes(label = Freq), vjust = 1) +
  scale_fill_gradient(low = "white", high = "blue") +
  theme_minimal() +
  labs(title = "Matriz de Confusión", x = "Actual", y = "Predicted") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  coord_fixed(ratio = 1.2)

El modelo predice correctamente la mayoría de las categorías, con algunas áreas de mejora en la distinción de categorías adyacentes o similares en características.

Conclusión General

Este artículo presentó un análisis detallado del Análisis de Componentes Principales (PCA) y la Regresión Logística Multinomial (MLR), dos técnicas estadísticas fundamentales en la ciencia de datos. Los resultados obtenidos demuestran la eficacia y la aplicabilidad de estas técnicas en diferentes contextos.

Análisis de Componentes Principales (PCA):

Identificación de Patrones en el Funcionamiento del Torno CNC:

El uso de PCA en los datos recopilados del torno CNC permitió identificar patrones significativos en las señales de presión y temperatura. Estos patrones ayudaron a detectar comportamientos anómalos, proporcionando una visión clara sobre posibles problemas operativos.

La reducción de dimensionalidad facilitó la simplificación del conjunto de datos, eliminando redundancias y resaltando las variables más importantes que explican la mayor parte de la variabilidad. Esto optimizó el análisis y la interpretación de los datos, mejorando la eficiencia en la monitorización de la máquina.

Regresión Logística Multinomial (MLR):

Clasificación de Niveles de Obesidad:

La MLR se aplicó exitosamente en el análisis de datos para clasificar los niveles de obesidad en individuos de México, Perú y Colombia. Los resultados mostraron que la MLR es una herramienta eficaz para predecir la categoría de obesidad basada en hábitos alimenticios y condiciones físicas.

Las características más influyentes en la clasificación de niveles de obesidad fueron identificadas, permitiendo una mejor comprensión de los factores determinantes. Esto puede guiar estrategias de salud pública para abordar problemas relacionados con la obesidad en la región.

En conclusión, tanto el PCA como la MLR demostraron ser técnicas poderosas para el análisis de datos en sus respectivos dominios. El PCA facilitó la identificación de patrones y la reducción de dimensionalidad en datos de alta variabilidad, mientras que la MLR proporcionó una clasificación precisa y útil para la toma de decisiones en salud pública. Los hallazgos de este artículo destacan la importancia de estas técnicas en la ciencia de datos y su potencial para abordar problemas complejos de manera efectiva.

Referencias Bibliográficas

  • Abdi, H., & Williams, L. J. (2010). Principal component analysis. Wiley Interdisciplinary Reviews: Computational Statistics, 2(4), 433-459.

  • Agresti, A. (2002). Categorical Data Analysis (2nd ed.). Wiley. ISBN 978-0471360933.

  • Brage Escalona, M. (2020). Análisis de datos categóricos: regresión logística y multinomial. Universidad de Lagunas

  • Hair, J. F., Black, W. C., Babin, B. J., & Anderson, R. E. (2014). Multivariate Data Analysis. Pearson Education Limited.

  • Hosmer, D. W., Lemeshow, S., & Sturdivant, R. X. (2013). Applied Logistic Regression (3rd ed.). Wiley. ISBN 978-0470582473.

  • Jackson, J. E. (1991). A User’s Guide to Principal Components. Wiley. ISBN 978-0471622673.

  • James, G., Witten, D., Hastie, T., & Tibshirani, R. (2013). An Introduction to Statistical Learning with Applications in R. Springer.

  • Jolliffe, I. T. (2002). Principal Component Analysis (2nd ed.). Springer. ISBN 978-0387954424.

  • Kassambara, A. & Mundt, F. (2020). factoextra: Extract and Visualize the Results of Multivariate Data Analyses.

  • Kleinbaum, D. G., & Klein, M. (2010). Logistic Regression: A Self-Learning Text (3rd ed.). Springer. ISBN 978-1441917416.

  • Lantz, B. (2015). Machine Learning with R. Packt Publishing Ltd.

  • LLinás, H. (2024). https://rpubs.com/hllinas/R_Analisis_Multivariado_toc

  • Long, J. S., & Freese, J. (2014). Regression Models for Categorical Dependent Variables Using Stata (3rd ed.). Stata Press. ISBN 978-1597181112.

  • Pearson, K. (1901). On Lines and Planes of Closest Fit to Systems of Points in Space. Philosophical Magazine, 2(11), 559-572.