【備忘録】交互作用プロットをggplot2で描く
今読んでいる本に「交互作用プロット」というものが出てきました。
マーケティング・データ分析の基礎 (シリーズ Useful R 3)
標準で入っている関数を使っていたので、せっかくならggplot2で描いてみようと思いました。
今回は、そのメモになります。
交互作用プロットとは?
交互作用プロットの例
2つの因子が存在した時に、片方の因子をx軸で、もう片方の因子をグラフの種類(色分け、点線/棒線等)で分けるというものです。
y軸は、平均値をプロットするそうです。
今回始めてみましたが、慣れないとちょっと見辛いですね。
交互作用について
見方や説明の詳細はこちらを参考にして下さい。
- 折れ線が並行かどうか ⇒ グラフの種類で分けた因子に効果がないか?あるか?
- 左右で上下があるかどうか ⇒ x軸で分けた因子に効果があるかないか?
ということになります。
標準のグラフで描く
データの準備
このグラフはRのデータセットの中の「ギニアピッグの歯の成長に対するビタミン C の効果」のデータを使っています
len supp dose 1 4.2 VC 0.5 2 11.5 VC 0.5 3 7.3 VC 0.5
「ビタミン C の投与量」(dose)は、(0.5mg,1mg, 2mg)の3種類ありますので、今回の作図の都合により1mgだけ除きました
library("dplyr", lib.loc="C:/hogehoge/soft/r/R-3.2.3/library") df <- ToothGrowth %>% filter(dose==c(0.5,2))
また、「ビタミン C の投与量」(dose)は数値データなので因子(factor)に変換しておきます
df$dose <- as.factor(df$dose) str(df) 'data.frame': 20 obs. of 3 variables: $ len : num 4.2 7.3 6.4 11.2 5.2 18.5 25.5 32.5 21.5 29.5 ... $ supp: Factor w/ 2 levels "OJ","VC": 2 2 2 2 2 2 2 2 2 2 ... $ dose: Factor w/ 2 levels "0.5","2": 1 1 1 1 1 2 2 2 2 2 ...
標準の関数で描く
先ほどの本で紹介されていたinteraction.plot関数を使うと、先ほどのグラフになります。
interaction.plot(df$dose,df$supp,df$len,xlab="ビタミン C の投与量",trace.label="摂取法",ylab="造歯細胞(歯)の成長量")
ggplot2でやってみる
せっかくなら美しいggplot2で描いてみたいものですね。
データの準備
ggplot2の場合は、まずデータの集計が必要です。平均値をプロットするのですから、dplyr/reshape2で集計は簡単です。
先ずはデータを一度分解し、
library("reshape2", lib.loc="C:/hogehoge/r/R-3.2.3/library") df_m <- melt(df,id.vars = c("supp","dose")) head(df_m) supp dose variable value 1 VC 0.5 len 4.2 2 VC 0.5 len 7.3 3 VC 0.5 len 6.4
平均値に集計しなおします。dcastの際にmeanを使います。
df2 <- dcast(df_m,supp+dose~variable,mean) (df2) supp dose len 1 OJ 0.5 14.40 2 OJ 2 26.42 3 VC 0.5 6.86 4 VC 2 25.50
確かにこの表だけではちょっとイメージがつきにくいのかもしれません
ggplot2で描く
なお、ggplot2は非常に優秀なので、連続データでもないものを棒グラフで結ぶことを良しとしません。 そのためそのままgeom_lineと書くだけではエラーになってしまいます。
geom_path: Each group consists of only one observation. Do you need to adjust the group
aesthetic?
なので、無理矢理「supp」(摂取法)をグループだと認識させます。
g <- ggplot(df2,aes(x=dose,y=len,color=supp,group=supp)) g <- g + geom_line(size=2) g <- g + theme(axis.text.x=element_text(angle=0,colour="black",size=12,hjust=1)) g <- g + theme(axis.text.y=element_text(angle=0,colour="black",size=16)) plot(g) ggsave(plot=g,file="20160821_2.png",dpi=300,width=4,height=3,scale=2)
するとこのようなグラフになりました。
標準の関数はもっと長体がかかっているようなので、印象を併せる為にもう少し横長にしてみました。
ggsave(plot=g,file="20160821_3.png",dpi=300,width=4,height=1.5,scale=2)
分散分析もしておく
先ほどのデータで交互作用の有無を分散分析で確認しておきます
res <- aov(len~supp+dose+supp:dose,data=df) summary(res) Df Sum Sq Mean Sq F value Pr(>F) supp 1 89.5 89.5 5.748 0.0291 * dose 1 1175.0 1175.0 75.493 1.87e-07 *** supp:dose 1 54.8 54.8 3.519 0.0790 . Residuals 16 249.0 15.6 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
supp=摂取法 及び dose=ビタミンCの投下量 については、5%の有意水準で”同じである=効果がない”という帰無仮説は棄却されます。
しかし、supp:dose=摂取法と投下量の交互作用 については、5%以上なので、”同じである=効果がない”ということは、”滅多にないことではない”ので、 交互作用があるとは言い難いようです。
データセットについて
余談ですが、こういう練習用のデータについてなかなか手元にドンピシャなものがないものです。
こういうまとめは本当に助かります