「ちゃんと分析するための分析」は運動の前の準備体操みたいなものである

松本 健太郎

 

今回は「課題発見のためのデータ分析手法」を紹介します。

「(ビッグ)データがあるから分析して下さい。何か分かるでしょ?」

と偉い人から言われて、泣く泣く分析作業に取り掛かった戦士たちの血と汗と涙の記録です。

 

”発見”のための分析は必要だ

準備運動もせず、いきなり100kmマラソン走ってくださいと言われたら、誰だって「えっ?」と仰け反りますよね。

しかし、これが多くのデータ分析の現場で起きていることだと考えていただければ幸いです。

どういうデータなのか、どういう課題があるのか、何を解決して欲しいのか、まったく説明もないままに「データ渡すから何かわかるでしょ?」と言われて「えっ?」と仰け反っている人は多いです。

筋肉が目覚めていないのに急に身体を動かしたら、悲鳴をあげるに決まっています。したがって、まずは筋肉を目覚めさせるストレッチをする

これを私は「ちゃんと分析するための分析」だと呼んでいます。

 

通常、データ分析は課題を発見し、課題の原因となる仮説を構築し、仮説を立証して課題を解決します。

重要なのは「どんな課題があるか?」だと考えています。言い換えると「何を解決したいのか?」を決めることです。

これだけはデータ分析だろうが人工知能だろうが何だろうが自動的に導き出されるものではなく、誰かの意思決定の元で「それが課題です」「それを解決したいです」という議論が必要です。

 

しかし、ある程度なら「これが課題じゃないですか?」と提案することはできます。貰ったデータを読みほぐしていけば「こういう傾向が出ているな」「こういう可能性があるな」と、様々な仮説を発見できます。

こうした「ちゃんと分析するための分析」は意外と不人気だし、高名なデータサイエンティストともなると「それぐらいは下処理してから暖簾くぐれや!」と言っているとか言っていないとか。

とはいえ、データ分析業界の深夜食堂を自称したいマメ研としては、こうした下処理もコツコツ励んでおります。

今回紹介する手法が全てではないですが、こういう下処理もあることを知って頂ければ幸いです。

 

横断面データの場合その1

データが横断面データだった場合を考えます。

横断面データって何?という方は、以下のコンテンツを参照してください。

「1+リンゴ」は足せない!質的データと量的データの違いを知ろう
http://www.mm-lab.jp/report/correct-understanding-as-type-and-form-of-data/

 

対象のデータが定性的データ(名義尺度や順序尺度など整理するために数値を使っているデータ)の場合、まずはクロス集計の作成に取り掛かります。層別集計とも言います。

「層別」はQC7つ道具に取り入れられており、傾向や特徴を明らかにするためのメジャーな手法の1つです。

例えばアンケートデータの場合、ユーザー属性という「層」と属性の行動結果(アンケート回答)の二軸に分かれます。

そこで、まずは一方のユーザー属性(性別、年齢別など)で、もう一方の行動結果(例:品質に満足いただけましたか?)を集計します。つまりデータをまず分けるのです。

 

イメージ例

 

次に、分けて集計したデータに対して、差が現れているか確認します。そのためにデータを分けたと言ってもいいでしょう。

差が現れているなら「なぜ差は生まれたのか?」を考えます。これが、1つの課題発見に繋がります。

もちろん、白銀号事件よろしく「犬が吠えなかったことがおかしい!」と同様に「なぜ差は生まれなかったのか?」を考えても良いかもしれません。

差をキチンと見る場合、カイ二乗検定やフィッシャーの直接確率検定を用います。

分割表のセルの期待値に10未満のものがある場合や、表中の数値の偏りが大きい場合はフィッシャーの直接確率検定を用いましょう。

 

> q=matrix(c(67,41,21,3,1,
+            51,34,17,5,2),nrow=2,byrow=T)
> chisq.test(q)

	Pearson's Chi-squared test

data:  q
X-squared = 1.7139, df = 4, p-value = 0.7882

Warning message:
In chisq.test(q) :  カイ自乗近似は不正確かもしれません 


> fisher.test(q)

	Fisher's Exact Test for Count Data

data:  vx
p-value = 0.7994
alternative hypothesis: two.sided

 

分ける、差を見る、違いがあるか確認する。この繰り返しです。

 

横断面データの場合その2

対象のデータが定量的データ(間隔尺度や比例尺度など数値の計算が可能なデータ)の場合、まず箱ヒゲ図の作成に取り掛かります。

「箱ヒゲ図」もQC7つ道具に取り入れられています。文章を書いていて思いましたが、品質管理とは「ばらつきの管理」でもあるので、傾向や特徴を発見する手法と「ちゃんと分析をするための分析」をする手法は非常に近しいのかもしれません。

例えば購買情報データの場合、クロス集計同様にユーザー属性と属性の行動結果(購買履歴)の二軸に分かれます。

そして、一方のユーザー属性で、もう一方の行動結果(例:購入単価)を集計します。同じく、データをまず分けるのです。

 

箱ひげ図

 

後は、分けて集計したデータに対して、差が現れているか確認します。分ける、差を見る、違いがあるか確認する。この繰り返しです。

差を見る場合、便利な手法がt検定です。また、項目が複数ある場合は分散分析でも良いかもしれません。

> t.test(a,b,var.equal=T)

	Two Sample t-test

data:  a and b
t = -18.074, df = 398, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -116.3657  -93.5343
sample estimates:
mean of x mean of y 
  396.675   501.625 

 

定量的データの場合は、SUMではなくCOUNTしてカイ二乗検定も対応可能です。

 

これだけで直ぐに課題発見には至らないでしょうが、通常とは異なる傾向を見つけることで「何が起きたのか?」という端緒は掴めます

ここから「この年齢差でこんな傾向の違いが出るものなの?なんで?」という気付きが得られることは意外と多いです。

 

時系列データの場合

データが時系列データだった場合を考えます。

対象が定性的データであればCOUNTして、或いは定量的データであればSUMして、折れ線グラフの作成に取り掛かります。

日別の時系列データの場合、以下のグラフのようにジグザグしているのではないでしょうか。

 

ジグザグした時系列データの推移

 

こういう場合は7日間移動平均で1週間の変動を除去して、週・月のトレンドのみ見るようにします。傾向に目を向けるのです。

移動平均の作り方は以下のコンテンツを参照してください。

サブスクリプションなビジネスにおける成長と停滞を見極める方法としての移動平均
http://www.mm-lab.jp/analysis/data-analysis-start-with-excel-3rd/

 

7日間移動平均で作成したトレンドと、実際の線を見比べながらも、データの期間を通じてどのような差が生まれているか確認します。

 

ジグザグが慣らされたグラフ

 

ずっと横ばいなのであれば分析をする必要も無いわけですから、その差分が生まれた理由から何らかの端緒は掴めます。時系列データはトレンドを見えやすくする、差を見る。この繰り返しです。

 

もし、複数の時系列データがある場合は、散布図や相関係数を見ても良いかもしれません。

相関係数が高いからといって因果関係があるとは限らないのですが、データ同士の関係を把握するためによくやります。

 

散布図

 

ただし時系列データ同士をそのまま相関で見てはいけません。事前に、そのデータが定常過程なのか単位根検定を行います。

簡単に言うと、時系列のデータの推移が何らかのトレンドに依存する場合、そのトレンドに引きずられて、相関があるように誤判断をしてしまう可能性があるのです。

より詳しく知りたい方は、「単位根検定」や「見せかけの回帰」でググってみて下さい。また、単位根過程を取り除かず相関があると誤判断した可能性がある例は以下のコンテンツを参照してください。

NHKスペシャル「どうすんのよ!?ニッポン」AIに聞く前のデータ処理間違ってた!?
http://www.mm-lab.jp/statistical/askai_data_processing_is_incorrect/

 

まずは単位根検定にてデータを確認します。もし、単位根過程にあると判断された場合は、例えば前日との差分を取りましょう。

dt <- read.csv("data.csv",header=TRUE)
tail(dt)

install.packages("tseries")
library(tseries)

# 単位根検定
adf.test(dt$hoge)
adf.test(diff(dt$hoge))

その結果として、先ほどの散布図はこんな感じになります。

 

前日差分同士のデータの散布図

 

差分の結果で相関関係をみて、関係がありそうなもの、無さそうなものを図に落とすとより分かりやすいかもしれません。

 

まとめ

「発見」の第一歩は、分けること、そして差を見ることだと思っています。

皆さんにとっての「ちゃんと分析するための分析」の第一歩は何でしょうか?ご意見いただければ幸いです。

以上、よろしくお願い致します。