Prévision météorologique sur la Ville de Tours
Nous étions à la recherche d’un jeu de données de minimum 300 observations et 15 variables quantitatives dont une à expliquer, Nous avions des jeux de données provenant de sondages, mais leurs données étaient qualitative, donc non exploitable dans notre contexte d’étude.
Après recherche, le jeu de données choisis est météorologique, nous souhaitons prévoir la température du lendemain en fonction des autres variables quantitative. Ce jeu de données a été obtenu dans les open data de la ville de Tours, le fichier est trouvable à l’adresse suivante : https://data.tours-metropole.fr/explore/dataset/observation-meteorologique-historiques-tours-synop/export/?sort=date.
# Import de la base de données
On ajoute le paramètre UTF 8 car les noms de variables sont en français.
#Windows only
# data <-
# read.csv("~/PrevisionMeteoTours/observation-meteorologique-historiques-tours-synop.csv",
# encoding="UTF-8",
# sep=";")
#Linux & Windows
data <-
read.csv("observation-meteorologique-historiques-tours-synop.csv",
encoding="UTF-8",
sep=";")
D’après l’hébergeur les paramètres atmosphériques sont mesurés (température, humidité, direction et force du vent, pression atmosphérique…) ou observés (description des nuages, visibilité…) depuis la surface terrestre.
Après lecture de la colonne Date, les données sont collectés de 2010 jusqu’à maintenant, il en résulte 34854 observations.
Nous avons cependant une limite à notre analyse. Puisque l’ensemble de ces observations est tirés d’une seule station d’observation.
Nous supprimons alors les collonnes correspondant à des indications géographiques
#numero de la station météo
data$ID.OMM.station <- NULL
data$ID.OMM.station<- NULL
#coords géographique
data$Coordonnees <- NULL
data$Coordonnees <- NULL
data$Latitude <- NULL
data$Latitude <- NULL
data$Longitude <- NULL
data$Longitude <- NULL
#Nom de la ville et département
data$Nom <- NULL
data$Nom <- NULL
data$communes..code. <- NULL
data$communes..code. <- NULL
data$communes..name. <- NULL
data$communes..name. <- NULL
data$EPCI..name. <- NULL
data$EPCI..name. <- NULL
data$EPCI..code. <- NULL
data$EPCI..code. <- NULL
data$department..name. <- NULL
data$department..name. <- NULL
data$department..code. <- NULL
data$department..code. <- NULL
data$region..name. <- NULL
data$region..name. <- NULL
data$region..code.<- NULL
data$region..code. <- NULL
Les colonnes vides ou constantes sont inutilisables
data$Niveau.baromÃ.trique <- NULL
data$Niveau.barométrique <- NULL
data$TempÃ.rature.minimale.sur.24.heures <- NULL
data$Température.minimale.sur.24.heures...C. <- NULL
data$TempÃ.rature.minimale.sur.24.heures..Â.C. <- NULL
data$MÃ.thode.de.mesure.TempÃ.rature.du.thermomÃ.tre.mouillÃ. <- NULL
data$Méthode.de.mesure.Température.du.thermomètre.mouillé <- NULL
data$TempÃ.rature.du.thermomÃ.tre.mouillÃ. <- NULL
data$Température.du.thermomètre.mouillé <- NULL
data$Hauteur.totale.de.la.couche.de.neige..glace..autre.au.sol <- NULL
data$Hauteur.totale.de.la.couche.de.neige..glace..autre.au.sol <- NULL
data$NÃ.bulositÃ..couche.nuageuse.4 <- NULL
data$Nébulosité.couche.nuageuse.4 <- NULL
data$Hauteur.de.base.4 <- NULL
data$Hauteur.de.base.4 <- NULL
data$TempÃ.rature.minimale.sur.24.heures <- NULL
data$Température.minimale.sur.24.heures <- NULL
data$TempÃ.rature.maximale.sur.24.heures <- NULL
data$Température.maximale.sur.24.heures <- NULL
data$Altitude <- NULL
data$Altitude <- NULL
data$NÃ.bulositÃ..couche.nuageuse.1 <- NULL
data$Nébulosité.couche.nuageuse.1 <- NULL
data$Etat.du.sol <- NULL
data$Etat.du.sol <- NULL
data$Periode.de.mesure.de.la.rafale <- NULL
data$Periode.de.mesure.de.la.rafale <- NULL
data$NÃ.bulositÃ...des.nuages.de.l..Ã.tage.infÃ.rieur <- NULL
data$Nébulosité..des.nuages.de.l..étage.inférieur <- NULL
data$TempÃ.rature.minimale.du.sol.sur.12.heures..en.Â.C. <- NULL
data$Température.minimale.du.sol.sur.12.heures..en..C. <- NULL
Retirons les variables qualitatives.
Type de tendance barométrique et temps présent est mis quali- mi quanti, nous ne les traiterons pas
data$Type.de.tendance.baromÃ.trique <- NULL
data$Type.de.tendance.barométrique <- NULL
data$Temps.prÃ.sent <- NULL
data$Temps.présent <- NULL
data$Temps.prÃ.sent.1 <- NULL
data$Temps.présent.1 <- NULL
data$Temps.passÃ..1 <- NULL
data$Temps.passé.1 <- NULL
data$Temps.passÃ..1.1 <- NULL
data$Temps.passé.1.1 <- NULL
data$Temps.passÃ..2 <- NULL
data$Temps.passé.2 <- NULL
data$Type.de.tendance.baromÃ.trique.1 <- NULL
data$Type.de.tendance.barométrique.1 <- NULL
data$mois_de_l_annee <- NULL
data$mois_de_l_annee <- NULL
Nous n’avons pas supprimé la variable date car elle nous est utile à trier chronologiquement les données.
data <- data[order(as.Date(data$Date)),]
Observons les valeurs manquantes des variables restantes
#1
#sum(is.na(data$Pression.au.niveau.mer))
#2
#sum(is.na(data$Variation.de.pression.en.3.heures))
#3
#sum(is.na(data$Type.de.tendance.baromÃ.trique))
#4
#sum(is.na(data$Direction.du.vent.moyen.10.mn))
#5
#sum(is.na(data$Vitesse.du.vent.moyen.10.mn))
#6
#sum(is.na(data$TempÃ.rature))
#7
#sum(is.na(data$Point.de.rosÃ.e))
#8
#sum(is.na(data$HumiditÃ.))
#9
#sum(is.na(data$VisibilitÃ..horizontale))
#10
#sum(is.na(data$NebulositÃ..totale))
#11
#sum(is.na(data$NÃ.bulositÃ...des.nuages.de.l..Ã.tage.infÃ.rieur))
#12
#sum(is.na(data$Hauteur.de.la.base.des.nuages.de.l.Ã.tage.infÃ.rieur))
#13
#sum(is.na(data$Type.des.nuages.de.l.Ã.tage.infÃ.rieur))
#14
#sum(is.na(data$Type.des.nuages.de.l.Ã.tage.moyen))
#15
#sum(is.na(data$Type.des.nuages.de.l.Ã.tage.supÃ.rieur))
#16
#sum(is.na(data$Pression.station))
#17
#sum(is.na(data$GÃ.opotentiel))
#18
#sum(is.na(data$Variation.de.pression.en.24.heures))
#19
#sum(is.na(data$TempÃ.rature.minimale.sur.12.heures))
#20
#sum(is.na(data$TempÃ.rature.maximale.sur.12.heures))
#21
#sum(is.na(data$TempÃ.rature.minimale.du.sol.sur.12.heures))
#22
#sum(is.na(data$Rafale.sur.les.10.derniÃ.res.minutes))
#23
#sum(is.na(data$Rafales.sur.une.pÃ.riode))
#24
#sum(is.na(data$Periode.de.mesure.de.la.rafale))
#25
#sum(is.na(data$Etat.du.sol))
#26
#sum(is.na(data$Hauteur.de.la.neige.fraÃ.che))
#27
#sum(is.na(data$Periode.de.mesure.de.la.neige.fraiche))
#28
#sum(is.na(data$PrÃ.cipitations.dans.la.derniÃ.re.heure))
#29
#sum(is.na(data$PrÃ.cipitations.dans.les.3.derniÃ.res.heures))
#30
#sum(is.na(data$PrÃ.cipitations.dans.les.6.derniÃ.res.heures))
#31
#sum(is.na(data$PrÃ.cipitations.dans.les.12.derniÃ.res.heures))
#32
#sum(is.na(data$PrÃ.cipitations.dans.les.24.derniÃ.res.heures))
#33
#sum(is.na(data$PhÃ.nomÃ.ne.spÃ.cial.1))
#34
#sum(is.na(data$PhÃ.nomÃ.ne.spÃ.cial.2))
#35
#sum(is.na(data$PhÃ.nomÃ.ne.spÃ.cial.3))
#36
#sum(is.na(data$PhÃ.nomÃ.ne.spÃ.cial.4))
#37
#sum(is.na(data$NÃ.bulositÃ..couche.nuageuse.1))
#38
#sum(is.na(data$Type.nuage.1))
#39
#sum(is.na(data$Hauteur.de.base.1))
#40
#sum(is.na(data$NÃ.bulositÃ..couche.nuageuse.2))
#41
#sum(is.na(data$Type.nuage.2))
#42
#sum(is.na(data$NÃ.bulositÃ..couche.nuageuse.3))
#43
#sum(is.na(data$Type.nuage.3))
#44
#sum(is.na(data$Hauteur.de.base.3))
#45
#sum(is.na(data$Type.nuage.4))
#46
#sum(is.na(data$Temps.prÃ.sent.1))
#47
#sum(is.na(data$TempÃ.rature..Â.C.))
#48
#sum(is.na(data$TempÃ.rature.minimale.sur.12.heures..Â.C.))
#49
#sum(is.na(data$TempÃ.rature.maximale.sur.12.heures..Â.C.))
#50
#sum(is.na(data$TempÃ.rature.maximale.sur.24.heures..Â.C.))
#51
#sum(is.na(data$TempÃ.rature.minimale.du.sol.sur.12.heures..en.Â.C.))
#52
#sum(is.na(data$Altitude))
#53
#sum(is.na(data$mois_de_l_annee))
On en déduit cela
plus 20 000 manquants:Plus de 10 000:
Création d’un jeu de donnée où on supprimme que les plus de 30 000
#data2 <- data
#data2$GÃ.opotentiel <- NULL
#data2$TempÃ.rature.maximale.sur.24.heures..Â.C. <- NULL
#data2$Type.nuage.4 <- NULL
#data2$PhÃ.nomÃ.ne.spÃ.cial.4 <- NULL
#data2$Type.nuage.2 <- NULL
#data2$NÃ.bulositÃ..couche.nuageuse.3 <- NULL
#data2$Type.nuage.3 <- NULL
#data2$Hauteur.de.base.3 <- NULL
#data2$Type.nuage.4 <- NULL
Test des régressions sur cet ensemble : exactement les mêmes résultats.
Suppression des plus de 20 000
data$Type.des.nuages.de.l.Ã.tage.infÃ.rieur <- NULL
data$Type.des.nuages.de.l.étage.inférieur <- NULL
data$Type.des.nuages.de.l.Ã.tage.moyen <- NULL
data$Type.des.nuages.de.l.étage.moyen <- NULL
data$Type.des.nuages.de.l.Ã.tage.supÃ.rieur <- NULL
data$Type.des.nuages.de.l.étage.supérieur <- NULL
data$GÃ.opotentiel <- NULL
data$Géopotentiel <- NULL
data$TempÃ.rature.minimale.sur.12.heures <- NULL
data$Température.minimale.sur.12.heures <- NULL
data$TempÃ.rature.maximale.sur.12.heures <- NULL
data$Température.maximale.sur.12.heures <- NULL
data$Hauteur.de.la.neige.fraÃ.che <- NULL
data$Hauteur.de.la.neige.fraîche <- NULL
data$Periode.de.mesure.de.la.neige.fraiche <- NULL
data$Periode.de.mesure.de.la.neige.fraiche <- NULL
data$PhÃ.nomÃ.ne.spÃ.cial.1 <- NULL
data$Phénomène.spécial.1 <- NULL
data$PhÃ.nomÃ.ne.spÃ.cial.2 <- NULL
data$Phénomène.spécial.2 <- NULL
data$PhÃ.nomÃ.ne.spÃ.cial.3 <- NULL
data$Phénomène.spécial.3 <- NULL
data$PhÃ.nomÃ.ne.spÃ.cial.4 <- NULL
data$Phénomène.spécial.4 <- NULL
data$Type.nuage.1 <- NULL
data$Type.nuage.1 <- NULL
data$Hauteur.de.base.1 <- NULL
data$Hauteur.de.base.1 <- NULL
data$NÃ.bulositÃ..couche.nuageuse.2 <- NULL
data$Nébulosité.couche.nuageuse.2 <- NULL
data$Type.nuage.2 <- NULL
data$Type.nuage.2 <- NULL
data$NÃ.bulositÃ..couche.nuageuse.3 <- NULL
data$Nébulosité.couche.nuageuse.3 <- NULL
data$Type.nuage.3 <- NULL
data$Type.nuage.3 <- NULL
data$Hauteur.de.base.3 <- NULL
data$Hauteur.de.base.3 <- NULL
data$Type.nuage.4 <- NULL
data$Type.nuage.4 <- NULL
data$TempÃ.rature.minimale.sur.12.heures..Â.C. <- NULL
data$Température.minimale.sur.12.heures...C. <- NULL
data$TempÃ.rature.maximale.sur.12.heures..Â.C. <- NULL
data$Température.maximale.sur.12.heures...C. <- NULL
data$TempÃ.rature.maximale.sur.24.heures..Â.C. <- NULL
data$Température.maximale.sur.24.heures...C. <- NULL
Il s’agit d’une conversion de Kelvin en celsius, cette ligne n’a pas d’utilité
data$TempÃ.rature..Â.C. <- NULL
data$Température...C. <- NULL
#data2$TempÃ.rature..Â.C. <- NULL
Nous sommes alors à 22 variables.
Mais combien d’observations si l’on retire les lignes avec des manquants ?
which(is.na(data))
data <- na.omit(data)
#which(is.na(data2))
#data2 <- na.omit(data2)
On créé une colonne DateEnJour afin que chaque jour est son numéro
#library(dplyr)
#df %>%
# slice(which.max(as.Date(data$Date)))
data$jour = format(as.Date(data$Date,format="%Y-%m-%d"), format = "%d")
data$mois = ( format(as.Date(data$Date,format="%Y-%m-%d"), format = "%m"))
data$annee = format(as.Date(data$Date,format="%Y-%m-%d"), format = "%Y")
#multiplieur
#c'était un problème de classe de donnée
#data$trente <- replicate(4965, 30)
#data$troisCent <- replicate(4965, 365)
data$jour <- as.numeric(data$jour)
data$mois <- as.numeric(data$mois)
data$annee <- as.numeric(data$annee)
data$DateEnJour <- data$jour + (30 *data$mois) + ( 365*data$annee)
On ne garde que une observation par jour pour un jeu de prévision en effet le nbre d’observation par jour est irrégulier.
prevision <- do.call(rbind, by(data, list(data$DateEnJour),
FUN=function(x) head(x, 1)))
On supprimme les variables créé et la date
data$Date <- NULL
data$DateEnJour <- NULL
data$annee <- NULL
data$mois <- NULL
data$jour <- NULL
prevision$Date <- NULL
prevision$DateEnJour <- NULL
#prevision$annee <- NULL
#prevision$mois <- NULL
prevision$jour <- NULL
On a pas supprimmer le paramètre mois pour faire un test (en utilisant la statistique de student.)
prevision$mois <- ifelse(prevision$mois < 5 ,"Hiver","Pas Hiver")
Il y a t’il une différence significative de moyenne de température entre les relevés en Hiver et les autres ?
#Welch correction inclus dans la fonction t.test()
# test1<-t.test(TempÃ.rature ~ mois, prevision)
# test1
test1<-t.test(Température ~ mois, prevision)
test1
##
## Welch Two Sample t-test
##
## data: Température by mois
## t = -26.435, df = 1376.9, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Hiver and group Pas Hiver is not equal to 0
## 95 percent confidence interval:
## -6.995227 -6.028752
## sample estimates:
## mean in group Hiver mean in group Pas Hiver
## 281.355 287.867
t est la statistique de student (-26.435) et df est le degré de liberté, la p-value, qui détermine la significativité du test est inférieur à 0.05, on rejette HO : “Les moyennes de températures sont égales” La différence est très significative.
prevision$mois <- NULL
prevision2 <- prevision
prevision$annee <- NULL
Pour le jeu de prévision, nous creons une colonne température mais décaler de 1 jour.
La première méthode utilisé n’était pas correct puisque l’on décalait dans le mauvais sens la colonne avec la méthode lag, puis on supprimait la première observation.
#Mauvaise méthode
#data$TemperatureDecaler <- lag(data$TempÃ.rature)
#on supprimme la première observation
#data = data[-1,]
library(Hmisc)
## Le chargement a nécessité le package : lattice
## Le chargement a nécessité le package : survival
## Le chargement a nécessité le package : Formula
## Le chargement a nécessité le package : ggplot2
##
## Attachement du package : 'Hmisc'
## Les objets suivants sont masqués depuis 'package:base':
##
## format.pval, units
#prevision$Precipitation_Jour_Suivant <- Lag(prevision$PrÃ.cipitations.dans.les.24.derniÃ.res.heures, shift = -1)
prevision$Temperature_Jour_Suivant <- Lag(prevision$Température, shift = -1)
#on supprimme la derniere observation
library(dplyr)
##
## Attachement du package : 'dplyr'
## Les objets suivants sont masqués depuis 'package:Hmisc':
##
## src, summarize
## Les objets suivants sont masqués depuis 'package:stats':
##
## filter, lag
## Les objets suivants sont masqués depuis 'package:base':
##
## intersect, setdiff, setequal, union
prevision = slice(prevision, 1:(n() -1))
#De même on réduit la taille du nbre d'observation de data
data = slice(data, 1:(n() -662))
dim(prevision)
## [1] 1655 22
On a donc 1655 observations de 21 variables, cela est suffisant pour la régression multiple.
Bilan des problèmatiques rencontrés avec le jeu de données et leurs résolutions.
Le nombre de variables est très important, les données qualitatives ou manquantes empêche d’effectuer une régression
Les données manquantes empêche d’effectuer une régression
Si l’on supprimme ces variables, les données seront nulle
Une fois les variables avec des manquants supprimmés, les données restantes n’expliquent rien, la régression associé a un R² proche de 0
Nous souhaitons réaliser une prévision de la température à la prochaine observation, mais cette variables n’est pas présente
Le modèle a un R² proche de 0 car les données ne sont pas ordonnées chronologiquement
Les prédictions donnent de mauvais résultat, car les observations n’ont pas les même écarts temporelles entre elles, en effet certains jours il y a 0 observation, tandis que d’autres il y a 15.
Regardons ce qui caractérise cette base de données, tant au niveau des moyennes, de la variance…
summary(data)
## Pression.au.niveau.mer Variation.de.pression.en.3.heures
## Min. : 97170 Min. :-840.000
## 1st Qu.:100850 1st Qu.: -70.000
## Median :101450 Median : 0.000
## Mean :101361 Mean : 7.747
## 3rd Qu.:102000 3rd Qu.: 80.000
## Max. :104370 Max. :1150.000
## Direction.du.vent.moyen.10.mn Vitesse.du.vent.moyen.10.mn Température
## Min. : 0.0 Min. : 0.000 Min. :269.6
## 1st Qu.:180.0 1st Qu.: 2.500 1st Qu.:281.6
## Median :230.0 Median : 3.700 Median :285.1
## Mean :212.8 Mean : 4.014 Mean :285.6
## 3rd Qu.:270.0 3rd Qu.: 5.200 3rd Qu.:289.6
## Max. :360.0 Max. :15.200 Max. :305.4
## Point.de.rosée Humidité Visibilité.horizontale Nebulosité.totale
## Min. :262.9 Min. : 30.00 Min. : 180 Min. : 10.00
## 1st Qu.:278.9 1st Qu.: 72.00 1st Qu.:15000 1st Qu.: 90.00
## Median :282.1 Median : 84.00 Median :30000 Median :100.00
## Mean :282.1 Mean : 80.55 Mean :31057 Mean : 94.53
## 3rd Qu.:285.6 3rd Qu.: 92.00 3rd Qu.:48905 3rd Qu.:100.00
## Max. :294.2 Max. :100.00 Max. :60000 Max. :100.00
## Hauteur.de.la.base.des.nuages.de.l.étage.inférieur Pression.station
## Min. : 30 Min. : 95860
## 1st Qu.: 450 1st Qu.: 99510
## Median : 800 Median :100120
## Mean :1211 Mean :100020
## 3rd Qu.:1250 3rd Qu.:100650
## Max. :7000 Max. :102950
## Variation.de.pression.en.24.heures Température.minimale.du.sol.sur.12.heures
## Min. :-4410.00 Min. :265.1
## 1st Qu.: -435.00 1st Qu.:278.8
## Median : -30.00 Median :282.1
## Mean : -52.56 Mean :282.6
## 3rd Qu.: 350.00 3rd Qu.:286.6
## Max. : 4070.00 Max. :298.9
## Rafale.sur.les.10.dernières.minutes Rafales.sur.une.période
## Min. : 0.000 Min. : 0.600
## 1st Qu.: 4.000 1st Qu.: 4.950
## Median : 6.000 Median : 7.200
## Mean : 6.567 Mean : 7.687
## 3rd Qu.: 8.500 3rd Qu.: 9.800
## Max. :27.400 Max. :27.400
## Précipitations.dans.la.dernière.heure
## Min. :-0.1000
## 1st Qu.: 0.0000
## Median : 0.0000
## Mean : 0.1502
## 3rd Qu.: 0.0000
## Max. :11.4000
## Précipitations.dans.les.3.dernières.heures
## Min. :-0.1000
## 1st Qu.: 0.0000
## Median : 0.0000
## Mean : 0.4124
## 3rd Qu.: 0.2000
## Max. :26.7000
## Précipitations.dans.les.6.dernières.heures
## Min. :-0.1000
## 1st Qu.: 0.0000
## Median : 0.0000
## Mean : 0.8186
## 3rd Qu.: 0.6000
## Max. :38.5000
## Précipitations.dans.les.12.dernières.heures
## Min. :-0.100
## 1st Qu.: 0.000
## Median : 0.200
## Mean : 1.519
## 3rd Qu.: 1.600
## Max. :38.500
## Précipitations.dans.les.24.dernières.heures Hauteur.de.base.2
## Min. :-0.100 Min. : 150
## 1st Qu.: 0.000 1st Qu.: 840
## Median : 0.800 Median :1410
## Mean : 2.862 Mean :2122
## 3rd Qu.: 3.800 3rd Qu.:2580
## Max. :41.200 Max. :8000
Nos observations sont complètes, et les variables toutes quantitatives, nous pouvons commencer la régression multiple.
Nous n’avons pas importer en UTF-8 pour économiser de la place, donnons des labels corrects aux colonnes que nous allons utiliser.
#labels <- c(
# "Pression_Mer",
# "Variation_Pression_3h",
# "Direction_vent",
# "Vitesse_vent",
# "Temperature",
# "Point_de_rosee",
# "Humidite",
# "Visibilite_horizontale",
# "Nebulosite_total",
# "Hauteur_Base_Nuage_Inferieur",
# "Pression_Station",
# "Variation_Pression",
# "Temperature_minimale_sol",
# "Rafales",
# "Rafales_total",
# "Precipitation_1h",
# "Precipitation_3h",
# "Precipitation_6h",
# "Precipitation_12h",
# "Precipitation_24h",
# "Hauteur_Base_Nuage_Superieur"
# "Precipitation_Jour_Suivant"
# )
#names(data) <- labels
#label <- c(
# "Pression_Mer",
# "Variation_Pression_3h",
# "Direction_vent",
# "Vitesse_vent",
# "Temperature",
# "Point_de_rosee",
# "Humidite",
# "Visibilite_horizontale",
# "Nebulosite_total",
# "Hauteur_Base_Nuage_Inferieur",
# "Pression_Station",
# "Variation_Pression",
# "Temperature_minimale_sol",
# "Rafales",
# "Rafales_total",
# "Precipitation_1h",
# "Precipitation_3h",
# "Precipitation_6h",
# "Precipitation_12h",
# "Precipitation_24h",
# "Hauteur_Base_Nuage_Superieur",
# "Precipitation_Jour_Suivant"
# )
#names(prevision) <- label
#Avoir toujours les mêmes résultats
# set.seed(1234)
#
# #on sélectionne 20% des lignes
# nb_lignes <- sample(1:nrow(prevision), nrow(prevision)*0.20)
# testing <- prevision[nb_lignes,]
# prevision <- prevision[-nb_lignes,]
Notre jeu de donnée pour la regression linéaire est prêt.
## Régression multiple avec toutes les variables explicatives
Nous allons effectuer plusieurs régressions pour essayer d’expliquer la température en fonction des autres variables explicatives.
Nous allons utiliser le R² pour comparer les différentes régressions. Cette mesure indique la proportion de la variance expliquée par le modèle.
Tests de regression sur notre jeu complet.
#reg.mul <- lm(Pression.au.niveau.mer~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(Variation.de.pression.en.3.heures~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(Direction.du.vent.moyen.10.mn~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(Vitesse.du.vent.moyen.10.mn~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(Point.de.rosÃ.e~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(HumiditÃ.~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(VisibilitÃ..horizontale~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(NebulositÃ..totale~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(Hauteur.de.la.base.des.nuages.de.l.Ã.tage.infÃ.rieur~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(Pression.station~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(Variation.de.pression.en.24.heures~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(TempÃ.rature.minimale.du.sol.sur.12.heures~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(Rafale.sur.les.10.derniÃ.res.minutes~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(Rafales.sur.une.pÃ.riode~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(PrÃ.cipitations.dans.la.derniÃ.re.heure~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(PrÃ.cipitations.dans.les.3.derniÃ.res.heures~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(PrÃ.cipitations.dans.les.6.derniÃ.res.heures~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(PrÃ.cipitations.dans.les.12.derniÃ.res.heures~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(PrÃ.cipitations.dans.les.24.derniÃ.res.heures~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(Hauteur.de.base.2~.,data)
#shapiro.test(reg.mul$residuals)
#reg.mul <- lm(TempÃ.rature~.,data)
#shapiro.test(reg.mul$residuals)
Toutes les régressions testés affichent des résidus non gaussiens. Ceci n’est pas surprenant dans la mesure où nous avons 5000 observations.
Regression avec toutes les variables en testant la normalité des résidus.
reg.mul <- lm(Temperature_Jour_Suivant ~.,prevision)
shapiro.test(reg.mul$residuals)
##
## Shapiro-Wilk normality test
##
## data: reg.mul$residuals
## W = 0.99324, p-value = 7.097e-07
On test Ho : “tt les Ɛi suivent N(0,1)” Ici la p-value est inferieur à 5% donc on rejette H0, d’après le test les Ɛi ne suivent pas des lois normales (résidus non gaussiens).
Visualisons les résidus par un histogramme
hist(reg.mul$residuals)
#hist(reg.mul.prevision$residuals)
On réalise l’histogramme des résidus, ils ont la forme d’une Gaussienne.
Donc les résidus semblent suivre une loi gaussienne.
Le test shapiro affiche des résidus non gaussiens, mais ceci peut être expliqué par notre grand nombre d’observations. Cette hypothèse se confirmera lorsqu’on regarde l’histogramme des résidus.
Ainsi nos tests de Fisher et student seront valables.
Quels options sont possibles lorsque notre régression est mauvaise ?
Premièrement, on vérifie par un test de Fisher que le modèle est valide.
Deuxièmement,on peut ajouter la constante au modèle de regression ou d’autres variables explicatives afin de réduire les résidus.
D’autres options sont possibles : une selection de variables (forward ou backward selection), imposer des contraintes au vecteur de régression (cf Lasso ou Ridge), réaliser une régression sur les composantes principales (ACP : variables non correlés)
Continuons avec la régression multiple sur notre jeu de données.
Résultat de la regression
summary(reg.mul)
##
## Call:
## lm(formula = Temperature_Jour_Suivant ~ ., data = prevision)
##
## Residuals:
## Min 1Q Median 3Q Max
## -13.0470 -2.3822 -0.1275 2.1315 15.1428
##
## Coefficients:
## Estimate Std. Error
## (Intercept) 4.105e+01 4.527e+01
## Pression.au.niveau.mer -2.950e-02 2.976e-02
## Variation.de.pression.en.3.heures -1.155e-03 7.971e-04
## Direction.du.vent.moyen.10.mn -1.708e-03 1.023e-03
## Vitesse.du.vent.moyen.10.mn 1.600e-01 2.104e-01
## Température 2.475e-01 2.186e-01
## Point.de.rosée 1.587e-01 1.925e-01
## Humidité -1.060e-03 4.239e-02
## Visibilité.horizontale 1.004e-05 5.755e-06
## Nebulosité.totale -8.656e-03 8.563e-03
## Hauteur.de.la.base.des.nuages.de.l.étage.inférieur 6.003e-05 1.085e-04
## Pression.station 3.026e-02 3.016e-02
## Variation.de.pression.en.24.heures 4.937e-04 1.665e-04
## Température.minimale.du.sol.sur.12.heures 3.334e-01 3.816e-02
## Rafale.sur.les.10.dernières.minutes -4.767e-02 1.395e-01
## Rafales.sur.une.période -1.467e-01 7.146e-02
## Précipitations.dans.la.dernière.heure 9.053e-02 2.377e-01
## Précipitations.dans.les.3.dernières.heures -1.441e-02 1.957e-01
## Précipitations.dans.les.6.dernières.heures 1.876e-02 1.181e-01
## Précipitations.dans.les.12.dernières.heures -7.490e-03 7.312e-02
## Précipitations.dans.les.24.dernières.heures 8.592e-03 3.331e-02
## Hauteur.de.base.2 2.138e-04 7.763e-05
## t value Pr(>|t|)
## (Intercept) 0.907 0.36468
## Pression.au.niveau.mer -0.991 0.32161
## Variation.de.pression.en.3.heures -1.449 0.14766
## Direction.du.vent.moyen.10.mn -1.670 0.09519 .
## Vitesse.du.vent.moyen.10.mn 0.760 0.44709
## Température 1.132 0.25778
## Point.de.rosée 0.824 0.41000
## Humidité -0.025 0.98006
## Visibilité.horizontale 1.745 0.08114 .
## Nebulosité.totale -1.011 0.31222
## Hauteur.de.la.base.des.nuages.de.l.étage.inférieur 0.553 0.58006
## Pression.station 1.003 0.31587
## Variation.de.pression.en.24.heures 2.966 0.00306 **
## Température.minimale.du.sol.sur.12.heures 8.737 < 2e-16 ***
## Rafale.sur.les.10.dernières.minutes -0.342 0.73266
## Rafales.sur.une.période -2.053 0.04021 *
## Précipitations.dans.la.dernière.heure 0.381 0.70336
## Précipitations.dans.les.3.dernières.heures -0.074 0.94130
## Précipitations.dans.les.6.dernières.heures 0.159 0.87388
## Précipitations.dans.les.12.dernières.heures -0.102 0.91842
## Précipitations.dans.les.24.dernières.heures 0.258 0.79648
## Hauteur.de.base.2 2.754 0.00595 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.515 on 1633 degrees of freedom
## Multiple R-squared: 0.6694, Adjusted R-squared: 0.6651
## F-statistic: 157.5 on 21 and 1633 DF, p-value: < 2.2e-16
#summary(reg.mul.prevision)
La moyenne des résidus n’est pas affiché car elle est de 0 (ils sont gaussiens).
La colonne Estimate correspond à notre vecteur des Bêta chapeau (notre estimateur de Bêta).
Pour tester leur significativité on regarde les test de student, les t value sont les statistiques de student, si la p-value < 0.05 on rejette H0. Avec H0 : “Bi = 0” > Pour tout i appartenant à (1..21)
Il nous est indiqué que 5 variables sont significatives, il y en a peu car les variables doivent être très corréllés.
Attention, Nous ne pouvons écrire que Temperature du jour suivant = 40 + TempÃ.rature.minimale.du.sol.sur.12.heures * 3.3 + Variation.de.pression.en.24.heures * 5 , il faut refaire le modèle avec uniquement ces variables.
Un R² de 0.67 est trouvé et le R²ajusté = 0.67 également. On test la validité du R² avec un test de fisher (f calculté = 104.6), la p_value est < 0.05 on rejette H0.
Pour rappel : - R² = SCE / SCT - R²ajusté = 1 - ( SCR / (n-p-1) ) / ( SCE / (n-p) )
D’où 57% de la variabilité est expliquée par le modèle de regréssion.
Pour comparer nos régressions,nous utiliserons le R² ajusté.
Réalisons les intervalles de confiance à 95%.
confint(reg.mul)
## 2.5 % 97.5 %
## (Intercept) -4.774731e+01 1.298462e+02
## Pression.au.niveau.mer -8.787545e-02 2.886555e-02
## Variation.de.pression.en.3.heures -2.717965e-03 4.087969e-04
## Direction.du.vent.moyen.10.mn -3.715073e-03 2.985685e-04
## Vitesse.du.vent.moyen.10.mn -2.527253e-01 5.727759e-01
## Température -1.812935e-01 6.762108e-01
## Point.de.rosée -2.189583e-01 5.362818e-01
## Humidité -8.420298e-02 8.208397e-02
## Visibilité.horizontale -1.244294e-06 2.132977e-05
## Nebulosité.totale -2.545085e-02 8.138952e-03
## Hauteur.de.la.base.des.nuages.de.l.étage.inférieur -1.527301e-04 2.727909e-04
## Pression.station -2.889892e-02 8.942090e-02
## Variation.de.pression.en.24.heures 1.671774e-04 8.202668e-04
## Température.minimale.du.sol.sur.12.heures 2.585931e-01 4.083004e-01
## Rafale.sur.les.10.dernières.minutes -3.213231e-01 2.259884e-01
## Rafales.sur.une.période -2.868969e-01 -6.558577e-03
## Précipitations.dans.la.dernière.heure -3.757159e-01 5.567828e-01
## Précipitations.dans.les.3.dernières.heures -3.982950e-01 3.694668e-01
## Précipitations.dans.les.6.dernières.heures -2.129717e-01 2.504835e-01
## Précipitations.dans.les.12.dernières.heures -1.509038e-01 1.359237e-01
## Précipitations.dans.les.24.dernières.heures -5.673918e-02 7.392297e-02
## Hauteur.de.base.2 6.153153e-05 3.660643e-04
#confint(reg.mul.prevision)
Ainsi sur un échantillon de mesures météorologiques de 100 individus, 95 seront dans ces valeurs.
Test d’une Regression sans la Constante :
reg.mulSansC <- lm(Temperature_Jour_Suivant~.-1,prevision)
shapiro.test(reg.mulSansC$residuals)
##
## Shapiro-Wilk normality test
##
## data: reg.mulSansC$residuals
## W = 0.9933, p-value = 7.902e-07
summary(reg.mulSansC)
##
## Call:
## lm(formula = Temperature_Jour_Suivant ~ . - 1, data = prevision)
##
## Residuals:
## Min 1Q Median 3Q Max
## -13.0679 -2.3498 -0.1135 2.1267 15.0405
##
## Coefficients:
## Estimate Std. Error
## Pression.au.niveau.mer -3.817e-03 9.111e-03
## Variation.de.pression.en.3.heures -1.161e-03 7.970e-04
## Direction.du.vent.moyen.10.mn -1.712e-03 1.023e-03
## Vitesse.du.vent.moyen.10.mn 1.640e-01 2.104e-01
## Température 3.627e-01 1.778e-01
## Point.de.rosée 1.766e-01 1.915e-01
## Humidité -1.540e-03 4.238e-02
## Visibilité.horizontale 1.024e-05 5.750e-06
## Nebulosité.totale -8.513e-03 8.561e-03
## Hauteur.de.la.base.des.nuages.de.l.étage.inférieur 5.760e-05 1.084e-04
## Pression.station 4.257e-03 9.341e-03
## Variation.de.pression.en.24.heures 4.861e-04 1.663e-04
## Température.minimale.du.sol.sur.12.heures 3.343e-01 3.815e-02
## Rafale.sur.les.10.dernières.minutes -5.016e-02 1.395e-01
## Rafales.sur.une.période -1.432e-01 7.135e-02
## Précipitations.dans.la.dernière.heure 8.498e-02 2.376e-01
## Précipitations.dans.les.3.dernières.heures -5.469e-03 1.955e-01
## Précipitations.dans.les.6.dernières.heures 1.631e-02 1.181e-01
## Précipitations.dans.les.12.dernières.heures -6.704e-03 7.311e-02
## Précipitations.dans.les.24.dernières.heures 1.030e-02 3.325e-02
## Hauteur.de.base.2 2.165e-04 7.757e-05
## t value Pr(>|t|)
## Pression.au.niveau.mer -0.419 0.67532
## Variation.de.pression.en.3.heures -1.457 0.14541
## Direction.du.vent.moyen.10.mn -1.673 0.09443 .
## Vitesse.du.vent.moyen.10.mn 0.779 0.43590
## Température 2.039 0.04157 *
## Point.de.rosée 0.922 0.35659
## Humidité -0.036 0.97103
## Visibilité.horizontale 1.781 0.07512 .
## Nebulosité.totale -0.994 0.32018
## Hauteur.de.la.base.des.nuages.de.l.étage.inférieur 0.531 0.59534
## Pression.station 0.456 0.64864
## Variation.de.pression.en.24.heures 2.924 0.00351 **
## Température.minimale.du.sol.sur.12.heures 8.764 < 2e-16 ***
## Rafale.sur.les.10.dernières.minutes -0.360 0.71918
## Rafales.sur.une.période -2.007 0.04489 *
## Précipitations.dans.la.dernière.heure 0.358 0.72066
## Précipitations.dans.les.3.dernières.heures -0.028 0.97768
## Précipitations.dans.les.6.dernières.heures 0.138 0.89016
## Précipitations.dans.les.12.dernières.heures -0.092 0.92695
## Précipitations.dans.les.24.dernières.heures 0.310 0.75681
## Hauteur.de.base.2 2.791 0.00532 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.515 on 1634 degrees of freedom
## Multiple R-squared: 0.9999, Adjusted R-squared: 0.9998
## F-statistic: 5.212e+05 on 21 and 1634 DF, p-value: < 2.2e-16
Le test de shapiro donne des résidus non gaussiens (sans surprise).
On trouve un R² d’environ 1, ce qui est normal.
On refait une régression avec les variables significatives de reg.mul et la constante
reg.mulfin <- lm(Temperature_Jour_Suivant~Variation.de.pression.en.24.heures +
Hauteur.de.base.2 +
Température.minimale.du.sol.sur.12.heures,
# TempÃ.rature.minimale.du.sol.sur.12.heures ,
prevision
)
summary(reg.mulfin)
##
## Call:
## lm(formula = Temperature_Jour_Suivant ~ Variation.de.pression.en.24.heures +
## Hauteur.de.base.2 + Température.minimale.du.sol.sur.12.heures,
## data = prevision)
##
## Residuals:
## Min 1Q Median 3Q Max
## -12.9386 -2.4950 -0.1546 2.3365 15.6666
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.079e+01 4.887e+00 10.393 < 2e-16
## Variation.de.pression.en.24.heures 7.263e-04 1.456e-04 4.988 6.74e-07
## Hauteur.de.base.2 3.578e-04 4.638e-05 7.714 2.09e-14
## Température.minimale.du.sol.sur.12.heures 8.284e-01 1.733e-02 47.795 < 2e-16
##
## (Intercept) ***
## Variation.de.pression.en.24.heures ***
## Hauteur.de.base.2 ***
## Température.minimale.du.sol.sur.12.heures ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.832 on 1651 degrees of freedom
## Multiple R-squared: 0.6029, Adjusted R-squared: 0.6022
## F-statistic: 835.5 on 3 and 1651 DF, p-value: < 2.2e-16
On trouve un R² de 0.60 et le R² ajusté également.
Touts les paramètres sont significatifs.
shapiro.test(reg.mulfin$residuals)
##
## Shapiro-Wilk normality test
##
## data: reg.mulfin$residuals
## W = 0.99068, p-value = 8.87e-09
### Matrice des corrélations des variables explicative
Corrélation entre toutes les variables
#correlation
mcor <- cor(prevision)
#Les Correlations sans visualisation graphique.
mcor
Visualisation graphique des correlations.
#
library(corrplot)
## Warning: le package 'corrplot' a été compilé avec la version R 4.1.2
## corrplot 0.92 loaded
corrplot(mcor,type="upper",
order="hclust",
tl.col="black",
tl.srt=45,
col = NULL,
tl.pos='n'
)
La matricé était symétrique, on ne garde que le triangle supérieur.
Bleu foncé > corrélation positive forte. Rouge foncé > corrélation négative forte.
On remarque que des groupes entre variables de memes unités se forme tel vitesse du vent avec les données sur les rafales.
Les corrélations les plus importantes sont celles avec Temperature du jour suivant qui est fortement correlées à 3 autres variables.
A noter que nos variables ont des fortes corrélations, nous verrons cet impact avec la régression sur ACP.
On représentation des résidus, on ne doit pas dépasser 5%.
res.m <- rstudent(reg.mulfin)
plot(res.m, pch=20,cex=1, ylab = "Residus", main="",ylim=c(-4,+4))
lines(x=c(-2,0,2),y=c(2,1,2))
Tentons d’obtenir une régression exploitable.
### Ascendant
On commence par une régression à une seule variable
reg1 <- lm(Temperature_Jour_Suivant~1,prevision)
reg1
##
## Call:
## lm(formula = Temperature_Jour_Suivant ~ 1, data = prevision)
##
## Coefficients:
## (Intercept)
## 285.8
En simplifiant la formule de la régression à une seule variable, il ne reste plus que y(barre), càd la moyenne.
Voyons quelle variable pouvons nous ajouter à cette régression. On effectue un test de Fisher
add1(reg1, scope =~Pression.au.niveau.mer +
Variation.de.pression.en.3.heures +
Direction.du.vent.moyen.10.mn +
Vitesse.du.vent.moyen.10.mn +
# Point.de.rosÃ.e +
# HumiditÃ. +
# VisibilitÃ..horizontale +
# NebulositÃ..totale +
# Hauteur.de.la.base.des.nuages.de.l.Ã.tage.infÃ.rieur+
Point.de.rosée+
Humidité+
Visibilité.horizontale+
Nebulosité.totale+
Hauteur.de.la.base.des.nuages.de.l.étage.inférieur+
Température.minimale.du.sol.sur.12.heures+
Rafale.sur.les.10.dernières.minutes+
Précipitations.dans.les.3.dernières.heures+
Précipitations.dans.les.6.dernières.heures+
Précipitations.dans.les.12.dernières.heures+
Précipitations.dans.les.24.dernières.heures+
Température+
Pression.station +
Variation.de.pression.en.24.heures +
# TempÃ.rature.minimale.du.sol.sur.12.heures +
# Rafale.sur.les.10.derniÃ.res.minutes +
# Rafales.sur.une.pÃ.riode+
# PrÃ.cipitations.dans.la.derniÃ.re.heure +
# PrÃ.cipitations.dans.les.3.derniÃ.res.heures+
# PrÃ.cipitations.dans.les.6.derniÃ.res.heures +
# PrÃ.cipitations.dans.les.12.derniÃ.res.heures +
# PrÃ.cipitations.dans.les.24.derniÃ.res.heures+
Hauteur.de.base.2
# TempÃ.rature
, test="F" )
## Single term additions
##
## Model:
## Temperature_Jour_Suivant ~ 1
## Df Sum of Sq RSS AIC
## <none> 61043 5972.9
## Pression.au.niveau.mer 1 338 60705 5965.7
## Variation.de.pression.en.3.heures 1 1 61041 5974.8
## Direction.du.vent.moyen.10.mn 1 294 60749 5966.9
## Vitesse.du.vent.moyen.10.mn 1 990 60053 5947.8
## Point.de.rosée 1 32236 28806 4732.0
## Humidité 1 6429 54613 5790.7
## Visibilité.horizontale 1 3271 57772 5883.7
## Nebulosité.totale 1 1680 59363 5928.7
## Hauteur.de.la.base.des.nuages.de.l.étage.inférieur 1 2032 59011 5918.8
## Température.minimale.du.sol.sur.12.heures 1 35572 25470 4528.3
## Rafale.sur.les.10.dernières.minutes 1 781 60262 5953.6
## Précipitations.dans.les.3.dernières.heures 1 35 61008 5973.9
## Précipitations.dans.les.6.dernières.heures 1 130 60913 5971.3
## Précipitations.dans.les.12.dernières.heures 1 297 60745 5966.8
## Précipitations.dans.les.24.dernières.heures 1 392 60651 5964.2
## Température 1 36690 24353 4454.0
## Pression.station 1 623 60420 5957.9
## Variation.de.pression.en.24.heures 1 33 61009 5974.0
## Hauteur.de.base.2 1 3214 57828 5885.3
## F value Pr(>F)
## <none>
## Pression.au.niveau.mer 9.1989 0.002459 **
## Variation.de.pression.en.3.heures 0.0342 0.853387
## Direction.du.vent.moyen.10.mn 7.9983 0.004738 **
## Vitesse.du.vent.moyen.10.mn 27.2496 2.014e-07 ***
## Point.de.rosée 1849.8304 < 2.2e-16 ***
## Humidité 194.5943 < 2.2e-16 ***
## Visibilité.horizontale 93.5965 < 2.2e-16 ***
## Nebulosité.totale 46.7708 1.119e-11 ***
## Hauteur.de.la.base.des.nuages.de.l.étage.inférieur 56.9183 7.459e-14 ***
## Température.minimale.du.sol.sur.12.heures 2308.6311 < 2.2e-16 ***
## Rafale.sur.les.10.dernières.minutes 21.4153 3.986e-06 ***
## Précipitations.dans.les.3.dernières.heures 0.9419 0.331942
## Précipitations.dans.les.6.dernières.heures 3.5283 0.060507 .
## Précipitations.dans.les.12.dernières.heures 8.0947 0.004494 **
## Précipitations.dans.les.24.dernières.heures 10.6823 0.001104 **
## Température 2490.4048 < 2.2e-16 ***
## Pression.station 17.0354 3.852e-05 ***
## Variation.de.pression.en.24.heures 0.8996 0.343017
## Hauteur.de.base.2 91.8777 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
On remarque avec les différentes p-values que de nombreuses variables sont éligibles à la rentrée dans le modèle.
La F value nous indique si l’augmentation du R² est significative. Par exemple, pour la variable “Pression.au.niveau.mer”, l’hypothèse H0 est “Bêta^Pression.au.niveau.mer = 0” On rejette cette hypothèse si la p-value est inférieur à 0.05, Donc Bêta^Pression.au.niveau.mer est significatif.
Si cela est significatif on peut introduire la variable dans le modèle.
On remarque que plusieurs variables affiche une pvalue de 2.2e-16 , càd le nbre le plus bas affichable par R.
On départage ces variables en prenant en compte la F value.
On prend la f-value la plus grande,, ce n’est pas préciser mais il semble qu’il s’agisse du coefficient corrigé (lorsque n/k > 40) cela permet de maximiser la qualité de l’ajustement en pénalisant l’over-fitting.
résumé over fitting : très peu voir aucune erreurs sur notre jeu d’entrainement mais beaucoup d’erreurs avec un jeu de test.
Température a la F value la plus forte, sa pvalue permet de rejeter H0 On créé un nouveau modèle avec cette variable ajouter.
On introduit les variables jusqu’à qu’aucune n’ai une augmentation du R² significative lors de son introduction dans le modèle.
add1(update(reg1,~.+Température
+Température.minimale.du.sol.sur.12.heures
+Rafale.sur.les.10.dernières.minutes
+Hauteur.de.base.2
+Pression.station
+Point.de.rosée
+Variation.de.pression.en.24.heures
+Rafales.sur.une.période),
scope =~Pression.au.niveau.mer +
Variation.de.pression.en.3.heures +
Direction.du.vent.moyen.10.mn +
Vitesse.du.vent.moyen.10.mn +
# Point.de.rosÃ.e +
# HumiditÃ. +
# VisibilitÃ..horizontale +
# NebulositÃ..totale +
# Hauteur.de.la.base.des.nuages.de.l.Ã.tage.infÃ.rieur+
Point.de.rosée+
Humidité+
Visibilité.horizontale+
Nebulosité.totale+
Hauteur.de.la.base.des.nuages.de.l.étage.inférieur+
Température.minimale.du.sol.sur.12.heures+
Rafale.sur.les.10.dernières.minutes+
Précipitations.dans.les.3.dernières.heures+
Précipitations.dans.les.6.dernières.heures+
Précipitations.dans.les.12.dernières.heures+
Précipitations.dans.les.24.dernières.heures+
Température+
Rafales.sur.une.période+
Pression.station +
Variation.de.pression.en.24.heures +
# TempÃ.rature.minimale.du.sol.sur.12.heures +
# Rafale.sur.les.10.derniÃ.res.minutes +
# Rafales.sur.une.pÃ.riode+
# PrÃ.cipitations.dans.la.derniÃ.re.heure +
# PrÃ.cipitations.dans.les.3.derniÃ.res.heures+
# PrÃ.cipitations.dans.les.6.derniÃ.res.heures +
# PrÃ.cipitations.dans.les.12.derniÃ.res.heures +
# PrÃ.cipitations.dans.les.24.derniÃ.res.heures+
Hauteur.de.base.2
# TempÃ.rature
, test="F" )
add1(update(reg1,~.+Température
+Température.minimale.du.sol.sur.12.heures
+Rafale.sur.les.10.dernières.minutes
+Hauteur.de.base.2
+Pression.station
+Point.de.rosée
+Variation.de.pression.en.24.heures
+Rafales.sur.une.période
+Variation.de.pression.en.3.heures),
scope =~Pression.au.niveau.mer +
Variation.de.pression.en.3.heures +
Direction.du.vent.moyen.10.mn +
Vitesse.du.vent.moyen.10.mn +
# Point.de.rosÃ.e +
# HumiditÃ. +
# VisibilitÃ..horizontale +
# NebulositÃ..totale +
# Hauteur.de.la.base.des.nuages.de.l.Ã.tage.infÃ.rieur+
Point.de.rosée+
Humidité+
Visibilité.horizontale+
Nebulosité.totale+
Hauteur.de.la.base.des.nuages.de.l.étage.inférieur+
Température.minimale.du.sol.sur.12.heures+
Rafale.sur.les.10.dernières.minutes+
Précipitations.dans.les.3.dernières.heures+
Précipitations.dans.les.6.dernières.heures+
Précipitations.dans.les.12.dernières.heures+
Précipitations.dans.les.24.dernières.heures+
Température+
Rafales.sur.une.période+
Pression.station +
Variation.de.pression.en.24.heures +
# TempÃ.rature.minimale.du.sol.sur.12.heures +
# Rafale.sur.les.10.derniÃ.res.minutes +
# Rafales.sur.une.pÃ.riode+
# PrÃ.cipitations.dans.la.derniÃ.re.heure +
# PrÃ.cipitations.dans.les.3.derniÃ.res.heures+
# PrÃ.cipitations.dans.les.6.derniÃ.res.heures +
# PrÃ.cipitations.dans.les.12.derniÃ.res.heures +
# PrÃ.cipitations.dans.les.24.derniÃ.res.heures+
Hauteur.de.base.2
# TempÃ.rature
, test="F" )
Aucune variable à introduire, on arrête notre forward selection ici.
Modele de la forward regression
reg.mul.forward <- lm(Temperature_Jour_Suivant~Température
+Température.minimale.du.sol.sur.12.heures
+Rafale.sur.les.10.dernières.minutes
+Hauteur.de.base.2
+Pression.station
+Point.de.rosée
+Variation.de.pression.en.24.heures
+Rafales.sur.une.période
+Variation.de.pression.en.3.heures
,
prevision
)
summary(reg.mul.forward)
##
## Call:
## lm(formula = Temperature_Jour_Suivant ~ Température + Température.minimale.du.sol.sur.12.heures +
## Rafale.sur.les.10.dernières.minutes + Hauteur.de.base.2 +
## Pression.station + Point.de.rosée + Variation.de.pression.en.24.heures +
## Rafales.sur.une.période + Variation.de.pression.en.3.heures,
## data = prevision)
##
## Residuals:
## Min 1Q Median 3Q Max
## -13.1638 -2.3741 -0.1582 2.1165 15.3027
##
## Coefficients:
## Estimate Std. Error t value
## (Intercept) 2.454e+00 1.265e+01 0.194
## Température 4.070e-01 3.100e-02 13.129
## Température.minimale.du.sol.sur.12.heures 3.348e-01 3.771e-02 8.877
## Rafale.sur.les.10.dernières.minutes 2.627e-02 7.326e-02 0.359
## Hauteur.de.base.2 2.798e-04 4.671e-05 5.990
## Pression.station 3.040e-04 1.145e-04 2.655
## Point.de.rosée 1.491e-01 4.281e-02 3.483
## Variation.de.pression.en.24.heures 5.048e-04 1.600e-04 3.154
## Rafales.sur.une.période -1.259e-01 6.882e-02 -1.829
## Variation.de.pression.en.3.heures -1.350e-03 7.617e-04 -1.772
## Pr(>|t|)
## (Intercept) 0.846270
## Température < 2e-16 ***
## Température.minimale.du.sol.sur.12.heures < 2e-16 ***
## Rafale.sur.les.10.dernières.minutes 0.719921
## Hauteur.de.base.2 2.57e-09 ***
## Pression.station 0.008015 **
## Point.de.rosée 0.000509 ***
## Variation.de.pression.en.24.heures 0.001639 **
## Rafales.sur.une.période 0.067531 .
## Variation.de.pression.en.3.heures 0.076598 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.511 on 1645 degrees of freedom
## Multiple R-squared: 0.6677, Adjusted R-squared: 0.6659
## F-statistic: 367.3 on 9 and 1645 DF, p-value: < 2.2e-16
Avec cette méthode on peut écrire l’équation du modèle. Y : la température et Bêta chapeau le vecteur issues de la colonne Estimate de dimension 9 (avec la constante).
On a un R² de 0.67 et un R² également.
On test les résidus
shapiro.test(reg.mul.forward$residuals)
##
## Shapiro-Wilk normality test
##
## data: reg.mul.forward$residuals
## W = 0.99335, p-value = 8.641e-07
Les résidus ne sont toujours pas Gaussiens par le test de Shapiro.
Méthode forwards (procédure automatique).
full <- lm(Temperature_Jour_Suivant ~.,prevision)
null <- lm(Temperature_Jour_Suivant ~1,prevision)
forw <- step(null,scope=list(lower=null, upper = full),direction = "forward",trace=0)
formula(forw)
## Temperature_Jour_Suivant ~ Température + Température.minimale.du.sol.sur.12.heures +
## Rafales.sur.une.période + Hauteur.de.base.2 + Pression.station +
## Point.de.rosée + Variation.de.pression.en.24.heures + Variation.de.pression.en.3.heures +
## Visibilité.horizontale + Direction.du.vent.moyen.10.mn
summary(lm(forw,prevision))
##
## Call:
## lm(formula = forw, data = prevision)
##
## Residuals:
## Min 1Q Median 3Q Max
## -13.1651 -2.3510 -0.1287 2.1048 15.1107
##
## Coefficients:
## Estimate Std. Error t value
## (Intercept) -8.667e-01 1.273e+01 -0.068
## Température 3.875e-01 3.355e-02 11.551
## Température.minimale.du.sol.sur.12.heures 3.341e-01 3.775e-02 8.850
## Rafales.sur.une.période -1.014e-01 2.786e-02 -3.640
## Hauteur.de.base.2 2.647e-04 4.753e-05 5.569
## Pression.station 3.350e-04 1.154e-04 2.903
## Point.de.rosée 1.705e-01 4.478e-02 3.808
## Variation.de.pression.en.24.heures 5.012e-04 1.600e-04 3.133
## Variation.de.pression.en.3.heures -1.214e-03 7.682e-04 -1.581
## Visibilité.horizontale 9.216e-06 5.364e-06 1.718
## Direction.du.vent.moyen.10.mn -1.582e-03 1.010e-03 -1.566
## Pr(>|t|)
## (Intercept) 0.945710
## Température < 2e-16 ***
## Température.minimale.du.sol.sur.12.heures < 2e-16 ***
## Rafales.sur.une.période 0.000281 ***
## Hauteur.de.base.2 2.98e-08 ***
## Pression.station 0.003742 **
## Point.de.rosée 0.000145 ***
## Variation.de.pression.en.24.heures 0.001758 **
## Variation.de.pression.en.3.heures 0.114178
## Visibilité.horizontale 0.085936 .
## Direction.du.vent.moyen.10.mn 0.117463
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.507 on 1644 degrees of freedom
## Multiple R-squared: 0.6687, Adjusted R-squared: 0.6667
## F-statistic: 331.8 on 10 and 1644 DF, p-value: < 2.2e-16
shapiro.test(lm(forw,prevision)$residuals)
##
## Shapiro-Wilk normality test
##
## data: lm(forw, prevision)$residuals
## W = 0.99335, p-value = 8.646e-07
Entre la procédure automatique et manuelle on a quelques variables différentes, mais on trouve un R² similaire.
### Descendant Méthode Backward selection (procédure manuelle).
On commence par voir quel paramètre on retirera en premier.
On utilise le test de Fisher pour cela pour déterminer celui qui est la moins significative > celle qui fait diminuer le R².
On rappel que pour le test de fisher, la statistique calculée est : - ( SCE / n ) / ( SCR / (n-p-1))
On regarde la variable qui a la plus petite F Value, et on la supprime du modèle.
lm.full <- lm(Temperature_Jour_Suivant ~.,prevision)
drop1(lm.full,test="F")
## Single term deletions
##
## Model:
## Temperature_Jour_Suivant ~ Pression.au.niveau.mer + Variation.de.pression.en.3.heures +
## Direction.du.vent.moyen.10.mn + Vitesse.du.vent.moyen.10.mn +
## Température + Point.de.rosée + Humidité + Visibilité.horizontale +
## Nebulosité.totale + Hauteur.de.la.base.des.nuages.de.l.étage.inférieur +
## Pression.station + Variation.de.pression.en.24.heures + Température.minimale.du.sol.sur.12.heures +
## Rafale.sur.les.10.dernières.minutes + Rafales.sur.une.période +
## Précipitations.dans.la.dernière.heure + Précipitations.dans.les.3.dernières.heures +
## Précipitations.dans.les.6.dernières.heures + Précipitations.dans.les.12.dernières.heures +
## Précipitations.dans.les.24.dernières.heures + Hauteur.de.base.2
## Df Sum of Sq RSS AIC
## <none> 20181 4183.0
## Pression.au.niveau.mer 1 12.15 20193 4182.0
## Variation.de.pression.en.3.heures 1 25.93 20207 4183.2
## Direction.du.vent.moyen.10.mn 1 34.45 20215 4183.9
## Vitesse.du.vent.moyen.10.mn 1 7.15 20188 4181.6
## Température 1 15.84 20197 4182.3
## Point.de.rosée 1 8.39 20189 4181.7
## Humidité 1 0.01 20181 4181.0
## Visibilité.horizontale 1 37.64 20218 4184.1
## Nebulosité.totale 1 12.63 20193 4182.1
## Hauteur.de.la.base.des.nuages.de.l.étage.inférieur 1 3.78 20185 4181.4
## Pression.station 1 12.44 20193 4182.1
## Variation.de.pression.en.24.heures 1 108.69 20290 4189.9
## Température.minimale.du.sol.sur.12.heures 1 943.45 21124 4256.7
## Rafale.sur.les.10.dernières.minutes 1 1.44 20182 4181.2
## Rafales.sur.une.période 1 52.10 20233 4185.3
## Précipitations.dans.la.dernière.heure 1 1.79 20183 4181.2
## Précipitations.dans.les.3.dernières.heures 1 0.07 20181 4181.0
## Précipitations.dans.les.6.dernières.heures 1 0.31 20181 4181.1
## Précipitations.dans.les.12.dernières.heures 1 0.13 20181 4181.1
## Précipitations.dans.les.24.dernières.heures 1 0.82 20182 4181.1
## Hauteur.de.base.2 1 93.73 20275 4188.7
## F value Pr(>F)
## <none>
## Pression.au.niveau.mer 0.9830 0.321612
## Variation.de.pression.en.3.heures 2.0983 0.147658
## Direction.du.vent.moyen.10.mn 2.7876 0.095189 .
## Vitesse.du.vent.moyen.10.mn 0.5783 0.447095
## Température 1.2815 0.257779
## Point.de.rosée 0.6792 0.409995
## Humidité 0.0006 0.980062
## Visibilité.horizontale 3.0457 0.081140 .
## Nebulosité.totale 1.0219 0.312215
## Hauteur.de.la.base.des.nuages.de.l.étage.inférieur 0.3063 0.580056
## Pression.station 1.0066 0.315870
## Variation.de.pression.en.24.heures 8.7947 0.003065 **
## Température.minimale.du.sol.sur.12.heures 76.3426 < 2.2e-16 ***
## Rafale.sur.les.10.dernières.minutes 0.1167 0.732655
## Rafales.sur.une.période 4.2156 0.040213 *
## Précipitations.dans.la.dernière.heure 0.1451 0.703360
## Précipitations.dans.les.3.dernières.heures 0.0054 0.941299
## Précipitations.dans.les.6.dernières.heures 0.0252 0.873881
## Précipitations.dans.les.12.dernières.heures 0.0105 0.918421
## Précipitations.dans.les.24.dernières.heures 0.0665 0.796476
## Hauteur.de.base.2 7.5847 0.005952 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
à chaque itération, on retire la p-value de F la plus faible, ici Humidité
Toutes les variables sont significatives, on a le modele backward selection complet.
summary(update(lm.full,~.-Vitesse.du.vent.moyen.10.mn
-Température-Hauteur.de.base.2
-Variation.de.pression.en.3.heures
-Précipitations.dans.les.24.dernières.heures
-Direction.du.vent.moyen.10.mn
-Précipitations.dans.les.3.dernières.heures
-Rafale.sur.les.10.dernières.minutes
-Visibilité.horizontale
-Pression.station
-Précipitations.dans.les.6.dernières.heures
-Précipitations.dans.les.12.dernières.heures
-Pression.au.niveau.mer
-Précipitations.dans.la.dernière.heure ))
##
## Call:
## lm(formula = Temperature_Jour_Suivant ~ Point.de.rosée + Humidité +
## Nebulosité.totale + Hauteur.de.la.base.des.nuages.de.l.étage.inférieur +
## Variation.de.pression.en.24.heures + Température.minimale.du.sol.sur.12.heures +
## Rafales.sur.une.période, data = prevision)
##
## Residuals:
## Min 1Q Median 3Q Max
## -12.9053 -2.3955 -0.1457 2.1538 15.1599
##
## Coefficients:
## Estimate Std. Error
## (Intercept) 4.121e+01 5.290e+00
## Point.de.rosée 5.823e-01 4.141e-02
## Humidité -9.314e-02 7.071e-03
## Nebulosité.totale -1.913e-02 7.485e-03
## Hauteur.de.la.base.des.nuages.de.l.étage.inférieur 3.037e-04 7.221e-05
## Variation.de.pression.en.24.heures 4.872e-04 1.393e-04
## Température.minimale.du.sol.sur.12.heures 3.196e-01 3.740e-02
## Rafales.sur.une.période -1.562e-01 2.664e-02
## t value Pr(>|t|)
## (Intercept) 7.790 1.18e-14 ***
## Point.de.rosée 14.061 < 2e-16 ***
## Humidité -13.172 < 2e-16 ***
## Nebulosité.totale -2.556 0.010674 *
## Hauteur.de.la.base.des.nuages.de.l.étage.inférieur 4.206 2.74e-05 ***
## Variation.de.pression.en.24.heures 3.498 0.000482 ***
## Température.minimale.du.sol.sur.12.heures 8.545 < 2e-16 ***
## Rafales.sur.une.période -5.866 5.39e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.532 on 1647 degrees of freedom
## Multiple R-squared: 0.6633, Adjusted R-squared: 0.6619
## F-statistic: 463.6 on 7 and 1647 DF, p-value: < 2.2e-16
shapiro.test(update(lm.full,~.-Vitesse.du.vent.moyen.10.mn
-Température-Hauteur.de.base.2
-Variation.de.pression.en.3.heures
-Précipitations.dans.les.24.dernières.heures
-Direction.du.vent.moyen.10.mn
-Précipitations.dans.les.3.dernières.heures
-Rafale.sur.les.10.dernières.minutes
-Visibilité.horizontale
-Pression.station
-Précipitations.dans.les.6.dernières.heures
-Précipitations.dans.les.12.dernières.heures
-Pression.au.niveau.mer
-Précipitations.dans.la.dernière.heure )$residuals)
##
## Shapiro-Wilk normality test
##
## data: update(lm.full, ~. - Vitesse.du.vent.moyen.10.mn - Température - Hauteur.de.base.2 - Variation.de.pression.en.3.heures - Précipitations.dans.les.24.dernières.heures - Direction.du.vent.moyen.10.mn - Précipitations.dans.les.3.dernières.heures - Rafale.sur.les.10.dernières.minutes - Visibilité.horizontale - Pression.station - Précipitations.dans.les.6.dernières.heures - Précipitations.dans.les.12.dernières.heures - Pression.au.niveau.mer - Précipitations.dans.la.dernière.heure)$residuals
## W = 0.99179, p-value = 5.421e-08
# summary(update(lm.full,~.-HumiditÃ.
# -PrÃ.cipitations.dans.les.3.derniÃ.res.heures
# -PrÃ.cipitations.dans.les.12.derniÃ.res.heures
# -PrÃ.cipitations.dans.les.6.derniÃ.res.heures
# -Rafale.sur.les.10.derniÃ.res.minutes
# -PrÃ.cipitations.dans.les.24.derniÃ.res.heures
# -Hauteur.de.la.base.des.nuages.de.l.Ã.tage.infÃ.rieur
# -PrÃ.cipitations.dans.la.derniÃ.re.heure
# -Vitesse.du.vent.moyen.10.mn
# -NebulositÃ..totale
# -Pression.au.niveau.mer
# -Direction.du.vent.moyen.10.mn
# -VisibilitÃ..horizontale ))
#
#
# shapiro.test(update(lm.full,~.-HumiditÃ.
# -PrÃ.cipitations.dans.les.3.derniÃ.res.heures
# -PrÃ.cipitations.dans.les.12.derniÃ.res.heures
# -PrÃ.cipitations.dans.les.6.derniÃ.res.heures
# -Rafale.sur.les.10.derniÃ.res.minutes
# -PrÃ.cipitations.dans.les.24.derniÃ.res.heures
# -Hauteur.de.la.base.des.nuages.de.l.Ã.tage.infÃ.rieur
# -PrÃ.cipitations.dans.la.derniÃ.re.heure
# -Vitesse.du.vent.moyen.10.mn
# -NebulositÃ..totale
# -Pression.au.niveau.mer
# -Direction.du.vent.moyen.10.mn
# -VisibilitÃ..horizontale )$residuals)
Avec cette méthode on a un R² de 0.67, c’est également le cas du R² ajusté.
On peut écrire le modèle avec le Béta chapeau : la colonne estimate.
Test par réalisation automatique de la backward selection.
back <- step(full, direction="backward")
formula(back)
## Temperature_Jour_Suivant ~ Variation.de.pression.en.3.heures +
## Direction.du.vent.moyen.10.mn + Température + Point.de.rosée +
## Visibilité.horizontale + Pression.station + Variation.de.pression.en.24.heures +
## Température.minimale.du.sol.sur.12.heures + Rafales.sur.une.période +
## Hauteur.de.base.2
reg.mul.backward <- lm(back,prevision)
summary(reg.mul.backward)
##
## Call:
## lm(formula = back, data = prevision)
##
## Residuals:
## Min 1Q Median 3Q Max
## -13.1651 -2.3510 -0.1287 2.1048 15.1107
##
## Coefficients:
## Estimate Std. Error t value
## (Intercept) -8.667e-01 1.273e+01 -0.068
## Variation.de.pression.en.3.heures -1.214e-03 7.682e-04 -1.581
## Direction.du.vent.moyen.10.mn -1.582e-03 1.010e-03 -1.566
## Température 3.875e-01 3.355e-02 11.551
## Point.de.rosée 1.705e-01 4.478e-02 3.808
## Visibilité.horizontale 9.216e-06 5.364e-06 1.718
## Pression.station 3.350e-04 1.154e-04 2.903
## Variation.de.pression.en.24.heures 5.012e-04 1.600e-04 3.133
## Température.minimale.du.sol.sur.12.heures 3.341e-01 3.775e-02 8.850
## Rafales.sur.une.période -1.014e-01 2.786e-02 -3.640
## Hauteur.de.base.2 2.647e-04 4.753e-05 5.569
## Pr(>|t|)
## (Intercept) 0.945710
## Variation.de.pression.en.3.heures 0.114178
## Direction.du.vent.moyen.10.mn 0.117463
## Température < 2e-16 ***
## Point.de.rosée 0.000145 ***
## Visibilité.horizontale 0.085936 .
## Pression.station 0.003742 **
## Variation.de.pression.en.24.heures 0.001758 **
## Température.minimale.du.sol.sur.12.heures < 2e-16 ***
## Rafales.sur.une.période 0.000281 ***
## Hauteur.de.base.2 2.98e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.507 on 1644 degrees of freedom
## Multiple R-squared: 0.6687, Adjusted R-squared: 0.6667
## F-statistic: 331.8 on 10 and 1644 DF, p-value: < 2.2e-16
shapiro.test(reg.mul.backward$residuals)
##
## Shapiro-Wilk normality test
##
## data: reg.mul.backward$residuals
## W = 0.99335, p-value = 8.646e-07
Les variables sélectionnés sont en grande partie semblables et donne un R² similaire.
Continuons à rechercher une régression valide.
On réalise une ACP normée avec 21 composantes principales.
Les valeurs sont centrées et réduites : scale.unit = True, Nombre de composantes principales 21 : ncp.
library(FactoMineR)
res.pca = PCA(prevision[,1:21],scale.unit=TRUE, ncp=21,graph=T)
## Warning: ggrepel: 5 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
plot.PCA(res.pca, axes=c(1, 2), choix="ind", habillage=5,label="var",graph.type = "ggplot")
On sort les valeurs propre de la matrice de corrélation
res.pca$eig
## eigenvalue percentage of variance cumulative percentage of variance
## comp 1 4.975185e+00 2.369136e+01 23.69136
## comp 2 3.185857e+00 1.517075e+01 38.86211
## comp 3 2.833054e+00 1.349073e+01 52.35284
## comp 4 2.079102e+00 9.900487e+00 62.25333
## comp 5 1.526669e+00 7.269851e+00 69.52318
## comp 6 1.257222e+00 5.986772e+00 75.50995
## comp 7 1.000499e+00 4.764281e+00 80.27423
## comp 8 8.150179e-01 3.881038e+00 84.15527
## comp 9 7.399857e-01 3.523741e+00 87.67901
## comp 10 7.286337e-01 3.469684e+00 91.14869
## comp 11 4.989004e-01 2.375716e+00 93.52441
## comp 12 4.585494e-01 2.183568e+00 95.70798
## comp 13 2.877600e-01 1.370286e+00 97.07826
## comp 14 1.724224e-01 8.210592e-01 97.89932
## comp 15 1.447523e-01 6.892966e-01 98.58862
## comp 16 1.139587e-01 5.426604e-01 99.13128
## comp 17 8.263508e-02 3.935004e-01 99.52478
## comp 18 7.639371e-02 3.637796e-01 99.88856
## comp 19 2.032383e-02 9.678014e-02 99.98534
## comp 20 3.073026e-03 1.463346e-02 99.99997
## comp 21 5.351784e-06 2.548468e-05 100.00000
On remarque que avec les pts projeté sur la composante 1, on récupère 23% de la variance total (lamba / ncp) avec eigenvalue la valeur de lambda.
On détermine la matrice des scores, toutes les dims sont orthogonaux.
res.pca$ind$coord
novariables<-res.pca$ind$coord
previsionACP <- as.data.frame(res.pca$ind$coord)
previsionACP$Temperature_Jour_Suivant <- prevision$Temperature_Jour_Suivant
Méthode de régression sur ACP :
Méthode Forward :
Sur toutes les données, et sur la constante.
lm.full <- lm(Temperature_Jour_Suivant ~.,previsionACP)
lm.full
##
## Call:
## lm(formula = Temperature_Jour_Suivant ~ ., data = previsionACP)
##
## Coefficients:
## (Intercept) Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## 285.82577 -0.50683 2.18175 1.55375 0.50840 -0.32164
## Dim.6 Dim.7 Dim.8 Dim.9 Dim.10 Dim.11
## -0.36316 -0.47258 0.41756 0.12695 -0.18470 0.42103
## Dim.12 Dim.13 Dim.14 Dim.15 Dim.16 Dim.17
## 0.09681 -0.06155 0.19354 -0.03611 -0.27072 0.46745
## Dim.18 Dim.19 Dim.20 Dim.21
## -0.25438 -0.31357 1.01701 -37.20705
lm.null <- lm(Temperature_Jour_Suivant ~1,previsionACP)
lm.null
##
## Call:
## lm(formula = Temperature_Jour_Suivant ~ 1, data = previsionACP)
##
## Coefficients:
## (Intercept)
## 285.8
Le principe est de tester pour chaque dim trouvé, si elle est significative par un test de fisher.
On ajoute à notre modèle celui qui est la plus significative.
Dans la première itération : * -> Dim 2 à une F value de 827.3598 pour une probabilité d’être supérieur à F < 2.2e-16. (donc très significative) * -> On l’ajoute au modèle * -> on passe à l’itération suivante, jusqu’à ne plus avoir de variables significatives.
En refaisant cette regression en prenant soit le plus petit RSS ou soit les dimensions dans l’ordre, le résultat est le meme.
On a donc :
reg.ACP <- lm(Temperature_Jour_Suivant~Dim.1 + Dim.2 + Dim.3 + Dim.4 + Dim.5 + Dim.6 + Dim.7 + Dim.8 + Dim.11 + Dim.10,previsionACP)
summary(reg.ACP)
##
## Call:
## lm(formula = Temperature_Jour_Suivant ~ Dim.1 + Dim.2 + Dim.3 +
## Dim.4 + Dim.5 + Dim.6 + Dim.7 + Dim.8 + Dim.11 + Dim.10,
## data = previsionACP)
##
## Residuals:
## Min 1Q Median 3Q Max
## -13.0378 -2.3754 -0.1332 2.0948 15.2685
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 285.82577 0.08636 3309.607 < 2e-16 ***
## Dim.1 -0.50683 0.03872 -13.090 < 2e-16 ***
## Dim.2 2.18175 0.04839 45.091 < 2e-16 ***
## Dim.3 1.55375 0.05131 30.282 < 2e-16 ***
## Dim.4 0.50840 0.05989 8.488 < 2e-16 ***
## Dim.5 -0.32164 0.06990 -4.602 4.51e-06 ***
## Dim.6 -0.36316 0.07702 -4.715 2.62e-06 ***
## Dim.7 -0.47258 0.08634 -5.473 5.10e-08 ***
## Dim.8 0.41756 0.09566 4.365 1.35e-05 ***
## Dim.11 0.42103 0.12227 3.443 0.000589 ***
## Dim.10 -0.18470 0.10117 -1.826 0.068090 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.513 on 1644 degrees of freedom
## Multiple R-squared: 0.6676, Adjusted R-squared: 0.6655
## F-statistic: 330.1 on 10 and 1644 DF, p-value: < 2.2e-16
On a donc un modèle avec l’équation Y (température) et le Bêta chapeau qui est le vecteur estimate.
On obtient un R² de 0.67 et un R² de même valeur.
shapiro.test(reg.ACP$residuals)
##
## Shapiro-Wilk normality test
##
## data: reg.ACP$residuals
## W = 0.99281, p-value = 3.202e-07
## Régression Ridge
Quel est la différence avec la régression que nous venons d’effectuer ?
la MLR estime les paramètres sans biais. Tandis que Lasso applique une contrainte linéaire et Ridge une contrainte non linéaire à ces paramètres à estimer.
Cependant, en MLR les coefficients peuvent être très sensibles à l’échantillonnage, et des coefficients censés être positifs pour avoir un sens (ex: une surface) sont négatifs.
Avec les méthodes Lasso et Ridge, en posant des contraintes, on évite ces problèmes.
library(MASS)
##
## Attachement du package : 'MASS'
## L'objet suivant est masqué depuis 'package:dplyr':
##
## select
mod.ridge = lm.ridge(Temperature_Jour_Suivant ~.,prevision, lambda=seq(0,200,0.01))
plot(mod.ridge)
legend("topright",legend=rownames(mod.ridge$coef),col=1:21,lty=1:3)
On optimise la régression Ridge
select(mod.ridge)
## modified HKB estimator is 0.1683841
## modified L-W estimator is 9.510109
## smallest value of GCV at 101.01
Création du modèle optimiser
mod.ridgeopt =lm.ridge(Temperature_Jour_Suivant ~. , data=prevision, lambda = 69.36 )
Coefficient du modele
coeff = coef(mod.ridgeopt)
coeff
##
## 4.250563e+00
## Pression.au.niveau.mer
## 1.390285e-04
## Variation.de.pression.en.3.heures
## -1.124248e-03
## Direction.du.vent.moyen.10.mn
## -1.484909e-03
## Vitesse.du.vent.moyen.10.mn
## 4.987332e-02
## Température
## 2.570599e-01
## Point.de.rosée
## 3.075717e-01
## Humidité
## -2.864446e-02
## Visibilité.horizontale
## 9.570773e-06
## Nebulosité.totale
## -9.622582e-03
## Hauteur.de.la.base.des.nuages.de.l.étage.inférieur
## 7.692027e-05
## Pression.station
## 2.092797e-04
## Variation.de.pression.en.24.heures
## 4.536590e-04
## Température.minimale.du.sol.sur.12.heures
## 3.171223e-01
## Rafale.sur.les.10.dernières.minutes
## -2.173624e-02
## Rafales.sur.une.période
## -1.129750e-01
## Précipitations.dans.la.dernière.heure
## 5.559390e-02
## Précipitations.dans.les.3.dernières.heures
## 1.288300e-02
## Précipitations.dans.les.6.dernières.heures
## 1.366126e-02
## Précipitations.dans.les.12.dernières.heures
## -6.823482e-03
## Précipitations.dans.les.24.dernières.heures
## 6.884081e-03
## Hauteur.de.base.2
## 2.047509e-04
Test du modèle obtenu
summary(mod.ridgeopt)
## Length Class Mode
## coef 21 -none- numeric
## scales 21 -none- numeric
## Inter 1 -none- numeric
## lambda 1 -none- numeric
## ym 1 -none- numeric
## xm 21 -none- numeric
## GCV 1 -none- numeric
## kHKB 1 -none- numeric
## kLW 1 -none- numeric
#shapiro.test(mod.ridgeopt$residuals)
Utilisation d’une autre librairie pour réaliser une prédiction de la régression Ridge.
Cette librairie ne fonctionne pas avec des data frame, on convertit nos données
var <- prevision[,names(prevision) != 'Temperature_Jour_Suivant']
var <- as.matrix(var)
On utilise la validation croisé pour éviter le sur-apprentissage.
library(glmnet)
## Warning: le package 'glmnet' a été compilé avec la version R 4.1.2
## Le chargement a nécessité le package : Matrix
## Loaded glmnet 4.1-3
ridge_opti = cv.glmnet(x = var,
y = prevision$Temperature_Jour_Suivant,
family = 'gaussian',
nfolds = 10
)
ridge_lambda <- ridge_opti$lambda.min
ridge_lambda
summary(ridge_opti)
On réalise une prédiction sur nos variables à partir du modèle
pred <- predict(ridge_opti, s = ridge_lambda, newx = var)
On calcule SCE, SCT et Rcarre_ajuste avec les formules du cours
SCR <- sum((pred - prevision$Temperature_Jour_Suivant)^2)
SCT <- sum((prevision$Temperature_Jour_Suivant - mean(prevision$Temperature_Jour_Suivant))^2)
#on calcule le R² classique
Rcarre <- 1 - (SCR / SCT)
# (SCR)/n-p-1
#R² ajusté = 1 - ____________
# (SCT)/n-p
# SCT = SCR + SCE => SCR = SCT - SCT
RcarreAjust = 1 - ((SCR)/(nrow(prevision) -22 )/ (SCT/(nrow(prevision)-21)))
SCR
## [1] 20234.07
SCT
## [1] 61042.66
Rcarre
## [1] 0.6685257
RcarreAjust
## [1] 0.6683228
Un R carré de 0.668 est obtenu
## Lasso
lasso <- cv.glmnet(x = var,
y = prevision$Temperature_Jour_Suivant,
alpha = 1,
standardize = TRUE,
nfolds = 5)
lasso_lambda <- lasso$lambda.min
lasso_lambda
## [1] 0.04095132
predict_lasso <- predict(lasso, s = lasso_lambda, newx = var)
SCR <- sum((predict_lasso - prevision$Temperature_Jour_Suivant)^2)
SCT <- sum((prevision$Temperature_Jour_Suivant - mean(prevision$Temperature_Jour_Suivant))^2)
#on calcule le R² classique
Rcarre <- 1 - (SCR / SCT)
# (SCR)/n-p-1
#R² ajusté = 1 - ____________
# (SCT)/n-p
# SCT = SCR + SCE => SCR = SCT - SCT
RcarreAjust = 1 - ((SCR)/(nrow(prevision) -22 )/ (SCT/(nrow(prevision)-21)))
SCR
## [1] 20234.07
SCT
## [1] 61042.66
Rcarre
## [1] 0.6685257
RcarreAjust
## [1] 0.6683228
Un R² de 0.668 a été trouvé
Pour les comparaisons qui suivent, nous utilisons nos différents
Test de l’AUC, on utilise un des modèles prédictifs sur le jeu d’entrainement (1324 obs) et sur le jeu de test (331 obs).
# library(ROCR)
# library(pROC)
# #prediction
# PredictEntrainement = predict(reg.mul, newdata = prevision)
# PredictTesting = predict(reg.mul, newdata = testing)
#
# #jeu d'entrainement
# auc(prevision$Temperature_Jour_Suivant, PredictEntrainement)
#
# #jeu de test
# auc(testing$Temperature_Jour_Suivant, PredictTesting)
Le résultat est une prédiction parfaite, cependant cet indicateur n’est pas interprétable pour notre modèle.
En effet, l’AUC est valable sur la prédiction de classe , pas sur des prévisions qualitatives.
Comparons nos régressions avec un indicateur ..
Les différents R² ajusté obtenus, sont :
0.99 : Régression sans la constante
0.67 : Régression avec toutes les variables
0.60 : Régression avec variables significatives
0.67 : Régression forward
0.67 : Régression backward
0.67 : Régression sur ACP
0.67 : Régression Ridge
0.67 : Régression Lasso
La régression sans la constante obtiens un R² ajusté de 1, ce qui est logique puisque la droite de régression passe par l’origine.
La régression avec toutes les variables obtient un R² de 0.67, lorsque nous essayons d’obtenir une régression “presque aussi bien” en retirons les variables les moins explicatives, le R² chute à 0.60.
Ensuite, en utilisant les méthodes de protection de la régression, nous obtenons le même R² avec les régressions forward,backward,sur ACP, Ridge que avec la régression avec toutes les variables ! Nous voyons l’efficacité de ces méthodes.
En partant d’une base open-source non construit pour cet effet, nous avons réussis à prédire (à notre échelle) la température du jour suivant en l’exprimant linéairment par rapport à un ensemble de variables explicatives.
## Ouverture (Bonus)
Le test est fait à J+1 : nous essayons de prédire la température du lendemain, mais en changeant notre décalage , nous pouvons prédire à J+n.
Pour un décalage à J+10, on effectue
Voici les résultats du R² à J+100 par exemple :
J+100
0.99 : Régression sans la constante
0.21 : Régression avec toutes les variables
0.18 : Régression avec variables significatives
0.21 : Régression forward
0.21 : Régression backward
0.21 : Régression sur ACP
0.21 : Régression Ridge
0.21 : Régression Lasso
Les résultats à J+100 sont inexploitable.
Affichage des Rcarres sur 10 jours
require(ggplot2)
require(reshape2)
## Le chargement a nécessité le package : reshape2
joursDeca <- c( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10)
Rcarre_Avec_Protection_Regression <- c(0.67 , 0.57 , 0.52 , 0.50 ,0.49 ,0.47 ,0.45 ,0.45 ,0.44 ,0.44)
Rcarre_Avec_Var_Significatives <- c(0.60 , 0.53 , 0.49 , 0.47 ,0.45 ,0.43 ,0.41 ,0.40 ,0.40 ,0.40)
df <- data.frame(joursDeca,Rcarre_Avec_Protection_Regression,Rcarre_Avec_Var_Significatives)
df <- melt(df , id.vars = 'joursDeca', variable.name = 'Rcarres')
ggplot(df, aes(joursDeca,value)) + geom_line(aes(colour = Rcarres))
Les prédictions sont plus difficiles avec le décalage des jours.
Néanmoins, un résultat à J+1 de 0.64 de Rcarre ajusté reste mauvais.
Nous avons fait de nombreuses hypothèses pour expliquer ce résultat.
Nous pensons que les contraintes du jeu de données ont beaucoup influé : les jours où il n’y a aucune observation ne sont pas négligables ainsi que la sélection de la première observation par jour ne rend pas compte de l’ensemble de toutes les données de la journées.
De plus,nous estimons que nos modèle ne tiennent pas en compte la tendance et la saisonnalité (nos données sont chronologique).
Vérifions cette hypothèse en comparant les moyennes de température entre les années.
On utilise pour cela l’Anova
# modele <- aov( TempÃ.rature ~mois ,prevision)
#
# anova(modele)
modele <- aov( Température ~annee ,prevision2)
anova(modele)
## Analysis of Variance Table
##
## Response: Température
## Df Sum Sq Mean Sq F value Pr(>F)
## annee 1 227 227.09 6.1726 0.01307 *
## Residuals 1654 60851 36.79
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Test sur les résidus
residus <- residuals(modele)
shapiro.test(residus)
##
## Shapiro-Wilk normality test
##
## data: residus
## W = 0.99586, p-value = 0.0001693
Le test n’est pas significatif.
Puisque le test n’est pas significatif,Réalisons un test de Kruskal.
# kruskal.test(TempÃ.rature ~mois ,prevision)
# prevision$mois <- NULL
kruskal.test(Température ~annee ,prevision2)
##
## Kruskal-Wallis rank sum test
##
## data: Température by annee
## Kruskal-Wallis chi-squared = 51.701, df = 6, p-value = 2.141e-09
#un test de bartlett
bartlett.test(Température ~annee ,prevision2)
##
## Bartlett test of homogeneity of variances
##
## data: Température by annee
## Bartlett's K-squared = 25.177, df = 6, p-value = 0.0003167
La différence est très significative.
La différence de moyenne est aussi significative , même lorsque l’on regroupe les années en 3 groupes.
# #library(questionr)
# #icut(prevision, annee)
#
#
# ## Recodage de prevision$annee en prevision$annee_rec
# prevision$annee_rec <- cut(prevision$annee,
# include.lowest = TRUE,
# right = FALSE,
# dig.lab = 4,
# breaks = 3
# )
Les différences étant très significative, cela explique les résultats peu convaincants à J+1.
Nous ajouterons prochainement un modèle plus adapté à notre problèmatique, tel le modèle de Buys Ballot.