データの「真ん中」を表す値には、平均・中央値・最頻値の 3 種類があります。本記事では、それぞれの定義と、株式リターンを扱う際にどれを使うべきかを整理します。

目次

  1. 3 つの代表値
  2. なぜ違いを意識するか
  3. Python で確認する
  4. 最頻値はどう使うか
  5. 歪みのある分布を読み解く
  6. 実務での運用

3 つの代表値

代表値(central tendency)は、分布の「中心」を 1 つの数で要約する指標です。

名称定義性質
平均(mean)値の総和をデータ数で割る外れ値に弱い
中央値(median)並べた中央の値外れ値に強い
最頻値(mode)もっとも多く出る値カテゴリデータ向け

平均は数式で書くと次のとおりです。

xˉ=1ni=1nxi\bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i

中央値は、nn 個のデータを昇順に並べたとき、nn が奇数なら中央の 1 つ、偶数なら中央 2 つの平均です。

なぜ違いを意識するか

株式リターンには 外れ値 が混じりやすいという特徴があります。決算ショックや急騰急落が、平均を大きく引き寄せてしまいます。

  • 1 日だけ +30% 動いた銘柄の月次平均は、本来の傾向よりかなり高めに出ます
  • 中央値は「半分より上か下か」だけを見るため、極端な値の影響を受けません

リターンの代表値を 1 つだけ報告すると、読者が分布の偏りを見落とす可能性があります。両方併記するのが安全です。

Python で確認する

サンプルとして、外れ値を 1 つ含む日次リターンを用意します。

import numpy as np
import 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)
  • 階級分けしたリターン(1%-1\%0%0\%0%0\%1%1\% など)

階級分けは 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 を日本語で書く

まとめ

  • 平均は外れ値に弱く、中央値は外れ値に強い
  • 株式リターンは外れ値が出やすいため、両方併記が安全
  • 最頻値は階級分けやカテゴリデータで活きる
  • 平均と中央値の差は分布の歪みを反映する