草薙の研究ログ

英語の先生をやってます。

クロス集計をあえて散布図みたいに可視化する:Rの関数つき

背景

たいていの質問紙の項目に対する回答は,離散的な値を取る。

1, 2, 3, 4, 5みたいな。リッカート尺度みたいな場合ね。

ここである質問項目iの回答と質問項目jの回答をみたい。

5件とか7件のリッカート尺度だと,(ピアソンの)相関係数を出したりすることも多い。でも,これを可視化するとき,散布図を使うと困っちゃう。

こんな感じ。

 

f:id:kusanagik:20150530153003p:plain

これだと,どの回答の組み合わせにどれくらいのひとがいるかわからない。困った困った。

 

微小なノイズを加えて散布図にしちゃえ

ひとつの解決方法は,それぞれの回答の値に微小なノイズを加えるというもの。蜂群図みたいなノリ。たとえば,上記の図は,

f:id:kusanagik:20150530153529p:plain

 

みたいにできる。これは,それぞれの回答に,一様分布乱数を加えたもの。

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) 

 

 こんな感じになる。

 

f:id:kusanagik:20150530154125p:plain

おまけ:三次元散布図

 

ちなみに,三次元散布図でもおなじ。項目a, b, cの3者の関係など。

三次元散布図は,scatterplot3dパッケージのscatterplot3d関数を使って描くことができる。

scatterplot3d(dat[,1],dat[,2],dat[,3])

f:id:kusanagik:20150530155001p:plain

これもおなじように,

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)
}

で,

f:id:kusanagik:20150530155649p:plain

といったかんじにできる。

(でもちょっと見難いし,さも連続変数のように見えすぎてミスリードかも)

 

ちょっと調節してやって,

f:id:kusanagik:20150530155954p:plain

こんなくらいだといくらかマシかね。