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 :

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")

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.

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