Esempi di Business Analytics/Serie storiche

Caricamento librerie

modifica
library(dplyr)
library(ggplot2)
library(forecast)
library(reshape2)

Parte 1: Dati

modifica

Il file train.csv scaricabile da qui : https://www.kaggle.com/c/store-sales-time-series-forecasting contiene serie storiche delle seguenti variabili :

  • store_nbr identifica il negozio in cui vengono venduti i prodotti.
  • family identifica il tipo di prodotto venduto.
  • sales fornisce le vendite totali per una famiglia di prodotti in un determinato negozio in una determinata data. I valori frazionari sono possibili poiché i prodotti possono essere venduti in unità frazionarie (1,5 kg di formaggio, ad esempio, contro 1 sacchetto di patatine).
  • onpromotion fornisce il numero totale di articoli in una famiglia di prodotti che sono stati promossi in un negozio in una determinata data.


Caricamento dati:

df <- read.csv("train.csv")

df$date <- as.Date(df$date)
df$family <- as.factor(df$family)

Non ci sono valori mancanti nel dataset:

colSums(is.na(df))

Data minima e massima nel dataset:

range(df$date)
[1] "2013-01-01" "2017-08-15"

Si considerando come variabile da predire le vendite totali giornaliere per la categoria AUTOMOTIVE (settore automobilistico) :

df_automative <- df %>%
  filter(family=="AUTOMOTIVE") %>%
  group_by(date) %>%
  summarise(vendite_totali=sum(sales))

Si aggiunge al dataset la nuova variabile media_mobile a 30 giorni e si tracciano i 2 grafici delle vendite totali e della media mobile :

df_automative <- cbind(df_automative,media_mobile=as.numeric(ma(df_automative$vendite_totali, order = 30)))

df_plot <- melt(df_automative,id="date")

df_plot %>%
    ggplot(aes(x=date,y=value, colour=variable))+
  geom_line()+
  theme(axis.text.x = element_text(angle=45,hjust=1))+
  xlab("Giorni")+
  ggtitle("Serie storiche delle vendite totali e della media mobile", subtitle = " per la categoria AUTOMOTIVE")
 

Si predicono i valori della media mobile delle vendite totali per il settore automobilistico nei 30 giorni successivi all'ultima data contenuta nel dataset cioè dal 16 agosto 2017 in poi utilizzando l'smoothing esponenziale che la funzione forecast usa di default e si traccia il grafico della previsione e i valori previsti con intervalli di confidenza all'80% e al 95% :

fore<-forecast(df_automative$media_mobile, h=30)
plot(fore)
print(fore)
 


data<-seq(as.Date('2017-08-16'),by='days',length=30)
df_pred <-data.frame(q=1670:1700)
p<-predict (fore,newdata=df_pred, se=TRUE)
print("Previsioni sulla vendite mensili nei successivi 30 giorni")
cbind(as.data.frame(data),p)
          data Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
1670 2017-08-16       388.4737 383.1216 393.8257 380.2884 396.6589
1671 2017-08-17       384.5968 373.6298 395.5638 367.8242 401.3693
1672 2017-08-18       381.4952 364.5410 398.4495 355.5660 407.4245
1673 2017-08-19       379.0140 355.9841 402.0439 343.7928 414.2352
1674 2017-08-20       377.0290 347.9909 406.0671 332.6190 421.4390
1675 2017-08-21       375.4410 340.5477 410.3344 322.0763 428.8058
1676 2017-08-22       374.1707 333.6199 414.7214 312.1536 436.1877
1677 2017-08-23       373.1543 327.1642 419.1444 302.8186 443.4901
1678 2017-08-24       372.3413 321.1355 423.5470 294.0289 450.6537
1679 2017-08-25       371.6909 315.4897 427.8920 285.7386 457.6431
1680 2017-08-26       371.1705 310.1856 432.1554 277.9021 464.4389
1681 2017-08-27       370.7542 305.1857 436.3227 270.4759 471.0326
1682 2017-08-28       370.4212 300.4565 440.3859 263.4195 477.4229
1683 2017-08-29       370.1548 295.9681 444.3414 256.6961 483.6135
1684 2017-08-30       369.9416 291.6942 448.1891 250.2725 489.6108
1685 2017-08-31       369.7711 287.6117 451.9305 244.1191 495.4231
1686 2017-09-01       369.6347 283.7005 455.5690 238.2096 501.0599
1687 2017-09-02       369.5256 279.9428 459.1084 232.5205 506.5307
1688 2017-09-03       369.4383 276.3232 462.5534 227.0311 511.8455
1689 2017-09-04       369.3685 272.8283 465.9086 221.7231 517.0138
1690 2017-09-05       369.3126 269.4464 469.1788 216.5804 522.0447
1691 2017-09-06       369.2679 266.1670 472.3688 211.5887 526.9471
1692 2017-09-07       369.2321 262.9812 475.4831 206.7353 531.7289
1693 2017-09-08       369.2035 259.8809 478.5261 202.0091 536.3980
1694 2017-09-09       369.1806 256.8593 481.5020 197.3999 540.9613
1695 2017-09-10       369.1623 253.9100 484.4147 192.8990 545.4256
1696 2017-09-11       369.1477 251.0275 487.2678 188.4985 549.7969
1697 2017-09-12       369.1360 248.2071 490.0649 184.1912 554.0807
1698 2017-09-13       369.1266 245.4442 492.8089 179.9708 558.2824
1699 2017-09-14       369.1191 242.7351 495.5030 175.8315 562.4067