jnobuyukiのブログ

JavaScriptとR言語を中心に研究活動に役立つwebアプリケーション技術について考えていきます。twitter ID: @j_nobuyuki

ビッグデータ解析と統計的帰無仮説による検証の関係

今日は、昨今大変注目を集めているビッグデータについて思うところを述べてみます。

というのは、こんな記事がFBの拡散で届いたからです。
http://googleenterprise-ja.blogspot.jp/2014/09/google-bigquery.html
これのソース記事はこちらです。
Towards Psychohistory: Uncovering the Patterns of World History with Google BigQuery - GDELT Official Blog

解析の概要

GoogleがBigQueryというビッグデータ解析のための技術を公開しました。これを使うとビッグデータの解析ができるというだけでなく、「とても速く」できるようです。使用例として、ある国のある時期によく似ているのはどの国のいつかが分析されています。

ターゲットとなったのはエジプトの2011年1月27日エジプトのムバラク政権が倒れるきかっけとなった大規模なデモが起きたあたりです。この日の前60日でどの程度紛争に関する報道がなされたのかを調べます。これとよく似たパターンを示す国と時期を探します。GDELTというデータベースがあるそうで、いろいろな国のいろいろなイベントがエントリーされているらしいです。csvファイルで100GBを超えるということは、普通のPCでは解析できないと思います。それを2分半で見つけ出せるのがBigQueryという技術の優れているところです。これがあれば、今までにないような大規模な解析を手軽に実現できる可能性があります。

ピアソンの相関

上記の解析の中では、紛争報道の量を指標に60日間でどの程度の増減があるのかを二つの期間で調べています。二つの期間が似ているかどうかを示す統計量に相関係数というものがあります。
相関係数は‐1から1までの値をとります。もし二つのデータが非常に似ているならば1に近い値を、逆向きの関係(一方が高いと他方は低い)ならば‐1に近い値をとります。相関係数が0ならば、二つのデータセットが統計的に独立しているといえます。

R言語で二つのデータセットの相関係数を解析するならcorr()という関数があります。

#dataset1とdataset2の相関係数
corr(dataset1, dataset2)

無相関検定の方法

相関係数が、統計的に有意なのかを検証する場合、0相関を帰無仮説とする検定を実施します。
相関係数をサンプルの数で調整するとt分布を求めることができます。

t.stats <- (corr(dataset1, dataset2)* sqrt(n-2))/sqrt(1-(corr(dataset1,dataset2)^2))

この値が、たとえば5%危険率を設定した時のt値よりも高ければ、その相関係数は有意に0よりも高いとなります。R言語には、cor.test()という便利な関数もあります。

testRes <- cor.test(dataset1, dataset2)

検定を繰り返す時の注意

さて、上記の無相関検定を含む統計的帰無仮説を伴う検定には一つ注意があります。それは、実際には無相関であっても偶然、統計的に有意な相関があるという結論が得られる可能性があります。これを第1種の過誤と呼びます。第1種の過誤が起きる確率が危険率(もしくはαレベルといいます。5%や1%が伝統的に用いられます。)です。たとえば5%水準を危険率として、20回同じような検定を繰り返すと、本来は有意でないものを1回くらい有意であると結論付けてしまう可能性があるということです。

このように検定を繰り返すと危険率が本来の意図よりも高くなってしまうため、補正が行われます。代表的な補正の一つはBonferroniの補正です。この補正では、危険率を検定の回数で割って調整します。たとえば5%水準で設定した検定を2回繰り返すなら5%÷2で2.5%を危険率に設定します。2回の検定の合計で、第1種の過誤が起きる確率を当初の5%にするという考え方です。

100万回も繰り返したらどうなる?

さて、冒頭の解析について、危険率をチェックしてみると気になる記述が出てきます。コードの中に、相関係数が0.254より大きい場合を抜き出すような記述がみられます。なぜ0.254が基準になるかというと、60日分のデータセットについて、5%水準で無相関検定が有意となる相関係数の閾値だからです。つまり、この解析では、検定の繰り返しによる危険率の調整が行われていないことになります。

この無調整のままの検討はかなり問題に思えます。なぜなら、この解析において、無相関検定は100万回も行われているという記述があるからです。仮にちょうど100万回無相関検定を行うなら、危険率は

0.05 / 1,000,000 = 0.00000005
にしなければなりません。Bonferroniの補正はビッグデータの解析を念頭において作られたわけではありません。そして、このような低い確率を設定するのは、計算の精度の影響も受けますし、慎重に考える必要があるでしょう。ちなみにR言語で無相関係数を実施する場合は、この程度の危険率をせていしても、計算の精度による問題は生じないようです。

仮に100万回の検定のための補正を考慮すると、相関係数の閾値は0.254ではなく、0.633とするべきです。

ビッグデータで統計的帰無仮説を使った解析は有効?

今回の解析では、結果の中に相関係数が0.8を超えるような場合が報告されているので、Bonferroniの補正をかけても無相関検定がそれなりに機能しそうです。しかし、ターゲットの期間に類似した期間がどの程度あるのかを数える場合には、有意となる相関係数の設定が大きく影響しますので、単純にBonferroniの補正を用いてよいかを考える必要があるでしょう。

まとめ

Google BigQueryは、必要な知識を身につければ誰にでもビッグデータ解析が可能になる素晴らしい技術です。しかし、帰無仮説を伴う検定が、ビッグデータ解析にどの程度役立つかは今後慎重に検討する必要があると思います。

追記(2015年1月30日)

よくよく記事を読んでいたら、いくつか勘違いがあったので修正と補足をします。
まず、エジプトの反政府デモを基点にデータを収集する話ですが、前後30日ではなく前60日でした。そして、この60日間とよく似たパターンを示す地域・時間をデータベースから検索します。次に、デモの後60日間およびよく似たパターンを示した期間の次の60日間のデータを使ってもう一度相関分析をします。ここで正の相関が有意であれば、よく似たパターンのデータを検索し、その後60日間のデータから未来が予測できるかもしれないというわけです。

では、この未来予測の部分はうまくいったでしょうか。記事の中で2つの結果が紹介されています。1つは、2009年7月8日からの60日間のドイツです。この期間とエジプトのデモ前60日間のメディア方法のパターンはr = .86というとても高い正の相関を示しました。さらに、その後60日間のデータでは、r = .32という正の相関が示されています。ここでこの0.32という相関係数の解釈が問題になります。上で書いたように、第1種の過誤について何の補正もしなければ、0.32は0.254よりも大きいので、相関係数が統計的に有意です。つまり、過去データによって未来予測がある程度なされたという結論につなげられます。しかし、Bonferroniテストを利用すると0.633以上の相関係数にならなければならないので、0.32では未来予測ができるという結論にうまくつながりません。実は、もう1例(2010年10月4日からの60日間)でも同様の結果になっています。Bonferroniテストのような保守的過ぎるといわれるくらいの厳密さを求めると、今度はうまく予測できていたとしてもそれを証明できなくなります。他の方法を使えばうまく今回取り上げたデータでもうまく証明できるかもしれません。