Se trata de un conjunto de datos históricos de una empresa que ofrece servicios funerarios la relación de dos variables numéricas en donde la variable independiente es cantidad de inversión y la variable a predecir es la cantidad de ventas en miles de pesos.
Los datos se encuentran en el enlace de la plataforma github.com en el espacio del autor https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/datos/datos_inversiones_servicios_funerarios.csv
Variables de interés:
Implementar, evaluar y comparar modelos de regresión logarítmica con otros modelos de regresión.
# 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")
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)
Las funciones se cargan desde la dirección url de github.com siguiente: https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/R%20MarkDown/funciones/funciones%20para%20modelos%20logaritmicos%20RL.R
source("https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/R%20MarkDown/funciones/funciones%20para%20modelos%20logaritmicos%20RL.R")
Con la función f_cargar_datos() se cargan los datos:
datos <- f_cargar_datos("https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/datos/datos_inversiones_servicios_funerarios.csv")
f_visualizar_head_tail_reducido_word(datos)
...1 | inversion | ventas |
|---|---|---|
1 | 1 | 195.516194827582 |
2 | 2 | 232.815939112131 |
3 | 3 | 267.400280946598 |
4 | 4 | 269.878785187391 |
5 | 5 | 281.506197502993 |
6 | 6 | 303.308493356469 |
7 | 7 | 300.982837100679 |
8 | 8 | 293.85158720714 |
9 | 9 | 304.366406051663 |
10 | 10 | 311.563958888903 |
... | ... | ... |
91 | 91 | 433.491006173539 |
92 | 92 | 430.476604528517 |
93 | 93 | 428.539828538554 |
94 | 94 | 422.141490505185 |
95 | 95 | 438.579064168267 |
96 | 96 | 423.415332876215 |
97 | 97 | 446.234212869302 |
98 | 98 | 441.50925894301 |
99 | 99 | 427.870389633926 |
100 | 100 | 422.04714209695 |
La media aritmética de la variable llamada inversion es de 50.50 con desviación estándar de 29.01 y de la variable ventas su media artimética es 382.59 y con desviación estándar de 47.24.
f_describir_datos(datos)
## $describe
## vars n mean sd median trimmed mad min max range skew
## ...1 1 100 50.50 29.01 50.50 50.50 37.06 1.00 100.00 99.00 0.00
## inversion 2 100 50.50 29.01 50.50 50.50 37.06 1.00 100.00 99.00 0.00
## ventas 3 100 382.59 47.24 397.75 389.45 34.63 195.52 446.23 250.72 -1.42
## kurtosis se
## ...1 -1.24 2.90
## inversion -1.24 2.90
## ventas 2.15 4.72
##
## $structure
## [1] "'data.frame':\t100 obs. of 3 variables:\n $ ...1 : num 1 2 3 4 5 6 7 8 9 10 ...\n $ inversion: num 1 2 3 4 5 6 7 8 9 10 ...\n $ ventas : num 196 233 267 270 282 ..."
Ahora siguiendo la metodología se parten los datos originales en 70% datos de entrenamiento y 30% datos de validación, usando la función f_particionar_datos():
datos_entrenamiento 70%
datos_validacion 30%
particion <- f_particionar_datos(datos)
datos_entrenamiento <- particion$datos_entrenamiento
datos_validacion <- particion$datos_validacion
Se presentan los primeros y últimos seis registros de los datos de entrenamiento:
f_visualizar_head_tail_reducido_word(datos_entrenamiento, n=6)
...1 | inversion | ventas |
|---|---|---|
93 | 93 | 428.539828538554 |
97 | 97 | 446.234212869302 |
38 | 38 | 381.384014301706 |
45 | 45 | 399.996820474956 |
91 | 91 | 433.491006173539 |
36 | 36 | 384.685068955606 |
... | ... | ... |
63 | 63 | 404.491077250221 |
20 | 20 | 346.004282415876 |
87 | 87 | 432.070118037924 |
49 | 49 | 400.830735852222 |
55 | 55 | 398.560491376349 |
76 | 76 | 424.74123797189 |
Ahora los datos de validación
f_visualizar_head_tail_reducido_word(datos_validacion, n=6)
...1 | inversion | ventas |
|---|---|---|
2 | 2 | 232.815939112131 |
7 | 7 | 300.982837100679 |
11 | 11 | 329.687418019434 |
13 | 13 | 331.453639477829 |
14 | 14 | 332.838328208324 |
21 | 21 | 343.683532238276 |
... | ... | ... |
83 | 83 | 417.976750135491 |
84 | 84 | 426.695852330316 |
85 | 85 | 420.368670329966 |
86 | 86 | 425.371620524001 |
89 | 89 | 421.824365802357 |
90 | 90 | 434.180944464122 |
Se construye el modelo de regresión logarítmica en una variable llamada modelo_RL. con la función f_construir_modelo_log() que devuelve el modelo construido.
modelo_RL <- f_construir_modelo_log(datos, "inversion", "ventas")
Además se construyen otros tres modelos, el lineal de primer grado, polinomial de segundo orden y otro polinomial de quinto orden que servirán para comparar rendimientos;mediante la función f_construir_modelo() que se utilizó para los modelos anteriores f_construir_modelo() se construyen los modelos.
modelo_RP1 <- f_construir_modelo(datos, "inversion", "ventas" , 1)
modelo_RP2 <- f_construir_modelo(datos, "inversion", "ventas" , 2)
modelo_RP5 <- f_construir_modelo(datos, "inversion", "ventas" , 5)
Se presenta en la función f_matriz_dispersión_modelos_tendencia() las cuatro tendencias de los modelos construidos. Los gráficos de dispersión de la figura, indican que para estos datos el modelo logaritmico y los modelos polinomiales ofrecen mejor significado en las predicciones dado que la curva mejora estas estimaciones en lugar del modelo de tendencia de linea recta del modelo de primer orden.
Con los valores de r-square el modelo logarítmico garantiza que la variable de inversión representa aproximadamente el 97% de la variabilidad de las ventas. Todos Los modelos cumplen con el supuesto de linealidad sin embargo el logarítmico y el polinomial de quinto orden se observan ser mejores.
modelos <- list(modelo_RL, modelo_RP1, modelo_RP2, modelo_RP5)
nombres <- c(
"Logaritmica",
"Lineal Recta",
"Polinomial grado 2",
"Polinomial grado 5"
)
f_matriz_dispersion_modelos_tendencia(
modelos,
datos_entrenamiento,
"inversion",
"ventas",
nombres
)
Para verificar la homocedasticidad de los residuos de los diferentes modelos, se ejecuta la función f_matriz_verificar_homocedasticidad(), esta función, recibe los modelos en un arreglo, los datos de entrenamiento, los nombres de las variables de interés dependiente e independiente y en nombre de cada modelo; luego se visualiza gráficos de homocedasticidad que se observan en la figura en la que hay mayor certeza de que los modelos logarítmico y polinomial de quinto orden, ofrecen mejor calidad con respecto al postulado de homocedasticidad.
modelos <- list(modelo_RL, modelo_RP1, modelo_RP2, modelo_RP5)
nombres <- c(
"Logaritmica",
"Lineal Recta",
"Polinomial grado 2",
"Polinomial grado 5"
)
f_matriz_verificar_homocedasticidad(
modelos,
datos_entrenamiento,
"inversion",
"ventas",
nombres
)
La prueba de normalidad para los cuatro modelos polinomiales construidos se hace haciendo construyendo el histograma de los residuos el diagrama qq-plot para ver la normalidad de los residuos y hace la prueba de Shapiro-Wilks; la función que recibe los cuatro modelos y hace la prueba de normalidad es f_matriz_verificar_normalidad(); esta recibe los argumentos adecuados y verifica la normalidad de los residuos de cada modelo.
En la gráfica se observa la valoración de los cuatro modelos, y a pesar de que la visualización gráfica del histograma y el diagrama qq-plot puede tal vez apreciarse comportamientos casi normales en los residuos, la prueba de Shapiro-Wilk proporciona evidencia estadística robusta sobre la normalidad de los residuos, encontrándose que solo el modelo de regresión logarítmica y el polinomial de quinto grado cumplen con el supuesto de normalidad en los residuales.
Esta función se ejecuta a continuación:
modelos <- list(modelo_RL, modelo_RP1, modelo_RP2, modelo_RP5)
nombres <- c(
"Logaritmica",
"Lineal Recta",
"Polinomial grado 2",
"Polinomial grado 5"
)
f_matriz_verificar_normalidad(
modelos,
datos_entrenamiento,
"inversion",
"ventas",
nombres
)
Se ejecuta la función f_matriz_verificar_independencia_residuos() que recibe los argumentos de los cuatro modelos previamente construidos y calcula la prueba Durbin-Watson, además visualiza que no existe alguna posible correlación de los residuales en todos los modelos.
La prueba Durbin-Watson calcula valores muy cercanos a 2; el modelo logarítmico es el único que ofrece independencia en los residuos de todos, se interpreta que los residuales no tienen correlación en este modelo lo que garantiza que sólo este cumple con el supuesto de independencia de los residuales.
f_matriz_verificar_independencia_residuos(
modelos,
datos_entrenamiento,
"invesion",
"ventas",
nombres
)
Se extraen de cada modelos los coeficientes que sirven para construir las ecuaciones matemáticas que permiten deducir las predicciones de acuerdo al modelo logarítmico y polinomiales de primer orden, segundo y quinto grado.
Se ejecuta para ello la función f_ecuaciones_modelos() la cual extrae a partir de los modelos, los coeficientes.
f_ecuaciones_modelos(modelos, nombres)
##
## ============================
## Logaritmica
## ============================
##
## Coeficientes:
## (Intercept) log(inversion)
## 199.6790 50.2871
##
## Ecuación:
## ŷ = 199.679 + 50.2871 * ln(inversion)
##
## ============================
## Lineal Recta
## ============================
##
## Coeficientes:
## (Intercept) poly(inversion, 1, raw = TRUE)
## 309.2177 1.4530
##
## Ecuación:
## ŷ = 309.2177 + 1.453 * poly(inversion, 1, raw = TRUE)
##
## ============================
## Polinomial grado 2
## ============================
##
## Coeficientes:
## (Intercept) poly(inversion, 2, raw = TRUE)1
## 272.5541 3.6097
## poly(inversion, 2, raw = TRUE)2
## -0.0214
##
## Ecuación:
## ŷ = 272.5541 + 3.6097 * poly(inversion, 2, raw = TRUE)1 - 0.0214 * poly(inversion, 2, raw = TRUE)2
##
## ============================
## Polinomial grado 5
## ============================
##
## Coeficientes:
## (Intercept) poly(inversion, 5, raw = TRUE)1
## 217.7921 13.1387
## poly(inversion, 5, raw = TRUE)2 poly(inversion, 5, raw = TRUE)3
## -0.4619 0.0086
## poly(inversion, 5, raw = TRUE)4 poly(inversion, 5, raw = TRUE)5
## -0.0001 0.0000
##
## Ecuación:
## ŷ = 217.7921 + 13.1387 * poly(inversion, 5, raw = TRUE)1 - 0.4619 * poly(inversion, 5, raw = TRUE)2 + 0.0086 * poly(inversion, 5, raw = TRUE)3 - 1e-04 * poly(inversion, 5, raw = TRUE)4 + 0 * poly(inversion, 5, raw = TRUE)5
La calidad y eficiencia predictiva de los modelos de regresión se valora calculando los estadísticos r-square y RMSE; r-square mide la representatividad que tiene variable independiente sobre al variable dependiente en cuanto a la variabilidad de esta última y RMSE identifica que tanto se acerca o se desvían las predicciones con respecto a los valores reales.
Para valorar con estos estadísticos, se requieren los datos de validación y los modelos participantes.
f_evaluar_modelos_varios(modelos, datos_validacion, "inversion", "ventas", nombres)
Al haber evaluado los modelos, el modelo lineal de primer grado o linea recta ofrece mejores condiciones de predictivas en cuanto al estad[istico RMSE ya que las predicciones se equivocan en 330.99 unidades con respecto a los valores reales, sin embargo, los otros modelos no están tan lejos en el valor de RMSE aproximadamente 2 o 3 unidades de diferencia.
El mejor modelo en términos del estadístico r square es el modelo logarítmico que significa que la variable inversión representa aproximadamente el 97% la variabilidad de las ventas.
Este caso de estudio describe la implementación y evaluación de un modelo de regresión logística del tipo lin-log haciendo uso e librerías y funcines propias del lenguaje de programación R.
El caso utiliza un conjunto de cien registros con datos simulados de dos variables de interés, inversión y ventas de una empresa ficticia de servicios funerarios; se hace una partición para datos de entrenamiento del 70% y 30% para datos de validación.
El caso implementa para efectos de comparación modelos lineal de primer orden (linea recta), polinomial de segundo orden y polinomial de quinto orden
Con respecto a los postulados, todos los modelos cumplen con el linealidad; los modelos logarítimico y polinomial de quinto orden presentan con mayor certidumbre el postulado de homocedasticidad; solo el modelo logarítmico cumple con el postulado de normalidad en los residuos y con respecto al postulado de independencia de residuos, el postulado logarítmico es el único modelo que satisface este postulado.
De acuerdo al estadístico r square el mejor modelo predictivo para estos datos es el modelo logarítmico y de acuerdo al estadítico RMSE el mejor modelo es el lineal de primer orden.
El archivo puede recrearse y encontrarse en la plataforma rpubs.com en el espacio del autor: