見出し画像

「入門はじめての統計解析」をPythonで写経 Vol.10 ~ 4章「はじめての統計的検定」③2つの母分散の差の検定、2つの母比率の差の検定

4章「はじめての統計的検定」

書籍の著者 石村貞夫 先生


この記事は、書籍「入門はじめての統計解析」4章「はじめての統計的検定」の Python写経活動 を取り扱います。

書籍の図・表・計算を淡々とPython化する写経シリーズです。
この記事は4章の統計的検定テーマのうち、2つの母分散の差の検定2つの母比率の差の検定 に取り組みます。
ChatGPTの活用も継続してまいります!

では書籍を開いて統計解析の旅に出発です🚀

いろいろな色を表すイラスト・桃(ピンク):「いらすとや」さんより

はじめに


このブログシリーズは、書籍「入門はじめての統計解析」(東京図書、「テキスト」と呼びます)の Python 写経を通じて得た「統計解析の楽しさ」をご紹介します。

書籍の紹介と引用表記はリンク先の記事に掲載しています。

4章 はじめての統計的検定


この記事は4章の以下のSectionを取り扱います。

4.7 2つの母分散の差の検定-等分散性
4.8 2つの母比率の差の検定

記事に用いるデータは、テキストに掲載されたデータそのものを引用しています。
データ件数の少ないものはコード上でデータを登録し、データ件数の多いものはCSVファイル化してデータを読み込みしています。

4章で用いるライブラリをインポートします。

### インポート

# 数値計算
import math                                                # python標準ライブラリ
import numpy as np
import pandas as pd

# 統計
import scipy.stats as stats
import pingouin as pg
from statsmodels.stats.proportion import proportions_ztest # 母比率のz検定
from statsmodels.stats.weightstats import ttest_ind        # 2標本のt検定

# 描画
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.family'] = 'Meiryo'

イントロダクション

前回に引き続いて「統計的検定」を頑張って取り組んでいきましょう。
ChatGPTによる「やさしいイントロ」をご堪能ください。


前回は、2つのグループの「平均」を比べて、違いがあるかどうかを検定しました。
今回はさらに一歩進んで、「ばらつき」や「割合」に注目して、2つの集団を比べてみます。
たとえば――

🔸 2つの母分散の検定
→ 「製品Aと製品B、どちらの品質が安定している?」というように、データの広がり(=ばらつき)に違いがあるかを調べたいときに使います。
安定性や品質管理など、“ブレの大きさ”に注目した比較です。

🔸 2つの母比率の検定
→ 「キャンペーンAとB、反応した人の割合に差はある?」というように、何かが“起きた割合”に違いがあるかを調べる検定です。
アンケートの賛成率、クリック率、合格率など、割合(比率)に注目した比較に活躍します。

「平均」だけでなく、「広がり」や「割合」も、データの大切な特徴です。
今回はその違いを見つけるための検定を、やさしく学んでいきましょう。


Section 4.7 2つの母分散の差の検定-等分散性

「等分散性の検定」の分野に入ります!
テキストの検定は 2つの正規母集団の母分散の差 を取り扱います。

【仮説】
覆したい母分散の差 $${\sigma^2_1 - \sigma^2_2}$$ の仮説を次のように設定します。

帰無仮説 $${H_0}$$:$${\sigma^2_1 = \sigma^2_2}$$

テキストより引用

支持したい仮説=対立仮説は、次の3パターンのいずれかを設定します。

① 両側検定:母分散の差が 0 と異なることを検定する場合
 ・対立仮説 $${H_1}$$:$${\sigma^2_1 \neq \sigma^2_2}$$
② 片側検定:母分散の差が マイナス となることを検定する場合
 ・対立仮説 $${H_1}$$:$${\sigma^2_1 < \sigma^2_2}$$
③ 片側検定:母分散の差が プラス となることを検定する場合
 ・対立仮説 $${H_1}$$:$${\sigma^2_1 > \sigma^2_2}$$

テキストより引用

◆ ◆ ◆

■ 2つの正規母集団の母分散の差の検定:検定統計量の公式 p.180
2つの母分散の差の検定における検定統計量の公式をテキストよりお借りします。

2つの標本 $${\{x_{11}, x_{12}, \ldots, x_{1N_1}\}}$$、$${\{x_{21}, x_{22}, \ldots, x_{2N_2}\}}$$ による2つの母分散の差の検定統計量

