Data Science by R and Python

統計学を、広く、深く、わかりやすく。

相関係数の有意性を確かめる方法について -相関係数について1歩踏み込む-

相関係数とは?

相関係数については、8月のエントリーを参照してもらうと良いかと思います。

「相関係数」ってなんですか? -意味と利点と欠点をわかりやすく- - Data Science by R and Python

簡単に説明しておくと、相関というのは「2つの変数の間に存在する、直線的関係」を指しています。相関係数というのは、その直線度合いを0~1の数字で表したものと言えます。ただし、値には大小関係しかありません(相関係数0.8は、相関係数0.4のときよりも2倍相関が強いという意味ではないので注意してください)。

さて、データの分析・解析に関わらず、いくつかの変数があるデータでは、相関係数を計算して、変数の間に関係があるかをチェックするのが一般的です。前のエントリーにもあるようにこれは「直線的な関係」しか調べられないですし、色々と制約もあり、いちいち確認するのは面倒ですが、それでも使い勝手がいいのでみんな使っています。

さて、今日のモチベーションは相関係数を説明することではありません。「相関係数」を求めたときに、果たして求めた相関係数が「有意」であるか、「有意」ではないかに興味があるとします。つまり、求められた「相関係数」は統計的に意味がある数字であるのか、それとも「偶然」や「見かけ上」相関があるようにみえているだけで、本当は相関がない可能性もあるのか。この点を調べていきたいとします。つまり、「求めた相関係数が0である可能性があるか、ないか」を確認する方法についてです。

特に、相関係数を計算したあとに、その相関係数が「意味があるのか、ないのか」をチェックせずに進めてしまったりすると、問題になるかもしれませんし、「0.31の相関がありました!」のような、統計的に意味があることが保証されない報告をしてしまうことになるかもしれません。

なので、今回は求めた相関係数が有意かどうかを確かめる方法について考えていきます。


相関係数が統計的に有意(意味があるか)を検定する方法の前準備

まず、相関係数(ピアソンの積率相関係数)が有意かどうかを調べるためには、相関を計算する変数の同時分布が「2変量正規分布」に従うのかを調べておく必要があります(この仮定が成立しない場合は相関係数が有意かどうかを統計的に確かめることは難しいです)。

そのためには、次の事実を利用します。「2つの確率変数が、それぞれ正規分布(平均・分散は異なっても良い)に従うとき、その同時分布は正規分布に従う」。つまり、相関を確認したい2つの変数それぞれが正規分布に従うことを確認すればよいということになります。

直感的な方法(図で診断する!)

まず1つ目の簡単な方法は、「ヒストグラム」です。ヒストグラムの外形を見たときに、それが正規分布の外形と一致しているのかを確認します。そのためには、得られたデータから平均と分散を計算して、それらをパラメータにする理論的な正規分布ヒストグラムの上から書くのが良いでしょう。この方法はとても直感的で、おそらく確認の方法として粗くはありますが、強力です。

それから、もう1つはqqnormを用いる方法です。qqplotは、正規分布の累積分布関数を用います。細かい説明は、英語のwikipediaを確認してください。(Q–Q plot - Wikipedia, the free encyclopedia)。簡単に説明をしておくと、累積分布の25%点と75%点を直線で結び、その直線上にデータが乗るかを確認することで、正規分布に従っているかを確かめる方法です。

f:id:tomoshige_n:20140926220232p:plain

ここまで紹介してきた2つの方法を、手軽にできるようにするために、以下にRで作成した関数を添付しておきます。

x_norm = rnorm(1000,10,5)
x_unif = runif(1000)

range = function(val){
	if((class(val) == 'numeric')| (class(val)=='vector')){
		diff = (max(val) - min(val))/10
		return(seq(min(val)-diff,max(val)+diff,(max(val)-min(val))/1000))
	}else{
		print("only one variable available")
	}
}

norm_diag = function(x){
	par(mfcol=c(1,2))
	diff = (max(x) - min(x))/10
	xrange = c(min(x)-diff,max(x)+diff)
	hist(x,breaks=floor(length(x)/20),freq=F,xlim=xrange)
	par(new=T)
	points(range(x),dnorm(range(x),mean=mean(x), sd = sd(x)),type="l",xlim=xrange)
	segments(x0=mean(x),y0=0,x1=mean(x),y1=dnorm(mean(x),mean(x),sd(x)),lty=2,col="red",lwd=1.5)	
	qqnorm(x,cex=0.5)
	qqline(x,col="red",lty=2)
}

#変数が正規分布の場合
norm_diag(x_norm)

#結果はOKだと視覚的に確認できるはず

#変数が一様分布の場合
norm_diag(x_unif)

#結果はNOだと視覚的に確認できるはず

理詰めしたいときの検定

ですが、このままだと視覚的確認なので不安だという人のために、もう1つ統計的仮説検定を用いて正規分布に従うかどうかを検定する方法を紹介します。この検定は「コルモゴロフ・スミルノフ検定」と言います。仮説の設定をまずは確認しましょう。

ここで、注意が必要なのは「帰無仮説が棄却されれば、正規分布を仮定するのは適切ではない」という結論になることです。なので、正規分布を仮定しても、大きな問題にならないケースであることを示すには、P値が大きいことが必要です。

