Técnicas Multivariadas para la Predicción tiempos en una empresa Industrial

Objetivo general

Contribuir a la mejora del proceso de asignación de tiempos correctivos y de emergencia mediante el uso de técnicas multivariadas en proyectos dedicados al mantenimiento industrial.

Paquetes necesarios

  • tidyverse: tidyverse es un conjunto de paquetes de R diseñados para el análisis de datos. Incluye una serie de paquetes, como ggplot2, dplyr, tidyr, entre otros, que proporcionan herramientas para manipular, visualizar y modelar datos de manera efectiva y coherente. El enfoque principal del tidyverse es promover un flujo de trabajo coherente y fácil de entender, centrado en la manipulación y visualización de datos.

  • readxl: El paquete readxl de R es una herramienta esencial para la importación de datos desde archivos de Excel directamente a R. Con una interfaz intuitiva y eficiente, readxl permite a los usuarios cargar hojas de cálculo completas o rangos específicos de celdas de manera rápida y sencilla. Al facilitar la lectura de archivos de Excel en R, este paquete agiliza el proceso de análisis de datos, permitiendo a los analistas trabajar con conjuntos de datos almacenados en Excel de manera efectiva y sin necesidad de utilizar software adicional.

  • DT: DT es un paquete para visualización interactiva de datos en entornos web. Permite convertir objetos de datos en R, como matrices o data frames, en tablas interactivas en páginas HTML. Esto facilita la exploración y análisis de datos, ya que los usuarios pueden utilizar funcionalidades avanzadas como filtrado, paginación y ordenación.

  • lmtest: lmtest proporciona herramientas para realizar pruebas de hipótesis y diagnósticos en modelos de regresión lineal en R. Incluye funciones para realizar pruebas de especificación, heterocedasticidad, autocorrelación, entre otras, lo que ayuda a evaluar la validez de los supuestos en los modelos de regresión lineal.

  • car: car es un paquete que ofrece varias funciones para el análisis de regresión en R. Incluye herramientas para realizar análisis de regresión lineal, como el cálculo de intervalos de confianza, diagnósticos de regresión, pruebas de influencia, entre otros.

  • lme4: lme4 es un paquete utilizado para ajustar modelos lineales mixtos en R. Permite especificar y ajustar modelos lineales mixtos con efectos fijos y aleatorios, lo que es útil para analizar datos con estructuras de correlación complejas, como datos longitudinales o datos agrupados.

  • broom.mixed: broom.mixed es una extensión del paquete broom que proporciona herramientas para trabajar con modelos lineales mixtos en R. Permite resumir, visualizar y comparar modelos lineales mixtos de una manera limpia y coherente, lo que facilita la interpretación de los resultados.

  • lubridate: lubridate es un paquete diseñado para manipular fechas y horas en R de manera fácil y eficiente. Proporciona funciones intuitivas para realizar operaciones comunes con fechas, como extracción de componentes de fecha, cálculo de diferencias de tiempo y manipulación de zonas horarias.

  • aTSA: aTSA es un paquete utilizado para el análisis de series temporales en R. Proporciona funciones para ajustar modelos de series temporales, realizar diagnósticos de modelos y pronosticar valores futuros.

  • MuMIn: MuMIn es un paquete utilizado para la selección de modelos en análisis de regresión en R. Proporciona funciones para calcular criterios de información, como AIC y BIC, para una serie de modelos y seleccionar el modelo óptimo en función de estos criterios.

library(tidyverse)
library(readxl)
library(DT)
library(lmtest)
library(car)
library(lme4)
library(broom.mixed)
library(lubridate)
library(aTSA)
library(MuMIn)

Base de datos a utilizar

La base de datos a utilizar en este trabajo tiene un total de 36795 obs y 11 variables sobre las actividades de reparación entre las cuales podemos encontrar las siguientes:

  • Epoca del año: Indica la época del año, siendo el invierno un período en el que se gasta más tiempo debido a las condiciones climáticas.

  • Cumplimiento de la estrategia: Representa la ejecución de la estrategia de mantenimiento preventivo, siendo crucial cumplir con la estrategia para evitar correctivos.

  • Programa de mantenimiento: Mensualmente se genera un programa que incluye órdenes de mantenimiento correctivas y preventivas. A veces, no se cumple debido a emergencias que requieren atención inmediata.

  • Ready Backlog: Indica la carga de trabajo en semanas, siendo un indicador de trabajos pendientes y la necesidad de más personal.

  • HH Actv Generales: Horas dedicadas a actividades generales como charlas HSE, capacitaciones, etc.

  • HH En la Maquina: Horas reales dedicadas a trabajos en la máquina. Es la variable principal a predecir, especialmente en trabajos correctivos de emergencia.

  • Otras HH: Horas dedicadas a actividades propias del mantenimiento, como apertura de permisos, aislamientos, etc.

  • TipoMantenimiento: Se clasifica en preventivo, correctivo normal y correctivo de emergencia. El enfoque principal es predecir el tiempo necesario para el mantenimiento correctivo, especialmente el de emergencia.

  • Disciplina: Indica los equipos de trabajo que ejecutan los mantenimientos, permitiendo predicciones por equipo.

  • fe.CreadaOrden y fe.Ejecutada: Fechas de creación y ejecución de la orden, respectivamente.

