On s’intéresse au climat des différents pays d’Europe. Pour cela, on a recueilli les températures moyennes mensuelles (en degrés Celsius) pour les principales capitales européennes ainsi que pour certaines grandes villes.
En plus des températures mensuelles, on a la température moyenne annuelle ainsi que l’amplitude thermique (différence entre la moyenne mensuelle maximum et la moyenne mensuelle minimum d’une ville). On a également deux variables de positionnement (la longitude et la latitude) ainsi qu’une variable (l’appartenance à une région d’Europe, variable à quatre modalités : Europe du nord, du sud, de l’est, de l’ouest).
library("FactoMineR")
library("factoextra")
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
donnee = read.table("jeu_donnee_DM2.csv", header = TRUE, row.names = 1, check.names = FALSE, sep = ";", dec = ".")
*Tableau de données Il s’agit de 17 variables (16 quantitatives & 1 qualitative) et 35 observations :
head(donnee)
## Janvier Février Mars Avril Mai Juin Juillet Août Septembre
## Amsterdam 2.9 2.5 5.7 8.2 12.5 14.8 17.1 17.1 14.5
## Athènes 9.1 9.7 11.7 15.4 20.1 24.5 27.4 27.2 23.8
## Berlin -0.2 0.1 4.4 8.2 13.8 16.0 18.3 18.0 14.4
## Bruxelles 3.3 3.3 6.7 8.9 12.8 15.6 17.8 17.8 15.0
## Budapest -1.1 0.8 5.5 11.6 17.0 20.2 22.0 21.3 16.9
## Copenhague -0.4 -0.4 1.3 5.8 11.1 15.4 17.1 16.6 13.3
## Octobre Novembre Décembre Moyenne Amplitude Latitude Longitude
## Amsterdam 11.4 7.0 4.4 9.9 14.6 52.2 4.5
## Athènes 19.2 14.6 11.0 17.8 18.3 37.6 23.5
## Berlin 10.0 4.2 1.2 9.1 18.5 52.3 13.2
## Bruxelles 11.1 6.7 4.4 10.3 14.4 50.5 4.2
## Budapest 11.3 5.1 0.7 10.9 23.1 47.3 19.0
## Copenhague 8.8 4.1 1.3 7.8 17.5 55.4 12.3
## Région
## Amsterdam Ouest
## Athènes Sud
## Berlin Ouest
## Bruxelles Ouest
## Budapest Est
## Copenhague Nord
Dans ce tableau on a gardé 12 variables, les mois de l’année, sans toucher aux observations :
donnee_acti = donnee[1:35, 1:12]
head(donnee_acti)
## Janvier Février Mars Avril Mai Juin Juillet Août Septembre
## Amsterdam 2.9 2.5 5.7 8.2 12.5 14.8 17.1 17.1 14.5
## Athènes 9.1 9.7 11.7 15.4 20.1 24.5 27.4 27.2 23.8
## Berlin -0.2 0.1 4.4 8.2 13.8 16.0 18.3 18.0 14.4
## Bruxelles 3.3 3.3 6.7 8.9 12.8 15.6 17.8 17.8 15.0
## Budapest -1.1 0.8 5.5 11.6 17.0 20.2 22.0 21.3 16.9
## Copenhague -0.4 -0.4 1.3 5.8 11.1 15.4 17.1 16.6 13.3
## Octobre Novembre Décembre
## Amsterdam 11.4 7.0 4.4
## Athènes 19.2 14.6 11.0
## Berlin 10.0 4.2 1.2
## Bruxelles 11.1 6.7 4.4
## Budapest 11.3 5.1 0.7
## Copenhague 8.8 4.1 1.3
L’ACP est particulièrement utile lorsque les variables sont fortement corrélées. La corrélation indique qu’il existe une redondance dans les données. En raison de cette redondance, l’ACP peut être utilisée pour réduire les variables d’origine en un nombre plus petit de nouvelles variables qu’on appelle composantes principales, ces dernières expliquant la plus grande partie de la variance contenue dans les variables d’origine.
Objectifs :
Identifier les variables corrélées.
Dans l’ACP, il est recommandé de normaliser les variables lorsqu’elles sont mesurées dans différentes unités (par exemple: Celsius, Kelvin, Fahrenheit.) sinon, le résultat de l’ACP obtenue sera fortement affecté. L’objectif est de rendre les variables comparables. Généralement, elles sont normalisées de manière qu’elles aient au final un écart type égal à 1 et une moyenne égale à 0. Techniquement, l’approche consiste à transformer les données en soustrayant à chaque valeur la moyenne et en la divisant par l’écart type de la variable associée. A l’issue de cette transformation les données obtenues sont dites données centrées réduites. L’ACP appliquée à ces données transformées est appelée ACP normée. Notons bien que la fonction PCA() qu’on va utiliser pour appliquer l’ACP normalise automatiquement les données.
L’objet créé avec la fonction PCA() contient de nombreuses informations stockées dans de nombreuses listes et matrices. Ces valeurs sont expliquées dans la section suivante.
ACP=PCA(donnee_acti, scale.unit=TRUE, graph = TRUE)
ACP
## **Results for the Principal Component Analysis (PCA)**
## The analysis was performed on 35 individuals, described by 12 variables
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$var" "results for the variables"
## 3 "$var$coord" "coord. for the variables"
## 4 "$var$cor" "correlations variables - dimensions"
## 5 "$var$cos2" "cos2 for the variables"
## 6 "$var$contrib" "contributions of the variables"
## 7 "$ind" "results for the individuals"
## 8 "$ind$coord" "coord. for the individuals"
## 9 "$ind$cos2" "cos2 for the individuals"
## 10 "$ind$contrib" "contributions of the individuals"
## 11 "$call" "summary statistics"
## 12 "$call$centre" "mean of the variables"
## 13 "$call$ecart.type" "standard error of the variables"
## 14 "$call$row.w" "weights for the individuals"
## 15 "$call$col.w" "weights for the variables"
Les valeurs propres mesurent la quantité de variance expliquée par chaque axe principal. Les valeurs propres sont grandes pour les premiers axes et petits pour les axes suivants. Autrement dit, les premiers axes correspondent aux directions portant la quantité maximale de variation contenue dans le jeu de données.
Nous examinons les valeurs propres pour déterminer le nombre de composantes principales à prendre en considération.
get_eigenvalue(ACP)
## eigenvalue variance.percent cumulative.variance.percent
## Dim.1 1.042445e+01 86.870441346 86.87044
## Dim.2 1.370499e+00 11.420823117 98.29126
## Dim.3 1.205076e-01 1.004230241 99.29549
## Dim.4 4.233298e-02 0.352774838 99.64827
## Dim.5 2.292280e-02 0.191023370 99.83929
## Dim.6 8.684234e-03 0.072368614 99.91166
## Dim.7 4.178064e-03 0.034817200 99.94648
## Dim.8 2.930325e-03 0.024419371 99.97090
## Dim.9 1.475750e-03 0.012297915 99.98320
## Dim.10 8.529732e-04 0.007108110 99.99030
## Dim.11 7.862929e-04 0.006552441 99.99686
## Dim.12 3.772122e-04 0.003143435 100.00000
La somme de toutes les valeurs propres donne une variance totale de 12 (= nbre de variables). La proportion de variance expliquée par chaque valeur propre est donnée dans la deuxième colonne. Par exemple, 10.42 divisé par 12 est égal à 0.86, ou, environ 86.87% de la variation est expliquée par cette première valeur propre.
Le pourcentage cumulé expliqué est obtenu en ajoutant les proportions successives de variances expliquées. Par exemple, 86.87% plus 11.42% est égale à 98.29%, et ainsi de suite. Par conséquent, environ 98.29% de la variance totale est expliquée par les deux premières valeurs propres.
*Remarque
Malheureusement, il n’existe pas de méthode objective bien acceptée pour décider le nombre d’axes principaux à conserver. Cela dépendra du domaine d’application et du jeu de données. Dans la pratique, on a tendance à regarder les premiers axes principaux afin de trouver des profils intéressants dans les données.
Dans notre analyse, les deux premières composantes principales expliquent 98.29% de la variation. C’est un pourcentage très acceptable.
fviz_eig(ACP, addlabels = TRUE)
D’après Peres-Neto, Jackson et Somers, pour déterminer le nombre de composantes principales on peut regarder le graphique des valeurs propres. Le nombre d’axes est déterminé par le point, au-delà duquel les valeurs propres restantes sont toutes relativement petites et de tailles comparables. Du graphique ci-dessus, nous pourrions vouloir nous arrêter à la 2ème composante principale. ### Graphique des variables
var = get_pca_var(ACP)
var$coord
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## Janvier 0.8860755 -0.45751432 0.05206208 0.011585933 0.031138228
## Février 0.9155949 -0.39031905 -0.01935250 -0.053318034 0.071974199
## Mars 0.9584119 -0.24677942 -0.09436133 -0.099540248 -0.010720046
## Avril 0.9800993 0.05762190 -0.18288103 -0.037434910 -0.002314438
## Mai 0.9122675 0.35994808 -0.17566663 0.069231356 -0.025709333
## Juin 0.8777769 0.46805841 -0.01779077 0.058623751 0.074662743
## Juillet 0.8764329 0.45990165 0.12712857 -0.009623827 0.042037666
## Août 0.9133722 0.37081148 0.13473486 -0.086191791 -0.037955697
## Septembre 0.9877626 0.13646682 0.04623238 -0.021529403 -0.024664614
## Octobre 0.9928896 -0.07186248 0.03518855 0.025002780 -0.079007340
## Novembre 0.9653903 -0.24169454 0.04479545 0.069973424 -0.018172136
## Décembre 0.9073424 -0.40589958 0.06481038 0.079435500 -0.005350611
Chaque colonne représente les affixes des projetées orthogonaux des variables actives sur un axe principal.
La corrélation entre une variable et une composante principale est utilisée comme coordonnées de la variable sur la composante principale.
La représentation des variables diffère de celle des observations: les observations sont représentées par leurs projections, mais les variables sont représentées par leurs corrélations.
fviz_pca_var(ACP, col.var = "red", repel=TRUE)
Le graphique ci-dessus est connu sous le nom de graphique de corrélation des variables. Il montre les relations entre toutes les variables. Il peut être interprété comme suit:
La qualité de représentation, cos², mesure le degré d’association entre lesvariables et les dimensions.
var$cos2
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## Janvier 0.7851298 0.209319354 0.0027104597 1.342339e-04 9.695892e-04
## Février 0.8383139 0.152348962 0.0003745193 2.842813e-03 5.180285e-03
## Mars 0.9185534 0.060900080 0.0089040613 9.908261e-03 1.149194e-04
## Avril 0.9605946 0.003320284 0.0334454729 1.401372e-03 5.356625e-06
## Mai 0.8322320 0.129562620 0.0308587646 4.792981e-03 6.609698e-04
## Juin 0.7704924 0.219078672 0.0003165115 3.436744e-03 5.574525e-03
## Juillet 0.7681347 0.211509525 0.0161616730 9.261805e-05 1.767165e-03
## Août 0.8342488 0.137501154 0.0181534825 7.429025e-03 1.440635e-03
## Septembre 0.9756749 0.018623193 0.0021374326 4.635152e-04 6.083432e-04
## Octobre 0.9858298 0.005164216 0.0012382342 6.251390e-04 6.242160e-03
## Novembre 0.9319784 0.058416248 0.0020066327 4.896280e-03 3.302265e-04
## Décembre 0.8232703 0.164754466 0.0042003848 6.309999e-03 2.862903e-05
fviz_cos2(ACP, choice="var",axes=1:2)
Les deux dimensions 1 & 2 portent 98.29% de l’inertie totale. Tous les points sont très bien représentés par ces deux dimensions.
Un cos² élevé indique une bonne représentation de la variable sur les axes principaux en considération. Dans ce cas, la variable est positionnée à proximité de la circonférence du cercle de corrélation.
Un faible cos² indique que la variable n’est pas parfaitement représentée par les axes principaux. Dans ce cas, la variable est proche du centre du cercle.
fviz_pca_var(ACP,col.var="cos2", gradient.cols = c("white","blue","red"), regel= TRUE)
Les variables à faible valeur de cos² sont colorées en blanc, celles à valeurs moyennes sont en bleu et celles à valeurs élevées sont en rouge.
Les contributions des variables dans la définition d’un axe principal donné, sont exprimées en pourcentage.
var$contrib
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## Janvier 7.531617 15.2732245 2.2492018 0.3170905 4.22980196
## Février 8.041803 11.1163151 0.3107848 6.7153618 22.59882892
## Mars 8.811526 4.4436435 7.3887947 23.4055358 0.50133217
## Avril 9.214820 0.2422683 27.7538220 3.3103562 0.02336811
## Mai 7.983460 9.4536838 25.6073120 11.3220957 2.88345966
## Juin 7.391202 15.9853242 0.2626485 8.1183609 24.31868764
## Juillet 7.368585 15.4330327 13.4113276 0.2187846 7.70920238
## Août 8.002806 10.0329279 15.0641770 17.5490238 6.28472360
## Septembre 9.359483 1.3588624 1.7736907 1.0949269 2.65387775
## Octobre 9.456898 0.3768129 1.0275152 1.4767186 27.23122185
## Novembre 8.940309 4.2624079 1.6651499 11.5661122 1.44060271
## Décembre 7.897492 12.0214968 3.4855759 14.9056328 0.12489325
fviz_contrib(ACP,choice="var",axes=1)
fviz_contrib(ACP,choice="var",axes=2)
Plus la valeur de la contribution est importante, plus la variable contribue à la composante principale en question
fviz_pca_var(ACP, col.var="contrib", gradient.cols= c("white", "blue", "red"), repel = TRUE)
Les variables à faible contribution aux dimensions 1 & 2 sont colorées en blanc, celles à valeurs moyennes sont en bleu et celles à valeurs élevées sont en rouge.
Comme les variables, il est également possible de colorer les individus en fonction de leurs valeurs de cos².
fviz_pca_ind(ACP, col.ind="cos2", gradient.cols=c("white", "blue", "red"), repel = TRUE)
fviz_pca_ind(ACP, pointsiez="cos2", pointshape=21, fill = "blue", repel = TRUE)
Les villes qui ont des climats similaires sont regroupés sur le graphique.
fviz_contrib(ACP, choice = "ind", aces=1:2)
On remarque que Séville est l’individu qui contribue le plus aux deux premières composantes principales. _____________________
La régression PLS (Partial Least Squares) est une technique qui généralise et combine des caractéristiques de l’analyse en composantes principales et de la régression multiple. Il est particulièrement utile lorsque nous avons besoin de prédire un ensemble de variables dépendantes à partir d’un (très) grand ensemble de variables indépendantes. C’est une méthode développée par Herman Wold pendant les années soixante du vingtième siècle.
options(warn=0)
library(knitr)
## Warning: package 'knitr' was built under R version 3.4.4
library(ggplot2) # Data visualization
library(plyr)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:plyr':
##
## arrange, count, desc, failwith, id, mutate, rename, summarise,
## summarize
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(corrplot)
## Warning: package 'corrplot' was built under R version 3.4.4
## corrplot 0.84 loaded
library(caret)
## Warning: package 'caret' was built under R version 3.4.4
## Loading required package: lattice
library(gridExtra)
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
library(scales)
library(Rmisc)
## Warning: package 'Rmisc' was built under R version 3.4.4
library(ggrepel)
library(psych)
## Warning: package 'psych' was built under R version 3.4.4
##
## Attaching package: 'psych'
## The following objects are masked from 'package:scales':
##
## alpha, rescale
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
library(readr) # CSV file I/O, e.g. the read_csv function
## Warning: package 'readr' was built under R version 3.4.4
##
## Attaching package: 'readr'
## The following object is masked from 'package:scales':
##
## col_factor
library(gplots)
## Warning: package 'gplots' was built under R version 3.4.4
##
## Attaching package: 'gplots'
## The following object is masked from 'package:stats':
##
## lowess
library(repr)
## Warning: package 'repr' was built under R version 3.4.4
train <- read.csv("train.csv")
Dans cette base de données, il y a 1460 observations avec 79 variables explicatives décrivant tous(ou presque) les aspects des maisons résidentielles. Parmi les variables explicatives, il y a 37 variables entières, telles que??? Id???," MSSubClass???," LotFrontage??? et 43 variables factorielles, telles que “MSZoning???,” Street???, et" LotShape???. L’analyse descriptive et l’analyse quantitative en utiliseront des sous-ensembles en fonction des modèles.
Les variables sont descriptives dans un dossier txt en jointure.
Nous traiterons cela en deux parties :
# list des collones qui ont ne valeur manquante
missing_row <- train[!complete.cases(train),]
head(missing_row)
## Id MSSubClass MSZoning LotFrontage LotArea Street Alley LotShape
## 1 1 60 RL 65 8450 Pave <NA> Reg
## 2 2 20 RL 80 9600 Pave <NA> Reg
## 3 3 60 RL 68 11250 Pave <NA> IR1
## 4 4 70 RL 60 9550 Pave <NA> IR1
## 5 5 60 RL 84 14260 Pave <NA> IR1
## 6 6 50 RL 85 14115 Pave <NA> IR1
## LandContour Utilities LotConfig LandSlope Neighborhood Condition1
## 1 Lvl AllPub Inside Gtl CollgCr Norm
## 2 Lvl AllPub FR2 Gtl Veenker Feedr
## 3 Lvl AllPub Inside Gtl CollgCr Norm
## 4 Lvl AllPub Corner Gtl Crawfor Norm
## 5 Lvl AllPub FR2 Gtl NoRidge Norm
## 6 Lvl AllPub Inside Gtl Mitchel Norm
## Condition2 BldgType HouseStyle OverallQual OverallCond YearBuilt
## 1 Norm 1Fam 2Story 7 5 2003
## 2 Norm 1Fam 1Story 6 8 1976
## 3 Norm 1Fam 2Story 7 5 2001
## 4 Norm 1Fam 2Story 7 5 1915
## 5 Norm 1Fam 2Story 8 5 2000
## 6 Norm 1Fam 1.5Fin 5 5 1993
## YearRemodAdd RoofStyle RoofMatl Exterior1st Exterior2nd MasVnrType
## 1 2003 Gable CompShg VinylSd VinylSd BrkFace
## 2 1976 Gable CompShg MetalSd MetalSd None
## 3 2002 Gable CompShg VinylSd VinylSd BrkFace
## 4 1970 Gable CompShg Wd Sdng Wd Shng None
## 5 2000 Gable CompShg VinylSd VinylSd BrkFace
## 6 1995 Gable CompShg VinylSd VinylSd None
## MasVnrArea ExterQual ExterCond Foundation BsmtQual BsmtCond BsmtExposure
## 1 196 Gd TA PConc Gd TA No
## 2 0 TA TA CBlock Gd TA Gd
## 3 162 Gd TA PConc Gd TA Mn
## 4 0 TA TA BrkTil TA Gd No
## 5 350 Gd TA PConc Gd TA Av
## 6 0 TA TA Wood Gd TA No
## BsmtFinType1 BsmtFinSF1 BsmtFinType2 BsmtFinSF2 BsmtUnfSF TotalBsmtSF
## 1 GLQ 706 Unf 0 150 856
## 2 ALQ 978 Unf 0 284 1262
## 3 GLQ 486 Unf 0 434 920
## 4 ALQ 216 Unf 0 540 756
## 5 GLQ 655 Unf 0 490 1145
## 6 GLQ 732 Unf 0 64 796
## Heating HeatingQC CentralAir Electrical X1stFlrSF X2ndFlrSF LowQualFinSF
## 1 GasA Ex Y SBrkr 856 854 0
## 2 GasA Ex Y SBrkr 1262 0 0
## 3 GasA Ex Y SBrkr 920 866 0
## 4 GasA Gd Y SBrkr 961 756 0
## 5 GasA Ex Y SBrkr 1145 1053 0
## 6 GasA Ex Y SBrkr 796 566 0
## GrLivArea BsmtFullBath BsmtHalfBath FullBath HalfBath BedroomAbvGr
## 1 1710 1 0 2 1 3
## 2 1262 0 1 2 0 3
## 3 1786 1 0 2 1 3
## 4 1717 1 0 1 0 3
## 5 2198 1 0 2 1 4
## 6 1362 1 0 1 1 1
## KitchenAbvGr KitchenQual TotRmsAbvGrd Functional Fireplaces FireplaceQu
## 1 1 Gd 8 Typ 0 <NA>
## 2 1 TA 6 Typ 1 TA
## 3 1 Gd 6 Typ 1 TA
## 4 1 Gd 7 Typ 1 Gd
## 5 1 Gd 9 Typ 1 TA
## 6 1 TA 5 Typ 0 <NA>
## GarageType GarageYrBlt GarageFinish GarageCars GarageArea GarageQual
## 1 Attchd 2003 RFn 2 548 TA
## 2 Attchd 1976 RFn 2 460 TA
## 3 Attchd 2001 RFn 2 608 TA
## 4 Detchd 1998 Unf 3 642 TA
## 5 Attchd 2000 RFn 3 836 TA
## 6 Attchd 1993 Unf 2 480 TA
## GarageCond PavedDrive WoodDeckSF OpenPorchSF EnclosedPorch X3SsnPorch
## 1 TA Y 0 61 0 0
## 2 TA Y 298 0 0 0
## 3 TA Y 0 42 0 0
## 4 TA Y 0 35 272 0
## 5 TA Y 192 84 0 0
## 6 TA Y 40 30 0 320
## ScreenPorch PoolArea PoolQC Fence MiscFeature MiscVal MoSold YrSold
## 1 0 0 <NA> <NA> <NA> 0 2 2008
## 2 0 0 <NA> <NA> <NA> 0 5 2007
## 3 0 0 <NA> <NA> <NA> 0 9 2008
## 4 0 0 <NA> <NA> <NA> 0 2 2006
## 5 0 0 <NA> <NA> <NA> 0 12 2008
## 6 0 0 <NA> MnPrv Shed 700 10 2009
## SaleType SaleCondition SalePrice
## 1 WD Normal 208500
## 2 WD Normal 181500
## 3 WD Normal 223500
## 4 WD Abnorml 140000
## 5 WD Normal 250000
## 6 WD Normal 143000
nrow(missing_row)
## [1] 1460
On a 1460 lignes avec des valeurs manquantes dans notre base de données.
*Cette partie ce décompose en deux étapes : + Étape 1: sélectionnez les variables qui peuvent avoir un impact plus important sur le prix de la maison. + Étape 2: créer un sous-ensemble des données.
Le nom de toutes les varibales contenu dans notre jeu de données est le suivant:
## montrer le nom de tout les variables
var_name <- names(train)
var_name
## [1] "Id" "MSSubClass" "MSZoning" "LotFrontage"
## [5] "LotArea" "Street" "Alley" "LotShape"
## [9] "LandContour" "Utilities" "LotConfig" "LandSlope"
## [13] "Neighborhood" "Condition1" "Condition2" "BldgType"
## [17] "HouseStyle" "OverallQual" "OverallCond" "YearBuilt"
## [21] "YearRemodAdd" "RoofStyle" "RoofMatl" "Exterior1st"
## [25] "Exterior2nd" "MasVnrType" "MasVnrArea" "ExterQual"
## [29] "ExterCond" "Foundation" "BsmtQual" "BsmtCond"
## [33] "BsmtExposure" "BsmtFinType1" "BsmtFinSF1" "BsmtFinType2"
## [37] "BsmtFinSF2" "BsmtUnfSF" "TotalBsmtSF" "Heating"
## [41] "HeatingQC" "CentralAir" "Electrical" "X1stFlrSF"
## [45] "X2ndFlrSF" "LowQualFinSF" "GrLivArea" "BsmtFullBath"
## [49] "BsmtHalfBath" "FullBath" "HalfBath" "BedroomAbvGr"
## [53] "KitchenAbvGr" "KitchenQual" "TotRmsAbvGrd" "Functional"
## [57] "Fireplaces" "FireplaceQu" "GarageType" "GarageYrBlt"
## [61] "GarageFinish" "GarageCars" "GarageArea" "GarageQual"
## [65] "GarageCond" "PavedDrive" "WoodDeckSF" "OpenPorchSF"
## [69] "EnclosedPorch" "X3SsnPorch" "ScreenPorch" "PoolArea"
## [73] "PoolQC" "Fence" "MiscFeature" "MiscVal"
## [77] "MoSold" "YrSold" "SaleType" "SaleCondition"
## [81] "SalePrice"
Pour mieux comprendre ce jeu de données, nous avons résumés toutes les variables importantes en termes de minimum, premier quartile, médiane, moyenne, troisième quantile et valeur maximale. Ce sont ces variables là qu’on va considérer pour notre modèle.
# Ici nous selectinos les variables importante en créant un vecteur conteant le nom de ces variables.
select_var <- c('Id','MSZoning','Utilities', 'Neighborhood','BldgType','HouseStyle',
'OverallQual','OverallCond','YearBuilt', 'ExterQual','ExterCond',
'BsmtQual','BsmtCond','TotalBsmtSF','Heating','HeatingQC',
'CentralAir','Electrical','GrLivArea','BedroomAbvGr','KitchenAbvGr',
'KitchenQual','TotRmsAbvGrd','Functional','Fireplaces','FireplaceQu',
'GarageArea','GarageQual','GarageCond','OpenPorchSF','PoolArea',
'Fence','MoSold','YrSold','SaleType','SaleCondition','SalePrice')
# Cntruction du sous ensemble de notre jeu de donnée qu'on va utiliser pour l'analyse, la modélisation et la prédiction.
select_train <- train[,select_var]
summary(select_train)
## Id MSZoning Utilities Neighborhood BldgType
## Min. : 1.0 C (all): 10 AllPub:1459 NAmes :225 1Fam :1220
## 1st Qu.: 365.8 FV : 65 NoSeWa: 1 CollgCr:150 2fmCon: 31
## Median : 730.5 RH : 16 OldTown:113 Duplex: 52
## Mean : 730.5 RL :1151 Edwards:100 Twnhs : 43
## 3rd Qu.:1095.2 RM : 218 Somerst: 86 TwnhsE: 114
## Max. :1460.0 Gilbert: 79
## (Other):707
## HouseStyle OverallQual OverallCond YearBuilt ExterQual
## 1Story :726 Min. : 1.000 Min. :1.000 Min. :1872 Ex: 52
## 2Story :445 1st Qu.: 5.000 1st Qu.:5.000 1st Qu.:1954 Fa: 14
## 1.5Fin :154 Median : 6.000 Median :5.000 Median :1973 Gd:488
## SLvl : 65 Mean : 6.099 Mean :5.575 Mean :1971 TA:906
## SFoyer : 37 3rd Qu.: 7.000 3rd Qu.:6.000 3rd Qu.:2000
## 1.5Unf : 14 Max. :10.000 Max. :9.000 Max. :2010
## (Other): 19
## ExterCond BsmtQual BsmtCond TotalBsmtSF Heating HeatingQC
## Ex: 3 Ex :121 Fa : 45 Min. : 0.0 Floor: 1 Ex:741
## Fa: 28 Fa : 35 Gd : 65 1st Qu.: 795.8 GasA :1428 Fa: 49
## Gd: 146 Gd :618 Po : 2 Median : 991.5 GasW : 18 Gd:241
## Po: 1 TA :649 TA :1311 Mean :1057.4 Grav : 7 Po: 1
## TA:1282 NA's: 37 NA's: 37 3rd Qu.:1298.2 OthW : 2 TA:428
## Max. :6110.0 Wall : 4
##
## CentralAir Electrical GrLivArea BedroomAbvGr KitchenAbvGr
## N: 95 FuseA: 94 Min. : 334 Min. :0.000 Min. :0.000
## Y:1365 FuseF: 27 1st Qu.:1130 1st Qu.:2.000 1st Qu.:1.000
## FuseP: 3 Median :1464 Median :3.000 Median :1.000
## Mix : 1 Mean :1515 Mean :2.866 Mean :1.047
## SBrkr:1334 3rd Qu.:1777 3rd Qu.:3.000 3rd Qu.:1.000
## NA's : 1 Max. :5642 Max. :8.000 Max. :3.000
##
## KitchenQual TotRmsAbvGrd Functional Fireplaces FireplaceQu
## Ex:100 Min. : 2.000 Maj1: 14 Min. :0.000 Ex : 24
## Fa: 39 1st Qu.: 5.000 Maj2: 5 1st Qu.:0.000 Fa : 33
## Gd:586 Median : 6.000 Min1: 31 Median :1.000 Gd :380
## TA:735 Mean : 6.518 Min2: 34 Mean :0.613 Po : 20
## 3rd Qu.: 7.000 Mod : 15 3rd Qu.:1.000 TA :313
## Max. :14.000 Sev : 1 Max. :3.000 NA's:690
## Typ :1360
## GarageArea GarageQual GarageCond OpenPorchSF
## Min. : 0.0 Ex : 3 Ex : 2 Min. : 0.00
## 1st Qu.: 334.5 Fa : 48 Fa : 35 1st Qu.: 0.00
## Median : 480.0 Gd : 14 Gd : 9 Median : 25.00
## Mean : 473.0 Po : 3 Po : 7 Mean : 46.66
## 3rd Qu.: 576.0 TA :1311 TA :1326 3rd Qu.: 68.00
## Max. :1418.0 NA's: 81 NA's: 81 Max. :547.00
##
## PoolArea Fence MoSold YrSold
## Min. : 0.000 GdPrv: 59 Min. : 1.000 Min. :2006
## 1st Qu.: 0.000 GdWo : 54 1st Qu.: 5.000 1st Qu.:2007
## Median : 0.000 MnPrv: 157 Median : 6.000 Median :2008
## Mean : 2.759 MnWw : 11 Mean : 6.322 Mean :2008
## 3rd Qu.: 0.000 NA's :1179 3rd Qu.: 8.000 3rd Qu.:2009
## Max. :738.000 Max. :12.000 Max. :2010
##
## SaleType SaleCondition SalePrice
## WD :1267 Abnorml: 101 Min. : 34900
## New : 122 AdjLand: 4 1st Qu.:129975
## COD : 43 Alloca : 12 Median :163000
## ConLD : 9 Family : 20 Mean :180921
## ConLI : 5 Normal :1198 3rd Qu.:214000
## ConLw : 5 Partial: 125 Max. :755000
## (Other): 9
???SalePrice??? est notre variable cible et aussi la variable dépendante pour la prédiction. Selon les hypothèses de régression linéaire, les données devraient être normalement distribuées (suivent la loi normale). En vérifiant la distribution de" SalePrice???, nous pouvons décider si nous avons besoin d’une transformation non-linéaire, comme avec la fonction logarithme, pour faire une meilleure prédiction. ##### Statistique déscrptive et distribution de la variable cible:“SalePrice???
summary(select_train$SalePrice)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 34900 129975 163000 180921 214000 755000
# histogramme de la distribution de la varible SalePrice
options(scipen=10000)
ggplot(select_train, aes(x = SalePrice, fill = ..count..)) +
geom_histogram(binwidth = 5000) +
ggtitle("Histograme de SalePrice") +
ylab("Nombre des maisons") +
xlab("prix de la maison") +
theme(plot.title = element_text(hjust = 0.5))
D’après l’histogramme ci-dessus, la distribution de notre variable cible“SalePrice??? est biaisée vers la droite. Ainsi, un terme de journal de”SalePrice??? devrait être généré pour la régression linéaire. Ici, nous l’appelons“lSalePrice???.
#le Log de SalePrice
select_train$lSalePrice <- log(select_train$SalePrice)
# Distribtion du log de SalePrice
ggplot(select_train, aes(x = lSalePrice, fill = ..count..)) +
geom_histogram(binwidth = 0.05) +
ggtitle("Histograme du log de SalePrice") +
ylab("Nombre des maisons") +
xlab("prix de la maison") +
theme(plot.title = element_text(hjust = 0.5))
Après la ransformation,“lSalePrice??? est normalement distribué. Nous utiliserons ce terme de”SalePrice??? plus tard dans les modèles.
Quand il s’agit du prix du logement, la valeur de la maison est généralement liée à deux types d’éléments: interne et externe. Les éléments internes sont les principales caractéristiques de la maison, comme la surface totale, le nombre de chambres. En ce qui concerne les éléments externes, l’environnement est l’un des facteurs clés.
“MSZoning”: Identifie la classification générale de zone de vente.
Par conséquent, dans cette section, nous explorerons la relation entre “MSZoning”" et notre variable cible “SalePrice”.
Tout d’abord, jetons un coup d’oil à “MSZoning” car c’est une variable muette, il nous permettra de connaître le nombre total de maisons dans chaque catégorie.
# Compte des maison par MSZoning
options(repr.plot.width=5, repr.plot.height=4)
ggplot(select_train, aes(x = MSZoning, fill = MSZoning )) +
geom_bar()+
scale_fill_hue(c = 80)+
ggtitle(" Distribution de MSZoning")+
theme(plot.title = element_text(hjust = 0.5),legend.position="right", legend.background = element_rect(fill="grey90",
size=0.5, linetype="solid",
colour ="black"))+
geom_text(stat='count',aes(label=..count..),vjust=-0.25)
# statisques descrptive de MSZoning
table(select_train$MSZoning)
##
## C (all) FV RH RL RM
## 10 65 16 1151 218
D’après le graphique et le tableau ci-dessus, il est évident que la plupart des maisons de ces données sont construites dans la zone de faible densité résidentielle (1151 maisons), et les densités de leurs lois est une densité résidentielle moyenne (218 maisons). Peu de maisons sont construites dans les zones commerciales, flottantes et résidentielles à haute densité.
Étant donné qu’une grande quantité de maisons appartiennent aux catégories de la densité résidentielle et de la densité résidentielle moyenne, ces deux secteurs devraient faire l’objet d’une plus grande attention pour l’analyse du prix du logement.
En plus, ajoutons notre variable cible dans l’analyse. À quoi ressemble-il le prix du logement dans chaque catégorie? Ici, nous utilisons des boite à moustache pour montrer la distribution des prix dans chaque catégorie de la variable“MSZoning???.
# changer la dimension du graphe 9 x 6
options(repr.plot.width=9, repr.plot.height=6)
#Boite à moustache de SalePrice par MSZoning
#ajout de la valeur moyenne de SalePrice comme point rouge
ggplot(select_train, aes(x=MSZoning, y=SalePrice, fill=MSZoning)) +
geom_boxplot(alpha=0.3) +
stat_summary(fun.y=mean, geom="point", shape=20, size=4, color="red", fill="red")+
theme(legend.position="none")+
ggtitle("Boite à moustache de SalePrice par MSZoning")+
theme(plot.title = element_text(hjust = 0.5))
Le graphique ci-dessus montre la distribution de “SalePrice” par “MSZoning”. Les ventes dans la zone “Floating Village Residential” ont le prix de vente moyen le plus élevé, suivies de “Residential Density”“, alors que les ventes”commercial“” ont le prix de vente moyen le plus bas.
Il est assez étrange que la zone commerciale ait le prix de vente moyen le plus bas tandis que la zone du village a le plus haut. Une explication possible pourrait être “SalePrice”" est également liée à la taille des maisons. Pour confirmer, explorons la taille moyenne dans ces domaines.
La variable indique la taille est “GrLivArea” ; laSurface habitable au-dessus du sol.
# Visualisation de la moyenne de taille de masion par MSZoning
library(plyr)
ddply(train, .(MSZoning), summarize, size=mean(GrLivArea))
## MSZoning size
## 1 C (all) 1191.400
## 2 FV 1574.538
## 3 RH 1510.125
## 4 RL 1551.646
## 5 RM 1322.073
Il est évident que la taille moyenne des maisons dans la zone commerciale est beaucoup plus petite que la zone du village, ce qui a confirmé notre hypothèse ci-dessus.
Ensuite, nous allons décrire “SalePrice” par différentes catégories de “BldType” ;“BldgType”: Type de logement . Pour avoir une brève idée de “BldgType”, nous utilisons une table ici pour compter les maisons dans chaque catégorie et également afficher les prix maximum et minimum.
ddply(train, .(BldgType), summarize,Total = length(BldgType),Max_price=max(SalePrice),Min_price=min(SalePrice))
## BldgType Total Max_price Min_price
## 1 1Fam 1220 755000 34900
## 2 2fmCon 31 228950 55000
## 3 Duplex 52 206300 82000
## 4 Twnhs 43 230000 75000
## 5 TwnhsE 114 392500 75500
Précédemment, nous utilisons des boites à moustaches pour décrire “MSZoning”“, tandis que pour”BldgType" nous utiliserons l’histogramme puisque nous nous intéressons plus à la distribution qu’aux nombres récapitulatifs.
Nos réfléxions sur le graphique ci-dessus:
La dernière variable à explorer est “OverallQual”:
“OverallQual” est le montant de destruction de la maison. “OverallQual” est une note dans une échelle de 1 à 10.
ggplot(select_train, aes(x = SalePrice,fill = as.factor(OverallQual))) +
geom_histogram(position = "stack", binwidth = 10000) +
ggtitle("Histograme de SalePrice par OverallQual") +
ylab("Nombre") +
xlab("Prix de la maison") +
scale_fill_discrete(name="OverallQual")+
theme(plot.title = element_text(hjust = 0.5), legend.position=c(0.9,0.7), legend.background = element_rect(fill="grey90",
size=0.5, linetype="solid",
colour ="black"))
Voici la liste que nous choisissons pour une exploration de corrélation :
Afin d’avoir une vision claire de la relation entre les variables clés et“SalePrice???, nous allons utiliser un mélange entre n matrice de corrélation et une carte de chaleur pour tracer la coorélation entre les varibales dont est cella est spérieure à 0.2 ou inférieure a -0.2.
# convertir les fateurs à des nombres
select_train$ExterCond2 <- as.numeric(factor(select_train$ExterCond,
levels = c("Ex", "Fa","Gd", "TA","Po"),
labels = c(5,2,4,3,1) ,ordered = TRUE))
select_train$HeatingQC2 <- as.numeric(factor(select_train$HeatingQC,
levels = c("Ex", "Fa","Gd", "TA","Po"),
labels = c(5,2,4,3,1) ,ordered = TRUE))
select_train$CentralAir2 <- as.numeric(factor(select_train$CentralAir,
levels = c("N", "Y"),
labels = c(0,1) ,ordered = TRUE))
cor_numVar <- cor(heat, use="pairwise.complete.obs")
cor_sorted <- as.matrix(sort(cor_numVar[,'SalePrice'], decreasing = TRUE))
CorHigh <- names(which(apply(cor_sorted, 1, function(x) abs(x)>0.2)))
cor_numVar <- cor_numVar[CorHigh, CorHigh]
corrplot.mixed(cor_numVar, tl.col="black", tl.pos = "lt")
Dans ce graphe, la couleur bleu indique une corrélation positive parfaite, et la couleur rouge indique une corrélation négative parfaite.
Dans cette section, on va analyser la corrélation entre “SalePrice” et les variables numériques :“GrLivArea”“,”TotalBsmtSF“,”TotRmsAbvGrd" et “GarageArea”.
# Nuage de point de GrLiveArea
options(repr.plot.width=9, repr.plot.height=6)
p1 <- ggplot(select_train, aes(x=GrLivArea, y=SalePrice)) +
geom_point(shape=1) +
geom_smooth(method=lm , color="red", se=FALSE)+
ggtitle("Nuage de points de SalePrice et GrLivArea") +
theme(plot.title = element_text(hjust = 0.4))
# Nuage de points de TotalBsmtSF
p2 <- ggplot(select_train, aes(x=TotalBsmtSF, y=SalePrice)) +
geom_point(shape=1) +
geom_smooth(method=lm , color="red", se=FALSE)+
ggtitle("Nuage de points de SalePrice et TotalBsmtSF") +
theme(plot.title = element_text(hjust = 0.4))
#Nuage de points de TotRmsAbvGrd
p3 <- ggplot(select_train, aes(x=TotRmsAbvGrd, y=SalePrice)) +
geom_point(shape=1) +
geom_smooth(method=lm , color="red", se=FALSE)+
ggtitle("Nuage de points de SalePrice et TotRmsAbvGrd") +
theme(plot.title = element_text(hjust = 0.4))
#Nuage de points de GarageArea
p4 <- ggplot(select_train, aes(x=GarageArea, y=SalePrice)) +
geom_point(shape=1) +
geom_smooth(method=lm , color="red", se=FALSE)+
ggtitle("Nuage de points de SalePrice et GarageArea") +
theme(plot.title = element_text(hjust = 0.4))
library(gridExtra)
grid.arrange(p1, p2,p3,p4)
Quelques réflexions sur ces graphes:
“GrLivArea” ,“TotalBsmtSF”,“TotRmsAbvGrd” et“GarageArea” ont une corrélation positive avec et“SalePrice???. Ce qui signifie qu’une augmentation de ces variables augmente le prix des maisons.
“TotalBsmtSF” a une distribution plus concentrée que les autres.
Après l’analyse descriptive, nous passons à la section Analyse prédictive. Le modèle qu’on utilisera ici est le modèle PLS.
Dans ce modèle, nous sélectionnons 16 variables pour s’adapter à ce modèle :
SalePrice, OverallQual, OverallCond, YearBuilt, ExterQual2, ExterCond2, TotalBsmtSF, HeatingQC2, CentralAir2, GrLivArea, BedroomAbvGr, KitchenAbvGr, TotRmsAbvGrd, Fireplaces, GarageArea, OpenPorchSF, PoolArea,YrSold.
library(pls)
## Warning: package 'pls' was built under R version 3.4.4
##
## Attaching package: 'pls'
## The following object is masked from 'package:caret':
##
## R2
## The following object is masked from 'package:corrplot':
##
## corrplot
## The following object is masked from 'package:stats':
##
## loadings
model_lin <- select_train[, model_var]
model_lin$lSalePrice <- log(model_lin$SalePrice)
model1 <- plsr(lSalePrice~.-SalePrice, data = model_lin, ncomp = 15, validation = "LOO")
summary(model1)
## Data: X dimension: 1460 16
## Y dimension: 1460 1
## Fit method: kernelpls
## Number of components considered: 15
##
## VALIDATION: RMSEP
## Cross-validated using 1460 leave-one-out segments.
## (Intercept) 1 comps 2 comps 3 comps 4 comps 5 comps 6 comps
## CV 0.3996 0.2456 0.2352 0.2312 0.2143 0.208 0.1996
## adjCV 0.3996 0.2456 0.2352 0.2312 0.2143 0.208 0.1996
## 7 comps 8 comps 9 comps 10 comps 11 comps 12 comps 13 comps
## CV 0.1707 0.1664 0.1652 0.1649 0.165 0.1648 0.1648
## adjCV 0.1707 0.1664 0.1652 0.1649 0.165 0.1648 0.1648
## 14 comps 15 comps
## CV 0.1647 0.1647
## adjCV 0.1647 0.1647
##
## TRAINING: % variance explained
## 1 comps 2 comps 3 comps 4 comps 5 comps 6 comps 7 comps
## X 69.60 80.14 98.81 99.16 99.70 100.00 100.00
## lSalePrice 63.21 67.03 67.84 73.77 75.39 75.61 83.59
## 8 comps 9 comps 10 comps 11 comps 12 comps 13 comps
## X 100.00 100.00 100.00 100.00 100.00 100.00
## lSalePrice 84.46 84.67 84.73 84.77 84.83 84.85
## 14 comps 15 comps
## X 100.00 100.00
## lSalePrice 84.86 84.86
Le tableau indique que 3 composantes expliquent 88.81% de la variance de X qui est la matrice de nos varibles explicatives séléctionnées et 67.84% de la variance lSalePrice qui notre variable cible. On pourrait considérer que ces 3 premières composantes nous suffisent pour la suite de l’analyse. Une autre façon de mieux décider du nombre de composante à retenir est le graphe RSMEP.
Le RMSEP étant au plus bas avec 7 composantes et ceux pour les 16 variables nous décidons donc de retenir 5 composantes. Par conséquent, les 5 premières composantes nous permettent donc d’expliquer 100% de la variance de X et 83,59% de la variance de lSalePrice.
plot(model1, plottype = "loadings",labels="name")
plot(model1, plottype = "correlation", labels="name")
Le graphe suivant montre les nuages de points de notre population par rapport aux compansantes principale. Ceci peut aider à observer notre jeu donées au cas ou il y un données abbérante.
plot(model1, plottype = "scores", comps = 1:5)
### Prédiction le graphe des valeurs prédites par le modèle de 5 composantes principales contre les vrais valeurs pendant chaque itération de la validation croisée est le sivant :
plot(model1, ncomp = 5, asp = 1, line = TRUE)
plot(model1, plottype = "coef", ncomp=1:5, legendpos = "bottomleft",labels="name")
En théorie, le PLS devrait avoir un avantage sur la PCR. On pourrait imaginer une situation où une composante mineure dans X est fortement corrélée avec Y, ne pas sélectionner assez de composantes conduirait alors à de très mauvaises prédictions. En PLS, une telle composante serait automatiquement présente dans le premier LV. En pratique, cependant, il n’y a pratiquement aucune différence entre l’utilisation du PLS et celle de la PCR, Dans la plupart des cas, les méthodes permettent d’obtenir des précisions de prédiction similaires, bien que le PLS nécessite généralement moins de variables latentes que la PCR. En sens inverse: avec le même nombre de variables latentes, PLS couvrira une plus grande partie de la variation de Y et la PCR couvrira plus de X. À leur tour, les deux se comportent très bien comme une régression de crête (Frank et Friedman 1993).