平均と標準偏差は外れ値の影響を受けやすい指標です。本記事では、外れ値に強いパーセンタイル(percentile)と四分位範囲(IQR、Interquartile Range)の使い方を整理し、箱ひげ図の読み方までを確認します。
目次
- パーセンタイルの定義
- 四分位範囲(IQR)
- 外れ値の判定ルール
- Python で計算する
- 箱ひげ図の読み方
- 銘柄を比較する
パーセンタイルの定義
データを昇順に並べたとき、下から % の位置にある値を パーセンタイル(percentile)と呼びます。
- 50 パーセンタイル = 中央値
- 25 パーセンタイル = 第 1 四分位数()
- 75 パーセンタイル = 第 3 四分位数()
四分位数は、データを 4 等分する位置です。 と の間には、中央 50% のデータが入っています。
四分位範囲(IQR)
四分位範囲は次のように定義します。
中央 50% のデータが収まる幅で、外れ値の影響をほぼ受けません。標準偏差と比較すると、次のような対比になります。
| 指標 | 外れ値の影響 | 直感 |
|---|---|---|
| 標準偏差 | 受けやすい | 平均からの距離の平均 |
| IQR | 受けにくい | 中央 50% の幅 |
リターンの分布が裾の重い形(#5-4「正規分布と対数正規分布」)になることを考えると、IQR を併記しておくと安全です。
外れ値の判定ルール
箱ひげ図(boxplot)で慣例的に使われる 外れ値の閾値 は次のとおりです。
この範囲を超えたデータ点を、外れ値の候補として可視化します。1.5 倍は経験則であり、より厳しく見たいときは 3.0 倍に広げる流派もあります。
Python で計算する
pandas の quantile でパーセンタイルが取れます。
import numpy as npimport pandas as pd
# 50 日分のサンプルリターン(乱数 + 大きな外れ値を 1 つ挿入)rng = np.random.default_rng(42)returns = pd.Series(rng.normal(loc=0.0, scale=0.01, size=50))returns.iloc[10] = 0.20 # 外れ値
q1 = returns.quantile(0.25)median = returns.quantile(0.50)q3 = returns.quantile(0.75)iqr = q3 - q1
lower = q1 - 1.5 * iqrupper = q3 + 1.5 * iqr
print(f"Q1 : {q1:.4f}")print(f"中央値 : {median:.4f}")print(f"Q3 : {q3:.4f}")print(f"IQR : {iqr:.4f}")print(f"下限閾値: {lower:.4f}")print(f"上限閾値: {upper:.4f}")
outliers = returns[(returns < lower) | (returns > upper)]print(f"外れ値の数: {len(outliers)}")
describe を使うと、平均・標準偏差・四分位数を一度にまとめて確認できます。
print(returns.describe())箱ひげ図の読み方
箱ひげ図は、IQR の閾値を使った可視化です。
| 部位 | 意味 |
|---|---|
| 箱(box) | から までの範囲 |
| 中央の線 | 中央値() |
| ひげ(whisker) | 外れ値判定に入らない最小値と最大値 |
| 点(point) | 外れ値の候補 |
matplotlib で描画する例です。
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(6, 3))ax.boxplot(returns, vert=False)ax.set_title("Daily returns boxplot")ax.set_xlabel("return")plt.tight_layout()plt.show()横方向に長くしておくと、外れ値の位置感を掴みやすくなります。
銘柄を比較する
複数銘柄のリターン分布を箱ひげ図で並べると、ばらつきの大小が視覚的に比較できます。
sample = pd.DataFrame({ "A": rng.normal(0.0, 0.010, size=200), "B": rng.normal(0.0, 0.020, size=200), "C": rng.normal(0.0, 0.005, size=200),})
fig, ax = plt.subplots(figsize=(6, 4))sample.boxplot(ax=ax)ax.set_title("Boxplot by ticker")ax.set_ylabel("return")plt.tight_layout()plt.show()中央値の位置・箱の高さ・ひげの広がりを比較すれば、リターンの典型値とばらつきが一目でわかります。
注意点
- 1.5 × IQR はあくまで慣例の閾値で、外れ値の正解を保証しません
- パーセンタイルは観測数が少ないと値が安定しません(目安として 30 件以上)
- 株式リターンは負の方向に裾が長くなりやすく、左右非対称な箱ひげ図になります
生成AI へのプロンプト例
複数銘柄の四分位サマリ表を作る例です。
日次リターンの pandas DataFrame(列が銘柄、行が日付)を受け取り、銘柄ごとに次の指標を計算した DataFrame を返す関数 quartile_summary(df) を書いてください。
返す列:- median, q1, q3, iqr- outlier_lower(下限閾値)、outlier_upper(上限閾値)- outlier_count(外れ値の件数)
要件:- 1.5 × IQR を使う- NaN は計算から除外する- pandas 2.2 系の API を使う- docstring を日本語で書くまとめ
- パーセンタイルは外れ値に強い位置指標
- IQR は中央 50% のデータ幅で、ばらつきの頑健な指標
- 1.5 × IQR の閾値で外れ値候補を見つけられる
- 箱ひげ図は IQR を使った可視化、銘柄比較に有効