datos <- readxl::read_excel("../datos/DataTFM.XLSX", 
                            sheet = "Base de datos") |> na.omit()

## organizamos la data de acuerdo a le fecha de ejecución

datos <- datos[order(datos$fe.Ejecutada), ]

### creamos una variable con las fechas de ejecución y orden de creación
datos$dias_para_diferencia <- difftime(datos$fe.Ejecutada, 
                                       datos$Fe.CreadaOrden,
                                       units = "days") |> as.numeric()


datos[, c(2:7, 12)] <- round(datos[, c(2:7, 12)], 4)

head(datos, 5) |> datatable(
              extensions = "Buttons",
              options = list(
                pageLength = 5, 
                autoWidth = TRUE, dom = 'Bfrtip',
                buttons = list(
                  list(extend = "excel",
                       text = "Descargar datos",
                       filename = "datos",
                       exportOptions = list(
                         modifier = list(page = "all")))),
              selection = "single"))

Preparando los datos

Antes de plantear los diferentes modelos multivariados debemos asegurarnos de que la base de datos este correctamente adecuada. Sin valores vacíos o NA, con poca o nula presencia de valores atípicos en la variables, Sin presencia de correlación alta entre las variables etc.

Eliminando los valores vacios

Utilizamos la función na.omit para eliminar todas las filas con valores vacios.

## eliminamos las columnas con valores vacios o NA
datos <- na.omit(datos)

Valores atípicos

Los datos atípicos, conocidos como outliers en inglés, son valores que se encuentran significativamente fuera del rango esperado en una variable del conjunto de datos. En nuestro contexto pueden haber maquinas que conlleven una cantidad significativa de horas mucho mayor a las demás, para analizarlas utilizamos gráficos de caja.

par(mfrow = c(1, 4))


boxplot(datos$`HH Actv Gnerales`, 
        main = "HH Actv Gnerales")


boxplot(datos$`HH En la Maquina`, 
        main = "HH En la Maquina")


boxplot(datos$`Otras HH`,
        main = "Otras HH")


boxplot(datos$dias_para_diferencia,
        main = "Dias de diferencia")

Los puntos observados en los gráficos de caja representan los datos atípicos, se observa que hubo múltiples trabajos en donde las horas utilizadas para reparar las maquinas eran por mucho mayor a los rangos normales obtenidos al analizar los cuartiles.

¿Como tratar los valores atipicos?

El método, conocido como filtro de Hampel, se basa en la identificación de valores atípicos dentro de un conjunto de datos mediante la delimitación de un intervalo específico.

Intervalo = [ mediana(X) - 3 * MAD(X) ; mediana(X) + 3 * MAD(X) ]

hayamos el intervalo utilizando nuestra variable dependiente

limite_inferior <-  median(datos$`HH En la Maquina`) - 3 * 
  mad(datos$`HH En la Maquina`, constant = 1)

limite_inferior
[1] -8
limite_superior <-  median(datos$`HH En la Maquina`) + 3 * 
  mad(datos$`HH En la Maquina`, constant = 1)

limite_superior
[1] 22

Una vez definimos las margenes para el filtro extraemos las filas consideradas atípicas:

atipicos <- which(datos$`HH En la Maquina` <
                    limite_inferior | 
                    datos$`HH En la Maquina` > 
                    limite_superior)


### vemos la cantidad de valores atípicos 
atipicos |> length()
[1] 5251

De acuerdo a los resultados del filtro de hampel existen 5251 observaciones en donde las horas utilizadas para reparar la maquina son atípicas y muy diferentes a los datos esperados.

## filtramos los valores atípicos
datos <- datos[-atipicos,  ]

par(mfrow = c(1, 4))


boxplot(datos$`HH Actv Gnerales`, 
        main = "HH Actv Gnerales")


boxplot(datos$`HH En la Maquina`, 
        main = "HH En la Maquina")


boxplot(datos$`Otras HH`,
        main = "Otras HH")

boxplot(datos$dias_para_diferencia,
        main = "Dias de diferencia")

Al aplicar el filtro de hampel, el gráfico de caja de la variable que representa las horas reales utilizadas en la maquina refleja una menor cantidad de valores atípicos.

