Pythonでデータ分析をしていて、「平均値や中央値を簡単に計算したい」「わざわざnumpyやpandasを使うほどでもない」と思ったことはありませんか?
そんなときに便利なのが、Pythonに最初から入っているstatisticsモジュールです。外部ライブラリをインストールしなくても、基本的な統計処理がすぐにできます。
この記事では、statisticsモジュールの全関数を、使い方と実例とともに詳しく解説します?
statisticsモジュールとは?

基本的な特徴
Pythonの標準ライブラリ
- Python 3.4以降に標準搭載
- 外部ライブラリのインストール不要
- 軽量で手軽に使える
どんなときに便利?
- 簡単な統計計算をしたいとき
- 学習や練習でデータ分析を始めるとき
- 小規模なデータ処理
- numpyやpandasが使えない環境
基本的な使い方
import statistics
# リストのデータで平均値を計算
data = [1, 2, 3, 4, 5]
average = statistics.mean(data)
print(f"平均値: {average}") # 平均値: 3
平均値・代表値の計算関数

mean() – 算術平均
基本的な使い方
import statistics
# 基本の平均値計算
scores = [85, 90, 78, 92, 88]
avg_score = statistics.mean(scores)
print(f"平均点: {avg_score}") # 平均点: 86.6
実用例:月間売上の平均
monthly_sales = [120000, 150000, 180000, 140000, 160000]
avg_sales = statistics.mean(monthly_sales)
print(f"月平均売上: {avg_sales:,.0f}円") # 月平均売上: 150,000円
fmean() – 高速な浮動小数点平均
Python 3.8以降で使用可能な高速版のmean関数です。
import statistics
# 大量データの高速処理
large_data = list(range(1000000))
fast_avg = statistics.fmean(large_data)
print(f"高速平均: {fast_avg}")
meanとfmeanの違い
mean()
: 正確性重視、Decimalにも対応fmean()
: 速度重視、floatに特化
median系 – 中央値の計算
median() – 基本の中央値
import statistics
# 奇数個のデータ
odd_data = [1, 3, 5, 7, 9]
median_odd = statistics.median(odd_data)
print(f"中央値(奇数): {median_odd}") # 中央値(奇数): 5
# 偶数個のデータ
even_data = [1, 3, 5, 7]
median_even = statistics.median(even_data)
print(f"中央値(偶数): {median_even}") # 中央値(偶数): 4.0
median_low() / median_high() – 偶数個データの中央値選択
import statistics
data = [10, 20, 30, 40]
low_median = statistics.median_low(data)
high_median = statistics.median_high(data)
print(f"低い方の中央値: {low_median}") # 低い方の中央値: 20
print(f"高い方の中央値: {high_median}") # 高い方の中央値: 30
median_grouped() – グループ化データの中央値
import statistics
# 区間データの中央値計算
grouped_data = [1, 2, 2, 3, 4, 4, 4, 4, 5, 5]
grouped_median = statistics.median_grouped(grouped_data, interval=1)
print(f"グループ化中央値: {grouped_median}")
mode系 – 最頻値の計算
mode() – 単一の最頻値
import statistics
# 明確に最頻値が決まる場合
clear_mode = [1, 2, 2, 2, 3, 4]
most_frequent = statistics.mode(clear_mode)
print(f"最頻値: {most_frequent}") # 最頻値: 2
# 文字列データでも使用可能
colors = ['red', 'blue', 'red', 'green', 'red']
popular_color = statistics.mode(colors)
print(f"人気の色: {popular_color}") # 人気の色: red
multimode() – 複数の最頻値
import statistics
# 複数の最頻値がある場合
multi_data = [1, 1, 2, 2, 3]
all_modes = statistics.multimode(multi_data)
print(f"すべての最頻値: {all_modes}") # すべての最頻値: [1, 2]
# 最頻値がない場合(すべて同じ頻度)
equal_data = [1, 2, 3, 4]
equal_modes = statistics.multimode(equal_data)
print(f"等頻度の値: {equal_modes}") # 等頻度の値: [1, 2, 3, 4]
特殊な平均値
harmonic_mean() – 調和平均 速度や率の平均計算に適しています。
import statistics
# 速度の平均(往復で異なる速度)
speeds = [60, 40] # 行き60km/h、帰り40km/h
harmonic_avg = statistics.harmonic_mean(speeds)
print(f"調和平均速度: {harmonic_avg:.1f}km/h") # 調和平均速度: 48.0km/h
# 投資収益率の平均
rates = [0.05, 0.10, 0.15] # 5%, 10%, 15%
avg_rate = statistics.harmonic_mean([1+r for r in rates]) - 1
print(f"調和平均収益率: {avg_rate:.3f}")
geometric_mean() – 幾何平均 成長率や倍率の平均計算に使用します。
import statistics
# 成長率の平均
growth_rates = [1.1, 1.2, 1.05] # 10%, 20%, 5%の成長
geo_mean = statistics.geometric_mean(growth_rates)
print(f"幾何平均成長率: {geo_mean:.3f}") # 幾何平均成長率: 1.116
# 投資の年間平均リターン
annual_returns = [1.15, 0.95, 1.08, 1.12] # +15%, -5%, +8%, +12%
avg_return = statistics.geometric_mean(annual_returns)
print(f"年間平均リターン: {(avg_return-1)*100:.1f}%")
分散・ばらつきの計算関数

