STEP 25:地図データの可視化(Folium連携)

🗺️ STEP 25: 地図データの可視化(Folium連携)

地理的なデータを地図上に美しく表示しよう!

📋 このステップで学ぶこと

  • 地図データ可視化の重要性と活用シーン
  • Foliumライブラリの基本操作
  • マーカー、ポップアップ、アイコンの追加
  • ヒートマップによる密度可視化
  • Plotlyでのコロプレス図(地域塗り分け図)
  • 実務での活用例(店舗分析、顧客分布、災害マップ)

🌍 1. 地図データ可視化とは

なぜ地図で可視化するのか

地図データ可視化とは、位置情報(緯度・経度)を持つデータを地図上に表現する手法です。人間は生まれたときから地図を見慣れているため、地理的なデータは地図で表現するのが最も直感的です。

例えば、「東京・大阪・名古屋の売上を比較する」場合、表やグラフで見るよりも、日本地図上に表示した方が、地理的な関係性(距離感、エリアのまとまり)がすぐに理解できます。

💡 身近な例で考えてみよう

地図可視化は、私たちの日常でも多く使われています:

Google Maps:レストランの位置、評価、混雑状況を地図上に表示
天気予報:気温や降水量を地図上の色で表現
不動産サイト:物件の位置と価格を地図上にマーカー表示
選挙速報:各地域の当選者を色分けして表示

地図で表現できるデータの種類

地図で表現できるデータには、主に3つの種類があります。それぞれに適した可視化手法があります。

📊 地図データの3つの種類
データの種類 具体例 適した可視化手法
📍 ポイントデータ 店舗の場所、事故発生地点、観光スポット マーカーマップ、バブルマップ
🔥 密度データ 人口密度、犯罪発生率、気温分布 ヒートマップ
🗾 地域データ 都道府県別売上、国別GDP、選挙得票率 コロプレス図(塗り分け地図)

地図可視化の主な手法

【地図可視化の4つの手法】 ■ マーカーマップ ・特定の地点にピン(マーカー)を立てる ・店舗の場所、イベント会場など「点」のデータに最適 ・例: 「全国のカフェ店舗の位置」 ■ ヒートマップ ・密度や強度を色の濃淡で表現 ・データが密集している場所が赤く、少ない場所が青く表示 ・例: 「交通事故の多発地点」「人口密度」 ■ コロプレス図(塗り分け地図) ・地域ごとに色を塗り分ける ・都道府県、国など「面」のデータに最適 ・例: 「都道府県別の平均年収」 ■ バブルマップ ・地点ごとに円の大きさで量を表現 ・マーカーとヒートマップの中間的な手法 ・例: 「各都市の人口を円の大きさで表示」
💡 Folium vs Plotly:どちらを使うべき?
ライブラリ 得意なこと おすすめ用途
Folium 詳細な地図操作、マーカー、ヒートマップ 店舗マップ、イベント地図、ポイントデータ全般
Plotly コロプレス図、アニメーション、ダッシュボード統合 地域別データ、時系列変化、他のグラフとの組み合わせ

結論:両方を組み合わせて使うのがベスト!目的に応じて使い分けましょう。

🗺️ 2. Foliumの基本

Foliumとは

Folium(フォリウム)は、Pythonでインタラクティブな地図を作成するためのライブラリです。内部ではJavaScriptの地図ライブラリ「Leaflet」を使用しており、ズーム、パン、クリックなどの操作ができる地図を簡単に作れます。

作成した地図はHTMLファイルとして保存でき、ブラウザで開くだけで誰でも操作できます。Pythonがインストールされていない相手にも共有できるのが大きなメリットです。

インストールと基本的な地図表示

まず、Foliumをインストールして基本的な地図を表示してみましょう。

# Google Colabでのインストール(最初に1回実行) !pip install folium import folium # 基本的な地図を作成(東京駅を中心に) m = folium.Map( location=[35.681236, 139.767125], # 中心座標 [緯度, 経度] zoom_start=13, # ズームレベル tiles=’OpenStreetMap’ # 地図のスタイル ) # 地図を表示(Google Colabでは変数名だけでOK) m

コードの解説

