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

未来はキミドリイロ

サイコメトリックアイドルを目指す心理学徒の勉強部屋です。勉強・趣味などについて書いています。

『犯罪心理学のための統計学』で勉強してみる(第一章:MDS) R編

まえがき

本記事は、荘島先生の「読者の皆さんへ」コーナーが爆笑必須であることで有名な心理学のための統計学シリーズの第9巻にあたる、『犯罪心理学のための統計学』をネタに勉強してみようのコーナーです。
具体的には,各章の内容を整理して勉強するとともに,章末の演習問題をひとまずRのパッケージを用いて実際に解いてみるないしは実際に架空データを分析してみることを考えています。
本書では演習問題に対して解答が用意されていますが,実際にソフトウェアを用いてどのように分析すればよいのかについては述べていないので,「この本で学んだ内容をRで分析する場合にはこうやるんだ!」という情報もそれなりに価値があるだろうと思ったため記事にしています。

心理学のための統計学シリーズの構成や全体像については,書籍表紙からの引用ですが次の記事にまとめてあります。arca821.hatenablog.com

本記事では,第一章の多次元尺度構成法(MultiDimensional Scaling, MDS)を扱います。
この手法は,類似度と呼ばれる指標を利用して分析対象間の関係(距離)を視覚的に表現するものだと考えられると思います。

分析をするまでの問題意識

章末のクイズで問題となっているデータについての例を見てみましょう。
f:id:arca821:20150612103612p:plain

このデータは,性犯罪事件について列に該当する行動が観測されれば1,観測されなければ0をとるパターン行列です。
たとえば事件1では,犯人は「緊縛,潜伏,目隠し,刃物,暴力,指紋工作,窃盗」を行っていることになります。
このデータだけでも,被害者宅に潜伏し,帰ってきたところを刃物で脅して緊縛・目隠しし,(性的)暴行を行った果てに下着などを窃盗し,去り際に指紋工作を行って逃げていく卑劣な犯人像が浮かんでくるような気がしますね。

こうしたデータが20件分あるときに,行動パターンが似ている事件は同一犯のものとみなすこともできると思われます。
そんなとき,どの事件とどの事件が類似しているのか,という疑問がわいてきますよね。
そこで,MDSによって事件間の類似度を視覚的に布置し,検討してみようという分析を行うわけです。

MDSとはどんな手法?

それでは,MDSとはどのような手法なのかを確認していきます。
MDSとは分析対象について上に挙げたような反応パターンが得られたときに,それらの類似度をもとに分析対象間の距離を推定して2~3次元*1に配置する手法であると言えるかと思います。

行うことは次の2点ということもできるでしょう。

  • パターン行列に基づく対象間の距離の視覚化(分類的分析とも?)
  • 次元の縮約

また,私の理解では,MDSは計量的か否か,行列の形は対称か否か,という2*2=4つに分類することができます。

  • 計量/非計量
  1. 計量:いわゆるパラメトリックで,距離の値そのものを分析
  2. 非計量:いわゆるノンパラメトリックで,距離の大小関係のみを分析
  • 対称/非対称
  1. 対称:距離行列が対称,つまり上三角要素と下三角要素が一致した行列を分析
  2. 非対称:A→Bへの評定とB→Aへの評定が異なるなど,上下の三角要素が異なる行列を分析

分析の手続き(説明編)

1. 反応パターンから類似度を求める

このセクションでは反応パターンから得られる類似度の指標としてしばしば用いられる,Jaccard係数というものについて確認をします。
今,数ある事件の中から事件1と事件2をピックアップし,ある行動が観測されたか否かについてクロス集計をとってみることを考えます。
f:id:arca821:20150612222129p:plain

このとき,Jaccard係数は次のように定義されます。
Jaccard=\dfrac{A}{A+B+C}

意味合いとしては,ある行動が観測された度数(事件1のみで観測,事件2でのみ観測,両方の事件で観測)のうち,両方で観測されたもの(=共起)の度合いとして理解できるでしょう。
集合の記法を用いると,次のようにも表現できます。
Jaccard=\dfrac{|A \cap B|}{|A \cup B|}

この指標を用いて,事件同士の類似度を求めます。
このときにできる類似度の行列は,相関係数行列のように対称な正方行列になります。

2. 類似度から距離データに変換する

類似度データは似ているものは大きくなり,似ていないものは小さくなるような値であるため対象間の距離としてはやや扱いにくいようです。
そこで,似ていれば近く(値が小さく)なり似ていなければ遠く(値が大きく)なるような,距離のデータに変換する必要があります。
先ほどのJaccard係数は割合ですので,1-Jaccard係数によって似ていない程度=距離に変換することができます。
このJaccard距離は,集合の記法を用いて次のように表現することができます。
J_{dist(A, B)}=\dfrac{|A \cup B|-|A \cap B|}{|A \cup B|}

手続き1で求めたJaccard係数行列から1を引いてあげればいいわけですね。

3. 距離データと座標間距離の差とを最小化する

手続き2で求めた距離行列に基づいて対象をマッピングしていきたいのですが,この座標を決めるという作業がかなり難儀します。
というのも,わかっているのは距離だけなので向きや,第何象限にあるかなどの情報は一切ありません。
したがって,とりあえず適当に初期値を決めるとして,対象を布置するたびに調整・更新する必要があるだろうことが予測されます。
このとき,暗中模索しながら微調整をするのは骨が折れるので,ある基準を設定してそれを最小化するかたちで座標を決めます。
その基準のことを,ここではストレス関数(ストレス値)と呼んでいます。

