【Pythonデータサイエンス入門】相関係数を使って日本の人口と世界の国々の人口との相関を調べてみよう

環境

macOS Sierra 10.12.6
ターミナル
Anaconda
Python 3.6.4

Anacondaをインストールすればデータサイエンスに必要なライブラリが使えるので、
ぜひインストールしましょう。

Anacondaのインストール手順についてはこちら
MacにAnacondaをインストールする

当記事で使うデータ

国際連合のデータを参照します。Population by Age Groups - Both Sexes (XLSX, 10.31 MB)というところからダウンロードしました。
https://esa.un.org/unpd/wpp/Download/Standard/Population/
(2018年3月20日に利用)

当記事では、各国の2015年の人口データ(男女合わせた)を使います。

相関係数でどれくらい関係性があるかわかる

相関係数は-1から1の間となります。
-1だと完全に関係ない、1だと完全に関係あるということです。

たとえば2つのリストで考えてみます。
[1, 2, 3]と[1, 2, 3]という2つのリストの相関係数は1となります。
[1, 2, 3]と[1, 2, 4]では、0.9819805060619659という結果が出ました。
[1, 2, 3]と[1, 2, 4]はかなり似ている、正の相関関係があります。

相関係数をPythonで求める

Pythonで相関係数を求めることができます。

そのプログラムを下記にまとめました。
モジュール名はcorrelation.pyです。

実行の仕方は簡単。比較したい2つのリストを引数に渡すだけ。

日本と世界30カ国との人口相関関係を調べる

結論のコードから書きます。
上記で書いたcorrelation.pyをインポートして使っています。
モジュール名はcorjp.pyとしました。

日本の人口と相関関係の高い国から順番に表示し、相関係数もあらわします。

$ python corjp.py などとして実行。

結果は、

1位はItalyで、相関係数は0.957
2位はGreeceで、相関係数は0.929
3位はSpainで、相関係数は0.907
4位はGermanyで、相関係数は0.903
5位はAustriaで、相関係数は0.890
6位はSwitzerlandで、相関係数は0.886
7位はBelgiumで、相関係数は0.875
8位はFranceで、相関係数は0.871
9位はCanadaで、相関係数は0.845
10位はSingaporeで、相関係数は0.815
11位はAustraliaで、相関係数は0.785
12位はAmericaで、相関係数は0.772
13位はNewZealandで、相関係数は0.759
14位はIrelandで、相関係数は0.757
15位はChinaで、相関係数は0.740
16位はArmeniaで、相関係数は0.631
17位はArgentinaで、相関係数は0.550
18位はColombiaで、相関係数は0.531
19位はTurkeyで、相関係数は0.525
20位はSaudiArabiaで、相関係数は0.473
21位はIndonesiaで、相関係数は0.461
22位はMyanmarで、相関係数は0.457
23位はMexicoで、相関係数は0.441
24位はIndiaで、相関係数は0.418
25位はEcuadorで、相関係数は0.411
26位はPhilippinesで、相関係数は0.341
27位はBrazilで、相関係数は0.335
28位はJordanで、相関係数は0.270
29位はPakistanで、相関係数は0.269
30位はIraqで、相関係数は0.196

解説、考え方、データサイエンス

データ集め

統計を利用したいと考えた時に、一番に思いついたのが人口でした。1次情報にあたりたかったので、総務省統計局のサイトを観ていると国際連合が世界の人口の統計を出していました。
データには種類があり、今回は男女合わせた人口で5歳刻み(0-4歳,5-9歳など)の人口リストを使用しました。

30カ国は任意に選びました。

単位は千人です。
たとえば日本の人口で見てみると、

Japan = [5396, 5560, 5670, 5980, 6139, 6756, 7609, 8481, 10046, 8722,
7988, 7661, 8674, 9627, 7704, 6255, 4876, 3073, 1328, 372, 58]

これは0-4歳は5,396,000人、すなわち539万6000人いるということです。続きは順に5-9歳、10-14歳、...となります。もし年齢別のリストをつくるなら

age = ["0-4歳", "5-9歳", "10-14歳", "15-19歳", "20-24歳", "25-29歳", "30-34歳",
"35-39歳", "40-44歳", "45-49歳", "50-54歳", "55-59歳", "60-64歳",
"65-69歳", "70-74歳", "75-79歳", "80-84歳", "85-89歳", "90-94歳",
"95-99歳", "100歳以上"]

のようになるでしょう。

当記事で扱った相関係数は、この5歳刻みの数字をもとに比較し導いた結果です。
今回では0歳から100歳以上まですべての年齢層を対象に5歳刻みの数字で比較していますが、
アプローチの仕方は無数にあると言っても過言ではないでしょう。

Pythonコードの解説

最初つくっていたときは、各国の名称を変数に利用したリストにしていました。
しかし、国名を表示したいと思った時に(たとえば「1位はItalyで」の部分)変数名を表示するよりも、辞書で文字列のキーに国名を据えるほうが簡単でわかりやすいと思い書き直しました。

冒頭では相関係数を求めるcorrelation.pyをインポートしています。

キーが各国の名称で、値が人口のリストである辞書をpopulation_dictと定義しました。
この辞書に日本を加えてしまうと、日本と日本を比べることになり無意味なので、日本は別でJapanという変数名のリストにしました。

空の辞書cor_dictを作成します。for文で各国の名称と相関係数を格納するためです。
for文で回し終えると、キーが各国の名称で値が相関係数の辞書cor_dictが出来上がります。
しかしこのcor_dictはソートされておらず、それぞれの国がただ相関係数を持っているだけの状態です。

日本との相関関係を調べ、どの国が最も相関関係が高いのかなどの順位を出したいので、
相関係数を基準に降順(大きい順)でcor_dictをソートします。
ソートにはsorted()関数を使い、keyをlambdaに設定します。keyはソートするにあたって使うロジックですね。
こちらも参考にして下さい→ http://pycarnival.com/dict/

ソートした結果できたリストがsorted_nationsです。
このリストの内容を順番に表示させて1位2位などもあらわすため、インデックスを使用します。
インデックスを利用するということはEnumerate関数を使うということですね。
Enumerate関数についてはこちらも参考にして下さい→ http://pycarnival.com/enumerate/

相関係数の比較により導き出された結果について

この30カ国の中で、日本の5歳刻みの人口分布と最も相関関係があるのはイタリアでした。
イタリアの高齢化を調べてみると、このような記事が→ イタリアで昨年の出生数が過去最低に、高齢化も進む

意外だったのですが、イタリアの出生率はとても下がっていて問題となっているようです。

思考回路としては、
前提知識:日本は少子高齢化など人口問題を抱えている
相関係数を見れば:日本と似たような状況の国がわかるかも
結果:えっ、イタリアが一番近いの!?

2位はギリシャでした。これまた調べてみると、、、年金大変そう、、、などと事情がわかる。

Pythonでデータを活用して、いろんな物事の見方ができるのは素晴らしいですね!