📝 folium.Map() の主要パラメータ
パラメータ 説明 値の例
location 地図の中心座標 [緯度, 経度] [35.681236, 139.767125](東京駅)
zoom_start 初期ズームレベル(1〜18) 1=世界全体、13=市街地、18=建物レベル
tiles 地図のスタイル(デザイン) 'OpenStreetMap''CartoDB positron'
⚠️ 緯度・経度の順番に注意!

Foliumでは[緯度, 経度]の順番で指定します(緯度が先)。

Google Mapsなどでは「経度, 緯度」の順で表示されることもあるので、コピーする際は順番を確認してください。

東京駅:[35.681236, 139.767125](緯度35度、経度139度)

地図をHTMLファイルとして保存する

作成した地図はHTMLファイルとして保存できます。ブラウザで開くだけで操作できるため、共有に便利です。

# 地図をHTMLファイルとして保存 m.save(‘tokyo_map.html’) print(“✅ tokyo_map.html として保存されました!”)

主要都市の座標一覧

よく使う座標を参考として載せておきます。Google Mapsで場所を右クリックすると、座標をコピーできます。

【主要都市の座標一覧】 東京駅: [35.681236, 139.767125] 大阪駅: [34.702485, 135.495951] 名古屋駅: [35.170915, 136.881537] 福岡駅: [33.590355, 130.401716] 札幌駅: [43.068625, 141.350801] 仙台駅: [38.260115, 140.882302] 広島駅: [34.397629, 132.475280] 京都駅: [34.985849, 135.758767] 【座標の確認方法】 1. Google Mapsで場所を検索 2. 地図上で右クリック 3. 表示された座標をクリックしてコピー

地図のスタイル変更

Foliumには複数の地図スタイルが用意されています。用途に応じて使い分けましょう。

# 様々な地図スタイルを試す import folium # 1. OpenStreetMap(標準、詳細な情報あり) m1 = folium.Map( location=[35.681236, 139.767125], zoom_start=12, tiles=’OpenStreetMap’ ) # 2. CartoDB positron(明るいシンプルな地図、おすすめ!) m2 = folium.Map( location=[35.681236, 139.767125], zoom_start=12, tiles=’CartoDB positron’ ) # 3. CartoDB dark_matter(暗いテーマ、ダークモード向け) m3 = folium.Map( location=[35.681236, 139.767125], zoom_start=12, tiles=’CartoDB dark_matter’ ) # 表示(好きなスタイルを選んで表示) m2 # CartoDB positronを表示
🎨 地図スタイルの使い分け
スタイル 特徴 おすすめ用途
OpenStreetMap 詳細な道路・建物情報あり ナビゲーション、詳細な場所確認
CartoDB positron 明るくシンプル(推奨) プレゼン、レポート、マーカーを目立たせたい
CartoDB dark_matter 暗いテーマ ヒートマップ、夜間イメージ
Stamen Terrain 地形が強調される 山岳地域、地形分析

📍 3. マーカーの追加

マーカーとは

マーカーは、地図上の特定の地点を示すピン(アイコン)です。店舗の場所、イベント会場、事故発生地点など、「点」のデータを表示するのに使います。

Foliumのマーカーは、クリックするとポップアップ(詳細情報)が表示され、マウスを乗せるとツールチップ(簡易情報)が表示されます。

基本的なマーカーの追加

# 東京の主要駅にマーカーを追加 import folium # 地図を作成 m = folium.Map( location=[35.681236, 139.767125], zoom_start=12, tiles=’CartoDB positron’ ) # 東京駅にマーカーを追加 folium.Marker( location=[35.681236, 139.767125], # マーカーの位置 popup=’東京駅’, # クリック時に表示 tooltip=’Tokyo Station’, # マウスオーバー時に表示 icon=folium.Icon(color=’red’, icon=’info-sign’) ).add_to(m) # 新宿駅にマーカーを追加 folium.Marker( location=[35.689487, 139.700586], popup=’新宿駅’, tooltip=’Shinjuku Station’, icon=folium.Icon(color=’blue’, icon=’info-sign’) ).add_to(m) # 渋谷駅にマーカーを追加 folium.Marker( location=[35.658034, 139.701636], popup=’渋谷駅’, tooltip=’Shibuya Station’, icon=folium.Icon(color=’green’, icon=’info-sign’) ).add_to(m) m

コードの解説

📝 folium.Marker() の主要パラメータ
パラメータ 説明 なぜ使うのか
location マーカーの位置 [緯度, 経度] どこにピンを立てるか指定するため
popup クリック時に表示するテキスト 詳細情報を表示するため
tooltip マウスオーバー時に表示するテキスト クリック前に概要を見せるため
icon マーカーのアイコン設定 色やアイコンをカスタマイズするため
.add_to(m) 地図にマーカーを追加 作成したマーカーを地図に表示するため

HTMLを使った詳細なポップアップ

ポップアップにはHTMLを使って、画像やリンク、表などを含めることができます。

# HTMLを使った詳細なポップアップ import folium m = folium.Map( location=[35.681236, 139.767125], zoom_start=13, tiles=’CartoDB positron’ ) # HTMLでポップアップの内容を作成 popup_html = “””

🚉 東京駅

住所: 東京都千代田区丸の内1丁目

乗降客数: 約46万人/日

開業: 1914年

路線数: 12路線

“”” # ポップアップを作成 popup = folium.Popup(popup_html, max_width=250) # マーカーを追加 folium.Marker( location=[35.681236, 139.767125], popup=popup, tooltip=’クリックで詳細を表示’, icon=folium.Icon( color=’red’, icon=’train’, prefix=’fa’ # Font Awesomeアイコンを使用 ) ).add_to(m) m

実務例:店舗の場所を表示

実際のビジネスでは、DataFrameからデータを読み込んで、ループで複数のマーカーを追加することが多いです。

※ 横長のコードはスマートフォンでは横スクロールできます。

# 店舗データをDataFrameで管理し、地図に表示 import folium import pandas as pd # 店舗データ(架空のカフェチェーン) stores = pd.DataFrame({ ‘店舗名’: [‘銀座店’, ‘新宿店’, ‘渋谷店’, ‘池袋店’, ‘品川店’], ‘緯度’: [35.671236, 35.689487, 35.658034, 35.728926, 35.628391], ‘経度’: [139.767125, 139.700586, 139.701636, 139.715065, 139.738575], ‘売上’: [850, 1200, 980, 750, 650], # 万円/日 ‘客数’: [320, 450, 380, 280, 240] # 人/日 }) # 地図作成 m = folium.Map( location=[35.681236, 139.767125], zoom_start=11, tiles=’CartoDB positron’ ) # 各店舗にマーカーを追加 for idx, row in stores.iterrows(): # 売上に応じて色を変える if row[‘売上’] >= 1000: color = ‘red’ # 高売上(1000万円以上) elif row[‘売上’] >= 800: color = ‘orange’ # 中売上(800万円以上) else: color = ‘blue’ # 低売上(800万円未満) # ポップアップのHTML popup_html = f”””

☕ {row[‘店舗名’]}

売上: {row[‘売上’]}万円/日

客数: {row[‘客数’]}人/日

客単価: {row[‘売上’]*10000/row[‘客数’]:.0f}円

“”” # マーカーを追加 folium.Marker( location=[row[‘緯度’], row[‘経度’]], popup=folium.Popup(popup_html, max_width=200), tooltip=row[‘店舗名’], icon=folium.Icon( color=color, icon=’coffee’, prefix=’fa’ ) ).add_to(m) m
【実行結果】 地図上に5つの店舗マーカーが表示されます。 ・赤色: 新宿店(高売上) ・オレンジ: 銀座店、渋谷店(中売上) ・青色: 池袋店、品川店(低売上)

コードの解説

📝 ポイントの解説
コード 何をしているか なぜ必要か
for idx, row in stores.iterrows(): DataFrameの各行をループ すべての店舗にマーカーを追加するため
if row['売上'] >= 1000: 売上に応じて条件分岐 売上の高低を色で表現するため
f"""...""" f文字列でHTMLを作成 各店舗のデータをポップアップに埋め込むため
prefix='fa' Font Awesomeアイコンを使用 より多くのアイコンを使えるようにするため
【Font Awesome主要アイコン一覧】 ☕ coffee : カフェ 🍴 utensils : レストラン 🛏️ bed : ホテル 🛒 shopping-cart: ショップ 🏠 home : 家 🏢 building : ビル 🚉 train : 駅 ✈️ plane : 空港 🏥 hospital : 病院 🎓 graduation-cap: 学校 ※ prefix=’fa’ を指定して使用します ※ アイコン名は Font Awesome のサイトで検索できます

