都道府県別の人口動態を可視化してみた−MatplotlibでBubbleプロット

# はじめに
matplotlibでbubbleプロットをする記事がqiitaで見当たらなかったのでやってみました。
サンプルデータとして国勢調査の[男女別人口－全国，都道府県（大正９年～平成27年）](https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00200521&tstat=000001011777&cycle=0&tclass1=000001094741&result_page=1&second=1&second2=1) を使っています。

# バブルプロット
先に結果を見せると、バブルプロットはこんな感じのプロットです。１つ１つの円が都道府県、円の大きさが人口の数を表しています。座標の位置はランダムです。

![population.png](https://qiita-image-store.s3.amazonaws.com/0/176789/be398755-3d2a-fdb4-883b-7c8b418a70c7.png)

# データの整形
今回は普通にpandas.read_csvで読み込んで条件でフィルタをかけてやるだけです。注意すべき点としては元データのエンコーディングがShift-JISであることと、Seriesに対してある文字列を１つでも含む条件を書いているところでしょうか。ちなみにプロットする都道府県は、岩手、東京、愛知、高知、福岡、鹿児島を選びました。全く意味はありません。

```py
data = pd.read_csv("./c01.csv", encoding="Shift-JIS", skipfooter=2)
target_pref = ["岩手県", "東京都", "愛知県", "高知県", "福岡県", "鹿児島県"]
data_target = data[data.都道府県名.str.contains("|".join(target_pref))]
d = data_target[data_target['西暦（年）'] == 1920]
```

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>都道府県コード</th>
      <th>都道府県名</th>
      <th>元号</th>
      <th>和暦（年）</th>
      <th>西暦（年）</th>
      <th>注</th>
      <th>人口（総数）</th>
      <th>人口（男）</th>
      <th>人口（女）</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>3</th>
      <td>03</td>
      <td>岩手県</td>
      <td>大正</td>
      <td>9</td>
      <td>1920</td>
      <td>NaN</td>
      <td>845540</td>
      <td>421069</td>
      <td>424471</td>
    </tr>
    <tr>
      <th>13</th>
      <td>13</td>
      <td>東京都</td>
      <td>大正</td>
      <td>9</td>
      <td>1920</td>
      <td>NaN</td>
      <td>3699428</td>
      <td>1952989</td>
      <td>1746439</td>
    </tr>
    <tr>
      <th>23</th>
      <td>23</td>
      <td>愛知県</td>
      <td>大正</td>
      <td>9</td>
      <td>1920</td>
      <td>NaN</td>
      <td>2089762</td>
      <td>1033860</td>
      <td>1055902</td>
    </tr>
    <tr>
      <th>39</th>
      <td>39</td>
      <td>高知県</td>
      <td>大正</td>
      <td>9</td>
      <td>1920</td>
      <td>NaN</td>
      <td>670895</td>
      <td>332087</td>
      <td>338808</td>
    </tr>
    <tr>
      <th>40</th>
      <td>40</td>
      <td>福岡県</td>
      <td>大正</td>
      <td>9</td>
      <td>1920</td>
      <td>NaN</td>
      <td>2188249</td>
      <td>1116818</td>
      <td>1071431</td>
    </tr>
    <tr>
      <th>46</th>
      <td>46</td>
      <td>鹿児島県</td>
      <td>大正</td>
      <td>9</td>
      <td>1920</td>
      <td>NaN</td>
      <td>1415582</td>
      <td>682243</td>
      <td>733339</td>
    </tr>
  </tbody>
</table>

# バブルプロットの描画
matplotlibでバブルプロットを描画する場合、散布図を描画する関数`plt.scatter`で点のサイズを個別に変化させることで対応します。今回の解析ではx,yをランダムに生成したうえで、円のサイズz、色cを個別に指定しています。これで冒頭のグラフができるはずです。

```py
c = np.arange(0,12,2)
z = d['人口（総数）'].astype(int) / 1000
x = np.random.rand(6)
y = np.random.rand(6)
plt.scatter(x, y, s = z, alpha=0.5, c=c)
for i, t in enumerate(target_pref):
    plt.text(x[i]-0.025,y[i], t, fontsize=15)
```

# おまけ
せっかくなので年度毎にプロットしてアニメーションもつけてみました。東京・愛知・福岡は人口が増えているのに対して、岩手、高知、鹿児島はほとんど変化していません。1945年で東京の人口ががくっとへるあたりなどは、第二次世界大戦の影響の大きさを示唆しています。

![population.gif](https://qiita-image-store.s3.amazonaws.com/0/176789/7fcdccd6-9f98-43f1-daad-da43c58a98ed.gif)

以下にコードを載せます。アニメーションはいったんすべてpngに出力した後に`convert`でgifに変換して生成しています。

```py:bubble_anim.gif
for year in range(1920, 2016, 5):
    z = data_target[data_target["西暦（年）"] == year]['人口（総数）'].astype(int) / 1000
    plt.figure()
    plt.scatter(x, y, s = z, alpha=0.5, c=c)
    for i, t in enumerate(target_pref):
        plt.text(x[i]-0.025,y[i], t, fontsize=15)
    plt.xlim((-0.2,1.2))
    plt.ylim((-0.2,1.2))
    plt.title("{0}年".format(year))
    plt.axis('off')
    plt.savefig("./bubble/{0}.png".format(year))
```