論文一覧に戻る 🕸 論文ネットワーク 🗺 用語ネットワーク 統計データ分析コンペ 教育用再現集
特別賞(審査員奨励)[大学生・一般の部]

家計調査に基づく消費重心の計算

⏱️ 推定読了時間: 約28分
2020年度(令和2年度)統計データ分析コンペティション 井手健太(法政大学経済学部経済学科)
SSDSE-C(家計・生活) SSDSE-A(人口・世帯) 消費重心 加重平均 人口重心 GIS / QGIS
🔬 GIS🔬 加重平均🔬 消費重心🏷 食・家計消費
🔬 手法タグ / 🏷 応用タグ(クリックで同タグの論文をネットワーク検索)
🔬 再現カルテ — 原論文のデータが手に入らないため、代替データで再現

この教材は、原論文が使ったデータそのものを使えていません。そこで代わりのデータで同じ問いを追いかけ、結論の向き(増える/減る、強い/弱い)が原論文と一致するかを確かめます。「同じ数値が出る」ことは目標にしていません。

原論文が使ったデータSSDSE-C・SSDSE-A・国勢調査
分析単位:その他
中核手法:消費重心の算出
この教材が使うデータCSV は読み込まない(原論文が報告した数値をそのまま図表化して読み解く)
原論文(PDF)家計調査に基づく消費重心の計算
特別賞/井手健太(法政大学経済学部経済学科)
⚠️ この教材ではできないこと(原論文との違い)
  • 原論文と同じデータでの再現はできない:論文=SSDSE-A/C(家計調査・消費重心) → 教材=報告値転記中心
📄 原論文との違いを、もっと詳しく
📄 原論文:家計調査(SSDSE-A/C 系)の品目別支出を重みに、品目ごとの「消費重心」を計算して食文化の地域性を可視化。
📘 本教材:step 1〜4 は原論文の報告値の転記が中心。step 5 で原論文と同じ家計調査系データ(SSDSE-C-2026)による消費重心の計算を完全再現
⚠️ 注意:SSDSE-C の版が原論文と異なるため重心座標の値は微妙に異なるが、計算方法・データ種別は原論文と同一。
🚀 原論文と同じ粒度で挑戦したい人へ

原論文と同じ粒度のデータは、この教材にも同梱しています。これを読み込めば、原論文と同じ細かさで分析をやり直せます(下の「🐍 ブラウザで動かす」でコードを書き換えて試せます)。ただし原論文が使った項目がすべて収録されているとは限りません。足りない項目は、上の「できないこと」に書いた出典から取ってくる必要があります。

▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2020_U5_5_shorei.py(302 行)そのものです。

🏅 論文審査会コメント(審査員はここを評価した)
「重心という概念を消費に導入した点は興味深い。」
出典:統計センター「統計データ分析コンペティション」受賞論文PDF掲載の審査講評。プロの審査員が何を評価し、何を注文したかは論文の読み方の最良の手本になる。
📝 3行で分かる要約

目次

  1. 研究の背景:人口重心から消費重心へ
  2. データと手法:消費重心の定義
  3. 大分類の消費重心(表1・図1)
  4. 経度からの考察:東西の地域性(表2・図2)
  5. 緯度からの考察:南北の地域性(表3・図3)
  6. 品目間の対照と距離(図4)
  7. まとめと課題
  8. 📥 データの準備・再現手順
  9. 💼 実社会での応用
  10. ⚠️ よくある誤解
  11. 📖 用語集
  12. 📐 手法ガイド
  13. 🚀 発展の可能性
  14. 🎯 自分でやってみよう
  15. 🤔 Q&A
  16. 🐍 ブラウザで動かす

🎯 この記事を読むと何ができるようになるか

📥 データの準備・再現手順

このページの図は「原論文の報告値の可視化」です(再計算ではありません) 消費重心は〈食料品目別支出額 × 一般世帯数 × 各都道府県の人口重心の経度・緯度〉から計算されます。支出額は SSDSE-C(家計・生活)、世帯数は SSDSE-A(人口・世帯)に収録されていますが、重み付けに使う「都道府県の人口重心の経度・緯度」は SSDSE には収録されていない外部表(総務省統計局2017「我が国の人口重心-平成27年国勢調査結果から-」表2-3)です。この座標が無いと最終の消費重心は再計算できないため、本ページでは原論文が報告した消費重心の値を転記して可視化します。新しい数値の捏造は行いません。
1
追加ダウンロードは不要 本ページの再現スクリプトは、原論文の表1・表2・表3・本文の報告値をスクリプト内に転記して図を描きます。外部CSVは読み込みません。
2
スクリプトをそのまま実行する ターミナルでプロジェクトルートに移動し、以下を実行します。
python3 code/2020_U5_5_shorei.py
図は html/figures/ に自動保存されます。
3
(発展)完全再現に挑戦したい場合 SSDSE-C(食料品目別支出額・都道府県庁所在市別)と SSDSE-A(一般世帯数)を統計センターから入手し、さらに人口重心の経度・緯度表(総務省統計局)を用意すれば、原論文の手順で消費重心を計算できます。ダウンロード先: SSDSE 配布ページ
研究の背景:人口重心から消費重心へ

物理学の「重心」は、質量の分布を1点で代表させる考え方である。これを人口に応用したのが人口重心で、総務省統計局は「1人1人が同じ重さを持つと仮定して、調査地域の人口が全体として平衡を保つことができる点」と定義している(総務省統計局 2017)。平成27年国勢調査による我が国の人口重心は東経137度02分15.84秒・北緯35度34分51.44秒(岐阜県付近)で、都市圏への一極集中を反映して東・南方向へ移動を続けている。

本研究の着想は「人口重心の式の“重み”を、人口ではなく家計の消費額に置き換えたらどうなるか」という一点にある。 人口重心が「人がどこに偏って住んでいるか」を1点で表すのに対し、消費額で重み付けした消費重心は「ある品目の消費額がどこに偏っているか」を1点で表す。

問題意識 家計調査の食料品目は、これまで主に順位尺度(○○の支出額が多い県ランキング)で語られてきた。しかし順位では「東西南北のどちらに寄っているか」という地理的な偏りは表現できない。消費重心を導入すれば、品目ごとの地域的特性を経度・緯度という連続量の1点で捉え、地図に載せて比較できる。

人口重心の理論は応用の幅が広い。清水(1958)は昼間・夜間人口の重心を使って都市交通問題を、田村(2019)は人口重心を自然変動と社会変動に要因分解して人口移動を論じている。本研究はこの系譜を家計消費へ拡張する試みである。

消費重心 加重平均 GIS / QGIS 食料品目の地域性

データと手法:消費重心の定義

使用データ

データ内容出所
SSDSE-C-2020二人以上世帯・都道府県庁所在市別・食料品目別の年間支出金額(2017〜2019年の平均値)統計センター(家計調査)
SSDSE-A-2020一般世帯数(列 A710101 ほか)統計センター(国勢調査)
人口重心の経度・緯度各都道府県の人口重心(平成27年国勢調査, 表2-3)※SSDSE未収録の外部表総務省統計局(2017)

消費重心の式

人口重心では基本単位区ごとの人口 wi を重みとする。消費重心では、この重みを各県庁所在市の家計消費額 Ci に置き換える。

x = Σ Ci xi / Σ Ci     y = Σ Ci yi / Σ Ci
📌 記号の意味
x, y
消費重心の経度・緯度。
xi, yi
各都道府県の人口重心の経度・緯度(平成27年国勢調査)。
Ci
各県庁所在市の家計消費額 = 1世帯あたり消費額 × 一般世帯数。

