見出し画像

【生成AIとPythonで統計学】 3. χ2検定(独立性の検定)と残差分析

 新刊『まんが Excelで統計学入門』発刊記念に生成AIと作って統計計算のプログラムの第3弾は、χ2検定(独立性の検定)+残差分析です。

 これは必要にかられてだいぶ前にChatGPTに相談して作っていたものです。残差分析の計算方法が怪しくて、何度もダメ出しをした結果、なんとか使えるものができました。生成AIの出力結果には、いわゆるハルシネーション(しれっと出してくる間違い)も多いので、かならず検証が必要です。

 このプログラムを「chi_square_test.py」などの名前で保存しておいてください。Pythonと必要なモジュール(NumPy, SciPy, reなど)がインストールされていれば、ファイルのアイコンをダブルクリックするだけでプログラムが起動します。

import numpy as np
import scipy.stats as stats
import re

def main():
    # numpy の出力設定(浮動小数点数を少数表記で表示)
    np.set_printoptions(precision=6, suppress=True, formatter={'float_kind': lambda x: f"{x:.6f}"})
    
    # 行数と列数の入力
    try:
        rows = int(input("行数を入力してください: "))
        cols = int(input("列数を入力してください: "))
    except ValueError:
        print("整数を入力してください。")
        return

    data = []
    print("各行のデータをカンマ、スペース、またはタブで区切って入力してください。")
    for i in range(rows):
        row_input = input(f"行 {i+1} のデータ: ").rstrip()
        # カンマ、スペース、Tab を区切り文字として分割
        try:
            tokens = re.split(r'[\s,]+', row_input)
            row_values = list(map(int, tokens))
        except ValueError:
            print("数値以外の値が含まれています。")
            return
        
        if len(row_values) != cols:
            print(f"列数が一致しません。{cols}個の数値を入力してください。")
            return
        data.append(row_values)
        
    table = np.array(data)
    
    # 独立性の検定(χ²検定)の実行
    chi2, p, dof, expected = stats.chi2_contingency(table)
    print("\n独立性の検定(χ²検定)結果:")
    print("χ²値:", f"{chi2:.6f}")
    print("p値:", f"{p:.6f}")
    print("自由度:", dof)
    print("期待度数:")
    print(expected)
    
    # 調整済み標準化残差とそのp値の計算
    n = table.sum()
    row_totals = table.sum(axis=1)
    col_totals = table.sum(axis=0)
    
    adj_std_resid = np.zeros_like(table, dtype=float)
    p_values = np.zeros_like(table, dtype=float)
    
    for i in range(rows):
        for j in range(cols):
            Eij = expected[i, j]
            if Eij > 0:
                # 調整済み標準化残差の計算
                adj = (table[i, j] - Eij) / np.sqrt(Eij * (1 - row_totals[i] / n) * (1 - col_totals[j] / n))
                adj_std_resid[i, j] = adj
                # 標準正規分布を仮定して両側検定のp値を計算
                p_val = 2 * (1 - stats.norm.cdf(np.abs(adj)))
                p_values[i, j] = p_val
            else:
                adj_std_resid[i, j] = 0.0
                p_values[i, j] = 1.0
                
    print("\n調整済み標準化残差:")
    print(adj_std_resid)
    print("\n各セルの残差に対するp値:")
    print(p_values)
    input() 

if __name__ == "__main__":
    main()

 プログラムを実行したらデータ数を訊ねられます。「行」と「列」の数を入れ、その後にデータを入れてください。計算結果が表示された状態で画面が停止します。終了するにはEnterキーを押してください。

画像
〈プログラム実行結果〉

 心理学や社会学の研究では頻繁に統計分析をします。統計計算がどんな方法で行われているのかを知りたい人は、マンガで学ぶこともできます。『まんが Excelで統計学入門』(すがやみつる・構成/智山マイコ・作画/技術評論社/2,200円)には、χ2検定の計算方法も細かく解説されていますので、統計学の仕組みに関心がある人は、読んでみてください。大学で統計学を学ぶ学生さんにオススメです。


いいなと思ったら応援しよう!

ピックアップされています

すがやみつるのアカデミックライフ

  • 30本

コメント

ログイン または 会員登録 するとコメントできます。
マンガ家。1950年、静岡県生まれ。デビュー作『仮面ライダー』(原作・石ノ森章太郎)。代表作『ゲームセンターあらし』など。85年からパソコン通信を開始。94年、小説家デビュー。2011年、早稲田大学大学院人間科学研究科修士課程修了。13~21年、京都精華大学マンガ学部教授。
【生成AIとPythonで統計学】 3. χ2検定(独立性の検定)と残差分析|すがやみつる
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1