R – regressione lineare semplice
Introduzione
Il presente post vuole inaugurare
una serie di brevi articoli riguardanti le analisi delle regressioni sfruttando
il noto ambiente di sviluppo matematico R. Non è scopo di questi articoli
introdurre alla programmazione in R e si dà pertanto per scontata una certa
familiarità con il linguaggio e con l’IDE R Studio.
Allo stesso modo, viene data per
scontata la dimestichezza con le regressioni lineari, polinomiali, … anche se
sarà mia cura dare un breve cenno a ciascuna di esse prima di vederle applicate
in R.
Descrizione regressione lineare semplice
L'analisi della regressione
è una tecnica usata per analizzare una serie di dati che consistono in una variabile
dipendente e una o più variabili indipendenti. Lo scopo è stimare un'eventuale
relazione funzionale esistente tra la variabile dipendente e le variabili
indipendenti […] L'analisi della regressione può essere usata per effettuare
previsioni (ad esempio per prevedere dati futuri di una serie temporale),
inferenza statistica, per testare ipotesi o per modellare delle relazioni di
dipendenza. Questi usi della regressione dipendono fortemente dal fatto che le
assunzioni di partenza siano verificate (fonte Wikipedia).
La regressione lineare si compone
di una o più variabili indipendenti le cui N
osservazioni possono portare alla stima del valore della variabile
dipendente secondo l’equazione lineare:
Nel caso della regressione
lineare semplice avremo una sola variabile dipendente. L’indice i si riferisce
alla i-esima osservazione della variabile dipendente e con ἐ si
indica l’errore connesso alla misurazione. Quindi la retta di regressione è
quella che meglio interpola i dati dell’osservazione e per raggiungere lo scopo
si ricorre al metodo dei minimi quadrati che consentono di individuare i valori
dei coefficienti β0 e β1.
Esempio con R
Immagino di avere un file di testo contenente l’elenco (in
formato YYYY-MM) delle date di vendita di un certo prodotto fatto come segue:
09-2014
09-2014
09-2014
09-2014
10-2014
10-2014
10-2014
11-2014
11-2014
…
12-2016
…
09-2014
09-2014
09-2014
10-2014
10-2014
10-2014
11-2014
11-2014
…
12-2016
…
Di fatto per ogni prodotto venduto ho una record che indica
il mese ed anno in cui la vendita è avvenuta; il codice che segue legge il file
e lo importa in un dataframe. Quindi procedo suddividendo i dati in sotto set contenenti i valori anno per anno e quindi ne disegno il grafico.
# leggo elenco delle date da file
mydata = read.table("<percorso file>/dati_vendite_cs.txt")
mydata = read.table("<percorso file>/dati_vendite_cs.txt")
# trasformo il vettore delle date in tabella di frequenze
df = as.data.frame(table(mydata))
df = as.data.frame(table(mydata))
# creo un vettore con l’elenco dei mesi dell’anno
months_vectr <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
months_vectr <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
# prendo i subset dei soli anni che mi interessano e per ciascuno creo una proprietà year che mi indica l'anno a cui si riferisce il subset
# questo mi permetterà di ottenere serie multiple sul grafico che viene in seguito plottato
df_2014 <- df[grep("2014", df$mydata), ]
df_2014$month = months_vectr
# questo mi permetterà di ottenere serie multiple sul grafico che viene in seguito plottato
df_2014 <- df[grep("2014", df$mydata), ]
df_2014$month = months_vectr
df_2015 <-
df[grep("2015", df$mydata), ]
df_2015$month = months_vectr
df_2015$month = months_vectr
df_2016 <-
df[grep("2016", df$mydata), ]
df_2016$month = months_vectr
df_2016$month = months_vectr
df_2017 <-
df[grep("2017", df$mydata), ]
df_2017$month = months_vectr
df_2017$month = months_vectr
df_2014$year =
"2014"
df_2015$year = "2015"
df_2016$year = "2016"
df_2017$year = "2017"
df_2015$year = "2015"
df_2016$year = "2016"
df_2017$year = "2017"
# unisco i dataframe
dat = rbind(df_2014, df_2015, df_2016, df_2017)
dat = rbind(df_2014, df_2015, df_2016, df_2017)
# stampo le serie dei vari anni
g <- ggplot(dat, aes(x = month, y = Freq, colour = year)) + geom_line(linetype="dashed", size = 0.5)
plot(g)
Il grafico precedente mostra la
distribuzione delle vendite mese per mese e viene disegnata una seria per
ciascuno degli anni di vendita. È su queste serie storiche che si baserà la
predizione per l’anno successivo (in questo esempio il 2018). Segue il codice
che esegue la predizione con una regressione di tipo lineare e disegna il
grafico con le serie storiche viste in precedenza e la predizione.
# mi creo un dataframe con mese e frequenze per ciascuno anno
di vendita
dat_month_freq = data.frame(month = dat$month, freq = dat$Freq)
# la funzione lm viene usata per il calcolo della regressione
regressor = lm(formula = freq ~ month, data = dat_month_freq)
# eseguo una predizione che si basa sulle serie storiche
sell_pred = predict(regressor, newdata = dat_month_freq)
dat_month_freq = data.frame(month = dat$month, freq = dat$Freq)
# la funzione lm viene usata per il calcolo della regressione
regressor = lm(formula = freq ~ month, data = dat_month_freq)
# eseguo una predizione che si basa sulle serie storiche
sell_pred = predict(regressor, newdata = dat_month_freq)
# genero il dataframe con la predizione per l’anno successivo
df_sell_pred = head(data.frame(month = dat$month, Freq = sell_pred), 12)
df_sell_pred$year = "2018"
df_sell_pred = head(data.frame(month = dat$month, Freq = sell_pred), 12)
df_sell_pred$year = "2018"
dat_with_prevision =
rbind(df_2014, df_2015, df_2016, df_2017, df_sell_pred)
g <- ggplot(dat_with_prevision,
aes(x = month, y = Freq, colour = year)) + geom_line(linetype="dashed",
size = 0.5)
plot(g)
plot(g)
È evidente che la regressione lineare non si sposa bene con
questo modello in cui le serie storiche hanno un andamento di tipo non lineare
e vedremo come migliorare la nostra curva passando ad una regressione di tipo
polinomiale.
Commenti
Posta un commento