Contexto de los datos

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:

Objetivo

Implementar, evaluar y comparar modelos de regresión logarítmica con otros modelos de regresión.

Descripción

Cargar librerías

# 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)

Cargar funciones

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")

Cargar datos

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")

Visualizar datos

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

Estadísticos descriptivos

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 ..."

Desarrollo

Particionar datos

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

Modelos regresión logaritmica

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)

Postulados de los modelos

Linealidad

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
)

Homocedasticidad

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
)

Normalidad

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
)

Independencia de residuos

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
)

Coeficientes de los modelos

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

Evaluación del modelo

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.

Interpretación del caso

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: