統計分析のPython実現ガイド

【概要】

pandas、NumPy、SciPy、Matplotlib、statsmodelsを用いた基礎的な統計分析(探索的データ解析と古典的仮説検定)のPython実装ガイドである。記述統計量、ヒストグラム、箱ひげ図、クロス集計表、相関分析、検定(t検定、一元配置分散分析、正規性検定、等分散性検定、カイ二乗独立性検定、Mann-Whitney U検定)、分散分析後の多重比較を扱う。各手法のPythonコードと実行結果を示す。

【本資料の前提】

【目次】

統計手法

本資料で扱う手法を内容ごとに列挙する。

  1. 記述統計量
  2. ヒストグラム
  3. 箱ひげ図
  4. クロス集計表
  5. 相関分析(Pearson、Spearman)
  6. 検定(t検定、一元配置分散分析、正規性検定、等分散性検定、カイ二乗独立性検定、Mann-Whitney U検定)
  7. 分散分析後の多重比較(Tukey HSD)

記述統計量

記述統計量は、データセットの特徴を数値で要約する指標である。データ全体の特性を把握し、分析手法の選択に用いる。

基本的な統計量を以下に示す。

用語リスト

統計処理の比較

同じ統計処理を異なるツールで実行する際のコマンドを比較する。各ツールで既定の挙動が異なる場合がある(特にt検定)。

処理内容SPSSRPython (pandas/scipy/statsmodels)
記述統計量DESCRIPTIVES、FREQUENCIESsummary、sd、skewness、kurtosisdf.describe()、stats.skew()、stats.kurtosis()
頻度表FREQUENCIEStablevalue_counts()
クロス集計表CROSSTABStablepd.crosstab()
集約AGGREGATEaggregategroupby().agg()
相関CORRELATIONScor、cor.testdf.corr()、stats.pearsonr()、stats.spearmanr()
通常のt検定T-TESTt.test(..., var.equal=TRUE)stats.ttest_ind()(既定)
Welchのt検定T-TESTt.test(既定)stats.ttest_ind(equal_var=False)
等分散性検定EXAMINEleveneTeststats.levene()
一元配置分散分析ONEWAYaov、oneway.teststats.f_oneway()
多重比較(Tukey)POSTHOCTukeyHSDpairwise_tukeyhsd()
カイ二乗独立性検定CROSSTABS /STATISTICSchisq.teststats.chi2_contingency()
Mann-Whitney U検定NPAR TESTSwilcox.teststats.mannwhitneyu()

Pythonのttest_ind()は既定が通常のt検定(equal_var=True)であり、Welch検定にはequal_var=Falseを指定する。Rのt.testは既定でWelch検定を行う。

統計分析の解説とコード例

記述統計・可視化では以下の成績データを用いる。クロス集計以降の検定では、手法の説明のため例ごとに別データを用いる。ただし、演習5と演習6は同じ乱数データを用いて、t検定とMann-Whitney U検定を比較する。

科目受講者得点
国語A90
国語B80
国語C85
国語D88
国語E76
算数A95
算数B90
算数C92
算数D87
算数E85
理科A80
理科B78
理科C85
理科D82
理科E88

データフレームの作成

pandasのデータフレームは表形式データの基本構造である。ここでは成績データを辞書から作成し、データフレームへ変換する。

基本データフレームの出力結果
3列(科目・受講者・得点)15行のデータフレームが表示される。

個別の統計量計算

各統計量を個別に算出する。特定の統計量のみ必要な場合や、計算過程を確認したい場合に用いる。

個別統計量の計算結果
平均、標準偏差、中央値、四分位数、分散、歪度、尖度の各値が表示される。

総合的な統計分析

describe()は主要な記述統計量を一括算出する。stdは不偏(ddof=1)で出力される。

describeメソッドによる統計量の出力結果
全体および科目別の count、mean、std、min、四分位数、max が表示される。

データの可視化(箱ひげ図とヒストグラム)

科目別得点分布の箱ひげ図
科目ごとの中央値・四分位範囲を示す箱ひげ図。
得点分布のヒストグラム
区間ごとの頻度を示すヒストグラム。

クロス集計表とカイ二乗独立性検定

クロス集計表は2つのカテゴリ変数の組み合わせごとの頻度を表で示す。カイ二乗検定で2変数が独立かを検定し、Cramér's Vで関連の強さ(効果量)を評価する。

クロス集計表とカイ二乗検定の出力結果
クロス集計表、合計付き表、期待度数、カイ二乗統計量・p値・自由度・Cramér's Vが表示される。

相関分析

連続変数間の関係の強さを相関係数で評価する。Pearsonは線形関係、Spearmanは順位に基づく単調関係を測る。

相関分析の出力結果
相関行列、Pearson・Spearman相関係数とそのp値が表示される。

等分散性の検定(Levene検定)とt検定

2群の比較では、分散の状態を確認するためにLevene検定を用いることがある。ここでは分散差に比較的頑健なWelchのt検定を実装する。

等分散性検定とt検定の実行結果
Levene検定の統計量・p値、t値・p値・自由度が表示される。

Mann-Whitney U検定(ノンパラメトリック)

正規性が仮定できない場合、t検定の代わりに独立2群のMann-Whitney U検定を用いることがある(Wilcoxon順位和検定と等価に扱われる)。

Mann-Whitney U検定の実行結果
U統計量とp値が表示される。

一元配置分散分析と多重比較(Tukey HSD)

3群以上の平均値の差は一元配置分散分析で検定する。3群以上でt検定を繰り返すと第1種の過誤の確率が増大するため、この手法を用いる。有意だった場合、どの群間に差があるかをTukey HSD(多重比較)で調べる。

各群が3〜5個と小標本のため、結果は説明目的の参考値である。

分散分析とTukey HSDの実行結果
F値・p値に続き、群の各ペアの平均差・p値・有意判定の表が表示される。

正規性の検定(Shapiro-Wilk検定)

t検定や分散分析などのパラメトリック検定は正規性を仮定するため、事前にShapiro-Wilk検定で確認する。

正規性検定の実行結果
Shapiro-Wilkの統計量Wとp値が表示される。

前準備

Python 3.12 のインストール

Pythonのインストールを行い、Pythonのプログラムを実行する環境を整える。扱う環境は、Windows搭載パソコンである。金子研究室では、Python 3.12.10を推奨する。

[Windows での Python 3.12 のインストール手順を見るには、ここをクリック]

Windows での Python 3.12 のインストール

以下のいずれかの方法でPython 3.12をインストールする。Pythonがインストール済みの場合、この手順は不要である。

方法 1:winget によるインストール

【インストールコマンドの実行方法】

