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"))
>
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")])
>
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) >
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) >
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"))
>
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) >
La relation entre les débits est désormais quasi-linéaire.





