都道府県の無作為抽出

都道府県の無作為抽出

都道府県の無作為抽出

 都道府県別の人口比率 にもとづいて、出身都道府県を無作為抽出する関数 を作成してみます。最初に必要なモジュールをインポートして、当サイトから pop_area_jp.csv を読み込みます。

# PFC_01-1

import numpy as np
import pandas as pd

url = "https://python.atelierkobato.com/wp-content/uploads/pop_area_jp.csv"
data = pd.read_csv(url, engine = "python")

 pop_area_jp.csv はウィキペディアに掲載されている 2015 年の都道府県別人口・面積データです。読み込んだデータをオフラインでも参照できるようにローカルディスクに保存して、改めて読み込み直します。

# PFC_01-2

data.to_csv("pop_area", index=False)
prefecture = pd.read_csv("pop_area")

 prefecture の中身を確認しておきます。

prefecture

 47都道府県 (47-prefecture) 人口と面積

 上の表では一部分だけ抜粋していますが、実際には 47 都道府県の人口と面積が並びます。numpy.sum() を使って、都道府県の人口の総和をとります (すなわち日本の総人口を計算します)。

# PFC_01-3

# 日本の総人口を計算
pop_sum = np.sum(prefecture["人口"])

print(pop_sum)
127084134

 各都道府県人口をこの数字で割ると、総人口に対して各都道府県が占める割合を計算できます。

# PFC_01-4

# 人口比を計算
pop_ratio = prefecture["人口"]/pop_sum

print(pop_ratio)
0     0.105273
1     0.071598
2     0.069644
3     0.058579
4     0.056952
5     0.048769
・・・・・・・
Name: 人口, dtype: float64

 念のために人口比の総和を求めておきましょう。

# 人口比の総和を計算
ratio_sum = np.sum(pop_ratio)

print(ratio_sum)
0.9999999999999999

 本来であれば総和が 1 になるはずですが、総人口で除算したときに若干の誤差が生じています。pop_ratio の配列部分にアクセスして、変数 prob に格納しておきます。 

# PFC_01-5

# pop_ratioの配列(ndarray)にアクセス
prob = pop_ratio.values

 47都道府県一覧は以下のコードで取得できます。

# 47都道府県を格納した一次元配列を取得
arr = prefecture["都道府県"].values

 np.random.choice() を使って、都道府県を無作為に選択してみます。

# PFC_01-6

np.random.seed(0)

# 人口比に基づいて都道府県をランダムに選択
np.random.choice(arr, p=prob)
'静岡県'

 以上を関数にまとめておきます:

# PFC_02-1

import numpy as np
import pandas as pd

# 都道府県別の人口・面積データの読み込み
prefecture = pd.read_csv("pop_area")

# 都道府県を無作為抽出する関数
def rand_prefecture():
    pop_sum = np.sum(prefecture["人口"])
    pop_ratio = prefecture["人口"]/pop_sum
    arr = prefecture["都道府県"].values
    prob = pop_ratio.values
    c = np.random.choice(arr, p=prob)
    return c

 rand_prefecture() を使って都道府県を抽出してみます。

# PFC_02-2

np.random.seed(1)

# 都道府県をランダムに生成
for i in range(5):
    x = rand_prefecture()
    print(x)
兵庫県
群馬県
東京都
愛知県
神奈川県