$$
T(s_1^2, s_2^2) = \cfrac{s_1^2}{s_2^2}
$$

テキストの数式を引用

は自由度 $${N_1-1,N_2-1}$$ の $${F}$$ 分布に従います。
$${s_1^2}$$ はグループ1の標本分散、$${s_2^2}$$ はグループ2の標本分散です。

公式に則って「2つの母分散の差の検定関数」を定義します。
確率計算には scipy.stats を利用します。

### 2つの正規母集団の母分散の差の検定関数 p.180 ※両側検定のp値が自信ない

# 2つの正規母集団の母分散の差のF検定統計量の算出関数
def f_stat_pop_variance_diff(x_list1, x_list2):
    # 各グループの標本サイズ
    N1, N2 = len(x_list1), len(x_list2)
    # 各グループの標本平均
    x_bar1, x_bar2 = sum(x_list1) / N1, sum(x_list2) / N2
    # 各グループの標本分散
    s21 = sum([(x1 - x_bar1)**2 for x1 in x_list1]) / (N1 - 1)
    s22 = sum([(x2 - x_bar2)**2 for x2 in x_list2]) / (N2 - 1)
    # 戻り値: F検定統計量
    return s21 / s22

# 2つの正規母集団の母分散のF検定関数 ※確率計算はscipy.stats利用
def pop_variance_diff_ftest(x_list1, x_list2, alpha=0.05,
                            alternative='two-sided'):
    # 各グループの標本サイズ
    N1, N2 = len(x_list1), len(x_list2)
    # F検定統計量の算出
    f_val = f_stat_pop_variance_diff(x_list1, x_list2)
    # 自由度(N1-1,N2-1)のF分布の設定
    f_dist = stats.f(dfn=N1 - 1, dfd=N2 - 1)
    # 棄却限界値c_valとp値p_valの算出
    match alternative:
        case 'two-sided':
            c_val_lower = f_dist.ppf(q=alpha/2)
            c_val_upper = f_dist.ppf(q=1 - alpha/2)
            c_val = c_val_lower, c_val_upper
            half_val = f_dist.ppf(q=0.5)
            if f_val <= half_val:
                p_val = f_dist.cdf(x=abs(f_val)) * 2
            else:
                p_val = f_dist.sf(x=abs(f_val)) * 2
        case 'less':
            c_val = f_dist.ppf(q=alpha)
            p_val = f_dist.cdf(x=f_val)
        case 'greater':
            c_val = f_dist.ppf(q=1 - alpha)
            p_val = f_dist.sf(x=f_val)
    return {'f_value': f_val, 'c_value': c_val, 'alpha': alpha,
            'p_value': p_val}

# テスト
x_list1, x_list2 = [1, 2, 3], [1.5, 1.8, 2.0]
pop_variance_diff_ftest(x_list1, x_list2, alternative='greater')

テストデータ $${[1, 2, 3]}$$、$${[1.5, 1.8, 2.0]}$$ について
・帰無仮説 $${H_0}$$ 「母分散の差 $${\sigma_1^2 > \sigma_2^2}$$」
・有意水準 5%($${\alpha=0.05}$$)
・両側検定
で母分散の検定を実行します。

# テスト
list1, list2 = [1, 2, 3], [1.5, 1.8, 2.0]
pop_variance_diff_ftest(list1, list2, alternative='greater')

【実行結果】
「有意水準 5% で有意とは言えず、帰無仮説を棄却できない」です。

出力内容を簡単に説明します。

  • f_value:検定統計量 $${T}$$ の実現値

  • c_value:棄却限界値
    帰無仮説を棄却できる検定統計量 $${T}$$ のしきい値
    $${T}$$ の実現値が棄却限界値の外のとき、帰無仮説を棄却できる

  • alpha:有意水準 $${\alpha}$$

  • p_value:$${p}$$ 値
    帰無仮説のもとで検定統計量が実現値になる確率
    $${p}$$ 値が有意水準以下(または未満)のとき、帰無仮説を棄却できる

◆ ◆ ◆

■ 2つの母分散の差の検定(両側検定)例題 p.181
p.181 例)の「利根川水系」と「信濃川水系」に生息するイワナの体長のバラツキに差があるか、2つの母分散の差の検定で調べます。

イワナのイラスト:「いらすとや」さんより

仮説は次のとおりです。
・帰無仮説 $${H_0}$$ 「母分散の差 $${\sigma^2_1=\sigma^2_2}$$」
・対立仮説 $${H_1}$$ 「母分散の差 $${\sigma^2_1 \neq \sigma^2_2}$$」
 ⇒両側検定:差の有無自体に興味がある

① 自作関数で検定実行
まず2つのデータを設定します。

### 2つの母分散の差の検定 イワナの体長 p.181

# データ
tone = [165, 130, 182, 178, 194, 206, 160, 122, 212, 165, 247, 195]
shinano = [180, 180, 235, 270, 240, 285, 164, 152]

続いて、有意水準 $${5\%}$$、両側検定で2つの母分散の差の検定を実行します。

# 関数利用
result = pop_variance_diff_ftest(tone, shinano)
result

【実行結果】
検定統計量 $${T=0.4727}$$ は、棄却限界値(下側の閾値) $${0.2661}$$ より大きい(棄却域に入らない)ので、有意水準 $${5\%}$$ で帰無仮説は棄却できません。

つまり、2つの河川のイワナの体長のバラツキに差があるとは言えないです。

② 検定の可視化
$${F}$$ 分布を可視化して棄却できない様子を見てみましょう。

### 図示 p.183

## 設定と準備
# 統計関連の値
N1, N2 = len(tone), len(shinano)  # 標本サイズ
alpha = result['alpha']           # 有意水準
lower, upper = result['c_value']  # 棄却限界値
f_val = result['f_value']         # 検定統計量
f_dist = stats.f(dfn=N1 - 1, dfd=N2 - 1) # F分布
# グラフ描画用設定
color = 'tab:blue'                            # 基本の色
x_min, x_max = 0, 10                          # x軸の最小値、最大値
x_val = np.linspace(x_min, x_max, 1001)       # 確率密度関数用のx軸の値
x_val_lower = np.linspace(x_min, lower, 101)  # 下側棄却域用のx軸の値
x_val_upper = np.linspace(upper, x_max, 101)  # 上側棄却域用のx軸の値

## 描画処理
# 描画領域の設定
plt.figure(figsize=(7, 3))
# t分布の確率密度関数の描画
plt.plot(x_val, f_dist.pdf(x_val), color=color,
         label=f'自由度({N1}-1, {N2}-1)の$F$分布')
# 下側棄却域の塗りつぶし
plt.fill_between(x_val_lower, 0, f_dist.pdf(x_val_lower),
                 color=color, alpha=0.3, label=f'有意水準{alpha}の棄却域')
# 上側棄却域の塗りつぶし
plt.fill_between(x_val_upper, 0, f_dist.pdf(x_val_upper),
                 color=color, alpha=0.3)
# 検定統計量の垂直線の描画
plt.axvline(f_val, color='tab:red', ls='--', label=f'検定統計量={t_val:.3f}')
# 修飾
plt.xticks([lower, upper])
plt.legend();

【実行結果】

左に偏った曲線は自由度 $${N_1-1,N_2-1=(11, 7)}$$ の $${F}$$ 分布の確率密度関数です。
両端の青い領域が有意水準 $${5\%}$$ の棄却域です。
両側検定なので両端に棄却域が $${2.5\%}$$ 分づつあります。
赤い点線が検定統計量 $${T}$$ です。

$${T}$$ が両方の棄却域に入っていないので、帰無仮説を棄却できないのです。

ちょっと寄り道:ルビーンの検定

テキスト p.181 の最後にウサギが「等分散性の検定にはほかに ルビーンの検定 というものもあります」と述べています。
ルビーンの検定を探しに行きましょう!

ルビーンの検定の特徴を統計WEBさん記事をお借りして押さえます。

【特徴】

  • 等分散性の検定の1つ

  • 帰無仮説「各グループの偏差の絶対値の平均は互いに等しい」を検定する

  • ハートレイの検定やバートレットの検定に比べて、母集団の正規性をあまり必要としないとされている

イワナ体長のバラツキに差があるかをルビーンの検定で確認してみましょうう。
まずは scipy.stats で。

### ルビーンの検定 scipy.stats利用 p.181
# 帰無仮説:複数の標本の母分散は等しい
stats.levene(tone, shinano, center='mean')

【実行結果】
検定統計量 $${T}$$ と $${p}$$ 値を得ました。
$${p}$$ 値は $${0.069}$$ であり、有意水準 $${5\%}$$ で有意と言えず、帰無仮説を棄却できません。

続いて pingouin で。

# pingouin利用
pg.homoscedasticity(data=dict(利根川=tone, 信濃川=shinano), method='levene',
                    center='mean')

【実行結果】
equal_var = True は「データの分散は等しい」の意味です。

また「等分散性の検定」の各種検定方法を比較したWEB記事をご紹介します。

理解度チェック 2つの母分散の差の検定 p.84

2つの金融商品の投資収益率のリスク(≒バラツキ)に差があるのかを、2つの母分散の差の検定で確かめます。
有意水準 $${5\%}$$、片側検定(1つ目の金融商品の方が大きい)で、コードで淡々と書きます。

標本データを設定します。
stock_A が金融商品A、stock_B が金融商品Bです。

### 2つの母分散の差の検定 投資収益率 p.184

# データ
stock_A = [-2.8, -14.8, -9.3, 2.7, -19.8, -15.2, 21.4, 14.2, -10.8, -4.5]
stock_B = [-6.3, -8.5, -2.4, 4.9, -11.6, -2.7, 10.3, 6.9, 1.5, -3.6]

自作関数で検定を実行します。

# 関数利用
result = pop_variance_diff_ftest(stock_A, stock_B, alternative='greater')
result

【実行結果】
帰無仮説は棄却されます。

$${F}$$ 分布を可視化して棄却できる様子を見てみましょう。

### 図示 p.185

## 設定と準備
# 統計関連の値
N1, N2 = len(stock_A), len(stock_B)  # 標本サイズ
alpha = result['alpha']              # 有意水準
upper = result['c_value']            # 棄却限界値
f_val = result['f_value']            # 検定統計量
f_dist = stats.f(dfn=N1 - 1, dfd=N2 - 1) # F分布
# グラフ描画用設定
color = 'tab:blue'                            # 基本の色
x_min, x_max = 0, 10                          # x軸の最小値、最大値
x_val = np.linspace(x_min, x_max, 1001)       # 確率密度関数用のx軸の値
x_val_upper = np.linspace(upper, x_max, 101)  # 上側棄却域用のx軸の値

## 描画処理
# 描画領域の設定
plt.figure(figsize=(7, 3))
# t分布の確率密度関数の描画
plt.plot(x_val, f_dist.pdf(x_val), color=color,
         label=f'自由度({N1}-1, {N2}-1)の$F$分布')
# 上側棄却域の塗りつぶし
plt.fill_between(x_val_upper, 0, f_dist.pdf(x_val_upper),
                 color=color, alpha=0.3, label=f'有意水準{alpha}の棄却域')
# 検定統計量の垂直線の描画
plt.axvline(f_val, color='tab:red', ls='--', label=f'検定統計量={t_val:.3f}')
# 修飾
plt.xticks([lower, upper])
plt.legend();

【実行結果】

Section 4.8 2つの母比率の差の検定

テキストは 2つの母集団が従う確率分布を明示していません。

【仮説】
覆したい母比率の差 $${p_1 - p_2}$$ の仮説を次のように設定します。

帰無仮説 $${H_0}$$:$${p_1 - p_2 = 0}$$

テキストより引用

支持したい仮説=対立仮説は、次の3パターンのいずれかを設定します。

① 両側検定:母比率の差が 0 と異なることを検定する場合
 ・対立仮説 $${H_1}$$:$${p_1 - p_2 \neq 0}$$
② 片側検定:母比率の差が マイナス となることを検定する場合
 ・対立仮説 $${H_1}$$:$${p_1 - p_2 < 0}$$
③ 片側検定:母比率の差が プラス となることを検定する場合
 ・対立仮説 $${H_1}$$:$${p_1 - p_2 > 0}$$

テキストより引用

◆ ◆ ◆

■ 2つの母比率の差の検定:検定統計量の公式 p.186
2つの母比率の差の検定における検定統計量の公式をテキストよりお借りします。

2つの母比率の差 $${p_1 - p_2}$$ の検定統計量

$$
T(m_1, m_2, N_1, N_2) = \cfrac{\cfrac{m_1}{N_1} - \cfrac{m_2}{N_2}}{\sqrt{p^*(1-p^*)\left(\cfrac{1}{N_1}+\cfrac{1}{N_2}\right)}}
$$

テキストの数式を引用

は標準正規分布に従います。
グループ1、グループ2を示す添字 $${_{1, 2}}$$ を $${_i}$$ で置き換えると、$${N_i}$$ は標本サイズ、$${m_i}$$ は各グループの値 $${1}$$(「はい」「成功」など)の個数、 $${m_i/N_i}$$ は標本平均です。
$${p^*}$$ は共通の比率 $${P^* = \cfrac{m_1 + m_2}{N_1 + N_2}}$$ です。

公式に則って「2つの母比率の差の検定関数」を定義します。
確率計算には scipy.stats を利用します。

### 2つの母比率の差の検定関数 p.186

# 2つの母比率の差のz検定統計量の算出関数
def z_stat_pop_ratio_diff(m1, m2, N1, N2):
    # 共通の比率p*
    p_aster = (m1 + m2) / (N1 + N2)
    # 戻り値: z検定統計量
    return (m1/N1 - m2/N2) / math.sqrt(p_aster * (1 - p_aster) * (1/N1 + 1/N2))

# 2つの母比率のz検定関数 ※確率計算はscipy.stats利用
def pop_ratio_diff_ztest(m1, m2, N1, N2, alpha=0.05, alternative='two-sided'):
    # z検定統計量の算出
    z_val = z_stat_pop_ratio_diff(m1, m2, N1, N2)
    # 標準正規分布の設定
    std_norm_dist = stats.norm(loc=0, scale=1)
    # 棄却限界値c_valとp値p_valの算出
    match alternative:
        case 'two-sided':
            c_val = std_norm_dist.ppf(q=1 - alpha/2)
            c_val = -c_val, c_val
            p_val = std_norm_dist.sf(x=abs(z_val)) * 2
        case 'less':
            c_val = std_norm_dist.ppf(q=alpha)
            p_val = std_norm_dist.cdf(x=z_val)
        case 'greater':
            c_val = std_norm_dist.ppf(q=1 - alpha)
            p_val = std_norm_dist.sf(x=z_val)
    return {'z_value': z_val, 'c_value': c_val, 'alpha': alpha, 'p_value': p_val}

テストデータ $${m_1=1, m_2=2, N_1=3, N_2=4}$$ について
・帰無仮説 $${H_0}$$ 「母比率の差 $${p_1 -p_2 = 0}$$」
・有意水準 5%($${\alpha=0.05}$$)
・両側検定
で母比率の検定を実行します。

# テスト
m1, m2, N1, N2 = 1, 2, 3, 4
pop_ratio_diff_ztest(m1, m2, N1, N2)

【実行結果】
「有意水準 5% で有意とは言えず、帰無仮説を棄却できない」です。

出力内容を簡単に説明します。

  • z_value:検定統計量 $${T}$$ の実現値

  • c_value:棄却限界値
    帰無仮説を棄却できる検定統計量 $${T}$$ のしきい値
    $${T}$$ の実現値が棄却限界値の外のとき、帰無仮説を棄却できる

  • alpha:有意水準 $${\alpha}$$

  • p_value:$${p}$$ 値
    帰無仮説のもとで検定統計量が実現値になる確率
    $${p}$$ 値が有意水準以下(または未満)のとき、帰無仮説を棄却できる

scipy.stats で検算します。

# statsmodelsで答え合わせ
proportions_ztest(count=[m1, m2], nobs=[N1, N2])

【実行結果】
検算結果は一致しました。

◆ ◆ ◆

■ 2つの母比率の差の検定(両側検定)例題 p.187
p.187 例)の2つの地域のTV視聴率に差があるか、について2つの母比率の差の検定で調べます。

テレビをスマホで撮影する人のイラスト(男性):「いらすとや」さんより

仮説は次のとおりです。
・帰無仮説 $${H_0}$$ 「母比率の差 $${p_1 - p_2 = 0}$$」
・対立仮説 $${H_1}$$ 「母比率の差 $${p_1 - p_2 \neq 0}$$」
 ⇒両側検定:差の有無自体に興味がある

① 自作関数で検定実行
有意水準 $${5\%}$$、両側検定で2つの母比率の差の検定を実行します。

### 2つの母比率の差の検定 ドラマ視聴率 p.187

# 関数利用
m1, m2, N1, N2 = 469, 308, 1200, 900
result = pop_ratio_diff_ztest(m1, m2, N1, N2)
result

【実行結果】
検定統計量 $${T=2.283}$$ は、棄却限界値(上側の閾値) $${1.960}$$ より大きい(テキストによると棄却域に入る)ので、有意水準 $${5\%}$$ で帰無仮説は棄却されます。

つまり、2つ地域の視聴率に 差があると言える、です。

② 検定の可視化
標準正規分布を可視化して棄却される様子を見てみましょう。

### 図示 p.188

## 設定と準備
# 統計関連の値
alpha = result['alpha']           # 有意水準
lower, upper = result['c_value']  # 棄却限界値
z_val = result['z_value']         # 検定統計量
std_norm_dist = stats.norm(loc=0, scale=1)    # 標準正規分布
# グラフ描画用設定
color = 'tab:blue'                            # 基本の色
x_min, x_max = -3, 3                          # x軸の最小値、最大値
x_val = np.linspace(x_min, x_max, 1001)       # 確率密度関数用のx軸の値
x_val_lower = np.linspace(x_min, lower, 101)  # 下側棄却域用のx軸の値
x_val_upper = np.linspace(upper, x_max, 101)  # 下側棄却域用のx軸の値

## 描画処理
# 描画領域の設定
plt.figure(figsize=(7, 3))
# 標準正規分布の確率密度関数の描画
plt.plot(x_val, std_norm_dist.pdf(x_val), color=color, label=f'標準正規分布')
# 下側棄却域の塗りつぶし
plt.fill_between(x_val_lower, 0, std_norm_dist.pdf(x_val_lower),
                 color=color, alpha=0.3, label=f'有意水準{alpha}の棄却域')
# 上側棄却域の塗りつぶし
plt.fill_between(x_val_upper, 0, std_norm_dist.pdf(x_val_upper),
                 color=color, alpha=0.3)
# 検定統計量の垂直線の描画
plt.axvline(z_val, color='tab:red', ls='--', label=f'検定統計量={z_val:.3f}')
# 修飾
plt.xticks([lower, 0, upper])
plt.legend();

【実行結果】

ベル型の曲線は標準正規分布の確率密度関数です。
両端の青い領域が有意水準 $${5\%}$$ の棄却域です。
両側検定なので両端に棄却域が $${2.5\%}$$ 分づつあります。
赤い点線が検定統計量 $${T}$$ です。

$${T}$$ が両方の棄却域に入っているので、帰無仮説は棄却されます。

③ Python ライブラリで検定実行
statsmodels を利用します。
引数 count に 各グループの「視聴した人」の数、nobs に2つのグループの標本サイズを渡しています。

# statsmodels利用
proportions_ztest(count=[m1, m2], nobs=[N1, N2])

【実行結果】
検定統計量と $${p}$$ 値です。

理解度チェック 2つの母比率の差の検定 p.189

内閣支持率が男女間で差があるのかを、2つの母比率の差の検定で確かめます。
有意水準 $${5\%}$$、両側検定で、コードで淡々と書きます。

標本データを設定します。

### 2つの母比率の差の検定 内閣支持率 p.189

# データ
m1, m2, N1, N2 = 175, 184, 400, 500

# データフレーム化
data1 = pd.DataFrame({'支持する': [m1, m2], '支持しない': [N1 - m1, N2 - m2]},
                     index=['女性', '男性'])
display(data1)

# 比率化
data1_ratio = data1.apply(lambda x: x / sum(x), axis=1)
display(data1_ratio)

【実行結果】
上が人数、下が比率です。
比率を見ると差がありそうにも、なさそうにも見えます。

自作関数で検定を実行します。

# 関数利用
result = pop_ratio_diff_ztest(m1, m2, N1, N2)
result

【実行結果】
帰無仮説は棄却されます。

statsmodels で検定を実行します。

# statsmodels利用
proportions_ztest(count=[m1, m2], nobs=[N1, N2])

【実行結果】

標準正規分布を可視化して棄却できる様子を見てみましょう。

### 図示 p.189

## 設定と準備
# 統計関連の値
alpha = result['alpha']           # 有意水準
lower, upper = result['c_value']  # 棄却限界値
z_val = result['z_value']         # 検定統計量
std_norm_dist = stats.norm(loc=0, scale=1)    # 標準正規分布
# グラフ描画用設定
color = 'tab:blue'                            # 基本の色
x_min, x_max = -3, 3                          # x軸の最小値、最大値
x_val = np.linspace(x_min, x_max, 1001)       # 確率密度関数用のx軸の値
x_val_lower = np.linspace(x_min, lower, 101)  # 下側棄却域用のx軸の値
x_val_upper = np.linspace(upper, x_max, 101)  # 下側棄却域用のx軸の値

## 描画処理
# 描画領域の設定
plt.figure(figsize=(7, 3))
# 標準正規分布の確率密度関数の描画
plt.plot(x_val, std_norm_dist.pdf(x_val), color=color, label=f'標準正規分布')
# 下側棄却域の塗りつぶし
plt.fill_between(x_val_lower, 0, std_norm_dist.pdf(x_val_lower),
                 color=color, alpha=0.3, label=f'有意水準{alpha}の棄却域')
# 上側棄却域の塗りつぶし
plt.fill_between(x_val_upper, 0, std_norm_dist.pdf(x_val_upper),
                 color=color, alpha=0.3)
# 検定統計量の垂直線の描画
plt.axvline(z_val, color='tab:red', ls='--', label=f'検定統計量={z_val:.3f}')
# 修飾
plt.xticks([lower, 0, upper])
plt.legend();

【実行結果】


記事の最後をChatGPTに締めくくってもらいましょう!

📘 ChatGPTのひとこと:

平均だけじゃない、ばらつきや割合にも、データの大切なメッセージが宿っています。
統計的検定を通して、その“違い”に確かな意味を見つけられるようになると、データを見る目が、またひとつ豊かになりますね。

今回の写経は以上です。


シリーズの記事

次の記事

前の記事

目次

ブログの紹介


note で7つのシリーズ記事を書いています。
ぜひ覗いていってくださいね!

1.のんびり統計

統計検定2級の問題集を手がかりにして、確率・統計をざっくり掘り下げるブログです。
雑談感覚で大丈夫です。ぜひ覗いていってくださいね。
統計検定2級公式問題集CBT対応版に対応しています。
Python、EXCELのサンプルコードの配布もあります。

2.実験!たのしいベイズモデリング1&2をPyMC Ver.5で

書籍「たのしいベイズモデリング」・「たのしいベイズモデリング2」の心理学研究に用いられたベイズモデルを PyMC Ver.5で描いて分析します。
この書籍をはじめ、多くのベイズモデルは R言語+Stanで書かれています。
PyMCの可能性を探り出し、手軽にベイズモデリングを実践できるように努めます。
身近なテーマ、イメージしやすいテーマですので、ぜひぜひPyMCで動かして、一緒に楽しみましょう!

3.実験!岩波データサイエンス1のベイズモデリングをPyMC Ver.5で

書籍「実験!岩波データサイエンスvol.1」の4人のベイジアンによるベイズモデルを PyMC Ver.5で描いて分析します。
この書籍はベイズプログラミングのイロハをざっくりと学ぶことができる良書です。
楽しくPyMCモデルを動かして、ベイズと仲良しになれた気がします。
みなさんもぜひぜひPyMCで動かして、一緒に遊んで学びましょう!

4.楽しい写経 ベイズ・Python等

ベイズ、Python、その他の「書籍の写経活動」の成果をブログにします。
主にPythonへの翻訳に取り組んでいます。
写経に取り組むお仲間さんのサンプルコードになれば幸いです🍀

5.RとStanではじめる心理学のための時系列分析入門 を PythonとPyMC Ver.5 で

書籍「RとStanではじめる心理学のための時系列分析入門」の時系列分析をPythonとPyMC Ver.5 で実践します。
この書籍には時系列分析のテーマが盛りだくさん!
時系列分析の懐の深さを実感いたしました。
大好きなPythonで楽しく時系列分析を学びます。

6.データサイエンスっぽいことを綴る

統計、データ分析、AI、機械学習、Pythonのコラムを不定期に綴っています。
統計・データサイエンス書籍にまつわる記事が多いです。
「統計」「Python」「数学とPython」「R」のシリーズが生まれています。

7.Python機械学習プログラミング実践記

書籍「Python機械学習プログラミング PyTorch & scikit-learn編」を学んだときのさまざまな思いを記事にしました。
この書籍は、scikit-learnとPyTorchの教科書です。
よかったらぜひ、お試しくださいませ。

最後までお読みいただきまして、ありがとうございました。

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

ネイピア DS 応援ありがとうございます。これからもがんばって記事を作成します!

この記事が参加している募集