クロス集計をあえて散布図みたいに可視化する:Rの関数つき
背景
たいていの質問紙の項目に対する回答は,離散的な値を取る。
1, 2, 3, 4, 5みたいな。リッカート尺度みたいな場合ね。
ここである質問項目iの回答と質問項目jの回答をみたい。
5件とか7件のリッカート尺度だと,(ピアソンの)相関係数を出したりすることも多い。でも,これを可視化するとき,散布図を使うと困っちゃう。
こんな感じ。
これだと,どの回答の組み合わせにどれくらいのひとがいるかわからない。困った困った。
微小なノイズを加えて散布図にしちゃえ
ひとつの解決方法は,それぞれの回答の値に微小なノイズを加えるというもの。蜂群図みたいなノリ。たとえば,上記の図は,
みたいにできる。これは,それぞれの回答に,一様分布乱数を加えたもの。
Rでこれをやるには,
scatterplot2<-function(x,y,range=.2){
x<-x+runif(length(x),-range,range)
y<-y+runif(length(y),-range,range)
result<-data.frame(x,y)
print(result)
plot(x,y)
}
使い方は,
scatterplot2(横軸の変数ベクトル,縦軸の変数ベクトル,ノイズの幅)
だけでよい。ノイズの幅は,デフォルトで.2。質問紙のように間隔1ならちょうどよいでしょう。自動で上のような散布図を作画し,一応乱数を加えた変数をデータフレームで返すので,あとでいろいろできる。
モザイクプロットにしちゃえ
結局はクロス集計なんだから,いろんなやり方がある。
まず,Rだったらクロス集計してみるのが普通。
> table(d[,1],d[,2]) ->cross
2 3 4 5 6 7
0 0 1 0 0 0 0
1 2 6 2 1 0 0
2 3 16 10 6 1 0
3 3 18 28 27 4 0
4 0 10 21 17 5 0
5 0 0 3 9 3 1
6 0 0 1 1 0 1
これを,色付きでplotしてやってもいい。
plot(cross,col=1:7)
こんな感じになる。
おまけ:三次元散布図
ちなみに,三次元散布図でもおなじ。項目a, b, cの3者の関係など。
三次元散布図は,scatterplot3dパッケージのscatterplot3d関数を使って描くことができる。
scatterplot3d(dat[,1],dat[,2],dat[,3])
これもおなじように,
scatterplot3d2<-function(x,y,z,range=.2){
x<-x+runif(length(x),-range,range)
y<-y+runif(length(y),-range,range)
z<-z+runif(length(z),-range,range)
result<-data.frame(x,y,z)
print(result)
scatterplot3d(x,y,z)
}
で,
といったかんじにできる。
(でもちょっと見難いし,さも連続変数のように見えすぎてミスリードかも)
ちょっと調節してやって,
こんなくらいだといくらかマシかね。