pendiente
pendiente
ventas <- c(242, 235, 232, 178, 184, 140, 145, 152, 110, 130, 152, 206,
263, 238, 247, 193, 193, 149, 157, 161, 122, 130, 167, 230,
282, 255, 265, 205, 210, 160, 166, 174, 126, 148, 173, 235)
mes <- rep(1:12, 3)
t <- 1:36
plot(ventas, type = "l")
n <- length(ventas)
cma <- rep(NA, n)
for (i in 7:(n - 6)) {
cma[i] <- (0.5 * ventas[i - 6] + sum(ventas[(i - 5):(i + 5)]) + 0.5 * ventas[i + 6]) / 12
}
razon <- ventas / cma
indice <- rep(0, 12)
for (m in 1:12) {
indice[m] <- mean(razon[mes == m], na.rm = TRUE)
}
indice <- indice * 12 / sum(indice)
tabla_indices <- data.frame(mes = 1:12, indice = round(indice, 4))
tabla_indices
## mes indice
## 1 1 1.4436
## 2 2 1.2997
## 3 3 1.3441
## 4 4 1.0412
## 5 5 1.0494
## 6 6 0.8004
## 7 7 0.8283
## 8 8 0.8530
## 9 9 0.6280
## 10 10 0.7003
## 11 11 0.8528
## 12 12 1.1593
plot(indice, type = "b")
abline(h = 1)
desestacionalizada <- ventas / indice[mes]
plot(desestacionalizada, type = "l")
modelo_tendencia <- lm(desestacionalizada ~ t)
summary(modelo_tendencia)
##
## Call:
## lm(formula = desestacionalizada ~ t)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.1892 -2.2527 -0.4848 0.8131 9.4189
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 169.3494 1.0926 155.00 <2e-16 ***
## t 1.0213 0.0515 19.83 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.21 on 34 degrees of freedom
## Multiple R-squared: 0.9204, Adjusted R-squared: 0.9181
## F-statistic: 393.3 on 1 and 34 DF, p-value: < 2.2e-16
t_futuro <- 37:48
mes_futuro <- 1:12
tendencia_futura <- predict(modelo_tendencia, data.frame(t = t_futuro))
pronostico_desc <- tendencia_futura * indice[mes_futuro]
data.frame(mes = mes_futuro, pronostico = round(pronostico_desc, 1))
## mes pronostico
## 1 1 299.0
## 2 2 270.5
## 3 3 281.2
## 4 4 218.9
## 5 5 221.7
## 6 6 169.9
## 7 7 176.6
## 8 8 182.8
## 9 9 135.2
## 10 10 151.5
## 11 11 185.3
## 12 12 253.2
modelo_dummies <- lm(ventas ~ t + factor(mes))
summary(modelo_dummies)
##
## Call:
## lm(formula = ventas ~ t + factor(mes))
##
## Residuals:
## Min 1Q Median 3Q Max
## -8.1250 -1.9583 0.1667 2.2292 7.4583
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 249.10764 2.74567 90.727 < 2e-16 ***
## t 1.01736 0.07554 13.467 2.14e-12 ***
## factor(mes)2 -20.68403 3.62688 -5.703 8.30e-06 ***
## factor(mes)3 -16.36806 3.62924 -4.510 0.000158 ***
## factor(mes)4 -73.38542 3.63317 -20.199 3.90e-16 ***
## factor(mes)5 -70.73611 3.63866 -19.440 8.97e-16 ***
## factor(mes)6 -117.75347 3.64571 -32.299 < 2e-16 ***
## factor(mes)7 -112.43750 3.65431 -30.768 < 2e-16 ***
## factor(mes)8 -107.12153 3.66445 -29.233 < 2e-16 ***
## factor(mes)9 -151.13889 3.67611 -41.114 < 2e-16 ***
## factor(mes)10 -135.48958 3.68928 -36.725 < 2e-16 ***
## factor(mes)11 -108.50694 3.70395 -29.295 < 2e-16 ***
## factor(mes)12 -49.85764 3.72009 -13.402 2.36e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.441 on 23 degrees of freedom
## Multiple R-squared: 0.9942, Adjusted R-squared: 0.9911
## F-statistic: 327 on 12 and 23 DF, p-value: < 2.2e-16
nuevos <- data.frame(t = t_futuro, mes = mes_futuro)
pronostico_dummies <- predict(modelo_dummies, nuevos)
data.frame(mes = mes_futuro, pronostico = round(pronostico_dummies, 1))
## mes pronostico
## 1 1 286.8
## 2 2 267.1
## 3 3 272.4
## 4 4 216.4
## 5 5 220.1
## 6 6 174.1
## 7 7 180.4
## 8 8 186.8
## 9 9 143.8
## 10 10 160.4
## 11 11 188.4
## 12 12 248.1
resumen <- data.frame(mes = 1:12,
indice = round(indice, 3),
descomposicion = round(pronostico_desc, 1),
dummies = round(pronostico_dummies, 1))
resumen
## mes indice descomposicion dummies
## 1 1 1.444 299.0 286.8
## 2 2 1.300 270.5 267.1
## 3 3 1.344 281.2 272.4
## 4 4 1.041 218.9 216.4
## 5 5 1.049 221.7 220.1
## 6 6 0.800 169.9 174.1
## 7 7 0.828 176.6 180.4
## 8 8 0.853 182.8 186.8
## 9 9 0.628 135.2 143.8
## 10 10 0.700 151.5 160.4
## 11 11 0.853 185.3 188.4
## 12 12 1.159 253.2 248.1
plot(pronostico_desc, type = "l")
lines(pronostico_dummies, lty = 2)
print(sum(pronostico_desc))
## [1] 2545.76
print(sum(pronostico_dummies))
## [1] 2544.667
real_enero <- 295
error_desc <- real_enero - pronostico_desc[1]
error_dummies <- real_enero - pronostico_dummies[1]
print(error_desc)
## 1
## -4.020918
print(error_dummies)
## 1
## 8.25
print(error_desc / real_enero * 100)
## 1
## -1.363023
print(error_dummies / real_enero * 100)
## 1
## 2.79661
Afirmacion: el Vintage Restaurant tiene una estacionalidad muy marcada con una tendencia de crecimiento leve, y cualquiera de los dos modelos sirve para pronosticar el cuarto año. Razon: los indices estacionales van de 0.63 en septiembre a 1.44 en enero, o sea que un mes bueno vende mas del doble que uno malo, mientras que la tendencia solo aporta como 12 mil dolares de crecimiento al año. Evidencia: los dos modelos pronostican un total anual casi igual (2,546 contra 2,545 mil dolares) y el error en enero fue de apenas 1.4% y 2.8% contra la venta real de 295 mil.
carlson <- c(1.71, 1.90, 2.74, 4.20,
1.45, 1.80, 2.03, 1.99, 2.32, 2.20, 2.13, 2.43, 1.90, 2.13, 2.56, 4.16,
2.31, 1.89, 2.02, 2.23, 2.39, 2.14, 2.27, 2.21, 1.89, 2.29, 2.83, 4.04,
2.31, 1.99, 2.42, 2.45, 2.57, 2.42, 2.40, 2.50, 2.09, 2.54, 2.97, 4.35,
2.56, 2.28, 2.69, 2.48, 2.73, 2.37, 2.31, 2.23)
condado <- c(55.80, 56.40, 71.40, 117.60,
46.80, 48.00, 60.00, 57.60, 61.80, 58.20, 56.40, 63.00, 57.60, 53.40, 71.40, 114.00,
46.80, 48.60, 59.40, 58.20, 60.60, 55.20, 51.00, 58.80, 49.80, 54.60, 65.40, 102.00,
43.80, 45.60, 57.60, 53.40, 56.40, 52.80, 54.00, 60.60, 47.40, 54.60, 67.80, 100.20,
48.00, 51.60, 57.60, 58.20, 60.00, 57.00, 57.60, 61.80)
mes2 <- c(9, 10, 11, 12, rep(1:12, 3), 1:8)
t2 <- 1:48
plot(carlson, type = "l")
plot(condado, type = "l")
analizar <- function(y) {
n <- length(y)
cma <- rep(NA, n)
for (i in 7:(n - 6)) {
cma[i] <- (0.5 * y[i - 6] + sum(y[(i - 5):(i + 5)]) + 0.5 * y[i + 6]) / 12
}
razon <- y / cma
indice <- rep(0, 12)
for (m in 1:12) {
indice[m] <- mean(razon[mes2 == m], na.rm = TRUE)
}
indice <- indice * 12 / sum(indice)
desest <- y / indice[mes2]
modelo <- lm(desest ~ t2)
tendencia <- predict(modelo, data.frame(t2 = 49:52))
pronostico <- tendencia * indice[9:12]
list(indice = indice, modelo = modelo, pronostico = pronostico)
}
res_carlson <- analizar(carlson)
data.frame(mes = c("Septiembre", "Octubre", "Noviembre", "Diciembre"),
pronostico = round(res_carlson$pronostico, 2))
## mes pronostico
## 1 Septiembre 2.16
## 2 Octubre 2.54
## 3 Noviembre 3.06
## 4 Diciembre 4.60
print(sum(res_carlson$pronostico))
## [1] 12.3579
res_condado <- analizar(condado)
data.frame(mes = c("Septiembre", "Octubre", "Noviembre", "Diciembre"),
pronostico = round(res_condado$pronostico, 2))
## mes pronostico
## 1 Septiembre 50.55
## 2 Octubre 53.20
## 3 Noviembre 66.78
## 4 Diciembre 103.11
print(sum(res_condado$pronostico))
## [1] 273.6424
real_condado <- c(69.00, 75.00, 85.20, 121.80)
comparacion <- data.frame(mes = c("Septiembre", "Octubre", "Noviembre", "Diciembre"),
pronosticado = round(res_condado$pronostico, 2),
real = real_condado,
razon = round(real_condado / res_condado$pronostico, 4))
comparacion
## mes pronosticado real razon
## 1 Septiembre 50.55 69.0 1.3650
## 2 Octubre 53.20 75.0 1.4099
## 3 Noviembre 66.78 85.2 1.2758
## 4 Diciembre 103.11 121.8 1.1812
print(sum(real_condado))
## [1] 351
print(sum(res_condado$pronostico))
## [1] 273.6424
print(sum(real_condado) / sum(res_condado$pronostico))
## [1] 1.282696
ajustado <- res_carlson$pronostico * (real_condado / res_condado$pronostico)
perdida <- data.frame(mes = c("Septiembre", "Octubre", "Noviembre", "Diciembre"),
sin_huracan = round(res_carlson$pronostico, 2),
con_efecto = round(ajustado, 2))
perdida$exceso <- round(perdida$con_efecto - perdida$sin_huracan, 2)
perdida
## mes sin_huracan con_efecto exceso
## 1 Septiembre 2.16 2.95 0.79
## 2 Octubre 2.54 3.59 1.05
## 3 Noviembre 3.06 3.90 0.84
## 4 Diciembre 4.60 5.43 0.83
print(sum(perdida$sin_huracan))
## [1] 12.36
print(sum(perdida$con_efecto))
## [1] 15.87
print(sum(perdida$exceso))
## [1] 3.51
Afirmacion: Carlson perdio alrededor de 12.36 millones de dolares en ventas normales durante los cuatro meses que estuvo cerrada, y ademas tiene argumentos para reclamar unos 3.51 millones adicionales por el exceso de ventas relacionado con el huracan, para un total cercano a 15.87 millones. Razon: el pronostico de 12.36 millones sale de la tendencia y la estacionalidad propias de la tienda, sin considerar el huracan, pero los datos del condado muestran que despues del desastre la actividad comercial subio bastante, y Carlson habria participado de ese aumento igual que las demas tiendas. Evidencia: el condado vendio 351 millones de septiembre a diciembre contra los 273.6 que se esperaban, o sea 28% por encima de lo normal, y aplicando ese mismo factor mes con mes a Carlson su venta estimada sube de 12.36 a 15.87 millones.