Carga de los Datos

Datos <- read_excel("C:/Users/User/Downloads/Reg_1.xlsx")
View(Datos)

Descriptivo

Antes que todo, procederemos a hacer un análisis descriptivo de los datos para poder tener un adelanto de como se comportarán. Por lo tanto, procedemos primero a realizar un histograma y un summary para ver la distribución y cuales son sus medidas de tendencia central.

\(y:\): Ventas

\(x_{1}:\) Publicidad en Televesión.

\(x_{2}:\) Publicidad en Radio.

\(x_{3}:\) Publicidad en Periódicos.

Primero, veamos la variable respuesta y:

hist(Datos$Ventas,
     main = "Histograma de las Ventas",
     xlab = "Ventas",
     col = "skyblue",
     border = "white")

De acuerdo al histograma obtenido, la distribución de la variable Ventas presenta, a simple vista, una ligera asimetría hacia la derecha, ya que la mayor parte de los valores se concentran en los intervalos bajos. Por otro lado, los intervalos con mayor frecuencia fueron los comprendidos entre 8-10 y 10-12, con una frecuencia de 5 observaciones cada uno. Mientras que, los intervalos con menor frecuencia fueron los comprendidos entre 16-18 y 20-22, con una frecuencia de 1 observación. Esto nos da a entender que, la mayoría de las ventas tienden a ubicarse en los valores más bajos del rango observado.

summary(Datos$Ventas)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    8.00   10.75   12.50   13.43   16.00   22.00
IQR(Datos$Ventas)
## [1] 5.25

Las ventas oscilan entre las 8 y 22 unidades aproximadamente. Por lo observado en el histograma, los datos parecen presentar una ligera asímetria por lo que resulta apropiado mencionar a la mediana. Las ventas tienen una mediana de 12.5 unidades, es decir, el 50% de las observaciones se encuentran por debajo o igual a este valor, con un rango intercuartílico de 5.25 unidades, lo que indica que el 50% central de las ventas esta entre 10.75 y 16 unidades. Por último, el 25% de las ventas está por debajo de las 10.75 unidades, mientras que el 75% esta por debajo de las 16 unidades.

En segundo lugar, veamos la variable explicativa \(x_1\) (Publicidad en Televesión):

hist(Datos$Publ_TV,
     main = "Histograma de la publicidad en televesión",
     xlab = "Unidades",
     col = "skyblue",
     border = "white")

De acuerdo al histograma obtenido, la distribución de la variable Publ_TV no parece presentar, a simple vista, una asimetría clara. Por otro lado, el intervalo con mayor frecuencia fue el comprendido entre 0.8-1.0 , con una frecuencia de 6 observaciones. Mientras que, el intervalo con menor frecuencia fue el comprendido entre 1.0-1.2, con una frecuencia de 1 observación. En general, los valores se encuentran relativamente dispersos entre los distintos intervalos, lo que sugiere que no hay una fuerte concentración en torno a un intervalo especifíco.

summary(Datos$Publ_TV)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.800   1.000   1.425   1.413   1.762   2.000
sd(Datos$Publ_TV)
## [1] 0.413227

La publicidad en televesión oscila entre las 0.8 y 2.0 unidades aproximadamente. Por lo observado en el histograma, los datos no parecen presentar asimetría por lo que resulta apropiado mencionar a la media. El valor promedio de la publicidad en televesión es de 1.413 unidades, lo que sugiere que, se invierte alrededor de esa cantidad, con una desviación estándar de 0.41 unidades, lo que indica que los valores suelen fluctuar entre 1.41 ± 0.41. Por último, el 25% de la publicidad en televesión está por debajo de 1 unidade, mientras que el 75% esta por debajo de las 1.7 unidades.

Luego, veamos la variable explicativa \(x_2\) (Publicidad en Radio):

hist(Datos$Publ_radio,
     main = "Histograma de la publicidad en radio",
     xlab = "Unidades",
     col = "skyblue",
     border = "white")

De acuerdo al histograma obtenido, la distribución de la variable Publ_radio presenta, a simple vista, una asimetría hacia la derecha, ya que la mayor parte de los valores se concentran en los intervalos bajos. Por otro lado, el intervalo con mayor frecuencia fue el comprendido entre 60-70, con una frecuencia de 8 observaciones. Mientras que, los intervalos con menor frecuencia fueron los comprendidos entre 90-100 y 100-110, con una frecuencia de 1 observación. Esto nos da a entender que, la mayoría de las ventas tienden a ubicarse en los valores más bajos del rango observado.

