3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

e-statの魔境にAIと挑んだら、データ準備の『だるさ』をpipeline・並列処理でねじ伏せられた話

Last updated at Posted at 2026-01-24

はじめに

「データ分析は準備が8割」

何かしらで一度は聞いたことがあるこの言葉。
正直、最初は「だるっ...」と思いました。

でも今回、AIを活用したエンジニアリング(pipeline・並列処理など)でこの「準備」をねじ伏せることができたので、その過程で得た失敗と成功の両方を共有します。

AIという超高性能なエンジンを操る、F1のドライバー兼メカニックのような体験でした。


Part 0: そもそもデータ分析って商売になるの?

技術の話に入る前に、ずっと引っかかっていた疑問があります。

現場の肌感覚 vs データ分析

「売上が倍も違う、半分も違う」みたいなことは、現場の人が肌感覚でわかるはず。
わざわざデータ分析する必要ある?

これ、正直な疑問でした。

データ分析すれば何かしらの気づきはあるだろうけど、それを改善したところで数%程度の効果しかないのでは?と。

「規模のチカラ」という答え

でも、AIに聞いてみると...

  • 100店舗あるチェーン店の店長が、みんなカンが鋭いわけがない
  • 属人的なスキルは、その人がいなくなったらなくなる
  • わずか数%でも、100店舗、1,000店舗となると効果は絶大

つまり、データ分析の価値は:

視点 属人的スキル データ分析
再現性 その人限り 誰でも実行可能
スケール 1店舗 100店舗、1,000店舗
継続性 退職したら終わり 仕組みとして残る
改善効果 大きい(でも1箇所) 小さい(でも全体に波及)

「カリスマ店長の勘」を否定するのではなく、「カリスマ店長の頭の中を、普通の店長でも使える武器に変換する」。
これが組織としてのデータ分析の正体です。

1店舗で10%改善するより、100店舗で1%改善する方がインパクトがある場合もある。

「ベテラン社員の勘」を否定するのではなく、「ベテラン社員の勘」を再現可能な形で残す。
これがデータ分析の本当の価値なんだと気づきました:sweat_smile:

また、「点」でなく「線」で考える。

観光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つの問題を発見:

  1. 統計データIDの選定ミス

    • 使用していた統計データIDでは、都道府県別データが取得できない構造だった
  2. 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割を圧倒的に効率化できる。


最終的な学び

失敗から学んだこと

  1. データ構造の理解は必須: メタデータと実データを区別する
  2. ランダム探索には限界がある: 仮説に基づいた分析が必要

AIを活用して成功したこと

  1. データパイプラインの自動構築: 複雑な処理を効率化
  2. 並列処理による高速化: 47都道府県のデータを一気に取得
  3. 自動検証の仕組み: データ品質を担保
  4. 問題の迅速な特定と解決: APIパラメータの誤りを素早く発見

今後の方向性

  • 仮説に基づいた分析: ドメイン知識 × AIの組み合わせ
  • 段階的な分析アプローチ: 単一データ内 → 関連データ間 → 異なるデータ間
  • 継続的な改善: パイプラインの拡張と最適化

まとめ

「データ分析は準備が8割」という言葉は、今でも真実です。
また、AIは万能ではありません。

ドライバー(人間)が方向性を決め、メカニック(人間)が調整する必要があります。

でも、その組み合わせが上手くいくと、「だるっ...」と思っていた準備工程を楽しくねじ伏せることができます。

皆さんも、AIという超高性能エンジンを手懐けて、データ分析を楽しみましょう!

データ分析の本質は、技術ではなく“再現性のデザイン”にある!

次回

「雨、逃げ出した後」に…… まさかの急展開。
次回もサービス、サービス💕
次回:【e-Stat×AI】「同じ人口・同じ地域」で所得格差83倍。データが暴いた「過疎でも勝つ自治体」の勝ちパターン


参考資料

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?