On va t?l?charger les packages n?cessaires pour notre ?tude (Visualsitation et cr?ation de mod?le pr?dictif de l'?tat de port gr?ce aux donn?es de m?t?o).
```{r,message=FALSE,warning=FALSE}
library(readxl)
library(xlsx)
library(ggplot2)
library(ggcorrplot)
library(lubridate)
library(Amelia)
```
##Restitution des donn?es dans une seule base
Apr?s avoir lu et organis? les donn?es de m?t?o pour chaque ann?e (de 2007 ? 2017),il est temps de les restituer dans une seule base, pour ca il faut unifier tout d'abord les colonnes de chaque feuille d'excel, et il faut les assembler dans une seule feuille. Apr?s On a int?gr? les variables qui sont collect?es gr?ce aux diff?rentes bases de donn?es fournies par les services de m?t?o Maroc dans une seule base de donn?es qui pr?sente l'?tat de port pour chaque jour (de 2007 ? 2017) en fonction de plusieurs variables de m?t?o : la direction de vent, la vitesse de vent minimale, la vitesse de vent maximale, la vitesse moyenne de vent, la direction de la houle, la hauteur maximale de la houle, la hauteur minimale de la houle, la hauteur moyenne de la houle, la p?riode de la houle, la temp?rature nocturne, la temp?rature diurne, la pluie, la couverture de nuage et le Beaufort.
Ce travail est fait par l'Excel.
## Lecture des donn?es météorologiques de l'années 2007 jusqu'à 2017:
Il s'agit ici de la lecture des bases de données sur des feuilles d'Excel.
```{r,message=FALSE,warning=FALSE}
WEATHER=read_excel("Weather.xlsx")
WEATHER17=read_excel("Weather-2017.xlsx")
WEATHER16=read_excel("Weather-2016.xlsx")
WEATHER15=read_excel("Weather-2015.xlsx")
WEATHER14=read_excel("Weather-2014.xlsx")
WEATHER13=read_excel("Weather-2013.xlsx")
WEATHER12=read_excel("Weather-2012.xlsx")
WEATHER11=read_excel("Weather-2011.xlsx")
WEATHER10=read_excel("Weather-2010.xlsx")
WEATHER9=read_excel("Weather-2009.xlsx")
WEATHER8=read_excel("Weather-2008.xlsx")
WEATHER7=read_excel("Weather-2007.xlsx")
table(WEATHER[,14])
sum(is.na(WEATHER))
colSums(is.na(WEATHER))
```
## Les donn?es manquantes:
On a déja traité notre base de données sur l'excel, tel que on a organisé les données de météo et l'?tat de port dans une seule feuille d'excel et on a standardisé les différentes observations. Par ex le STATUS_PORT va prendre les 3 valeurs : "CLOSED"" - "OPEN"" - "OPEN + CLOSED". la dernière catégorie c'est pour signifier le STATUS : Consigné pour un demi journée (après midi ou matin).
##Traitement des donn?es manquantes:
On a traité quelques données manquantes dans le fichier Excel. On a remarqué qu'il y a des lignes vides (notamment ? l'ann?e 2007), et puisque on avait un grand nombre d'observations ( presque 365*11 = 4015 observations) donc on a supprimé ces lignes vides (notre base de donn?es a 3891 lignes).
Maintenant on a seulement 28 valeurs manquantes dans les donn?es m?t?o.
Visualisation des diff?rentes caract?ristiques de la base
```{r, message=FALSE,warning=FALSE }
str(WEATHER)
```
```{r, message=FALSE,warning=FALSE }
dim(WEATHER)
```
```{r, message=FALSE,warning=FALSE }
names(WEATHER)
```
```{r, message=FALSE,warning=FALSE }
summary(WEATHER)
missmap(WEATHER)
```
d'apr?s le missingness Map, on remarque qu'on a des valeus manquantes dans la direction de la houle et la direction de vent pour certains jours, on a aussi des valeurs manquantes dans quelques variables m?t?o (NIGHTTIME_TEMPERATURE, RAIN ....) qui ne sont pas observables dans le Missingness Map, parce que le nombre de ces valeurs manquantes est tr?s faible par rapport la taille de la base de donn?es.
##Etude de corr?lation entre les diff?rentes variables
Diagramme de corr?lation entre les variables num?riques.
```{r,message=FALSE,warning=FALSE}
nums= sapply(WEATHER, is.numeric)
nums
WEATHER.NUM=WEATHER[ , nums]
str(WEATHER.NUM)
dim(WEATHER.NUM)
names(WEATHER.NUM)
pairs(WEATHER.NUM)
```
Le diagramme de pairs n'est pas remarquable vu le nombre important des variables de la base. Pour bien visualiser le diagramme pairs on a pens? de subdiviser la base de donn?es WEATHER.NUM en 2 sous base de donn?es, la premi?re contient les 8 premi?res variables et la deuxi?me contient les 7 variables restantes.
```{r,message=FALSE,warning=FALSE}
WEATHER.NUM1=WEATHER.NUM[ , c(1:8)]
WEATHER.NUM2=WEATHER.NUM[ , c(9:15)]
str(WEATHER.NUM1)
str(WEATHER.NUM2)
pairs(WEATHER.NUM1)
pairs(WEATHER.NUM2)
```
et voici le correlogram num?rique des diff?rentes variables de la base de données WEATHER.NUM qui contient que les variables num?riques :
"YEAR", DAY", "WIND_SPEED_MIN", "WIND_SPEED_MAX", "MEAN_WIND_SPEED", "SWELL_HEIGHT_MIN", "SWELL_HEIGHT_MAX", "MEAN_SWELL_HEIGHT", "PERIOD_SWELL", "NIGHTTIME_TEMPERTAURE", "DAYTIME_TEMPERATURE", "RAIN", "CLOUD_COVER", "BF", "STATUS_ORIGIN" (prends 0 si le port est ouvert, 1 s'il est fermé et 0.5 s'il est ouvert pour un demi journée e fermé pour le reste de journée).
```{r ,message=FALSE,warning=FALSE}
WEATHER.NUM= na.omit(WEATHER.NUM)
corr <- round(cor(WEATHER.NUM), 1)
ggcorrplot(corr, hc.order = TRUE,
type = "lower",
lab = TRUE,
lab_size = 3,
method="circle",
colors = c("tomato2", "white", "springgreen3"),
title="Correlogram of WEATHER",
ggtheme=theme_bw)
```
Parmi les variables existantes dans la base On s'inter?sse particuli?rement au STATUS_ORIGIN, on remarque que cette variable est positivement corr?l?e avec la hauteur de la houle, la vitesse de vent, la pluie et la couverture de nuage [Autrement dit plus que la vitesse de vent et la hauteur de houle augmentent plus le STATUS_ORIGIN augmente (La probabilité que le STATUS_ORIGIN soit 1 augmente c'est ? dire la probabilité que le port soit consigné augmente) et c'est tout a fait logique].
Voyons la relation de variable STATUS_ORIGIN avec les variables de m?t?o d'une façon plus lisible.
###STATUS_ORIGIN VS MEAN_WIND_SPEED
On va faire une représentation de tout observation sur un intervalle du temps d'un ans (chaque année a son propre couleur).
On remaraque que si le MEAN_WIND_SPEED est supérieur à 25, on peut dire que la probabilit? que le port va ?tre consigné augmente d'une mani?re significative. Ainsi on remarque que si la vitesse de vent est sup?rieure ? une certaine valeur (45 - 50) le port doit ?tre consign?.
Dans le cas des petites valeurs de la vitesse de vent on remarque un comportement contradictoire au bon sens, quand la vitesse diminue la probabilit? que le port sera consign? augmente, donc la n?c?ssit? d'intégrer les autres variables m?t?o.
Pour avoir une premi?re id?e sue la r?partition de l'?tat de port en fonction de la vitesse de vent voil? le sch?ma suivant:
labs(subtitle="STATUS_ORIGIN VS MEAN_SWELL_HEIGHT",
y="STATUS_ORIGIN",
x="MEAN_SWELL_HEIGHT",
title="STATUS_ORIGIN VS MEAN_SWELL_HEIGHT",
caption = "Source: WEATHER")
plot(ggg)
```
On remaraque que si le MEAN_SWELL_HEIGHT est supérieur à 2m, on peut dire que le port va être probablement consigné. Ainsi on remarque que le statut de port est fortement corrélé avec la hauteur de houle si cette dernière est entre 1 et 2.
Aux éxtrêmes (des petites valeurs et des grandes valeurs de la hauteur de houle) il est difficile de prédire le status de port (peut être il faut intégrer d'autres variables m?t?o).
La r?partition de l'?tat de port en fonction de la hauteur de la houle:
On remarque qu'on a plus des points dans l'abcisse 0 (le climat sec de Laayon). Quand les pr?cipitations augmentents la probabilit? que le port sera consign? augmente.
On remarque bien la corr?lation positive entre la couverture de nuage et les pr?cipitation, c'est tout a fait logique puisque on sait que g?n?ralement des nuages plus dense augmenteront les chances de pr?cipitations dans de telles circonstances.
On sait que la houle est une onde, et alors elle caract?ris?e par une p?riode et un logueur d'onde, cette derni?re est proportionnelle au carr? de la p?riode. quand la vitesse de vent augment la longueur d'onde des vagues diminue et alors la p?riode diminue aussi. Donc on a une corr?lation n?gative entre la p?riode de la houle et la vitesse de vent, on va v?rifier ?a par le sch?ma ci-dessous:
Quand la vitesse de vent est sup?rieure ? 35 - 40 la p?riode augmente, peut ?tre que la houle d?pend des autres variables plus que la vitesse de vent (la force du vent, la dur?e d'action du vent, la distance sur laquelle le vent peut souffler sans rencontrer d'obstacles, appel?e fetch....).
###Densit?,boxplot,et s?rie chronologique de l'?tat de port et les varuables m?t?orologique.
pour le STATUS_ORIGIN:
```{r,message=FALSE,warning=FALSE }
attach(WEATHER)
theme_set(theme_classic())
d <- ggplot(WEATHER,aes(STATUS_ORIGIN))
d + geom_density(aes(fill=as.factor(YEAR)), alpha=0.3) +
labs(title="Density plot",
subtitle="STATUS_ORIGIN Grouped by Year",
x="STATUS_ORIGIN",
fill="# YEAR")
```
On remarque que dans chaque ann?e le port est ferm? plus qu'il est ouvert.
De m?me pour la hauteur de swell sauf aux etr?mes (dans les valeurs extr?mes on peut bien pr?dire les hauteurs de la houle car on a une d?pendance avec des autres variables m?t?orologiques)
La densit? de l'?chelle de Beaufort est un peu compliqu?e. On remarque que les scores 4 et 5 sont distribu?s d'une mani?re presque uniformes.
On suit qui suit le boxplot annuel:
STATUS_ORIGIN:
```{r,message=FALSE,warning=FALSE }
theme_set(theme_classic())
attach(WEATHER)
b <- ggplot(WEATHER, aes(x=as.factor(YEAR) ,y = STATUS_ORIGIN))
b + geom_boxplot(varwidth=T, fill="plum") +
labs(title="Box plot",
subtitle="STATUS_ORIGIN grouped by Years",
caption="Source: WEATHER",
x="Les ann?es",
y="STATUS_ORIGIN")
Ceci est un document R markdown que vous pouvez aisément exporter au format HTML, PDF, et MS Word. Pour plus de détails sur R Markdown consultez <http://rmarkdown.rstudio.com>.
Lorsque vous cliquerez sur le bouton **Knit** ce document sera compilé afin de ré-exécuter le code R et d'inclure les résultats dans un document final. Comme nous vous l'avons montré dans la vidéo, on inclue du code R de la façon suivante:
Et on peut aussi aisément inclure des figures. Par exemple:
Visualisons maintenant les séries chrnologiques pour l'ann?es 2017 :
STATUS_ORIGIN:
```{r pressure, echo=FALSE}
plot(pressure)
###STATUS_ORIGIN pour l'ann?e 2017:
```{r,message=FALSE,warning=FALSE }
theme_set(theme_classic())
attach(WEATHER17)
ggplot(WEATHER17, aes(x=DAY)) +
geom_line(aes(y=STATUS_ORIGIN)) +
labs(title="Time Series Chart",
subtitle="STATUS_ORIGIN pour l'ann?e 2017",
y="STATUS_ORIGIN")
theme_set(theme_classic())
attach(WEATHER16)
ggplot(WEATHER16, aes(x=DAY)) +
geom_line(aes(y=STATUS_ORIGIN)) +
labs(title="Time Series Chart",
subtitle="STATUS_ORIGIN pour l'ann?e 2016",
y="STATUS_ORIGIN")
```
Vous remarquerez le paramètre `echo = FALSE` qui indique que le code ne doit pas apparaître dans la version finale du document. Nous vous recommandons dans le cadre de ce MOOC de ne pas utiliser ce paramètre car l'objectif est que vos analyses de données soient parfaitement transparentes pour être reproductibles.
###MEAN_WIND_SPEED pour l'ann?e 2017:
```{r,message=FALSE,warning=FALSE }
theme_set(theme_classic())
attach(WEATHER17)
ggplot(WEATHER17, aes(x=DAY)) +
geom_line(aes(y=MEAN_WIND_SPEED)) +
labs(title="Time Series Chart",
subtitle="MEAN_WIND_SPEED pour l'ann?e 2017",
y="MEAN_WIND_SPEED")
theme_set(theme_classic())
attach(WEATHER16)
ggplot(WEATHER16, aes(x=DAY)) +
geom_line(aes(y=MEAN_WIND_SPEED)) +
labs(title="Time Series Chart",
subtitle="MEAN_WIND_SPEED pour l'ann?e 2016",
y="MEAN_WIND_SPEED")
```
###MEAN_SWELL_HEIGHT pour l'ann?e 2017:
```{r,message=FALSE,warning=FALSE }
theme_set(theme_classic())
attach(WEATHER17)
ggplot(WEATHER17, aes(x=DAY)) +
geom_line(aes(y=MEAN_SWELL_HEIGHT)) +
labs(title="Time Series Chart",
subtitle="MEAN_SWELL_HEIGHT pour l'ann?e 2017",
y="MEAN_SWELL_HEIGHT")
theme_set(theme_classic())
attach(WEATHER16)
ggplot(WEATHER16, aes(x=DAY)) +
geom_line(aes(y=MEAN_SWELL_HEIGHT)) +
labs(title="Time Series Chart",
subtitle="MEAN_SWELL_HEIGHT pour l'ann?e 2016",
y="MEAN_SWELL_HEIGHT")
```
###DAYTIME_TEMPERATURE pour l'ann?e 2017:
```{r,message=FALSE,warning=FALSE }
theme_set(theme_classic())
attach(WEATHER17)
ggplot(WEATHER17, aes(x=DAY)) +
geom_line(aes(y=DAYTIME_TEMPERATURE)) +
labs(title="Time Series Chart",
subtitle="DAYTIME_TEMPERATURE pour l'ann?e 2017",
y="DAYTIME_TEMPERATURE")
```
```{r,message=FALSE,warning=FALSE }
theme_set(theme_classic())
attach(WEATHER16)
ggplot(WEATHER16, aes(x=DAY)) +
geom_line(aes(y=DAYTIME_TEMPERATURE)) +
labs(title="Time Series Chart",
subtitle="DAYTIME_TEMPERATURE pour l'ann?e 2016",
y="DAYTIME_TEMPERATURE")
```
###Pr?cipitation pour l'ann?e 2017 - 2016:
```{r,message=FALSE,warning=FALSE }
theme_set(theme_classic())
attach(WEATHER17)
ggplot(WEATHER17, aes(x=DAY)) +
geom_line(aes(y=RAIN)) +
labs(title="Time Series Chart",
subtitle="Pr?cipitation pour l'ann?e 2017",
y="RAIN")
theme_set(theme_classic())
attach(WEATHER16)
ggplot(WEATHER16, aes(x=DAY)) +
geom_line(aes(y=RAIN)) +
labs(title="Time Series Chart",
subtitle="Pr?cipitation pour l'ann?e 2016",
y="RAIN")
```
###Beaufort pour l'ann?e 2017 - 2016:
```{r,message=FALSE,warning=FALSE }
theme_set(theme_classic())
attach(WEATHER17)
ggplot(WEATHER17, aes(x=DAY)) +
geom_line(aes(y=BF)) +
labs(title="Time Series Chart",
subtitle="Beaufort pour l'ann?e 2017",
y="BF")
attach(WEATHER16)
ggplot(WEATHER16, aes(x=DAY)) +
geom_line(aes(y=BF)) +
labs(title="Time Series Chart",
subtitle="Beaufort pour l'ann?e 2016",
y="BF")
```
###Visualisation de l'?tat de port
Pour visualiser la r?partition de l'?tat de port pendant les 11 derni?res ann?es, voil? le script suivant :
```{r,message=FALSE,warning=FALSE }
library(ggplot2)
theme_set(theme_classic())
# Source: Frequency table
df <- as.data.frame(table(WEATHER$STATUS_ORIGIN))
colnames(df) <- c("STATUS_ORIGIN", "freq")
pie <- ggplot(df, aes(x = "", y=freq, fill = factor(STATUS_ORIGIN))) +
geom_bar(width = 1, stat = "identity") +
theme(axis.line = element_blank(),
plot.title = element_text(hjust=0.5)) +
labs(fill="STATUS_ORIGIN",
x=NULL,
y=NULL,
title="Pie Chart of STATUS_ORIGIN",
caption="Source: WEATHER")
pie + coord_polar(theta = "y", start=0)
```
###Arbre de d?cision
Voil? l'arbre de d?cision qui classifie l'?tat de port en fonction des variables m?t?orologique:
N.B : Voire la capacit? limit?e de nos machines, on a travaill? seulement pour les donn?es des ann?es 2017 - 2016 - 2015 - 2014 - 2013 - 2007 (data train), apr?s on va tester le mod?le sur les autres ann?es.
On remarque que les variables qui sont significatives pour le mod?le de classification construit sont les : la direction de vent - la direction de la houle - la hauteur de la houle - la vitesse de vent. (Les autres variables m?t?orologiques sont n?gligeables par rapport aux variables d?ja cit?es).
On obtient 0.87 comme accuracy, c'est d?ja pas mal comme mod?le.
Pour ?valuer la performance de notre mod?le, on va le tester sur des donn?es qui ne pr?sentent pas dans les donn?es d'apprentissage (les ann?es 2012 - 2011 - 2010 - 2009 - 2008).
Comme les résultats ne sont pas stockés dans les fichiers Rmd, pour faciliter la relecture de vos analyses par d'autres personnes, vous aurez donc intérêt à générer un HTML ou un PDF et à le commiter.
Maintenant, à vous de jouer! Vous pouvez effacer toutes ces informations et les remplacer par votre document computationnel.