平均と標準偏差は外れ値の影響を受けやすい指標です。本記事では、外れ値に強いパーセンタイル(percentile)と四分位範囲(IQR、Interquartile Range)の使い方を整理し、箱ひげ図の読み方までを確認します。

目次

  1. パーセンタイルの定義
  2. 四分位範囲(IQR)
  3. 外れ値の判定ルール
  4. Python で計算する
  5. 箱ひげ図の読み方
  6. 銘柄を比較する

パーセンタイルの定義

データを昇順に並べたとき、下から pp % の位置にある値を pp パーセンタイル(percentile)と呼びます。

  • 50 パーセンタイル = 中央値
  • 25 パーセンタイル = 第 1 四分位数(Q1Q_1)
  • 75 パーセンタイル = 第 3 四分位数(Q3Q_3)

四分位数は、データを 4 等分する位置です。Q1Q_1Q3Q_3 の間には、中央 50% のデータが入っています。

四分位範囲(IQR)

四分位範囲は次のように定義します。

IQR=Q3Q1\text{IQR} = Q_3 - Q_1

中央 50% のデータが収まる幅で、外れ値の影響をほぼ受けません。標準偏差と比較すると、次のような対比になります。

指標外れ値の影響直感
標準偏差受けやすい平均からの距離の平均
IQR受けにくい中央 50% の幅

リターンの分布が裾の重い形(#5-4「正規分布と対数正規分布」)になることを考えると、IQR を併記しておくと安全です。

外れ値の判定ルール

箱ひげ図(boxplot)で慣例的に使われる 外れ値の閾値 は次のとおりです。

下限=Q11.5×IQR,上限=Q3+1.5×IQR\text{下限} = Q_1 - 1.5 \times \text{IQR}, \quad \text{上限} = Q_3 + 1.5 \times \text{IQR}

この範囲を超えたデータ点を、外れ値の候補として可視化します。1.5 倍は経験則であり、より厳しく見たいときは 3.0 倍に広げる流派もあります。

Python で計算する

pandas の quantile でパーセンタイルが取れます。

import numpy as np
import 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 * iqr
upper = 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)Q1Q_1 から Q3Q_3 までの範囲
中央の線中央値(Q2Q_2)
ひげ(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 を使った可視化、銘柄比較に有効