El conjunto de datos extraídos de manera simulada con inteligencia artificial generativa,representa la evaluación de la calidad del servicio en una organización, considerando factores operativos, humanos y contextuales que influyen en la percepción del cliente, son alrededor de 2000 registros. Todas las variables del conjunto de datos son de tipo numérico, por lo que no es necesario algún tipo de preparación de variables o transformarlas; estas son las variables independientes.
Se puede percibir de manera general que en este conjunto de datos, existen variable relevantes como tiempo_respuesta, satisfaccion_cliente, numero_quejas, capacitacion_empelado, disponibilidad_servico; probablemente existan variables muy correlacionadas y/o colineales como tiempo_respuesta_2, satisfaccion_2; tal vez existan variables derivadas de otras por lo que puedan estar correlacioandas indice_servicio, eficiencia_operativa y posiblemnnte existan variables poco deterministas para las predicción de la calidad de servicio como clima, dia_semana.
La variable dependiente es calidad_servicio como un indicador global de un valor numérico posiblemente encuestado y calculado que identifica la calidad del servicio percibida por el cliente; integra múltiples factores como eficiencia, atención, disponibilidad y experiencia del servicio, entre otros.
El documento markdown se puede encontrar en el servicio rpubs.com en el espacio del autor https://rpubs.com/rpizarrog/1427800.
Los datos para su descarga se encuentran en el servico gituh.com https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/datos/calidad%20en%20el%20servicio%20para%20Multiple%20Lasso%20y%20Ridege.csv.
Las funciones se pueden encontrar en **pendiente
Implementar, evaluar un modelo de regresión lineal múltiple así como compararlo con los modelos generalizados y regulados como Lasso y Ridge que permitan predecir calidad en el servico de una organización.
Los datos deberán estar particionados en 70% para datos de entrenamiento y 30% para datos de validación
El modelo será óptimo si satisface los postulados de la regresión y si el valor de r square adjustado está por encima del 85%.
# install.packages("readr")
# install.packages("tidyverse")
# install.packages("psych")
# install.packages("dplyr")
# install.packages("ggplot2")
# install.packages("caret")
# install.packages("broom")
# install.packages("lmtest")
# install.packages("car")
# install.packages("stats")
# install.packages("flextable")
# install.packages("officer")
# install.packages("patchwork")
# install.packages("performance")
# install.packages("see")
# install.packages("car")
# install.packages("nortest")
# install.packages("lmtest")
library(readr) # cargar datos datos
library(tidyverse) # Para manipular
library (psych) # Para descriobir datos
library(dplyr) # Manipulación de datos
library(ggplot2) # gráficos
library(caret) # partición de datos
library(broom) # tidy modelos
library(lmtest) # Durbin-Watson
library(car) # VIF y diagnóstico
library(stats) # lm, shapiro.test
library(patchwork) # Graficos organizados en columnas renglones
# Tablas compatibles con Word
library(flextable)
library(officer)
library(performance) # Para evaluar postulados de modelos
library(see) # Para evaluar postulados de modelos dependencia de performance
library(car) # Para verificar postulados de los modelos
library(nortest) # Para pruebas de normalidad Anderson Darlin
library(lmtest) # Para pruebas de homocedasticidad Breusch–Pagan y prueba de White
Se cargan funciopnes preparadas para el caso que se encuentra en la dirección URL del portal de github.com.
# source("../funciones/funciones para regresiOn lineal mUltiple.R")
url <- "https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/R%20MarkDown/funciones/funciones%20para%20regresiOn%20lineal%20mUltiple.R"
source(url)
# datos <- f_cargar_datos("../datos/datos_frijol.csv")
url <- "https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/datos/datos_frijol.csv"
datos <- f_cargar_datos(url)
Con la función f_visualizar_head_tail_reducido_word(), se presentan los primeros y últimos registros, además de las primeras 4 y últimas 4 columnas del conjunto de datos.
f_visualizar_head_tail_reducido_word(datos)
temperatura | humedad | precipitacion | nitrogeno | ... | horas_sol | tipo_suelo_arenoso | tipo_suelo_franco | calidad_frijol |
|---|---|---|---|---|---|---|---|---|
23.7 | 62.41 | 115.66 | 126.84 | ... | 9 | FALSE | FALSE | 267 |
20.82 | 47.46 | 126.49 | 85.05 | ... | 9 | TRUE | FALSE | 209 |
25.93 | 76.44 | 122.39 | 82.71 | ... | 7 | TRUE | FALSE | 241 |
24.96 | 63.91 | 106.36 | 99 | ... | 7 | FALSE | FALSE | 236 |
29.35 | 52.56 | 77.93 | 136.32 | ... | 9 | TRUE | FALSE | 260 |
25.89 | 41.49 | 111.89 | 80.13 | ... | 6 | FALSE | FALSE | 222 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
25.19 | 57.35 | 99.24 | 141.5 | ... | 8 | TRUE | FALSE | 272 |
26.8 | 47.17 | 128.42 | 132.78 | ... | 9 | FALSE | FALSE | 258 |
32.07 | 53.04 | 70.02 | 54.24 | ... | 9 | TRUE | FALSE | 214 |
24.5 | 57.82 | 122.67 | 113.28 | ... | 7 | FALSE | TRUE | 243 |
29.48 | 71.13 | 73.75 | 124.28 | ... | 9 | TRUE | FALSE | 246 |
27.26 | 53.38 | 111.98 | 106.29 | ... | 8 | FALSE | FALSE | 237 |
Convertir las variables que no son numéricas a tipo factor, esto significa convertir a valores categóricos cuando son de tipo caracter. Para estos datos, los valores lógicos TRUE y FALSE se convierten a valores 1 y 0 respectivamente, esto para facilitar la construcción del modelo. Se utiliza la funci[on preparada f_convertir_factor() y toda vez preparados los datos se dejan en la variable llamada datos_limpios.
datos_limpios <- f_convertir_factor(datos)
Con la función f_describir_datos() se muestran los estad[siticos de las variables num[ericas y con la función summary(), se observa en modo consola los estadísticos de las variables no numéricas del conjunto de datos.
f_describir_datos(datos_limpios)
## $describe
## vars n mean sd median trimmed mad min max
## temperatura 1 1200 25.18 3.13 25.18 25.19 3.02 14.60 35.83
## humedad 2 1200 59.77 11.62 60.00 59.74 15.16 40.02 79.99
## precipitacion 3 1200 100.80 20.30 100.90 100.86 20.59 32.11 164.30
## nitrogeno 4 1200 99.49 28.86 99.88 99.49 37.84 50.02 149.66
## fosforo 5 1200 64.52 20.12 65.50 64.43 25.32 30.18 99.93
## materia_organica 6 1200 3.04 1.14 3.00 3.04 1.43 1.01 5.00
## horas_sol 7 1200 7.98 1.20 8.00 7.97 1.48 6.00 10.00
## tipo_suelo_arenoso 8 1200 0.34 0.47 0.00 0.30 0.00 0.00 1.00
## tipo_suelo_franco 9 1200 0.34 0.47 0.00 0.30 0.00 0.00 1.00
## calidad_frijol 10 1200 237.23 21.45 238.00 237.30 22.24 174.00 300.00
## range skew kurtosis se
## temperatura 21.23 -0.01 0.21 0.09
## humedad 39.97 0.01 -1.22 0.34
## precipitacion 132.19 -0.04 -0.17 0.59
## nitrogeno 99.64 0.00 -1.22 0.83
## fosforo 69.75 0.00 -1.19 0.58
## materia_organica 3.99 -0.01 -1.18 0.03
## horas_sol 4.00 0.05 -0.99 0.03
## tipo_suelo_arenoso 1.00 0.67 -1.55 0.01
## tipo_suelo_franco 1.00 0.69 -1.52 0.01
## calidad_frijol 126.00 -0.03 -0.47 0.62
##
## $structure
## [1] "'data.frame':\t1200 obs. of 10 variables:\n $ temperatura : num 23.7 20.8 25.9 25 29.4 ...\n $ humedad : num 62.4 47.5 76.4 63.9 52.6 ...\n $ precipitacion : num 115.7 126.5 122.4 106.4 77.9 ...\n $ nitrogeno : num 126.8 85 82.7 99 136.3 ...\n $ fosforo : num 73.3 33.4 65.8 65.7 62.4 ...\n $ materia_organica : num 3.11 3.31 1.87 2.86 3.83 4 4.37 2.96 1.91 4.02 ...\n $ horas_sol : num 9 9 7 7 9 6 8 9 8 10 ...\n $ tipo_suelo_arenoso: num 0 1 1 0 1 0 0 0 0 0 ...\n $ tipo_suelo_franco : num 0 0 0 0 0 0 0 1 1 1 ...\n $ calidad_frijol : num 267 209 241 236 260 222 241 230 234 271 ..."
summary(datos_limpios$tipo_suelo_arenoso)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 0.00 0.00 0.34 1.00 1.00
summary(datos_limpios$tipo_suelo_franco)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000 0.0000 0.0000 0.3367 1.0000 1.0000
Se particionan los datos 70% para datos de entrenamiento y 30% para datos de validación llamando a la función f_particonar_datos(); luego se presentan en las TABLAS los primeros y [ultimnos regisotrs de ambas particones
particion <- f_particionar_datos(datos_limpios)
datos_entrenamiento <- particion$datos_entrenamiento
datos_validacion <- particion$datos_validacion
f_visualizar_head_tail_reducido_word(datos_entrenamiento)
temperatura | humedad | precipitacion | nitrogeno | ... | horas_sol | tipo_suelo_arenoso | tipo_suelo_franco | calidad_frijol |
|---|---|---|---|---|---|---|---|---|
23.12 | 70.15 | 77.78 | 130.4 | ... | 6 | 1 | 0 | 256 |
25.25 | 40.82 | 65.57 | 132.1 | ... | 10 | 0 | 0 | 226 |
20.99 | 45.87 | 112.56 | 66.65 | ... | 10 | 0 | 1 | 197 |
20 | 44.21 | 102.47 | 73.24 | ... | 7 | 1 | 0 | 222 |
18.76 | 75.74 | 103.74 | 64.51 | ... | 6 | 0 | 1 | 206 |
29.95 | 64.26 | 96.32 | 121.77 | ... | 7 | 0 | 1 | 257 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
30.32 | 45.12 | 115.53 | 56.68 | ... | 6 | 0 | 1 | 222 |
30.47 | 49.58 | 88.7 | 92.51 | ... | 7 | 1 | 0 | 214 |
17.23 | 71.43 | 128.84 | 116.46 | ... | 8 | 1 | 0 | 260 |
19.37 | 72.01 | 131.62 | 68.99 | ... | 8 | 0 | 1 | 224 |
24.78 | 76.55 | 64.92 | 97.69 | ... | 8 | 0 | 0 | 223 |
23.85 | 67.07 | 68.82 | 90.37 | ... | 7 | 0 | 0 | 234 |
f_visualizar_head_tail_reducido_word(datos_validacion)
temperatura | humedad | precipitacion | nitrogeno | ... | horas_sol | tipo_suelo_arenoso | tipo_suelo_franco | calidad_frijol |
|---|---|---|---|---|---|---|---|---|
23.7 | 62.41 | 115.66 | 126.84 | ... | 9 | 0 | 0 | 267 |
24.78 | 76.83 | 140.62 | 79.96 | ... | 7 | 1 | 0 | 256 |
19 | 76.15 | 83.26 | 108.56 | ... | 6 | 0 | 1 | 256 |
25.67 | 59.67 | 105.61 | 121.2 | ... | 9 | 0 | 0 | 243 |
27.24 | 73.78 | 130.09 | 107.04 | ... | 9 | 0 | 1 | 245 |
30.03 | 59.61 | 100.9 | 73.93 | ... | 10 | 1 | 0 | 212 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
27.97 | 72.19 | 135.52 | 87.08 | ... | 9 | 0 | 1 | 260 |
23.95 | 41.42 | 120.01 | 129.95 | ... | 8 | 1 | 0 | 250 |
25.38 | 48.35 | 81.56 | 77.41 | ... | 9 | 0 | 0 | 216 |
24.75 | 49.68 | 74.64 | 62.46 | ... | 9 | 0 | 1 | 211 |
26.8 | 47.17 | 128.42 | 132.78 | ... | 9 | 0 | 0 | 258 |
29.48 | 71.13 | 73.75 | 124.28 | ... | 9 | 1 | 0 | 246 |
Al construir el modelo de regresión, se observa que todos los coeficientes son estadísticamente significativos además, los valores r square y r square ajustado están por encima del 0.94 que significa que las variable dependiente explican aproximadamente el 94% la variabilidad de la calidad del frijol.
modelo_RLM <- f_construir_modelo_RLM(datos_entrenamiento, "calidad_frijol")
##
## ============================
## Modelo de Regresión Lineal Múltiple
## ============================
## Variable dependiente: calidad_frijol
## Número de observaciones: 840
## Número de variables independientes: 9
##
## Call:
## lm(formula = formula_modelo, data = datos_modelo)
##
## Residuals:
## Min 1Q Median 3Q Max
## -19.1174 -3.3093 -0.0372 3.4852 15.4254
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 48.811053 2.421074 20.161 < 2e-16 ***
## temperatura 0.823481 0.054871 15.008 < 2e-16 ***
## humedad 0.524808 0.014853 35.334 < 2e-16 ***
## precipitacion 0.295900 0.008662 34.162 < 2e-16 ***
## nitrogeno 0.602729 0.005913 101.934 < 2e-16 ***
## fosforo 0.404595 0.008513 47.525 < 2e-16 ***
## materia_organica 2.702178 0.152163 17.758 < 2e-16 ***
## horas_sol 1.204111 0.143028 8.419 < 2e-16 ***
## tipo_suelo_arenoso 2.823478 0.424101 6.658 5.06e-11 ***
## tipo_suelo_franco 5.156495 0.419192 12.301 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.976 on 830 degrees of freedom
## Multiple R-squared: 0.9476, Adjusted R-squared: 0.947
## F-statistic: 1667 on 9 and 830 DF, p-value: < 2.2e-16
Ejecutando la función f_multicolinealidad() se verifica que las variables que participan en el modelo, no tengan colinealidad o no est[en correlacionadas; el resultado que se observa en modo consola indica que todas las variables para este conjunto de datos satisfacen el postulado de no linealidad entre las variables.
resultado_vif <- f_multicolinealidad(modelo_RLM)
##
## ============================
## Diagnóstico de Multicolinealidad (VIF)
## ============================
## Variable VIF Interpretacion
## temperatura temperatura 1.01 Baja (aceptable)
## humedad humedad 1.01 Baja (aceptable)
## precipitacion precipitacion 1.02 Baja (aceptable)
## nitrogeno nitrogeno 1.01 Baja (aceptable)
## fosforo fosforo 1.00 Baja (aceptable)
## materia_organica materia_organica 1.01 Baja (aceptable)
## horas_sol horas_sol 1.00 Baja (aceptable)
## tipo_suelo_arenoso tipo_suelo_arenoso 1.35 Baja (aceptable)
## tipo_suelo_franco tipo_suelo_franco 1.34 Baja (aceptable)
Ejecutando la funci[pon f_linealidad(), se valida el postulado de linealidad
f_linealidad_grid(modelo_RLM)
##
## ============================
## Diagnóstico de Linealidad (Grid)
## ============================
## - Los residuos deben verse aleatorios.
## - La línea roja (loess) debe ser aproximadamente horizontal.
## - Patrones curvos indican no linealidad.
La prueba de Ramsey RESET evalúa si faltan términos no lineales en el modelo. CITA Wooldrige o lo que es lo mismo si no hay curvaruta o sugiere no linealidad entre los residuales y las variables independientes.
f_linealidad_test(modelo_RLM)
##
## ============================
## Test de Linealidad (Ramsey RESET)
## ============================
##
## RESET test
##
## data: modelo
## RESET = 0.34317, df1 = 2, df2 = 828, p-value = 0.7096
##
##
## Interpretación:
## ✔ No se rechaza H0 → El modelo es lineal (no hay evidencia de curvatura)
##
## RESET test
##
## data: modelo
## RESET = 0.34317, df1 = 2, df2 = 828, p-value = 0.7096
Se valida el postulado de homocedasticidad llamando la función f_homocedasticidad(); esta función encapsula las pruebas de Breush-Pegan y White.
resultado_homo <- f_homocedasticidad(modelo_RLM)
##
## ============================
## Diagnóstico de Homocedasticidad
## ============================
##
## Breusch–Pagan:
##
## studentized Breusch-Pagan test
##
## data: modelo
## BP = 4.9426, df = 9, p-value = 0.8393
##
##
## White Test (manual):
## Estadístico: 2.9051
## p-value: 0.234
##
## Interpretación:
## ✔ BP: No hay heterocedasticidad
## ✔ White: No hay heterocedasticidad
Se valida el postulado de normalidad de los residuos del modelo de regresión mediante al ejecución de la función preparada para esta tarea. La densidad de los residuos se observa de manera normal y con la gráfico qq-plot los residuos se alinean adecuadamente y los valores de p-value son mayores a 0.05 por lo que el postulado de normalidad de los residuos es satisfactorio para este modelo.
f_normalidad(modelo_RLM)
##
## ============================
## Diagnóstico de Normalidad
## ============================
## Prueba p_value Interpretacion
## 1 Shapiro-Wilk 0.5543 Normalidad
## 2 Anderson-Darling 0.6546 Normalidad
## 3 Kolmogorov-Smirnov 0.9257 Normalidad
Ahora para verificar el postulado de independencia de residuos, se ejecuta la función f_independencia() que devuelve el gráfico sen donde los residuos se homogeneizan a la linea roja con valor cero así como identificand en los subtpitulso el valor de Durbin-Watson alrededor de dos y el p-value por enciman de 0.05. Se concluye que si hay independencia de residuos en el modelo entrenado de regresión múltiple con estos datos.
tabla_independencia <- f_independencia(modelo_RLM, "Modelo RLM - Frijol")
##
## ============================
## Diagnóstico de Independencia
## ============================
## Prueba Estadistico p_value Interpretacion Decision
## 1 Durbin-Watson 2.1866 0.9966 Sin autocorrelación ✔ No se rechaza H0
ecuacion <- f_ecuacion_modelo(modelo_RLM)
##
## ============================
## Ecuación del Modelo de Regresión
## ============================
##
## ŷ = 48.8111 + 0.8235*temperatura + 0.5248*humedad + 0.2959*precipitacion + 0.6027*nitrogeno + 0.4046*fosforo + 2.7022*materia_organica + 1.2041*horas_sol + 2.8235*tipo_suelo_arenoso + 5.1565*tipo_suelo_franco
ecuacion
## [1] "ŷ = 48.8111 + 0.8235*temperatura + 0.5248*humedad + 0.2959*precipitacion + 0.6027*nitrogeno + 0.4046*fosforo + 2.7022*materia_organica + 1.2041*horas_sol + 2.8235*tipo_suelo_arenoso + 5.1565*tipo_suelo_franco"
Para evaluar el modelo se ejecuta la función f_evaluacion() que devuvel los estadísticos R_square, R_square_ajustado, MSE, RMSE y MAE
El modelo es óptimo en términos de calidad predictiva con un valor de r square=0.94 y r square ajustado=0.94; además con valores de RMSE y MAE alrededor de 5 y 4 unidades de margen de error en las predicciones.
f_evaluacion(modelo_RLM, datos_validacion, "calidad_frijol", "Regresión Lineal Múltiple")
## Modelo R_square R_square_ajustado MSE RMSE MAE
## 1 Regresión Lineal Múltiple 0.9476 0.947 25.7506 5.0745 4.0445
Este caso de estudio cumple con le objetivo planteado. Se construyó un modelo de regresión lineal múltiple con datos relacionados con la calidad de frijol como variable dependiente.
El modelo pasa todos los postulados de no multicolinealidad, linealidad, homocedasticidad, normalidad e independencia de residuos.
El modelo es muy bien evaluado con valores de 0.94 en r square ajustado, y cumple con la expectativa de que el modelo debiera tener un valor por encima del 85% en la explicabilidad de la variable dependiente.
Los coeficientes del modelo tienen significancia estadística muy aceptable; los estadísticos RMSE y MAE alrededor de 4 y 5 unidades de variación en términos de las predicciones.
Un solo modelo no es suficiente para valorar si es bueno o no, hay que compararlo contra otros modelos y llegar a conclusiones más retóricas.