統計分析のPython 実現ガイド

【概要】Pandas、SciPy、Matplotlibを用いた統計分析のPython実装ガイドである。記述統計量、ヒストグラム、箱ひげ図、クロス集計表、t検定、一元配置分散分析、正規性検定の7つの統計手法を解説し、各手法のPythonコードと実行結果を示す。

【目次】

  1. 統計手法
  2. 記述統計量
  3. 用語リスト
  4. 統計処理の比較
  5. Pythonプログラム例

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

【外部リソース】

統計手法

本ガイドでは、以下の統計手法を扱う。

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

記述統計量

記述統計量は、データセットの特徴を数値的に要約する統計指標である。

用語リスト

統計処理の比較

処理内容 SPSS言語 Rシステム Python (pandas/scipy)
記述統計量 describeskewkurt descriptive summarysdskewnesskurtosis df.describe()stats.skew()stats.kurtosis()
頻度表 histfrequencies table value_counts()
クロス集計表 crosstabcrosstabs table pd.crosstab()
集約 aggregate aggregate groupby().agg()
Welchのt検定 ttest_ind t.test stats.ttest_ind()
一元配置分散分析 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
      wingetバージョン確認コマンドの実行結果
    3. Pythonのインストール(下のコマンドによりPython 3.12がインストールされる)。
      reg add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f
      REM Python をシステム領域にインストール
      winget install --scope machine --id Python.Python.3.12 -e --silent
      REM Python のパス
      set "INSTALL_PATH=C:\Program Files\Python312"
      echo "%PATH%" | find /i "%INSTALL_PATH%" >nul
      if errorlevel 1 setx PATH "%PATH%;%INSTALL_PATH%" /M >nul
      echo "%PATH%" | find /i "%INSTALL_PATH%\Scripts" >nul
      if errorlevel 1 setx PATH "%PATH%;%INSTALL_PATH%\Scripts" /M >nul
  2. 必要なPythonライブラリのインストール
    1. Windowsで、コマンドプロンプト管理者権限で起動する(手順: Windowsキーまたはスタートメニュー、「cmd」と入力、右クリックメニューなどで「管理者として実行」を選択)。
    2. 以下のコマンドを実行し、必要なライブラリをインストールする。
      pip install -U pandas numpy matplotlib japanize-matplotlib scipy

【関連する外部ページ】

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

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

辞書からデータフレームを作成し、データ型を指定する。

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)
基本データフレームの出力結果

個別の統計量計算

各統計量を個別に算出する。標本標準偏差の計算には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['得点']

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}")
個別統計量の計算結果

総合的な統計分析

describe()メソッドにより基本統計量を一括算出する。groupby()との組み合わせでカテゴリ別の統計量も算出できる。

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['得点'].describe())

print("\n科目別の統計量:")
print(df.groupby('科目')['得点'].describe())
describeメソッドによる統計量の出力結果

データの可視化

箱ひげ図とヒストグラムによりデータ分布を可視化する。

import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
import platform

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')
plt.title('得点分布のヒストグラム')
plt.xlabel('得点')
plt.ylabel('頻度')
plt.grid(True)
plt.savefig('score_histogram.png', bbox_inches='tight')
plt.show()
plt.close()
科目別得点分布の箱ひげ図
得点分布のヒストグラム

クロス集計表

pd.crosstab()により2変数間の度数を集計する。

import pandas as pd

data = {
   'グループ1': ['a', 'b', 'c', 'a', 'b'],
   'グループ2': ['d', 'd', 'e', 'e', 'e']
}
df = pd.DataFrame(data)

cross_table = pd.crosstab(df['グループ1'], df['グループ2'])
print(cross_table)

# 合計付き
cross_table_with_margins = pd.crosstab(df['グループ1'], df['グループ2'], margins=True)
print("\n合計付きのクロス集計表:")
print(cross_table_with_margins)
クロス集計表の出力結果

t検定

Welchのt検定により2群の平均値の差を検定する。equal_var=Falseで等分散を仮定しない。

import numpy as np
from scipy import stats

np.random.seed(42)

group1 = np.random.normal(0, 1, 100)
group2 = np.random.normal(0.5, 1, 100)

t_stat, p_value = stats.ttest_ind(group1, group2, equal_var=False)

print(f"t値: {t_stat:.3f}")
print(f"p値: {p_value:.3f}")
t検定の実行結果

一元配置分散分析

stats.f_oneway()により3群以上の平均値の差を検定する。

from scipy import stats

group_a = [3.42, 3.84, 3.96, 3.76]
group_b = [3.17, 3.63, 3.47, 3.44, 3.39]
group_c = [3.64, 3.72, 3.91]

f_stat, p_value = stats.f_oneway(group_a, group_b, group_c)

print(f"F値: {f_stat:.3f}")
print(f"p値: {p_value:.3f}")
一元配置分散分析の実行結果

正規性の検定

Shapiro-Wilk検定によりデータの正規性を評価する。

from scipy import stats
import numpy as np

np.random.seed(42)
data = np.random.normal(0, 1, 100)

stat, p_value = stats.shapiro(data)

print(f"検定統計量: {stat:.3f}")
print(f"p値: {p_value:.3f}")
正規性検定の実行結果