「外れ値は除外すべし!」と統計や機械学習ではよく耳にする(気がしている)。
外れ値の論理的な理解はさておき、いつものごとく実現損益データを使って実装してみる!
目的
外れ値の除外
やりたいこと
実現損益データの実現損益額から、外れ値を除外する
使用するデータ
外れ値を除外する前の実現損益
外れ値を除外した後の実現損益
実装したコード
# データの読み込み
df = pd.read_csv('realized_pl.csv', encoding='shift-JIS')
# 目的の列のデータ型を変換
df['実現損益[円]'].astype(str)
df['実現損益[円]'] = df['実現損益[円]'].str.replace('(' , '-').str.replace(')' , '').astype(int)
# 目的の列を変数に代入
pl = df['実現損益[円]']
# Agg関数を使って、処理を行う
agg_pl = pl.agg(['sum', 'mean', 'max', 'min', 'std', 'var'])
# 得られた値をInt型に変換して、Dataframeを作成
int_agg_pl = agg_pl.astype(int)
pd.DataFrame(int_agg_pl)
# Dataframeを表示
print(int_agg_pl)
外れ値を除外した実現損益額
実装したコード
import numpy as np
df_WithoutOutliers = df[np.abs(df['実現損益[円]'] - df['実現損益[円]'].mean())<(3*df['実現損益[円]'].std())]
df_WithoutOutliers
new_pl = df_WithoutOutliers['実現損益[円]']
agg_new_pl = new_pl.agg(['sum', 'mean', 'max', 'min', 'std', 'var'])
int_agg_new_pl = agg_new_pl.astype(int)
pd.DataFrame(int_agg_new_pl)
実現損益額を可視化
実装したコード
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
fig,axes = plt.subplots(ncols=2,nrows=2)
fig.set_size_inches(12, 10)
sns.distplot(df['実現損益[円]'], ax=axes[0][0])
stats.probplot(df['実現損益[円]'], dist='norm', fit=True, plot=axes[0][1])
sns.distplot(df_WithoutOutliers['実現損益[円]'], ax=axes[1][0])
stats.probplot(df_WithoutOutliers['実現損益[円]'], dist='norm', fit=True, plot=axes[1][1])
気づいたこと
- DataFrameを見ても、グラフを見ても、そんなに大差ない
勝手に「平均より3倍以上離れている値」を外れ値として定義して、除外していたが、
- そんな「なんとなく」で外れ値を決めてよいのか。
- てか、そもそも外れ値ってなんだ?
- 外れ値には意味があって、勝手に取り除いちゃいけないのでは??
なんてことを考えだしたので、調べてみる。
外れ値とは
外れ値とは、得られた観測値の中で真の値の推定値からの残差が異常に大きい値のこと
https://bellcurve.jp/statistics/course/12929.html
別のサイトでは、
医薬研究において、外れ値とは医学的な観点でありえない値
外れ値とはどんな定義で求め方は?統計的検定で除外するのがいいの?|いちばんやさしい、医療統計
今回は、医療データではないので、得られた値すべてを採用するという方針は、取らなくて良いのではないかと断定。
今回使用したデータは、せいぜい173個と、少数だったので、それぞれの値が全体に与える影響はかなり大きい。
まとめ
今回は、外れ値を定義して、実装するというのが目的だったので、
論理的に自分で定義した外れ値が、妥当かどうかについてはちゃんと考えていなかった。
誰かに見せるものでもないので、こんな気楽さで良いのかもしれないが、
誰かの経営決断の根拠となるデータ解析では、
「なにを外れ値としたのか」「なぜ外れ値と定義したのか」「どのように外れ値と定義したのか」
を明確にしないといけないと思う。
今回のまなびをまとめると、
- 外れ値とは、得られた観測値の中で真の値の推定値からの残差が異常に大きい値のこと
- なにを外れ値とするかは、解析の目的、データの規模によって異なる
- それを外れ値とするかどうかは、それを除外した時としない時の結果を比較してみる