統計分析のためのPython実装完全ガイド

本ガイドでは,高度なデータ分析に不可欠な統計手法をPythonライブラリ(Pandas,SciPy,Matplotlib)を用いて実装する方法を体系的に解説する.記述統計量の算出,クロス集計,統計的検定,データ可視化などの専門的な分析機能を包括的に提供し,データの特徴把握から仮説検証までの分析プロセス全体を効率的に実現する.さらに,日本語対応や適切なデータ型指定により,実務での活用を見据えた分析環境の構築を可能にする.

統計手法

  1. 記述統計量
  2. ヒストグラム
  3. クロス集計表
  4. 検定

記述統計量

記述統計量は,データサイエンスの基盤となる統計指標であり,データセットの特徴を数値的に要約する手法である.これらの指標は,データ全体の特性を体系的に把握し,最適な分析手法の選択を支援する重要な役割を果たす.

基本的な統計量として以下が挙げられる:

用語説明

統計処理の比較

処理内容 SPSS言語 Rシステム Python (pandas/scipy)
記述統計量 describe, skew, kurt descriptive summary, sd, skewness, kurtosis df.describe(), stats.skew(), stats.kurtosis()
頻度表 hist, frequencies table value_counts()
クロス集計表 crosstab, crosstabs table pd.crosstab()
集約 aggregate aggregate groupby().agg()
Welchのt検定 ttest_ind t.test stats.ttest_ind()
one-way ANOVA f_oneway oneway.test stats.f_oneway()
Wilcoxon検定 mannwhitneyu wilcox.test stats.mannwhitneyu()

Pythonプログラム例

データセット構造

科目 受講者 得点
国語 A 90
国語 B 80
算数 A 95
算数 B 90
理科 A 80

Python のインストールと必要なPythonライブラリのインストール(Windows上)

  1. Python のインストール

    注:既にPython(バージョン3.12を推奨)がインストール済みの場合は,この手順は不要である.

    winget(Windowsパッケージマネージャー)を使用してインストールを行う

    1. Windowsで,コマンドプロンプト管理者権限で起動する(例:Windowsキーを押し,「cmd」と入力し,「管理者として実行」を選択)
    2. winget(Windowsパッケージマネージャー)が利用可能か確認する:
      winget --version
      
    3. Pythonのインストール(下のコマンドにより Python 3.12 がインストールされる).
      winget install --scope machine Python.Launcher
      winget install --scope machine Python.Python.3.12
      
  2. 必要なPythonライブラリのインストール
    1. Windowsで,コマンドプロンプト管理者権限で起動する(例:Windowsキーを押し,「cmd」と入力し,「管理者として実行」を選択)
    2. 以下のコマンドを実行し,必要なライブラリをインストールする.
      pip install -U pandas numpy matplotlib japanize-matplotlib scipy
      

【関連する外部ページ】

【サイト内の関連ページ】

基本的なデータ構造とデータフレームの作成

Pandasライブラリを活用し,科目・受講者・得点の成績データを辞書として作成し,データフレームへと変換する.データ型は,効率的なデータ処理を実現するため,カテゴリ型と整数型を明示的に指定する.


import pandas as pd

# データの作成
data = {
   '科目': ['国語', '国語', '算数', '算数', '理科'],
   '受講者': ['A', 'B', 'A', 'B', 'A'],
   '得点': [90, 80, 95, 90, 80]
}

# データフレームの作成
df = pd.DataFrame(data)

# データ型の明示的な指定
df = df.astype({
   '科目': 'category',
   '受講者': 'category',
   '得点': 'int32'
})

print("基本データ:")
print(df)

個別の統計量計算

Pandasとscipy.statsの統計関数を活用し,カテゴリカルデータと数値データを含むデータフレームに対して平均値,標準偏差,四分位数などの基本統計量を算出する.標本標準偏差の計算にはddof=1を指定し,結果の小数点以下の桁数を適切に設定する.