🔥 4. ヒートマップの作成

ヒートマップとは

ヒートマップは、データの密度や強度を色の濃淡で表現する手法です。データが密集している場所は赤く(熱い)、少ない場所は青く(冷たい)表示されます。

マーカーでは表現しきれない大量のデータ(数百〜数万件)を効果的に可視化できます。例えば、「どのエリアに顧客が集中しているか」「事故の多発地帯はどこか」などを直感的に把握できます。

基本的なヒートマップ

# ヒートマップの作成 import folium from folium.plugins import HeatMap import numpy as np # 乱数のシードを固定(再現性のため) np.random.seed(42) # 東京駅周辺にランダムなデータポイントを生成 n_points = 200 heat_data = [] for i in range(n_points): # 東京駅を中心に正規分布でばらつかせる lat = 35.681236 + np.random.randn() * 0.05 lon = 139.767125 + np.random.randn() * 0.05 heat_data.append([lat, lon]) # 地図作成 m = folium.Map( location=[35.681236, 139.767125], zoom_start=12, tiles=’CartoDB positron’ ) # ヒートマップレイヤーを追加 HeatMap( heat_data, radius=15, # 各点の影響範囲 blur=20, # ぼかし具合 max_zoom=13 # この倍率まで表示 ).add_to(m) m

コードの解説

📝 HeatMap() の主要パラメータ
パラメータ 説明 値の例
data [[緯度, 経度], …] のリスト ヒートマップの元データ
radius 各点の影響範囲(ピクセル) 10〜25(大きいほど広がる)
blur ぼかしの強さ 10〜30(大きいほどなめらか)
gradient 色のグラデーション設定 {0.0: ‘blue’, 0.5: ‘yellow’, 1.0: ‘red’}

ウェイト(重み)付きヒートマップ

各データポイントに重み(ウェイト)を付けることで、単なる密度だけでなく、「購入金額の多いエリア」「売上の大きい店舗」などを表現できます。

# ウェイト付きヒートマップ(顧客の購入金額を反映) import folium from folium.plugins import HeatMap import pandas as pd import numpy as np np.random.seed(42) # 顧客データ(購入金額付き) customers = pd.DataFrame({ ‘緯度’: 35.681236 + np.random.randn(500) * 0.08, ‘経度’: 139.767125 + np.random.randn(500) * 0.08, ‘購入金額’: np.random.randint(1000, 50000, 500) }) # ウェイト付きヒートマップデータを作成 # 形式: [[緯度, 経度, ウェイト], …] heat_data_weighted = [] for idx, row in customers.iterrows(): # 購入金額を0〜1に正規化してウェイトとする weight = row[‘購入金額’] / customers[‘購入金額’].max() heat_data_weighted.append([row[‘緯度’], row[‘経度’], weight]) # 地図作成 m = folium.Map( location=[35.681236, 139.767125], zoom_start=11, tiles=’CartoDB positron’ ) # カスタムグラデーションでヒートマップを追加 HeatMap( heat_data_weighted, radius=20, blur=25, max_zoom=13, gradient={ 0.0: ‘#0000FF’, # 青(低購入金額) 0.5: ‘#FFFF00’, # 黄(中程度) 1.0: ‘#FF0000’ # 赤(高購入金額) } ).add_to(m) m # 統計情報 print(“📊 顧客分析:”) print(f”総顧客数: {len(customers)}人”) print(f”平均購入金額: {customers[‘購入金額’].mean():.0f}円”) print(f”最高購入金額: {customers[‘購入金額’].max():,}円”)
【実行結果】 📊 顧客分析: 総顧客数: 500人 平均購入金額: 25430円 最高購入金額: 49,954円
🔥 ヒートマップの読み方と活用

色の意味:

赤色:密度が高い、または値が大きいエリア
黄色:中程度の密度・値
青色:密度が低い、または値が小さいエリア

活用例:出店候補地の選定(赤いエリア=顧客が多い)、マーケティング戦略の立案(広告配布エリアの決定)