家計消費額 Ci の作り方(原論文の例)

原論文は北海道・札幌市の「米」を例に説明している。SSDSE-C の札幌市の米の家計消費額 30994 に、SSDSE-A の札幌市の一般世帯数 920415 を掛けて札幌市の米の消費額とする。これを全県庁所在市・全食料品目で行い、各県の人口重心の経度・緯度を掛け合わせて品目ごとに合計し、消費額の合計で割れば消費重心が求まる。

なぜ県庁所在地の座標ではなく「人口重心」を使うのか 家計消費データは各県庁所在市のものだが、原論文は座標に県庁の位置ではなく県の人口重心を採用した。県庁所在市以外の消費も含めた重心を考える場合、県の代表点としては人口重心のほうが望ましいという判断による。
再現可能性トリアージ(重要) 支出額(SSDSE-C)と世帯数(SSDSE-A)は公開データから再現できるが、重み付けに必要な各県の人口重心の経度・緯度は SSDSE 未収録の外部表である。したがって本ページの図・数値はすべて原論文の報告値の可視化(再計算ではない)であり、図タイトルと図注に二重に明記する。QGIS による地図(原論文 図3〜図5)は再表現が難しいため、要点は表と散布図で示し、地図そのものは原論文を参照のこと。

再現コードを読む(報告値の転記)

💭 目的:まず、原論文の表1(大分類の消費重心)と小分類213品目の基本統計量を、スクリプト内にそのまま転記する。ここが「報告値の可視化」の土台になる。

このブロックはグラフを描く前の下準備で、必要なライブラリの読み込みと、原論文から書き写した数値の定義だけを行う。

やってみよう① ライブラリの読み込みと大分類・基本統計量の転記(表1)
📝 コード
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import os
import math
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib.patches import Patch

plt.rcParams['font.family'] = 'Hiragino Sans'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['figure.dpi'] = 150

FIG_DIR = 'html/figures'
os.makedirs(FIG_DIR, exist_ok=True)

NOTE = '報告値の可視化(再計算ではない)'  # 全図共通の注記

# ══════════════════════════════════════════════════════════
# 原論文の報告値(PDFのタブル・本文を転記。単位は decimal degrees)
# ══════════════════════════════════════════════════════════

# 表1 大分類の消費重心(経度, 緯度)
DAIBUNRUI = [
    ('穀類',        137.1216, 35.41703),
    ('魚介類',      137.2183, 35.48567),
    ('肉類',        136.9404, 35.30843),
    ('乳卵類',      137.1518, 35.28413),
    ('野菜・海藻',  137.2787, 35.43841),
    ('果物',        137.2931, 35.44298),
    ('油脂・調味料', 137.0571, 35.36921),
    ('菓子類',      137.1802, 35.42998),
    ('調理食品',    137.1772, 35.32412),
    ('飲料',        137.1688, 35.39765),
    ('酒類',        137.2205, 35.55091),
    ('外食',        137.3352, 35.35948),
]
GOUKEI = ('食料(合計)', 137.1959, 35.39448)  # 表1 食料合計

# 図1・図2 小分類213品目の消費重心 経度・緯度の基本統計量(報告値)
STATS_LON = dict(平均=137.1901, 標準誤差=0.02256, 中央値=137.1637, 標準偏差=0.32928,
                 分散=0.10843, 尖度=2.17056, 歪度=-0.22126, 最小=135.7723, 最大=138.2165, n=213)
STATS_LAT = dict(平均=35.4238, 標準誤差=0.01231, 中央値=35.4069, 標準偏差=0.17970,
                 分散=0.03229, 尖度=4.04831, 歪度=0.66821, 最小=34.7792, 最大=36.1986, n=213)
▼ 実行結果
このステップは print しません。ライブラリの読み込みと、原論文 表1(大分類の消費重心)・小分類の基本統計量をスクリプト内の変数に転記しただけです。
💡 実行結果の読み取り
  • DAIBUNRUI は表1の12品目の (品目名, 経度, 緯度) をそのまま並べたリスト。GOUKEI は「食料(合計)」の消費重心。
  • STATS_LONSTATS_LAT は小分類213品目の経度・緯度の基本統計量(平均・中央値・標準偏差・歪度・尖度など)で、これらは原論文 図1・図2の報告値です。
  • ここでは新しい計算をせず、あくまで原論文の数値を書き写している点が重要です。
💡 Python TIPS 辞書 dict(平均=137.19, ...) は「名前つきの値」をまとめる型。STATS_LON["平均"] のように名前で取り出せます。
やってみよう② 表2・表3・対照品目・人口重心の転記と距離関数の定義
📝 コード
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# 表2 経度に特徴のある消費品目(西側=経度が小さい / 東側=経度が大きい)
WEST = [  # 西に位置する10品目(経度が小さい順)
    ('たい', 135.7723, 34.7792), ('まんじゅう', 136.2335, 35.05084),
    ('あじ', 136.2797, 34.8392), ('合いびき肉', 136.3631, 34.9684),
    ('揚げかまぼこ', 136.4847, 35.0584), ('ぶり', 136.4962, 35.0493),
    ('さば', 136.5260, 35.1315), ('そうざい材料セット', 136.5547, 35.1627),
    ('牛肉', 136.5805, 35.0234), ('いわし', 136.5829, 35.1546),
]
EAST = [  # 東に位置する10品目(経度が大きい順)
    ('まぐろ', 138.2165, 35.5758), ('グレープフルーツ', 138.0606, 35.7085),
    ('しじみ', 138.0287, 35.9265), ('魚介の漬物', 138.0014, 35.9617),
    ('しゅうまい', 137.9851, 35.4739), ('ワイン', 137.9358, 35.5691),
    ('ウイスキー', 137.8987, 35.9656), ('塩さけ', 137.8681, 35.9674),
    ('ほたて貝', 137.8290, 36.1005), ('さやまめ', 137.7646, 35.4946),
]

# 表3 緯度に特徴のある消費品目(南側=緯度が小さい / 北側=緯度が大きい)
SOUTH = [
    ('たい', 135.7723, 34.7792), ('あじ', 136.2797, 34.8392),
    ('合いびき肉', 136.3631, 34.9684), ('牛肉', 136.5805, 35.0234),
    ('ぶり', 136.4962, 35.0493), ('揚げかまぼこ', 136.4847, 35.0584),
    ('まんじゅう', 136.2335, 35.05084), ('かつお節・削り節', 136.8234, 35.0757),
    ('さば', 136.5260, 35.1315), ('いわし', 136.5829, 35.1546),
]
NORTH = [
    ('メロン', 137.681509, 36.1986493), ('ほたて貝', 137.828986, 36.1005324),
    ('塩さけ', 137.868137, 35.9674378), ('ウイスキー', 137.898738, 35.9655654),
    ('魚介の漬物', 138.001437, 35.9616854), ('かれい', 137.168282, 35.9436351),
    ('しじみ', 138.028741, 35.9265045), ('他の貝', 137.528317, 35.8431935),
    ('さんま', 137.562414, 35.7237647), ('グレープフルーツ', 138.06064, 35.7084886),
]

# 本文で言及される代表品目(対照分析用, 報告値)
CONTRAST = {
    '牛肉':   (136.5805, 35.02335),
    '豚肉':   (137.1804, 35.43735),
    'たい':   (135.7723, 34.7792),
    'まぐろ': (138.2165, 35.5758),
}

# 人口重心(総務省統計局2017, 平成27年国勢調査, 全国)
# 原論文本文の報告値: 東経137度02分15.84秒, 北緯35度34分51.44秒
JINKO_JUSHIN_DMS = '東経137度02分15.84秒 / 北緯35度34分51.44秒'
JINKO_JUSHIN = (137 + 2/60 + 15.84/3600, 35 + 34/60 + 51.44/3600)  # ≈(137.0377, 35.5810)
REPORTED_KM_JINKO = 16.75    # 人口重心と食料全体の消費重心の距離(報告値)
REPORTED_KM_BUTA_GYU = 71.411  # 豚肉と牛肉の消費重心間距離(報告値)


def haversine_km(a, b):
    """2地点 (lon, lat) 間の大円距離[km]。報告座標の整合性確認に使用。"""
    R = 6371.0
    lon1, lat1 = math.radians(a[0]), math.radians(a[1])
    lon2, lat2 = math.radians(b[0]), math.radians(b[1])
    dlon, dlat = lon2 - lon1, lat2 - lat1
    h = math.sin(dlat/2)**2 + math.cos(lat1)*math.cos(lat2)*math.sin(dlon/2)**2
    return 2 * R * math.asin(math.sqrt(h))
▼ 実行結果
このステップも print しません。表2(経度に特徴のある品目)・表3(緯度に特徴のある品目)・対照品目・人口重心の値を転記し、2点間の距離を測る haversine_km 関数を定義しています。
💡 実行結果の読み取り
  • WEST/EAST は表2(西10・東10品目)、SOUTH/NORTH は表3(南10・北10品目)の報告値です。
  • haversine_km は地球を球とみなして経度・緯度から2地点の距離を求める関数。これは報告値どうしの整合性チェック(例:牛肉と豚肉の距離が報告値71.411kmに一致するか)に使います。
  • 人口重心は原論文の度分秒表記(東経137度02分15.84秒 …)を10進の度に直して保持しますが、地図の背景描画(QGIS)は再現対象外です。
💡 Python TIPS 度分秒(DMS)→10進の度は「度 + 分/60 + 秒/3600」。137 + 2/60 + 15.84/3600 のように書けます。

🔗 転記した数値が原論文と食い違っていないかを、コンソール出力と距離計算で確認する。

やってみよう③ 報告値と品目間距離をコンソールに出力して確認
📝 コード
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# ══════════════════════════════════════════════════════════
# コンソール出力:報告値の確認
# ══════════════════════════════════════════════════════════
print('=' * 64)
print('家計調査に基づく消費重心の計算 — 原論文の報告値(可視化用)')
print('=' * 64)
print(f'食料全体の消費重心(表1 食料合計): 経度 {GOUKEI[1]}, 緯度 {GOUKEI[2]}')
print(f'人口重心(平成27年国勢調査)      : {JINKO_JUSHIN_DMS}')
print(f'  → 消費重心は人口重心より東北東へ約 {REPORTED_KM_JINKO} km(原論文の報告値)')

print('\n── 大分類で最も西/東に位置した消費重心(表1)──')
lon_sorted = sorted(DAIBUNRUI, key=lambda t: t[1])
print(f'  最も西: {lon_sorted[0][0]}(経度 {lon_sorted[0][1]})')
print(f'  最も東: {lon_sorted[-1][0]}(経度 {lon_sorted[-1][1]})')

print('\n── 小分類213品目の経度・緯度の基本統計量(図1・図2, 報告値)──')
print(f'  経度: 平均{STATS_LON["平均"]} 中央値{STATS_LON["中央値"]} '
      f'標準偏差{STATS_LON["標準偏差"]} 歪度{STATS_LON["歪度"]} 尖度{STATS_LON["尖度"]}')
print(f'  緯度: 平均{STATS_LAT["平均"]} 中央値{STATS_LAT["中央値"]} '
      f'標準偏差{STATS_LAT["標準偏差"]} 歪度{STATS_LAT["歪度"]} 尖度{STATS_LAT["尖度"]}')

print('\n── 報告座標による品目間距離の整合性チェック(haversine)──')
d_bg = haversine_km(CONTRAST['牛肉'], CONTRAST['豚肉'])
d_tm = haversine_km(CONTRAST['たい'], CONTRAST['まぐろ'])
print(f'  牛肉↔豚肉: 計算 {d_bg:.3f} km(原論文の報告値 {REPORTED_KM_BUTA_GYU} km)')
print(f'  たい↔まぐろ: 計算 {d_tm:.3f} km(東西の代替的関係)')
▼ 実行結果
================================================================
家計調査に基づく消費重心の計算 — 原論文の報告値(可視化用)
================================================================
食料全体の消費重心(表1 食料合計): 経度 137.1959, 緯度 35.39448
人口重心(平成27年国勢調査)      : 東経137度02分15.84秒 / 北緯35度34分51.44秒
  → 消費重心は人口重心より東北東へ約 16.75 km(原論文の報告値)

── 大分類で最も西/東に位置した消費重心(表1)──
  最も西: 肉類(経度 136.9404)
  最も東: 外食(経度 137.3352)

── 小分類213品目の経度・緯度の基本統計量(図1・図2, 報告値)──
  経度: 平均137.1901 中央値137.1637 標準偏差0.32928 歪度-0.22126 尖度2.17056
  緯度: 平均35.4238 中央値35.4069 標準偏差0.1797 歪度0.66821 尖度4.04831

── 報告座標による品目間距離の整合性チェック(haversine)──
  牛肉↔豚肉: 計算 71.331 km(原論文の報告値 71.411 km)
  たい↔まぐろ: 計算 239.146 km(東西の代替的関係)
💡 実行結果の読み取り
  • 食料全体の消費重心は経度137.1959・緯度35.39448。原論文は「人口重心より東北東へ約16.75km」と報告しており、その文言をそのまま表示しています。
  • 大分類で最も西は肉類(136.9404)、最も東は外食(137.3352)。原論文の記述と一致します。
  • 牛肉と豚肉の距離は計算で71.331km。原論文の報告値71.411kmとほぼ一致し、転記した座標が妥当であることを確認できます(わずかな差は丸めと地球半径の取り方の違い)。
💡 Python TIPS f"…{x:.3f}…" は小数点以下3桁で埋め込む書式。桁を揃えると数値の比較が読みやすくなります。
3
大分類の消費重心(表1・図1)

家計調査の食料12大分類について、原論文が報告した消費重心(経度・緯度)は次のとおり。青は最も西の肉類、緑は最も東の外食

表1 大分類の消費重心(原論文の報告値)

大分類経度(東経)緯度(北緯)
01 穀類137.121635.41703
02 魚介類137.218335.48567
03 肉類136.940435.30843
04 乳卵類137.151835.28413
05 野菜・海藻137.278735.43841
06 果物137.293135.44298
07 油脂・調味料137.057135.36921
08 菓子類137.180235.42998
09 調理食品137.177235.32412
10 飲料137.168835.39765
11 酒類137.220535.55091
12 外食137.335235.35948
食料(合計)137.195935.39448
💭 目的:表1の12品目+食料合計を経度×緯度の散布図に置き、大分類の消費重心がどう散らばっているかを一目で捉える。
やってみよう④ 図1:大分類の消費重心の散布図(経度×緯度)
📝 コード
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# ══════════════════════════════════════════════════════════
# 図1: 大分類12品目の消費重心の分布(経度×緯度, 表1の報告値)
# ══════════════════════════════════════════════════════════
fig1, ax1 = plt.subplots(figsize=(10, 7))
lons = [t[1] for t in DAIBUNRUI]
lats = [t[2] for t in DAIBUNRUI]
ax1.scatter(lons, lats, s=90, color='#f0a500', edgecolors='#7c5a00',
            linewidths=0.8, zorder=3, label='大分類の消費重心(12品目)')
