Gakushukun1’s diary

20代エンジニア, 統計的機械学習勉強中 twitter: @a96665004

主成分分析を用いた政令指定都市の区の分析

目的

主成分分析を用いて、東京23区および政令都市の区( n=198)の分析を行う.

用いたデータは, e-statの2015年の調査によるもので, 総人口,15歳未満人口,15〜64歳人口, 出生数, 死亡数, 転入者数, 転出者数, 従業・通学していない人口, 昼間人口, 単独世帯, 婚姻件数, 離婚件数の
12次元のベクトルである. 今回は, このベクトルに対して主成分分析を行い, 各因子の寄与率・主成分ベクトル・主成分得点を計算することで, 区の特徴をどういったもので定められているかを分析する.
pythonで実装したコードは次の通りである. なお, 実際に主成分分析を行ったベクトルは, もとの各次元のうち総人口以外を総人口で割った11次元のベクトルである(地域ごとの人口差による影響を除くため). また, 主成分分析を行う前に各ベクトルについて標準化を行なっている.

import pandas as pd
import numpy as np
from sklearn.decomposition import PCA

if __name__ == '__main__':
    matplotlib.rcParams['font.family'] = 'IPAexGothic'

    df = pd.read_csv('ku2015.csv', encoding="SHIFT-JIS")
    print(df)
    df.loc[:, '総人口':] = df.loc[:, '総人口':].astype(float)
    pop = df.loc[:, '総人口'].values
    X = df.iloc[:, 2:].apply(lambda x: x / pop, axis=0)
    X_norm = X.loc[:, :].apply(lambda x: ((x - x.mean()) / x.std()), axis=0)

    for i in range(len(X_norm.columns)):
        print(i + 1, end=' : ')
        print(X_norm.columns[i])

    pca = PCA()
    pca.fit(X_norm)
    prop = pca.explained_variance_ / np.sum(pca.explained_variance_)

コード中の変数propに格納されている各主成分の寄与率を図で示す (寄与率は合計で1になるよう正規化した).
f:id:gakushukun1:20190626222748p:plain
図より, 第二主成分までの寄与率の和が0.8であり, 全体の情報のうちの大部分がここに集中していることが分かった.
これに対して, 第一主成分に対応する主成分ベクトルは次のようになった.
f:id:gakushukun1:20190626222824p:plain
このベクトルは, 労働人口(15~64歳人口)・転入出者数・婚姻件数が多いほど+の影響があり, 死亡者数・従業通学していない者の数が多いほど-の影響がある.
このことから, このベクトルの+の方角は区が人の往来が多く賑やかであり, -の方角は, 落ち着いたのどかであることが考えられる.
一方, 第二主成分に対応する主成分ベクトルは次のようになった.
f:id:gakushukun1:20190626222834p:plain
このベクトルは, 死亡者数・単独世帯数が多いほど+の影響があり, 15歳未満人口・出生数が多いほど-の影響がある.
このことから, このベクトルの+の方角に行くほど少子高齢化が進んでいる区であると考えられる.
この2つの因子に対し, 東京23区の各区について, 第一主成分得点をx軸に, 第二主成分得点をy軸にプロットした結果を次に示す.
f:id:gakushukun1:20190626222858p:plain
この図から, 東京23区は, 日本の他の政令指定都市と比べると, 人の往来が多く, また少子高齢化については平均的であることが分かる.

まとめ

主成分分析により, 東京23区と政令都市のデータの分析を行った. これらのデータは主に, 2つの主成分によって特徴づけれらていることが分かった.