Ahora aplicamos el mismo procedimiento para las otras 3 variables.

## creamos una función para extraer el valor atipico

atipicos <- function(x){
  
## encontramos los valores atipicos para la variable que representa horas generales

limite_inferior <-  median(x) - 3 * 
  mad(x, constant = 1)

limite_superior <-  median(x) + 3 * 
  mad(x, constant = 1)


## encontramos los valores atipicos
atipicos <- which(x < limite_inferior | 
                   x  > limite_superior)

  return(atipicos)
}


## filtramos las horas generales
datos <- datos[-atipicos(datos$`HH Actv Gnerales`), ]

## filtramos por otras horas h

datos <- datos[-atipicos(datos$`Otras HH`), ]

## filtramos por dias generales

datos <- datos[-atipicos(datos$dias_para_diferencia), ]

Vemos los resultados luego de aplicar los filtros:

par(mfrow = c(1, 4))


boxplot(datos$`HH Actv Gnerales`, 
        main = "HH Actv Gnerales")


boxplot(datos$`HH En la Maquina`, 
        main = "HH En la Maquina")


boxplot(datos$`Otras HH`,
        main = "Otras HH")

boxplot(datos$dias_para_diferencia,
        main = "Dias de diferencia")

Se observa una menor dispersión y una menor cantidad de valores atípicos.

Modelos multivariados

Buscamos anticipar los tiempos de reparación de máquinas que presentan fallas dentro de márgenes de tiempo específicos (diarios, semanales, mensuales), centrándonos principalmente en prever el número de horas requeridas para el mantenimiento correctivo de las máquinas.

La variedad de técnicas multivariables disponibles nos brinda la capacidad de modelar nuestra variable dependiente a través de múltiples enfoques, con el objetivo de encontrar aquel que mejor se ajuste a la naturaleza de nuestros datos.

Las técnicas que utilizaremos para modelar nuestra variable dependiente son las siguientes:

  • Regresión Múltiple

Este modelo examina la relación entre una variable dependiente y dos o más variables independientes. Es útil para entender cómo las variables predictoras influyen en la variable de interés.

\[ \Large Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \ldots + \beta_p X_p + \varepsilon \]

  • \(Y\) es la variable dependiente que estamos tratando de predecir.

  • \(\beta_0\) es el intercepto o término constante.

  • \(\beta_1, \beta_2, \ldots, \beta_p\) son los coeficientes asociados con las variables predictoras \(X_1, X_2, \ldots, X_p\), respectivamente.

  • \(\varepsilon\) es el término de error, que representa la variabilidad no explicada por el modelo.

  • Modelos Lineales Mixtos (LMM)

Los Modelos Lineales Mixtos (LMM), también conocidos como Modelos Mixtos o Modelos de Efectos Mixtos, son una extensión de los Modelos Lineales Generales (GLM) que permiten manejar datos estructurados de manera jerárquica o con estructuras de correlación específicas. Los LMM son especialmente útiles cuando se trabaja con datos que muestran agrupamiento o repetición, como datos longitudinales, datos de paneles, datos de medidas repetidas, o datos de experimentos con estructura jerárquica (por ejemplo, estudiantes agrupados en escuelas).

En nuestro caso tenemos una variable que agrupa por disciplina las diferentes horas utilizadas para realizar el mantenimiento, este tipo de modelos nos pueden ayudar a modelar de mejor manera esta interacción.

\[ \Large y_{ij} = \beta_0 + \beta_1 \cdot x_{ij} + u_{j} + \varepsilon_{ij} \]

  • Modelos Lineales Generalizados Mixtos (GLMM)

Los Modelos Lineales Generalizados Mixtos (GLMM) son una extensión de los Modelos Lineales Mixtos (LMM) que incorporan una estructura de enlace no lineal, lo que los hace adecuados para modelar respuestas que no siguen una distribución normal.

\[ \Large g(\mu_{ij}) = \beta_0 + \beta_1 \cdot x_{ij} + u_{j} \] Los modelos lineales generalizados mixtos nos brindan la capacidad de modelar la variable dependiente utilizando la distribución Poisson o la binomial negativa. En esta ocasión, optaremos por emplear la distribución Poisson.

  • Arima

Los modelos ARIMA (Autoregressive Integrated Moving Average) son una clase de modelos estadísticos utilizados para analizar y predecir series temporales. Estos modelos combinan componentes autoregresivos, diferenciación y componentes de media móvil para capturar patrones temporales y estructuras en los datos.

Los modelos ARIMA se denotan como ARIMA(p, d, q), donde:

p: El orden del componente autorregresivo, que indica el número de rezagos incluidos en el modelo. d: El orden de diferenciación, que indica el número de veces que se ha diferenciado la serie temporal para hacerla estacionaria. q: El orden del componente de media móvil, que indica el número de términos de error incluidos en el modelo.