for name, lon, lat in DAIBUNRUI:
    ax1.annotate(name, (lon, lat), fontsize=9, ha='left', va='bottom',
                 xytext=(3, 3), textcoords='offset points')
# 食料合計
ax1.scatter([GOUKEI[1]], [GOUKEI[2]], s=180, marker='*', color='#c62828',
            edgecolors='black', linewidths=0.8, zorder=4, label='食料(合計)の消費重心')
ax1.annotate('食料(合計)', (GOUKEI[1], GOUKEI[2]), fontsize=10, fontweight='bold',
             color='#c62828', ha='right', va='top', xytext=(-4, -4), textcoords='offset points')
# 最西・最東の強調(重ね塗り)
ax1.scatter([lon_sorted[0][1]], [lon_sorted[0][2]], s=90, color='#1565C0',
            edgecolors='black', linewidths=0.8, zorder=5)
ax1.scatter([lon_sorted[-1][1]], [lon_sorted[-1][2]], s=90, color='#2E7D32',
            edgecolors='black', linewidths=0.8, zorder=5)
ax1.text(0.02, 0.97, '青=最も西(肉類) 緑=最も東(外食)',
         transform=ax1.transAxes, fontsize=10, va='top', ha='left',
         bbox=dict(boxstyle='round,pad=0.3', fc='#FFF8E1', ec='#F9A825', alpha=0.9))

ax1.set_xlabel('経度(東経・度)→ 東', fontsize=12)
ax1.set_ylabel('緯度(北緯・度)→ 北', fontsize=12)
ax1.set_title(f'図1  大分類の消費重心の分布(経度×緯度)\n原論文 表1・{NOTE}',
              fontsize=13, fontweight='bold')
ax1.legend(loc='lower right', fontsize=10, framealpha=0.9)
ax1.grid(True, alpha=0.3, linestyle='--')
ax1.spines[['top', 'right']].set_visible(False)
fig1.tight_layout()
fig1.savefig(os.path.join(FIG_DIR, '2020_U5_5_fig1.png'), dpi=150, bbox_inches='tight')
plt.close(fig1)
print('\n図1 保存完了: 2020_U5_5_fig1.png')
▼ 実行結果
図1 保存完了: 2020_U5_5_fig1.png
💡 実行結果の読み取り
  • 横軸が経度(右ほど東)、縦軸が緯度(上ほど北)。星印が食料(合計)の消費重心です。
  • 肉類が最も左(西)、外食が最も右(東)に位置し、原論文の「最も西=肉類・最も東=外食」という記述を視覚的に再現しています。
  • ax1.annotate で各点に品目名を添えています。図タイトルに「報告値の可視化(再計算ではない)」と明記しています。
💡 Python TIPS ax.scatter(x, y) は点を打つ関数。marker="*" で星印など形を変えられます。
大分類の消費重心の分布(経度×緯度)
図1:大分類12品目+食料合計の消費重心(経度×緯度)。原論文 表1の報告値の可視化であり、再計算ではない。地図背景(QGIS)は原論文 図4を参照。
📌 この散布図の読み方
このグラフは
各大分類の消費重心を、経度(東西)と緯度(南北)の2次元平面に置いたもの。
読み方
右にある品目ほど消費額が東日本に偏り、左にある品目ほど西日本に偏る。上下は南北の偏り。
なぜそう言えるか
消費重心は消費額で加重した経度・緯度の平均なので、東の県で多く消費される品目ほど重心が東へ引っ張られる。

小分類213品目の分布(原論文 図1・図2の報告値)

大分類をさらに細かくした小分類213品目の消費重心について、原論文が示した経度・緯度の基本統計量は次のとおり。

統計量経度(東経)緯度(北緯)
平均137.190135.4238
中央値137.163735.4069
標準偏差0.329280.17970
歪度-0.221260.66821
尖度2.170564.04831
最小 / 最大135.7723 / 138.216534.7792 / 36.1986
データ数213213
分布の読み取り(原論文の記述) 経度の分布はやや左(西)に長く裾を引き、正規分布よりなだらか。緯度の分布は右(北)に長く裾を引き、正規分布より尖った(尖度4.05)形になっている。213品目のヒストグラムそのものは原論文 図1・図2を参照。本ページでは213品目の生値を保有していないため、ヒストグラムは再描画せず、報告された基本統計量の表で示す。
4
経度からの考察:東西の地域性(表2・図2)

消費重心の経度が最も小さい(西)・最も大きい(東)品目、各10品目を原論文がまとめている。

表2 経度に特徴のある消費品目(原論文の報告値)

西に位置する10品目東に位置する10品目
品目経度緯度品目経度緯度
たい135.772334.7792まぐろ138.216535.5758
まんじゅう136.233535.05084グレープフルーツ138.060635.7085
あじ136.279734.8392しじみ138.028735.9265
合いびき肉136.363134.9684魚介の漬物138.001435.9617
揚げかまぼこ136.484735.0584しゅうまい137.985135.4739
ぶり136.496235.0493ワイン137.935835.5691
さば136.52635.1315ウイスキー137.898735.9656
そうざい材料セット136.554735.1627塩さけ137.868135.9674
牛肉136.580535.0234ほたて貝137.82936.1005
いわし136.582935.1546さやまめ137.764635.4946
💭 目的:西10・東10品目を1本の横棒に並べ、食料合計の経度(赤破線)を基準に東西の偏りを直感的に見せる。
やってみよう⑤ 図2:経度に特徴のある品目(西10・東10)の横棒グラフ
📝 コード
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# ══════════════════════════════════════════════════════════
# 図2: 経度に特徴のある消費品目(西10・東10, 表2の報告値)
# ══════════════════════════════════════════════════════════
items = list(reversed(WEST)) + list(reversed(EAST))  # 下=西, 上=東 になるよう配置
names = [t[0] for t in items]
vals = [t[1] for t in items]
colors = ['#1565C0'] * len(WEST) + ['#2E7D32'] * len(EAST)

fig2, ax2 = plt.subplots(figsize=(10, 9))
ax2.barh(range(len(items)), vals, color=colors, alpha=0.85, edgecolor='white', linewidth=0.5)
ax2.axvline(GOUKEI[1], color='#c62828', linewidth=1.5, linestyle='--',
            label=f'食料(合計)の経度 {GOUKEI[1]}')
ax2.set_yticks(range(len(items)))
ax2.set_yticklabels(names, fontsize=10)
for i, v in enumerate(vals):
    ax2.text(v + 0.006, i, f'{v:.4f}', va='center', fontsize=8, color='#333')
ax2.set_xlabel('経度(東経・度) ←西  東→', fontsize=12)
ax2.set_title(f'図2  経度に特徴のある消費品目(西10・東10)\n原論文 表2・{NOTE}',
              fontsize=13, fontweight='bold')
