I dati considerati per quest’analisi provengono dal dataset Automobile, contenente 26 attributi diversi riguardanti diverse caratteristiche per un totale di 205 auto considerate.
Oltre a contenere descrizioni delle caratteristiche delle auto (riguardanti consumi, tipologia di motore, tipologia di chassis, tipologia di carburante…), sono presenti anche fattori di rischio legati al prezzo stesso dei veicoli (il cosiddetto symboling).
L’analisi del dataset è stata strutturata come segue:
Per visualizzare la struttura del dataset, si usa la funzione
str()
:
## 'data.frame': 205 obs. of 26 variables:
## $ symboling : int 3 3 1 2 2 2 1 1 1 0 ...
## $ normalizedLosses: chr "?" "?" "?" "164" ...
## $ make : chr "alfa-romero" "alfa-romero" "alfa-romero" "audi" ...
## $ fuelType : chr "gas" "gas" "gas" "gas" ...
## $ aspiration : chr "std" "std" "std" "std" ...
## $ numOfDoors : chr "two" "two" "two" "four" ...
## $ bodyStyle : chr "convertible" "convertible" "hatchback" "sedan" ...
## $ driveWheels : chr "rwd" "rwd" "rwd" "fwd" ...
## $ engineLocation : chr "front" "front" "front" "front" ...
## $ wheelBase : num 88.6 88.6 94.5 99.8 99.4 ...
## $ length : num 169 169 171 177 177 ...
## $ width : num 64.1 64.1 65.5 66.2 66.4 66.3 71.4 71.4 71.4 67.9 ...
## $ height : num 48.8 48.8 52.4 54.3 54.3 53.1 55.7 55.7 55.9 52 ...
## $ curbWeight : int 2548 2548 2823 2337 2824 2507 2844 2954 3086 3053 ...
## $ engineType : chr "dohc" "dohc" "ohcv" "ohc" ...
## $ numOfCylinders : chr "four" "four" "six" "four" ...
## $ engineSize : int 130 130 152 109 136 136 136 136 131 131 ...
## $ fuelSystem : chr "mpfi" "mpfi" "mpfi" "mpfi" ...
## $ bore : chr "3.47" "3.47" "2.68" "3.19" ...
## $ stroke : chr "2.68" "2.68" "3.47" "3.40" ...
## $ compressionRatio: num 9 9 9 10 8 8.5 8.5 8.5 8.3 7 ...
## $ horsepower : chr "111" "111" "154" "102" ...
## $ peakRpm : chr "5000" "5000" "5000" "5500" ...
## $ cityMpg : int 21 21 19 24 18 19 19 19 17 16 ...
## $ highwayMpg : int 27 27 26 30 22 25 25 25 20 22 ...
## $ price : chr "13495" "16500" "16500" "13950" ...
Alcune considerazioni:
I dati mancanti vengono rappresentati nel dataset con la stringa ‘?’, si è deciso quindi di sostituirli con valori NA e di calcolare in quali colonne e quanti ne fossero presenti;
Alcune colonne necessitano di un diverso formato, sono state quindi trasformate in factor o in numeric o integer a seconda delle necessità.
NAs | |
---|---|
normalizedLosses | 41 |
numOfDoors | 2 |
bore | 4 |
stroke | 4 |
horsepower | 2 |
peakRpm | 2 |
price | 4 |
Si può osservare che la variabile normalizedLosses contiene un numero considerevole di valori mancanti: si è ritenuto quindi di non utilizzarla nell’analisi del dataset.
Negli altri casi, essendo il numero di NA contenuto rispetto al numero totale di istanze, non sembra essere conveniente sostituire con altri valori, quanto piuttosto rimuoverli per le analisi successive.
Si è deciso inoltre di trasformare le variabili symboling, make, fuelType, aspiration, numOfDoors, bodyStyle, driveWheels, engineLocation, engineType, numOfCylinders e fuelSystem in fattori.
Altre come normalizedLosses, bore, stroke, horsepower, peakRpm e price in numeric o integer a seconda dei casi.
Per l’analisi di ogni variabile del dataset sono stati utilizzati diversi strumenti grafici e statistici:
Per le variabili categoriali, come ad esempio le marche delle auto (make) o la tipologia di carburante (fuelType), si è scelto di utilizzare dei barplot per rappresentare le loro frequenze assolute;
Per le variabili continue, conviene invece considerare i rispettivi boxplot e curve di densità;
Il symboling o classificazione del rischio, è un sistema che assegna un livello di rischio ad un veicolo con lo scopo di calcolarne il premio assicurativo. In questa scala un punteggio pari a +3 indica il veicolo come “rischioso” mentre -3 “sicuro” da assicurare.
Si può osservare che la maggior parte dei veicoli registrati nel dataset sono stati classificati con un valore di symboling pari a 0.
La marca d’auto più presente del dataset è la Toyota.
Nel dataset la tipologia di carburante più frequente è la benzina.
La maggior parte delle auto del dataset ha quattro porte, mentre la tipologia di aspirazione più frequente è la std.
Le auto sono per la maggiore del tipo berlina (sedan) e a trazione anteriore (fwd).
La maggior parte delle automobili hanno il motore nella parte anteriore e di tipologia ohc, ossia motori con alberi a canne in testa.
La maggior parte dei motori sono a pistoni a quattro cilindri con un sistema di carburazione del tipo mpfi, ossia a iniezione multi-point.
Per le variabili di tipo continuo, per poterle analizzare, una possibilità è usare strumenti come boxplot, istogrammi e curve di densità; usandoli insieme, è possibile visualizzare sia in maniera intuitiva (attraverso gli istogrammi e le curve di densità) che in maniera più dettagliata (boxplot) la distribuzione della variabile considerata:
Una prima analisi si può effettuare rispetto alle variabili EngineSize (cilindrata) e le variabili NumOfCylinders, Bore, Stroke.
La variabile EngineSize può essere calcolata dalle altre variabili seguendo la formula:
\[EngineSize = \pi \cdot
\left(\frac{Bore}{2}\right)^2 \cdot Stoke \cdot
NumOfCylinders\]Infatti, se la calcoliamo otteniamo, tranne che
per 5 valori dati probabilmente da errori nel dataset, una perfetta
linearità.
Si noti che la variabile Cilindrata viene calcolata con una
formula lievemente diversa per ottenere un risultato con unità di misura
del sistema internazionale:
Cylinders = data$numOfCylinders
levels(Cylinders) = c(2, 3, 4, 5, 6, 8, 12)
Cilindrata = pi*(data$bore*2.54/2)^2*data$stroke*2.54*as.numeric(as.character(Cylinders))
Osserviamo ora le relazioni di EngineSize con le altre variabili.
## Df Sum Sq Mean Sq F value Pr(>F)
## data$numOfCylinder 6 260409 43401 92.06 <2e-16 ***
## Residuals 198 93350 471
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Il test ANOVA suggerisce grande una correlazione di EngineSize con il numero di cilindri.
Nel boxplot, infatti, si nota come la variabile EngineSize aumenta con l’aumentare dei cilindri.
La variabile EngineSize aumenta linearmente anche con la variabile Bore, che rappresenta il diametro dei cilindri.
##
## Call:
## lm(formula = data$engineSize ~ data$bore)
##
## Residuals:
## Min 1Q Median 3Q Max
## -57.043 -14.856 -7.808 1.687 179.138
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -170.888 28.783 -5.937 1.27e-08 ***
## data$bore 89.760 8.615 10.419 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 33.33 on 199 degrees of freedom
## (4 osservazioni eliminate a causa di valori mancanti)
## Multiple R-squared: 0.3529, Adjusted R-squared: 0.3497
## F-statistic: 108.5 on 1 and 199 DF, p-value: < 2.2e-16
Lo scatterplot e il p-value del
summary()
mostra come ci sia un’alta correlazione tra le
due variabili.
Osserviamo innanzitutto lo scatterplot tra la cilindrata e Stroke, ossia l’altezza di ogni cilindro.
Non sembra esserci un netto aumento della cilindrata con l’aumentare della variabile stroke.
##
## Call:
## lm(formula = data$engineSize ~ data$stroke)
##
## Residuals:
## Min 1Q Median 3Q Max
## -60.911 -29.911 -9.619 15.853 211.371
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 40.20 29.60 1.358 0.17605
## data$stroke 26.97 9.05 2.980 0.00324 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 40.54 on 199 degrees of freedom
## (4 osservazioni eliminate a causa di valori mancanti)
## Multiple R-squared: 0.04271, Adjusted R-squared: 0.0379
## F-statistic: 8.879 on 1 and 199 DF, p-value: 0.003243
La correlazione positiva di EngineSize con Stroke, seppur presente, risulta nettamente inferiore rispetto alle variabili precedenti.
Si ritiene che la variabile EngineSize sia sufficiente per spiegare le altre variabili presenti nel dataset e che le variabili NumOfCylinders, Bore, Stroke non porterebbero ad alcun miglioramento di un eventuale modello.
Dato che è presente un’alta correlazione con le variabili numOfCylinder e Bore, risulta essere sensato che esse possano essere sostituite da EngineSize.
Nonostante non ci sia una forte correlazione tra le variabili EngineSize e Stroke, si decide comunque di non considerare la variabile Stroke, in quanto, come si può notare facilmente dalla matrice di correlazione proposta precedentemente, essa non spiega bene nessuna delle altre variabili.
Inoltre risulta essere sensato non considerare le variabili NumOfCylinders, Bore, Stroke in quanto EngineSize risulta essere un calcolo diretto di quest’ultime.
## Df Sum Sq Mean Sq F value Pr(>F)
## data$fuelType 1 3118.6 3118.6 6336 <2e-16 ***
## Residuals 203 99.9 0.5
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Si può notare come la scelta di fuelType porti ad avere un compressionRatio nettamente diverso.
Dato che la variabilità del CompressionRatio risulta essere bassa, si decide, per semplicità, di tenere solo la variabile fuelType.
Passiamo ora all’analizzare la colliearità delle variabili width, length, height, wheelBase e curbWeight.
Dato che la variabile wheelBase indica la distanza tra le ruote anteriori e quelle posteriori, sembra sensato pensare che più è lunga un’auto più questa distanza aumenti. Vediamo ora lo scatterplot:
Si può notare come i valori si dispongano molto precisamente su una retta.
##
## Call:
## lm(formula = data$wheelBase ~ data$length)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7.9158 -1.6388 -0.5217 2.0934 7.6078
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 24.45804 2.89825 8.439 6.01e-15 ***
## data$length 0.42688 0.01661 25.700 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.927 on 203 degrees of freedom
## Multiple R-squared: 0.7649, Adjusted R-squared: 0.7637
## F-statistic: 660.5 on 1 and 203 DF, p-value: < 2.2e-16
Il p-value del summary()
dà conferma
dell’elevata correlazione. Si ha anche un elevato valore
dell’R-quadro e un valore vicino allo 0 del
Pr(>|t|) dell’intercetta e del coefficiente.
Possiamo dedurre che la variabile length spieghi bene la
variabile wheelBase e possa sostituirla, dato che, di fatto,
indica una caratteristica molto simile.
Si considera che, se un’auto risulta essere più lunga rispetto a un’altra, probabilmente essa risulta essere anche più pesante.
Lo scatterplot conferma la nostra ipotesi. I dati si dispongono in maniera lineare.
##
## Call:
## lm(formula = data$length ~ data$curbWeight)
##
## Residuals:
## Min 1Q Median 3Q Max
## -17.239 -3.974 1.174 4.495 12.652
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.209e+02 2.078e+00 58.18 <2e-16 ***
## data$curbWeight 2.080e-02 7.969e-04 26.10 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.926 on 203 degrees of freedom
## Multiple R-squared: 0.7704, Adjusted R-squared: 0.7693
## F-statistic: 681.2 on 1 and 203 DF, p-value: < 2.2e-16
Anche in questo caso i valori del p-value e dei Pr(>|t|) dell’intercetta e del coefficiente angolare risultano essere vicini allo 0, e l’R-quadro elevato.
Si considera che, se un’auto risulta essere più larga rispetto a un’altra, probabilmente essa risulta essere anche più pesante.
Lo scatterplot conferma la nostra ipotesi. I dati si dispongono in maniera lineare.
##
## Call:
## lm(formula = data$width ~ data$curbWeight)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.2883 -0.5342 0.0372 0.6156 4.4619
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.678e+01 3.757e-01 151.12 <2e-16 ***
## data$curbWeight 3.572e-03 1.441e-04 24.79 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.071 on 203 degrees of freedom
## Multiple R-squared: 0.7517, Adjusted R-squared: 0.7505
## F-statistic: 614.7 on 1 and 203 DF, p-value: < 2.2e-16
Anche in questo caso i valori del p-value e dei Pr(>|t|) dell’intercetta e del coefficiente angolare risultano essere vicini allo 0, e l’R-quadro elevato.
Si considera che, se un’auto risulta essere più alta rispetto a un’altra, probabilmente essa risulta essere anche più pesante.
Lo scatterplot non sembra confermare con certezza la nostra ipotesi. I dati si dispongono in maniera piuttosto casuale, anche se si può comunque notare una correlazione positiva.
##
## Call:
## lm(formula = data$height ~ data$curbWeight)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7.8591 -1.9032 0.4748 1.5222 6.1036
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.018e+01 8.206e-01 61.152 < 2e-16 ***
## data$curbWeight 1.387e-03 3.147e-04 4.408 1.69e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.34 on 203 degrees of freedom
## Multiple R-squared: 0.08736, Adjusted R-squared: 0.08287
## F-statistic: 19.43 on 1 and 203 DF, p-value: 1.688e-05
Il valore del p-value risulta essere minore di 0.05, mostrando come ci sia una correlazione, anche se non elevata.
Si può anche fare un’approssimazione del volume di un’auto e metterlo in relazione alla massa.
volume = data$height*data$length*data$width
Si mostra ora lo scatterplot:
##
## Call:
## lm(formula = volume ~ data$curbWeight)
##
## Residuals:
## Min 1Q Median 3Q Max
## -146256 -26988 999 37300 111558
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.990e+05 1.600e+04 18.69 <2e-16 ***
## data$curbWeight 1.251e+02 6.134e+00 20.40 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 45620 on 203 degrees of freedom
## Multiple R-squared: 0.6721, Adjusted R-squared: 0.6705
## F-statistic: 416.1 on 1 and 203 DF, p-value: < 2.2e-16
Si può notare come sia presente una forte correlazione.
È evidente che le variabili length e wheelBase mostrano una forte correlazione e forniscono informazioni simili nelle analisi statistiche. Pertanto si ha una collinearità delle due variabili.
Analogamente, sebbene ci sia siano degli scarti non trascurabili nel modello lineare, sembra esserci collinearità tra le variabili width, length e la variabile curbWeight. Nonostante le variabili descrivano caratteristiche diverse di un’auto, la larghezza e la lunghezza di un veicolo tendono ad influenzare direttamente il suo peso a vuoto secondo uno schema lineare. Si decide quindi di tenere la variabile curbWeight.
Infine, si osserva che non è presente una collinearità tra height e curbWeight in quanto le caratteristiche descritte sono diverse e non è presente una netta linearità tra le due variabili.
Passiamo ora all’analizzare la collinearità delle variabili cityMpg e highwayMpg. Si pensa che se un’auto consuma molto in città, consumerà molto anche in autostrada.
##
## Call:
## lm(formula = data$cityMpg ~ data$highwayMpg)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.6808 -0.9124 -0.2174 0.7054 5.0876
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3.15689 0.49941 -6.321 1.62e-09 ***
## data$highwayMpg 0.92277 0.01585 58.221 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.559 on 203 degrees of freedom
## Multiple R-squared: 0.9435, Adjusted R-squared: 0.9432
## F-statistic: 3390 on 1 and 203 DF, p-value: < 2.2e-16
Si nota dallo scatterplot come i dati si dispongano in una retta.
Il valore p-value e dei Pr(>|t|) dell’intercetta e del coefficiente angolare risultano essere vicini allo 0 e l’R-quadro molto elevato.
Si può dedurre che le due variabili spieghino di fatto la stessa caratteristica e che dunque sia presente una collinearità tra le due variabili.
Si decide dunque di tenere la variabile cityMpg in quanto lo si ritiene un dato più rilevante nella scelta di acquisto di un’auto per un individuo medio.
Oltre all’analisi univariata, è interessante considerare anche il rapporto che c’è tra coppie di variabili attraverso strumenti come i boxplot e diversi test statistici, introducendo l’analisi con una matrice di correlazione:
Della matrice ci concentriamo soprattutto sulla variabile price e come essa correli con le altre variabili.
Si può notare che la variabile cityMpg è correlata negativamente con il prezzo \((-0.7)\). Facendo una prima ipotesi si può supporre che all’aumentare dei consumi aumenti anche il prezzo dell’auto.
Un’altra forte correlazione si nota con la variabile horsepower \((0.8)\) e con engineSize \((0.9)\). Queste sono caratteristiche del motore e pare logico pensare che all’aumentare della potenza o della dimensione del motore aumenti anche il prezzo dell’auto.
Infine ci sono le variabili che dipendono di più dalla struttura dell’auto, come height \((0.1)\), length \((0.7)\) e width \((0.8)\). Di queste la variabile più esplicativa sembra però curbWeight \((0.8)\). Quindi sembra che all’aumentare del peso (e di conseguenza delle dimensioni) dell’auto, il prezzo aumenti.
Dopo aver analizzato superficialmente le variabili numeriche in una matrice di correlazione, ci concentriamo sulle variabili categoriali e come esse interagiscano con la variabile price. Un modo efficacie per farlo è certamente lo studio attraverso dei Boxplot condizionati, in cui viene considerato il legame tra una variabile numerica rispetto ad una variabile categoriale, per vedere come si distribuisce rispetto ai diversi livelli.
Dal grafico si vede che con il discostarsi dai valori centrali il prezzo tende ad aumentare, inoltre:
## Df Sum Sq Mean Sq F value Pr(>F)
## symboling 5 1.887e+09 377325630 6.848 6.56e-06 ***
## Residuals 195 1.074e+10 55100228
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 4 osservazioni eliminate a causa di valori mancanti
Il test ANOVA conferma una dipendenza della variabile symboling alla variabile price.
Prendendo le variabili make e price risulta lampante la dipendenza del prezzo dalla marca dell’auto, infatti:
## Df Sum Sq Mean Sq F value Pr(>F)
## make 21 1.005e+10 478700877 33.23 <2e-16 ***
## Residuals 179 2.578e+09 14404773
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 4 osservazioni eliminate a causa di valori mancanti
Il test ANOVA da una forte correlazione tra le variabili. Se la variabile precedente è più difficile da spiegare, il fatto che le auto cambino di prezzo dipendentemente dal produttore ci sembra più intuitivo.
## Df Sum Sq Mean Sq F value Pr(>F)
## fuelType 1 1.537e+08 153743226 2.452 0.119
## Residuals 199 1.248e+10 62700651
## 4 osservazioni eliminate a causa di valori mancanti
La relazione tra fuelType e price sembra invece far propendere per una sostanziale indipendenza delle variabili. Il test ANOVA sembra dare un valore parecchio elevato per rifiutare l’ipotesi di indipendenza.
## Df Sum Sq Mean Sq F value Pr(>F)
## bodyStyle 4 1.984e+09 495911393 9.129 8.78e-07 ***
## Residuals 196 1.065e+10 54324118
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 4 osservazioni eliminate a causa di valori mancanti
Invece la variabile bodyStyle sembra presentare una dipendenza dal prezzo apprezzabile. Questo può essere dipeso dal fatto che una forma particolare del telaio può richiedere più costo nell’essere ideata, in più auto con motori più potenti tendono ad avere intelaiature simili.
Dal tipo di trazione dell’auto sembra dipendere molto il prezzo, soprattutto per le auto con trazione posteriore, che aumentano di molto di prezzo.
## Df Sum Sq Mean Sq F value Pr(>F)
## driveWheels 2 5.141e+09 2.571e+09 67.95 <2e-16 ***
## Residuals 198 7.490e+09 3.783e+07
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 4 osservazioni eliminate a causa di valori mancanti
Questa ipotesi sembra essere corroborata anche dal test ANOVA. Questo aumento di prezzo per le auto a trazione posteriore può essere spiegato con la difficoltà ingegneristica nella costruzione.
## Df Sum Sq Mean Sq F value Pr(>F)
## engineType 5 2.546e+09 509182165 9.845 2.09e-08 ***
## Residuals 195 1.009e+10 51719292
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 4 osservazioni eliminate a causa di valori mancanti
Il prezzo sembra dipendere anche dal tipo di motore.
## Df Sum Sq Mean Sq F value Pr(>F)
## fuelSystem 7 4.455e+09 636467931 15.02 1.31e-15 ***
## Residuals 193 8.176e+09 42362162
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 4 osservazioni eliminate a causa di valori mancanti
Il tipo di iniezione sembra avere una forte dipendenza con il prezzo. Un problema con questa variabile però è la scarsa numerosità di certe categorie, fino a ridursi, in due categorie, a un singolo valore.
Dopo aver analizzato la matrice di correlazione bisogna andare ad indagare più approfonditamente, cercando di spiegare il legame che lega la variabile price con le altre.
Per questo uno strumento molto utile è il tracciare una curva con il metodo loess, che passi più vicino possibile ai punti del grafico, per far emergere un andamento da esso.
A questo si può aggiungere il calcolo della correlazione tra una variabile e la trasformata dell’altra per vedere se le variabili aumentano la loro correlazione.
Nel grafico si vede un’andamento particolare che può ricordare una funzione cubica. A differenza però di quello che la curva suggerisce la correlazione tra l’altezza e il valore cubico del prezzo è molto basso, quindi la consideriamo poco esplicativa.
cor(data$height,I((data$price)^3))
## [1] 0.0483375
Questa volta si vede una curva che suggerisce un’andamento esponenziale e a differenza del precedente vi è una forte correlazione tra il logaritmo del prezzo e il peso della vettura.
cor(I(log(data$price)), data$curbWeight)
## [1] 0.8945391
In questo caso la curva nel grafico può trarre in inganno, per la coda di sinistra che cresce al ridursi delle dimensioni del motore (effetto prodotto dai pochi dati che deviano significativamente l’andamento) e dai valori a destra che sembrano appiattirsi.
cor(data$price, data$engineSize)
## [1] 0.8887785
La correlazione però va ad indicare che il rapporto più probabile è proprio quello lineare.
In questo grafico la curva sembra quasi trasformarsi in una retta, a suggerire un andamento lineare, che è anche quello suggerito dalla correlazione.
cor(data$price, data$horsepower)
## [1] 0.8124532
La curva disegnata nel grafico sembra molto simile a quella di una esponenziale inversa. Dal valore della correlazione non emergono sorprese, rafforzando la teoria di un’esponenziale inversa:
cor(I(-log(data$price)), data$cityMpg)
## [1] 0.7918757
Queste analisi hanno fatto emergere dei rapporti tra variabili che però necessitano di studio aggiuntivo con modelli di regressione bivariata e successivamente multivariata. Pertanto questi valori sono un punto di partenza per i modelli che verranno studiati nel prossimo capitolo.
Sono stati valutati i modelli di regressione lineare utilizzando come variabile dipendente il prezzo dell’auto. Nella seguente immagine sono indicati, in ordine decrescente, i valori di \(R^2\) per ciascuna variabile. La significatività del modello è indicata dal colore dei punti.
Si osserva che le variabili engineSize, curbweight, horsepower e highwayMpg risultano significative con p-value minori di \(10^{-16}\).
## symboling make fuelType aspiration numOfDoors bodyStyle driveWheels height
## 50 0 jaguar gas std two sedan rwd 47.8
## curbWeight engineType engineSize fuelSystem horsepower peakRpm highwayMpg
## 50 3950 ohcv 326 mpfi 262 5000 17
## price
## 50 36000
##
## Call:
## lm(formula = price ~ engineSize, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10438.4 -2273.3 -477.3 1373.0 14398.2
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7954.991 891.444 -8.924 3.14e-16 ***
## engineSize 166.851 6.668 25.021 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3913 on 197 degrees of freedom
## Multiple R-squared: 0.7606, Adjusted R-squared: 0.7594
## F-statistic: 626.1 on 1 and 197 DF, p-value: < 2.2e-16
Il modello lineare stimato utilizzando come variabile indipendente engineSize mostra un \(R^2\) pari a \(0.7594\). I parametri stimati per l’intecetta e la pendenza della retta di regressione risultano entrambi significativi con p-value minore di \(10^{-16}\).
Intercetta = -7954.991
Pendenza = 166.851
L’aumento di 1 unità di engineSize corrisponde all’aumento di 166.851 dollari per il prezzo. Il valore dell’intercetta -7954.991 non ha un interpretazione reale.
residual vs fitted: si osserva un distribuzione dei residui lineare con un aumento di varianza per valori medi di engineSize
QQ-residual: si osserva una violazione della normalità dei residui in prossimità delle code, in particolare per la coda destra
scale-location: si osserva una violazione di omoschedasticità
residual Vs leverage: si osserva la presenza di un valore outlier
## symboling make fuelType aspiration numOfDoors bodyStyle
## 127 3 porsche gas std two hardtop
## 128 3 porsche gas std two hardtop
## 129 3 porsche gas std two convertible
## 17 0 bmw gas std two sedan
## 74 0 mercedes-benz gas std four sedan
## 75 1 mercedes-benz gas std two hardtop
## driveWheels height curbWeight engineType engineSize fuelSystem horsepower
## 127 rwd 51.6 2756 ohcf 194 mpfi 207
## 128 rwd 51.6 2756 ohcf 194 mpfi 207
## 129 rwd 51.6 2800 ohcf 194 mpfi 207
## 17 rwd 53.7 3380 ohc 209 mpfi 182
## 74 rwd 56.7 3900 ohcv 308 mpfi 184
## 75 rwd 55.4 3715 ohcv 304 mpfi 184
## peakRpm highwayMpg price
## 127 5900 25 32528
## 128 5900 25 34028
## 129 5900 25 37028
## 17 5400 22 41315
## 74 4500 16 40960
## 75 4500 16 45400
##
## Call:
## lm(formula = price ~ curbWeight, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -11538.7 -2065.0 -319.7 1386.0 20684.5
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -19543.945 1576.417 -12.40 <2e-16 ***
## curbWeight 12.817 0.604 21.22 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4413 on 197 degrees of freedom
## Multiple R-squared: 0.6957, Adjusted R-squared: 0.6941
## F-statistic: 450.3 on 1 and 197 DF, p-value: < 2.2e-16
Il modello lineare stimato utilizzando come variabile indipendente curbWeight mostra un \(R^2\) pari a \(0.6941\). I parametri stimati per l’intecetta e la pendenza della retta di regressione risultano entrambi significativi con p-value minore di \(10^{-16}\).
L’aumento di 1lb del veicolo corrisponde all’aumento di 12.817 dollari per il prezzo. Il valore dell’intercetta non ha un interpretazione reale, non è possibile che un automobile di peso nullo costi -19543.945 dollari.
## symboling make fuelType aspiration numOfDoors bodyStyle driveWheels
## 18 0 bmw gas std four sedan rwd
## 74 0 mercedes-benz gas std four sedan rwd
## 75 1 mercedes-benz gas std two hardtop rwd
## height curbWeight engineType engineSize fuelSystem horsepower peakRpm
## 18 56.3 3505 ohc 209 mpfi 182 5400
## 74 56.7 3900 ohcv 308 mpfi 184 4500
## 75 55.4 3715 ohcv 304 mpfi 184 4500
## highwayMpg price
## 18 20 36880
## 74 16 40960
## 75 16 45400
##
## Call:
## lm(formula = price ~ horsepower, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10197.9 -2281.1 -420.8 1815.0 18267.6
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4659.37 978.08 -4.764 3.68e-06 ***
## horsepower 172.78 8.88 19.456 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4680 on 197 degrees of freedom
## Multiple R-squared: 0.6577, Adjusted R-squared: 0.656
## F-statistic: 378.6 on 1 and 197 DF, p-value: < 2.2e-16
Il modello lineare stimato utilizzando come variabile indipendente horsepower mostra un \(R^2\) pari a \(0.656\). I parametri stimati per l’intercetta e la pendenza della retta di regressione risultano entrambi significativi con p-value minore di \(10^{-16}\).
L’aumento di 1 cavallo del veicolo corrisponde all’aumento di 172.78 dollaro per il prezzo. Il valore dell’intercetta non ha un interpretazione reale, non è possibile che un automobile di 0 cavalli costi -4659.37 dollari.
## symboling make fuelType aspiration numOfDoors bodyStyle driveWheels
## 19 2 chevrolet gas std two hatchback fwd
## 75 1 mercedes-benz gas std two hardtop rwd
## 31 2 honda gas std two hatchback fwd
## height curbWeight engineType engineSize fuelSystem horsepower peakRpm
## 19 53.2 1488 l 61 2bbl 48 5100
## 75 55.4 3715 ohcv 304 mpfi 184 4500
## 31 50.8 1713 ohc 92 1bbl 58 4800
## highwayMpg price
## 19 53 5151
## 75 16 45400
## 31 54 6479
##
## Call:
## lm(formula = price ~ highwayMpg, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -8689 -3361 -1036 1029 20901
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 38687.64 1851.40 20.90 <2e-16 ***
## highwayMpg -830.64 59.01 -14.08 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5648 on 197 degrees of freedom
## Multiple R-squared: 0.5015, Adjusted R-squared: 0.4989
## F-statistic: 198.2 on 1 and 197 DF, p-value: < 2.2e-16
Il modello lineare stimato utilizzando come variabile indipendente highwayMpg mostra un \(R^2\) pari a \(0.4989\). I parametri stimati per l’intecetta e la pendenza della retta di regressione risultano entrambi significativi con p-value minore di \(10^{-16}\).
L’aumento di 1 unità di highwayMpg corrisponde ad una diminuizione di 830.64 dollari per il prezzo. Non ha senso interpretare l’intercetta in quanto rappresenta il prezzo di una macchina che fa 0 miglia con 1 gallone, ovvero ha un consumo infinito.
L’analisi è stata ripetuta in maniera analoga (costruzione del modello lineare, valutazione del summary e dei residui), considerando una trasformazione logaritmica sulla variabile price, scelta vista la distribuzione fortemente asimmetrica con una lunga coda a destra della variabile e date le sue relazioni esponenziali con diverse variabili del dataset:
Nel seguente grafico sono evidenziati i valori 127,128,129 relativi ai modelli di porsche.
## symboling make fuelType aspiration numOfDoors bodyStyle driveWheels
## 127 3 porsche gas std two hardtop rwd
## 128 3 porsche gas std two hardtop rwd
## 129 3 porsche gas std two convertible rwd
## height curbWeight engineType engineSize fuelSystem horsepower peakRpm
## 127 51.6 2756 ohcf 194 mpfi 207 5900
## 128 51.6 2756 ohcf 194 mpfi 207 5900
## 129 51.6 2800 ohcf 194 mpfi 207 5900
## highwayMpg price logPrice
## 127 25 32528 10.38986
## 128 25 34028 10.43494
## 129 25 37028 10.51943
##
## Call:
## lm(formula = logPrice ~ curbWeight, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.74975 -0.13253 -0.02088 0.08312 0.95806
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 7.137e+00 8.191e-02 87.13 <2e-16 ***
## curbWeight 8.657e-04 3.138e-05 27.59 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2293 on 197 degrees of freedom
## Multiple R-squared: 0.7943, Adjusted R-squared: 0.7933
## F-statistic: 760.9 on 1 and 197 DF, p-value: < 2.2e-16
Il modello lineare stimato utilizzando come variabile indipendente curbWeight mostra un \(R^2\) pari a \(0.7933\). I parametri stimati per l’intecetta e la pendenza della retta di regressione risultano entrambi significativi con p-value minore di \(10^{-16}\). Si ricorda che il prezzo è stato trasformato con una trasformazione logaritmica e per un’interpretazione corretta è necessario ritrasmormare il prezzo.
Per osservare la validità della trasformazione, si considerano i grafici del modello lineare e non, rispettivamente in blu ed in rosso:
## symboling make fuelType aspiration numOfDoors bodyStyle driveWheels
## 50 0 jaguar gas std two sedan rwd
## 106 3 nissan gas turbo two hatchback rwd
## height curbWeight engineType engineSize fuelSystem horsepower peakRpm
## 50 47.8 3950 ohcv 326 mpfi 262 5000
## 106 49.7 3139 ohcv 181 mpfi 200 5200
## highwayMpg price logPrice
## 50 17 36000 10.491274
## 106 23 19699 9.888323
##
## Call:
## lm(formula = logPrice ~ horsepower, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.64120 -0.18508 -0.06052 0.19604 0.82050
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.1871630 0.0581875 140.70 <2e-16 ***
## horsepower 0.0112417 0.0005283 21.28 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2784 on 197 degrees of freedom
## Multiple R-squared: 0.6968, Adjusted R-squared: 0.6953
## F-statistic: 452.8 on 1 and 197 DF, p-value: < 2.2e-16
Il modello lineare stimato utilizzando come variabile indipendente horsepower mostra un \(R^2\) pari a \(0.6953\). I parametri stimati per l’intecetta e la pendenza della retta di regressione risultano entrambi significativi con p-value minore di \(10^{-16}\).
Intercetta = 8.1871630
Pendenza = 0.0112417
## symboling make fuelType aspiration numOfDoors bodyStyle driveWheels
## 50 0 jaguar gas std two sedan rwd
## 74 0 mercedes-benz gas std four sedan rwd
## 75 1 mercedes-benz gas std two hardtop rwd
## height curbWeight engineType engineSize fuelSystem horsepower peakRpm
## 50 47.8 3950 ohcv 326 mpfi 262 5000
## 74 56.7 3900 ohcv 308 mpfi 184 4500
## 75 55.4 3715 ohcv 304 mpfi 184 4500
## highwayMpg price logPrice
## 50 17 36000 10.49127
## 74 16 40960 10.62035
## 75 16 45400 10.72327
##
## Call:
## lm(formula = logPrice ~ engineSize, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.85668 -0.20215 -0.06391 0.18903 0.77798
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.077322 0.064306 125.61 <2e-16 ***
## engineSize 0.010033 0.000481 20.86 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2823 on 197 degrees of freedom
## Multiple R-squared: 0.6883, Adjusted R-squared: 0.6867
## F-statistic: 435 on 1 and 197 DF, p-value: < 2.2e-16
Il modello lineare stimato utilizzando come variabile indipendente engineSize mostra un \(R^2\) pari a \(0.6867\). I parametri stimati per l’intecetta e la pendenza della retta di regressione risultano entrambi significativi con p-value minore di \(10^{-16}\).
## symboling make fuelType aspiration numOfDoors bodyStyle driveWheels
## 19 2 chevrolet gas std two hatchback fwd
## 31 2 honda gas std two hatchback fwd
## 91 1 nissan diesel std two sedan fwd
## height curbWeight engineType engineSize fuelSystem horsepower peakRpm
## 19 53.2 1488 l 61 2bbl 48 5100
## 31 50.8 1713 ohc 92 1bbl 58 4800
## 91 54.5 2017 ohc 103 idi 55 4800
## highwayMpg price logPrice
## 19 53 5151 8.546946
## 31 54 6479 8.776321
## 91 50 7099 8.867709
##
## Call:
## lm(formula = logPrice ~ highwayMpg, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.77503 -0.18447 -0.07493 0.15061 0.95405
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 11.141956 0.102024 109.21 <2e-16 ***
## highwayMpg -0.058435 0.003252 -17.97 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3112 on 197 degrees of freedom
## Multiple R-squared: 0.6211, Adjusted R-squared: 0.6192
## F-statistic: 322.9 on 1 and 197 DF, p-value: < 2.2e-16
Il modello lineare stimato utilizzando come variabile indipendente highwayMpg mostra un \(R^2\) pari a \(0.6192\). I parametri stimati per l’intercetta e la pendenza della retta di regressione risultano entrambi significativi con p-value minore di \(10^{-16}\).
residual vs fitted: si osserva una curvatura dei residui suggerendo una possibile dipendenza quadratica, la scelta del modello lineare potrebbe non essere ottimale
QQ-residual: il grafico sembra sugerrire la presenza di due gruppi distinti nella variabile entrambi con distribuzione normale dei residui
scale-location: si osserva maggiore varianza per valori piccoli di highwaryMpg, per gli altri valori invece si osserva una buona omoschedasticità
residual Vs leverage: non osserva la presenza di valori outlyer ma si evidenziano dei possibili valori anomali
La comparazione tra i vari modelli di regressione lineare stimati porta alla conclusione che il modello che utilizza come predittore la variabile curbWeight e la variabile price in seguito ad una trasformazione logaritmica è il migliore; sia in termini di varianza spiegata, sia in termini di bontà del modello lineare nello studio dei residui.
Dopo aver cercato modelli bivariati che riuscissero a spiegare dei legami tra le variabili, ora ci prefiggiamo di cercare il miglior modello (senza cadere nel rischio di overfitting) che riesca a spiegare la variabile price.
Come prima cosa si è notato che prendere in considerazione la trasformazione della variabile price migliora significativamente il risultato che possiamo ottenere.
Si è deciso di dividere il dataset in due:
il dataset per il training;
il dataset per il testing.
Questo ci da la possibilità di testare la solidità delle nostre previsioni e cercare quello migliore.
Il dataset viene diviso in due con una funzione pseudocasuale che divide il dataset in 70% training set e 30% testing set.
Successivamente viene utilizzata la funzione stepAIC()
che tenta automaticamente un gran numero di combinazioni di variabili
per trovare il modello migliore.
## Start: AIC=-585.23
## logPrice ~ symboling + make + fuelType + aspiration + numOfDoors +
## bodyStyle + driveWheels + height + curbWeight + engineType +
## engineSize + fuelSystem + horsepower + peakRpm + highwayMpg
##
##
## Step: AIC=-585.23
## logPrice ~ symboling + make + aspiration + numOfDoors + bodyStyle +
## driveWheels + height + curbWeight + engineType + engineSize +
## fuelSystem + horsepower + peakRpm + highwayMpg
##
## Df Sum of Sq RSS AIC
## - numOfDoors 1 0.00088 0.96340 -587.11
## - horsepower 1 0.01027 0.97280 -585.77
## - highwayMpg 1 0.01339 0.97591 -585.33
## <none> 0.96252 -585.23
## - height 1 0.02167 0.98419 -584.16
## - fuelSystem 6 0.10514 1.06766 -582.93
## - peakRpm 1 0.03647 0.99899 -582.10
## - engineSize 1 0.04935 1.01187 -580.33
## - engineType 3 0.07925 1.04177 -580.31
## - symboling 5 0.11263 1.07515 -579.96
## - driveWheels 2 0.06876 1.03128 -579.71
## - bodyStyle 4 0.11633 1.07885 -577.49
## - aspiration 1 0.11067 1.07319 -572.21
## - curbWeight 1 0.25443 1.21696 -554.86
## - make 19 1.41164 2.37416 -498.64
##
## Step: AIC=-587.11
## logPrice ~ symboling + make + aspiration + bodyStyle + driveWheels +
## height + curbWeight + engineType + engineSize + fuelSystem +
## horsepower + peakRpm + highwayMpg
##
## Df Sum of Sq RSS AIC
## - horsepower 1 0.01100 0.97440 -587.54
## - highwayMpg 1 0.01370 0.97711 -587.16
## <none> 0.96340 -587.11
## - height 1 0.02430 0.98770 -585.67
## - fuelSystem 6 0.10824 1.07164 -584.41
## - peakRpm 1 0.03563 0.99903 -584.09
## - engineSize 1 0.04855 1.01195 -582.32
## - engineType 3 0.07935 1.04275 -582.18
## - driveWheels 2 0.06867 1.03208 -581.60
## - symboling 5 0.12768 1.09108 -579.93
## - bodyStyle 4 0.11798 1.08138 -579.16
## - aspiration 1 0.11185 1.07525 -573.95
## - curbWeight 1 0.27109 1.23449 -554.89
## - make 19 1.42266 2.38606 -499.95
##
## Step: AIC=-587.54
## logPrice ~ symboling + make + aspiration + bodyStyle + driveWheels +
## height + curbWeight + engineType + engineSize + fuelSystem +
## peakRpm + highwayMpg
##
## Df Sum of Sq RSS AIC
## - highwayMpg 1 0.01118 0.98558 -587.97
## <none> 0.97440 -587.54
## - height 1 0.01937 0.99377 -586.82
## - fuelSystem 6 0.09865 1.07305 -586.23
## - peakRpm 1 0.02468 0.99907 -586.09
## - engineSize 1 0.03814 1.01253 -584.24
## - engineType 3 0.06884 1.04324 -584.12
## - driveWheels 2 0.06509 1.03949 -582.62
## - symboling 5 0.11874 1.09314 -581.67
## - bodyStyle 4 0.13204 1.10643 -578.00
## - aspiration 1 0.14590 1.12030 -570.28
## - curbWeight 1 0.27806 1.25245 -554.90
## - make 19 1.60138 2.57578 -491.39
##
## Step: AIC=-587.97
## logPrice ~ symboling + make + aspiration + bodyStyle + driveWheels +
## height + curbWeight + engineType + engineSize + fuelSystem +
## peakRpm
##
## Df Sum of Sq RSS AIC
## - fuelSystem 6 0.08764 1.07322 -588.21
## <none> 0.98558 -587.97
## - peakRpm 1 0.01947 1.00505 -587.27
## - height 1 0.02388 1.00946 -586.66
## - engineType 3 0.06117 1.04675 -585.66
## - engineSize 1 0.03452 1.02010 -585.22
## - driveWheels 2 0.05986 1.04544 -583.83
## - symboling 5 0.11164 1.09722 -583.16
## - bodyStyle 4 0.13641 1.12199 -578.08
## - aspiration 1 0.13474 1.12032 -572.28
## - curbWeight 1 0.27217 1.25775 -556.31
## - make 19 1.59417 2.57975 -493.18
##
## Step: AIC=-588.21
## logPrice ~ symboling + make + aspiration + bodyStyle + driveWheels +
## height + curbWeight + engineType + engineSize + peakRpm
##
## Df Sum of Sq RSS AIC
## <none> 1.0732 -588.21
## - height 1 0.02465 1.0979 -587.08
## - engineType 3 0.06143 1.1346 -586.53
## - engineSize 1 0.03449 1.1077 -585.84
## - driveWheels 2 0.05069 1.1239 -585.84
## - symboling 5 0.11157 1.1848 -584.56
## - peakRpm 1 0.05476 1.1280 -583.34
## - bodyStyle 4 0.17357 1.2468 -575.52
## - aspiration 1 0.12630 1.1995 -574.86
## - curbWeight 1 0.39288 1.4661 -547.16
## - make 19 2.01593 3.0892 -480.31
Vengono creati altri modelli, a due e tre variabili e poi valutati con il test dell’\(R^2\) aggiustato.
# Migliori modelli con due var indipendenti
ml1<-lm(logPrice~curbWeight+make,data = train_data)
ml2<-lm(logPrice~horsepower+make,data = train_data)
ml3<-lm(logPrice~curbWeight+horsepower,data = train_data)
# Migliori modelli con tre variabili indipendenti
ml4<-lm(logPrice~curbWeight+make+height,data = train_data)
ml5<-lm(logPrice~curbWeight+make+bodyStyle,data = train_data)
ml6<-lm(logPrice~curbWeight+make+horsepower,data = train_data)
# Modelli senza make
ml7<-lm(logPrice~curbWeight+horsepower+bodyStyle,data = train_data)
ml8<-lm(logPrice~curbWeight+horsepower+engineSize,data = train_data)
ml9<-lm(logPrice~curbWeight+horsepower+engineType,data = train_data)
ml10<-lm(logPrice~curbWeight+engineType+bodyStyle,data = train_data)
mlt <- lm(logPrice~curbWeight+I(log(horsepower))+make, data = train_data)
#R-squared adj
mlRsq.adj<-summary(ml)$adj.r.squared
ml1Rsq.adj<-summary(ml1)$adj.r.squared
ml2Rsq.adj<-summary(ml2)$adj.r.squared
ml3Rsq.adj<-summary(ml3)$adj.r.squared
ml4Rsq.adj<-summary(ml4)$adj.r.squared
ml5Rsq.adj<-summary(ml5)$adj.r.squared
ml6Rsq.adj<-summary(ml6)$adj.r.squared
ml7Rsq.adj<-summary(ml7)$adj.r.squared
ml8Rsq.adj<-summary(ml8)$adj.r.squared
ml9Rsq.adj<-summary(ml9)$adj.r.squared
ml10Rsq.adj<-summary(ml10)$adj.r.squared
mltRsq.adj <- summary(mlt)$adj.r.squared
Per valutare la qualità dei modelli è stato usato anche il test AIC.
mlAIC<-AIC(ml)
ml1AIC<-AIC(ml1)
ml2AIC<-AIC(ml2)
ml3AIC<-AIC(ml3)
ml4AIC<-AIC(ml4)
ml5AIC<-AIC(ml5)
ml6AIC<-AIC(ml6)
ml7AIC<-AIC(ml7)
ml8AIC<-AIC(ml8)
ml9AIC<-AIC(ml9)
ml10AIC<-AIC(ml10)
mltAIC <- AIC(mlt)
Con i modelli costruiti si è tentato di prevedere dei dati che poi verranno comparati con il dataset di test attraverso il valore dello scarto quadratico medio:
# Utilizzo i modelli per prevedere i valori del test data
pred <-predict(ml,newdata=test_data)
pred1<-predict(ml1,newdata=test_data)
pred2<-predict(ml2,newdata=test_data)
pred3<-predict(ml3,newdata=test_data)
pred4<-predict(ml4,newdata=test_data)
pred5<-predict(ml5,newdata=test_data)
pred6<-predict(ml6,newdata=test_data)
pred7<-predict(ml7,newdata=test_data)
pred8<-predict(ml8,newdata=test_data)
pred9<-predict(ml9,newdata=test_data)
pred10<-predict(ml10,newdata=test_data)
predt <- predict(mlt, newdata=test_data)
# Calcolo scarto quadratico medio rispetto al test data
RMSD <- sqrt(sum((pred - test_data$logPrice)^2)/length(test_data$logPrice))
RMSD1 <- sqrt(sum((pred1 - test_data$logPrice)^2)/length(test_data$logPrice))
RMSD2 <- sqrt(sum((pred2 - test_data$logPrice)^2)/length(test_data$logPrice))
RMSD3 <- sqrt(sum((pred3 - test_data$logPrice)^2)/length(test_data$logPrice))
RMSD4 <- sqrt(sum((pred4 - test_data$logPrice)^2)/length(test_data$logPrice))
RMSD5 <- sqrt(sum((pred5 - test_data$logPrice)^2)/length(test_data$logPrice))
RMSD6 <- sqrt(sum((pred6 - test_data$logPrice)^2)/length(test_data$logPrice))
RMSD7 <- sqrt(sum((pred7 - test_data$logPrice)^2)/length(test_data$logPrice))
RMSD8 <- sqrt(sum((pred8 - test_data$logPrice)^2)/length(test_data$logPrice))
RMSD9 <- sqrt(sum((pred9 - test_data$logPrice)^2)/length(test_data$logPrice))
RMSD10 <- sqrt(sum((pred10 - test_data$logPrice)^2)/length(test_data$logPrice))
RMSDt <- sqrt(sum((predt - test_data$logPrice)^2)/length(test_data$logPrice))
I valori infine vengono graficati in tre grafici:
Gli 11 modelli che sono emersi dai dati e dalle nostre considerazioni sono stati messi alla prova attraverso i 3 test e successivamente graficati.
Secondo il test AIC i tre modelli che sembrano essere più esplicativi, in ordine di predittività, sono il modello attraverso la funzione stepAIC, curbWeight+make+height, curbWeight+make+log(horsepower), curbWeight+make+bodyStyle e curbWeight+make+horsepower.
Invece secondo il test dell’\(R^2\) aggiustato si vede come quattro modelli finiscono per essere quasi a parimerito: il modello attraverso la funzione stepAIC, curbWeight+make+log(horsepower), curbWeight+make+height, curbWeight+make+bodyStyle e curbWeight+make+horsepower.
Infine nel test degli scarti quadratici medi emergono tre modelli leggermente più esplicativi degli altri: in ordine di predittività, il modello della funzione stepAIC, curbWeight+make+height, curbWeight+make+log(horsepower) e curbWeight+make+horsepower.
Sembra quindi emergere che curbWeight sia una variabile molto significativa, leggermente di più di make, horsepower, bodyStyle e engineType.