La fórmula general de un modelo ARIMA es:

\[ Y_t = c + \phi_1 Y_{t-1} + \phi_2 Y_{t-2} + \ldots + \phi_p Y_{t-p} + \varepsilon_t - \theta_1 \varepsilon_{t-1} - \theta_2 \varepsilon_{t-2} - \ldots - \theta_q \varepsilon_{t-q} \]

Supuestos de los modelos multivariados

Los modelos multivariados se basan en múltiples supuestos, como los siguientes:

Linealidad: Se asume que la relación entre las variables predictoras y la variable dependiente es lineal. Esto implica que los cambios en las variables predictoras están asociados con cambios proporcionales en la variable de interés.

Independencia de errores: Se asume que los errores (residuos) de la regresión no están correlacionados entre sí. En otras palabras, los errores no muestran patrones predecibles y no están influenciados por los errores anteriores.

Homocedasticidad: La varianza de los errores debe ser constante en todos los niveles de las variables predictoras. Esto significa que la dispersión de los errores es uniforme en toda la gama de valores de las variables predictoras.

Normalidad de errores: Se asume que los errores de la regresión se distribuyen normalmente. Esto significa que los residuos siguen una distribución normal con una media de cero.

Independencia de variables predictoras: Las variables predictoras deben ser independientes entre sí. La presencia de multicolinealidad, donde las variables predictoras están altamente correlacionadas entre sí, puede afectar negativamente la interpretación de los coeficientes de regresión.

Pasos para aplicar nuestros modelos

Primeramente filtramos la base de datos, seleccionando únicamente las filas en que el mantenimiento sea correctivo:

## filtramos por el tipo de mantenimiento preventivo
datos <- datos[datos$TipoMantenimiento == "Preventivo", ]

Una vez seleccionamos únicamente los mantenimientos preventivos debemos extraer de la base de datos, la información diaria, semanal, mensual

Extraemos la información de manera diaria

### creamos 
diario <- datos %>%
  group_by(fe.Ejecutada, Disciplina, EpocaAño) %>%
  summarize(
    Cumplimiento_Estrategia =
      mean(`Cumplimiento estrategia Mtto`),
    Cumplimiento_Programa = mean(CumplimientoProgramaMtto),
    Ready_Backlog = mean(ReadyBAcklog),
    HH_Actv_Gnerales = mean(`HH Actv Gnerales`),
    HH_En_la_Maquina = mean(`HH En la Maquina`),
    Otras_HH = mean(`Otras HH`)
  )

## eliminamos posibles valores atipicos de las variables numericas


for(j in colnames(diario)[4:9]){
  
  diario <- diario[-atipicos(diario[[j]]), ]
}



head(diario, 5) |> datatable(
              extensions = "Buttons",
              options = list(
                pageLength = 5, 
                autoWidth = TRUE, dom = 'Bfrtip',
                buttons = list(
                  list(extend = "excel",
                       text = "Descargar datos",
                       filename = "datos",
                       exportOptions = list(
                         modifier = list(page = "all")))),
              selection = "single"))

Extraemos la información de manera semana

## creamos una variable de año y semana

## usamos las funciones de week y year

datos$semana <- paste0(year(datos$fe.Ejecutada), "-",
                       week(datos$fe.Ejecutada))


### creamos 
semana <- datos %>%
  group_by(semana, Disciplina, EpocaAño) %>%
  summarize(
    Promedio_Cumplimiento_Estrategia = mean(`Cumplimiento estrategia Mtto`),
    Promedio_Cumplimiento_Programa = mean(CumplimientoProgramaMtto),
    Promedio_Ready_Backlog = mean(ReadyBAcklog),
    Promedio_HH_Actv_Gnerales = mean(`HH Actv Gnerales`),
    Promedio_HH_En_la_Maquina = mean(`HH En la Maquina`),
    Promedio_Otras_HH = mean(`Otras HH`)
  )


head(semana, 5) |> datatable(
              extensions = "Buttons",
              options = list(
                pageLength = 5, 
                autoWidth = TRUE, dom = 'Bfrtip',
                buttons = list(
                  list(extend = "excel",
                       text = "Descargar datos",
                       filename = "datos",
                       exportOptions = list(
                         modifier = list(page = "all")))),
              selection = "single"))

Extraemos la información de manera mensual

## creamos una variable de año y mes

## usamos las funciones de month y year

datos$mes <- paste0(year(datos$fe.Ejecutada), "-",
                        month(datos$fe.Ejecutada))


