都道府県の人口比率に基づく無作為抽出

当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

【pandas】都道府県無作為抽出関数

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

# PYTHON_PREFECTURE

# In[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, encoding="SHIFT-JIS")

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

# In[2]

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

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

# In[3]

prefecture

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

# In[4]

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

print(pop_sum)
# 127084134

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

# In[5]

# 都道府県別人口比を計算
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
'''

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

# In[6]

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

print(ratio_sum)
# 0.9999999999999999

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

# In[7]

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

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

# In[8]

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

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

# In[9]

np.random.seed(0)

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

# '静岡県'

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

# In[10]

# 都道府県別の人口・面積データの読み込み
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() を使って都道府県を抽出してみます。

# In[11]

np.random.seed(1)

# 都道府県をランダムに生成
for i in range(5):
    x = rand_prefecture()
    print(x)

# 兵庫県
# 群馬県
# 東京都
# 愛知県
# 神奈川県

コメント

  1. あとりえこばと より:

    【プログラミング日記】
     最近、このサイトの更新頻度が落ちています。
     と言いつつも、日記はちょくちょく更新していたりします。
    「猫の記事とか書いてる暇あったら、プログラミングの記事書いたらいいじゃん」
    と思われるかもしれませんが、日記は 10 分ほどで書けるので、それほどの手間ではありません。

    本題に戻りますが、サイトの更新頻度が落ちた理由は2つあります。
    ① 体調が思わしくない。
    ② 大規模アプリケーションを開発中

    ① については、いやほんと、かなりやばいです。
    内臓疲労が半端ない。寝ても疲れがとれない。心臓が痛い。もう若くもないくせに、毎日長時間 PC とにらめっこしながらプログラミングしていると、こんなふうになってしまうものだなと溜息をついております。そんな状態で、同時並行でアプリケーションの開発も行っているので、労力が分散されてしまって記事更新がおぼつかなくなっております。まだまだ皆様にお届けしなくてはならない (と勝手に思っている) 情報はたくさんあります。体力は右肩下がりですが、熱意は衰えておりません。自分の年齢と相談して小休止を入れながら、これからもコツコツと頑張っていきます。サイドバー (記事の右側) に「最近の投稿」というメニューがあって、上から新しい順に 5 記事が並んでいます。サイトが更新されているか気になる人はサイドバーを見るようにしてください。

  2. あとりえこばと より:

    ChatGPTに「日本の都道府県の人口比率に基づいて、都道府県名を無作為抽出する関数を定義して」と頼むと、以下のようなコードを書いてくれました。

    import random
    
    # 都道府県と人口の辞書
    population_data = {
        '北海道': 5320000,
        '青森県': 1270000,
        '岩手県': 1250000,
        '宮城県': 2330000,
        '秋田県': 1030000,
        '山形県': 1090000,
        '福島県': 1910000,
        '茨城県': 2910000,
        '栃木県': 1970000,
        '群馬県': 1970000,
        '埼玉県': 7340000,
        '千葉県': 6260000,
        '東京都': 13900000,
        '神奈川県': 9200000,
        '新潟県': 2340000,
        '富山県': 1070000,
        '石川県': 1150000,
        '福井県': 777000,
        '山梨県': 835000,
        '長野県': 2040000,
        '岐阜県': 2010000,
        '静岡県': 3700000,
        '愛知県': 7550000,
        '三重県': 1800000,
        '滋賀県': 1420000,
        '京都府': 2590000,
        '大阪府': 8820000,
        '兵庫県': 5520000,
        '奈良県': 1360000,
        '和歌山県': 945000,
        '鳥取県': 573000,
        '島根県': 688000,
        '岡山県': 1900000,
        '広島県': 2800000,
        '山口県': 1350000,
        '徳島県': 756000,
        '香川県': 976000,
        '愛媛県': 1370000,
        '高知県': 697000,
        '福岡県': 5110000,
        '佐賀県': 824000,
        '長崎県': 1350000,
        '熊本県': 1760000,
        '大分県': 1160000,
        '宮崎県': 1080000,
        '鹿児島県': 1600000,
        '沖縄県': 1430000
    }
    
    def random_prefecture():
        # 人口データから都道府県名と人口をリストに分割
        prefectures, populations = zip(*population_data.items())
        
        # 人口を合計
        total_population = sum(populations)
        
        # 人口比率を計算
        probabilities = [population / total_population for population in populations]
        
        # 人口比率に基づいて都道府県を無作為に選択
        selected_prefecture = random.choices(prefectures, probabilities)[0]
        
        return selected_prefecture
    
    # テスト
    print(random_prefecture())