#1 Cargar los paquetes necesarios

#2 Leer base de datos

#3 Construcción de variables

# Nota, la predicción que vamos a hacer es de ventas en valores corrientes
df_reg <- df %>% #llamar la base de datos
  filter(State=="New York") %>% 
  select(Order.Date, Sales) %>% 
  mutate(Order.Date = mdy(Order.Date)) %>%  
  mutate(Fecha = floor_date(Order.Date, unit="month")) %>%  
  group_by(Fecha) %>%
  summarise(Ventas = sum(Sales)) %>%
  mutate(Mes = seq_along(Fecha)) # Crear variable x 
head (df_reg)
## # A tibble: 6 × 3
##   Fecha       Ventas   Mes
##   <date>       <dbl> <int>
## 1 2014-01-01    3.93     1
## 2 2014-02-01   65.0      2
## 3 2014-03-01 4936.       3
## 4 2014-04-01  491.       4
## 5 2014-05-01 1169.       5
## 6 2014-06-01 5743.       6

#4 Visualización

df_reg %>%
  ggplot(., aes(x=Mes, y=Ventas)) + 
  geom_point() +
  geom_line() + 
  geom_smooth(method = "lm", formula = "y ~ x" )

#Gráficas de caja y bigotes

# Esta gáfica  sirve para encontrar valores atípicos
df_reg %>%
  ggplot(., aes(x=Ventas)) + 
  geom_boxplot()

#6 Revisar si la variable y tienes una dsitribución aprox normal

df_reg %>%
  ggplot(., aes(x=Ventas)) +
  geom_histogram(bins=30, aes(y=after_stat(density))) +
  geom_density()

#7 Análisis de correlación

# Calculamos coeficiente de correlación de Pearson, con Mes como x
with(df_reg, cor.test(Mes, Ventas))
## 
##  Pearson's product-moment correlation
## 
## data:  Mes and Ventas
## t = 1.9685, df = 46, p-value = 0.05505
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.005857389  0.521567723
## sample estimates:
##       cor 
## 0.2787412
#La correlación va de -1 a 1
#Valores extremos inidcan correlación más fuerte
#Puede ser positiva  (suben o bajan juntas), o negativa (si una sube la otra baja)

#8 Modelo de regresión

modelo_lineal <- lm(Ventas ~ Mes, data = df_reg)
stargazer(modelo_lineal, type = "text")
## 
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                               Ventas           
## -----------------------------------------------
## Mes                          123.003*          
##                              (62.485)          
##                                                
## Constant                    3,463.011*         
##                             (1,758.658)        
##                                                
## -----------------------------------------------
## Observations                    48             
## R2                             0.078           
## Adjusted R2                    0.058           
## Residual Std. Error     5,997.222 (df = 46)    
## F Statistic             3.875* (df = 1; 46)    
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01

#9 Obtener los coeficientes del modelo

coeficientes <- coef(modelo_lineal)
intercepto <- coeficientes["(Intercept)"]
pendiente <- coeficientes["Mes"]
coeficientes
## (Intercept)         Mes 
##   3463.0108    123.0032

10 Datos predicción

#Extender la serie temporal para 6 meses
df_futuro <- data.frame(Fecha = seq.Date(from = max(df_reg$Fecha) + month(1),
                                         by = "month",
                                         length.out = 6),
                        Mes = seq(49, 54, 1))
#Generar predicciones 
predicciones <- predict(modelo_lineal, newdata = df_futuro, interval = "confidence")

#Convertir las predicciones a un DataFrame
df_predicciones <- as.data.frame(predicciones)
colnames(df_predicciones) <- c("Ventas", "Bajo", "Alto") #Nombrar las columnas

#Unir las predicciones y los intervalos de confianza al Dataframe futuro
df_futuro <- cbind(df_futuro, df_predicciones)
df_futuro
##        Fecha Mes    Ventas     Bajo     Alto
## 1 2017-12-02  49  9490.167 5950.172 13030.16
## 2 2018-01-02  50  9613.170 5963.166 13263.18
## 3 2018-02-02  51  9736.174 5975.171 13497.18
## 4 2018-03-02  52  9859.177 5986.273 13732.08
## 5 2018-04-02  53  9982.180 5996.547 13967.81
## 6 2018-05-02  54 10105.183 6006.062 14204.30

#11 Combinar data frames

#Combinar datos actuales con las predicciones futuras
df_total <- bind_rows(df_reg, df_futuro)

#Mostrar las ultimas filas con las predicciones y los intervalos
tail(df_total, 6)
## # A tibble: 6 × 5
##   Fecha      Ventas   Mes  Bajo   Alto
##   <date>      <dbl> <dbl> <dbl>  <dbl>
## 1 2017-12-02  9490.    49 5950. 13030.
## 2 2018-01-02  9613.    50 5963. 13263.
## 3 2018-02-02  9736.    51 5975. 13497.
## 4 2018-03-02  9859.    52 5986. 13732.
## 5 2018-04-02  9982.    53 5997. 13968.
## 6 2018-05-02 10105.    54 6006. 14204.

#12 Grafica con predicción

# Graficar los valores pasados y predicciones con intervalos de confianza 
ggplot(df_total, aes(x = Fecha, y = Ventas)) +
  geom_point(data = df_reg) + # Valores históricos
  geom_line(data = df_reg) + # Linea de valores históricos
  geom_smooth(method = "lm", formula = y ~ x, color = "blue", data = df_reg) +
  geom_ribbon(data = df_futuro, aes(ymin = Bajo, ymax =Alto), fill = "lightblue") +
  geom_point(data = df_futuro, aes(y = Ventas), color = "red") + #Valores predichos
  geom_line(data = df_futuro, aes(y = Ventas), color = "red", linetype = "dashed") +
  labs(tittle = "Predicción de ventas enero-junio 2018",
       x="Mes", 
       y="Ventas")