### creamos 
mes <- datos %>%
  group_by(mes, Disciplina, EpocaAño) %>%
  summarize(
    Promedio_Cumplimiento_Estrategia = mean(`Cumplimiento estrategia Mtto`),
    Promedio_Cumplimiento_Programa = mean(CumplimientoProgramaMtto),
    Promedio_Ready_Backlog = mean(ReadyBAcklog),
    Promedio_HH_Actv_Gnerales = mean(`HH Actv Gnerales`),
    Promedio_HH_En_la_Maquina = mean(`HH En la Maquina`),
    Promedio_Otras_HH = mean(`Otras HH`)
  )



head(mes, 5) |> datatable(
              extensions = "Buttons",
              options = list(
                pageLength = 5, 
                autoWidth = TRUE, dom = 'Bfrtip',
                buttons = list(
                  list(extend = "excel",
                       text = "Descargar datos",
                       filename = "datos",
                       exportOptions = list(
                         modifier = list(page = "all")))),
              selection = "single"))

Aplicando los modelos para predecir de manera diaria

Modelo regresión lineal

# modelos de regresión

## se omiten las variables fecha de creación y fecha de ejecución  
modelo_lineal <- lm(`HH_En_la_Maquina` ~ .,
                    data = diario[, 2:9] |> na.omit()) 


summary(modelo_lineal)

Call:
lm(formula = HH_En_la_Maquina ~ ., data = na.omit(diario[, 2:9]))

Residuals:
   Min     1Q Median     3Q    Max 
-4.181 -1.043 -0.167  0.954  6.029 

Coefficients:
                        Estimate Std. Error t value             Pr(>|t|)    
(Intercept)              23.9668    19.1412    1.25               0.2111    
DisciplinaInstrumentos    1.3441     0.2421    5.55       0.000000044668 ***
DisciplinaLinea de Mtto  -0.7423     0.2596   -2.86               0.0044 ** 
DisciplinaMecanica        0.8794     0.2607    3.37               0.0008 ***
DisciplinaMecanica CBM    1.5512     0.2317    6.69       0.000000000055 ***
DisciplinaMecanica VAL    3.0066     0.3455    8.70 < 0.0000000000000002 ***
DisciplinaPozoz           0.7261     0.3947    1.84               0.0664 .  
EpocaAñoVerano           -0.2954     0.1540   -1.92               0.0556 .  
Cumplimiento_Estrategia -19.1321    19.7846   -0.97               0.3340    
Cumplimiento_Programa    -3.0941     6.8707   -0.45               0.6527    
Ready_Backlog             0.0602     0.2206    0.27               0.7850    
HH_Actv_Gnerales          2.6801     0.3908    6.86       0.000000000019 ***
Otras_HH                  1.7714     0.1736   10.20 < 0.0000000000000002 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.66 on 533 degrees of freedom
Multiple R-squared:  0.545, Adjusted R-squared:  0.534 
F-statistic: 53.1 on 12 and 533 DF,  p-value: <0.0000000000000002

Se observa que las siguientes variables:

Cumplimiento_Estrategia (p-valor = 0.834) Cumplimiento_Programa (p-valor = 0.972) Ready_Backlog (p-valor = 0.351)

No son significativas al nivel de 5% de significancia, lo que significa que no se puede rechazar la hipótesis nula de que el coeficiente asociado a estas variables es igual a cero, por lo tanto perjudica incluirlas en el modelo.

Planteamos el modelo sin dichas variables o categorias:

# modelos de regresión

## se omiten las variables fecha de creación y fecha de ejecución  
modelo_lineal <- lm(`HH_En_la_Maquina` ~ .,
                    data = diario[, -c(1, 4:6)] ) 


summary(modelo_lineal)

Call:
lm(formula = HH_En_la_Maquina ~ ., data = diario[, -c(1, 4:6)])

Residuals:
   Min     1Q Median     3Q    Max 
-4.139 -1.089 -0.126  0.949  6.119 

Coefficients:
                        Estimate Std. Error t value             Pr(>|t|)    
(Intercept)                2.270      0.229    9.91 < 0.0000000000000002 ***
DisciplinaInstrumentos     1.350      0.241    5.59       0.000000035835 ***
DisciplinaLinea de Mtto   -0.739      0.259   -2.85              0.00450 ** 
DisciplinaMecanica         0.885      0.260    3.40              0.00072 ***
DisciplinaMecanica CBM     1.546      0.231    6.69       0.000000000057 ***
DisciplinaMecanica VAL     3.025      0.344    8.79 < 0.0000000000000002 ***
DisciplinaPozoz            0.736      0.394    1.87              0.06213 .  
EpocaAñoVerano            -0.354      0.143   -2.46              0.01404 *  
HH_Actv_Gnerales           2.709      0.389    6.96       0.000000000010 ***
Otras_HH                   1.767      0.173   10.21 < 0.0000000000000002 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.66 on 536 degrees of freedom
Multiple R-squared:  0.543, Adjusted R-squared:  0.536 
F-statistic: 70.8 on 9 and 536 DF,  p-value: <0.0000000000000002

