今回はこのサイトのpandasのtutorialをやる。UNHCR(UN Refugee Agency:国際連合難民高等弁務官事務所)のデータを使用しているチュートリアルで非常に興味深い。
環境設定¶
mkdir refu
cd refu
このサイトからデータをダウンロードフォルダにダウンロードしてから、上で作成した作業用フォルダに移動する。
!mv ../download/unhcr_popstats_export_persons_of_concern_all_data.csv .
データのロード¶
モジュールをインポートしてデータをロードする。
%matplotlib inline
import pandas as pd
# Reading in the first table
persons = pd.read_csv('unhcr_popstats_export_persons_of_concern_all_data.csv'\
, skiprows=4, encoding = "ISO-8859-1")
# Showing top 5 rows
persons.head()
# Showing last 5 rows
persons.tail()
# Let's get summary information
persons.info()
# Re-read in the data
persons = pd.read_csv('unhcr_popstats_export_persons_of_concern_all_data.csv'\
, header=3, na_values = '*', encoding = "latin1")
# Checking if we resolved the issues
persons.tail()
persons.info()
pandasによるデータいじり¶
分析に邪魔な長ったらしい列名を短くする。
per_renamed = persons.rename(index=str, columns ={'Country / territory of asylum/residence': 'Residence',
'Refugees (incl. refugee-like situations)': 'Refugees',
'Asylum-seekers (pending cases)': 'Asylum-seekers',
'Internally displaced persons (IDPs)': 'IDPs'})
per_renamed.head()
特定のコラムを見るにはどうすればいいのか?
per_renamed['Origin']
何カ国から難民や亡命者が来ているのかを見る。
per_renamed['Origin'].nunique()
ソマリアから来た難民にスポットを当てる。
somali = per_renamed[per_renamed['Origin'] == 'Somalia']
somali
2000〜2017年にアメリカに来た難民に焦点を当てる。
somali_us = somali[(somali['Residence'] == 'United States of America') &
(somali['Year'] >= 2000) & (somali['Year'] <= 2017)]
somali_us
上の数値データを時系列でプロットする。
# Selecting the population-data columns that do not have null values
pops = somali_us.select_dtypes(include=['float'])
pop_nonnull = pops.dropna(axis=1, how='any')
pop_nonnull.columns
# Plotting the time series (don't worry if a UserWarning appears due to passing a list of values to the y parameter;
# this is a known issue in pandas and may be resolved in future versions of the library)
plt.rcParams['figure.figsize'] = 16, 8
plt.rcParams["font.size"] = "17"
pl = somali_us.plot(x='Year', y=pop_nonnull.columns)
pl.set_ylabel('Persons')
pl.set_title('Somali-to-U.S.')
テーブルのマージ¶
2つのテーブルはマージする。もう一つのテーブルはUNHCRが提供している1959年〜2017年の難民・亡命者数を居住国と出身国に分けてあるテーブル。前回同様、上述のサイトからデータをダウンロードして作業用フォルダに移動する。
!mv ../download/unhcr_popstats_export_resettlement_all_data.csv .
# Reading in resettlement table
resettle = pd.read_csv('unhcr_popstats_export_resettlement_all_data.csv', \
header=3, na_values = '*', encoding = "latin1")
resettle.head()
このデータをどうすればpersons-of-concern dataとマージできるのか?先ずResidence列をper_renamedデータフレームのネーミングコンベンションにマッチさせる。
# Also, rename "Value" to "Resettled"
resettle_renamed = resettle.rename(index=str, \
columns ={'Country / territory of asylum/residence': 'Residence',
'Value': 'Resettled'})
resettle_renamed.head()
# Remember per_renamed?
per_renamed.head()
Year, Residence, Originのコンビネーションでマージさせるのが良い。また、再定住データが1959年からスタートしているので、1951〜1959年に対応したper_renamedの行をキープしたいのかどうかについて考える必要がある。同じYear/Residence/Originに該当する行があるかどうかにかかわらずに最初のデータフレームからの全データをキープしたい場合、(SQLのleft joinのように)mergeでhow=’left’を指定できる。
# Let's say we want to keep the earlier data
left_join = pd.merge(per_renamed, resettle_renamed, how='left', \
on = ['Year', 'Residence', 'Origin'])
left_join[left_join['Residence'] == 'Japan'] # focusing on those who resettled in Japan
left_join = pd.merge(per_renamed, resettle_renamed, how='left', \
on = ['Year', 'Residence', 'Origin'])
left_join[left_join['Residence'] == 'United States of America']
日本の難民受け入れは先進国としてはあまりにもお粗末過ぎる。アメリカと比べるとその差は歴然で、アメリカに次ぐ世界第二位の経済大国だった時期もあったのにもかかわらずにこの体たらくっぷりだ。日本は移民・難民をもっと受け入れる必要があるが、移民と外国人労働者の区別も付かない人間が多い国なので無理な注文というものだろう。