スキップしてメイン コンテンツに移動

総務省統計局データをPythonで加工 e-Stat with Python(1)

 

 政府統計の総合窓口e-StatのデータをAPI(Aplication Programing Interface)を利用して、DownLoad and Plotに挑戦します。冒頭の日本地図は全人口に占める各都道府県の人口の比率(割合)を示したグラフです。
 参考にさせていただいたWEBPageは以下のとおりです。
  URL:https://note.com/kiyo_ai_note/n/nac8c77768c07
  (Kiyo-noteさんのPythonでやってみた12:APIで統計情報取得(e-Stat))

 こうしてみると、東京都に日本人口の10%程度が集中し、関東圏の都道府県と大阪は5から7%程度、北海道も比較的高め、同等程度で愛知、神戸、福岡が並び、その他の都道府県は軒並み4%程度以下というか、大部分が2%程度以下であるという印象です。

 グラフ化までのPythonコードを掲載します。

1.e-StatAPIから統計データを入手

 e-StatAPIの使用には事前のユーザー登録と、ユーザー登録したらいただけるAPP_IDが必要になります。詳細は参考URLで親切に説明してくれています。
 まず、e-Stat_APIから人口推計-総務省-都道府県別人口の割合(総人口)を読み込みます。当該データのe-StatDataIDは0003448233です。言語は日本語、最新データである2021年をcdTimeで指定します。
 API_URLはe-Stat_APIの統計データが格納されているURLをネットで調べました。
 request.get()メソッドを利用して、responseにデータを格納し、さらにresponseを.json()メソッドでjson形式にして変数dataに格納します。そして、このjson形式のdataにdictionary形式で格納されている
['GET_STATS_DATA']['STATISTICAL_DATA']['DATA_INF']['VALUE']
のデータをpandasのDataFrameに変換して変数dfに格納します。
 次に、rename()を使用してDataFrame'df'のColumn_nameを識別しやすい名称に置き換えます。
 ここまでのコードは以下のとおりです。
import requests
import pandas as pd

APP_ID = '**********' #自分のe-Stat API IDを*********に入力
API_URL = "http://api.e-stat.go.jp/rest/3.0/app/json/getStatsData"

params = {
    "appId": APP_ID,
    "statsDataId": "0003448233", #人口推計-総務省-都道府県別人口の割合(総人口)のstatDataID
    "lang": "J",  # 日本語を指定
    "cdTime": "2021000000" #対象とする時期(年)を2021年指定
}

#人口統計
response = requests.get(API_URL, params=params)
# Process the response
data = response.json()
#data

#JSONデータをPandasのDataFrameに変換
df = pd.DataFrame(data['GET_STATS_DATA']['STATISTICAL_DATA']['DATA_INF']['VALUE'])

# Pandas dataの加工
# Column名の変更
column_rename = {
    '@tab': 'タブ',
    '@area': '都道府県コード',
    '@time': '調査年',
    '@unit': '単位',
    '$': '人口比(対全国人口)'
}

df.rename(columns=column_rename, inplace=True)


 dfの中身を表示すると以下のようになります。

df.head()

タブ都道府県コード調査年単位人口比(対全国人口)
0003000002021000000100.00
10030100020210000004.13
20030200020210000000.97
30030300020210000000.95
40030400020210000001.82

 国土数値情報のShapeデータと組み合わせるために、e-Statの都道府県コードをもとに都道府県名をpandasDataFrameに追加します。
 まず、e-Stat_APIから当該データのMetaInfoDataを取得します。
 取得したデータから都道府県コードと都道府県の名称を対比している部分をdictionaryデータの内部構造を表示するpprint()関数を使って探索して、
['GET_META_INFO']['METADATA_INF']['CLASS_INF']['CLASS_OBJ']
に格納されていることを確認します。
API_URL = "http://api.e-stat.go.jp/rest/3.0/app/json/getMetaInfo?"

params = {
    "appId": APP_ID,
    "statsDataId": "0003448233",
    "limit": 2,
    "lang": "J"  # 日本語を指定
}

response = requests.get(API_URL, params=params)
data = response.json()