Entendiendo el modelo

  • (Intercept): El coeficiente sugiere que, en promedio, el número de horas en la máquina aumenta en 3.271 cuando todas las demás variables son cero.

  • DisciplinaInstrumentos: Un coeficiente positivo de 0.384 sugiere que la presencia de la disciplina de Instrumentos se asocia con un aumento en el número de horas en la máquina.

  • DisciplinaLinea de Mtto: Un coeficiente negativo de -1.566 sugiere que la presencia de la disciplina de Línea de Mantenimiento está asociada con una disminución en el número de horas en la máquina.

  • DisciplinaMecanica: Un coeficiente positivo de 1.037 sugiere que la presencia de la disciplina Mecánica está asociada con un aumento en el número de horas en la máquina.

  • DisciplinaMecanica CBM: Un coeficiente positivo de 0.862 sugiere que la presencia de la disciplina Mecánica CBM está asociada con un aumento en el número de horas en la máquina.

  • DisciplinaMecanica VAL: Un coeficiente positivo de 2.803 sugiere que la presencia de la disciplina Mecánica VAL está asociada con un aumento significativo en el número de horas en la máquina.

  • DisciplinaPozoz: Un coeficiente negativo de -1.933 sugiere que la presencia de la disciplina Pozoz está asociada con una disminución en el número de horas en la máquina.

  • EpocaAñoVerano: Un coeficiente negativo de -0.242 sugiere que la temporada de verano está asociada con una ligera disminución en el número de horas en la máquina.

  • HH_Actv_Gnerales: Un coeficiente positivo de 2.040 sugiere que un aumento en las horas de trabajo generales está asociado con un aumento en el número de horas en la máquina.

  • Otras_HH: Un coeficiente positivo de 1.693 sugiere que un aumento en las horas de otros trabajos está asociado con un aumento significativo en el número de horas en la máquina.

Comprobando supuestos

par(mfrow = c(1, 4))

plot(modelo_lineal)

Los graficos del modelo parecen mostrar que no se cumplen los supuestos de linealidad entre las variables, el grafico de q-q residuales no parece mostrar evidencia de normalidad, ademas parece existir heterocedasticidad en los residuales.

Prueba de normalidad

Prueba de Kolmogorov-Smirnov: Esta prueba es una opción para evaluar la normalidad de los datos. La función ks.test() en R puede ser utilizada para esto.

Planteamiento de Hipótesis:

  • \(H_0\): Los residuales se distribuyen de manera normal.
  • \(H_1\): Los residuales NO se distribuyen de maneran normal.
ks.test(modelo_lineal$residuals, "pnorm")

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  modelo_lineal$residuals
D = 0.12, p-value = 0.0000008
alternative hypothesis: two-sided

Se observa que el p-value es inferior al 0.05 lo que indica evidencia a favor de la hipotesis alternativa, lo que indica que en nuestro modelo los residuales no se distribuyen de manera normal.

Prueba de homocedasticidad

La prueba de Breusch-Pagan es una prueba de hipótesis utilizada para evaluar la homocedasticidad en un modelo de regresión lineal. Esta prueba se utiliza para determinar si la varianza de los errores en el modelo es constante en toda la gama de valores de las variables independientes.

Planteamiento de Hipótesis:

  • \(H_0\): La varianza de los errores es constante en toda la gama de valores de las variables independientes (homocedasticidad).

  • \(H_1\): La varianza de los errores no es constante en toda la gama de valores de las variables independientes (heterocedasticidad).

bgtest(modelo_lineal)

    Breusch-Godfrey test for serial correlation of order up to 1

data:  modelo_lineal
LM test = 2.2, df = 1, p-value = 0.1

El P-value es superir al 0.05 lo que indica evidencia a favor de la homosedasticidad, lo que indica que la varianza de los errores es constante.

Prueba de multicolinealidad

El factor de inflación de la varianza para cada variable independiente en el modelo de regresión. Un valor de VIF mayor que 10 es a menudo considerado indicativo de multicolinealidad problemática.

vif(modelo_lineal)
                  GVIF Df GVIF^(1/(2*Df))
Disciplina       1.726  6           1.047
EpocaAño         1.010  1           1.005
HH_Actv_Gnerales 1.831  1           1.353
Otras_HH         1.898  1           1.378

Ninguno de los valores de VIF parece indicar un problema grave de multicolinealidad, ya que todos son menores que 10.

Conclusiones

