Nous nous intéressons dans ce TP à l’étude des séries importées du site https://trends.google.fr sur l’évolution au cours du temps de l’intérêt pour les mots-clefs “Statistique” et “Big Data”.

Interêt pour le mot-clef “Statistique”

Visualisation de la série

Télécharger le fichier de données trend_statistique.csv.

Exporter dans R le tableau de données :

library(readr)
trend_statistique <- as.data.frame(read_csv("trend_statistique.csv",skip = 2))

La fonction as.data.frame() transforme le fichier de sortie de la fonction read_csv(qui est un objet de type tibble) en objet de type data.frame.

On commence par transformer la série en objet de classe ts (time series) à l’aide de la fonction ts(),

trend_statistique <- ts(as.vector(trend_statistique[,2]),start=2004,frequency=12)

puis tracer le chronogramme de la série

plot(trend_statistique,xlab='Temps',ylab="Evolution de l'interêt")

On peut remarquer une tendance à la décroissance de la série, avec un motif qui se répète, révélant peut-être la présence d’une composante saisonnière. Pour le confirmer, nous pouvons regarder le tracé de la série par mois (month-plot)

monthplot(trend_statistique)

En l’absence d’effet saisonnier, les 12 chronogrammes mensuels seraient à peu près identiques, ce qui n’est pas le cas ici. On remarque notamment un intérêt pour le mot-clef plus faible en été et en décembre (périodes de pause entre les semestres à l’université ?). Le lag-plot montre des autocorrélations marquées jusqu’au retard 12.

lag.plot(trend_statistique,lags=12,layout=c(3,4),do.lines=FALSE)

On peut remarquer que les lag-plots correspondant aux retards 3 à 9 ont un motif assez particulier, peut-être lié aux variations saisonnières importantes.

Estimation de la tendance et de la saisonnalité

Comme la série semble avoir à la fois une tendance et une composante saisonnière, nous pouvons nous aider des fonctions decompose() et stl() de R pour les modéliser.

Fonction decompose()

fit1 <- decompose(trend_statistique)
plot(fit1)

La fonction decompose() nous donne une tendance décroissante jusqu’en 2012 ou 2013, puis une stabilisation après 2013, ainsi qu’un motif périodique. Cependant il semble que la variance des résidus dépende du temps (hétérodasticité) et qu’elle soit assez importante par rapport à la variance de la série, ce qui peut suggérer que le modèle proposé (modèle additif) n’est pas adéquat.

Nous pouvons observer également la qualité de l’estimation en superposant les estimateurs de la tendance et de la saisonnalité au chronogramme.

plot(trend_statistique,xlab='Temps',ylab="Evolution de l'interêt",main='decompose() avec modèle additif')
points(fit1$trend,type='l',col=2)
points(fit1$trend+fit1$seasonal,type='l',col='purple')
legend('topright',c(expression(X[t]),expression(m[t]),expression(m[t]+s[t])),col=c(1,2,'purple'),lty=1)

On voit ici que le modèle sous estime l’amplitude des variations saisonnières jusqu’en 2009 et sur estime les valeurs minimales à partir de 2011.

fit2 <- decompose(trend_statistique,type='multiplicative')
plot(fit2)

Le modèle multiplicatif nous donne plus ou moins la même tendance et la même saisonnalité mais cette fois, la lois des résidus ne semble pas dépendre du temps, ce qui semble indiquer que ce modèle est mieux adapté pour cette série. Le tracé suivant confirme cette idée, car la fonction \(m_t*s_t\) semble être assez proche de la série.

plot(trend_statistique,xlab='Temps',ylab="Evolution de l'interêt",main='decompose() avec modèle multiplicatif')
points(fit2$trend,type='l',col=2)
points(fit2$trend*fit2$seasonal,type='l',col='purple')
legend('topright',c(expression(X[t]),expression(m[t]),expression(m[t]*s[t])),col=c(1,2,'purple'),lty=1)

plot(fit2$figure,type='l',xlab='mois',ylab='motif périodique')

L’observation du motif de la composante saisonnière concorde avec une baisse importante de l’intérêt durant les mois d’été et moins importante en décembre.

Fonction stl()

fit3 <- stl(trend_statistique,s.window=12)
plot(fit3)

Le résultat de la fonction stl() nous donne une tendance et une saisonnalité similaire, mais avec une amplitude décroissante et non constante. L’observation des résidus indique également une variance dépendant du temps ce qui n’est pas très satisfaisant.

