渋谷駅前で働くデータサイエンティストのブログ

元祖「六本木で働くデータサイエンティスト」です / 道玄坂→銀座→東京→六本木→渋谷駅前

データ分析をする前に、まず生データを見てみよう

f:id:TJO:20210114133111p:plain

先日ですが、旧知の*1Grahamianさんのこんなツイートが話題になっていました。

何を当たり前のことを言っているんだと眉を顰める向きもあるかもしれませんが、これだけデータサイエンスやら機械学習人工知能)やらが喧伝されている昨今においては、少なからぬ現場で「データはどこかのAPIからバルクでダウンロードしてくるor本番DBから転送してくるだけ」「やってきたデータは中身を見もせずにそのまま統計分析や機械学習などを駆使したデータ分析環境に丸投げ」みたいなことが良く起きているようです。


そこで「まず最初に生データを自分の目で見てみよう」という話が毎回出てくるんですが、何故そんなことをしなければならないのか?というのは実際に生データを見ないで後で大変なことになったという経験のある人でもない限りは、意外と納得してもらえないことが多い印象があります。


ということで、今回の記事では僕がこの5年間手弁当で続けている初級者向けデータサイエンス講座の初回に、「データの性質を知るというのはこういうことなんですよ」という例として取り組んでもらっている例題を再録し、「何故データ分析をする前に生データを見るべきなのか」という疑問への答えとしてみようと思います。なお、この例題は分かりやすさとシンプルさを最優先にしているがためにかなりの部分で厳密さを欠いているので、それらの点については予めご容赦下されば幸いです。

ある覆面データの例


以下に示すのは、実際に上記の初級者向けデータサイエンス講座の冒頭で受講者の人たちに見せている例題です。ぶっちゃけ統計学をきちんと身につけていて、尚且つデータ分析の実務に長じている人であればそれほど難しいものではないはずです。

平均がほぼ等しいが、分散は大小さまざま


まず、データセットは4つあるものとします。それぞれ、何かしらのDBからバルクで取ってきたものとでも思ってください。様々な制約がある都合上、容易にはデータセット全体は見られないものとします。手元にはそれぞれのデータセットの全サンプルから算出した平均と分散の値があり*2

と分かっているものとします。くだんのデータサイエンス講座では「それぞれのデータセットがどのような性質を持っているか、この平均と分散の値だけを見て考えてみて、それを僕に教えてください」と受講者の人たちに尋ねるようにしています。皆さんはいかがでしょうか?


ちなみに過去の受講者から得られた反応を列挙すると、「平均は4つのデータセット全てで同じくらい」「データセット1の分散が最も小さくサンプルのまとまりが良さそう」「データセット3は平均と分散がほぼ同じ」「データセット4は分散が異常に大きい」などなどといったものがありました。

生データの冒頭10行を見てみる


と言っても、大抵の人は平均と分散だけ与えられても何もコメントができないか、特に何も考えずに「釣鐘型をしたよくある分布*3でばらつきの大きさが違うだけなのでは」という無難なコメントをするのが関の山です。そこで、チラ見せというわけではありませんがSQLでSELECT * FROM table LIMIT 10と叩くノリで冒頭10行を見てみましょう*4

d1 d2 d3 d4
11.4116977472064 17.2186164965953 15 20
10.8382605692514 16.444008791852 10 20
7.93596151324559 5.41226313231308 8 20
8.37598205825365 13.8207282000512 6 20
10.0292717131863 0.301879645194654 13 20
9.14284051574639 14.6430543159287 13 20
7.85117787409089 4.76862502772864 11 20
12.6455672804603 14.4377771976863 14 0
10.2203680655839 16.3364567531174 13 20
9.37922900993672 11.5638386020695 10 20

ここからは、データセット1・2は連続値データらしく、データセット3・4は離散値データらしく見えます。特にデータセット4はどうも0と20の2通りしかなさそうです。過去の受講者には、この段階でデータセット1と4の性質を何となく当てられた人がいました。

ヒストグラムを見てみる


何となくデータセット1・4がどんな感じかは見えてきましたが、依然として2・3は手掛かりに乏しく性質がほとんど分かりませんし、かと言って別に1・4も明確に性質が分かったとも言い難い状況です。そこでデータセット全体から作成したヒストグラムをお見せします。

f:id:TJO:20210114132958p:plain

流石にこれなら皆さんも4つのデータセットそれぞれの性質がどんなものか、ご想像がついたことでしょう。

正解


データセット全体を収めたCSVと、それを生成したRスクリプトGitHubに上げておきました。



d1 <- rnorm(n = 10000, mean = 10, sd = 2)
d2 <- c(rnorm(n = 5000, mean = 5, sd = 2), rnorm(n = 5000, mean = 15, sd = 2))[sample(10000, 10000, replace = F)]
d3 <- rpois(n = 10000, lambda = 10)
d4 <- rep(c(0, 20), 5000)[sample(10000, 10000, replace = F)]

ということで、全てのデータセットはサンプルサイズ10000。そしてデータセット1は平均10&分散4の正規分布から生成されたもの、データセット2は分散4は共通なものの平均5と15の2つの正規分布から生成されたサンプルを混合したもの、データセット3はパラメータλが10のポアソン分布から生成されたもの、最後にデータセット4は0と20の二値を取る*5もの、だったのです。


この中で、冒頭10行を見た段階で確実に分かるのはデータセット4ぐらいですが、仮にランダムに抽出した100行だけ得られたとしてそのヒストグラムを描いてみるだけでも、かなりの情報が得られます。

f:id:TJO:20210114163955p:plain

即ち、データセット1は正規分布っぽい釣鐘型をしていますし、2は二峰性を強く窺わせますし、3は知っている人ならピンと来るであろうポアソン分布独特の形状をしていますし、4は見るからに二値なのが分かるわけです。なお、実はデータセット3に関してはポアソン分布の「平均と分散が等しい」という性質を知っていれば類推することは可能だったりします。


なお、この例題は統計学の初級者向けコースで良く言われる「平均や分散だけを見てもデータセットの全体像は分からない」という人口に膾炙したテーマの例にもなっています。一般にはその例としてべき分布のようなロングテールのデータセットが引き合いに出されることがありますが、ロングテールでなくとも平均や分散だけではデータセットの全体像を掴めない例は沢山ありますよ、ということで。


闇雲に高度なデータ分析に回す前に、生データに対してやるべきことは沢山ある


以上の例題は「とにかく四の五の高度なデータ分析でこねくり回す前にまずは生データを自分の目で見なさい」という教訓として出しているものなのですが、そもそも論として個人的な経験からは「生のデータセットを多数自分の目で見ていれば段々と『そのデータの特性』*6が一目でピンと来るようになる」ものだと考えています。


例えば、僕の場合は研究者時代から時系列データには慣れ親しんでいるのですが、そのせいもあって時系列データをパッと見た時に「トレンドや単位根過程を伴っているか」「季節調整があるか」「共和分とまでは言わないにしても何かしらの均衡関係があるか」「何かしらの共変量の影響を受けている可能性があるか」というのが、それとなく分かってくるようになりました。同じようなことは、一般的なテーブルデータセットやそれこそ自然言語処理のテキストデータセットなどでも言えるのではないかと思っています。


基本的に、統計学にせよ機械学習にせよ多くのデータ分析手法は「ヒトの暗黙知を数値的に確かならしめた上で機械的に再現できるようにするもの」だと僕は理解しています。その観点から見れば、他ならぬ自分自身の目でもまた現実世界のデータに対して「学習」「分析」できるはずなのです。そしてそれこそが、適切なデータ分析によって価値あるアウトプットを得る上で最も効果的かつ効率的なスクリーニングなのだと考えています。


確かに莫大なデータセット全体を自分の目と手で捌き分析することは難しいですし、コンピュータ上で統計学機械学習を駆使することで相対するべきでしょう。しかしながら、そのスクリーニングチェックとして(例えば)ランダムに抽出した100サンプル程度を自分の目で眺めるだけでも大いに意味がありますし、何よりもクイックで効率も良いのです。今やDBに格納された莫大なデータセットを相手にデータ分析をするのが当たり前の時代ですが、それでも抽出サンプルを通じて「生データを見てみる」ことは是非実践していただきたいと思う次第です。

*1:Twitterでは、の意

*2:データ取得ツールにデフォルトで備わっている要約機能のようなものを想定している

*3:つまり正規分布

*4:そんなSQLを叩ける奴ならこの先のデータチェックもできるだろうというツッコミはご容赦

*5:二項分布から生成したものと同義ですが、rbinomで生成すると微妙にぶれるので便宜上決め打ちにしてあります

*6:ここでは非常に曖昧で主観的にマッピングされるものを想定している