データの「真ん中」を表す値には、平均・中央値・最頻値の 3 種類があります。本記事では、それぞれの定義と、株式リターンを扱う際にどれを使うべきかを整理します。
目次
- 3 つの代表値
- なぜ違いを意識するか
- Python で確認する
- 最頻値はどう使うか
- 歪みのある分布を読み解く
- 実務での運用
3 つの代表値
代表値(central tendency)は、分布の「中心」を 1 つの数で要約する指標です。
| 名称 | 定義 | 性質 |
|---|---|---|
| 平均(mean) | 値の総和をデータ数で割る | 外れ値に弱い |
| 中央値(median) | 並べた中央の値 | 外れ値に強い |
| 最頻値(mode) | もっとも多く出る値 | カテゴリデータ向け |
平均は数式で書くと次のとおりです。
中央値は、 個のデータを昇順に並べたとき、 が奇数なら中央の 1 つ、偶数なら中央 2 つの平均です。
なぜ違いを意識するか
株式リターンには 外れ値 が混じりやすいという特徴があります。決算ショックや急騰急落が、平均を大きく引き寄せてしまいます。
- 1 日だけ +30% 動いた銘柄の月次平均は、本来の傾向よりかなり高めに出ます
- 中央値は「半分より上か下か」だけを見るため、極端な値の影響を受けません
リターンの代表値を 1 つだけ報告すると、読者が分布の偏りを見落とす可能性があります。両方併記するのが安全です。
Python で確認する
サンプルとして、外れ値を 1 つ含む日次リターンを用意します。
import numpy as npimport pandas as pd
# 9 日分の通常のリターンと、1 日だけ大きく跳ねた値returns = pd.Series([ 0.001, -0.002, 0.003, 0.000, -0.004, 0.002, 0.001, -0.001, 0.002, 0.250, # 最後の値が外れ値])
mean_value = returns.mean()median_value = returns.median()mode_value = returns.round(3).mode().iloc[0] # mode は同値があると複数返るため先頭を採用
print(f"平均 : {mean_value:.4f}")print(f"中央値: {median_value:.4f}")print(f"最頻値: {mode_value:.4f}")実行結果のイメージは次のとおりです。
平均 : 0.0252中央値: 0.0010最頻値: 0.0020外れ値 1 つで平均が約 2.5% に押し上げられているのに対し、中央値は 0.1% のままです。この差が、代表値選びで気を付けたいポイントです。
最頻値はどう使うか
連続値であるリターンは、まったく同じ値が並ぶことはほぼありません。最頻値が活きるのは、次のような 離散化したデータ です。
- 業種コード(33 業種など)
- 評価ランク(A / B / C)
- 階級分けしたリターン( 〜 、 〜 など)
階級分けは pandas の pd.cut で簡単に作れます。
buckets = pd.cut( returns, bins=[-0.05, -0.01, 0.0, 0.01, 0.05, 0.30], labels=["大幅下落", "下落", "上昇", "大幅上昇", "急騰"],)print(buckets.value_counts())階級ごとの度数が出るため、どの動きが多いかを見たいときに役立ちます。
歪みのある分布を読み解く
代表値の差は、分布の 歪度(skewness、左右の偏り) を反映しています。
- 平均 > 中央値: 右に裾が伸びている(プラス方向に大きな外れ値)
- 平均 < 中央値: 左に裾が伸びている(マイナス方向に大きな外れ値)
- 平均 ≒ 中央値: 左右対称に近い
リターンは一般に左右対称ではなく、暴落時に大きく裾が伸びるといった特徴があります。#5-4「正規分布と対数正規分布」 で正規分布との関係を扱います。
実務での運用
レポートにまとめるときは、次のような併記スタイルが扱いやすいです。
| 指標 | 値 |
|---|---|
| 平均リターン | 0.025 |
| 中央値リターン | 0.001 |
| 観測数 | 10 |
| 外れ値の有無 | あり(+25%) |
外れ値の確認には、四分位範囲(IQR)や箱ひげ図が役立ちます。詳しくは#5-3「パーセンタイルと四分位範囲」 で扱います。
生成AI へのプロンプト例
代表値を表にまとめる関数を作る例です。
pandas Series の日次リターンを受け取り、次の表を返す関数 summarize_central(returns) を書いてください。
戻り値: pandas DataFrame(列: metric, value)- 平均(mean)- 中央値(median)- 最頻値(階級分けして算出、bins と labels は引数で指定可能)- 観測数
要件:- pandas 2.2 系の API を使う- NaN は計算から除外する- docstring を日本語で書くまとめ
- 平均は外れ値に弱く、中央値は外れ値に強い
- 株式リターンは外れ値が出やすいため、両方併記が安全
- 最頻値は階級分けやカテゴリデータで活きる
- 平均と中央値の差は分布の歪みを反映する