variance系 – 分散の計算
variance() – 標本分散
import statistics
# テストの点数分散
test_scores = [85, 90, 78, 92, 88, 76, 95]
score_variance = statistics.variance(test_scores)
print(f"点数の分散: {score_variance:.2f}")
# 平均値が既知の場合(計算効率化)
known_mean = statistics.mean(test_scores)
variance_with_mean = statistics.variance(test_scores, xbar=known_mean)
print(f"平均既知での分散: {variance_with_mean:.2f}")
pvariance() – 母集団分散
import statistics
# 全体データが分かっている場合の分散
population_data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
pop_variance = statistics.pvariance(population_data)
print(f"母集団分散: {pop_variance:.2f}")
# 母平均が既知の場合
known_pop_mean = 5.5
pop_var_with_mean = statistics.pvariance(population_data, mu=known_pop_mean)
print(f"母平均既知での分散: {pop_var_with_mean:.2f}")
stdev系 – 標準偏差の計算
stdev() – 標本標準偏差
import statistics
# 売上のばらつき分析
daily_sales = [120, 130, 110, 140, 125, 135, 115]
sales_stdev = statistics.stdev(daily_sales)
sales_mean = statistics.mean(daily_sales)
print(f"売上平均: {sales_mean:.0f}")
print(f"売上標準偏差: {sales_stdev:.2f}")
print(f"変動係数: {sales_stdev/sales_mean*100:.1f}%")
pstdev() – 母集団標準偏差
import statistics
# 製品の品質管理(全数検査)
product_weights = [100.2, 99.8, 100.1, 99.9, 100.0, 100.3, 99.7]
weight_stdev = statistics.pstdev(product_weights)
target_weight = 100.0
print(f"重量標準偏差: {weight_stdev:.3f}g")
print(f"品質安定性: {'良好' if weight_stdev < 0.5 else '要改善'}")
quantiles() – 分位数の計算
import statistics
# 成績の四分位数分析
all_scores = [65, 70, 75, 80, 85, 90, 95, 72, 88, 92, 68, 78, 82, 87, 93]
# 四分位数(デフォルト)
quartiles = statistics.quantiles(all_scores)
print("四分位数:")
print(f"第1四分位数(Q1): {quartiles[0]:.1f}")
print(f"第2四分位数(Q2/中央値): {quartiles[1]:.1f}")
print(f"第3四分位数(Q3): {quartiles[2]:.1f}")
# 十分位数
deciles = statistics.quantiles(all_scores, n=10)
print(f"\n十分位数: {[f'{d:.1f}' for d in deciles]}")
# パーセンタイル(百分位数)
percentiles = statistics.quantiles(all_scores, n=100)
print(f"95パーセンタイル: {percentiles[94]:.1f}")
実用的な活用例
例1: 学習データの分析
import statistics
# 学生の成績データ
student_scores = {
'数学': [85, 90, 78, 92, 88, 76, 95, 82, 89, 91],
'英語': [88, 85, 90, 87, 92, 79, 88, 85, 90, 86],
'理科': [92, 88, 85, 90, 87, 91, 89, 94, 86, 88]
}
print("科目別成績分析")
print("-" * 40)
for subject, scores in student_scores.items():
mean_score = statistics.mean(scores)
median_score = statistics.median(scores)
stdev_score = statistics.stdev(scores)
print(f"{subject}:")
print(f" 平均点: {mean_score:.1f}")
print(f" 中央値: {median_score:.1f}")
print(f" 標準偏差: {stdev_score:.2f}")
print(f" 安定性: {'安定' if stdev_score < 5 else '不安定'}")
print()
例2: 売上データの傾向分析
import statistics
# 月別売上データ
monthly_sales = [
1200000, 1350000, 1180000, 1420000, 1250000, 1380000,
1450000, 1320000, 1280000, 1400000, 1350000, 1500000
]
# 基本統計量
mean_sales = statistics.mean(monthly_sales)
median_sales = statistics.median(monthly_sales)
stdev_sales = statistics.stdev(monthly_sales)
# 四分位数で成績評価
quartiles = statistics.quantiles(monthly_sales)
print("年間売上分析レポート")
print("=" * 30)
print(f"平均売上: {mean_sales:,.0f}円")
print(f"中央値: {median_sales:,.0f}円")
print(f"標準偏差: {stdev_sales:,.0f}円")
print(f"変動係数: {stdev_sales/mean_sales*100:.1f}%")
print()
print("四分位数分析:")
print(f"第1四分位数: {quartiles[0]:,.0f}円")
print(f"第2四分位数: {quartiles[1]:,.0f}円")
print(f"第3四分位数: {quartiles[2]:,.0f}円")
print()
# 異常値の検出(簡易版)
q1, q2, q3 = quartiles
iqr = q3 - q1
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
outliers = [sales for sales in monthly_sales
if sales < lower_bound or sales > upper_bound]
if outliers:
print(f"異常値の可能性: {outliers}")
else:
print("異常値は検出されませんでした")
例3: 投資パフォーマンスの分析
import statistics
# 各年の投資リターン(1.0 = 変動なし)
annual_returns = [1.15, 0.92, 1.08, 1.22, 0.95, 1.18, 1.05, 0.88, 1.12, 1.25]
# 算術平均リターン
arithmetic_mean = statistics.mean(annual_returns)
print(f"算術平均リターン: {(arithmetic_mean-1)*100:.2f}%")
# 幾何平均リターン(複利効果を考慮)
geometric_mean = statistics.geometric_mean(annual_returns)
print(f"幾何平均リターン: {(geometric_mean-1)*100:.2f}%")
# リスク指標(標準偏差)
risk = statistics.stdev(annual_returns)
print(f"リスク(標準偏差): {risk*100:.2f}%")
# シャープレシオ風の指標(簡易版)
excess_return = geometric_mean - 1.0 # リスクフリーレートを0と仮定
sharpe_like = excess_return / risk
print(f"リスク調整後リターン: {sharpe_like:.3f}")
# 最悪のケースと最良のケース
worst_return = min(annual_returns)
best_return = max(annual_returns)
print(f"最悪年: {(worst_return-1)*100:.1f}%")
print(f"最良年: {(best_return-1)*100:.1f}%")
statisticsとnumpy/pandasの使い分け

