RStatistique

Analyse de corrélation avec R

Dans la continuité du précédent billet, je réalise cette fois-ci l’analyse de corrélation à l’aide de R.

Les données sont initialement chargées dans un dataframe debits_loire depuis le fichier Excel déjà utilisé: Debits_Loire.xlsx

> require(xlsx)
Le chargement a nécessité le package : xlsx
Le chargement a nécessité le package : rJava
Le chargement a nécessité le package : xlsxjars
> setwd("C:/RTI/Stats/Correlation")
> debits_loire <- read.xlsx("Debits_Loire.xlsx", sheetIndex = 1)
> names(debits_loire) <- c("Date","Nevers","Saint-Satur","Orleans","Blois","Tours")
> summary(debits_loire)
                 Date          Nevers       Saint-Satur        Orleans           Blois            Tours       
 01 FEV. 2016 00:00:   1   Min.   :143.0   Min.   : 281.0   Min.   : 294.0   Min.   : 311.0   Min.   : 350.0  
 01 FEV. 2016 01:00:   1   1st Qu.:214.0   1st Qu.: 379.5   1st Qu.: 401.8   1st Qu.: 414.0   1st Qu.: 444.8  
 01 FEV. 2016 02:00:   1   Median :289.0   Median : 453.0   Median : 479.0   Median : 527.0   Median : 572.0  
 01 FEV. 2016 03:00:   1   Mean   :335.7   Mean   : 523.3   Mean   : 532.2   Mean   : 577.3   Mean   : 619.8  
 01 FEV. 2016 04:00:   1   3rd Qu.:391.0   3rd Qu.: 577.2   3rd Qu.: 571.2   3rd Qu.: 640.5   3rd Qu.: 654.0  
 01 FEV. 2016 05:00:   1   Max.   :928.0   Max.   :1360.0   Max.   :1270.0   Max.   :1310.0   Max.   :1430.0  
 (Other)           :1266                                                                                      
>

La commande cor permet d’obtenir les matrices de corrélation (Pearson & Spearman) pour les diverses combinaisons:

> cor(debits_loire[,-1])
               Nevers Saint-Satur   Orleans     Blois     Tours
Nevers      1.0000000   0.9581882 0.8398289 0.7659756 0.7212110
Saint-Satur 0.9581882   1.0000000 0.9431337 0.8879669 0.8468633
Orleans     0.8398289   0.9431337 1.0000000 0.9852670 0.9628878
Blois       0.7659756   0.8879669 0.9852670 1.0000000 0.9890436
Tours       0.7212110   0.8468633 0.9628878 0.9890436 1.0000000
> 
> cor(debits_loire[,-1], method="spearman")
               Nevers Saint-Satur   Orleans     Blois     Tours
Nevers      1.0000000   0.9167092 0.8043585 0.7286661 0.6889871
Saint-Satur 0.9167092   1.0000000 0.9506001 0.9021153 0.8676888
Orleans     0.8043585   0.9506001 1.0000000 0.9845628 0.9441848
Blois       0.7286661   0.9021153 0.9845628 1.0000000 0.9752079
Tours       0.6889871   0.8676888 0.9441848 0.9752079 1.0000000
> 

On peut représenter sur un même graphique l’évolution temporelle des débits pour ces 3 villes:

> plot(debits_loire$Tours,type="l",col="red", ylim=c(0,1500),yaxs="i",xlab="# Mesure",ylab="Débit m3/s")
> lines(debits_loire$Nevers,col="green")
> lines(debits_loire$Orleans,col="blue")
> title("Evolution comparée du débit")
> legend(950,1400, c("Tours","Orleans","Nevers"), lty=c(1,1,1), lwd=c(2.5,2.5,2.5),col=c("red","blue","green"))
> 

evol_debit_lag

La commande pairs permet d’obtenir une matrice de scatterplots. Ici, on s’intéresse aux échantillons issus de Nevers, Orléans & Tours:

> pairs(debits_loire[,c("Nevers","Orleans","Tours")])
> 

pairs_lag

On remarque la forme singulière – en « lasso » – des graphes. Celle-ci s’explique par la latence des épisodes de crues/décrues entre les points de mesure.

La recherche de cette latence peut être réalisée à l’aide de la fonction ccf pour cross correlation function.

> nevers_tours <- ccf(debits_loire$Tours,debits_loire$Nevers, lag.max=120)
> 

ccf_tours

Le sommet de la courbe correspond au décalage pour lequel le coefficient de corrélation est maximal. On peut retrouver directement sa valeur numérique (54 heures pour Tours) via les attributs du résultat de ccf:

> nevers_tours$lag[which.max(nevers_tours$acf)]
[1] 54
> 

Même chose pour Orléans:

> nevers_orleans <- ccf(debits_loire$Orleans,debits_loire$Nevers, lag.max=120)
> 

ccf_orleans

On trouve cette fois un décalage de 35 heures:

> nevers_orleans$lag[which.max(nevers_orleans$acf)]
[1] 35
> 

Une fois déterminé la latence de propagation des phénomènes de crues/décrues – respectivement 35 et 54 heures pour Orleans et Tours – on peut de nouveau représenter l’évolution des débits après avoir décalé les échantillons.

> plot(debits_loire$Tours[seq(54,length(debits_loire$Tours))],type="l",col="red", ylim=c(0,1500),yaxs="i",xlab="# Mesure",ylab="Débit m3/s")
> lines(debits_loire$Nevers,col="green")
> lines(debits_loire$Orleans[seq(35,length(debits_loire$Orleans))],col="blue")
> title("Evolution comparée du débit (après décalage temporel)")
> legend(950,1400, c("Tours","Orleans","Nevers"), lty=c(1,1,1), lwd=c(2.5,2.5,2.5),col=c("red","blue","green"))
> 

evol_debit_nolag

On constate une parfaite correspondance des profils.

On peut aussi produire une nouvelle matrice de scatterplots en tenant compte de ces décalages:

> débits_décalés <- data.frame(debits_loire$Tours[seq(54,length(debits_loire$Tours))])
> names(débits_décalés) <- "Tours"
> débits_décalés$Orleans <- debits_loire$Orleans[seq(35,length(debits_loire$Orleans)-(54-35))]
> débits_décalés$Nevers <- debits_loire$Nevers[seq(1,length(debits_loire$Nevers)-53)]
> pairs(débits_décalés)
> 

pairs_nolag

La relation entre les débits est désormais quasi-linéaire.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *