データ全体を俯瞰する
大きなサイズのログデータなど、単純かつ大量のデータを前にしたとき、どのように全体の概観を俯瞰したら良いのでしょうか。
まず次のようなことを考えてみます。
- 尺度変換 (無名数化、正規化を含む)
- 要約統計量を求める
- 分布を仮定し、検定する
尺度変換
尺度水準についてはデータの種類の理解と線形回帰ことはじめで説明しました。
たとえば連続データの種類のひとつである時間を取ってみても、何分ごとあるいは何時間ごとなのか、間隔を設定して値を得ることで時刻による推移を可視化します。このときに尺度水準の変換が必要になります。また無名数化というのは単位を持たない数値 (無名数) に変換することで、割合・比率などで異なる基準の値の比較を容易にするためにおこないます。正規化というのはある一定のルールに沿ってデータを変形・加工することです。たとえば分散を 1 平均を 0 とした値に落とし込むことで、異なる基軸の数値を比較可能にします。
要約統計量
要約統計量については統計と区間推定で説明しました。平均や分散が代表的な統計量ですが、たとえばデータの真ん中はどういった値か、散らばり具合はどうか、などを数値化することにより、大量のデータを要約して概観を把握できるようにします。
たとえば有価証券報告書を見ると IT 業界各社の平均年収がわかります。しかし実際には平均年収だけでなく、分散や中央値といった要約統計量が無いと、ものすごく上下の差がある中での平均なのか、ある一部の人だけが高い年収なのか、みんな同じくらいの額なのかといったことがわかりません。このように要約統計量とは全数走査するにしても、母集団から標本を抽出して統計量を求める場合も、対象のデータの分布の適合度を調べる上で欠かせない情報です。
仮説検定と確率分布において基本的な統計量の求め方について説明しました。しかし一般の方にはデータ分析において要約統計量を報告してもなかなかピンと来ないのが現状ではないかと思います。そこで役に立つ可視化方法が「箱ひげ図」です。
箱ひげ図の生成
まずはポアソン分布にしたがう乱数を生成し、統計量を求めてみましょう。今まで説明してきた手順なので詳しい説明は省略します。
import numpy as np
import pandas as pd
s1 = pd.Series(np.random.poisson(5, 10000))
s1.describe()
#=>
# count 10000.000000
# mean 5.026600
# std 2.211421
# min 0.000000
# 25% 3.000000
# 50% 5.000000
# 75% 6.000000
# max 14.000000
#dtype: float64
s2 = pd.Series(np.random.poisson(5, 10000))
s3 = pd.Series(np.random.poisson(5, 10000))
箱ひげ図の「箱」では全データの半数 (25% から 75%) が含まれます。それらのデータは、集団において中間層を形成することから「集団を代表するデータの集まり」とみなせます。そして、箱の中で「最も一般的データを一つ挙げる」とすれば、それが全データを代表する「中央値」ということになります。
さて、いま平均が 5 、次元空間が 10000 のベクトルを 3 つ生成しました。これをプロッティングするのは boxplot 関数を使えばできます。
import matplotlib.pyplot as plt
ax.boxplot([s1, s2, s3])
xticks = ['A', 'B', 'C', ]
plt.xticks([1, 2, 3], xticks)
plt.grid()
plt.ylabel('Length')
plt.xlabel('type')
plt.show()
plt.savefig("image.png")
このように中央値がほぼ 5 の箱ひげ図ができました。
もう少しわかり易くするために、散布図をプロッティングしたものと重ねてみます。
# s1 と同じ長さの成分がすべて 0 である零行列を得る
s0 = pd.Series([0] * len(s1))
ax.plot([s0, s1, s2, s3], marker='.', linestyle='None', )
まとめ
データの全体を俯瞰するには要約統計量が、そしてその可視化には箱ひげ図が使えることがわかりました。