ぺーぱーの日々

上機嫌でいること、夢中でいることを目標に、今日も色んなことに手を出します。

MENU

自分なりにストーリーを作り、手を動かし、外れ値について再度理解を試みた

「外れ値は、確認次第除外すべし」とは一概には言えないかもしれない - ぺーぱーの日々

前に外れ値について調べたけど、わかったようなわからないような感じなので、自分なりにストーリーを作って、手を動かしてみて再度理解してみようと努めてみた。

 

外れ値は、邪魔者だと認知されている。

統計とか、データ解析の世界では。

そもそも統計とかデータ解析の目的は

正確な全体像を把握したい

「全体像を把握したい」というのがイマイチぴんとこないので、

具体例で考えてみる

全国の18歳男子の平均身長を知りたい

(全員を調べるのは現実的に難しいから)

サンプルを集める

それを基に

「全国の18歳男子の平均身長は、●CM!」という結論を出す。

 

で、外れ値は、集めてきたサンプルの中に含まれている(かもしれない。)←毎回ではないので。

 

もう一度、統計とかデータ解析の目的を振り返ると、

正確な全体像を把握したい

 

今回の場合で言うと、「正確な、全国の18歳男子の平均身長を把握したい」と言える。

例えば、10cmとか、300cmとかがサンプルの中にあったら、即除外。

たぶん、これは問題なし。

(10cmの18歳。ちょっとでかくて、ちょっと長生きなアリ?)

問題は、130cmとか、210cmとか、現実でもいそうな子たちを除外するかどうか。

街中歩いていても、ゲームオブスローンズのなんて名前かわすれたけど、ちっちゃい王子みたいな人もいるし、アメリカにわたってバスケをするであろう見上げちゃうおっきい人もいるから、残すべきか悩ましい。。。

場合分けして考える

現実的に考えて、全国の18歳男子の平均身長は、大体170cmぐらいだろう。

なので、この(仮)答えからびっくりするぐらい離れなければ、130cmの子も210cmの子もサンプルとして採用できる。

推定する上で、重要になってくるのが、「データ量」だと思う。

どれくらいデータ量があれば、130cm,210cmをサンプルとして採用できるか(母集団の推定に悪い影響を与えないのか)をPythonを使って実装してみた。

 

検証手順

  1. 150~190の乱数を生成する(平均身長+-20)
  2. 生成した平均をとる
  3. 130(外れ値候補)をサンプルに加える
  4. 130を加えた平均をとる
  5. 外れ値候補の影響度を測る

実行結果

乱数生成数

(サンプルサイズ)

外れ値なしの

平均身長

外れ値ありの

平均身長

外れ値の影響度
10 167.000 163.636 0.034
50 168.700 167.941 0.008
100 169.260 168.871 0.004
500 168.848 168.770 0.001
1000 169.664 169.624 0.000

実装したコード

size_100 = list(np.random.randint(150,190,size=100))
avg_length = sum(size_100)/ len(size_100)
print(avg_length)

new_l = size_100.append(130)
new_avg_length = sum(size_100)/ len(size_100)
print(new_avg_length)

まだ、関数を使えないので、サンプルのセット分手動で実装(汗)

乱数生成ぐらいしか、プログラミングの恩恵を受けられていない。。。

 

悪銭苦闘しながら関数を使ってみた。

import numpy as np


def create_avg(sample_size, outlier):
sample = list(np.random.randint(150, 190, size=sample_size))
avg_sample = sum(sample) / len(sample)
new_sample = sample.append(outlier)
avg_new_sample = sum(sample) / len(sample)
return sample_size,avg_sample, avg_new_sample

size_10 = create_avg(10, 130)
print(size_10)

size_100 = create_avg(100, 130)
print(size_100)

size_200 = create_avg(200, 130)
print(size_200)

size_500 = create_avg(500, 130)
print(size_500)

size_1000 = create_avg(1000, 130)
print(size_1000)

結論

サンプル数が1000以下の場合、130cm,210cmの子たちは外れ値認定したほうが良い。

ごめんなさい。僕の粗い粗いデータ分析では漏れてしまいました。。。