Pythonのstatisticsモジュール完全ガイド|データ分析に使える標準関数まとめ

python

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を選ぶべき場面

  • 大量データの高速処理
  • 多次元配列の処理
  • 高度な統計分析
  • データフレーム操作

今日から使えるテクニック

  1. 基本的な記述統計: mean(), median(), stdev()
  2. データの分布確認: quantiles()で四分位数分析
  3. 異常値検出: 四分位数とIQRを使った簡易検出
  4. 投資分析: geometric_mean()で複利効果を考慮
  5. 品質管理: pstdev()で母集団の品質評価

コメント

タイトルとURLをコピーしました