Sei sulla pagina 1di 49

Metodi statistici per il

Data Mining – Lezione 2


Francesca Fortunato
francesca.fortunato3@unibo.it
3. ELABORAZIONE DEI DATI

L’elaborazione dei dati costituisce il cuore del processo di analisi. Durante


questa fase è necessario:
A. identificare gli algoritmi corretti per rispondere agli obiettivi fissati;
B. implementare la/e procedura/e selezionata/e, prestando particolare
attenzione alla specificazione dei parametri.
I. IL MODELLO DI REGRESSIONE
LINEARE
L’analisi di regressione lineare è una tecnica che permette di analizzare la
relazione lineare tra una variabile dipendente (o variabile di risposta) ed una
(o più) variabili indipendenti (o predittori).

Lo studio di questa relazione può avere un duplice scopo:


• esplicativo: comprendere e ponderare gli effetti delle variabili indipendenti
sulla variabile dipendente;
• predittivo: individuare una combinazione lineare di variabili indipendenti
per predire in modo ottimale il valore assunto dalla variabile dipendente.
Esempio - CAR DATA
(Azzalini & Scarpa, 2004)

I dati a disposizione riguardano n=203 modelli di auto importati negli USA nel
1985.
In particolare, per ciascuna osservazione sono state registrate p=18 variabili:

 marca: marca del produttore;


 alimentazione: benzina o diesel;
 aspirazione: standard o turbo;
 carrozzeria: hard-top (tettuccio rigido), wagon (familiare), sedan
(berlina), hatchback (berlina a due volumi), convertible (cabrio);
 trazione: fwd (anteriore), rwd (posteriore), 4wd (4x4);
 posiz.motore: front (anteriore), rear (posteriore);
 dist.assi: distanza tra gli assi della vettura in cm;
 lunghezza in cm;
 larghezza in cm;
 altezza in cm;
 peso in kg;
 cilindrata: dimensione del motore in L;
 compressione: rapporto di compressione; più il valore è alto, più
il rendimento è superiore;
 HP: horsepower, o cavalli fiscali;
 giri.max: massimo numero di giri in un minuto dal motore;
 percorr.urbana in km/L;
 percorr.strada in km/L;
 N.cilindri: numero di cilindri del motore.
 Caricamento del dataset:
auto <- read.table(’auto.txt’, header = TRUE)

 Controllo della natura delle variabili:


str(auto)
auto$marca<-as.character(auto$marca)

 Selezione delle variabili di interesse:


dati <- auto[,c(‘alimentazione’, ‘peso’, ’cilindrata’,
’percorr.urbana’, ’N.cilindri’)

 Analisi preliminare dei dati:


summary(dati) # statistiche descrittive
plot(dati) # scatterplot matrix
i. Modello di regressione lineare
semplice
Il modello di regressione lineare semplice descrive la relazione lineare che
intercorre tra la variabile dipendente (Y) ed una sola variabile indipendente
(X).

Y = β0 + β1 X + ε

In questo modello:
 β0 è l’intercetta;
 β1 è il coefficiente di regressione lineare associato alla variabile X;
 ε è il residuo, ovvero il termine di errore che tiene conto della variabilità di Y
non spiegata dal modello.
* Modello di regressione lineare semplice
con regressore quantitativo

percorrenza urbana = β0 + β1 cilindrata + ε

 Stima del modello


fit1 <- lm(percorr.urbana ~ cilindrata, data = dati)
summary(fit1)
* IL MODELLO ‘’PARLA’’

1. Quanto varia in media la percorrenza urbana per ciascun litro aggiuntivo


di cilindrata?

2. Che ipotesi si controllano attraverso le statistiche test F e t? In questo caso,


quali conclusioni si raggiungono?

3. Attraverso quale indicatore è possibile valutare la capacità del modello di


adattarsi bene ai dati?
* IL MODELLO ‘’PARLA’’
1. Quanto varia in media la percorrenza urbana per ciascun litro aggiuntivo
di cilindrata? Per ciascun litro aggiuntivo di cilindrata, la percorrenza
urbana diminuisce di 2.66 km.

2. Che ipotesi si controllano attraverso le statistiche test F e t? In questo caso,


quali sono le conclusioni a cui portano? Il test F controlla l’ipotesi nulla di
significatività del modello, il test t quella di significatività dei singoli
coefficienti di regressione. In questo caso (modello semplice) le due ipotesi
coincidono. La valutazione delle due statistiche test porta a concludere
che il coefficiente di regressione associato alla variabile cilindrata è
significativo per un qualunque livello di significatività 𝜶.

3. Attraverso quale indicatore è possibile valutare la capacità del modello di


adattarsi bene ai dati? L’ 𝐑𝟐 = 𝟎. 𝟒𝟐𝟕𝟑 indica che il 42.73% della variabilità
della percorrenza urbana è spiegata dalla sua relazione lineare con la
cilindrata.
 Visualizzazione del risultato:
plot(dati$cilindrata, dati$percorr.urbana)
abline(fit1, col = ‘red’, lwd = 2)
 Analisi dei residui:
# media nulla
plot(fit1$residuals)
abline(h=0, col = "red", lwd = 2)

# omoschedasticità
plot(fit1$fitted.values, fit1$residuals)

# normalità distributiva
qqnorm(fit1$residuals)
qqline(fit1$residuals)
* Modello di regressione lineare semplice
con regressore qualitativo

percorrenza urbana = β0 + β1 alimentazione + ε

 Stima del modello


fit2 <- lm(percorr.urbana ~ alimentazione, data = dati)
summary(fit2)
* IL MODELLO ‘’PARLA’’

1. La percorrenza media è maggiore per le auto a benzina o diesel?

2. Il test di significatività sul coefficiente di regressione è significativo? Cosa


indica il p.value?
* IL MODELLO ‘’PARLA’’
1. La percorrenza media è maggiore per le auto a benzina o diesel? Diesel. In
particolare, un’auto alimentata a diesel percorre (in città) in media 2.3856 km in
di un’auto alimentata a benzina. Lo stesso risultato si può ottenere
implementando un t.test per il confronto di due medie:
𝐇𝟎 : 𝐦𝐚 = 𝐦𝐛
𝐦𝐚 −𝐦𝐛 𝐧𝐚 𝐧𝐛 σ𝐊
𝐢=𝟏(𝐧𝐢 −𝟏)𝐬𝐤
𝟐
(𝐧𝟏 −𝟏)𝐬𝟏𝟐 (𝐧𝟐 −𝟏)𝐬𝟐𝟐 (𝐧𝟏 −𝟏)𝐬𝟏𝟐 +(𝐧𝟐 −𝟏)𝐬𝟐𝟐
𝐭𝐜 = 𝐒 𝐧𝐚 +𝐧𝐛,
𝐒𝟐 = σ𝐊
= + (𝐧 −𝟏) =
𝐢=𝟏(𝐧𝐢 −𝟏) (𝐧𝟏 −𝟏) 𝟐 (𝐧𝟏 +𝐧𝟐 −𝟐)

t.test(dati$percorr.urbana ~ dati$alimentazione, var.equal =


TRUE)
# l’opzione var.equal = TRUE la varianza ‘pooled’(S) è
utilizzata come stima della varianza .

2. Il test di significatività sul coefficiente di regressione è significativo? Cosa indica


il p.value? Dato che il p.value associato alla statistica test (t o F) è 0.0002390 Il
coefficiente di regressione relativo alla variabile alimentazione è significativo
per 𝜶 = 𝟎. 𝟎𝟎𝟏. Il p.value descrive la probabilità di ottenere un risultato uguale o
più estremo di quello osservato, supposta vera l'ipotesi nulla.
 Visualizzazione del risultato:
boxplot(percorr.urbana ~ alimentazione, data = dati, col =
c(‘red’,’green’))
coef <- fit2$coefficients
abline(h = coef[1], col = ‘red’, lwd = 2)
abline(h = coef[1] + coef[2], col = ‘green’, lwd = 2)
# L’opzione h della funzione abline permette di tracciare
una linea orizzontale in corrispondenza della coordinata
specificata.
# La linea rossa descrive la percorrenza media urbana delle
auto a benzina, la linea verde quella delle auto a diesel.
IL GRAFICO ‘’PARLA’’

• il confronto dei box-plot condizionati permette di affermare (come, d’altra parte


già evidenziato dai test) che la percorrenza media urbana delle auto a diesel è
significativamente superiore di quella delle auto a benzina.
 Analisi dei residui:
plot(fit2, which = 2) # Q-Q plot
plot(density(fit2$residuals)) # densità kernel

IL GRAFICO ‘’PARLA’’

• l’ipotesi di normalità dei


residui sembra violata in
maniera ancora più
evidente rispetto al modello
precedente.
i. Modello di regressione lineare
multiplo
Il modello di regressione lineare multiplo descrive la relazione lineare
congiunta che intercorre tra la variabile dipendente (Y) e più variabili
indipendenti (X1,…,Xm).

Y = β0 + β1 X1 + β2 X2 + ⋯ + βm Xm + ε

In questo modello:
 β0 è l’intercetta;
 β1 , … , βm sono i coefficienti di regressione lineare associato alle variabili
X1,…,Xm;
 ε è il residuo, ovvero il termine di errore che tiene conto della variabilità di Y
non spiegata dal modello.
* Modello di regressione multiplo
percorrenza urbana = β0 + β1 cilindrata + β2 alimentazione + ε

 Stima del modello


fit3 <- lm(percorr.urbana ~ cilindrata + alimentazione, data =
dati)
A parità di cilindrata, un’auto
summary(fit3) alimentata a diesel percorre in
media 2.83 km/l in più rispetto ad
un’auto a benzina.
* Modello di regressione multiplo con
effetti polinomiali
percorrenza urbana
= β0 + β1 cilindrata + β2 cilindrata2 + β3 cilindrata3
+ β4 alimentazioneDiesel + ε

 Stima del modello


fit4 <- lm(percorr.urbana ~ cilindrata + I(cilindrata^2) +
I(cilindrata^3) + alimentazione, data = dati)
summary(fit4)
* IL MODELLO ‘’PARLA’’

1. È possibile determinare di quanto varia in media la percorrenza urbana


delle auto a benzina per un litro in più di cilindrata?

2. Secondo il modello stimato, qual è l’effetto dell’alimentazione sulla


percorrenza media urbana?

3. Secondo il modello stimato, la differenza in termini di percorrenza media


urbana tra le auto a benzina e quelle a diesel dipende dalla cilindrata?

4. Quale tra i tre modelli stimati risulta preferibile in termini di adattamento ai


dati?
* IL MODELLO ‘’PARLA’’
1. È possibile determinare di quanto varia in media la percorrenza urbana
delle auto a benzina per un litro in più di cilindrata? No perché la relazione
non è lineare.
2. Secondo il modello stimato, qual è l’effetto dell’alimentazione sulla
percorrenza media urbana? A parità di cilindrata, un’auto alimentata a
diesel percorre (in città) in media 3.2141 km in più rispetto ad un’auto
alimentata a benzina.
3. Secondo il modello stimato, la differenza in termini di percorrenza media
urbana tra le auto a benzina e quelle a diesel dipende dalla cilindrata?
No. Il modello non presenta alcun effetto di interazione tra alimentazione e
cilindrata.
4. Quale tra i tre modelli stimati risulta preferibile in termini di adattamento ai
dati? Confrontando gli R2 corretti dei 4 modelli stimati (nell’ordine pari a
0.4244, 0.06045 0.5135 e 0.5892) si osserva che l’ultimo modello stimato è
preferibile agli altri in termini di capacità esplicativa e adattamento ai dati.
 Visualizzazione del risultato:
# Le auto vengono visualizzate in colori diversi a seconda
dell’alimentazione (rosso benzina, verde diesel).
plot(dati$cilindrata, dati$percorr.urbana, col =
as.numeric(dati$alimentazione)+1)
# Creazione di una sequenza di 200 valori per la cilindrata.
x <- seq(min(dati$cilindrata), max(dati$cilindrata),
length.out = 200)
# Costruzione e visualizzazione dei due diversi modelli.
coef <- fit4$coefficients
modello.benzina <- coef[1] + coef[2]*x + coef[3]*x^2+
coef[4]*x^3
lines(x, modello.benzina, col = ‘red’, lwd = 2)
modello.diesel <- coef[1] + coef[2]*x + coef[3]*x^2+
coef[4]*x^3 + coef[5]
lines(x, modello.diesel, col = ‘green’, lwd = 2)
 Analisi dei residui:
plot(fit4, which = 2) # Q-Q plot
plot(density(fit3$residuals)) # densità kernel

IL GRAFICO ‘’PARLA’’

• l’ipotesi di normalità dei


residui sembra violata anche
in questo modello.
In tutti i modelli stimati l’ipotesi di normalità distributiva degli errori sembra violata in
maniera evidente. In aggiunta, la relazione tra la variabile dipendente
(percorrenza urbana) e le variabili indipendenti (in particolare la cilindrata) sembra
essere di natura non lineare (ha un R2 corretto più elevato).
Una possibile soluzione a questi problemi consiste nell’implementazione di una
trasformazione T(Y, 𝝀) sulla variabile risposta Y.
Una delle trasformazioni più utilizzate è quella proposta da Box-Cox, ovvero quella
che identifica il valore ottimale di 𝜆 in modo che la normalità distributiva degli errori
del modello stimato sia massima. In particolare, tra tutte le trasformazioni del tipo:
Yλ − 1
Y λ =൞ λ , λ≠0
log Y, λ=0

solo un λ elimina l’(eventuale) eteroschedasticità dei residui e ne garantisce la


normalità distributiva.
tr.boxcox<- boxcox(fit3) # funzione inclusa in MASS
Una trasformazione alternativa prevede la definizione del valore ottimale di 𝜆 in
modo che la somma dei quadrati degli errori del modello stimato sia minima:
Y ∗ λ = b0 + b1 Y λ
inverseResponsePlot(fit3) # funzione inclusa in car
λ = - 0.7878788 λ = - 3.3
* Modello di regressione lineare multiplo
su una trasformata della Y
Dato che la soluzione ‘second best’ restituita da inverseResponsePlot
corrisponde a λ = - 1, si è pensato di stimare il seguente modello:
1/percorrenza urbana = β0 + β1 cilindrata + β2 alimentazione + ε
 Stima del modello
fit5 <- lm(1/percorr.urbana ~ cilindrata + alimentazione, data = dati)
summary(fit5)
* IL MODELLO ‘’PARLA’’

1. Come si interpreta il valore del coefficiente di regressione associato alla


variabile alimentazione?

2. Secondo il modello stimato, come varia il consumo medio delle auto a


benzina per un litro in più di cilindrata? E per quelle a diesel?

2. Questo modello risulta preferibile in termini di adattamento ai dati rispetto


ai precedenti?
* IL MODELLO ‘’PARLA’’
1. Come si interpreta il valore del coefficiente di regressione associato alla variabile
alimentazione? A parità di cilindrata, le auto alimentate a diesel risparmiano 0.025
L/km rispetto a quelle a benzina(ATTENZIONE: visto che la percorrenza urbana si
misura in km/L, la sua trasformata inversa si misura in L/km!).

2. Secondo il modello stimato, come varia il consumo medio delle auto a benzina per
un litro in più di cilindrata? E per quelle a diesel? Il consumo medio delle auto a
benzina aumenta di 0.0289 L/km per ogni incremento unitario della cilindrata. Per le
auto a diesel vale lo stesso risultato in quanto il modello non prevede effetti di
interazione tra alimentazione e cilindrata.

3. Questo modello risulta preferibile in termini di adattamento ai dati rispetto ai


precedenti? I modelli non sono direttamente confrontabili in termini di R2 corretto in
quanto fanno riferimento a variabili dipendenti diverse. Per rendere possibile il
confronto è necessario eseguire una retrotrasformazione riportando il modello nello
spazio delle variabili originarie:
residui <- dati$percorr.urbana – (1/fit5$fitted.values)
R2 <- 1–((sum(residui^2))/(var(dati$percorr.urbana)*(203-1)))
Dato che R2 = 0.5614762 non è migliore degli altri, non è necessario applicare la
correzione per confrontarlo.
 Visualizzazione del risultato nello spazio delle variabili trasformate:
plot(dati$cilindrata, 1/dati$percorr.urbana, col =
as.numeric(dati$alimentazione)+1)
coef <- fit5$coefficients
abline(a = coef[1], b = coef[2], col = ‘red’, lwd = 2)
abline(a = coef[1] + coef[3], b = coef[2], col = ‘green’,
lwd = 2)
# Le opzioni a e b della funzione abline permettono di
specificare intercetta e coefficiente angolare della retta
da tracciare.
# Nel secondo modello alimentazione = 1 per cui si inserisce
il coefficiente ad esso associato nell’intercetta!
 Visualizzazione del risultato nello spazio delle variabili originarie (ai
coefficienti viene applicata la stessa trasformazione):
# Le auto vengono visualizzate in colori diversi a seconda
dell’alimentazione (rosso benzina, verde diesel).
plot(dati$cilindrata, dati$percorr.urbana, col =
as.numeric(dati$alimentazione)+1)
# Creazione di una sequenza di 200 valori per la cilindrata.
x <- seq(min(dati$cilindrata), max(dati$cilindrata),
length.out = 200)
# Costruzione e visualizzazione dei due diversi modelli.
coef <- fit5$coefficients
modello.benzina <- 1/(coef[1] + coef[2]*x)
lines(x, modello.benzina, col = ‘red’, lwd = 2)
modello.diesel <- 1/(coef[1] + coef[2]*x + coef[3])
lines(x, modello.diesel, col = ‘green’, lwd = 2)
 Analisi dei residui:
plot(fit4, which = 1) # Q-Q plot
plot(density(fit4$residuals)) # densità kernel

IL GRAFICO ‘’PARLA’’

• l’ipotesi di normalità dei


residui sembra violata anche
nel modello stimato sulla
variabile dipendente
trasformata.
* Modello di regressione lineare multiplo
con variabili trasformate
ln percorrenza urbana
= β0 + β1 ln peso + β2 ln(cilindrata) + β3 alimentazione + ε

NOTA: la trasformata logaritmica viene spesso usata per correggere


l’eterogeneità dei residui.
 Stima del modello
fit6 <- lm(log(percorr.urbana) ~ log(peso) + log(cilindrata) +
alimentazione, data = dati)
summary(fit6)
IL MODELLO ‘’PARLA’’

• l’analisi inferenziale suggerisce che il regressore log(cilindrata) è un potenziale


candidato all’uscita dal modello visto che non risulta statisticamente significativo
(p.value = 0.344).
 Visualizzazione del risultato nello spazio delle variabili trasformate:
library(scatterplot3d)
s3d <- scatterplot3d(log(dati$peso), log(dati$cilindrata),
log(dati$percorr.urbana), color =
as.numeric(dati$alimentazione)+1, angle = 120)
# in scatterplot3d
coef <- fit6$coefficients
# Essendo in un contesto 3d, al posto di rette si disegnano
dei piani
s3d$plane3d(coef[1], x.coef = coef[2], y.coef = coef[3], col
= ‘red’, lty = 1)
s3d$plane3d(coef[1] + coef[4], x.coef = coef[2], y.coef =
coef[3], col = ‘green’, lty = 1)
• lo scatterplot 3-d conferma i risultati visti precedentemente: le auto a diesel
(piano verde) hanno una percorrenza urbana media più elevata di quelle
alimentate a benzina (piano rosso), a parità di cilindrata e peso.
 Analisi dei residui:
plot(fit6, which = 1) # Q-Q plot
plot(density(fit6$residuals)) # densità kernel

IL GRAFICO ‘’PARLA’’

• l’ipotesi di normalità dei


residui sembra parzialmente
verificata.
 R2 nello spazio delle variabili originarie:
residui <- dati$percorrenza.urbana – exp(fit6$fitted.values)
R2 <- 1–((sum(residui^2))/(var(dati$percorrenza.urbana)*(203-1)))

Dato che R2 = 0.8370509 e l’analisi dei residui dà esito (parzialmente) soddisfacente,


è possibile esaminare i risultati inferenziali. In particolare, solo a questo punto può
risultare opportuno sottoporre a controllo l’ipotesi di indipendenza lineare del
modello stimato e le ipotesi di significatività dei singoli coefficienti di regresssione.
Come osservato precedentemente, il primo candidato ad uscire dal modello è il
regressore log(cilindrata).

fit7 <- update(fit6, .~. –log(cilindrata), data = dati)


# La funzione update ristima il modello in ingresso (in questo caso
fit5) eliminando il regressore specificato.
summary(fit7)
 Analisi dei residui:
