記述統計
田中VPoE「データの前処理が終わったね。ここからは統計の力を使ってデータを深く理解していこう。まずは記述統計からだ。」
あなた「記述統計って、平均とか標準偏差のことですよね?」
田中VPoE「そうだけど、ただ計算するだけじゃなく、数値の意味を正しく解釈することが大事だ。データの分布の形を理解しないと、平均値に騙されてしまうことがあるからね。」
記述統計とは
記述統計(Descriptive Statistics)は、データの特徴を数値や図表で要約する手法です。データ全体の傾向を把握するための第一歩です。
代表値(中心傾向の尺度)
平均値(Mean)
import pandas as pd
import numpy as np
mean_amount = df['amount'].mean()
print(f"平均注文金額: {mean_amount:,.0f}円")
- 全データの重心
- 外れ値に弱い:1件の超高額注文で大きく変動する
中央値(Median)
median_amount = df['amount'].median()
print(f"中央値: {median_amount:,.0f}円")
- データを大きさ順に並べた中央の値
- 外れ値に強い(ロバスト)
最頻値(Mode)
mode_category = df['category'].mode()[0]
print(f"最も多いカテゴリ: {mode_category}")
- 最も頻繁に出現する値
- カテゴリカル変数に適している
代表値の使い分け
| 代表値 | 適する場面 | 注意点 |
|---|---|---|
| 平均値 | 正規分布に近いデータ | 外れ値で歪む |
| 中央値 | 歪んだ分布(収入、売上) | 外れ値に頑健 |
| 最頻値 | カテゴリカルデータ | 複数存在する場合がある |
実例:NetShop社の注文金額が「平均5,000円、中央値2,500円」の場合、一部の高額注文が平均を押し上げています。「典型的な注文」は中央値の2,500円に近いと解釈すべきです。
散布度(ばらつきの尺度)
分散と標準偏差
variance = df['amount'].var()
std_dev = df['amount'].std()
print(f"分散: {variance:,.0f}")
print(f"標準偏差: {std_dev:,.0f}円")
- 分散:各データ点と平均の差の2乗の平均
- 標準偏差:分散の平方根(元のデータと同じ単位)
変動係数(CV)
cv = df['amount'].std() / df['amount'].mean()
print(f"変動係数: {cv:.2f}")
- 平均に対する標準偏差の比率
- 異なるスケールのデータのばらつきを比較できる
四分位範囲(IQR)
Q1 = df['amount'].quantile(0.25)
Q3 = df['amount'].quantile(0.75)
IQR = Q3 - Q1
print(f"Q1: {Q1:,.0f}円, Q3: {Q3:,.0f}円, IQR: {IQR:,.0f}円")
- 外れ値検出にも使用:Q1 - 1.5IQR 未満、Q3 + 1.5IQR 超を外れ値とする
分布の形状
歪度(Skewness)
skewness = df['amount'].skew()
print(f"歪度: {skewness:.2f}")
| 歪度 | 分布の形 | 特徴 |
|---|---|---|
| ≈ 0 | 左右対称 | 平均 ≈ 中央値 |
| > 0 | 右に裾が長い(正の歪み) | 平均 > 中央値 |
| < 0 | 左に裾が長い(負の歪み) | 平均 < 中央値 |
EC の注文金額は典型的に正の歪みを持ちます(少数の高額注文が右裾を伸ばす)。
尖度(Kurtosis)
kurtosis = df['amount'].kurtosis()
print(f"尖度: {kurtosis:.2f}")
| 尖度 | 分布の形 | 特徴 |
|---|---|---|
| ≈ 0 | 正規分布に近い | 標準的な裾の重さ |
| > 0 | 尖った分布 | 裾が重い(外れ値が多い) |
| < 0 | 平たい分布 | 裾が軽い |
実践:NetShop社データの記述統計
# 全体の記述統計
print(df['amount'].describe())
# カテゴリ別の記述統計
category_stats = df.groupby('category')['amount'].agg([
'count', 'mean', 'median', 'std',
lambda x: x.quantile(0.25),
lambda x: x.quantile(0.75)
])
category_stats.columns = ['count', 'mean', 'median', 'std', 'Q1', 'Q3']
# 平均と中央値の乖離をチェック
category_stats['mean_median_ratio'] = category_stats['mean'] / category_stats['median']
print(category_stats)
解釈のポイント:
- mean/median比が1.5以上なら、分布が大きく歪んでいる
- stdがmeanより大きい場合、ばらつきが非常に大きい
- カテゴリ間でパターンが異なるか注目する
パーセンタイル分析
# 売上のパーセンタイル分析
percentiles = [10, 25, 50, 75, 90, 95, 99]
for p in percentiles:
value = df['amount'].quantile(p / 100)
print(f"P{p}: {value:,.0f}円")
上位顧客の貢献度を把握するのに有効です(パレートの法則:上位20%の顧客が売上の80%を占める)。
まとめ
| 項目 | ポイント |
|---|---|
| 代表値 | 平均・中央値・最頻値を分布に応じて使い分ける |
| 散布度 | 標準偏差でばらつきを把握、CVで異なるスケールを比較 |
| 分布の形 | 歪度・尖度で分布の非対称性と裾の重さを評価 |
| 外れ値 | IQR法(Q1-1.5IQR〜Q3+1.5IQR)で検出 |
| 解釈 | 数値だけでなく、ビジネス文脈で意味を考える |
チェックリスト
- 平均値と中央値の使い分けを説明できる
- 標準偏差と変動係数の違いを理解している
- 歪度の正負が分布の形にどう対応するか説明できる
- IQR法で外れ値を検出できる
次のステップへ
記述統計で「データの全体像」を把握する方法を学びました。次は、サンプルデータから母集団について推測する「推測統計」を学びましょう。
推定読了時間:30分