🗾 5. Plotlyでのコロプレス図

コロプレス図とは

コロプレス図(Choropleth Map)は、地域ごとに色を塗り分けて、その地域のデータ値を表現する地図です。「都道府県別の人口」「国別のGDP」など、地域単位のデータを可視化するのに最適です。

Plotlyを使うと、インタラクティブなコロプレス図を簡単に作成できます。マウスオーバーでデータ値を確認したり、ズームしたりできます。

世界地図でのコロプレス図

# 世界各国のGDPをコロプレス図で表示 import plotly.express as px import pandas as pd # 主要国のGDPデータ gdp_data = pd.DataFrame({ ‘国コード’: [‘USA’, ‘CHN’, ‘JPN’, ‘DEU’, ‘GBR’, ‘IND’, ‘FRA’, ‘ITA’, ‘BRA’, ‘CAN’, ‘KOR’, ‘RUS’, ‘AUS’, ‘ESP’, ‘MEX’, ‘IDN’, ‘NLD’, ‘SAU’, ‘TUR’, ‘CHE’], ‘国名’: [‘アメリカ’, ‘中国’, ‘日本’, ‘ドイツ’, ‘イギリス’, ‘インド’, ‘フランス’, ‘イタリア’, ‘ブラジル’, ‘カナダ’, ‘韓国’, ‘ロシア’, ‘オーストラリア’, ‘スペイン’, ‘メキシコ’, ‘インドネシア’, ‘オランダ’, ‘サウジアラビア’, ‘トルコ’, ‘スイス’], ‘GDP’: [25462, 17963, 4231, 4073, 3071, 3386, 2783, 2010, 1920, 2139, 1673, 1778, 1675, 1393, 1414, 1319, 1013, 1108, 906, 818] # 10億ドル }) # コロプレス図を作成 fig = px.choropleth( gdp_data, locations=’国コード’, # ISO 3文字の国コード color=’GDP’, # 色分けに使う列 hover_name=’国名’, # ホバー時のタイトル hover_data={‘国コード’: False, ‘GDP’: ‘:,.0f’}, color_continuous_scale=’Viridis’, title=’🌍 世界各国のGDP(10億ドル)’ ) # レイアウト設定 fig.update_layout( height=600, font_size=12, geo=dict( showframe=False, showcoastlines=True, projection_type=’natural earth’ # 地図の投影法 ) ) fig.show() # 上位5カ国を表示 print(“📊 GDP上位5カ国:”) top5 = gdp_data.nlargest(5, ‘GDP’) for idx, row in top5.iterrows(): print(f” {row[‘国名’]}: ${row[‘GDP’]:,}B”)
【実行結果】 📊 GDP上位5カ国: アメリカ: $25,462B 中国: $17,963B 日本: $4,231B ドイツ: $4,073B インド: $3,386B

コードの解説

📝 px.choropleth() の主要パラメータ
パラメータ 説明 なぜ使うのか
locations 地域を識別するコード(ISO 3文字コード) どの地域を塗り分けるか指定するため
color 色分けに使う列 値の大小を色で表現するため
hover_name ホバー時のタイトル 国名を分かりやすく表示するため
color_continuous_scale 色のグラデーション 見やすい配色を適用するため
projection_type 地図の投影法 見やすい形で世界地図を表示するため
【ISO 3文字国コードの例】 日本: JPN アメリカ: USA 中国: CHN 韓国: KOR ドイツ: DEU フランス: FRA イギリス: GBR イタリア: ITA カナダ: CAN オーストラリア: AUS ブラジル: BRA インド: IND ※ 完全なリストは ISO 3166-1 alpha-3 で検索できます

🎯 6. 実務での活用例

例1:配送エリアの可視化

配送業務では、配送先の分布を地図で可視化することで、ルートの最適化やエリア担当者の割り当てに活用できます。

