Introduzione

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).


Analisi del dataset

L’analisi del dataset è stata strutturata come segue:

  1. Pulizia dei dati
  2. Analisi univariata
  3. Analisi bivariata
  4. Modelli di regressione

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" ...



1. Pulizia dei dati

Alcune considerazioni:


Valori mancanti nel dataset

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.


Trasformazioni delle variabili

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.



2. Analisi univariata - variabili categoriali

Per l’analisi di ogni variabile del dataset sono stati utilizzati diversi strumenti grafici e statistici:


Symboling

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.


Make

La marca d’auto più presente del dataset è la Toyota.


Fuel type

Nel dataset la tipologia di carburante più frequente è la benzina.


Aspiration & number of doors

La maggior parte delle auto del dataset ha quattro porte, mentre la tipologia di aspirazione più frequente è la std.


Body style & drive wheels

Le auto sono per la maggiore del tipo berlina (sedan) e a trazione anteriore (fwd).


Engine type & engine location

La maggior parte delle automobili hanno il motore nella parte anteriore e di tipologia ohc, ossia motori con alberi a canne in testa.


Fuel system & Number of cylinders

La maggior parte dei motori sono a pistoni a quattro cilindri con un sistema di carburazione del tipo mpfi, ossia a iniezione multi-point.


2. Analisi univariata - variabili continue

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:


Misurazioni del motore









Caratteristiche dei veicoli







3. Analisi bivariata

Analisi collineare



Engine Size e cilindrata

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.



EngineSize con numOfCylinder


##                     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.



EngineSize con Bore

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.



EngineSize con Stroke

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.


Conclusione

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.




Compression ratio & fuel type


##                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.


length con wheelBase

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.


curbWeight con length

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.


curbWeight con width

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.


curbWeight con height

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.


Volume

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.


Conclusione

È 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.




highwayMpg e cityMpg

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.




Analisi bivariata rispetto alla variabile price

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.


Boxplot condizionati

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.


price ~ symboling

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.


price ~ make

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.


price ~ fuelType

##              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.


price ~ bodyStyle

##              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.


price ~ driveWheels

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.


price ~ engineType

##              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.


price ~ fuelSystem

##              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.


price ~ height

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


price ~ curbWeight

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


price ~ engineSize


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.


price ~ horsepower


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


price ~ cityMpg


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

Conclusioni

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.


4. Modelli di regressione - lineare

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.


Analisi dei modelli

Si osserva che le variabili engineSize, curbweight, horsepower e highwayMpg risultano significative con p-value minori di \(10^{-16}\).


price ~ engineSize

##    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



price ~ curbWeight

##     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}\).

  • Intercetta = -19543.945
  • Pendenza = 12.817

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.

  • residual vs fitted: si osserva una andamento lineare con una leggera curvatura. Si evidenzia un notevole aumento di varianza e relativa assenza di omoschedasticità
  • QQ-residual: residui appaiono distribuiti normalmente solo per i valori intermedi, si evidenza una violazione di normalità molto marcata in prossimità delle code, in particolare la coda destra
  • scale-location: si conferma il notevole aumento di varianza osservato nel grafico residual vs fitted
  • residual Vs leverage: non si osservano dati outlier, ma si evidenza la possibile presenza di valori anomali



price ~ horsepower

##    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}\).

  • Intercetta = -4659.37
  • Pendenza = 172.78

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.

  • residual vs fitted: si osserva una sostanziale linearità del modello con una leggera curvatura. Si evidenzia un aumento della varianza all’aumentare di horsepower
  • QQ-residual: si osserva una violazione della normalità dei residui evidenziata da una coda pesante a destra
  • scale-location: si conferma un aumento di varianza all’aumentare di horsepower
  • residual Vs leverage: non si osservano dati outlier. Si osservano dei possibili valori anomali



price ~ highwayMpg

##    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}\).

  • Intercetta = 38687.64
  • Pendenza = -830.64

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.

  • residual vs fitted: si osserva un andamento non lineare e un aumento della varianza all’aumentare di highwayMpg
  • QQ-residual: si osserva una notevole violazione di gaussianità dei residui in prossimità della coda destra
  • scale-location: si conferma un andamento non lineare e una violazione di omoschedasticità
  • residual Vs leverage: non osserva la presenza di valori outlier ma si evidenziano dei possibili valori anomali



Trasformazioni non lineari

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:



log(price) ~ curbWeight

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.

  • Intercetta = 7.137e+00
  • Pendenza = 8.657e-04

  • residual vs fitted: la linea rossa parallela dimostra che la scelta di un modello lineare è appropriata. Si osserva una generale omoschedasticità con un leggero aumento della varianza all’aumentare del peso della macchina
  • QQ-residual: si osserva una generale normalità dei residui con violazioni maggiori in corrispondenza delle code. I tre valori anomali sono dovuti a tre automobili di porsche
  • scale-location: si osserva un aumento della varianza all’aumentare del peso della macchina. conferma quanto visto nel residual vs fitted
  • residual Vs leverage: non si osservano dati outlier

Per osservare la validità della trasformazione, si considerano i grafici del modello lineare e non, rispettivamente in blu ed in rosso:



log(price) ~ horsepower

##     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

  • residual vs fitted: i residui mostrano una leggera curvatura ma in generale la linearità del modello pare rispettata. La varianza sembra avere un aumento all’aumentare dei cavalli della macchina
  • QQ-residual: si osserva un eccellente normalità dei residui con violazioni per i valori di horsepower più bassi
  • scale-location: si osserva un leggero aumento della varianza all’aumentare dei valori di horsepower
  • residual Vs leverage: non si osservano dati outlyer, ma si osservano valori che si discostano leggermente dagli altri



log(price) ~ engineSize

##    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}\).

  • Intercetta = 8.077322
  • Pendenza = 0.010033

  • 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: si osserva una generale distribuzione normale dei residui con una violazione in prossimità della coda sinistra
  • scale-location: si osserva un leggero aumento della varianza all’aumentare del variabile engineSize
  • residual Vs leverage: si osserva la presenza di un outlier e altri valori anomali



log(price) ~ highwayMpg

##    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}\).

  • Intercetta = 11.14
  • Pendenza = -0.0584

  • 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



Conclusioni

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.





5. Modelli di regressione - multivariata

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:

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:


Conclusioni

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.