summary(Datos$Publ_radio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   50.00   60.00   67.00   70.60   76.25  110.00
IQR(Datos$Publ_radio)
## [1] 16.25

La publicidad en radio oscila entre las 50 y 110 unidades aproximadamente. Por lo observado en el histograma, los datos parecen presentar una ligera asímetria por lo que resulta apropiado mencionar a la mediana. La publicidad en radio tienen una mediana de 67 unidades, es decir, el 50% de las observaciones se encuentran por debajo o igual a este valor, con un rango intercuartílico de 16.25 unidades, lo que indica que el 50% central de las ventas esta entre 60 y 76.25 unidades. Por último, el 25% de la publicidad en televesión está por debajo de las 60 unidades, mientras que el 75% esta por debajo de las 76.25 unidades.

Por último, veamos la variable explicativa \(x_3\) (Publicidad en periódicos):

hist(Datos$Publ_periodicos,
     main = "Histograma de la publicidad en periódicos",
     xlab = "Unidades",
     col = "skyblue",
     border = "white")

De acuerdo al histograma obtenido, la distribución de la variable Publ_periodicos presenta, a simple vista, una asimetría hacia la derecha, ya que la mayor parte de los valores se concentran en los intervalos bajos. Por otro lado, el intervalo con mayor frecuencia fue el comprendido entre 0.4-0.5, con una frecuencia de 9 observaciones aproximadamente. Mientras que, los intervalos con menor frecuencia fueron los comprendidos entre 0.8-0.9 y 1.0-1.1 aproximadamente, con una frecuencia de 2 observaciones cada uno. Esto nos da a entender que, la mayoría de inversions en la publicidad en periódicos tienden a ubicarse en los valores más bajos del rango observado.

summary(Datos$Publ_periodicos)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.300   0.400   0.450   0.561   0.575   1.100
IQR(Datos$Publ_periodicos)
## [1] 0.175

La publicidad en periódicos oscila entre las 0.3 y 1.10 unidades aproximadamente. Por lo observado en el histograma, los datos parecen presentar una ligera asímetria por lo que resulta apropiado mencionar a la mediana. La publicidad en periódicos tienen una mediana de 0.450 unidades, es decir, el 50% de las observaciones se encuentran por debajo o igual a este valor, con un rango intercuartílico de 0.17 unidades, lo que indica que el 50% central de la publicidad en televesión esta entre 0.40 y 0.57 unidades. Por último, el 25% de la publicidad en periódicos está por debajo de las 0.40 unidades, mientras que el 75% esta por debajo de las 0.57 unidades. En general, no parece que se invierta mucho en publicidad en periódicos, ya que el rango de valores observados es bastante reducido.

NORMALIDAD

Veamos si los datos siguen una distribución normal para saber que método aplicar:

shapiro.test(Datos$Ventas)
## 
##  Shapiro-Wilk normality test
## 
## data:  Datos$Ventas
## W = 0.94076, p-value = 0.2478
shapiro.test(Datos$Publ_TV)
## 
##  Shapiro-Wilk normality test
## 
## data:  Datos$Publ_TV
## W = 0.92377, p-value = 0.1171
shapiro.test(Datos$Publ_radio)
## 
##  Shapiro-Wilk normality test
## 
## data:  Datos$Publ_radio
## W = 0.9034, p-value = 0.04779
shapiro.test(Datos$Publ_periodicos)
## 
##  Shapiro-Wilk normality test
## 
## data:  Datos$Publ_periodicos
## W = 0.73628, p-value = 0.0001118

Como hay dos p-valores menores al nivel de significancia establecido de 0.05, rechazamos la hipótesis nula, es decir, los datos no siguen una distribución aproximadamente normal.

CORRELACIÓN

Veamos que tan correlacionadas están las variables entre ellas:

chart.Correlation(Datos, histogram = TRUE, method = "spearman")

mat_cor <- cor(Datos, method = "spearman") # Calcula matriz de correlación

mat_cor1<-cor(Datos, method = "spearman")

significancia1<- cor.mtest(Datos,
                           method = "spearman",
                           conf.level = .95)
corrplot(mat_cor1, 
         p.mat = significancia1$p, #llamado del p-valor para cada coeficiente r
         sig.level = 0.05) #definición del nivel de significancia

En cuanto a la distribución, todas parecen seguir una distribución normal, excepto por la publicidad en televesión y la publicidad en peiódicos en la cual se observa una ligera asimetría a la derecha, lo que explica que no hayan pasado la prueba de normalidad. A continuación, se realiza un análisis exhaustivo de la relación de las variables explicativas en torno a la variable respuesta.

Ventas vs Publ_TV: De acuerdo al coeficiente de correlación obtenido (\(R = 0.69\)), remarcado con altos niveles de significancia, se puede afirmar que existe una correlación positiva moderada entre la variable publicidad en televesión y las ventas. Esto implica que, en general, a medida que aumenta la inversión en publicidad televisiva, también tienden a aumentar las ventas.

Ventas vs Publ_radio: De acuerdo al coeficiente de correlación obtenido (\(R = 0.43\)), se puede afirmar que existe una correlación positiva baja entre la variable publicidad en radio y las ventas. Esto implica que, en general, a medida que aumenta la inversión en publicidad radial, también tienden a aumentar las ventas levemente.

Ventas vs Publ_periodicos: De acuerdo al coeficiente de correlación obtenido (\(R = 0.55\)), se puede afirmar que existe una correlación positiva moderada entre la variable publicidad en periódicos y las ventas. Esto implica que, en general, a medida que aumenta la inversión en publicidad radial, también tienden a aumentar las ventas.

Por otro lado, es importante resaltar que las variables explicativas no presentan una correlación fuerte entre sí. En particular, la correlación entre publicidad en televisión y radio fue de \(r = 0.50\), lo que indica una correlación positiva moderada. Por su parte, la correlación entre publicidad en periódicos y televisión fue de \(r = 0.31\), y entre periódicos y radio fue de \(r = 0.35\), lo que en ambos casos sugiere una correlación positiva débil. Por lo tanto, estas correlaciones relativamente “bajas” favorecen nuestro análisis.

Selección de variables

Para esto, aplicaremos el metodo híbrido o both ya que es el más compacto y nos llevará a mejores resultados:

Método Forward

A continuación aplicaremos el método forward, utilizando de criterio el AIC:

Primero iniciemos creando el modelo nulo:

M_0 <- lm(Datos$Ventas ~ 1) #De este manera se le indica a R que es el modelo nulo.
summary(M_0)
## 
## Call:
## lm(formula = Datos$Ventas ~ 1)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -5.425 -2.675 -0.925  2.575  8.575 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   13.425      0.885   15.17 4.52e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.958 on 19 degrees of freedom
AIC(M_0)
## [1] 114.7604

Procedamos a crear modelos con las tres variables explicativas:

#Creamos cada uno de los modelos.
P_1 <- lm(Datos$Ventas ~ Datos$Publ_TV) 
P_2 <- lm(Datos$Ventas ~ Datos$Publ_radio)
P_3 <- lm(Datos$Ventas ~ Datos$Publ_periodicos)

#Hacemos summary y calculamos su AIC
summary(P_1)
## 
## Call:
## lm(formula = Datos$Ventas ~ Datos$Publ_TV)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.1657 -1.3483 -0.2438  0.5682  8.6780 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)   
## (Intercept)      4.873      2.569   1.896  0.07406 . 
## Datos$Publ_TV    6.055      1.749   3.461  0.00279 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.151 on 18 degrees of freedom
## Multiple R-squared:  0.3996, Adjusted R-squared:  0.3662 
## F-statistic: 11.98 on 1 and 18 DF,  p-value: 0.002786
AIC(P_1)
## [1] 106.5571
summary(P_2)
## 
## Call:
## lm(formula = Datos$Ventas ~ Datos$Publ_radio)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.9881 -2.6192 -0.2503  2.2935  6.6915 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)
## (Intercept)       6.57076    4.12869   1.591    0.129
## Datos$Publ_radio  0.09709    0.05724   1.696    0.107
## 
## Residual standard error: 3.776 on 18 degrees of freedom
## Multiple R-squared:  0.1378, Adjusted R-squared:  0.08988 
## F-statistic: 2.876 on 1 and 18 DF,  p-value: 0.1071
AIC(P_2)
## [1] 113.7955
summary(P_3)
## 
## Call:
## lm(formula = Datos$Ventas ~ Datos$Publ_periodicos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.5977 -1.2775  0.0968  1.3886  4.7584 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              5.817      1.214   4.794 0.000145 ***
## Datos$Publ_periodicos   13.562      1.987   6.826 2.17e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.147 on 18 degrees of freedom
## Multiple R-squared:  0.7213, Adjusted R-squared:  0.7059 
## F-statistic:  46.6 on 1 and 18 DF,  p-value: 2.171e-06
AIC(P_3)
## [1] 91.20466

En este caso el modelo con el AIC más pequeño fue el presentado cuando se agrega la variable Publ_periodicos. Comparando con el modelo anterior (En este caso el modelo nulo representado por M_0) obtenemos:

\[AIC_{M_{0}} = 114.76 > 91.20 = AIC_{P_{3}}\]

Como el AIC disminuyo al agregar la variable explicativa Publ_periodicos, procedemos a crear un nuevo modelo agregando la nueva variable explicativa:

M_1 <- lm(Datos$Ventas ~ Datos$Publ_periodicos)
summary(M_1)
## 
## Call:
## lm(formula = Datos$Ventas ~ Datos$Publ_periodicos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.5977 -1.2775  0.0968  1.3886  4.7584 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              5.817      1.214   4.794 0.000145 ***
## Datos$Publ_periodicos   13.562      1.987   6.826 2.17e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.147 on 18 degrees of freedom
## Multiple R-squared:  0.7213, Adjusted R-squared:  0.7059 
## F-statistic:  46.6 on 1 and 18 DF,  p-value: 2.171e-06
AIC(M_1)
## [1] 91.20466

Volvemos a repetir el mismo de crear modelos temporales, con las variables explicativas restantes, en este caso, 2:

#Creamos cada uno de los modelos.
P_1 <- lm(Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_TV) 
P_2 <- lm(Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_radio)

#Hacemos summary y calculamos su AIC
summary(P_1)
## 
## Call:
## lm(formula = Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_TV)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.1554 -0.2380  0.2326  0.7616  3.2403 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              2.177      1.456   1.495   0.1532    
## Datos$Publ_periodicos   11.364      1.717   6.618 4.35e-06 ***
## Datos$Publ_TV            3.450      1.030   3.349   0.0038 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.714 on 17 degrees of freedom
## Multiple R-squared:  0.8321, Adjusted R-squared:  0.8124 
## F-statistic: 42.13 on 2 and 17 DF,  p-value: 2.586e-07
AIC(P_1)
## [1] 83.0706
summary(P_2)
## 
## Call:
## lm(formula = Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_radio)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.3068 -1.0718  0.0713  1.0138  4.7133 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            3.96968    2.39753   1.656    0.116    
## Datos$Publ_periodicos 12.97484    2.10255   6.171 1.03e-05 ***
## Datos$Publ_radio       0.03083    0.03444   0.895    0.383    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.158 on 17 degrees of freedom
## Multiple R-squared:  0.7339, Adjusted R-squared:  0.7026 
## F-statistic: 23.44 on 2 and 17 DF,  p-value: 1.297e-05
AIC(P_2)
## [1] 92.28361

En este caso el modelo con el AIC más pequeño fue el presentado cuando se agrega la variable Publ_Publ_TV. Comparando con el modelo anterior (En este caso el modelo representado por M_1) obtenemos:

\[AIC_{M_{1}} = 91.20 > 83.07 = AIC_{P_{1}}\]

Como el AIC disminuyo al agregar la variable explicativa Publ_TV, procedemos a crear un nuevo modelo agregando la nueva variable explicativa en el modelo actual M1, es decir, nos queda:

M_2 <- lm(Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_TV)
summary(M_2)
## 
## Call:
## lm(formula = Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_TV)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.1554 -0.2380  0.2326  0.7616  3.2403 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              2.177      1.456   1.495   0.1532    
## Datos$Publ_periodicos   11.364      1.717   6.618 4.35e-06 ***
## Datos$Publ_TV            3.450      1.030   3.349   0.0038 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.714 on 17 degrees of freedom
## Multiple R-squared:  0.8321, Adjusted R-squared:  0.8124 
## F-statistic: 42.13 on 2 and 17 DF,  p-value: 2.586e-07
AIC(M_2)
## [1] 83.0706

Volvemos a repetir el mismo de crear modelos temporale, con las variable explicativa restante, obtenemos:

#Creamos cada uno de los modelos.
P_1 <- lm(Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_TV + Datos$Publ_radio) 

#Hacemos summary y calculamos su AIC
summary(P_1)
## 
## Call:
## lm(formula = Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_TV + 
##     Datos$Publ_radio)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.1512 -0.2184  0.2400  0.7606  3.2460 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            2.107701   2.054898   1.026  0.32029    
## Datos$Publ_periodicos 11.347059   1.801580   6.298 1.06e-05 ***
## Datos$Publ_TV          3.431741   1.121366   3.060  0.00748 ** 
## Datos$Publ_radio       0.001477   0.029781   0.050  0.96106    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.767 on 16 degrees of freedom
## Multiple R-squared:  0.8321, Adjusted R-squared:  0.8007 
## F-statistic: 26.44 on 3 and 16 DF,  p-value: 1.941e-06
AIC(P_1)
## [1] 85.06753

En este caso, como hay un solo modelo procedamos a comparar el AIC con el modelo anterior (En este caso el modelo representado por M_2) obtenemos:

\[AIC_{M_{2}} = 83.07 < 85.06 = AIC_{P_{1}}\]

Como en esta iteración ningún modelo presenta un AIC menor que el del modelo anterior, se concluye el proceso de selección. Nuestro modelo final queda definido como:

M_F <- lm(Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_TV)
summary(M_F)
## 
## Call:
## lm(formula = Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_TV)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.1554 -0.2380  0.2326  0.7616  3.2403 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              2.177      1.456   1.495   0.1532    
## Datos$Publ_periodicos   11.364      1.717   6.618 4.35e-06 ***
## Datos$Publ_TV            3.450      1.030   3.349   0.0038 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.714 on 17 degrees of freedom
## Multiple R-squared:  0.8321, Adjusted R-squared:  0.8124 
## F-statistic: 42.13 on 2 and 17 DF,  p-value: 2.586e-07

\[y = 2.17 + 11.36x_{1} + 3.45x_{2}\] Todo este proceso se realizó de forma manual, sin embargo, existe una función que permite simplificar significativamente la selección del modelo:

Modelo_Nulo <- lm(Ventas ~ 1, data = Datos) #Utilizamos ~ 1, para decir que solo sea la variable respuesta con el intercepto.

Modelo_Completo <- lm(Ventas ~ ., data = Datos) #La expresión ~ ., representa el modelo con todas las variables explicativas.

modelo_forward <- stepAIC(Modelo_Nulo, scope = list(lower = formula(Modelo_Nulo), upper = formula(Modelo_Completo)), direction = "forward") #Utilizamos stepAIC para que su criterio de selección sea por el AIC.
## Start:  AIC=56
## Ventas ~ 1
## 
##                   Df Sum of Sq     RSS    AIC
## + Publ_periodicos  1   214.700  82.938 32.447
## + Publ_TV          1   118.937 178.700 47.800
## + Publ_radio       1    41.009 256.629 55.038
## <none>                         297.637 56.003
## 
## Step:  AIC=32.45
## Ventas ~ Publ_periodicos
## 
##              Df Sum of Sq    RSS    AIC
## + Publ_TV     1    32.969 49.968 24.313
## <none>                    82.938 32.447
## + Publ_radio  1     3.733 79.205 33.526
## 
## Step:  AIC=24.31
## Ventas ~ Publ_periodicos + Publ_TV
## 
##              Df Sum of Sq    RSS    AIC
## <none>                    49.968 24.313
## + Publ_radio  1 0.0076785 49.960 26.310
modelo_forward #Lo llamamos.
## 
## Call:
## lm(formula = Ventas ~ Publ_periodicos + Publ_TV, data = Datos)
## 
## Coefficients:
##     (Intercept)  Publ_periodicos          Publ_TV  
##           2.177           11.364            3.450

Como vemos el resultado coincide con el proceso hecho manualmente. Procedamos a desglosar este modelo:

modelo_forward$anova
## Stepwise Model Path 
## Analysis of Deviance Table
## 
## Initial Model:
## Ventas ~ 1
## 
## Final Model:
## Ventas ~ Publ_periodicos + Publ_TV
## 
## 
##                Step Df  Deviance Resid. Df Resid. Dev      AIC
## 1                                       19  297.63750 56.00288
## 2 + Publ_periodicos  1 214.69992        18   82.93758 32.44712
## 3         + Publ_TV  1  32.96945        17   49.96813 24.31306

En este caso, vemos que al desglosar el modelo con ANOVA, podemos notar varias cosas:

  • En la primera fila, correspondiente al modelo nulo (sin variables explicativas), la deviancia residual fue de aproximadamente 297.63 y el AIC de 56.

  • En la segunda fila, al incorporar la variable explicativa Publ_Periódicos, tanto la deviancia como el AIC disminuyeron notablemente, lo que sugiere que esta variable mejoró significativamente el ajuste del modelo.

  • En la tercera fila, al agregar también la variable Publ_TV, se observa una nueva disminución en la deviancia y el AIC, lo que indica que esta variable también aporta significativamente a explicar la variabilidad de la variable respuesta (Ventas).

Método Both

Se procede a aplicar el método Forward con cada una de las variables:

m1<-lm(Datos$Ventas ~ Datos$Publ_TV)
AIC(m1)
## [1] 106.5571
m2<-lm(Datos$Ventas ~ Datos$Publ_radio)
AIC(m2)
## [1] 113.7955
m3<-lm(Datos$Ventas ~ Datos$Publ_periodicos)
AIC(m3)
## [1] 91.20466

El menor AIC es el de \(91.20\) del modelo 3 con la variable Publ_periodicos, por tanto lo elegimos y aplicamos backward.

m3<-lm(Datos$Ventas ~ Datos$Publ_periodicos) #El modelo actual
AIC(m3)
## [1] 91.20466
m_0 <- lm(Datos$Ventas ~ 1)
AIC(m_0)
## [1] 114.7604

Al eliminar a Publ_periodicos no mejora el AIC, por tanto se mantiene en el modelo. Se procede a aplicar el método forward otra vez con el modelo actual:

m1<-lm(Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_TV)
AIC(m1)
## [1] 83.0706
m2<-lm(Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_radio)
AIC(m2)
## [1] 92.28361

El mejor AIC es el de \(83.07\) que corresponde al modelo con las variables Publ_periodicos y Publ_TV. Se verifica con backward si eliminar alguna mejora el AIC.

m3<-lm(Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_TV) #El modelo actual
AIC(m3)
## [1] 83.0706
m_01 <- lm(Datos$Ventas ~ Datos$Publ_periodicos)
AIC(m_01)
## [1] 91.20466
m_02 <- lm(Datos$Ventas ~ Datos$Publ_TV)
AIC(m_02)
## [1] 106.5571

El AIC empeora en cualquiera de los dos casos, se mantienen las dos variables y se repite el proceso con el método forward.

m1<-lm(Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_TV + Datos$Publ_radio)
AIC(m1)
## [1] 85.06753

El AIC no disminuye, por tanto el proceso termina, pues no se puede añadir ninguna variable que reduzca el AIC ni se puede eliminar ninguna variable para mejorar el AIC. Por tanto el modelo final incluye a las variables Publ_TV y Publ_radio.

No obstante, existe una función que condensa todo este proceso, se puede realizar de la siguiente forma:

modelo_inicial<-lm(Datos$Ventas ~ 1)
scope = list(lower = ~1, upper = Datos$Ventas ~ Datos$Publ_TV + Datos$Publ_radio + Datos$Publ_periodicos)
modelo_both <- stepAIC(modelo_inicial, trace=TRUE, direction="both", scope=scope, k=2)
## Start:  AIC=56
## Datos$Ventas ~ 1
## 
##                         Df Sum of Sq     RSS    AIC
## + Datos$Publ_periodicos  1   214.700  82.938 32.447
## + Datos$Publ_TV          1   118.937 178.700 47.800
## + Datos$Publ_radio       1    41.009 256.629 55.038
## <none>                               297.637 56.003
## 
## Step:  AIC=32.45
## Datos$Ventas ~ Datos$Publ_periodicos
## 
##                         Df Sum of Sq     RSS    AIC
## + Datos$Publ_TV          1    32.969  49.968 24.313
## <none>                                82.938 32.447
## + Datos$Publ_radio       1     3.733  79.205 33.526
## - Datos$Publ_periodicos  1   214.700 297.637 56.003
## 
## Step:  AIC=24.31
## Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_TV
## 
##                         Df Sum of Sq     RSS    AIC
## <none>                                49.968 24.313
## + Datos$Publ_radio       1     0.008  49.960 26.310
## - Datos$Publ_TV          1    32.969  82.938 32.447
## - Datos$Publ_periodicos  1   128.732 178.700 47.800
modelo_both$anova   
## Stepwise Model Path 
## Analysis of Deviance Table
## 
## Initial Model:
## Datos$Ventas ~ 1
## 
## Final Model:
## Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_TV
## 
## 
##                      Step Df  Deviance Resid. Df Resid. Dev      AIC
## 1                                             19  297.63750 56.00288
## 2 + Datos$Publ_periodicos  1 214.69992        18   82.93758 32.44712
## 3         + Datos$Publ_TV  1  32.96945        17   49.96813 24.31306
summary(modelo_both)
## 
## Call:
## lm(formula = Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_TV)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.1554 -0.2380  0.2326  0.7616  3.2403 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              2.177      1.456   1.495   0.1532    
## Datos$Publ_periodicos   11.364      1.717   6.618 4.35e-06 ***
## Datos$Publ_TV            3.450      1.030   3.349   0.0038 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.714 on 17 degrees of freedom
## Multiple R-squared:  0.8321, Adjusted R-squared:  0.8124 
## F-statistic: 42.13 on 2 and 17 DF,  p-value: 2.586e-07

Interpretación de los coeficientes

  • Intercepto (\(2.17\)): Cuando no se invierte en la publicidad en periódicos o en la de televesión se espera que las ventas sean, en promedio, de 2.17 unidades. No es significativo (\(p ≈ 0.1532\)), pues su p-valor es mayor al nivel de significancia de 0.05.

  • Publ_periodicos (\(11.36\)): Por cada unidad que se invierte para publicidad en periódicos, manteniendo la publicidad en televesión constate, las ventas aumentan aproximadamente 11.36 unidades. Muy significativo (\(p ≈ 4.35e-06\)).

  • Publ_TV (\(3.45\)): Por cada unidad que se invierte para publicidad en televesión, manteniendo la publicidad en periódicos constate, las ventas aumentan aproximadamente 3.45 unidades. Es significativo (\(p ≈ 0.0038\)).

Calidad del ajuste

  • \(R^{2} = 0.83\): El modelo explica aproximadamente el 83.21% de la variabilidad de las ventas, lo cual es un buen ajuste. El 83% de la variabilidad en las ventas se debe a la regresión de la publicidad en televesión y en periódicos, mientras que el 17% se debe a otros factores no incluidos en el estudio.

  • \(R^{2}_{ajustado} = 0.81\) : Considerando el número de predictores, sigue siendo sólido. Además de que no varia mucho entre el coeficiente de determinación, lo que nos indica que las variables explicativas si aportan significativamente al modelo.

  • Error estándar residual = 1.71: En promedio, los valores predichos se desvían en ±1.71 unidades de los valores reales de las ventas.

Significancia global del modelo F-statistic = 42.13, con \(p ≈ 2.586e-07\): El modelo como un todo es altamente significativo, lo que indica que al menos una variable predictora explica las ventas.

Multicolinealidad

Antes de verificar supuestos, veamos si hay multicolinealidad entre las variables explicativas, para eso aplicamos la siguiente función:

vifs <- vif(M_F)
print(vifs)
## Datos$Publ_periodicos         Datos$Publ_TV 
##              1.171033              1.171033

Todos los VIF están por debajo de 5, lo que indica que no hay problemas de multicolinealidad, todas las variables son independientes entre sí y aportan información única.

Ecucaciones normales - Estimación minímos cuadrados

Primero calculamos la base matricial:

y <- Datos$Ventas  #Vector que representa la variable respuesta

X <- cbind(
  1, #Columna llena de unos para que se pueda escribir el intercepto
  Datos$Publ_TV, #Los valores de la publicidad en televesión. 
  Datos$Publ_periodicos #Los valores de la publicidad en periódicos.
)

Luego, procedemos a estimar los coeficientes por el método de mínimos cuadrados:

#t(X) transpuesta de esa matriz, %*% multiplicación, supongo que solve es inversa.
XtX <- t(X) %*% X 
Xty <- t(X) %*% y
beta_hat <- solve(XtX) %*% Xty

Los mostramos de manera más ordenada:

colnames(beta_hat) <- "Estimación"
rownames(beta_hat) <- c("Intercepto", "Publ_TV", "Publ_periodicos")
beta_hat
##                 Estimación
## Intercepto        2.177303
## Publ_TV           3.449649
## Publ_periodicos  11.363758

Comparando con el modelo anterior:

lm(Datos$Ventas ~ Datos$Publ_TV + Datos$Publ_periodicos)
## 
## Call:
## lm(formula = Datos$Ventas ~ Datos$Publ_TV + Datos$Publ_periodicos)
## 
## Coefficients:
##           (Intercept)          Datos$Publ_TV  Datos$Publ_periodicos  
##                 2.177                  3.450                 11.364

Vemos que dan exactamente los mismos coeficientes. Por lo tanto, el cálculo se hizo de la manera adecuada.

Significancia de los B’s

IC <- confint(M_F)
IC
##                            2.5 %    97.5 %
## (Intercept)           -0.8949249  5.249530
## Datos$Publ_periodicos  7.7409524 14.986563
## Datos$Publ_TV          1.2765196  5.622779

El coeficiente estimado para la publicidad en televesión es estadísticamente significativo, ya que su intervalo de confianza no incluye al 0. Una inversión en publicidad para televesión se asocia, en promedio, con un incremento de 1.27 a 5.62 unidades. Por otro lado, el coeficiente estimado para la publicidad en periódicos también es estadísticamente significativos, puesto que tampoco incluye al 0. Es decir, por cada unidad adicional (manteniendo la otra variable independiente constante), las ventas aumentan, en promedio, entre 7.74 y 14.98 unidades.

Verificación de supuestos

Primero verifiquemos los residuos:

Residuos <- M_F$residuals

Veamos si son normales:

shapiro.test(Residuos)
## 
##  Shapiro-Wilk normality test
## 
## data:  Residuos
## W = 0.89609, p-value = 0.03486

Como el p-valor es menor a 0.05, los residuos no siguen una distribución aproximadamente normal.

plot(M_F)

Podemos destacar varias cosas de los gráficos generados:

Puntos de alto Leverage y puntos influyentes

Primero, hacemos la prueba Bonferroni para identificar las observaciones atípicas que se pueden presentar en el modelo, ya tenemos algunas sospechas de las observaciones 7, 14 y 15.

outlierTest(M_F, cutoff = Inf)  # Usa Bonferroni por defecto
##      rstudent unadjusted p-value Bonferroni p
## 15 -3.1776731          0.0058456      0.11691
## 7   2.2781917          0.0367870      0.73575
## 14 -2.2750562          0.0370140      0.74028
## 12  1.0801942          0.2960700           NA
## 17 -1.0329348          0.3170000           NA
## 9   0.9575068          0.3525600           NA
## 2   0.6794906          0.5065400           NA
## 18 -0.6042644          0.5541400           NA
## 6   0.5809693          0.5693600           NA
## 19  0.4425471          0.6640200           NA

De acuerdo a los resultados obtenidos podemos destacar varias cosas:

Ahora, procederemos a calcular cada \(h_{ii}\) para ver el leverage de cada unio:

leverage <- hatvalues(M_F)
plot(leverage, type = "h", main = "Leverage de cada observación",
     ylab = "Leverage", xlab = "Observación")
abline(h = 2 * mean(leverage), col = "red", lty = 2)  # umbral común

Podemos notar que la observación 12 presenta un leverage alto, ya que sobrepasa la línea del umbral. Es importante destacar que, según la prueba de Bonferroni, la observación 12 no se considera un outlier, ya que su valor p ajustado es mayor a 0.05. Esto indica que, aunque no se desvía significativamente, sí está alejada del centroide del espacio formado por las variables predictoras (Alto Leverage). En consecuencia, podemos clasificarla como una observación con leverage alto pero sin evidencia de ser un outlier, es decir, un “no outlier con leverage alto”. Este tipo de observaciones no necesariamente son problemáticas, siempre que sigan la tendencia general del modelo.

Por otro lado, notamos que la observación 20 presenta un leverage moderadamente bajo, ya que aunque sobrepasa la línea del umbral, no es tan notable como la observación 12. Además, como destacamos anteriormente, la observación 20 tampoco fue considera un outlier, pues su p-valor fue mayor a 0.05. Por lo cual, lo podemos clasificar como una observación con leverage moderamente bajo pero sin evidencia de ser un atípico (según prueba Bonferroni), es decir, un “no outlier con leverage alto”.

Verifiquemos ahora la distancia de Cook:

cooks_d <- cooks.distance(M_F)
plot(cooks_d, type = "h", main = "Distancia de Cook",
     ylab = "Cook's Distance", xlab = "Observación")
abline(h = 4 / nrow(Datos), col = "red", lty = 2)  # Umbral sugerido

plot(M_F, which=4)

cooks.distance(M_F)
##            1            2            3            4            5            6 
## 4.518902e-04 1.317799e-02 1.654905e-03 6.555043e-04 1.219012e-04 1.454636e-02 
##            7            8            9           10           11           12 
## 2.299086e-01 9.301275e-04 2.046781e-02 4.747484e-03 6.989973e-05 4.967809e-01 
##           13           14           15           16           17           18 
## 7.198508e-04 1.600363e-01 2.623559e-01 1.171736e-04 5.213884e-02 2.682911e-02 
##           19           20 
## 1.694546e-02 1.409202e-02
cooks.distance(M_F)[which.max(cooks.distance(M_F))]
##        12 
## 0.4967809

De acuerdo al gráfico podemos destacar varias cosas:

Recordar que: Que un punto tenga algo Leverage, significa que tiene un valor extremo en las variables predictoras, esto es, su combinación de valores para las variables independientes se encuentra muy alejada del centroide (el punto promedio de todas las observaciones).

Veamos la influencia de cada uno:

influencePlot(M_F, id.method = "identify", main = "Gráfico de influencia",
              sub = "Tamaño del punto = Cook's Distance")

##       StudRes       Hat      CookD
## 7   2.2781917 0.1421067 0.22990855
## 12  1.0801942 0.5632812 0.49678091
## 15 -3.1776731 0.1068709 0.26235586
## 20  0.2912994 0.3203721 0.01409202

De acuerdo al gráfico podemos notar varias cosas ya previamente mencionadas:

plot(M_F, which = 5)

par(mfrow = c(2, 2))
plot(M_F)  # Diagnóstico clásico: residuos, leverage, Cook, QQ

par(mfrow = c(1, 1))  # Restaurar layout

De acuerdo con el gráfico podemos destacar varias cosas:

Analicemos más de cerca:

summary(influence.measures(M_F))
## Potentially influential observations of
##   lm(formula = Datos$Ventas ~ Datos$Publ_periodicos + Datos$Publ_TV) :
## 
##    dfb.1_ dfb.Dt$P_ dfb.D$P_T dffit cov.r   cook.d hat    
## 12  0.23   1.07_*   -0.84      1.23  2.22_*  0.50   0.56_*
## 15  0.13   0.60     -0.72     -1.10  0.31_*  0.26   0.11  
## 20 -0.13   0.14      0.05      0.20  1.74_*  0.01   0.32

De acuerdo a los resultados obtenidos podemos observar que:

En conclusión, con todas estas pruebas que se hicieron la observación 12 fue la más destacada en la distancia de Cook, por lo que es la más influyente y puede cambiar drásticamente los coeficientes del modelo si se considera eliminarla. Por lo que hay que analizarla con cuidado y verificar herramientas para observarla de manera más adecuada. La observación 7 y 15 también vale la pena revisarlas, pero parecen ser más outliers que puntos muy influyentes, pues aunquen aparecen marcadas en la distancia de Cook no parecen influir de manera notable como lo hace la observación 12.

VARIABLES CATÉGORICAS - MRLM

Carga de datos

Meses <- c(2, 6, 8, 3, 2, 7, 9, 8, 4, 6)
Tipo <- c("eléctrico", "mecánico", "eléctrico", "mecánico", "eléctrico", "eléctrico", "mecánico", "mecánico", "eléctrico", "eléctrico")
Horas <- c(2.9, 3.0, 4.8, 1.8, 2.9, 4.9, 4.2, 4.8, 4.4, 4.5)
Datos_Johnson <- data.frame(Meses, Tipo, Horas)
Datos_Johnson
##    Meses      Tipo Horas
## 1      2 eléctrico   2.9
## 2      6  mecánico   3.0
## 3      8 eléctrico   4.8
## 4      3  mecánico   1.8
## 5      2 eléctrico   2.9
## 6      7 eléctrico   4.9
## 7      9  mecánico   4.2
## 8      8  mecánico   4.8
## 9      4 eléctrico   4.4
## 10     6 eléctrico   4.5

Creaación variable dummy

Datos_Johnson$Tipo_dummy <- ifelse(Datos_Johnson$Tipo == "eléctrico", 1, 0)
Datos_Johnson
##    Meses      Tipo Horas Tipo_dummy
## 1      2 eléctrico   2.9          1
## 2      6  mecánico   3.0          0
## 3      8 eléctrico   4.8          1
## 4      3  mecánico   1.8          0
## 5      2 eléctrico   2.9          1
## 6      7 eléctrico   4.9          1
## 7      9  mecánico   4.2          0
## 8      8  mecánico   4.8          0
## 9      4 eléctrico   4.4          1
## 10     6 eléctrico   4.5          1
Y1 <- Datos_Johnson$Horas
X1 <- cbind(1,
            Datos_Johnson$Meses,
            Datos_Johnson$Tipo_dummy
            )

Ahora, hagamos los cálculos con la estimación de minimos cuadrados:

#t(X) transpuesta de esa matriz, %*% multiplicación, supongo que solve es inversa.
XtX1 <- t(X1) %*% X1 
Xty1 <- t(X1) %*% Y1
beta_hat1 <- solve(XtX1) %*% Xty1

Los mostramos de manera más ordenada:

colnames(beta_hat1) <- "Estimación"
rownames(beta_hat1) <- c("Intercepto", "Meses", "Tipo de reparación")
beta_hat1
##                    Estimación
## Intercepto          0.9304954
## Meses               0.3876161
## Tipo de reparación  1.2626935

Ahora, hagamos lo mismo con la función:

modelo_multiple <- lm(Horas ~ Meses + Tipo_dummy, data = Datos_Johnson)
summary(modelo_multiple)
## 
## Call:
## lm(formula = Horas ~ Meses + Tipo_dummy, data = Datos_Johnson)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.49412 -0.24690 -0.06842 -0.00960  0.76858 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.93050    0.46697   1.993 0.086558 .  
## Meses        0.38762    0.06257   6.195 0.000447 ***
## Tipo_dummy   1.26269    0.31413   4.020 0.005062 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.459 on 7 degrees of freedom
## Multiple R-squared:  0.8592, Adjusted R-squared:  0.819 
## F-statistic: 21.36 on 2 and 7 DF,  p-value: 0.001048

Como podemos observar, nos da lo mismo por lo cual, se hicieron los cálculos de manera correcta. El modelo nos queda de la siguiente manera:

\[y = 0.93 + 0.38x_1+1.26 x_2\] - Intercepto (0.93): Una solicitud de servicio mecánico realizada en el mes 0 (es decir, cuando Meses = 0), se espera que tome 0.93 horas en promedio para su reparación. No es significativo ya que tiene un p-valor mayor a 0.05.

  • x1 (0.38): Por cada mes adicional, se espera que el tiempo promedio para su reparación aumente aproximadamente 0.38 horas, manteniendo el resto de variables constantes. Es altamente significativo.

  • x2 (0.38): Una solicitud de servicio eléctrico toma, en promedio, 1.26 horas más que un servicio mécanico, manteniendo constante el número de meses. Es significativo.

  • Coeficientes: El 85% de la variabilidad en el tiempo de reparación (en horas) se explica por el número de meses transcurrido y el tipo de reparación, mientras que el 15% restante se debe a otras variables no incluidas en el estudio. El \(R^{2}_{ajustado} = 0.819\) indica que aproximadamente el 81.9% de la variabilidad en el tiempo de reparación se explica por el modelo, ajustando por el número de variables que incluye. Esto significa que el modelo tiene un buen poder explicativo y que solo queda un 18.1% de variabilidad debido a factores no considerados o error.

Verificar significancia

modelo_reducido <- lm(Horas ~ Meses, data = Datos_Johnson)
modelo_completo <- lm(Horas ~ Meses + Tipo_dummy, data = Datos_Johnson)
anova(modelo_reducido, modelo_completo)
## Analysis of Variance Table
## 
## Model 1: Horas ~ Meses
## Model 2: Horas ~ Meses + Tipo_dummy
##   Res.Df    RSS Df Sum of Sq      F   Pr(>F)   
## 1      8 4.8800                                
## 2      7 1.4751  1    3.4049 16.158 0.005062 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Al comparar el modelo reducido (solo Meses) con el modelo completo (Meses + Tipo_dummy), el valor de p = 0.005 es menor que 0.05, lo que indica que agregar la variable Tipo_dummy mejora significativamente el modelo. Es decir, el tipo de reparación aporta información importante para explicar el tiempo de reparación.