# 配送エリアの可視化(マーカークラスター使用) import folium from folium.plugins import MarkerCluster import pandas as pd import numpy as np np.random.seed(42) # 配送先データ(100件) deliveries = pd.DataFrame({ ‘緯度’: 35.681236 + np.random.randn(100) * 0.1, ‘経度’: 139.767125 + np.random.randn(100) * 0.1, ‘配送時間’: np.random.choice([‘午前’, ‘午後’, ‘夜間’], 100), ‘重量’: np.random.randint(1, 50, 100) # kg }) # 地図作成 m = folium.Map( location=[35.681236, 139.767125], zoom_start=11, tiles=’CartoDB positron’ ) # 配送時間帯ごとの色設定 color_map = {‘午前’: ‘blue’, ‘午後’: ‘orange’, ‘夜間’: ‘purple’} # マーカークラスター(ズームアウト時に自動で集約表示) marker_cluster = MarkerCluster().add_to(m) # 各配送先を追加 for idx, row in deliveries.iterrows(): # CircleMarker(円マーカー)を使用 folium.CircleMarker( location=[row[‘緯度’], row[‘経度’]], radius=row[‘重量’] / 5, # 重量に応じてサイズ変更 popup=f”配送時間: {row[‘配送時間’]}
重量: {row[‘重量’]}kg”, color=color_map[row[‘配送時間’]], fill=True, fillColor=color_map[row[‘配送時間’]], fillOpacity=0.6 ).add_to(marker_cluster) m # 配送分析 print(“📦 配送分析:”) for time in [‘午前’, ‘午後’, ‘夜間’]: count = len(deliveries[deliveries[‘配送時間’] == time]) avg_weight = deliveries[deliveries[‘配送時間’] == time][‘重量’].mean() print(f” {time}: {count}件(平均重量: {avg_weight:.1f}kg)”)
【実行結果】 📦 配送分析: 午前: 36件(平均重量: 25.6kg) 午後: 31件(平均重量: 24.2kg) 夜間: 33件(平均重量: 25.8kg)
💡 MarkerClusterのメリット

MarkerClusterを使うと、ズームアウトしたときに近くのマーカーが自動的に1つにまとまり、数字で件数が表示されます。

メリット:大量のマーカー(100件以上)があっても地図が見やすい、パフォーマンスが良い

例2:災害リスクマップ

防災計画では、危険エリアと避難所の位置を地図上に重ねて表示することで、避難経路の検討や避難所の配置計画に活用できます。

# 災害リスクマップ(ヒートマップ + マーカー) import folium from folium.plugins import HeatMap import pandas as pd import numpy as np np.random.seed(42) # 避難所データ shelters = pd.DataFrame({ ‘名称’: [‘中央小学校’, ‘市民体育館’, ‘文化センター’, ‘東部公園’, ‘西部コミュニティセンター’], ‘緯度’: [35.681, 35.685, 35.677, 35.690, 35.672], ‘経度’: [139.767, 139.770, 139.765, 139.773, 139.760], ‘収容人数’: [500, 1200, 800, 300, 600] }) # 危険地域データ(浸水想定区域など) risk_areas = [] for i in range(150): lat = 35.681 + np.random.randn() * 0.01 lon = 139.767 + np.random.randn() * 0.01 risk_level = np.random.uniform(0, 1) risk_areas.append([lat, lon, risk_level]) # 地図作成 m = folium.Map( location=[35.681, 139.767], zoom_start=14, tiles=’CartoDB positron’ ) # リスクエリアのヒートマップ HeatMap( risk_areas, radius=25, blur=30, gradient={ 0.0: ‘green’, # 低リスク 0.5: ‘yellow’, # 中リスク 1.0: ‘red’ # 高リスク }, min_opacity=0.3 ).add_to(m) # 避難所のマーカー for idx, row in shelters.iterrows(): # 収容人数に応じて色を変更 if row[‘収容人数’] >= 1000: icon_color = ‘green’ # 大規模 elif row[‘収容人数’] >= 500: icon_color = ‘blue’ # 中規模 else: icon_color = ‘gray’ # 小規模 folium.Marker( location=[row[‘緯度’], row[‘経度’]], popup=f”{row[‘名称’]}
収容人数: {row[‘収容人数’]}人”, tooltip=row[‘名称’], icon=folium.Icon( color=icon_color, icon=’home’, prefix=’fa’ ) ).add_to(m) m # 避難所の収容能力 print(“🏠 避難所情報:”) print(f” 総収容人数: {shelters[‘収容人数’].sum():,}人”) print(f” 最大収容避難所: {shelters.loc[shelters[‘収容人数’].idxmax(), ‘名称’]} ” f”({shelters[‘収容人数’].max()}人)”)
【実行結果】 🏠 避難所情報: 総収容人数: 3,400人 最大収容避難所: 市民体育館 (1200人)

