統計
統計とは、データを理解する数学的手法を指します。
統計の分野はあまりに広大なので、表面的になりますが、データサイエンティストに必要なものをかいつまんで説明します。
代表値
平均値
通常、データはどこが中心となっているのかに興味を向けます。
多くは、値の総和をデータ数で割った平均値を使います。
def mean(x):
return sum(x) / len(x)
中央値
データポイントが2つある場合、平均値は両者の中間となります。データが増えるにつれ平均値は変化しますので、場合によっては中央値を使うこともあります。中央値は1つ1つのデータに依存しません。中央値で注意すべき点は、n個のデータポイントがあったとして、1つの値がeだけ増加したとすると平均値はe/nですが、中央値を求めるにはソートしなければなりません。データの1つがeだけ増加した場合、中央値はeとなるか小さくなるかはわかりません。(その他のデータに依存します)
また、平均値はデータの外れ値に対応できないことも注意しないといけません。
def median(v):"""finds the 'middle-most' value of v"""
n = len(v)
sorted_v = sorted(v)
midpoint = n // 2if n % 2 == 1: # if odd, return the middle value
return sorted_v[midpoint]else: # if even, return the average of the middle values
lo = midpoint - 1
hi = midpoint
return (sorted_v[lo] + sorted_v[hi]) / 2
分位数
中央値を一般化したものが分位数です。これは、データ内で特定の割合にある値を表しています。(中央値は50%の位置にあるデータです。)
def quantile(x, p):"""returns the pth-percentile value in x"""
p_index = int(p * len(x))
return sorted(x)[p_index]
モード・最頻値
あまり一般的ではないですが、モードを必要とする場合もあるでしょう。
別名、最頻値と呼びます。
def mode(x):
counts = Counter(x)
max_count = max(counts.values())
return [x_i for x_i, count in counts.iteritems()
if count == max_count]
散らばり
散らばり(dispersion)とは、データの値にどの程度の広がりがあるのかを図るものです。統計では、この値が0に近いければ値にほとんど広がりがないことを示し、この値を大きければ広がりが大きいことを示します。
例えば、最大の要素と最小の要素の差である範囲は、最も簡単な散らばりを示す統計量です。
def data_range(x):
return max(x) - min(x)
分散
複雑な散らばりを示す統計量が、分散です。
def de_mean(x):
x_bar = mean(x)
return [x_i - x_bar for x_i in x] #xとxの平均との差def varience(x):
n = len(x)
deviations = de_mean(x)
return sum_of_squares(deviations) / (n - 1)variance(num_friends)
私たちのデータは何らかの単位(例えば、「知り合いの数」を持ち、代表値も同じ単位)で図ります。範囲も同様です。一方で分散はものと単位を二乗しているため、この値の意味するところを把握しづらいことがあります。
そこで標準偏差を用います。
標準偏差
def stanard_deviation(x):
return math.sqrt(variance(x))
範囲と標準偏差には、前述した平均と同じ外れ値に対する問題があるの注意が必要です。
相関
データに関連性があるという仮説を検証したい場合、最初に共分散を使います。
共分散
共分散は分散を2つの変数に対して、拡張したものです。
分散はある変数が平均からどの程度乖離しているかを図るのに対し、共分散は2つの変数がその平均からどの程度異なっているかを図ります。
def covariance(x, y):
n = len(x)
return dot(de_mean(x), de_mean(y)) / (n - 1)
ドット積は対応する要素の積の和出あることを思い出しましょう。
データxとデータyの対応する要素が、どちらも平均以上または、平均以下であった場合、その和は正の数となります。逆も然り。
このため、大きな整数である共分散は、yが沖井ときはxも大きく、yが小さいときはxが小さい傾向にあることを意味します。また、共分散が0に近い値をもつ場合、こういった傾向は見られません。
しかし、この数値を解釈するのは場合によっては困難です。
そのため、共分散をそれぞれの変数の標準偏差で割った相関係数を用いるのが一般的です。
標準偏差
def correlation(x, y):
stdev_x = standard_deviation(x)
stdev_y = standard_deviation(y)
if stdev_x > 0 and stdev_y >0:
return covarience(x, y) / stdev_x / stdev_y
else:
return 0 #変動がなければ、相関は0
相関係数には単位がありません。-1(負の相関)から1(正の相関)を取ります。特徴として、相関係数は外れ値に敏感です。相関係数を使うことで外れ値を発見することができます。
シンプソンのパラドクス
データ分析上に見られる現象の1つにシンプソンのパラドクスがあります。これはある状況の違いを無視して得た相関係数は、誤った結果を導く可能性を持つということです。
相関係数は同じ種類の値の関係を図るものであるという点が問題です。
多くのデータパターンが存在するなら、同じ種類のデータであるかを確かめなければなりません。
データについての理解を深め、混乱をもたらす要素を事前に排除しておくことのいがこのパラドクスを回避する方法です。これは常に可能ではないです。
その他相関係数についての注意点
相関係数が0の場合、2つの変数には線形関係が存在しないことを示します。
ところが別の種類の関係を持つかもしれません。
相関関係と因果関係
相関関係は因果関係ではないというセリフは有名です。
xとyの間に強い相関関係がある場合、
- xはyの原因である
- yはxの原因である
- 相互に他方の原因
- 両者に影響する第3の原因があるか
- 両者に関係ないか
のいずれかです。
因果関係について、より強い確信を得る方法の1つが無作為化試験です。
ユーザーを2つの同様のグループに無作為に分割し1つのグループに対して異なる経験を与えられるのであれば、異なる経験が異なる結果をもたらしているということがわかります。
補足
- Scipy、StatsModelsなどのライブラリは多様な統計機能を持ってます。
- オンライン学習もあります。