管理者権限でコマンドプロンプトを起動する(手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。そして、コマンド全体をコマンドプロンプトにコピー&ペーストする。

--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動するとPATHが反映される。

REM Python 3.12 をシステム領域にインストール
winget install --id Python.Python.3.12 -e --scope machine --silent --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Python 3.12 のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM Python と Scripts を PATH 先頭に追加
powershell -NoProfile -Command "$p='C:\Program Files\Python312'; $s=\"$p\Scripts\"; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); $new=$c; if((';'+$new+';') -notlike \"*;$p;*\"){$new=$p+';'+$new}; if((';'+$new+';') -notlike \"*;$s;*\"){$new=$s+';'+$new}; if($new -ne $c){$k.SetValue('Path',$new,$t)}; $k.Close()}"

REM 現在のセッションにも反映(システムPATHを再取得して連結)
for /f "usebackq tokens=2,*" %A in (`reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path`) do set "PATH=%B"

REM pip / wheel の更新
python -m pip install --no-user -U pip wheel
if not "%ERRORLEVEL%"=="0" ( color 0c & echo pip / wheel の更新に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

方法 2:インストーラーによるインストール

  1. Python公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンからWindows用インストーラーをダウンロードする。
  2. ダウンロードしたインストーラーを実行する。
  3. 初期画面の下部に表示される「Add python.exe to PATH」にチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから python コマンドを実行できない。
  4. 「Install Python 3.xx for all users」にチェックを入れ、「Install」をクリックする。

インストールの確認

コマンドプロンプトで以下を実行する。

python --version

バージョン番号(例:Python 3.12.x)が表示されればインストール成功である。「'python' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は、インストールが正常に完了していない。

Python の開発環境 Visual Studio Code のインストールと Python 用の設定

Python の開発環境Visual Studio Code(プログラムを編集するソフトウェア。以下、VS Code)を整える。

[Windows での Visual Studio Code のインストールと Python 用の設定手順を見るには、ここをクリック]

Windows での Visual Studio Code のインストールと Python 用の設定手順

1. VS Code と拡張機能のインストール

以下のコマンドにより,既存の VS Code を削除し,全ユーザー共有の設定で再インストールしたうえで,拡張機能(VS Code に機能を追加するソフトウェア)をまとめて導入する.

【インストールコマンドの実行方法】

管理者権限でコマンドプロンプトを起動する(手順:Windows キーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。そして,コマンド全体をコマンドプロンプトにコピー&ペーストする。

インストールコマンド


REM ============================================================
REM Microsoft Visual Studio Code
REM ============================================================
REM Build Tools + Desktop development with C++(VCTools)+ 追加コンポーネント(一括)
REM 未インストール時: winget で新規インストール
REM インストール済み時: setup.exe modify でコンポーネント追加(バージョンは変更しない)
winget list --id Microsoft.VisualStudio.BuildTools 2>nul | findstr /i "BuildTools" >nul 2>&1
if %ERRORLEVEL% EQU 0 (
    for /f "usebackq delims=" %P in (`"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -products Microsoft.VisualStudio.Product.BuildTools -property installationPath`) do start /wait "" "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" modify --installPath "%P" --add Microsoft.VisualStudio.Workload.VCTools --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.Windows11SDK.26100 --add Microsoft.VisualStudio.Component.VC.v143.x86.x64 --includeRecommended --quiet --norestart --nocache
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo Build Tools のコンポーネント追加に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
) else (
    winget install --scope machine --id Microsoft.VisualStudio.BuildTools -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "--quiet --wait --norestart --nocache --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.Windows11SDK.26100 --add Microsoft.VisualStudio.Component.VC.v143.x86.x64"
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo Build Tools のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
)

REM 全ユーザー共有の拡張機能フォルダ
if not exist "C:\ProgramData\vscode-extensions" mkdir "C:\ProgramData\vscode-extensions"
icacls "C:\ProgramData\vscode-extensions" /grant "Everyone:(OI)(CI)M" /T

REM スタートメニューのショートカットを --extensions-dir 付きで再作成
if exist "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code" rmdir /s /q "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code"
if exist "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk" del "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk"
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $lnk=$s.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk'); $lnk.TargetPath='C:\Program Files\Microsoft VS Code\Code.exe'; $lnk.Arguments='--extensions-dir \"C:\ProgramData\vscode-extensions\"'; $lnk.Save()"
REM ショートカットの検証
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $lnk=$s.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk'); Write-Host 'TargetPath:' $lnk.TargetPath; Write-Host 'Arguments:' $lnk.Arguments"

REM ファイル / フォルダ右クリックの「Code で開く」を登録
reg add "HKLM\SOFTWARE\Classes\*\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%1\"" /f
reg add "HKLM\SOFTWARE\Classes\Directory\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%1\"" /f
reg add "HKLM\SOFTWARE\Classes\Directory\Background\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%V\"" /f

REM --extensions-dir 付きで起動する code.cmd ラッパを作成
REM (%* を echo で書くと対話的 cmd で失われるため、PowerShell で [char]37+'*' を書き出す)
powershell -NoProfile -Command "$pct=[char]37; $q=[char]34; $c='@echo off'+[char]13+[char]10+$q+'C:\Program Files\Microsoft VS Code\bin\code.cmd'+$q+' --extensions-dir '+$q+'C:\ProgramData\vscode-extensions'+$q+' '+$pct+'*'+[char]13+[char]10; [IO.File]::WriteAllText('C:\ProgramData\vscode-extensions\vscode.cmd',$c,[Text.Encoding]::ASCII)"

REM 拡張機能のインストール
set "CODE=C:\Program Files\Microsoft VS Code\bin\code.cmd"
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --uninstall-extension GitHub.copilot
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --uninstall-extension GitHub.copilot-chat
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.python
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.vscode-pylance
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.debugpy
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension MS-CEINTL.vscode-language-pack-ja
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension saoudrizwan.claude-dev
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension rust-lang.rust-analyzer
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension tamasfe.even-better-toml
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension anthropic.claude-code
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension almenon.arepl
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --list-extensions --show-versions

REM settings.json を作成(自動更新オフ、Python、Claude Code 設定)
if not exist "%APPDATA%\Code\User" mkdir "%APPDATA%\Code\User"
python -c "import json,os;data={'update.mode':'none','update.enableWindowsBackgroundUpdates':False,'extensions.autoUpdate':False,'python.defaultInterpreterPath':r'C:\Program Files\Python312\python.exe','claudeCode.environmentVariables':[{'name':'ANTHROPIC_API_KEY','value':'not-needed'},{'name':'ANTHROPIC_AUTH_TOKEN','value':'ollama'},{'name':'ANTHROPIC_BASE_URL','value':'http://localhost:11434'},{'name':'ANTHROPIC_MODEL','value':'glm-4.7-flash'},{'name':'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC','value':'1'}]};p=os.path.join(os.environ['APPDATA'],'Code','User','settings.json');open(p,'w',encoding='utf-8').write(json.dumps(data,indent=4));print('Done:',p)"

REM 自動更新の抑止ポリシー(settings.json に加えて、レジストリ側でも明示的にオフ)
reg add "HKLM\SOFTWARE\Policies\Microsoft\VSCode" /v "UpdateMode" /t REG_SZ /d "none" /f
echo === セットアップ完了 ===

2. Python インタプリタの選択

同一マシンに複数の Python がインストールされている場合,VS Code で使用する Python 本体(インタプリタ:Python プログラムを解釈・実行するソフトウェア)を選択する必要がある.

  1. コマンドパレット(コマンド名で機能を呼び出す VS Code の入力欄)を開く(Ctrl+Shift+P)
  2. Python: Select Interpreter と入力する
  3. 表示される一覧から,使用する Python(例:C:\Program Files\Python312\python.exe)を選択する.

Python プログラム実行手順

[Windows での Python プログラム実行手順を見るには、ここをクリック]

Windows での Python 実行手順(Visual Studio Codeを使用)

プログラムファイルの作成と保存

  1. 左サイドバーの「エクスプローラー」アイコン(Ctrl+Shift+E)をクリックする
  2. 「NO FOLDER OPENED」(作業対象フォルダが未選択の状態)と表示される場合は,「Open Folder」をクリックし,プログラムを保存するフォルダを選択する

    続いて「フォルダを信用するか」を確認する画面(フォルダ内のコードを実行してよいか確認する VS Code の仕組み)が表示されるので,チェックして Yes を選択する

  3. フォルダ名の右側に表示される「新しいファイル」アイコンをクリックする
  4. ファイル名(例:aitask.py.ファイル名は何でも良い)を入力し Enter を押す.拡張子は .py(Python ファイルを示す拡張子)とする
  5. 実行したいコードを選択し,Ctrl+C でコピーする.VS Code のエディタ領域に Ctrl+V で貼り付ける
  6. Ctrl+S で保存する

プログラムの実行

  1. エディタ右上の三角形「▷」アイコン(Run Python File:現在開いている Python ファイルを実行するボタン)をクリックする.または,エディタ上で右クリックし「ターミナルで Python ファイルを実行」を選択する
  2. VS Code 下部のターミナル(コマンドの入出力を表示する画面)に,実行結果(print 関数の出力等)が表示される
  3. tkinter(Python 標準の GUI ライブラリ)のファイル選択ダイアログを使うプログラムを実行した場合は,ダイアログが開くので対象画像を選択する
  4. VS Code 下部のターミナルで実行結果を確認する.OpenCV ウィンドウ(OpenCV が画像を表示するために開く専用ウィンドウ)が開いた場合はそちらも確認する.OpenCV ウィンドウは,マウスクリックでウィンドウをアクティブ(操作対象の状態)にしてからキーを押すと終了する

必要なPythonライブラリのインストール

  1. 管理者権限でコマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。
  2. 以下のコマンドで必要なライブラリをインストールする。
    pip install -U pandas numpy matplotlib scipy statsmodels

Matplotlibの日本語表示設定(Windows)

グラフ内の日本語が文字化けしないよう、描画前に一度だけ以下を設定する。

import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['Meiryo', 'Yu Gothic', 'MS Gothic']
plt.rcParams['axes.unicode_minus'] = False

演習1.記述統計量の算出

手順

  1. 次のコードを実行する。
  2. 「得点」列の平均値、標準偏差、分散、中央値、第1四分位数、第3四分位数、歪度、尖度を出力する。
  3. describe()による全体の記述統計量と、科目別の記述統計量を確認する。
  4. 標準偏差のddofを0に変えて再実行し、ddof=1の場合と値を比較する。

ヒント

考察ポイント

import pandas as pd
from scipy import stats

data = {
    '科目': ['国語'] * 5 + ['算数'] * 5 + ['理科'] * 5,
    '受講者': ['A', 'B', 'C', 'D', 'E'] * 3,
    '得点': [
        90, 80, 85, 88, 76,
        95, 90, 92, 87, 85,
        80, 78, 85, 82, 88
    ]
}

df = pd.DataFrame(data)
df['科目'] = pd.Categorical(df['科目'], categories=['国語', '算数', '理科'], ordered=True)
df['受講者'] = pd.Categorical(df['受講者'], categories=['A', 'B', 'C', 'D', 'E'], ordered=True)
df['得点'] = df['得点'].astype('int32')

scores = df['得点']
score_array = scores.to_numpy()

print("データフレーム:")
print(df)

print("\n基本統計量:")
print(f"平均値: {scores.mean():.1f}")
print(f"標準偏差(ddof=1): {scores.std(ddof=1):.1f}")
print(f"分散(ddof=1): {scores.var(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(score_array, bias=True):.3f}")
print(f"尖度(超過尖度): {stats.kurtosis(score_array, fisher=True, bias=True):.3f}")

print("\ndescribe()による基本統計量:")
print(scores.describe())

print("\n科目別の記述統計量:")
print(df.groupby('科目', observed=True)['得点'].describe())

演習2.箱ひげ図とヒストグラムの作成

手順

  1. 次のコードを実行する。
  2. 科目別の箱ひげ図と、得点全体のヒストグラムを出力する。
  3. ヒストグラムのbinsをrange(0, 101, 5)に変えて再実行する。

ヒント

考察ポイント

import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['Meiryo', 'Yu Gothic', 'MS Gothic']
plt.rcParams['axes.unicode_minus'] = False

data = {
    '科目': ['国語'] * 5 + ['算数'] * 5 + ['理科'] * 5,
    '受講者': ['A', 'B', 'C', 'D', 'E'] * 3,
    '得点': [
        90, 80, 85, 88, 76,
        95, 90, 92, 87, 85,
        80, 78, 85, 82, 88
    ]
}

df = pd.DataFrame(data)
df['科目'] = pd.Categorical(df['科目'], categories=['国語', '算数', '理科'], ordered=True)
df['受講者'] = pd.Categorical(df['受講者'], categories=['A', 'B', 'C', 'D', 'E'], ordered=True)
df['得点'] = df['得点'].astype('int32')

df.boxplot(column='得点', by='科目', figsize=(10, 6), grid=True)
plt.suptitle('')
plt.title('科目別得点分布', pad=15)
plt.ylabel('得点')
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()

演習3.クロス集計表とカイ二乗独立性検定

手順

  1. 次のコードを実行する。
  2. クロス集計表、合計付きの表、期待度数、カイ二乗統計量、p値、自由度、Cramér's Vを出力する。

ヒント

考察ポイント

import numpy as np
import pandas as pd
from scipy import stats

data = {
    '学習方法': ['A'] * 30 + ['B'] * 40 + ['C'] * 50,
    '結果': (
        ['合格'] * 18 + ['不合格'] * 12
        + ['合格'] * 10 + ['不合格'] * 30
        + ['合格'] * 32 + ['不合格'] * 18
    )
}

df = pd.DataFrame(data)
df['学習方法'] = pd.Categorical(df['学習方法'], categories=['A', 'B', 'C'], ordered=True)
df['結果'] = pd.Categorical(df['結果'], categories=['合格', '不合格'], ordered=True)

cross_table = pd.crosstab(df['学習方法'], df['結果'])
print("クロス集計表:")
print(cross_table)

cross_with_margins = pd.crosstab(df['学習方法'], df['結果'], margins=True)
print("\n合計付きクロス集計表(合計の名称はAll):")
print(cross_with_margins)

chi2, p, dof, expected = stats.chi2_contingency(cross_table, correction=False)
expected_df = pd.DataFrame(expected, index=cross_table.index, columns=cross_table.columns)

print("\n期待度数:")
print(expected_df.round(2))

print(f"\nカイ二乗統計量: {chi2:.3f}, p値: {p:.3f}, 自由度: {dof}")

n = cross_table.to_numpy().sum()
r, k = cross_table.shape
cramers_v = np.sqrt(chi2 / (n * (min(r, k) - 1)))
print(f"Cramér's V: {cramers_v:.3f}")

演習4.相関分析

手順

  1. 次のコードを実行する。
  2. Pearson相関行列、Pearson相関係数とp値、Spearman相関係数とp値を出力する。

ヒント

考察ポイント

import pandas as pd
from scipy import stats

df = pd.DataFrame({
    'x': [1, 2, 3, 4, 5, 6, 7, 8],
    'y': [2, 1, 4, 3, 6, 5, 8, 7]
})

print("Pearson相関行列:")
print(df.corr(method='pearson'))

x = df['x'].to_numpy()
y = df['y'].to_numpy()

r_p, p_p = stats.pearsonr(x, y)
r_s, p_s = stats.spearmanr(x, y)

print(f"\nPearson r: {r_p:.3f} (p={p_p:.3f})")
print(f"Spearman r: {r_s:.3f} (p={p_s:.3f})")

演習5.等分散性検定とt検定

手順

  1. 次のコードを実行する。
  2. Levene検定の統計量とp値、Welchのt検定のt値、p値、自由度を出力する。

ヒント

考察ポイント

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)

lev_stat, lev_p = stats.levene(group1, group2, center='median')
print(f"Levene検定: 統計量={lev_stat:.3f}, p値={lev_p:.3f}")

res = stats.ttest_ind(group1, group2, equal_var=False, alternative='two-sided')
print(f"t値: {res.statistic:.3f}")
print(f"p値: {res.pvalue:.3f}")
print(f"自由度: {res.df:.1f}")

演習6.Mann-Whitney U検定(ノンパラメトリック)

手順

  1. 次のコードを実行する。
  2. U統計量とp値を出力する。
  3. alternativeを'greater'に変えて再実行し、両側検定の場合と結果を比較する。

ヒント

考察ポイント

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)

res = stats.mannwhitneyu(group1, group2, alternative='two-sided', method='asymptotic')
print(f"U統計量: {res.statistic:.3f}")
print(f"p値: {res.pvalue:.3f}")

演習7.分散分析と多重比較

手順

  1. 次のコードを実行する。
  2. 分散分析のF値とp値、Tukey HSDの結果の表を出力する。

ヒント

考察ポイント

import numpy as np
from scipy import stats
from statsmodels.stats.multicomp import pairwise_tukeyhsd

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}")

values = np.array(group_a + group_b + group_c)
labels = (['A'] * len(group_a)) + (['B'] * len(group_b)) + (['C'] * len(group_c))

tukey = pairwise_tukeyhsd(endog=values, groups=labels, alpha=0.05)
print(tukey)

演習8.正規性の検定

手順

  1. 次のコードを実行する。
  2. 正規分布から生成したデータに対し、統計量Wとp値を出力する。
  3. サンプル数を100から20に変えて再実行し、結果を比較する。

ヒント

考察ポイント

import numpy as np
from scipy import stats

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

res = stats.shapiro(data)
print(f"検定統計量(W): {res.statistic:.3f}")
print(f"p値: {res.pvalue:.3f}")