ax2.set_xlim(135.5, 138.5)
handles = [Patch(facecolor='#1565C0', alpha=0.85, label='西に位置(暖流・西日本の漁業等)'),
           Patch(facecolor='#2E7D32', alpha=0.85, label='東に位置(寒流・東日本の産地等)'),
           plt.Line2D([0], [0], color='#c62828', linestyle='--', label=f'食料(合計){GOUKEI[1]}')]
ax2.legend(handles=handles, loc='lower right', fontsize=9, framealpha=0.9)
ax2.grid(True, axis='x', alpha=0.3, linestyle='--')
ax2.spines[['top', 'right']].set_visible(False)
fig2.tight_layout()
fig2.savefig(os.path.join(FIG_DIR, '2020_U5_5_fig2.png'), dpi=150, bbox_inches='tight')
plt.close(fig2)
print('図2 保存完了: 2020_U5_5_fig2.png')
▼ 実行結果
図2 保存完了: 2020_U5_5_fig2.png
💡 実行結果の読み取り
  • 青が西寄り、緑が東寄りの品目。赤い破線は食料(合計)の経度137.1959で、東西の基準線です。
  • 最も西はたい(135.7723)、最も東はまぐろ(138.2165)。魚介類が東西両端を占めている点が読み取れます。
  • ax.barh は横棒、ax.axvline は縦の基準線。並び順は下=西・上=東になるよう反転させています。
💡 Python TIPS list(reversed(x)) でリストの並びを逆にできます。横棒は下から積まれるので、表示順を整えるときに使います。
経度に特徴のある消費品目(西10・東10)
図2:経度に特徴のある消費品目(表2)。原論文 表2の報告値の可視化であり、再計算ではない。
原論文の解釈 最も西のたいは漁獲量が長崎・福岡・島根の順で多く、西日本での消費が大きい。あじ・ぶり・さば・いわしなど瀬戸内海の盛んな漁業の影響を受ける魚介も西寄り。反対にまぐろは最も東で、塩さけ・さんまなど寒流の魚も東寄り。暖流に生息する魚は西、寒流の魚は東という傾向が読み取れる。肉類では豚肉(東)と牛肉(西)が対照的に分かれる。
5
緯度からの考察:南北の地域性(表3・図3)

同様に、消費重心の緯度が最も小さい(南)・最も大きい(北)品目、各10品目を原論文がまとめている。

表3 緯度に特徴のある消費品目(原論文の報告値)

南に位置する10品目北に位置する10品目
品目経度緯度品目経度緯度
たい135.772334.7792メロン137.68150936.1986493
あじ136.279734.8392ほたて貝137.82898636.1005324
合いびき肉136.363134.9684塩さけ137.86813735.9674378
牛肉136.580535.0234ウイスキー137.89873835.9655654
ぶり136.496235.0493魚介の漬物138.00143735.9616854
揚げかまぼこ136.484735.0584かれい137.16828235.9436351
まんじゅう136.233535.05084しじみ138.02874135.9265045
かつお節・削り節136.823435.0757他の貝137.52831735.8431935
さば136.52635.1315さんま137.56241435.7237647
いわし136.582935.1546グレープフルーツ138.0606435.7084886
💭 目的:南10・北10品目を横棒に並べ、食料合計の緯度(赤破線)を基準に南北の偏りを見せる。
やってみよう⑥ 図3:緯度に特徴のある品目(南10・北10)の横棒グラフ
📝 コード
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
# ══════════════════════════════════════════════════════════
# 図3: 緯度に特徴のある消費品目(南10・北10, 表3の報告値)
# ══════════════════════════════════════════════════════════
items3 = list(reversed(SOUTH)) + list(reversed(NORTH))  # 下=南, 上=北
names3 = [t[0] for t in items3]
vals3 = [t[2] for t in items3]
colors3 = ['#E65100'] * len(SOUTH) + ['#00695C'] * len(NORTH)

fig3, ax3 = plt.subplots(figsize=(10, 9))
ax3.barh(range(len(items3)), vals3, color=colors3, alpha=0.85, edgecolor='white', linewidth=0.5)
ax3.axvline(GOUKEI[2], color='#c62828', linewidth=1.5, linestyle='--',
            label=f'食料(合計)の緯度 {GOUKEI[2]}')
ax3.set_yticks(range(len(items3)))
ax3.set_yticklabels(names3, fontsize=10)
for i, v in enumerate(vals3):
    ax3.text(v + 0.004, i, f'{v:.4f}', va='center', fontsize=8, color='#333')
ax3.set_xlabel('緯度(北緯・度) ←南  北→', fontsize=12)
ax3.set_title(f'図3  緯度に特徴のある消費品目(南10・北10)\n原論文 表3・{NOTE}',
              fontsize=13, fontweight='bold')
ax3.set_xlim(34.5, 36.4)
handles3 = [Patch(facecolor='#E65100', alpha=0.85, label='南に位置(九州・四国の影響)'),
            Patch(facecolor='#00695C', alpha=0.85, label='北に位置(北海道の名産品)'),
            plt.Line2D([0], [0], color='#c62828', linestyle='--', label=f'食料(合計){GOUKEI[2]}')]
ax3.legend(handles=handles3, loc='lower right', fontsize=9, framealpha=0.9)
ax3.grid(True, axis='x', alpha=0.3, linestyle='--')
ax3.spines[['top', 'right']].set_visible(False)
fig3.tight_layout()
fig3.savefig(os.path.join(FIG_DIR, '2020_U5_5_fig3.png'), dpi=150, bbox_inches='tight')
plt.close(fig3)
print('図3 保存完了: 2020_U5_5_fig3.png')
▼ 実行結果
図3 保存完了: 2020_U5_5_fig3.png
💡 実行結果の読み取り
  • 橙が南寄り、緑が北寄りの品目。赤い破線は食料(合計)の緯度35.39448です。
  • 最も北はメロン(36.1986)で、ほたて貝・塩さけ・ウイスキーなど北海道の名産品が北に集まります。最も南はたい(34.7792)で、あじなど九州・四国の影響を受ける品目が南に位置します。
  • 図2とほぼ同じ描画コードを、経度→緯度に差し替えて再利用しています。
💡 Python TIPS 似た図を2枚作るときは、変数(列や軸ラベル)だけ差し替えると、コードの重複を最小にできます。
緯度に特徴のある消費品目(南10・北10)
図3:緯度に特徴のある消費品目(表3)。原論文 表3の報告値の可視化であり、再計算ではない。
原論文の解釈 メロン・ほたて貝・塩さけ・ウイスキーなどは消費重心が北に位置し、いずれも北海道の名産品。反対にたい・あじは九州・四国の影響を受けて南に位置する。緯度からは南北の家計消費の特徴を見出せる。
6
品目間の対照と距離(図4)

経度・緯度を組み合わせると、品目間の位置関係や「距離」も測れる。原論文は牛肉と豚肉の消費重心間距離を 71.411km(CASIO 高性能計算サイトで算出)と報告している。たいとまぐろは東西に大きく離れ、代替的な関係がうかがえる。

