広告/統計/アニメ/映画 等に関するブログ

広告/統計/アニメ/映画 等に関するブログ

Rで時系列データを月別で扱うとき(自分メモ)

広告代理店の業務で意外に多いのが、日別のデータを月別にする作業です。 所がこれの面倒な所は、4週の月があったり5週の月があったり、Excelでやろうとすると、地味に毎月毎月分を作業する必要が出てきてしまいます。

Rにはxtsパッケージという素晴らしいものがあります

架空のテレビ番組の視聴率を特性別に集計する場合を想定して試してみます。

#データの読み込み
program20151023 <- read.table("program20151024.csv",sep=",",header=TRUE)

この時点ではまだ日別のデータです。

##      放送日 世帯 男.4.12才 女.4.12才 男.13.19才 女.13.19才 男.20.34才
## 1  2014/4/6  4.9      21.0       8.4        1.7        0.1        0.7
## 2 2014/4/13  4.2      18.0      10.2        2.4        2.3        0.2
## 3 2014/4/20  6.8      22.8      18.7        4.1        1.2        1.0
## 4 2014/4/27  4.8      22.6      11.2        0.5        0.5        0.4
## 5  2014/5/4  4.9      23.7      12.2        1.7        0.0        0.0
## 6 2014/5/11  5.0      19.1      15.2        1.6        0.0        0.9
##   女.20.34才 男.35.49才 女.35.49才 男.50才以上 女.50才以上
## 1        5.0        1.3        4.4         1.1         1.5
## 2        3.8        1.1        3.2         0.4         0.5
## 3        4.5        2.5        6.1         0.9         1.8
## 4        3.5        1.4        5.1         0.4         1.4
## 5        3.9        2.1        5.0         0.8         1.4
## 6        3.9        1.1        4.4         0.6         0.8

時系列データにするには、一度read.zooをはさんでas.xtsします

library("zoo", lib.loc="C:/r/R-3.2.2/library")
library("xts", lib.loc="C:/r/R-3.2.2/library")
program20151023_xts <- as.xts(read.zoo(program20151023))

これでこのようなデータになります。

##            世帯 男.4.12才 女.4.12才 男.13.19才 女.13.19才 男.20.34才
## 2014-04-06  4.9      21.0       8.4        1.7        0.1        0.7
## 2014-04-13  4.2      18.0      10.2        2.4        2.3        0.2
## 2014-04-20  6.8      22.8      18.7        4.1        1.2        1.0
## 2014-04-27  4.8      22.6      11.2        0.5        0.5        0.4
## 2014-05-04  4.9      23.7      12.2        1.7        0.0        0.0
##            女.20.34才 男.35.49才 女.35.49才 男.50才以上 女.50才以上
## 2014-04-06        5.0        1.3        4.4         1.1         1.5
## 2014-04-13        3.8        1.1        3.2         0.4         0.5
## 2014-04-20        4.5        2.5        6.1         0.9         1.8
## 2014-04-27        3.5        1.4        5.1         0.4         1.4
## 2014-05-04        3.9        2.1        5.0         0.8         1.4

月別にするには、mopnthlyという関数がxtsパッケージには用意されています。

#月別集計
program20151023_monthly <- apply.monthly(program20151023_xts,mean)
#個人的な好みでデータフレームに戻します。
program20151023_monthly_df <- as.data.frame(program20151023_monthly)

これで月別のデータになりました!

##             世帯 男.4.12才 女.4.12才 男.13.19才 女.13.19才 男.20.34才
## 2014-04-27 5.175    21.100    12.125      2.175      1.025      0.575
## 2014-05-25 5.300    22.100    14.875      1.250      0.825      0.350
## 2014-06-29 5.800    26.000    16.780      1.320      1.280      0.540
## 2014-07-27 5.575    22.575    14.225      1.975      1.275      0.625
## 2014-08-31 5.420    19.480    15.200      2.140      1.700      0.700
## 2014-09-28 6.950    27.125    22.725      1.075      1.100      1.300
##            女.20.34才 男.35.49才 女.35.49才 男.50才以上 女.50才以上
## 2014-04-27       4.20      1.575      4.700       0.700        1.30
## 2014-05-25       4.40      1.800      5.025       0.725        1.20
## 2014-06-29       4.60      2.000      4.860       0.580        1.22
## 2014-07-27       3.75      2.275      5.325       0.775        0.55
## 2014-08-31       4.24      2.840      4.520       0.620        1.36
## 2014-09-28       5.70      2.975      6.575       0.825        1.20

しかし自動的に入る列名が気持ち悪いので、アナログで列名を入れます。

#列名を挿入する
program20151023_monthly_df$Month <- c("2014年4月","2014年5月","2014年6月","2014年7月",
                                    "2014年8月","2014年9月","2014年10月","2014年11月",
                                      "2014年12月","2015年1月","2015年2月","2015年3月",
                                      "2015年4月","2015年5月","2015年6月","2015年7月",
                                      "2015年8月","2015年9月","2015年10月")
##             世帯 男.4.12才 女.4.12才 男.13.19才 女.13.19才 男.20.34才
## 2014-04-27 5.175    21.100    12.125      2.175      1.025      0.575
## 2014-05-25 5.300    22.100    14.875      1.250      0.825      0.350
## 2014-06-29 5.800    26.000    16.780      1.320      1.280      0.540
## 2014-07-27 5.575    22.575    14.225      1.975      1.275      0.625
## 2014-08-31 5.420    19.480    15.200      2.140      1.700      0.700
## 2014-09-28 6.950    27.125    22.725      1.075      1.100      1.300
##            女.20.34才 男.35.49才 女.35.49才 男.50才以上 女.50才以上
## 2014-04-27       4.20      1.575      4.700       0.700        1.30
## 2014-05-25       4.40      1.800      5.025       0.725        1.20
## 2014-06-29       4.60      2.000      4.860       0.580        1.22
## 2014-07-27       3.75      2.275      5.325       0.775        0.55
## 2014-08-31       4.24      2.840      4.520       0.620        1.36
## 2014-09-28       5.70      2.975      6.575       0.825        1.20
##                Month
## 2014-04-27 2014年4月
## 2014-05-25 2014年5月
## 2014-06-29 2014年6月
## 2014-07-27 2014年7月
## 2014-08-31 2014年8月
## 2014-09-28 2014年9月

この新しく入れた列名を使ってグラフにすると簡単にこの月別のデータがグラフになります。

#まずはggplotを使える形に変更
library("reshape2", lib.loc="C:/r/R-3.2.2/library")
program20151023_monthly_df_melt <- melt(program20151023_monthly_df,id.vars=c("Month"))
head(program20151023_monthly_df_melt)
##       Month variable value
## 1 2014年4月     世帯 5.175
## 2 2014年5月     世帯 5.300
## 3 2014年6月     世帯 5.800
## 4 2014年7月     世帯 5.575
## 5 2014年8月     世帯 5.420
## 6 2014年9月     世帯 6.950
#ggplotでグラフ化
library("ggplot2", lib.loc="C:/r/R-3.2.2/library")
program20151023_monthly_df_g <- ggplot(program20151023_monthly_df_melt,aes(x=Month,y=value,fill=variable,group=variable,color=variable))+
  geom_line(size=1.5)+
  ggtitle("月別特性別視聴率推移")+
  xlab("")+
  ylab("")+
  theme(axis.text.x=element_text(color="black",angle=45,size=5))+
  theme(axis.text.y=element_text(color="black"))+
  geom_text(aes(y=value,label=round(value,1)),color="black",size=3)
plot(program20151023_monthly_df_g)

f:id:yyhhyy:20151024190127p:plain

 

因みにPNG画像で保存する場合は、縦横を指定して吐き出します。 ただし、画面に表示される時とは微妙に文字サイズを変えるなど注意が必要です。

ggsave(plot=program20151023_monthly_df_g,file="program20151023_monthly_df_g.png",width=16,height=9,dpi=100)

全部一斉にプロットしたら見づらいよ!という時は一行加えます。

program20151023_monthly_df_g <- ggplot(program20151023_monthly_df_melt,aes(x=Month,y=value,fill=variable,group=variable,color=variable))+
  geom_line(size=1.5)+
  facet_wrap(~variable,scales ="free")+
  ggtitle("月別特性別視聴率推移")+
  xlab("")+
  ylab("")+
  theme(axis.text.x=element_text(color="black",angle=45,size=2))+
  theme(axis.text.y=element_text(color="black"))+
  geom_text(aes(y=value,label=round(value,1)),color="black",size=2)
plot(program20151023_monthly_df_g)

f:id:yyhhyy:20151024190149p:plain