Up

ブートストラッピング(平均値の分布)

 

サンプルに対する平均値の不安定さ(サンプル平均値の分布)をブートストラッピングによって推定する。すなわち、与えられたデータからランダムに繰り返しを許してサンプルサイズNのサンプリングを行い、そのサンプルに対して平均値を求める。このデータからのランダムサンプリングとそのサンプルに対する平均値の計算をn_simu回繰り返して平均値の分布を求める。Natsal-3のデータの平均値の分布のブートストラッピングによる推定を、Spiegelhalter(2019), p. xviに記載されているウェブサイトからダウンロードしたファイルを参考・使用したPythonスクリプトをリストのように作成した。入力ファイル02-4-sexual-partners-counts-x.csvは、Spiegelhalter(2019), p. xviに記載されているウェブサイトからダウンロードしたファイルに含まれているものである。

入力データファイルは、集計済みのものであるので、ブートストラッピングを適用するために、次のコードで個別データに展開している。

 

Data50 = []

TotalMen = 0

for P, C in zip(NumPartners50, MenCount50):

    if C > 0:

        Data50 += [P] * C

    TotalMen += C

Data50 = np.array(Data50)        #    ndarray型に変換

 

個別データData50に対して、次のコードでブートストラッピングによる平均値の分布を求めている。

 

n_sim = 1000                         #    ブートストラッピングにおけるシミュレーション数

sample_sizes = [10, 50, 200, 760]    #    ブートストラッピングにおけるサンプルサイズ

for iboot in range(4):

    means = []

    for isim in range(n_sim):

        sample = rng.choice(Data50, sample_sizes[iboot])

        means.append(np.mean(sample))

 

リスト1のスクリプトを実行すると、図1のグラフが表示される。

図1

 

サンプルサイズN1050200760に対する平均値の分布が描かれている。サンプルサイズが大きくなると、平均値の分布の幅は小さくなり、平均値が安定していくことが分かる。

 

 

 

リスト1 ブートストラッピング(平均値の分布)

 

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sb

import numpy as np

import numpy.random as nprd

 

#        ダウンロードしたファイルの読み込み

d_csv = pd.read_csv('02-4-sexual-partners-counts-x.csv')

data = d_csv.values

NumPartners = d_csv['NumPartners']

MenCount = d_csv['MenCount']

#

#       パートナー数が50以下の人に制限

#

NumPartners50 = NumPartners[NumPartners <= 50]

MenCount50 = MenCount[NumPartners <= 50]

#

#      集計データを個人データに展開

#

Data50 = []

TotalMen = 0

for P, C in zip(NumPartners50, MenCount50):

    if C > 0:

        Data50 += [P] * C

    TotalMen += C

Data50 = np.array(Data50)        #    ndarray型に変換

rng = nprd.default_rng()

#

#           描画画面を4行1列の配置で4画面用意する

#

fig, ax = plt.subplots(nrows=4, ncols=1, figsize=(5,7), sharex=True, sharey=True)

n_sim = 1000                         #    ブートストラッピングにおけるシミュレーション数

sample_sizes = [10, 50, 200, 760]    #    ブートストラッピングにおけるサンプルサイズ

for iboot in range(4):

    means = []

    for isim in range(n_sim):

        sample = rng.choice(Data50, sample_sizes[iboot])

        means.append(np.mean(sample))

 

    sb.kdeplot(means, ax=ax[iboot])

    ax[iboot].set_ylabel('Density')

    ax[iboot].text(1, 1, f'N={sample_sizes[iboot]}', ha='left', va='top')

 

ax[3].set_xlabel('Number of partners')

plt.tight_layout()

plt.show()

 

 

 

参考文献

岡本安晴(2019) いまさら聞けないPythonでデータ分析.丸善出版

Spiegelhalter, D. (2019). The art of statistics: Learning from data. Pelican

 

 

 

 

Home