#辞書の構造を表示
import pprint
pprint.pprint(data)

  API_URLの末尾を’getMetaInfo?’に変えています。このコードの出力は以下のようになりました。
{'GET_META_INFO': {'METADATA_INF': {'CLASS_INF': {'CLASS_OBJ': [{'@id': 'tab',
                                                                 '@name': '表章項目',
                                                                 'CLASS': {'@code': '003',
                                                                           '@level': '',
                                                                           '@name': '人口割合',
                                                                           '@unit': '%'}},
                                                                {'@id': 'area',
                                                                 '@name': '全国・都道府県',
                                                                 'CLASS': [{'@code': '00000',
                                                                            '@level': '1',
                                                                            '@name': '全国'},
                                                                           {'@code': '01000',
                                                                            '@level': '2',
                                                                            '@name': '北海道'},
                                                                           {'@code': '02000',
                                                                            '@level': '2',
                                                                            '@name': '青森県'},
                                                                           {'@code': '03000',
                                                                            '@level': '2',
                                                                            '@name': '岩手県'},
                                                                           {'@code': '04000',
                                                                            '@level': '2',
                                                                            '@name': '宮城県'},
                                                                           {'@code': '05000',
                                                                            '@level': '2',
                                                                            '@name': '秋田県'},
                                                                           {'@code': '06000',
                                                                            '@level': '2',
                                                                            '@name': '山形県'},
                                                                           {'@code': '07000',
                                                                            '@level': '2',
                                                                            '@name': '福島県'},
                                                                           {'@code': '08000',
                                                                            '@level': '2',
                                                                            '@name': '茨城県'},
                                                                           {'@code': '09000',
                                                                            '@level': '2',
                                                                            '@name': '栃木県'},
                                                                           {'@code': '10000',
                                                                            '@level': '2',
                                                                            '@name': '群馬県'},
                                                                           {'@code': '11000',
                                                                            '@level': '2',
                                                                            '@name': '埼玉県'},
                                                                           {'@code': '12000',
                                                                            '@level': '2',
                                                                            '@name': '千葉県'},
                                                                           {'@code': '13000',
                                                                            '@level': '2',
                                                                            '@name': '東京都'},
                                                                           {'@code': '14000',
                                                                            '@level': '2',
                                                                            '@name': '神奈川県'},
                                                                           {'@code': '15000',
                                                                            '@level': '2',
                                                                            '@name': '新潟県'},
                                                                           {'@code': '16000',
                                                                            '@level': '2',
                                                                            '@name': '富山県'},
                                                                           {'@code': '17000',
                                                                            '@level': '2',
                                                                            '@name': '石川県'},
                                                                           {'@code': '18000',
                                                                            '@level': '2',
                                                                            '@name': '福井県'},
                                                                           {'@code': '19000',
                                                                            '@level': '2',
                                                                            '@name': '山梨県'},
                                                                           {'@code': '20000',
                                                                            '@level': '2',
                                                                            '@name': '長野県'},
                                                                           {'@code': '21000',
                                                                            '@level': '2',
                                                                            '@name': '岐阜県'},
                                                                           {'@code': '22000',
                                                                            '@level': '2',
                                                                            '@name': '静岡県'},
                                                                           {'@code': '23000',
                                                                            '@level': '2',
                                                                            '@name': '愛知県'},
                                                                           {'@code': '24000',
                                                                            '@level': '2',
                                                                            '@name': '三重県'},
                                                                           {'@code': '25000',
                                                                            '@level': '2',
                                                                            '@name': '滋賀県'},
                                                                           {'@code': '26000',
                                                                            '@level': '2',
                                                                            '@name': '京都府'},
                                                                           {'@code': '27000',
                                                                            '@level': '2',
                                                                            '@name': '大阪府'},
                                                                           {'@code': '28000',
                                                                            '@level': '2',
                                                                            '@name': '兵庫県'},
                                                                           {'@code': '29000',
                                                                            '@level': '2',
                                                                            '@name': '奈良県'},
                                                                           {'@code': '30000',
                                                                            '@level': '2',
                                                                            '@name': '和歌山県'},
                                                                           {'@code': '31000',
                                                                            '@level': '2',
                                                                            '@name': '鳥取県'},
                                                                           {'@code': '32000',
                                                                            '@level': '2',
                                                                            '@name': '島根県'},
                                                                           {'@code': '33000',
                                                                            '@level': '2',
                                                                            '@name': '岡山県'},
                                                                           {'@code': '34000',
                                                                            '@level': '2',
                                                                            '@name': '広島県'},
                                                                           {'@code': '35000',
                                                                            '@level': '2',
                                                                            '@name': '山口県'},
                                                                           {'@code': '36000',
                                                                            '@level': '2',
                                                                            '@name': '徳島県'},
                                                                           {'@code': '37000',
                                                                            '@level': '2',
                                                                            '@name': '香川県'},
                                                                           {'@code': '38000',
                                                                            '@level': '2',
                                                                            '@name': '愛媛県'},
                                                                           {'@code': '39000',
                                                                            '@level': '2',
                                                                            '@name': '高知県'},
                                                                           {'@code': '40000',
                                                                            '@level': '2',
                                                                            '@name': '福岡県'},
                                                                           {'@code': '41000',
                                                                            '@level': '2',
                                                                            '@name': '佐賀県'},
                                                                           {'@code': '42000',
                                                                            '@level': '2',
                                                                            '@name': '長崎県'},
                                                                           {'@code': '43000',
                                                                            '@level': '2',
                                                                            '@name': '熊本県'},
                                                                           {'@code': '44000',
                                                                            '@level': '2',
                                                                            '@name': '大分県'},
                                                                           {'@code': '45000',
                                                                            '@level': '2',
                                                                            '@name': '宮崎県'},
                                                                           {'@code': '46000',
                                                                            '@level': '2',
                                                                            '@name': '鹿児島県'},
                                                                           {'@code': '47000',
                                                                            '@level': '2',
                                                                            '@name': '沖縄県'}]},
                                                                {'@id': 'time',
                                                                 '@name': '時間軸(年)',
                                                                 'CLASS': [{'@code': '2005000001',
                                                                            '@level': '1',
                                                                            '@name': '2005年'},
                                                                           {'@code': '2010000001',
                                                                            '@level': '1',
                                                                            '@name': '2010年'},
                                                                           {'@code': '2015000001',
                                                                            '@level': '1',
                                                                            '@name': '2015年'},
                                                                           {'@code': '2020000000',
                                                                            '@level': '1',
                                                                            '@name': '2020年'},
                                                                           {'@code': '2021000000',
                                                                            '@level': '1',
                                                                            '@name': '2021年'},
                                                                           {'@code': '2022000000',
                                                                            '@level': '1',
                                                                            '@name': '2022年'}]}]},
                                    'TABLE_INF': {'@id': '0003448233',
                                                  'COLLECT_AREA': '該当なし',
                                                  'CYCLE': '年次',
                                                  'DESCRIPTION': '',
                                                  'GOV_ORG': {'$': '総務省',
                                                              '@code': '00200'},
                                                  'MAIN_CATEGORY': {'$': '人口・世帯',
                                                                    '@code': '02'},
                                                  'OPEN_DATE': '2023-04-12',
                                                  'OVERALL_TOTAL_NUMBER': 288,
                                                  'SMALL_AREA': 0,
                                                  'STATISTICS_NAME': '人口推計 '
                                                                     '各年10月1日現在人口 '
                                                                     '令和2年国勢調査基準 '
                                                                     '統計表',
                                                  'STATISTICS_NAME_SPEC': {'TABULATION_CATEGORY': '人口推計',
                                                                           'TABULATION_SUB_CATEGORY1': '各年10月1日現在人口',
                                                                           'TABULATION_SUB_CATEGORY2': '令和2年国勢調査基準',
                                                                           'TABULATION_SUB_CATEGORY3': '統計表'},
                                                  'STAT_NAME': {'$': '人口推計',
                                                                '@code': '00200524'},
                                                  'SUB_CATEGORY': {'$': '人口',
                                                                   '@code': '01'},
                                                  'SURVEY_DATE': 0,
                                                  'TITLE': {'$': '都道府県別人口の割合-総人口',
                                                            '@no': '006'},
                                                  'TITLE_SPEC': {'TABLE_NAME': '都道府県別人口の割合-総人口'},
                                                  'UPDATED_DATE': '2023-06-22'}},
                   'PARAMETER': {'DATA_FORMAT': 'J',
                                 'LANG': 'J',
                                 'STATS_DATA_ID': '0003448233'},
                   'RESULT': {'DATE': '2023-07-26T06:19:09.237+09:00',
                              'ERROR_MSG': '正常に終了しました。',
                              'STATUS': 0}}}