座標間の距離を,ご存じ三平方の定理に基づくユークリッド距離で求めるとき,ストレス関数は次のように定義されます。
S = \Sigma \Sigma (d^*_{ij} - \delta_{ij})^2

dは距離データ,\deltaは座標間の距離を指します。
式を見たまま,最小二乗基準のようなものなのでしょう。

4. 次元数の決定

順番的にこちらが3番のような気もしますが,テキストリスペクトということでこの順とします。
次元数は脚注でも述べましたが,数がNのオブザベーションを布置する場合には1~(N-1)まで選ぶことができます。
次元数を増やせばそれだけあてはまりはよくなるわけですが,多くなりすぎると解釈できなくなってしまうため一般的には2~3次元を選ぶことが多いようです。
この際,次元数決定の参考となる情報として,ストレス値を用います。
次元を増やしていったときのストレス値をプロットしていき,その図をスクリープロットとして利用して決めることができるようです。

スクリープロットといえば,探索的因子分析での固有値のスクリープロットが有名ですよね。
今回は,値がガクッとさがったところで決めるという手順は変わりませんが,プロットされているのはストレス値という点は確認しておくべきでしょう。

このようにして,MDSによる分析を行っていくわけですね。

MDSの分析手続き(実践編)

Rのパッケージを利用して,MDSで上に挙げたデータを分析してみます。
スクリプト,というほど大したものではありませんが,今回使ったものを掲載します。
この本を読んでMDSをやってみるか,となった際にRではどうすればいいんだろうという疑問へのヒントになればと思います。

#--------------------------------------------------------------#
setwd("~/Rstudio/workspace/criminal1")
library(stats)
library(MASS)
library(vegan)


#データの読み込み
data<-read.csv("1_MDS_data.csv", header=T, row.names=1)
dist<-dist(data)


#statsパッケージによる計量MDSの実行
par.mds<-cmdscale(dist, k=2, eig=FALSE)


plot(par.mds)
#プロットに行名を添える
text(par.mds, rownames(par.mds))
#--------------------------------------------------------------#
#MASSパッケージによる非計量MDSの実行
np.mds<-isoMDS(dist,k=2)


plot(np.mds$points)
text(np.mds$points, rownames(np.mds$points))
#--------------------------------------------------------------#
#参考:Jaccard係数の計算
jdist<-vegdist(data, method="jaccard")
#--------------------------------------------------------------#
#事件間の関係でなく,行為間の関係も探れる
#データ行列を転置
datat<-t(data)
dist2<-dist(datat)


par.mds2<-cmdscale(dist2, k=2, eig=FALSE)
plot(par.mds2)
text(par.mds2, rownames(par.mds2))
#--------------------------------------------------------------#

計量MDS,非計量MDSの結果をそれぞれ掲載したいと思います。

計量MDSの分析結果

f:id:arca821:20150613000143p:plain

非計量MDSの分析結果

f:id:arca821:20150613000204p:plain

これらの結果より,たとえば事件2,3,10,14,15は関連があり,同一犯ないしは同じような傾向を持った犯人によるものとみなすことができそうですね。
しかしながら,これら2つの結果が微妙に異なっていることがわかると思います。

計量MDSと非計量MDSのどちらを使えばよいのか,という点についてはテキストにすこし補足を交えて次のようなことが言えます。

  • 計量MDS
  1. 計量MDSは距離データを保持
  2. 地理データなどから地図を再現することも可能
  3. 数値データをがんばって保持しようとするので,対象が増えると……
  • 非計量MDS
  1. 距離データを大小関係(順序性)に単調変換
  2. 計量MDSよりも比較的解釈しやすい結果
  3. 対象数が増えても解釈しやすい結果を得やすい
  4. 心理学では尺度水準に比率尺度をとることはほぼなく,これで十分らしい


現在では非計量MDSが主流とのことです。

また,MDSではデータの行と列を入れ替えることで別のもの同士の関係を見ることもできます。
今回の場合,行に事件,列に行為が設定されていましたが,それを入れ替えて行に行為,列に事件とすることで,事件間の類似度ではなく行為間の類似度を考えることもできます。
スクリプトの一番下のものがそれにあたります。
結果は次のようになりました。
f:id:arca821:20150613001732p:plain

これを見ると,刃物を持った犯人は窃盗も行う傾向にありそうだとか,被害者と会話をする犯人はキスを行う傾向にありソフトな関係(?)を求めているのかもしれないといった仮説が立てられそうですね。

以上がMDSのお勉強R編でした。
Python編はできればうれしいですが,難しいと思います(笑)


最後に,MDSの結果から何が言えるのかということについての所感を簡単に。
今回の結果は共起を基に距離を考えているのであって,相関関係はあるでしょうが因果関係はもちろんありません。
キスをする人だから被害者とも会話をする,という因果関係はあるかもしれませんが,この結果からは論じることができません。
この手の手法はいわゆる「入口の言葉」であって,仮説を作るものにすぎないと思っています。
ここから別の角度での検討や調査を経て考察がなされるべきであり,ここで終わるのはナンセンスだと考えます。
視覚化は大事ですが,データビジュアライゼーションという言葉に踊らされて視覚化して満足しないよう気を付けようと改めて感じます。

*1:実際には次元数は「対象数-1」までとることができますが,人間に解釈できるのは2~3次元程度までですのでそこまで次元を落とすことが一般的です。