はじめに
「データ分析は準備が8割」
何かしらで一度は聞いたことがあるこの言葉。
正直、最初は「だるっ...」と思いました。
でも今回、AIを活用したエンジニアリング(pipeline・並列処理など)でこの「準備」をねじ伏せることができたので、その過程で得た失敗と成功の両方を共有します。
AIという超高性能なエンジンを操る、F1のドライバー兼メカニックのような体験でした。
Part 0: そもそもデータ分析って商売になるの?
技術の話に入る前に、ずっと引っかかっていた疑問があります。
現場の肌感覚 vs データ分析
「売上が倍も違う、半分も違う」みたいなことは、現場の人が肌感覚でわかるはず。
わざわざデータ分析する必要ある?
これ、正直な疑問でした。
データ分析すれば何かしらの気づきはあるだろうけど、それを改善したところで数%程度の効果しかないのでは?と。
「規模のチカラ」という答え
でも、AIに聞いてみると...
- 100店舗あるチェーン店の店長が、みんなカンが鋭いわけがない
- 属人的なスキルは、その人がいなくなったらなくなる
- わずか数%でも、100店舗、1,000店舗となると効果は絶大
つまり、データ分析の価値は:
| 視点 | 属人的スキル | データ分析 |
|---|---|---|
| 再現性 | その人限り | 誰でも実行可能 |
| スケール | 1店舗 | 100店舗、1,000店舗 |
| 継続性 | 退職したら終わり | 仕組みとして残る |
| 改善効果 | 大きい(でも1箇所) | 小さい(でも全体に波及) |
「カリスマ店長の勘」を否定するのではなく、「カリスマ店長の頭の中を、普通の店長でも使える武器に変換する」。
これが組織としてのデータ分析の正体です。
1店舗で10%改善するより、100店舗で1%改善する方がインパクトがある場合もある。
「ベテラン社員の勘」を否定するのではなく、「ベテラン社員の勘」を再現可能な形で残す。
これがデータ分析の本当の価値なんだと気づきました![]()
また、「点」でなく「線」で考える。
観光DXの事例から学ぶ
国土交通省観光庁の「観光分野のDX推進に向けた優良事例集」を読んで、より学びがありました。
地域一体で観光DXを進めている事例では:
- データの共有: 個々の事業者が持つ「点」のデータを、地域全体の「線」にする
- 再現性のある施策: 成功事例をデータに基づいて他地域に展開
- 継続的な改善: 属人的なノウハウではなく、データに基づくPDCA
さて、ここからは技術的な話に入ります。
Part 1: ランダム探索の大失敗
やろうとしたこと
e-stat(政府統計の総合窓口)には17の統計分野があります。
「ランダムに分野を組み合わせたら、意外な相関が見つかるんじゃない?」
そんな軽い気持ちで始めました。
期待していた成果
- 異なる分野間で予測しにくい相関関係の発見
- 自治体ビジネスにつながる実用的な示唆の獲得
- データ駆動型の新たな発見
実際の結果
45組の組み合わせを分析して、発見された相関25件
内訳を見て愕然としました:
| 相関の種類 | 件数 | 相関係数 |
|---|---|---|
area_列同士の相関 |
10件 | r=1.000 |
| 分類コード列同士の相関 | 9件 | r=0.973 |
| 実際のデータ指標間の相関 | 1件 | r=-0.515 |
ほとんどがメタデータ同士の相関でした。
「areaが高い地域ではareaも高い」って、そりゃそうだろ...
何が悪かったのか
原因1: データ構造の理解不足
e-statのデータ構造を理解せずに突っ込んだ結果:
cat01,cat02,cat03,time,unit,$,都道府県,都道府県コード
100,120,100,2016100000,人,670618,富山県,16
-
cat01,cat02,cat03: カテゴリー分類コード(メタデータ) -
$: 実際の数値データ(分析対象はこれだけ)
この区別ができていませんでした。
原因2: ランダム探索の限界
ランダムに組み合わせるだけでは、意味のある相関は見つからない。
悪い例:
# 意味のない組み合わせ
random_combinations = [
("国土・気象", "情報通信・科学技術"),
("鉱工業", "国際"),
]
良い例:
# 仮説に基づいた分析
hypothesis = "空き家が多い地域では、経済活動が低い傾向がある"
# → 空き家率と経済指標(事業所数、売上高など)の相関を分析
Part 1の学び
「データ分析は、データの構造と意味を理解してから行うべき」
ランダムにデータを組み合わせても、意味のある発見は得られません。
Part 2: AIでねじ伏せた話
Part 1の失敗を踏まえて、AIを活用したエンジニアリングアプローチに切り替えました。
問題その1: 全都道府県で同じ値が返ってくる
データ取得後、統合データを確認したところ...
都道府県,$_空き家,$_事業所,$_観光
富山県,495200,8189813,296905516 ← 全県同じ値
石川県,687700,8189813,296905516 ← 全県同じ値
福井県,436100,8189813,296905516 ← 全県同じ値
地域比較分析が意味をなさない状態でした。
原因の特定
AIと一緒に調査した結果、2つの問題を発見:
-
統計データIDの選定ミス
- 使用していた統計データIDでは、都道府県別データが取得できない構造だった
-
APIパラメータ名の誤り
# ❌ 誤り params["area"] = "16000" # ✅ 正解 params["cdArea"] = "16000"
AIを活用した解決
ここからがAI駆動開発の本領発揮です。
1. データパイプラインの自動構築
AIと協働して、以下のパイプラインを構築:
# 1. e-stat APIからデータを取得
# 2. JSONレスポンスをDataFrameに変換
# 3. area列から都道府県コードを抽出
# 4. 都道府県ごとに集約
# 5. 統合データを作成
def extract_pref_code(area_code):
"""areaコードから都道府県コード(1-47)を抽出"""
code_str = str(area_code).strip()
# 5桁コードの場合(例: 16000 → 16)
if len(code_str) == 5:
pref_code = int(code_str[:2])
# 4桁コードの場合(例: 1000 → 1)
elif len(code_str) == 4:
pref_code = int(code_str[0])
else:
pref_code = int(code_str[:2])
if 1 <= pref_code <= 47:
return pref_code
return None
2. 並列処理による高速化
47都道府県のデータ取得を並列化:
from concurrent.futures import ThreadPoolExecutor
def fetch_all_prefectures():
with ThreadPoolExecutor(max_workers=10) as executor:
results = list(executor.map(fetch_prefecture_data, range(1, 48)))
return results
3. 自動検証の仕組み
データ取得後の検証も自動化:
def validate_data(df):
"""データの妥当性を検証"""
# 都道府県ごとに異なる値があるか
unique_values = df.groupby('都道府県').nunique()
# 値の範囲が妥当か
assert df['$_事業所'].min() > 0
assert df['$_事業所'].max() < 1e10
# 欠損値チェック
assert df.isnull().sum().sum() == 0
return True
改善効果
Before
都道府県,$_空き家,$_事業所,$_観光
富山県,495200,8189813,296905516 ← 全県同じ値
石川県,687700,8189813,296905516 ← 全県同じ値
After
都道府県,$_空き家,$_事業所,$_観光
富山県,495200.0,6950508,53770.0 ← 県ごとに異なる!
石川県,687700.0,7274957,77207.0 ← 県ごとに異なる!
福井県,436100.0,5081070,110056.0 ← 県ごとに異なる!
クラスタリング分析が可能に
改善後のデータでK-meansクラスタリングを実行:
| クラスタ | 含まれる都道府県 | 特徴 |
|---|---|---|
| 0 | 三重, 京都, 山梨, 新潟, 栃木, 沖縄... | 中規模県 |
| 1 | 東京都のみ | 突出した規模 |
| 2 | 北海道, 長野, 静岡 | 観光大県 |
| 3 | 兵庫, 千葉, 埼玉, 大阪, 愛知, 神奈川, 福岡 | 大都市圏 |
| 4 | 富山, 石川, 福井, 広島, 岡山, 宮城... | 中小規模県 |
東京が単独クラスタ、大都市圏がまとまっている → 妥当な結果!
具体的な分析例:富山県
| 指標 | 富山県 | 類似地域平均 | 差異 |
|---|---|---|---|
| 空き家 | 495,200 | 869,212 | -43.0% |
| 事業所 | 6,950,508 | 7,510,879 | -7.5% |
| 観光 | 53,770 | 81,074 | -33.7% |
※空き家(生活基盤)、事業所(経済活動)、観光(流動人口)という地域の“呼吸”を表す3指標を使って比較
富山県の具体的な改善ポイントが明確に:
- 空き家が少ない → 成功事例として他地域に展開可能
- 観光が低い → 類似地域(石川県など)の成功事例を参考に施策立案
※「お隣の石川県と比べて、うちはここが弱い」と数字で突きつけられると、自治体の首長が動いたりも?
この 「比較可能な状態にする」 ことが、広域連携ビジネスの第一歩なのかも?!
F1ドライバー兼メカニックとしての感想
今回の経験は、まさにAIという超高性能なエンジンを操る、F1のドライバー兼メカニックのような体験でした。
ドライバーとして
- 方向性を決める: どのデータを分析するか、どんな仮説を立てるか
- 判断を下す: AIの提案を採用するか、別のアプローチを取るか
- ゴールを目指す: ビジネス価値のある分析結果を出す
メカニックとして
- AIを調整する: プロンプトを調整してより良い出力を得る
- トラブルシューティング: AIの出力がおかしい時に原因を特定
- パフォーマンスチューニング: パイプラインの最適化
「準備が8割」をねじ伏せた方法
| 従来のアプローチ | AI駆動アプローチ |
|---|---|
| 手動でデータ構造を調査 | AIがデータ構造を自動解析 |
| 試行錯誤でパラメータ調整 | AIが正しいパラメータを提案 |
| 1つずつデータ取得 | 並列処理で高速化 |
| 目視でデータ検証 | 自動検証パイプライン |
「準備が8割」は変わらない。
でも、AIでその8割を圧倒的に効率化できる。
最終的な学び
失敗から学んだこと
- データ構造の理解は必須: メタデータと実データを区別する
- ランダム探索には限界がある: 仮説に基づいた分析が必要
AIを活用して成功したこと
- データパイプラインの自動構築: 複雑な処理を効率化
- 並列処理による高速化: 47都道府県のデータを一気に取得
- 自動検証の仕組み: データ品質を担保
- 問題の迅速な特定と解決: APIパラメータの誤りを素早く発見
今後の方向性
- 仮説に基づいた分析: ドメイン知識 × AIの組み合わせ
- 段階的な分析アプローチ: 単一データ内 → 関連データ間 → 異なるデータ間
- 継続的な改善: パイプラインの拡張と最適化
まとめ
「データ分析は準備が8割」という言葉は、今でも真実です。
また、AIは万能ではありません。
ドライバー(人間)が方向性を決め、メカニック(人間)が調整する必要があります。
でも、その組み合わせが上手くいくと、「だるっ...」と思っていた準備工程を楽しくねじ伏せることができます。
皆さんも、AIという超高性能エンジンを手懐けて、データ分析を楽しみましょう!
データ分析の本質は、技術ではなく“再現性のデザイン”にある!
次回
「雨、逃げ出した後」に…… まさかの急展開。
次回もサービス、サービス💕
次回:【e-Stat×AI】「同じ人口・同じ地域」で所得格差83倍。データが暴いた「過疎でも勝つ自治体」の勝ちパターン