statisticsが適している場面
軽量な処理
import statistics
# 簡単な計算にはstatisticsが最適
data = [1, 2, 3, 4, 5]
avg = statistics.mean(data) # シンプル
標準ライブラリのみの環境
- サーバー環境で外部ライブラリが制限されている
- 教育環境やサンドボックス環境
- 組み込みシステムでの軽量処理
numpy/pandasが適している場面
大量データの処理
import numpy as np
# 大量データはnumpyが高速
large_data = np.random.randn(1000000)
avg = np.mean(large_data) # より高速
複雑な統計処理
- 多次元配列の処理
- 高度な統計関数
- データフレーム操作
性能比較の例
import statistics
import numpy as np
import time
# テストデータ
small_data = list(range(1000))
large_data = list(range(100000))
# 小さなデータでの比較
start = time.time()
stats_result = statistics.mean(small_data)
stats_time = time.time() - start
start = time.time()
numpy_result = np.mean(small_data)
numpy_time = time.time() - start
print("小さなデータ(1000要素):")
print(f"statistics: {stats_time:.6f}秒")
print(f"numpy: {numpy_time:.6f}秒")
よくある使用パターンとコツ
エラー処理のベストプラクティス
import statistics
def safe_statistics(data, func_name='mean'):
"""安全な統計関数の実行"""
if not data:
return None
try:
if func_name == 'mean':
return statistics.mean(data)
elif func_name == 'median':
return statistics.median(data)
elif func_name == 'mode':
return statistics.mode(data)
# 他の関数も同様に追加
except statistics.StatisticsError as e:
print(f"統計エラー: {e}")
return None
except Exception as e:
print(f"予期しないエラー: {e}")
return None
# 使用例
empty_data = []
mixed_data = [1, 1, 2, 2] # modeが一意に定まらない
print(safe_statistics(empty_data)) # None
print(safe_statistics(mixed_data, 'mode')) # None(エラーメッセージ付き)
データの前処理
import statistics
def clean_and_analyze(raw_data):
"""データのクリーニングと基本統計"""
# None や異常値を除去
clean_data = [x for x in raw_data if x is not None and isinstance(x, (int, float))]
if not clean_data:
return None
return {
'count': len(clean_data),
'mean': statistics.mean(clean_data),
'median': statistics.median(clean_data),
'stdev': statistics.stdev(clean_data) if len(clean_data) > 1 else 0,
'min': min(clean_data),
'max': max(clean_data)
}
# 使用例
messy_data = [1, 2, None, 3, 'invalid', 4, 5]
result = clean_and_analyze(messy_data)
print(result)
まとめ
Pythonのstatisticsモジュールは、軽量で使いやすい統計処理ツールです。
関数の分類と使い分け
代表値の計算
mean()
: 一般的な平均値fmean()
: 高速な平均値(Python 3.8+)median()
: 中央値mode()
/multimode()
: 最頻値
特殊な平均
harmonic_mean()
: 速度・率の平均geometric_mean()
: 成長率・倍率の平均
ばらつきの測定
variance()
/pvariance()
: 分散stdev()
/pstdev()
: 標準偏差quantiles()
: 分位数
使い分けの指針
statisticsモジュールを選ぶべき場面
- 軽量な統計処理
- 外部ライブラリが使えない環境
- 学習や練習での基本統計
- 小〜中規模データの処理
numpy/pandasを選ぶべき場面
- 大量データの高速処理
- 多次元配列の処理
- 高度な統計分析
- データフレーム操作
今日から使えるテクニック
- 基本的な記述統計:
mean()
,median()
,stdev()
- データの分布確認:
quantiles()
で四分位数分析 - 異常値検出: 四分位数とIQRを使った簡易検出
- 投資分析:
geometric_mean()
で複利効果を考慮 - 品質管理:
pstdev()
で母集団の品質評価
コメント