この検定の中身への言及はさけますが、簡単に言えば、経験分布関数と、理論的な分布関数の差の最大値を検定統計量として用いています。詳しくは、医学統計学の事典(丹後俊郎, 小西貞則 2010)を参考にしてください。この他、wikipediaなどにも記述があります。この検定をRで行うためには、以下のコマンドを実行すればOKです。簡単ですね。

#平均と分散をきちんと指定する必要があります
#正規分布から発生させたデータの場合
> ks.test(x_norm,"pnorm",mean=mean(x_norm),sd=sd(x_norm))

#	One-sample Kolmogorov-Smirnov test

#data:  x_norm
#D = 0.02, <b><span style="color: #ff2600">p-value = 0.8185</span></b>
#alternative hypothesis: two-sided

#一様分布から発生させたデータの場合
> ks.test(x_unif,"pnorm",mean=mean(x_unif),sd=sd(x_unif))

	One-sample Kolmogorov-Smirnov test

data:  x_unif
D = 0.0599, p-value = 0.001522
alternative hypothesis: two-sided


結果を見れば、(上)正規分布から発生させた乱数では帰無仮説は棄却できませんが、(下)一様分布から発生したものは帰無仮説が棄却されてしまいます。よって、(上)は正規分布を仮定しても問題にはならなそうだということが推察され、(下)は正規分布を仮定するのは適切ではないという結論を得ます。

ちなみに、この他にも、検定手法はいろいろ提案されています。医学統計学の事典には、アンダーソン・ダーリング検定などが紹介されています。検定には、それぞれ特徴がありますので、他の検定手法では有意ではないなどの結果が出ることもあります。

※注意)ここで、注意ですが、「帰無仮説が棄却できなかった = 正規分布に従っている」は間違いです。帰無仮説が棄却できないというのは、帰無仮説が有意水準5%で棄却できないだけで、「変数が正規分布に従っている」と安易に結論づけてはいけません。

相関係数の検定

さて、ここまでの結果、相関を見たい変数が正規分布に従うと仮定しても問題ないとわかったとしましょう。すると、始めて相関係数が有意かどうかを検定することができます。

まずは、仮説の設定から始めます。
「帰無仮説:相関係数が0である」
「対立仮説:相関係数は0ではない」

ここで、「相関係数が0である」というのは、確率変数には正規分布を仮定していますから、独立性の検定と同等です。これを検定するためには、2つの方針があります。1つ目は尤度比検定です。もう1つが、帰無仮説の元での標本相関係数の分布を求めるというやり方です。今回は後者を考えます。

さて、帰無仮説の元での標本相関係数の分布は、t分布に従います。この証明は、非常に難解です。興味のある人は以下の資料をご覧下さい。おそらく、ほとんどの人がやらないでもいいんじゃないでしょうか...
Pearson product-moment correlation coefficient - Wikipedia, the free encyclopedia
Correlation Coefficient--Bivariate Normal Distribution -- from Wolfram MathWorld


こんな難しいことを知らなくても、Rを使えば簡単に検定を行うことができます。2つの正規分布に従う確率変数の間に相関があるかないかは、次のコマンドで実行できます。

#無相関
> cor.test(x_norm, rnorm(1000))

#Pearson's product-moment correlation
#
#data:  x_norm and rnorm(1000)
#t = 0.097, df = 998, p-value = 0.9227
#alternative hypothesis: true correlation is not equal to 0
<b><span style="color: #ff2600">#95 percent confidence interval:
# -0.05893338  0.06505162</span></b>
#sample estimates:
#        cor 
#0.003070921 

#相関あり
> cor.test(x_norm, x_norm + rnorm(1000,0,8))

#Pearson's product-moment correlation
#
#data:  x_norm and x_norm + rnorm(1000, 0, 8)
#t = 20.5626, df = 998, p-value < 2.2e-16
#alternative hypothesis: true correlation is not equal to 0
<span style="color: #ff2600"><b>#95 percent confidence interval:
# 0.5004476 0.5876367</b></span>
#sample estimates:
#      cor 
#0.5455164 

これを確認して、有意であれば95%信頼区間が0をまたがない出力を得ます。前者は0を跨いでしまっているので、有意ではないですね。一方で、後者は0をまたいでないので、有意に相関があることがわかります。

まとめ

今回は、相関係数が有意であるかどうかの検定について書きました。相関係数が有意であるかどうかを統計的に確認するのは、様々な仮定が必要です。そして、満たさないデータもたくさんあります。ですが、満たすデータもあるはずですし、そのような場合には、上記のような検定は効果を発揮すると思います。

でも、満たさない場合も扱いたい!そんな人もいらっしゃるかもしれません。次回は、正規分布に従わない場合に変数同士の関係性(相関ではなく)を確認する方法の1つである「スピアマンの順位相関」について、それから見かけ上の相関(疑似相関)を取り除いて純粋に2つの変数の関係性を確認するための考え方である「偏相関」について書きたいと思います。

この記事の続き

tomoshige-n.hatenablog.com


(告知)イベントを開催します。

統計の初心者の方(少しやったことある人も対象)向けに、データフェストというイベントを開催します。2日間でRの操作+実際の解析を行ってみようという試みです。興味のある方は、以下のリンクから詳細をご確認ください。(サイトが90年代後半感があるのは使用です笑)
http://datafest.jp/


参考文献