Pour le second devoir du cours ACT6420 (modèles de prévisions), le but est de prévoir des recherches sur Google, via https://www.google.com/trends/. Soit vous avez un mot clé qui vous intéresse, soit vous allez chercher une série extraite dans /ACT6420-TS/. Dans les bases qui ont été mises en ligne, il y a le mot clé gym, par exemple.
> report=read.table( + "http://freakonometrics.free.fr/ACT6420-TS/report-GYM.csv", + skip=4,header=TRUE,sep=",",nrows=548)
On va nettoyer un peu la base (en particulier les valeurs manquantes de la fin)
> tail(report) Semaine gym 543 2014-05-25 - 2014-05-31 80 544 2014-06-01 - 2014-06-07 80 545 2014-06-08 - 2014-06-14 78 546 2014-06-15 - 2014-06-21 NA 547 2014-06-22 - 2014-06-28 NA 548 2014-06-29 - 2014-07-05 NA > report=report[!is.na(report[,2]),] > tail(report) Semaine gym 540 2014-05-04 - 2014-05-10 79 541 2014-05-11 - 2014-05-17 80 542 2014-05-18 - 2014-05-24 79 543 2014-05-25 - 2014-05-31 80 544 2014-06-01 - 2014-06-07 80 545 2014-06-08 - 2014-06-14 78
Les données sont ici hebdomadaires, comme on peut le voir graphiquement
> hebdo=ts(report$gym,start=2004,frequency=52) > hebdo Time Series: Start = c(2004, 1) End = c(2014, 25) Frequency = 52 [1] 68 60 60 53 55 50 49 49 51 48 48 45 45 [14] 47 42 48 46 47 46 47 47 46 47 46 45 46 [27] 46 50 48 48 52 51 57 55 53 56 55 50 48 [40] 50 46 49 46 48 49 48 46 50 47 46 43 54 [53] 69 64 63 60 57 57 53 54 55 54 50 53 54 [66] 46 50 50 49 49 49 47 49 48 49 50 49 49 [79] 47 47 50 49 52 51 55 55 55 54 54 52 53 [92] 54 53 52 51 51 50 51 48 52 50 47 45 56 [105] 76 72 66 64 63 59 53 56 57 58 54 55 54 [118] 53 52 52 50 53 50 51 49 51 51 50 50 48 [131] 48 53 52 56 58 57 60 62 62 63 59 58 58 [144] 56 54 54 53 53 54 53 50 55 54 53 51 56 [157] 77 73 68 68 67 66 64 67 64 63 63 63 62 [170] 62 61 62 61 63 62 63 63 63 63 59 58 59 [183] 61 60 60 58 61 61 62 62 64 68 66 61 58 [196] 58 55 54 51 55 54 55 53 55 53 52 50 55 [209] 76 77 68 67 64 64 58 61 59 59 57 55 57 [222] 59 57 54 56 55 54 52 52 53 54 53 55 55 [235] 55 57 54 56 55 58 65 63 64 67 66 63 62 [248] 60 60 57 55 56 56 58 58 53 56 55 54 52 [261] 69 77 71 68 66 63 60 60 62 59 59 57 57 [274] 60 58 58 56 54 58 57 56 57 57 57 57 54 [287] 54 55 57 57 56 64 60 59 62 62 64 59 58 [300] 57 57 54 53 52 53 53 55 53 55 53 50 49 [313] 63 76 73 68 65 66 60 61 61 60 58 58 61 [326] 61 62 57 57 58 55 58 57 58 59 57 55 55 [339] 57 57 58 59 59 60 60 63 63 63 66 65 62 [352] 60 59 58 57 56 58 59 56 54 57 54 54 53 [365] 66 87 77 74 72 69 68 64 65 65 68 63 65 [378] 65 65 62 61 62 62 63 63 61 65 63 64 63 [391] 61 62 62 61 62 65 63 67 67 71 74 71 70 [404] 68 68 65 66 64 65 68 64 64 65 62 61 60 [417] 69 91 88 83 81 78 75 71 73 74 73 70 69 [430] 66 68 69 66 68 68 65 69 66 69 70 69 70 [443] 69 72 72 71 69 76 74 72 77 77 82 78 72 [456] 72 69 68 67 67 64 66 66 63 65 64 62 61 [469] 67 88 90 83 81 83 77 76 76 74 75 74 74 [482] 77 77 77 73 72 76 72 71 72 74 72 74 73 [495] 73 76 73 73 71 76 76 79 79 83 83 81 78 [508] 78 76 78 80 74 73 75 74 75 72 71 70 69 [521] 73 92 100 94 93 91 86 84 84 85 85 83 82 [534] 83 83 78 79 80 80 79 80 79 80 80 78 > plot(hebdo)
Pour avoir des modèles plus simples, on peut agréger les données, pour les rendre mensuelles (par interpolation linéaire). La fonction à utiliser est ici
H2M=function(BASE){ X=BASE[,2] Y=BASE[,1] date1=substr(as.character(Y),1,10) date2=substr(as.character(Y),14,23) D1=as.Date(date1,"%Y-%m-%d") D2=as.Date(date2,"%Y-%m-%d") vm=vy=N=NA for(t in 1:length(D1)){ mois=seq(D1[t],D2[t],length=7) vm=c(vm,as.POSIXlt(mois)$mon+1) vy=c(vy,as.POSIXlt(mois)$year+1900) N=c(N,rep(X[t],7))} N=N[-1]; vm=vm[-1]; vy=vy[-1] YM=vy*100+vm Z=tapply(N,as.factor(YM),mean) Zts=ts(as.numeric(Z),start=c(2004,1),frequency=12) return(Zts)}
Si on utilise cette fonction sur nos données, on obtient
> mensuel=H2M(report) > mensuel Jan Feb Mar Apr May Jun 2004 60.25000 50.75862 47.51613 45.66667 46.67742 46.00000 2005 63.22581 55.10714 53.03226 49.10000 48.45161 49.10000 2006 68.87097 57.10714 55.51613 51.86667 50.70968 49.93333 2007 70.74194 65.57143 62.87097 61.60000 62.77419 59.96667 2008 70.45161 60.79310 57.19355 56.13333 52.96774 54.30000 2009 70.35484 61.25000 58.19355 57.13333 56.80645 56.00000 2010 69.87097 61.78571 59.45161 58.76667 57.16129 56.40000 2011 76.58065 66.21429 65.22581 62.66667 62.51613 63.16667 2012 85.00000 73.82759 69.93548 67.76667 67.25806 69.46667 2013 84.93548 76.39286 75.00000 74.80000 72.67742 73.13333 2014 94.29032 84.96429 83.29032 79.80000 79.54839 79.00000 Jul Aug Sep Oct Nov Dec 2004 47.80645 53.67742 52.63333 47.77419 47.96667 47.61290 2005 48.41935 53.51613 53.43333 52.41935 50.20000 49.74194 2006 52.48387 59.77419 59.66667 54.12903 52.86667 54.35484 2007 59.87097 62.03226 63.10000 54.45161 54.30000 54.09677 2008 55.45161 62.16129 63.96667 57.41935 56.23333 56.09677 2009 55.96774 61.12903 60.16667 54.29032 53.60000 53.35484 2010 58.12903 61.64516 63.43333 57.67742 56.73333 56.48387 2011 61.80645 66.22581 70.86667 65.77419 65.23333 63.19355 2012 71.48387 75.06452 75.80000 67.22581 64.90000 65.12903 2013 73.51613 78.93548 79.73333 76.41935 73.93333 72.80645 2014 > ts.plot(mensuel)
Cette base est maintenant utilisable pour le devoir. Le but est ici de faire de la prévision pour les 2 prochaines années, avec un intervalle de confiance. Mais j’en reparlerais par courriel.