読者です 読者をやめる 読者になる 読者になる

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

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

【備忘録】交互作用プロットをggplot2で描く

R 統計

今読んでいる本に「交互作用プロット」というものが出てきました。

マーケティング・データ分析の基礎 (シリーズ Useful R 3)

標準で入っている関数を使っていたので、せっかくならggplot2で描いてみようと思いました。

今回は、そのメモになります。

交互作用プロットとは?

交互作用プロットの例

2つの因子が存在した時に、片方の因子をx軸で、もう片方の因子をグラフの種類(色分け、点線/棒線等)で分けるというものです。

y軸は、平均値をプロットするそうです。

f:id:yyhhyy:20160821153620p:plain

今回始めてみましたが、慣れないとちょっと見辛いですね。

交互作用について

見方や説明の詳細はこちらを参考にして下さい。

7.3 交互作用とは?

statsbeginner.hatenablog.com

  • 折れ線が並行かどうか ⇒ グラフの種類で分けた因子に効果がないか?あるか?
  • 左右で上下があるかどうか ⇒ 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)

するとこのようなグラフになりました。

f:id:yyhhyy:20160821155541p:plain

標準の関数はもっと長体がかかっているようなので、印象を併せる為にもう少し横長にしてみました。

ggsave(plot=g,file="20160821_3.png",dpi=300,width=4,height=1.5,scale=2)

f:id:yyhhyy:20160821155854p:plain

分散分析もしておく

先ほどのデータで交互作用の有無を分散分析で確認しておきます

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%以上なので、”同じである=効果がない”ということは、”滅多にないことではない”ので、 交互作用があるとは言い難いようです。

データセットについて

余談ですが、こういう練習用のデータについてなかなか手元にドンピシャなものがないものです。

d.hatena.ne.jp

こういうまとめは本当に助かります