くぴんのブログ

くぴんのブログ

PR

プロフィール

くぴん74

くぴん74

カレンダー

カテゴリ

お気に入りブログ

DOW 44296.51 +426.1… New! どらりん0206さん

2021~24PF概況493位… みきまるファンドさん

楽天ラッキーくじ更… じゃっかすさん

訃報相次ぐ Maryu21さん

自分を愛することは… まりあのじいじさん

キーワードサーチ

▼キーワード検索

2023年07月17日
XML
カテゴリ: プログラミング
pythonの勉強としてやってみた。

↓条件
1. 初期条件→総人口100万人(男50万人、女50万人)、0~100歳までrandint(0,101)で一様分布。
2. 期間は100年間
3. 途中で死亡することはなく、すべて100歳まで生き、101歳になったら消える
4. 適齢期(18~40)の男か女、少ない方の数に割合(0.1など)をかけた数が毎年出生する
5. 男児の出生率を0.51

↓定常シナリオ (4の割合を0.1)


↓減少シナリオ (4の割合を0.02)





↓早婚 (15~35)

↓晩婚 (25~45)






このモデルでは適齢期を約20年であり一様分布なため適齢期人口は20万人。カップル数は10万。ここから0.1の割合で出生すると1万人となって、ほぼ定常状態となる。

当たり前だけれど、増加シナリオでは、早婚であれば、再生産のサイクルが早く回るため、晩婚に比べて人口が早く増える。

このモデルでは、個体識別せずに、ざっくりと適齢期の半分をカップルとし、そこからある割合で再生産されるとしている。人口を増やすという観点からは、やはり結婚という形態にとらわれずに、適齢期の人たちが、毎年、前の年よりも多く生んでくれると効果がありそうだ。

可視化は以下のサイトを参考にした。
https://note.com/michell72/n/nf4183efdc5da

pngからgifを作成するには、以下のコマンドをsubprocessで実行した。環境はUbuntu 22.04.2 LTS。
cmd="convert -delay 30 -loop 0 graph0*png graph_.gif"
subprocess.call(cmd.split())

↓ソースコード
-----

population simulation
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

import subprocess

sta=time.time()

timespan=100
ratio=0.1
male_ratio=0.51
# children are born from couple between lower and upper years old.
lower=18
upper=40
lifespan=100
ini_pop=500000

print("timespan=",timespan,"ratio=",ratio,"male_ratio=",male_ratio,
        "lower=",lower,"upper=",upper,"lifespan=",lifespan,"ini_pop=",ini_pop)


def plot(male, female):
    fig, ax = plt.subplots(ncols=2, figsize=(6,8))

    male1=pd.Series([len(male[male==i]) for i in range(lifespan+1)])
    female1=pd.Series([len(female[female==i]) for i in range(lifespan+1)])

    # male
    ax[0].barh(male1.index, male1, color='b', height=0.7, label='male', alpha = 1)
    ax[0].yaxis.tick_right() # x reverse
    ax[0].set_yticklabels([]) #hide ticks
    ax[0].set_xlim([male1.max()*1.1, 0])# x reverse
    ax[0].set_title('MALE',fontsize=18)
    ax[0].xaxis.grid(True, which = 'major', linestyle = '--', color = '#CFCFCF')
    #plt.setp(ax[0].get_xticklabels(), fontsize=14)

    # female
    ax[1].barh(female1.index, female1, color='r', height=0.7, label='female', alpha = 1)
    ax[1].set_xlim([0,female1.max()*1.1])
    ax[1].set_title('FEMALE',fontsize=18)
    ax[1].xaxis.grid(True, which = 'major', linestyle = '--', color = '#CFCFCF')

    fig.suptitle("year="+str(year)+", population="+str(len(male)+len(female)), size=18)

    plt.savefig('graph'+str(year).rjust(4,"0")+'.png')
    #plt.show()
    plt.close(fig)

#initial male and female for 500,000
male=pd.Series(np.random.randint(0,lifespan+1,ini_pop))
female=pd.Series(np.random.randint(0,lifespan+1,ini_pop))

new_b=0

for year in range(timespan+1):
    plot(male, female)
    print("year=", year, "new_b=", new_b, "male= ",len(male), "female= ",
            len(female), "population= ", len(male)+len(female))
    # children are born from couple between lower and upper years old.
    young_m=len(male[lower<male][male<upper])
    young_f=len(female[lower<female][female<upper])
    new_b=int(ratio*min(young_m, young_f))
    n_male=int(male_ratio*new_b)
    # aging
    male=male+1
    female=female+1
    # children are added
    male=pd.concat([male, pd.Series(np.zeros(n_male))])
    female=pd.concat([female, pd.Series(np.zeros(new_b-n_male))])
    male=male.reset_index(drop=True)
    female=female.reset_index(drop=True)
    male=male[male<lifespan]
    female=female[female<lifespan]
plot(male, female)

cmd="convert -delay 30 -loop 0 graph0*png graph_.gif"
subprocess.call(cmd.split())

fin=time.time()
print("elapsed time [sec]=", fin-sta)
-----
何かの参考になれば幸いです。


にほんブログ村 サラリーマン日記ブログ 戦うサラリーマンへ
にほんブログ村





お気に入りの記事を「いいね!」で応援しよう

最終更新日  2023年07月17日 11時16分40秒
コメントを書く
[プログラミング] カテゴリの最新記事


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: