# install.packages("forecast")
library(forecast)
# install.packages("tidyverse")
library(tidyverse)
# install.packages("ggplot2")
library(ggplot2)
# install.packages("maps")
library(maps)
#file.choose()
poblacion <- read.csv("C:\\Users\\sesa777394\\Downloads\\population.csv")
summary(poblacion)
## state year population
## Length:6020 Min. :1900 Min. : 43000
## Class :character 1st Qu.:1930 1st Qu.: 901483
## Mode :character Median :1960 Median : 2359000
## Mean :1960 Mean : 3726003
## 3rd Qu.:1990 3rd Qu.: 4541883
## Max. :2019 Max. :39512223
str(poblacion)
## 'data.frame': 6020 obs. of 3 variables:
## $ state : chr "AK" "AK" "AK" "AK" ...
## $ year : int 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
## $ population: int 135000 158000 189000 205000 215000 222000 224000 231000 224000 224000 ...
head(poblacion)
## state year population
## 1 AK 1950 135000
## 2 AK 1951 158000
## 3 AK 1952 189000
## 4 AK 1953 205000
## 5 AK 1954 215000
## 6 AK 1955 222000
poblacion_texas <- poblacion %>% filter(state=="TX")
ggplot(poblacion_texas, aes(x=year, y=population)) +
geom_line() +
labs(title="Poblacion de Texas", x = "Año", y = "Poblacion")
ts_texas <- ts(poblacion_texas$population, start=1900, frequency = 1) #Serie de Tiempo Anual
# ts_texas <- ts(poblacion_texas$population, start=1900, 4, frequency = 4) #Serie de Tiempo Trimestral, 4 significa que arranca el cuarto trimestre
# ts_texas <- ts(poblacion_texas$population, start=1900, 8, frequency = 12) #Serie de Tiempo Mensual, 8 significa que arranca en agosto
arima_texas <- auto.arima(ts_texas)
summary(arima_texas)
## Series: ts_texas
## ARIMA(0,2,2)
##
## Coefficients:
## ma1 ma2
## -0.5950 -0.1798
## s.e. 0.0913 0.0951
##
## sigma^2 = 1.031e+10: log likelihood = -1527.14
## AIC=3060.28 AICc=3060.5 BIC=3068.6
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 12147.62 99818.31 59257.39 0.1046163 0.5686743 0.2672197
## ACF1
## Training set -0.02136734
pronostico_texas <- forecast(arima_texas, level = 95, h = 20)
pronostico_texas
## Point Forecast Lo 95 Hi 95
## 2020 29398472 29199487 29597457
## 2021 29806827 29463665 30149990
## 2022 30215183 29742956 30687410
## 2023 30623538 30024100 31222977
## 2024 31031894 30303359 31760429
## 2025 31440249 30579246 32301253
## 2026 31848605 30851090 32846119
## 2027 32256960 31118581 33395339
## 2028 32665316 31381587 33949044
## 2029 33073671 31640070 34507272
## 2030 33482027 31894047 35070007
## 2031 33890382 32143561 35637204
## 2032 34298738 32388674 36208801
## 2033 34707093 32629456 36784730
## 2034 35115449 32865983 37364914
## 2035 35523804 33098330 37949278
## 2036 35932160 33326573 38537746
## 2037 36340515 33550788 39130242
## 2038 36748871 33771046 39726695
## 2039 37157226 33987418 40327034
plot(pronostico_texas)
# Instalar y/o cargar librerías necesarias
# install.packages(c("dplyr", "ggplot2", "forecast", "maps"))
library(dplyr)
library(ggplot2)
library(forecast)
library(maps)
# 1) Cargar los datos ----------------------------------------
poblacion <- read.csv("population.csv")
# 2) Generar pronósticos para cada estado hasta el año 2050 ---
# y combinarlos con los datos originales
# Creamos un dataset extendido que inicialmente es igual al original
poblacion_extendida <- poblacion
# Identificamos los estados únicos
estados <- unique(poblacion$state)
# Para cada estado, entrenamos un modelo ARIMA y hacemos forecast hasta 2050
for(st in estados){
# Filtrar datos de ese estado y ordenarlos por año
datos_st <- poblacion %>%
filter(state == st) %>%
arrange(year)
# Determinar el último año disponible
ultimo_anio <- max(datos_st$year)
# Crear serie de tiempo
ts_st <- ts(datos_st$population,
start = min(datos_st$year),
end = ultimo_anio,
frequency = 1) # Anual
# Entrenar el modelo ARIMA
modelo_st <- auto.arima(ts_st)
# Calcular cuántos años hay que pronosticar
# (solo hacemos forecast si el ultimo_anio es < 2050)
h_years <- 2050 - ultimo_anio
if(h_years > 0){
# Hacemos el pronóstico
pronostico <- forecast(modelo_st, h = h_years)
# Creamos un data frame con los resultados
anios_pronostico <- (ultimo_anio + 1):2050
poblacion_pronosticada <- as.numeric(pronostico$mean)
df_forecast <- data.frame(
state = st,
year = anios_pronostico,
population = poblacion_pronosticada
)
# Agregamos filas con la población pronosticada
poblacion_extendida <- rbind(poblacion_extendida, df_forecast)
}
}
# 3) Función para graficar el mapa para un año dado ------------
plot_map <- function(year) {
# Filtramos los datos para el año solicitado
data_year <- poblacion_extendida %>%
filter(year == !!year)
# Cargar datos geográficos de EE.UU.
states_map <- map_data("state")
# Necesitamos relacionar la sigla (state) con el nombre en minúsculas
# R trae dos vectores auxiliares: state.abb (siglas) y state.name (nombres completos)
data_year <- data_year %>%
mutate(region = tolower(state.name[match(state, state.abb)])) %>%
right_join(states_map, by = "region")
# Graficar
ggplot(data_year, aes(x = long, y = lat, group = group, fill = population)) +
geom_polygon(color = "black") +
# Gradiente verde -> rojo
scale_fill_gradient(
low = "green", # color mínimo
high = "red", # color máximo
name = "Población"
) +
labs(
title = paste("Población por Estado en", year)
) +
theme_void() +
theme(
legend.position = "right",
plot.title = element_text(size = 16, face = "bold")
)
}
# 4) Graficar el mapa cada década entre 1900 y 2050 -------------
for(year in seq(1900, 2050, by = 10)) {
print(plot_map(year))
}
Hershey <- read.csv("C:\\Users\\sesa777394\\Downloads\\Ventas_Históricas_Lechitas.csv")
Hershey
## Mes Ventas
## 1 ene-17 25520.51
## 2 feb-17 23740.11
## 3 mar-17 26253.58
## 4 abr-17 25868.43
## 5 may-17 27072.87
## 6 jun-17 27150.50
## 7 jul-17 27067.10
## 8 ago-17 28145.25
## 9 sep-17 27546.29
## 10 oct-17 28400.37
## 11 nov-17 27441.98
## 12 dic-17 27852.47
## 13 ene-18 28463.69
## 14 feb-18 26996.11
## 15 mar-18 29768.20
## 16 abr-18 29292.51
## 17 may-18 29950.68
## 18 jun-18 30099.17
## 19 jul-18 30851.26
## 20 ago-18 32271.76
## 21 sep-18 31940.74
## 22 oct-18 32995.93
## 23 nov-18 32197.12
## 24 dic-18 31984.82
## 25 ene-19 32496.44
## 26 feb-19 31287.28
## 27 mar-19 33376.02
## 28 abr-19 32949.77
## 29 may-19 34004.11
## 30 jun-19 33757.89
## 31 jul-19 32927.30
## 32 ago-19 34324.12
## 33 sep-19 35151.28
## 34 oct-19 36133.07
## 35 nov-19 34799.91
## 36 dic-19 34846.17
ts_ventas <- ts(Hershey$Ventas, start=c(2017,1), frequency = 12)
autoplot(ts_ventas) + labs(title = "Ventas de Leche Saborizada Hersheys", x="Tiempo", y="Miles de Dólares")
arima_ventas <- auto.arima(ts_ventas)
summary(arima_ventas)
## Series: ts_ventas
## ARIMA(1,0,0)(1,1,0)[12] with drift
##
## Coefficients:
## ar1 sar1 drift
## 0.6383 -0.5517 288.8980
## s.e. 0.1551 0.2047 14.5026
##
## sigma^2 = 202700: log likelihood = -181.5
## AIC=371 AICc=373.11 BIC=375.72
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 25.22163 343.863 227.1699 0.08059942 0.7069541 0.06491041
## ACF1
## Training set 0.2081043
pronostico_ventas<- forecast(arima_ventas, level = 95, h = 12)
pronostico_ventas
## Point Forecast Lo 95 Hi 95
## Jan 2020 35498.90 34616.48 36381.32
## Feb 2020 34202.17 33155.29 35249.05
## Mar 2020 36703.01 35596.10 37809.92
## Apr 2020 36271.90 35141.44 37402.36
## May 2020 37121.98 35982.07 38261.90
## Jun 2020 37102.65 35958.91 38246.40
## Jul 2020 37151.04 36005.74 38296.35
## Aug 2020 38564.65 37418.71 39710.59
## Sep 2020 38755.23 37609.03 39901.42
## Oct 2020 39779.03 38632.73 40925.33
## Nov 2020 38741.63 37595.29 39887.97
## Dec 2020 38645.86 37499.50 39792.22
autoplot(pronostico_ventas) + labs(title = "Ventas de Leche Saborizada Hersheys 2020", x="Tiempo", y="Miles de Dólares")
Hershey$mes <- 1:36
regresion_Hershey <- lm(Ventas ~ mes, data = Hershey)
summary(regresion_Hershey)
##
## Call:
## lm(formula = Ventas ~ mes, data = Hershey)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2075.79 -326.41 33.74 458.41 1537.04
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 24894.67 275.03 90.52 <2e-16 ***
## mes 298.37 12.96 23.02 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 808 on 34 degrees of freedom
## Multiple R-squared: 0.9397, Adjusted R-squared: 0.9379
## F-statistic: 529.8 on 1 and 34 DF, p-value: < 2.2e-16
años_prediccion <- data.frame(mes = 37:48)
prediccion_regresion <- predict(regresion_Hershey, años_prediccion)
prediccion_regresion
## 1 2 3 4 5 6 7 8
## 35934.49 36232.86 36531.23 36829.61 37127.98 37426.35 37724.73 38023.10
## 9 10 11 12
## 38321.47 38619.85 38918.22 39216.59
plot(Hershey$mes, Hershey$Ventas,
main = "Pronostico de Ventas 2020 de Leche Saborizada Hersheys",
xlab="Tiempo",
xlim=c(1,50),
ylim=range(c(Hershey$Ventas, prediccion_regresion)))
abline(regresion_Hershey, col = "blue")
points(años_prediccion$mes, prediccion_regresion, col = "red")
## Recomendaciones
# El arima es un modelo de prediccion más certero ya que tiene un MAPE menor.
# El mejor modelo que se adapta a la serie es el **SARIMA** con un MAPE de 0.71%, comparado con la Regresion Lineal que su MAPE es de 2.01%.
# Segun el modelo SARIMA, para el siguiente año la proyeccion de ventas es la siguiente:
| Mes y año | escenario esperado | escenario pesimista | escenario optimista |
|---|---|---|---|
| Jan 2020 | 35498.90 | 34616.48 | 36381.32 |
| Feb 2020 | 34202.17 | 33155.28 | 35249.05 |
| Mar 2020 | 36703.01 | 35596.10 | 37809.92 |
| Apr 2020 | 36271.90 | 35141.44 | 37402.36 |
| May 2020 | 37121.98 | 35982.07 | 38261.90 |
| Jun 2020 | 37102.65 | 35958.90 | 38246.40 |
| Jul 2020 | 37151.04 | 36005.73 | 38296.34 |
| Aug 2020 | 38564.64 | 37418.70 | 39710.58 |
| Sep 2020 | 38755.22 | 37609.03 | 39901.42 |
| Oct 2020 | 39779.02 | 38632.72 | 40925.32 |
# Una recomendación para la empresa podría ser prepararse para un crecimeinto de ventas en el próximo año, de tal forma que se invierta en mejorar la maquinaria, aumentar o capacitar mejor al personal y así tener las herrameintas necesarias para elevar la producción
ventas_por_año <- read.csv("C:\\Users\\sesa777394\\Downloads\\ventas_por_anio.csv")
ggplot(ventas_por_año, aes(x=mes, y=ventas, col=as.factor(anio), group=anio)) +
geom_line() +
labs(title = "Ventas de leche saborizada Hershey´s por año", x = "Mes", y = "Miles de dólares") +
scale_x_continuous(breaks = 1:12)
# Ademas de la recomendacion de Hershey en polvo para leche con chocolate caliente en los primeros meses frios del año, seria monitorear cerca las ventas en unidades ya que la cantidad monetaria podria darnos la impresion de que vendemos más pero podria ser la inflacion.