Agrégation d'une série temporelle sous R

Apporter une valeur ajoutée aux représentations de vos séries temporelles sous R via l'agrégation et les annotations

Une série de données temporelles est porteuse d'une information très riche, à fortiori si l'unité de temps est fine. Aussi, la représentation graphique d'une telle série peut être l'opportunité de mettre en avant plusieurs indicateurs clés permettant au lecteur d'avoir une vision critique et comparative des informations.
Dans cet article nous allons réutiliser les données de la mesure des scores d'audimat (en millions de téléspectateurs) sur une agglomération donnée entre le 1er janvier 2010 et le 30 septembre 2016. Pour rappel nous avions utilisé ce dataset pour évoquer la régression linéaire sous R (article accessible ici). Notre objectif est d'agréger les données quotidiennes pour revenir à une granularité au mois puis de faire figurer sur le graphique la moyenne ainsi que l'écart-type à l'année. Voici le rendu que nous allons obtenir :

R serie temporelle agregation annotation moyenne ecart-type

Données de travail

Chargeons les données et voyons à quoi elles ressemblent :


df_audimat <- read.table("audimat.csv", header = TRUE,
                         sep = ",",
                         quote = "\"",
                         fill = TRUE,
                         comment.char = "")

#Nous convertissons la date en format Date
df_audimat[['date']] <- as.Date(df_audimat[['date']], format='%Y-%m-%d') 
head(df_audimat)
        date     jour temperature precipitation telespectateurs
1 2010-01-01 vendredi         7.2           3.4        48.33333
2 2010-01-02   samedi        10.9           0.8        42.33333
3 2010-01-03 dimanche        11.0           0.2        44.00000
4 2010-01-04    lundi         6.1           2.4        40.00000
5 2010-01-05    mardi         2.0           0.6        49.00000
6 2010-01-06 mercredi         0.6           1.2        35.33333

Pour les besoins de cet article, nous n'allons exploiter que deux colonnes : la date ainsi que le nombre de téléspectateurs. Comme vous pouvez le constater les observations sont quotidiennes, nous allons procéder à une agrégation mensuelle.

Agrégation menusuelle des données

Agrégeons nos données à présent. Pour ce faire, nous ajoutons une colonne date de format année-mois dans notre dataframe puis procédons à l'agrégation sur la base de la moyenne du nombre de téléspectateurs par année-mois :


df_audimat['aaaa_mm'] <- as.factor(format(df_audimat$date, "%Y-%m"))
df_agg <- aggregate(telespectateurs~aaaa_mm, df_audimat, mean)
head(df_agg, 10)
   aaaa_mm telespectateurs
1  2010-01        41.73118
2  2010-02        47.07143
3  2010-03        47.92473
4  2010-04        48.46667

Augmentation des informations

Avant de dresser le graphique final, nous allons augmenter nos données. Il nous faut en effet une date pivot sur laquelle positionner notre segment (moyenne annuelle/écart-type). Nous positionnerons arbitrairement ce segment au 30 juin de chaque année, afin que celui-ci soit édité en milieu d'année. Ainsi nous créons une nouvelle colonne nommée aaaa dans le dataframe agrégé df_agg.


df_agg['aaaa'] <- as.Date(paste(substr(df_agg$aaaa_mm,1,4), '06-30', sep='-'))

Par ailleurs, nous voulons associer une couleur distincte à chaque année. Il faudrait bien sur éviter de tout coder en dur afin de supporter tout ajout ultérieur de nouvelles observations. Nous allons donc cherche l'année minimum du dataset, l'année maximum puis instancier un vecteur afin de se servir de l'indice comme d'une référence couleur :


#Constitution du referentiel des annees observees
minYear <- format(min(df_audimat$date, na.rm=T), "%Y")
maxYear <- format(max(df_audimat$date, na.rm=T), "%Y")
rangeAnnees <- c(minYear : maxYear)

#Ajout d'une colonne couleur correspondant a l'indice de l'annee dans le referentiel
df_agg['couleur'] <- match(substr(df_agg$aaaa_mm,1,4),rangeAnnees)

Enfin, dernier détail, il nous faut reconvertir en date, la clé d'agrégation.


df_agg['aaaa_mm'] <- as.Date(paste(df_agg$aaaa_mm, '01', sep='-'))

Agrégation annuelle des annotations

Nous y sommes presque. Il nous faut juste constituer les agrégations nécessaires à l'affichage des annotations annuelles, c'est à dire moyenne et écart-type de l'année. Nous stockons ces informations dans un dataframe nomme gd :


gd <- aggregate(telespectateurs~aaaa, df_agg, 
                function(x) c(mean = mean(x), 
                              sd = sd(x),
                              sdp = mean(x)+sd(x),
                              sdm = mean(x)-sd(x)))

Rendu final

Nous avons tout, il ne nous reste plus qu'à éditer le graphique. Commençons par importer la librairie ggplot :


library(ggplot2)
theme_set(
  theme_classic() + 
    theme(legend.position = "top")
)

Puis dressons enfin notre graphique, sans les annotations annuelles tout d'abord :


p <- ggplot(data = df_agg, aes(x = aaaa_mm, y = telespectateurs, group = couleur))+
  geom_line(color = df_agg$couleur, size = 0.4)+
  geom_point(color = df_agg$couleur, size = 4, alpha=0.3)  
p + scale_x_date(date_labels = "%Y")+
  theme(plot.title = element_text(hjust = 0.5))+     
  labs(y="Telespectateurs (en milions)", x = "Mois")
R serie temporelle agregation annotation moyenne ecart-type

Ajoutons ensuite les segments annuels, au 30 juin de chaque année, faisant ressortir la moyenne de téléspectateurs de l'année courante ainsi que l'écart-type associé, dressé de part et d'autre.

R serie temporelle agregation annotation moyenne ecart-type

Retrouvez dans la rubrique "Nos datasets" toutes les données dont vous aurez besoin pour tester et pratiquer !