El modelo de regresión lineal da buenos resultados, sin embargo no cumple el supuesto de normalidad, lo que podria resultar en que el valor de los coeficientes no es real ni confiable.

Modelos Lineales Mixtos (LMM)

Planteamiento del modelo

# Ajustar el modelo lineal mixto usando el grupo de disciplina
modeloLMM <- lmer(HH_En_la_Maquina ~ EpocaAño + 
                    HH_Actv_Gnerales + 
                    Otras_HH  + (1 | Disciplina), 
                  
                  data = diario)


tidy(modeloLMM)
# A tibble: 6 × 6
  effect   group      term             estimate std.error statistic
  <chr>    <chr>      <chr>               <dbl>     <dbl>     <dbl>
1 fixed    <NA>       (Intercept)         3.22      0.488      6.60
2 fixed    <NA>       EpocaAñoVerano     -0.351     0.143     -2.45
3 fixed    <NA>       HH_Actv_Gnerales    2.70      0.388      6.95
4 fixed    <NA>       Otras_HH            1.78      0.172     10.4 
5 ran_pars Disciplina sd__(Intercept)     1.18     NA         NA   
6 ran_pars Residual   sd__Observation     1.66     NA         NA   

Al analizar los coeficientes vemos que el sentido es el mismo al aplicar el modelo de regresión lineal. Lo cual puede darnos una idea del verdadero valor de los coeficientes.

Comprobando supuestos

Normalidad

Evaluamos la normalidad de la misma manera en que lo hicimos anteriormente.

Prueba de Kolmogorov-Smirnov: Esta prueba es una opción para evaluar la normalidad de los datos. La función ks.test() en R puede ser utilizada para esto.

Planteamiento de Hipótesis:

  • \(H_0\): Los residuales se distribuyen de manera normal.
  • \(H_1\): Los residuales NO se distribuyen de maneran normal.
resid(modeloLMM) |> ks.test("pnorm")

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  resid(modeloLMM)
D = 0.12, p-value = 0.0000009
alternative hypothesis: two-sided

Se observa que el p-value es inferior al 0.05 lo que indica evidencia a favor de la hipotesis alternativa, lo que indica que en nuestro modelo los residuales no se distribuyen de manera normal.

Homocedasticidad

plot(modeloLMM)

Al analizar el grafico de los valores predichos frente a los residuales del modelo parecer haber evidencia de homosedasticidad, lo que llevaria a aceptar el supuesto de homocedasticidad. Es decir la varianza de los residuales de nuestro modelo es homogénea.

Multicolinealidad

vif(modeloLMM)
        EpocaAño HH_Actv_Gnerales         Otras_HH 
           1.001            1.297            1.297 

El factor de inflación de la varianza para cada variable independiente en el modelo de regresión. Un valor de VIF mayor que 10 es a menudo considerado indicativo de multicolinealidad problemática.

Modelos Lineales Generalizados Mixtos (GLMM)

Planteamiento del modelo

# Ajustar el modelo glmm usando el grupo de disciplina 

## con la distribución poisson y una aproximación de 15
modeloGLMM <- glmer(HH_En_la_Maquina ~ EpocaAño + 
                    HH_Actv_Gnerales + 
                    Otras_HH  + (1 | Disciplina), 
                    data = diario,
                    family = poisson(link = "log"), nAGQ = 15)

Comprobando supuestos

plot(modeloGLMM)

Parece haber evidencia a favor de la hipótesis homocedastica

Modelo arima

Metodologia de box jenkins

En esta etapa, se identifican los modelos potenciales para la serie de tiempo. Esto implica identificar si la serie de tiempo es estacionaria o no estacionaria, y seleccionar un modelo ARIMA (Autoregressive Integrated Moving Average) apropiado. La identificación también puede incluir la detección de estacionalidad y tendencias, y la determinación del orden de la diferencia y de los términos autorregresivos y de media móvil.

Identificando si la serie es estacionaria

Para determinar la estacionariedad de una serie temporal, recurrimos a la Prueba de Dickey-Fuller Aumentada (ADF). Esta prueba se encarga de evaluar la presencia de una raíz unitaria en la serie, lo que constituye la hipótesis nula de no estacionariedad. En caso de que se rechace esta hipótesis nula, se establece evidencia de que la serie es estacionaria.

adf.test(diario$HH_En_la_Maquina)
Augmented Dickey-Fuller Test 
alternative: stationary 
 
Type 1: no drift no trend 
     lag   ADF p.value
[1,]   0 -6.85  0.0100
[2,]   1 -4.32  0.0100
[3,]   2 -3.18  0.0100
[4,]   3 -2.43  0.0164
[5,]   4 -1.99  0.0460
[6,]   5 -1.65  0.0959
Type 2: with drift no trend 
     lag    ADF p.value