🎨 7. 高度なカスタマイズ

複数レイヤーの切り替え

1つの地図に複数のレイヤーを追加し、右上のコントロールで表示/非表示を切り替えられるようにできます。異なる視点からデータを分析するのに便利です。

# 複数レイヤーの切り替え機能 import folium from folium.plugins import HeatMap import numpy as np np.random.seed(42) # データ準備 crime_data = [[35.681 + np.random.randn() * 0.05, 139.767 + np.random.randn() * 0.05] for _ in range(100)] traffic_data = [[35.681 + np.random.randn() * 0.05, 139.767 + np.random.randn() * 0.05] for _ in range(150)] # 地図作成 m = folium.Map( location=[35.681, 139.767], zoom_start=12, tiles=’CartoDB positron’ ) # レイヤー1: 犯罪発生地点 crime_layer = folium.FeatureGroup(name=’🚨 犯罪発生地点’) HeatMap( crime_data, radius=15, blur=20, gradient={0.0: ‘blue’, 0.5: ‘yellow’, 1.0: ‘red’} ).add_to(crime_layer) crime_layer.add_to(m) # レイヤー2: 交通事故多発地点 traffic_layer = folium.FeatureGroup(name=’🚗 交通事故多発地点’) HeatMap( traffic_data, radius=15, blur=20, gradient={0.0: ‘green’, 0.5: ‘orange’, 1.0: ‘darkred’} ).add_to(traffic_layer) traffic_layer.add_to(m) # レイヤーコントロールを追加(右上に表示されるチェックボックス) folium.LayerControl().add_to(m) m
💡 レイヤー切り替えの活用

folium.FeatureGroup(name='レイヤー名')でレイヤーを作成し、folium.LayerControl()で切り替え機能を追加します。

活用例:犯罪・事故・人口密度など複数の視点での分析、時間帯別データの比較、カテゴリ別の表示切替

📝 STEP 25 のまとめ

✅ このステップで学んだこと
トピック 重要ポイント
地図データ可視化 ポイント、密度、地域データの3種類を理解
Foliumの基本 folium.Map()で地図作成、location=[緯度, 経度]
マーカー folium.Marker()でピンを追加、popup/tooltipで情報表示
ヒートマップ HeatMap()で密度を可視化、ウェイト付きも可能
コロプレス図 px.choropleth()で地域別データを塗り分け
レイヤー切り替え FeatureGroup + LayerControlで複数レイヤーを管理
💡 最重要ポイント

地図データ可視化は、位置情報を持つデータを最も直感的に理解できる手法です。

Foliumは詳細な地図操作とマーカー表示に優れ、Plotlyはコロプレス図とダッシュボード統合に最適です。

実務では店舗分析、配送最適化、災害対策など幅広く活用されています。まずはマーカーの追加から始めて、徐々にヒートマップやレイヤー機能に挑戦してみましょう!

📝 実践演習

演習 1 基礎

自分の住んでいる地域を中心に地図を表示し、近所の主要な場所(駅、学校、公園など)に3つ以上のマーカーを追加してください。

【解答コード】
import folium # 東京駅周辺の例 m = folium.Map( location=[35.681236, 139.767125], zoom_start=14, tiles=’CartoDB positron’ ) # マーカー追加 locations = [ {‘pos’: [35.681236, 139.767125], ‘name’: ‘東京駅’, ‘icon’: ‘train’, ‘color’: ‘red’}, {‘pos’: [35.676674, 139.763775], ‘name’: ‘皇居’, ‘icon’: ‘tree’, ‘color’: ‘green’}, {‘pos’: [35.679554, 139.770446], ‘name’: ‘丸の内オフィス’, ‘icon’: ‘building’, ‘color’: ‘blue’}, ] for loc in locations: folium.Marker( location=loc[‘pos’], popup=loc[‘name’], icon=folium.Icon(color=loc[‘color’], icon=loc[‘icon’], prefix=’fa’) ).add_to(m) m

解説:自分の地域の座標はGoogle Mapsで右クリック→座標をコピーして取得できます。

