Python:在留資格別外国人数を国籍別に棒グラフ化する

在留資格別外国人数を国籍別に棒グラフ化する。日本はもっと純粋な移民と難民を受け入れるべきだろう。毎年20万人の移民を受け入れるという話は何処へ行ったのかと思っていたが、2024年末203万3656人だった在留外国人数が、平成30年末には273万1093人に増えているので、安倍政権の6年間で70万人近く増えた計算になる。年20万人とはいかなくても、年10万人以上増えているので、今後に期待できそうである。

スポンサーリンク

データの下準備

import warnings
warnings.filterwarnings('ignore')
import tabula

df = tabula.read_pdf("http://www.moj.go.jp/content/001289225.pdf",
             output_format='dataframe',
             pages = '4',
             encoding='utf-8',
             java_options=None,
             pandas_options=None,
             multiple_tables=False)
df1=df.drop(['中長期在留者','Unnamed: 7'], axis=1)
df1=df1.rename(columns={'日本人の国籍・地域 計':'総数','技術・ 人文知識・':'技術・人文知識・国際業務','Unnamed: 10':'日本人の配偶者等'})
df1.head(2)
総数 特別永住者 永住者 留学 技能実習 技術・人文知識・国際業務 定住者 家族滞在 日本人の配偶者等 特定活動 その他
0 NaN NaN NaN NaN NaN 国際業務 NaN NaN 配偶者等 NaN NaN
1 総 数 2,731,093 321,416 771,568 337,000 328,360 225,724 192,014 182,452 142,381 62,956 167,222
import numpy as np

df2 = df1[np.arange(len(df)) % 2 != 0]
df2
総数 特別永住者 永住者 留学 技能実習 技術・人文知識・国際業務 定住者 家族滞在 日本人の配偶者等 特定活動 その他
1 総 数 2,731,093 321,416 771,568 337,000 328,360 225,724 192,014 182,452 142,381 62,956 167,222
3 中国 764,720 872 260,963 132,411 77,806 81,736 28,282 78,417 30,900 10,389 62,944
5 韓国 449,634 288,737 71,094 17,056 1 24,602 7,289 12,061 13,053 4,892 10,849
7 ベトナム 330,835 3 16,043 81,009 164,499 34,752 5,509 15,301 3,837 4,897 4,985
9 フィリピン 271,289 48 129,707 3,010 30,321 7,083 52,008 3,386 26,322 8,574 10,830
11 ブラジル 201,865 29 112,934 553 7 504 65,021 685 17,668 62 4,402
13 ネパール 88,951 3 4,480 28,987 257 8,541 817 26,017 821 4,078 14,950
15 台湾 60,684 1,159 21,601 10,603 6 11,587 1,566 2,162 4,439 4,782 2,779
17 米国 57,500 820 17,580 2,891 0 9,124 1,223 4,448 9,689 177 11,548
19 インドネシア 56,346 8 6,438 7,213 26,914 2,679 2,107 2,953 2,072 4,151 1,811
21 タイ 52,323 12 20,142 4,355 9,639 2,199 3,922 785 7,223 229 3,817
23 その他 396,946 29,725 110,586 48,912 18,910 42,917 24,270 36,237 26,357 20,725 38,307
for i, col in enumerate(df2.columns):
    df2.iloc[:, i] = df2.iloc[:, i].str.replace(',','').str.replace(' ','')
import re

b=[]
for i in df2['総数']:
    a = re.split('(\d+)', i)
    b.append(a)
m=[]
n=[]
for i,j,k in b:
    m.append(i)
    n.append(j)
df2['総数']=n
df2['国名']=m
cols = df2.columns.tolist()
cols = cols[-1:] + cols[:-1]
df2 = df2[cols]
import pandas as pd

df2 = df2.set_index(['国名'])
df2 = df2.apply(pd.to_numeric, errors="coerce").astype(int)
スポンサーリンク

韓国をプロットする

from matplotlib.pyplot import *
from matplotlib.font_manager import FontProperties
from matplotlib import rcParams
style.use('fivethirtyeight')

fp = FontProperties(fname='/usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf', size=54)
rcParams['font.family'] = fp.get_name()
rcParams["font.size"] = "25"
fig, ax = subplots(figsize=(25,12))
rc('xtick', labelsize=35)
rc('ytick', labelsize=35)
df2.iloc[2:3:,1:11].T.sort_values(by='韓国',ascending=False).plot(ax=ax,kind='barh')
xticks(np.arange(0,3.1e5,1e5/6),
   ['{}万'.format(int(x/1e4)) if x > 0 else 0 for x in np.arange(0,3.1e5,1e5/6)])
ax.legend(loc='best', fancybox=True, framealpha=0.5, fontsize=40)
for i in ax.patches:
    ax.text(i.get_width()+1.5e3,i.get_y()+.45,\
      '{:,}人'.format(int(round((i.get_width()), 2))), fontsize=35, color='k')
ax.invert_yaxis();

韓国人技能実習生1人って誰なんだよ!と言いたくなるのは私だけではないはずだ。

スポンサーリンク

10カ国+その他をまとめてプロットする

c = cm.tab20(np.linspace(0.1, 0.9, 11))
fig, ax = subplots(figsize=(20,14))
rc('xtick', labelsize=20)
rc('ytick', labelsize=25)
df2.iloc[1:12:,1:11].T.sort_values(by='韓国',ascending=False).plot(ax=ax,kind='barh',\
 color=c,stacked=True)
xticks(np.arange(0,8.1e5,1e5/2),
   ['{}万'.format(int(x/1e4)) if x > 0 else 0 for x in np.arange(0,8.1e5,1e5/2)])
ax.legend(loc='best', fancybox=True, framealpha=0.5, fontsize=40)
<matplotlib.legend.Legend at 0x7f54905c1c50>

技能実習では圧倒的にベトナム人が多いことに気付かされる。永住者では、中国人を別にすれば、フィリピン人とブラジル人が多い。ベトナム人留学生も中国人に次いで多いようである。技能実習生と留学生はもっと欲しいところである。

スポンサーリンク
スポンサーリンク