import pandas as pd
from scipy import stats

# データの作成
data = {
   '科目': ['国語', '国語', '算数', '算数', '理科'],
   '受講者': ['A', 'B', 'A', 'B', 'A'],
   '得点': [90, 80, 95, 90, 80]
}

# データフレームの作成
df = pd.DataFrame(data)

# データ型の明示的な指定
df = df.astype({
   '科目': 'category',
   '受講者': 'category',
   '得点': 'int32'
})

# 基本統計量の個別計算
scores = df['得点']

# 標本標準偏差の計算(ddof=1指定)
print("基本統計量:")
print(f"平均値: {scores.mean():.1f}")
print(f"標準偏差: {scores.std(ddof=1):.1f}")
print(f"中央値: {scores.median():.1f}")
print(f"最大値: {scores.max()}")
print(f"最小値: {scores.min()}")
print(f"第1四分位数: {scores.quantile(0.25):.1f}")
print(f"第3四分位数: {scores.quantile(0.75):.1f}")
print(f"歪度: {stats.skew(scores):.3f}")
print(f"尖度: {stats.kurtosis(scores):.3f}")

総合的な統計分析

Pandasライブラリのdescribeメソッドを活用し,データフレームの高度な統計分析を実行する.データ数,平均値,標準偏差,最小値,四分位数,最大値などの基本統計量を効率的に算出し,データの特徴を包括的に把握する.


import pandas as pd

# データの作成
data = {
   '科目': ['国語', '国語', '算数', '算数', '理科'],
   '受講者': ['A', 'B', 'A', 'B', 'A'],
   '得点': [90, 80, 95, 90, 80]
}

# データフレームの作成
df = pd.DataFrame(data)

# データ型の明示的な指定
df = df.astype({
   '科目': 'category',
   '受講者': 'category',
   '得点': 'int32'
})

# describe()メソッドによる総合的な統計量の算出
# count:データ数、mean:平均、std:標準偏差、min:最小値、25%:第1四分位、50%:中央値、75%:第3四分位、max:最大値
print("\n総合的な統計量:")
print(df['得点'].describe())

# 科目別の統計量
# groupby()で科目ごとにグループ化し、describe()で各グループの統計量を算出
print("\n科目別の統計量:")
print(df.groupby('科目')['得点'].describe())

データの可視化,ヒストグラム

Matplotlibを活用し,統計データの視覚的な理解を促進する箱ひげ図とヒストグラムを生成する.japanize_matplotlibによる日本語表示対応,グリッド線の追加,軸ラベルの設定などにより,直感的な分析を可能にする.


import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib  # 日本語表示用
import platform

# OSがWindowsの場合のみフォントを設定
if platform.system() == 'Windows':
    plt.rcParams['font.family'] = 'Meiryo'

# データの作成
data = {
    '科目': ['国語', '国語', '算数', '算数', '理科'],
    '受講者': ['A', 'B', 'A', 'B', 'A'],
    '得点': [90, 80, 95, 90, 80]
}

# データフレームの作成
df = pd.DataFrame(data)

# データ型の明示的な指定
df = df.astype({
    '科目': 'category',
    '受講者': 'category',
    '得点': 'int32'
})

# 箱ひげ図の作成
plt.figure(figsize=(10, 6))
df.boxplot(column='得点', by='科目')
plt.suptitle('')  # 自動で付加されるサブタイトルを削除
plt.title('科目別得点分布', pad=15)  # タイトルの余白調整
plt.ylabel('得点')
plt.grid(True)
plt.savefig('score_distribution.png', bbox_inches='tight')  # 画像を保存
plt.show()  # 画面に表示
plt.close()  # 描画後にクローズ