すごく階層構造が深くて素人のわたしが解読するのは大変でしたが、とりあえず、すべての情報を解析するのはさておき、欲しい情報が
{'@code': '01000', '@level': '2', '@name': '北海道'}, {'@code': '02000', '@level': '2', '@name': '青森県'},
といった形で格納されているのがわかります。この階層を読み解いていくと、まず最初の階層は先ほど記載した通り、
{'GET_META_INFO': {'METADATA_INF': {'CLASS_INF': {'CLASS_OBJ':
という階層にぶら下がっているように読めます。そして、この階層の直下にどのようなデータがぶら下がっているかを確認するために、もう一度pprint()関数を利用して階層構造を表示します。
# META_INFOの中から都道府県コードと都道府県名を退避している箇所を取得
values = data['GET_META_INFO']['METADATA_INF']['CLASS_INF']['CLASS_OBJ']
pprint.pprint(values)
出力は以下の通りです。
[{'@id': 'tab',
  '@name': '表章項目',
  'CLASS': {'@code': '003', '@level': '', '@name': '人口割合', '@unit': '%'}},
 {'@id': 'area',
  '@name': '全国・都道府県',
  'CLASS': [{'@code': '00000', '@level': '1', '@name': '全国'},
            {'@code': '01000', '@level': '2', '@name': '北海道'},
            {'@code': '02000', '@level': '2', '@name': '青森県'},
            {'@code': '03000', '@level': '2', '@name': '岩手県'},
            {'@code': '04000', '@level': '2', '@name': '宮城県'},
            {'@code': '05000', '@level': '2', '@name': '秋田県'},
            {'@code': '06000', '@level': '2', '@name': '山形県'},
            {'@code': '07000', '@level': '2', '@name': '福島県'},
            {'@code': '08000', '@level': '2', '@name': '茨城県'},
            {'@code': '09000', '@level': '2', '@name': '栃木県'},
            {'@code': '10000', '@level': '2', '@name': '群馬県'},
            {'@code': '11000', '@level': '2', '@name': '埼玉県'},
            {'@code': '12000', '@level': '2', '@name': '千葉県'},
            {'@code': '13000', '@level': '2', '@name': '東京都'},
            {'@code': '14000', '@level': '2', '@name': '神奈川県'},
            {'@code': '15000', '@level': '2', '@name': '新潟県'},
            {'@code': '16000', '@level': '2', '@name': '富山県'},
            {'@code': '17000', '@level': '2', '@name': '石川県'},
            {'@code': '18000', '@level': '2', '@name': '福井県'},
            {'@code': '19000', '@level': '2', '@name': '山梨県'},
            {'@code': '20000', '@level': '2', '@name': '長野県'},
            {'@code': '21000', '@level': '2', '@name': '岐阜県'},
            {'@code': '22000', '@level': '2', '@name': '静岡県'},
            {'@code': '23000', '@level': '2', '@name': '愛知県'},
            {'@code': '24000', '@level': '2', '@name': '三重県'},
            {'@code': '25000', '@level': '2', '@name': '滋賀県'},
            {'@code': '26000', '@level': '2', '@name': '京都府'},
            {'@code': '27000', '@level': '2', '@name': '大阪府'},
            {'@code': '28000', '@level': '2', '@name': '兵庫県'},
            {'@code': '29000', '@level': '2', '@name': '奈良県'},
            {'@code': '30000', '@level': '2', '@name': '和歌山県'},
            {'@code': '31000', '@level': '2', '@name': '鳥取県'},
            {'@code': '32000', '@level': '2', '@name': '島根県'},
            {'@code': '33000', '@level': '2', '@name': '岡山県'},
            {'@code': '34000', '@level': '2', '@name': '広島県'},
            {'@code': '35000', '@level': '2', '@name': '山口県'},
            {'@code': '36000', '@level': '2', '@name': '徳島県'},
            {'@code': '37000', '@level': '2', '@name': '香川県'},
            {'@code': '38000', '@level': '2', '@name': '愛媛県'},
            {'@code': '39000', '@level': '2', '@name': '高知県'},
            {'@code': '40000', '@level': '2', '@name': '福岡県'},
            {'@code': '41000', '@level': '2', '@name': '佐賀県'},
            {'@code': '42000', '@level': '2', '@name': '長崎県'},
            {'@code': '43000', '@level': '2', '@name': '熊本県'},
            {'@code': '44000', '@level': '2', '@name': '大分県'},
            {'@code': '45000', '@level': '2', '@name': '宮崎県'},
            {'@code': '46000', '@level': '2', '@name': '鹿児島県'},
            {'@code': '47000', '@level': '2', '@name': '沖縄県'}]},
 {'@id': 'time',
  '@name': '時間軸(年)',
  'CLASS': [{'@code': '2005000001', '@level': '1', '@name': '2005年'},
            {'@code': '2010000001', '@level': '1', '@name': '2010年'},
            {'@code': '2015000001', '@level': '1', '@name': '2015年'},
            {'@code': '2020000000', '@level': '1', '@name': '2020年'},
            {'@code': '2021000000', '@level': '1', '@name': '2021年'},
            {'@code': '2022000000', '@level': '1', '@name': '2022年'}]}]

 解読すると、'@id': 'tab', '@id': 'area', '@id': 'time'の3つのデータがぶら下がっており、都道府県コードと都道府県名称が'@id': 'area' 'CLASS'をキーとしてぶら下がっています。 

  そこで、この変数valueをforRoopで回して、必要な'CLASS'keyの値をprefecture_listに取り出します。
 その後、自作のreplace_pref_name関数に都道府県コードを与え、prefecture_listからその都道府県コードに対応する都道府県名を返し、dfにnewcolumnとして["都道府県"]に都道府県の名称を入力するようにします。
 一連のコードをまとめると以下のようになります。(途中確認用のpprint()部分などは#で無効化しています)
API_URL = "http://api.e-stat.go.jp/rest/3.0/app/json/getMetaInfo?"

params = {
    "appId": APP_ID,
    "statsDataId": "0003448233",
    "limit": 2,
    "lang": "J"  # 日本語を指定
}

response = requests.get(API_URL, params=params)
data = response.json()
data

#辞書の構造を表示
#import pprint
#pprint.pprint(data)

# META_INFOの中から都道府県コードと都道府県名を退避している箇所を取得
values = data['GET_META_INFO']['METADATA_INF']['CLASS_INF']['CLASS_OBJ']
#pprint.pprint(values)

#type(values) #CLASS_OBJにはlist形式でデータが格納されていることを確認

for dictionary in values:
#    print('dictionary = ', dictionary)
    if dictionary['@id'] == 'area':
        pref_list = dictionary['CLASS']

prefectures_list = {}
for pref_code in pref_list:
#    print(pref_code)
    prefectures_list[pref_code['@code']] = pref_code['@name']

#print('prefecture_list = ', prefectures_list)

# 先ほど作成した辞書を使用して、都道府県コードに基づき、
# 都道府県名の列を追加するための関数を定義
def replace_pref_name(pref_code):
    return prefectures_list.get(pref_code, None)

# 都道府県コード列を都道府県名列に置き換え
df["都道府県"] = df["都道府県コード"].apply(replace_pref_name)

print(df)

 出力は以下のとおりです。
     タブ 都道府県コード         調査年 単位 人口比(対全国人口)  都道府県
0   003   00000  2021000000  %     100.00    全国
1   003   01000  2021000000  %       4.13   北海道
2   003   02000  2021000000  %       0.97   青森県
3   003   03000  2021000000  %       0.95   岩手県
4   003   04000  2021000000  %       1.82   宮城県
5   003   05000  2021000000  %       0.75   秋田県
6   003   06000  2021000000  %       0.84   山形県
7   003   07000  2021000000  %       1.44   福島県
8   003   08000  2021000000  %       2.27   茨城県
9   003   09000  2021000000  %       1.53   栃木県
10  003   10000  2021000000  %       1.54   群馬県
11  003   11000  2021000000  %       5.85   埼玉県
12  003   12000  2021000000  %       5.00   千葉県
13  003   13000  2021000000  %      11.16   東京都
14  003   14000  2021000000  %       7.36  神奈川県
15  003   15000  2021000000  %       1.73   新潟県
16  003   16000  2021000000  %       0.82   富山県
17  003   17000  2021000000  %       0.90   石川県
18  003   18000  2021000000  %       0.61   福井県
19  003   19000  2021000000  %       0.64   山梨県
20  003   20000  2021000000  %       1.62   長野県
21  003   21000  2021000000  %       1.56   岐阜県
22  003   22000  2021000000  %       2.87   静岡県
23  003   23000  2021000000  %       5.99   愛知県
24  003   24000  2021000000  %       1.40   三重県
25  003   25000  2021000000  %       1.12   滋賀県
26  003   26000  2021000000  %       2.04   京都府
27  003   27000  2021000000  %       7.02   大阪府
28  003   28000  2021000000  %       4.33   兵庫県
29  003   29000  2021000000  %       1.05   奈良県
30  003   30000  2021000000  %       0.73  和歌山県
31  003   31000  2021000000  %       0.44   鳥取県
32  003   32000  2021000000  %       0.53   島根県
33  003   33000  2021000000  %       1.50   岡山県
34  003   34000  2021000000  %       2.21   広島県
35  003   35000  2021000000  %       1.06   山口県
36  003   36000  2021000000  %       0.57   徳島県
37  003   37000  2021000000  %       0.75   香川県
38  003   38000  2021000000  %       1.05   愛媛県
39  003   39000  2021000000  %       0.55   高知県
40  003   40000  2021000000  %       4.08   福岡県
41  003   41000  2021000000  %       0.64   佐賀県
42  003   42000  2021000000  %       1.03   長崎県
43  003   43000  2021000000  %       1.38   熊本県
44  003   44000  2021000000  %       0.89   大分県
45  003   45000  2021000000  %       0.85   宮崎県
46  003   46000  2021000000  %       1.26  鹿児島県
47  003   47000  2021000000  %       1.17   沖縄県

 お見事!DataFrameの末尾に都道府県の名称を追加することができました。

2.国土数値情報データから
  日本地図(都道府県別地図)を作成
 これまで学習してきた知識を使って、国土数値情報から日本地図をダウンロードして、都道府県別の地図を作ります。
 まず、Conserning Libraryをimportし、国土数値情報の日本地図のURLからGeoDataFrame'japan_gdf'としてDataをgetします。ちなみに、国土数値情報の日本地図のURLは、まず、国土数値情報の行政区域ページ(URL:https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-v3_1.html)に行き、WebPageのStructureを確認して、「全国」データをDownLoadするボタンのあらかたの位置を確認したあと、右クリックで「ページのソースを表示」をクリックし、DownLoadボタンと思しき場所を調べます。今回の場合は、この部分でDownLoadDataを格納しているURLの場所は蛍光ペンの部分、すなわち、'../data/N03/N03-2023/N03-20230101_GML.zip'になります。
<tr>
<td class="bgc0" id="prefecture00">全国</td>
<td class="txtCenter">世界測地系</td>
<td class="txtCenter">令和5年</td>
<td class="txtCenter">427MB</td>
<td class="txtCenter">N03-20230101_GML.zip</td>
<td class="txtCenter">
<a class="waves-effect waves-light btn indigo btn_padding" id="menu-button"
onclick="javascript:DownLd('427MB','N03-20230101_GML.zip','../data/N03/N03-2023/N03-20230101_GML.zip' ,this);">
<span id="N03-20230101_GML.zip-open" style="display: block">
<i class="material-icons">file_download</i>
</span>
<span id="N03-20230101_GML.zip-close" style="display: none">
<i class="material-icons">star</i>
</span>
</a>
</td>
</tr>

そして、..の部分にOriginalPage(国土数値情報の行政区域DownLoadSite)のURLのうち、蛍光ペンの部分(https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-v3_1.html)を代入してやれば、DownLoadしたいDataが格納されているURLが完成します。
最終形はこちらです。
https://nlftp.mlit.go.jp/ksj/gml/data/N03/N03-2023/N03-20230101_GML.zip
get()関数を使って、GeoDataFrame形式でDataをgetします。
# Import required libraries
!pip install geopandas
import geopandas as gpd
import pathlib

# Create the data saving directory
NOTEBOOK_PATH = pathlib.Path().resolve()
DATA_DIRECTORY = NOTEBOOK_PATH / "data"

# print("####", DATA_DIRECTORY)

# Download the Japan Map Data at Zip style
# Sorce: National Land Numerical Information released by MILT
JapanMap_url = 'https://nlftp.mlit.go.jp/ksj/gml/data/N03/N03-2023/N03-20230101_GML.zip'
japan_gdf = gpd.read_file(JapanMap_url, encoding='shift-jis')

japan_gdf.head()

北海道だけ見ても、市町村・局ごとでかなり細かくDataがSparateしています。
OBJECTIDN03_001N03_002N03_003N03_004N03_007Shape_LengShape_Areageometry
01.0北海道石狩振興局札幌市札幌市中央区011010.5516440.005128POLYGON ((141.34233 43.06682, 141.34285 43.066...
12.0北海道石狩振興局札幌市札幌市北区011020.5794420.007033POLYGON ((141.40839 43.18395, 141.40833 43.183...
23.0北海道石狩振興局札幌市札幌市東区011030.4014590.006300POLYGON ((141.44707 43.15616, 141.44694 43.155...
34.0北海道石狩振興局札幌市札幌市白石区011040.3107630.003809POLYGON ((141.46244 43.10010, 141.46265 43.100...
45.0北海道石狩振興局札幌市札幌市豊平区011050.4389370.005104POLYGON ((141.38463 43.04670, 141.38479 43.046...

図化してみると...全国が白線で鬼のように分割されています。
これをdissolve()を使用して、都道府県名のcolumnである'N03_001'でぎゅっとまとめます。
# Concentrate each prefecture from many city's geometry
# pref_gdf = japan_gdf.dissolve("N03_001") #ERROR CODE
# japan_gdfをN03_001列(都道府県名)でグループ化して、各都道府県のジオメトリを結合する
pref_gdf = japan_gdf.dissolve("N03_001", aggfunc='first')

# reset_index()を使って元の "N03_001" 列を新しい列として復元する
pref_gdf = pref_gdf.reset_index()

pref_gdf.head()
このOutputはわきに置いておいて、とりあえずpref_gdfを図化します。
pref_gdf.plot()
よっしゃ!PrefecturesMapのcompleteでござる。

3.GeoDataFrame'pref_gdf'に人口比率データを付与

以下のコードで'pref_gdf'に人口比率データを付与します。
# Give the population rate data to japan_gdf
for index, row in df.iterrows():
#    print(row["都道府県"], row["人口比(対全国人口)"])
    pref_gdf.loc[pref_gdf['N03_001'] == row["都道府県"], "人口比(対全国人口)"] = row["人口比(対全国人口)"]

pref_gdf.head()

4.日本地図にカラー表示で人口比率データを図化
matplotlibを使って、人口比率データを日本地図にカラー表示します。
#結果の図化
import matplotlib.pyplot as plt

!pip install mapclassify
import mapclassify

#matplotlibで日本語を表示するためのおまじない
!pip install japanize_matplotlib
import japanize_matplotlib

ax = pref_gdf.plot(
    figsize=(20,10),
    column="人口比(対全国人口)",
    cmap="rainbow",
#    scheme="quantiles",
    markersize=15,
    legend=False
#    legend=True,
)

# データ型を数値に変換
pref_gdf["人口比(対全国人口)"] = pref_gdf["人口比(対全国人口)"].astype(float)

# カラーバーの作成
sm = plt.cm.ScalarMappable(cmap="rainbow")
sm.set_array(pref_gdf["人口比(対全国人口)"])
cbar = plt.colorbar(sm, ax=ax, shrink=0.7)  # カラーバーのサイズを縮小して表示


# 各軸の範囲を指定
#ax.set_ylim(33.7, 34.9)
#ax.set_xlim(135.5, 136.4)

# Graph TitleをSet
ax.set_title("Poplaion rate (vs Jananese Total Population) of each prefecture in Japan(Unit:%)")

#plt.show()

 苦労したのはカラーバーを表示させることです。ChatGPT先生をはじめ、かなりいろいろなものを調べて、最後に行き着いたコードがこれです。
 結局plot.show()のコードはいらないようです。
 geopandasの図化機能とmatplotlibの図化機能の違いがしっかりと把握できていないせいかなぁと思いました。
 cmapというのはColorMapの略語でしょうか。cmapには今回使用したrainbowのほかにもRedsなどなどたくさんの書式があるようなので、少し楽しんでみたいと思います。
 これがcmap='rainbow'の表示です。
 次はcmap="Reds"です。
 次はcmap='cool'
 最後にcmap='plasma'
















コメント