💭 目的:本文で言及される4品目(牛肉・豚肉・たい・まぐろ)と食料合計を1枚に置き、対照ペアを線で結んで距離の大きさを実感する。
やってみよう⑦ 図4:品目間の対照(牛肉と豚肉・たいとまぐろ)
📝 コード
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
# ══════════════════════════════════════════════════════════
# 図4: 品目間の対照(牛肉↔豚肉, たい↔まぐろ)と距離(報告値)
# ══════════════════════════════════════════════════════════
fig4, ax4 = plt.subplots(figsize=(10, 7))
pair_style = {
    '牛肉':   ('#C62828', 'o'), '豚肉': ('#C62828', 's'),
    'たい':   ('#1565C0', 'o'), 'まぐろ': ('#1565C0', 's'),
}
for name, (lon, lat) in CONTRAST.items():
    col, mk = pair_style[name]
    ax4.scatter([lon], [lat], s=140, color=col, marker=mk, edgecolors='black',
                linewidths=0.7, zorder=3)
    ax4.annotate(name, (lon, lat), fontsize=11, fontweight='bold', color=col,
                 ha='left', va='bottom', xytext=(4, 4), textcoords='offset points')
# 対照ペアを線で結ぶ
for pair, kmtext in [(('牛肉', '豚肉'), f'牛肉と豚肉 {REPORTED_KM_BUTA_GYU} km'),
                     (('たい', 'まぐろ'), 'たいとまぐろ(東西の代替)')]:
    a, b = CONTRAST[pair[0]], CONTRAST[pair[1]]
    ax4.plot([a[0], b[0]], [a[1], b[1]], color='#888', linestyle='--', linewidth=1.2, zorder=2)
    mx, my = (a[0]+b[0])/2, (a[1]+b[1])/2
    ax4.annotate(kmtext, (mx, my), fontsize=9, color='#555', ha='center', va='center',
                 bbox=dict(boxstyle='round,pad=0.2', fc='white', ec='#bbb', alpha=0.9))
# 食料合計
ax4.scatter([GOUKEI[1]], [GOUKEI[2]], s=200, marker='*', color='#f0a500',
            edgecolors='black', linewidths=0.8, zorder=4, label='食料(合計)')
ax4.annotate('食料(合計)', (GOUKEI[1], GOUKEI[2]), fontsize=10,
             ha='right', va='top', xytext=(-4, -4), textcoords='offset points')

ax4.set_xlabel('経度(東経・度)→ 東', fontsize=12)
ax4.set_ylabel('緯度(北緯・度)→ 北', fontsize=12)
ax4.set_title(f'図4  品目間の対照:牛肉と豚肉・たいとまぐろの消費重心\n原論文本文・{NOTE}',
              fontsize=13, fontweight='bold')
ax4.legend(loc='lower right', fontsize=10, framealpha=0.9)
ax4.grid(True, alpha=0.3, linestyle='--')
ax4.spines[['top', 'right']].set_visible(False)
fig4.tight_layout()
fig4.savefig(os.path.join(FIG_DIR, '2020_U5_5_fig4.png'), dpi=150, bbox_inches='tight')
plt.close(fig4)
print('図4 保存完了: 2020_U5_5_fig4.png')

print('\n全図生成完了。')
▼ 実行結果
図4 保存完了: 2020_U5_5_fig4.png

全図生成完了。
💡 実行結果の読み取り
  • 赤が肉類(牛肉○・豚肉□)、青が魚介(たい○・まぐろ□)。破線で対照ペアを結んでいます。
  • 牛肉と豚肉は約71km、たいとまぐろは経度で2度以上(東西に大きく)離れています。距離の数値は原論文の報告値を注記しています。
  • 最後に「全図生成完了。」が表示され、図1〜図4の4枚が html/figures/ に保存されます。
💡 Python TIPS ax.plot([x1,x2],[y1,y2]) は2点を線で結びます。linestyle="--" で破線になります。
品目間の対照:牛肉と豚肉・たいとまぐろの消費重心
図4:品目間の対照。原論文本文の報告値の可視化であり、再計算ではない。牛肉↔豚肉の距離71.411kmは原論文の報告値。
人口重心と消費重心の位置関係(原論文 図3) 食料全体の消費重心(137.1959, 35.39448)は、人口重心(東経137度02分15.84秒・北緯35度34分51.44秒)より東北東へ約16.75km離れている。人口の多い東京都近県で家計消費が大きいため、消費重心が首都圏方向へ引っ張られたと原論文は解釈している。この2点を重ねた地図(QGIS)は原論文 図3を参照。
7
まとめと課題
結論 順位尺度に頼ってきた食料品目の地域性分析に「消費重心」を導入することで、都道府県ごと・品目ごとの特色を、東西南北という大まかな地理座標で1点に要約できた。順位では上位に入らず注目されにくい品目の地域性も抽出でき、品目間の比較や距離の計算も可能になった。

主要な発見(すべて原論文の報告値)

課題(原論文が挙げた限界)
  • 今回は二人以上世帯と一般世帯数に絞ったため、単身世帯や施設等の世帯を含まず、厳密なマクロ推計には不十分。
  • 世帯数は2015年(国勢調査)、家計消費額は2017〜2019年の平均で、調査年度に乖離がある。

これらの誤差を小さくする工夫を前提に、消費重心は食品以外の品目や、複数年での重心の移動距離(経年変化)の分析にも応用できる可能性がある。近年の消費傾向や人口との関連を見出す1つの尺度になりうる。

⚠️ よくある誤解

消費重心は直感的に見えて、読み違えやすいポイントがいくつもあります。

誤解1:消費重心は「たくさん食べている場所」だ
消費重心は消費量そのものの場所ではなく、消費額で加重した経度・緯度の平均点です。ある品目の重心が東にあるのは「東で多く消費される(=重みが東に偏る)」ためで、重心の地点で最も食べられているという意味ではありません。
誤解2:重心が近い品目どうしは消費構造が似ている
重心は分布全体を1点に要約した指標です。まったく違う地域分布でも重心はたまたま近くなり得ます。重心の一致は「平均位置が近い」だけで、分布の形が同じとは限りません。
誤解3:消費重心は因果関係を示す
消費重心は記述的(describe)な指標で、「なぜ東西南北に偏るのか」を説明するものではありません。漁業・気候・特産品などの背景は解釈であり、重心そのものが原因を証明するわけではありません。
誤解4:経度・緯度の数字はすべて同じ表記だ
原論文の本文は度分秒(例:東経137度02分15.84秒)、表は10進の度(例:137.1959)を使っています。「137.1959」を「137度19分59秒」と読むと誤りです。10進の度と度分秒の変換に注意してください。

📖 用語集

本ページに出てくる主な用語をまとめます。

消費重心
人口重心の式の重みを人口から家計消費額に置き換え、品目ごとの消費額の偏りを経度・緯度の1点で表した指標。
人口重心
1人1人が同じ重さを持つと仮定したとき、地域の人口が全体として平衡を保つ点。総務省統計局が国勢調査ごとに公表。
加重平均
各値に重み(ここでは消費額)を掛けて合計し、重みの合計で割った平均。単純平均より偏りの大きい所へ寄る。
基本単位区
国勢調査の集計に使う最小区画。人口重心はかつての庁舎位置ではなく、基本単位区の中心点に人口が集中すると仮定して算出される。
経度・緯度
地球上の位置を表す座標。経度は東西(東経が大きいほど東)、緯度は南北(北緯が大きいほど北)。
歪度(わいど)
分布の左右非対称の度合い。正なら右に裾が長い、負なら左に裾が長い。
尖度(せんど)
分布の尖り・裾の重さの度合い。値が大きいほど中央が尖り裾が重い。
大円距離
球面上の2点間の最短距離。経度・緯度からハバサイン公式などで計算する。
SSDSE
教育用標準データセット(Standardized Statistical Data Set for Education)。統計センターが提供する、都道府県・市区町村単位の公的統計をまとめた表。
QGIS
地理情報システム(GIS)のオープンソースソフト。座標を地図上にプロットして分布を可視化できる。

