※本記事のコードや情報は執筆時点の仕様に基づいています。投資は自己責任であり、必ずデモ環境や少額資金でテストした上で運用してください。
統計学の第一歩:代表値とは何か
「この銘柄の株価は平均いくらか?」という質問は単純そうに見えますが、「平均」にも種類があります。統計学では代表値と呼ばれる「データの中心を表す値」を使って、大量のデータを1つの数字で要約します。
代表値には主に3種類あります。
| 名称 | 意味 | 特徴 |
|---|---|---|
| 平均値(Mean) | すべての値を足して個数で割る | 外れ値の影響を受けやすい |
| 中央値(Median) | データを並べたときの真ん中の値 | 外れ値に強い |
| 最頻値(Mode) | 最も多く登場する値 | カテゴリデータに有効 |
なぜ「平均だけ」では危険なのか
例えば5日間の株価が「100, 101, 99, 102, 500」だったとします。平均値は180.4円になりますが、500円が1日だけ異常に高い日(スプリットや誤値)だった場合、180.4円という数字は実態を全く反映していません。
このような外れ値が存在するとき、平均より中央値の方が「本当の相場感」を正確に表します。中央値はこの場合101円となり、実態に近い値です。
Pythonで実際に計算してみよう
yfinanceを使ってトヨタ自動車(7203.T)の株価データを取得し、3つの代表値を計算します。
import yfinance as yf
import pandas as pd
import numpy as np
from scipy import stats
# ==============================
# 設定エリア
# ==============================
SYMBOL = "7203.T" # トヨタ自動車
PERIOD = "1y" # 過去1年分のデータ
# ==============================
# データ取得
# ==============================
ticker = yf.Ticker(SYMBOL)
df = ticker.history(period=PERIOD)
# 終値を使って代表値を計算
close = df["Close"]
mean_val = close.mean() # 平均値
median_val = close.median() # 中央値
mode_val = stats.mode(close.round(0), keepdims=True).mode[0] # 最頻値(整数に丸めて計算)
print(f"銘柄: {SYMBOL}")
print(f"データ件数: {len(close)}日分")
print(f"平均値 (Mean) : {mean_val:,.1f} 円")
print(f"中央値 (Median): {median_val:,.1f} 円")
print(f"最頻値 (Mode) : {mode_val:,.1f} 円")
print()
# 平均値と中央値の差が大きいほど「外れ値の影響あり」
diff = abs(mean_val - median_val)
print(f"平均と中央値の差: {diff:.1f} 円")
if diff > mean_val * 0.02:
print("→ 差が大きいため、外れ値の影響が出ている可能性があります")
else:
print("→ 差が小さく、データは比較的均一に分布しています")
実行結果の読み方
平均値と中央値の差が大きい場合は、急騰・急落などの「特異な日」が含まれているサインです。バックテストや戦略の評価には中央値を使うと、異常値に引きずられない判断ができます。
まとめ
- 平均値は最もよく使われるが、外れ値に弱い
- 中央値は外れ値の影響を受けにくく、実態に近いことが多い
- 最頻値は価格帯の集中ポイントを知るのに有効
- Pythonならyfinanceとnumpyで数行で計算できる

