Rで対応のあるデータを比較する

例えば↓こんなデータがあったとします。40人のクラスがあって、1度目のテスト実施後に、なんらかの施策をして、その後、2度目のテストを実施したと。で、施策の効果は点数に表れているのか? みたいなのを想像していただけると理解しやすいかと。行名の 1, 2, ... , 40 はその学生の出席番号みたいなイメージで。

> df
   first second
1     56     75
2     50     59
3     53     61
4     60     62
5     45     59
6     51     60
7     48     70
8     55     79
9     50     67
10    44     50
11    50     64
12    56     49
13    42     53
14    52     53
15    57     41
16    39     63
17    50     54
18    45     54
19    54     59
20    48     74
21    48     58
22    47     59
23    47     57
24    43     54
25    56     76
26    54     39
27    48     59
28    45     43
29    50     59
30    51     52
31    50     58
32    48     70
33    52     61
34    51     50
35    43     62
36    44     39
37    49     64
38    47     45
39    52     68
40    46     64


で、いろいろな可視化をしてみようと思います。

1つ目は直線の傾きで見る感じです。matplot関数をつかえば直線が右肩上がりか、右肩下がりかで効果を把握できます。加えて、色分けすることで分かりやすくしてみました。

# 変化に応じて線の色を決める 
dif <-  df$second - df$first
color <- ifelse( dif > 0, "blue",             # 上がっていれば青
           ifelse( dif < 0, "red", "black") ) # 下がっていれば赤、変化なしは黒
matplot(t(df), type="l", col=color, lty=1, xaxt="n", ylab="score")
axis(1, c(1,2), c("first", "second"))
matplot(df, xlab="学生番号", ylab="点数")

matplotの例

全体的に上がっている人が多そうなことが分かります。また、ばらつきが大きくなっていることも見てとれますね。

t()関数で転置させているのは、first, secondを横軸方向に取るためです。転置させずにmatplotすると、横軸方向は学生番号(1~40)になります↓

matplot(df, xlab="学生番号", ylab="点数")
matplotの例

これはこれで、ありのような気がしますが、1人の学生に着目しての、上がった/下がったというのは分かりにくいですね。縦方向に照合しにくいとか、差分の距離が分かりにくいとか、そのへんが原因でしょうか。

差分に対してヒストグラムを書いてみるというのも、1つのアプローチですね。

hist( dif, breaks=seq(-50, 50, 10), col=c(rep("red",5), rep("blue",5)) )


差の値でヒストグラムを描く

上がった人が多いことや、どの程度上がった/下がったのかという分布が一目で分かりますね。

変り種としては、1回目を横軸に、2回目を縦軸に取って散布図を描いてみるというものです。

plot(df$first, df$second, asp=1, xlim=c(0,100), ylim=c(0,100))
abline( 20, 1, col="blue", lty=1 )
abline( 10, 1, col="blue", lty=2 )
abline(  0, 1 )
abline(-10, 1, col="red" , lty=2 )
abline(-20, 1, col="red" , lty=1 )
 
legend( "topleft", c("20点UPライン", "10点UPライン", "10点DOWNライン", "20点DOWNライン"),
        col=c("blue", "blue", "red", "red"), lty=c(1, 2, 2, 1))

前をx軸、後をy軸にとって散布図を描く

y = x の直線(黒の実線)の上に乗っていれば変化なし、上側なら点数UP、下側なら点数DOWNという感じです。直線からの離れ具合が、UP/DOWNの程度に対応しているイメージですね。

「誰が」というところを知りたいなら、該当する学生番号をtext関数でプロットする手もあります。

plot(df$first, df$second, asp=1, xlim=c(0,100), ylim=c(0,100), type="n")
text(df$first, df$second, row.names(df))

前をx軸、後をy軸にとって散布図を描く(text関数でIDをプロット)

ごちゃごちゃして見えにくい場合は、字を小さくするなり、画像のサイズを大きくするなりしてください。

出力先をPDFにし、ごく小さい字でプロットして、拡大・縮小しながら見るというのも結構いい感じです。PDFに出力する場合は↓下記が参考になると思います。

Rでshapeを出力するときはPDFファイルにすると便利 - Rプログラミングの小ネタ


shapeに限らず、こまごましたものをプロットするときはPDFがおすすめです。

最後のサンプルは、個々の学生の上がり/下がり、その幅に着目したいような場合の例です。色(colorという変数に格納)は、1つ目のサンプルで設定したものを使いまわしています。

plot(1:n, df$first, xlim=c(0,40), ylim=c(0,100), xlab="学生番号", ylab="点数", col=color)
arrows(1:n, df$first, 1:n, df$second, length=0.1, col=color)

増減をarrowsで表現
これだと、変化幅が良く分かりますね。

・・・などという感じで、いろいろ紹介してみました。

コメント

このブログの人気の投稿

Rのグラフで軸の目盛りの刻み幅を変更する方法

Rで繰り返しを含む数列の生成(rep関数、seq関数)

reorderを使ってggplotの棒グラフの並び順を降順にする方法