# ヒストグラムの作成
plt.figure(figsize=(10, 6))
plt.hist(df['得点'], bins=range(0, 101, 10), edgecolor='black')  # binの範囲を0-100に設定
plt.title('得点分布のヒストグラム')
plt.xlabel('得点')
plt.ylabel('頻度')
plt.grid(True)
plt.savefig('score_histogram.png', bbox_inches='tight')  # 画像を保存
plt.show()  # 画面に表示
plt.close()  # 描画後にクローズ

クロス集計表の例

Pandasのcrosstabを活用し,二つの変数間の関連性を明確に示すクロス集計表を作成する.クロス集計表は,複数のグループの組み合わせごとの出現頻度を表形式で整理し,データの分布や傾向を効率的に把握することを可能にする.


import pandas as pd

# データセットサンプルの作成
data = {
   'グループ1': ['a', 'b', 'c', 'a', 'b'],
   'グループ2': ['d', 'd', 'e', 'e', 'e']
}
df = pd.DataFrame(data)

# クロス集計表の作成
# crosstabは2つの系列間でグループ単位での頻度(出現回数)を集計する
# index=行インデックス, columns=列インデックスを指定
cross_table = pd.crosstab(df['グループ1'], df['グループ2'])
print(cross_table)

# (Optional) 行・列の合計を含めたい場合は、margins=True を指定
cross_table_with_margins = pd.crosstab(df['グループ1'], df['グループ2'], margins=True)
print("\n合計付きのクロス集計表:")
print(cross_table_with_margins)

t検定

SciPyのstatsモジュールを活用し,2群間の平均値の差を検定するWelchのt検定を実装する.再現性を確保するために乱数のシード値を固定し,異なる平均値を持つ正規分布からサンプルデータを生成して,等分散を仮定しない検定を実行する.


import numpy as np
from scipy import stats

# シード値を固定して再現性を確保
np.random.seed(42)

# 2群のサンプルデータを正規分布から生成
# group1: 平均0、標準偏差1の正規分布から100個
# group2: 平均0.5、標準偏差1の正規分布から100個
group1 = np.random.normal(0, 1, 100)
group2 = np.random.normal(0.5, 1, 100)

# Welchのt検定を実行
# equal_var=Falseで分散が等しくないことを仮定
# 戻り値はt統計量とp値のタプル
t_stat, p_value = stats.ttest_ind(group1, group2, equal_var=False)

# 結果を小数点以下3桁まで表示
print(f"t値: {t_stat:.3f}")  # t統計量を出力
print(f"p値: {p_value:.3f}") # p値を出力

一元配置分散分析

SciPyの統計解析機能を活用し,一元配置分散分析により3群以上のデータ群の平均値の差を統計的に検定する.F値とp値を算出し,群間の差異を科学的に評価する.


from scipy import stats

# サンプルデータ(数値のグループ別データ)
group_a = [3.42, 3.84, 3.96, 3.76]  # グループAの測定値
group_b = [3.17, 3.63, 3.47, 3.44, 3.39]  # グループBの測定値
group_c = [3.64, 3.72, 3.91]  # グループCの測定値

# 一元配置分散分析の実行
f_stat, p_value = stats.f_oneway(group_a, group_b, group_c)

# 結果の出力(小数点以下3桁で表示)
print(f"F値: {f_stat:.3f}")  # F統計量の値
print(f"p値: {p_value:.3f}")  # 有意確率

正規性の検定

Shapiro-Wilk検定を活用し,データの正規性を統計的に評価する.正規分布に従うサンプルデータを生成して検定統計量とp値を算出し,データが正規分布に従うという帰無仮説を科学的に検証する.


from scipy import stats
import numpy as np

# データ生成:平均0、標準偏差1の正規分布から100個のサンプルを生成
np.random.seed(42)
data = np.random.normal(0, 1, 100)

# Shapiro-Wilk検定の実行
# 帰無仮説:データは正規分布に従う
stat, p_value = stats.shapiro(data)

# 結果の出力(小数点以下3桁まで表示)
print(f"検定統計量: {stat:.3f}")
print(f"p値: {p_value:.3f}")