plot(fit6, which = 1) # Q-Q plot
plot(density(fit6$residuals)) # densità kernel

IL GRAFICO ‘’PARLA’’

• l’ipotesi di normalità dei


residui sembra parzialmente
verificata.
 R2 nello spazio delle variabili trasformate:
residui <- dati$percorrenza.urbana – exp(fit6$fitted.values)
R2 <- 1–((sum(residui^2))/(var(dati$percorrenza.urbana)*(203-1)))
R2.corr <- (R2-(2/(203-1))*((203-1)/(203-2-1))) # 0.8250827

m n−1
R2corretto = R2 − ∗
n−1 n−m−1

dove m corrisponde al numero di regressori inclusi nel modello e n al numero di


osservazioni.
 Visualizzazione del risultato nello spazio delle variabili originarie:
# Le auto vengono visualizzate in colori diversi a seconda
dell’alimentazione (rosso benzina, verde diesel).
plot(dati$peso, dati$percorr.urbana, col =
as.numeric(dati$alimentazione)+1)
# Creazione di una sequenza di 200 valori per la cilindrata.
x <- log(seq(min(dati$peso), max(dati$peso), length.out =
200))
# Costruzione e visualizzazione dei due diversi modelli.
coef <- fit6$coefficients
modello.benzina <- exp(coef[1] + coef[2]*x)
lines(exp(x), modello.benzina, col = ‘red’, lwd = 2)
modello.diesel <- exp(coef[1] + coef[2]*x + coef[3])
lines(exp(x), modello.diesel, col = ‘green’, lwd = 2)

Potrebbero piacerti anche