plot(trend_statistique,xlab='Temps',ylab="Evolution de l'interêt",main='stl')
points(fit3$time.series[,2],type='l',col=2)
points(fit3$time.series[,2]+fit3$time.series[,1],type='l',col='purple')
legend('topright',c(expression(X[t]),expression(m[t]),expression(m[t]+s[t])),col=c(1,2,'purple'),lty=1)

# Interêt pour le mot-clef “Big Data”

Visualisation de la série

Télécharger le fichier de données trend_BigData.csv.

Exporter dans R le tableau de données :

library(readr)
trend_BigData <- as.data.frame(read_csv("trend_BigData.csv",skip = 2))
trend_BigData <- ts(as.vector(trend_BigData[,2]),start=2004,frequency = 12)

puis tracer le chronogramme de la série

plot(trend_BigData,xlab='Temps',ylab="Evolution de l'interêt")

On observe ici un intérêt quasiment constant pour le mot-clef jusqu’à l’année 2011 suivi d’une augmentation importante puis d’un stabilisation, avec d’importantes fluctuations. Le tracé du diagramme par mois peut nous aider à déterminer si les fluctuations sont liées à un effet saisonnier.

monthplot(trend_BigData)

Les 12 chronogrammes obtenus étant très similaires, nous pouvons supposer l’absence de composante saisonnière.

lag.plot(trend_BigData,lags=12,layout=c(3,4),do.lines=FALSE)

Le lag-plot montre une autocorrélation de la série assez forte et à long terme.

Estimation de la tendance

Etant donné la forme particulière de la série, il semble peu raisonnable de modéliser la tendance par un polynôme.

MA <- filter(trend_BigData, filter=array(1/3,dim=3), method = c("convolution"),sides = 2, circular = FALSE)
par(mfrow=c(2,1))
plot(trend_BigData,xlab='Année',ylab="Evolution de l'interêt")
points(MA,col=2,type='l')
plot(trend_BigData-MA)

Une estimation par moyenne mobile donne des résultats intéressant mais peu satisfaisants car la loi des résidus semble dépendre du temps.

Nous testons l’estimation du log de la série par moyenne mobile qui semble donner de meilleurs résultats.

MAlog1 <- filter(log(trend_BigData), filter=array(1/10,dim=10), method = c("convolution"),sides = 2, circular = FALSE)
par(mfrow=c(2,1))
plot(log(trend_BigData),xlab='Année',ylab="Evolution de l'interêt")
points(MAlog1,col=2,type='l')
plot(log(trend_BigData)-MAlog1)

que nous pouvons améliorer en jouant sur la taille de fenêtre :

MAlog2 <- filter(log(trend_BigData), filter=array(1/20,dim=20), method = c("convolution"),sides = 2, circular = FALSE)
par(mfrow=c(2,1))
plot(log(trend_BigData),xlab='Année',ylab="Evolution de l'interêt")
points(MAlog2,col=2,type='l')
plot(log(trend_BigData)-MAlog2)

Observation de la série après 2015

Nous souhaitons étudier plus en détail le comportement de la série après 2015.

trend_BigData.ap <- window(trend_BigData,start=2015,end=max(time(trend_BigData)))
plot(trend_BigData.ap)

monthplot(trend_BigData.ap)

Malgrès le peu d’observation, il semble qu’il y ait un motif saisonnier ici, avec un intérêt moindre pour le mot-clef en juillet-août et décembre-janvier et un intérêt plus important en mars et novembre.

Cependant, étant donné le peu d’observation sur cette partie-là de la série, il est difficile d’avoir une estimation très satisfaisante des deux composantes.

fit.ap <- decompose(trend_BigData.ap)
plot(fit.ap)

plot(fit.ap$figure,type='l',xlab='mois',ylab='motif périodique')

plot(trend_BigData.ap,xlab='Temps',ylab="Evolution de l'interêt")
points(fit.ap$trend,type='l',col=2)
points(fit.ap$trend+fit.ap$seasonal,type='l',col='purple')
legend('topright',c(expression(X[t]),expression(m[t]),expression(m[t]+s[t])),col=c(1,2,'purple'),lty=1)

fit.ap2 <- stl(trend_BigData.ap,s.window=12)
plot(fit.ap2)

plot(trend_BigData.ap,xlab='Temps',ylab="Evolution de l'interêt")
points(fit.ap2$time.series[,2],type='l',col=2)
points(fit.ap2$time.series[,2]+fit.ap2$time.series[,1],type='l',col='purple')
legend('topright',c(expression(X[t]),expression(m[t]),expression(m[t]+s[t])),col=c(1,2,'purple'),lty=1)

La prédiction donnée par la fonction stl() est assez similaire à celle données par decompose()', cependant la fonctionstl()` est capable de faire de l’estimation sur toute la période.