📐 手法ガイド

本論文で使われた「重心(加重平均)」まわりの手法を、注意点つきで整理します。データはすべて統計センター提供の教育用標準データセット(SSDSE)を用いています。

中心となる考え方:重み付きの平均で「偏りの中心」を1点にまとめる
重心とは、各地点の座標を「重み」で加重平均した点です。人口重心は重みが人口、消費重心は重みが家計消費額。重みが偏っている方向へ重心が引っ張られる、という性質を使って地域性を要約します。
⚖️ 加重平均による重心の計算
何?
各点の座標 (x_i, y_i) を重み C_i で加重平均し、分布を代表する1点を求める。
どう使う?
x = ΣC_i x_i / ΣC_i、y = ΣC_i y_i / ΣC_i。重みを人口にすれば人口重心、消費額にすれば消費重心。
何がわかる?
品目ごとの消費額が東西南北のどちらに偏っているかを、経度・緯度の1点で比較できる。
⚠️ 注意点
(1) 重みの単位・欠損を揃える(今回は二人以上世帯のみで単身世帯を含まない)。(2) 代表点の取り方(県庁所在地か人口重心か)で結果が変わる。(3) 重心は分布を1点に潰すので、分布の広がり(分散)は別途見る必要がある。
📈 分布の要約:基本統計量・歪度・尖度・ヒストグラム
何?
多数の値(213品目の経度・緯度)を平均・中央値・標準偏差・歪度・尖度・ヒストグラムで要約する。
どう使う?
平均と中央値のズレや歪度で非対称性を、尖度で尖り具合を判断する。
何がわかる?
経度は西へ、緯度は北へ長く裾を引く、といった全体傾向を把握できる。
⚠️ 注意点
(1) 平均は外れ値に弱いので中央値と併読する。(2) 歪度・尖度の符号の意味を取り違えない。(3) 生データが無い場合、ヒストグラムは再描画できず報告値の表で示すにとどまる(本ページがその例)。
🗺️ 地理座標の距離計算(大円距離)
何?
経度・緯度で表された2点間の距離を、球面上の最短距離(大円距離)として求める。
どう使う?
ハバサイン公式で計算する。品目間の重心距離や、人口重心と消費重心の距離に使う。
何がわかる?
「牛肉と豚肉の重心が約71km離れている」のように、偏りの大きさを長さで表せる。
⚠️ 注意点
(1) 度分秒と10進の度を混ぜない。(2) 地球半径の取り方(平均半径6371kmなど)で数kmの差が出る。(3) 平面座標で単純にユークリッド距離を取ると、緯度が高いほど誤差が大きくなる。
🧭 GIS(QGIS)による可視化
何?
座標データを地図上にプロットして、分布を視覚的に把握する地理情報システム。
どう使う?
各品目の消費重心の経度・緯度を点として地図に重ね、東西南北の散らばりを見る。
何がわかる?
散布図では分かりにくい「実際の地理的位置」との対応を確認できる。
⚠️ 注意点
(1) 背景地図の座標系(測地系)を座標に合わせる。(2) 点が密集すると重なって読めない(本論文も注釈で品目名を引き出している)。(3) 地図の再現には元データと同じ設定が要るため、本ページでは要点を表・散布図で示し地図は原論文を参照とする。

🚀 発展の可能性(結果 X → 新仮説 Y → 課題 Z)

この研究をさらに発展させる3つの方向性です。

① 経年変化(重心の移動)を測る
結果 X
2017〜2019年平均の消費重心を1時点で求めた。
新仮説 Y
人口重心と同様、消費重心も年ごとに移動しているのではないか。
課題 Z
(1) 複数年の SSDSE-C で年ごとの消費重心を計算する。(2) 前年からの移動距離・方向を求める。(3) コロナ禍などの出来事と対応づけて考察する。
② 食品以外の品目へ拡張する
結果 X
食料品目で消費重心の有効性を示した。
新仮説 Y
衣料・住居・教養娯楽など他費目でも地域性を重心で表せるはず。
課題 Z
(1) SSDSE-C の他費目で同じ計算を行う。(2) 費目間で重心の東西南北を比較する。(3) 気候・産業構造との関連を検討する。
③ マクロ推計の精度を上げる
結果 X
二人以上世帯・一般世帯数に絞ったため単身世帯を含まない。
新仮説 Y
単身世帯や施設等を含めれば、より実態に近い消費重心になるのではないか。
課題 Z
(1) 単身世帯の支出・世帯数データを追加する。(2) 世帯数と支出額の調査年度を揃える。(3) 補正前後で重心がどれだけ動くかを検証する。

🎯 自分でやってみよう(5つのチャレンジ)

スクリプトをベースに手を動かしてみましょう。

★☆☆☆☆ 入門
CH1. 図を再現する
付属スクリプトをそのまま実行し、図1〜図4を再現してください。
ポイント:どの図がどのコード行から生成されるか辿る。
★★☆☆☆ 初級
CH2. 別の品目ペアの距離を測る
haversine_km を使って、たとえば「ぶりとまぐろ」など別ペアの重心距離を計算してください。
ポイント:東西・南北どちらの差が距離に効いているか考える。
★★★☆☆ 中級
CH3. 大分類の散布図に注釈を足す
図1に「食料合計より東の品目」を色分けするなど、注釈を追加してください。
ポイント:どの大分類が首都圏方向に寄っているか。
★★★★☆ 上級
CH4. SSDSE-C から支出額を再現する
SSDSE-C-2020 と SSDSE-A-2020 を入手し、県庁所在市の家計消費額 C_i(支出額×世帯数)を計算してください。
ポイント:あとは人口重心の座標があれば消費重心が計算できる、という構造を体感する。
★★★★★ 発展
CH5. 別費目の消費重心を提案する
食品以外(例:教養娯楽費)で消費重心を計算する計画を1ページにまとめてください。
ポイント:必要データ・座標・想定される地域性を書き出す。
💡 ヒント:詰まったら本ページのスクリプトと手法ガイドを見返し、既存の関数を再利用しましょう。

💼 この手法は実社会でこう使われている

「重み付きの重心」で地域性を1点に要約する発想は、現場で広く使われています。

🛒
小売の品揃え・地域商品開発
品目ごとの消費が東西南北どちらに偏るかが分かれば、地域限定商品の企画や、店舗ごとの棚割りの最適化に活かせます。
🚚
物流・出店戦略
需要の重心を求めることは、物流拠点や新規出店の候補地選定の基本。重心に近いほど平均輸送距離を小さくできます。
🐟
特産品・観光のプロモーション
「この品目は西日本/北海道で強い」という地域性は、産地ブランディングや観光の訴求ポイントづくりに直結します。
🏛️
行政の地域政策
消費や人口の重心の移動は、都市圏への集中の度合いを測る指標になり、地域振興策の効果検証に使えます。
🗺️
GISによる可視化業務
座標を地図に載せて分布を見せる作業は、マーケティング・防災・都市計画など多くの分野で日常的に行われています。
🎓
学術研究(地理学・経済学)
人口・産業・消費の重心とその移動は、地域経済学や地理学の実証研究で標準的に扱われるテーマです。

🤔 よくある質問(読者からの想定Q&A)

初心者が抱きやすい疑問に答えます。

Q1. なぜこのページの図は「再計算ではない」のですか?
消費重心の計算には、支出額(SSDSE-C)と世帯数(SSDSE-A)に加えて、各都道府県の人口重心の経度・緯度が必要です。この座標は SSDSE に収録されていない外部表(総務省統計局)なので、座標が無いと最終値を再計算できません。そこで本ページは原論文が報告した値を転記して可視化しています。
Q2. 消費重心と人口重心はどう違うのですか?
式は同じで、重みだけが違います。人口重心は重みが人口、消費重心は重みが家計消費額です。だから消費重心は「その品目の消費額がどこに偏っているか」を表します。
Q3. 「137.1959」は「137度19分59秒」ですか?
いいえ。表の値は10進の度で、137.1959度=約137度11分45秒です。本文の度分秒表記(例:東経137度02分15.84秒)と混同しないよう注意してください。
Q4. 完全に自分で再現するには何が要りますか?
SSDSE-C-2020(食料品目別支出額)、SSDSE-A-2020(一般世帯数)、そして各県の人口重心の経度・緯度表(総務省統計局2017)の3つです。前2つは統計センターから、座標表は総務省統計局の資料から入手できます。
Q5. この手法は食品以外にも使えますか?
使えます。重みを別の費目の支出額に替えれば、衣料や教養娯楽などの消費重心も同じ式で計算できます。原論文も食品以外への応用可能性に触れています。

✅ 理解度チェック(4問)

この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。

5
SSDSE-C(家計調査)で「消費重心」の計算を再現する

原論文の核心は、家計調査の品目別支出を重みにして「消費重心」=品目ごとの消費の地理的な中心を計算するというアイデアです。SSDSE-C-2026(県庁所在市別の品目別支出)と県庁所在地の座標から、品目別の消費重心を実際に計算します。

消費重心 = ( Σi 緯度i·支出i / Σi 支出i , Σi 経度i·支出i / Σi 支出i ) # 品目の支出額を「重さ」とみなした全国の重心。人口重心と同じ発想
やってみよう品目別の消費重心を計算して基準からのずれを見る
📝 コード
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import numpy as np
import pandas as pd

# 県庁所在地の緯度・経度(国土地理院の公表値、地理定数)
LATLON = {
'北海道':(43.064,141.347),'青森県':(40.824,140.740),'岩手県':(39.704,141.153),'宮城県':(38.269,140.872),
'秋田県':(39.719,140.102),'山形県':(38.240,140.364),'福島県':(37.750,140.468),'茨城県':(36.342,140.447),
'栃木県':(36.566,139.884),'群馬県':(36.391,139.061),'埼玉県':(35.857,139.649),'千葉県':(35.605,140.123),
'東京都':(35.690,139.692),'神奈川県':(35.448,139.643),'新潟県':(37.902,139.023),'富山県':(36.695,137.211),
'石川県':(36.595,136.626),'福井県':(36.065,136.222),'山梨県':(35.664,138.568),'長野県':(36.651,138.181),
'岐阜県':(35.391,136.722),'静岡県':(34.977,138.383),'愛知県':(35.180,136.907),'三重県':(34.730,136.509),
'滋賀県':(35.005,135.869),'京都府':(35.021,135.756),'大阪府':(34.686,135.520),'兵庫県':(34.691,135.183),
'奈良県':(34.685,135.833),'和歌山県':(34.226,135.168),'鳥取県':(35.504,134.238),'島根県':(35.472,133.051),
'岡山県':(34.662,133.934),'広島県':(34.397,132.460),'山口県':(34.186,131.471),'徳島県':(34.066,134.559),
'香川県':(34.340,134.043),'愛媛県':(33.842,132.766),'高知県':(33.560,133.531),'福岡県':(33.607,130.418),
'佐賀県':(33.249,130.299),'長崎県':(32.745,129.874),'熊本県':(32.790,130.742),'大分県':(33.238,131.613),
'宮崎県':(31.911,131.424),'鹿児島県':(31.560,130.558),'沖縄県':(26.212,127.681)}

# SSDSE-C(家計調査・県庁所在市別、原論文と同じデータ種別)
c = pd.read_csv('data/raw/SSDSE-C-2026.csv', encoding='cp932', header=1)
c = c[c['地域コード'] != 'R00000'].copy()
c = c.set_index('都道府県')
lat = pd.Series({p: LATLON[p][0] for p in c.index})
lon = pd.Series({p: LATLON[p][1] for p in c.index})

def center(item):
    """品目支出で重み付けした地理的重心(消費重心)を返す"""
    w = pd.to_numeric(c[item], errors='coerce')
    return float((lat * w).sum() / w.sum()), float((lon * w).sum() / w.sum())

# 人口重心の代わりに「全品目合計の消費重心」を基準にする
base_lat, base_lon = center('食料(合計)')
print(f'基準(食料合計の消費重心): 北緯 {base_lat:.3f}, 東経 {base_lon:.3f}')
print()
print(f'{"品目":10s} {"北緯":>8s} {"東経":>9s}  基準からのずれ')
for item in ['米', '食パン', '生うどん・そば', 'まぐろ', 'さけ', 'みそ', 'しょう油',
             '砂糖', 'ソース', '牛肉', '豚肉']:
    la, lo = center(item)
    ns = '北' if la > base_lat else '南'
    ew = '東' if lo > base_lon else '西'
    print(f'{item:10s} {la:8.3f} {lo:9.3f}  {ns}{abs(la-base_lat)*111:.0f}km・{ew}{abs(lo-base_lon)*91:.0f}km')
▼ 実行結果
基準(食料合計の消費重心): 北緯 35.418, 東経 136.148 品目 北緯 東経 基準からのずれ 米 35.379 136.081 南へ4km・西へ6km 食パン 35.351 136.026 南へ7km・西へ11km 生うどん・そば 35.523 136.255 北へ12km・東へ10km まぐろ 35.810 137.373 北へ44km・東へ111km さけ 35.558 136.226 北へ16km・東へ7km みそ 35.451 136.117 北へ4km・西へ3km しょう油 35.376 135.956 南へ5km・西へ18km 砂糖 35.236 135.741 南へ20km・西へ37km ソース 35.278 135.826 南へ15km・西へ29km 牛肉 34.991 135.422 南へ47km・西へ66km 豚肉 35.464 136.168 北へ5km・東へ2km
💡 解説
  • まぐろの消費重心は基準から東へ 111km — まぐろ消費は関東に大きく偏っています。逆に牛肉は南西へ 66km(関西・西日本の牛肉文化)、砂糖・ソースも南西(九州の甘味・関西の粉もの)。
  • 基準となる食料合計の重心(滋賀県付近)は人口重心とほぼ同じ。そこからの「ずれ」が、その品目の地域性の強さと方向を 1 点で要約します——地図と統計を結びつける原論文の発想です。
  • 米・みそ・豚肉はずれが小さい=全国でまんべんなく消費される品目だとわかります。
💡 Python TIPS 緯度 1 度 ≈ 111km、東経 35 度付近の経度 1 度 ≈ 91km。度のままでは南北と東西の距離が揃わない点に注意。

🐍 ブラウザで動かす — インストール不要でこの論文の分析を再現する

このページの分析は、この画面の中でそのまま実行できます。 Python をインストールする必要も、CSV をダウンロードする必要もありません。 下のセルの 「▶ ブラウザで実行」 を上から順に押すか、 「▶ 最初から全部実行」 で一気に流してください。 表示されるのは、本文の図表とまったく同じ計算の結果です (動かしているのは再現スクリプト code/2020_U5_5_shorei.py そのもの)。

コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。