[1,]   0 -22.29    0.01
[2,]   1 -16.79    0.01
[3,]   2 -13.98    0.01
[4,]   3 -12.01    0.01
[5,]   4 -10.69    0.01
[6,]   5  -9.55    0.01
Type 3: with drift and trend 
     lag    ADF p.value
[1,]   0 -22.27    0.01
[2,]   1 -16.78    0.01
[3,]   2 -13.97    0.01
[4,]   3 -12.00    0.01
[5,]   4 -10.68    0.01
[6,]   5  -9.54    0.01
---- 
Note: in fact, p.value = 0.01 means p.value <= 0.01 

El p-value es inferior al 0.05 lo que muestra evidencia a favor de la hipotesis alternativa, es decir la serie es estacionaria lo que implica que no es necesario aplicar diferencias para nuestro modelo arima. q = 0.

Test de autocorrelación

La función acf calcula los coeficientes de autocorrelación para una serie temporal y los representa en un gráfico de barras o puntos contra el rezago. Esto nos permite identificar patrones de autocorrelación en la serie, lo que puede ser útil para identificar estacionalidad, tendencias y patrones cíclicos en los datos.

acf(diario$HH_En_la_Maquina, lag.max = 20)

Parece mostrar un numero de medias moviles igual a 1, de acuerdo al numero de rezagos significativos. por lo tanto q = 1.

Test de autocorrelación parcial

Mientras que la función de autocorrelación (ACF) muestra la correlación entre una serie temporal y sus valores rezagados, la PACF controla los efectos de los rezagos intermedios y muestra la correlación entre dos puntos separados por un número específico de intervalos de tiempo, pero sin considerar los efectos de los rezagos intermedios.

pacf(diario$HH_En_la_Maquina, lag.max = 20)

Al analizar el grafico de autocorrelación parcial el numero de autoregresivos parece ser igual a 1, p = 1.

Planteando el modelo

De acuerdo a los resultados de aplicar la metodologia de box jenkins definimos los valores para plantear el modelo arima

modelo_arima <- arima(diario$HH_En_la_Maquina, order = c(1, 0, 1))


summary(modelo_arima)
          Length Class  Mode     
coef        3    -none- numeric  
sigma2      1    -none- numeric  
var.coef    9    -none- numeric  
mask        3    -none- logical  
loglik      1    -none- numeric  
aic         1    -none- numeric  
arma        7    -none- numeric  
residuals 546    ts     numeric  
call        3    -none- call     
series      1    -none- character
code        1    -none- numeric  
n.cond      1    -none- numeric  
nobs        1    -none- numeric  
model      10    -none- list     

Seleccionando el mejor modelo

Los criterios de información son herramientas fundamentales en la selección de modelos estadísticos. Ayudan a elegir entre diferentes modelos ajustados a los datos al tener en cuenta tanto el ajuste del modelo como su complejidad.

AIC (Criterio de Información de Akaike): Desarrollado por Hirotugu Akaike, el AIC mide la calidad relativa de un modelo estadístico para un conjunto dado de datos. Cuanto menor sea el valor de AIC, mejor se considera el modelo en términos de ajuste y parsimonia.

AICc (AIC Corregido): Es una versión corregida del AIC que es especialmente útil cuando el tamaño de la muestra es pequeño en comparación con el número de parámetros del modelo. Esta corrección ayuda a evitar el sobreajuste del modelo.

BIC (Criterio de Información Bayesiano): El BIC, también conocido como Criterio de Schwarz, es similar al AIC pero penaliza más la complejidad del modelo, lo que significa que tiende a seleccionar modelos más simples entre modelos con un ajuste similar. Esto se refleja en la fórmula del BIC, donde el término de penalización es proporcional al logaritmo del tamaño de la muestra de datos.

  • AIC (Criterio de Información de Akaike): Es un criterio de selección de modelo que penaliza la complejidad del modelo. Cuanto menor sea el valor de AIC, mejor se considera el ajuste del modelo a los datos.

  • AICc (Criterio de Información de Akaike corregido): Es una versión corregida del AIC, que se recomienda usar cuando el tamaño muestral es pequeño en comparación con el número de parámetros del modelo. Similar al AIC, un valor menor de AICc indica un mejor ajuste del modelo.

  • BIC (Criterio de Información Bayesiano): Similar al AIC, el BIC es un criterio de selección de modelo que penaliza la complejidad del modelo. Sin embargo, el término de penalización es más severo en el BIC que en el AIC. En la comparación de modelos, se prefiere el modelo con el valor de BIC más bajo.

En este caso, los valores más bajos de AIC, AICc y BIC indican que el modelo GLMM (Modelo Lineal Mixto Generalizado) es el que mejor se ajusta a los datos en comparación con los otros modelos evaluados.