演習 2 応用

架空のデータで、店舗の売上をヒートマップで表現してください(最低50件のデータ)。

【解答コード】
import folium from folium.plugins import HeatMap import numpy as np np.random.seed(42) # 売上データ(ウェイト付き) sales_data = [] for i in range(50): lat = 35.681 + np.random.randn() * 0.05 lon = 139.767 + np.random.randn() * 0.05 sales = np.random.uniform(0.3, 1.0) # 売上の重み sales_data.append([lat, lon, sales]) m = folium.Map( location=[35.681, 139.767], zoom_start=12, tiles=’CartoDB positron’ ) HeatMap( sales_data, radius=20, blur=25, gradient={0.0: ‘blue’, 0.5: ‘yellow’, 1.0: ‘red’} ).add_to(m) m

解説:3番目の値(weight)を0〜1の範囲で設定することで、売上の大きさを色の濃さで表現できます。

演習 3 発展

複数のレイヤー(マーカーとヒートマップ)を持つ地図を作成し、レイヤーコントロールで切り替えできるようにしてください。

【解答コード】
import folium from folium.plugins import HeatMap import numpy as np np.random.seed(42) m = folium.Map( location=[35.681, 139.767], zoom_start=12, tiles=’CartoDB positron’ ) # レイヤー1: 店舗マーカー store_layer = folium.FeatureGroup(name=’🏪 店舗位置’) stores = [ [35.681, 139.767, ‘本店’], [35.685, 139.770, ‘支店A’], [35.677, 139.765, ‘支店B’] ] for store in stores: folium.Marker( location=[store[0], store[1]], popup=store[2], icon=folium.Icon(color=’red’, icon=’shopping-cart’, prefix=’fa’) ).add_to(store_layer) store_layer.add_to(m) # レイヤー2: 顧客分布ヒートマップ customer_layer = folium.FeatureGroup(name=’👥 顧客分布’) customer_data = [[35.681 + np.random.randn() * 0.05, 139.767 + np.random.randn() * 0.05] for _ in range(100)] HeatMap(customer_data, radius=15, blur=20).add_to(customer_layer) customer_layer.add_to(m) # レイヤーコントロール folium.LayerControl().add_to(m) m

解説:FeatureGroupでレイヤーを作成し、LayerControlで切り替え機能を追加します。右上のチェックボックスで各レイヤーの表示/非表示を切り替えられます。

❓ よくある質問

Q1: 緯度・経度がわからない場合、どうすればいいですか?
以下の方法で取得できます:

1. Google Mapsで確認:場所を右クリック → 表示された座標をクリックしてコピー

2. 住所から変換(Geocoding):Pythonのgeopyライブラリを使用
from geopy.geocoders import Nominatim
geocoder = Nominatim(user_agent="my_app")
location = geocoder.geocode("東京駅")
print(location.latitude, location.longitude)
Q2: Foliumの地図がJupyter Notebookで表示されません
以下を確認してください:

1. Google Colab:そのまま実行すれば表示されます(最後の行でmを実行)

2. Jupyter Notebook:最新版にアップデートしてください

3. HTMLファイルとして保存:m.save('map.html')で保存し、ブラウザで開く

4. IFrameで表示:
from IPython.display import IFrame
m.save('map.html')
IFrame('map.html', width=700, height=500)
Q3: 大量のマーカー(1000件以上)を表示すると重くなります
以下の最適化手法を使ってください:

1. MarkerCluster使用:ズームアウト時に自動で集約
from folium.plugins import MarkerCluster
marker_cluster = MarkerCluster().add_to(m)
# マーカーをクラスターに追加

2. ヒートマップに変更:個別マーカーより軽量

3. CircleMarkerを使用:通常のMarkerより軽量

4. データをフィルタリング:重要度の高いものだけ表示
Q4: 作成した地図を他の人と共有するにはどうすればいいですか?
m.save('filename.html')でHTMLファイルとして保存しましょう。

このHTMLファイルはブラウザで開くだけでインタラクティブに操作できます。Pythonがインストールされていない相手にも共有できるのが大きなメリットです。メールに添付したり、Webサーバーにアップロードしたりして共有できます。
📝

学習メモ

データ可視化マスター - Step 25

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE