広告代理店の業務で意外に多いのが、日別のデータを月別にする作業です。 所がこれの面倒な所は、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)
因みに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)