EP.35 で、地図データを取り出す方法を扱いました。この回は、その結果をどこまで信じてよいかを扱います。
結論から言うと、「データに無い=存在しない」ではありません。この誤解が、分析結果を大きく歪めます。
1. 何が起きるか
有志による地図データは、入力する人がいる地域ほど充実します。つまり、データの量が地域の実態を表しているとは限りません。
| やりたいこと | 起きうる誤り |
|---|---|
| 地域ごとの施設密度を比べる | 入力の充実度を比べている |
| 空白地帯を見つける | 入力されていないだけかもしれない |
| 時系列で増減を見る | 入力が進んだだけかもしれない |
| 特定の場所の位置を得る | 問題が起きにくい |
| 道路網の形を見る | 比較的問題が少ない |
1行目が最も危険です。「A市はB市より飲食店が多い」という結論が、実は「A市のほうが熱心に入力されている」だけかもしれません。
3行目も注意が必要です。去年より今年のほうがデータが多いのは、実際に増えたのか、入力が進んだのか。区別できません。有志による地図データは時間とともに充実していくため、何を測っても右肩上がりに見えるという性質があります。
「そこに何があるかを知りたい」という用途なら、網羅率の影響は小さい。EP.35 で扱った経路や位置の取得は、この使い方にあたります。問題になるのは、密度や件数を比べる用途です。
2. 網羅率を測る
対処の第一歩は、測ってみることです。感覚ではなく、数字で確認します。
方法は、正解が分かる別のデータと突き合わせること。公的な統計で施設数が分かるなら、その数と比較できます。
import pandas as pd
def coverage_by_area(osm_counts: dict, official_counts: dict) -> pd.DataFrame: """地域ごとの網羅率を出す。
osm_counts: 地図データから数えた件数 {"A市": 120, ...} official_counts: 公的統計での件数 {"A市": 200, ...} """ rows = [] for area in sorted(set(osm_counts) | set(official_counts)): osm = osm_counts.get(area, 0) official = official_counts.get(area, 0) rate = osm / official if official else float("nan") rows.append({"地域": area, "地図データ": osm, "公的統計": official, "網羅率": rate})
df = pd.DataFrame(rows).sort_values("網羅率") return df
# 例osm = {"A市": 480, "B市": 120, "C町": 15, "D村": 2}off = {"A市": 520, "B市": 310, "C町": 95, "D村": 40}
result = coverage_by_area(osm, off)for _, r in result.iterrows(): print(f" {r['地域']:6s} 地図 {r['地図データ']:4d} / 統計 {r['公的統計']:4d} " f"→ 網羅率 {r['網羅率']:6.1%}")
lo, hi = result['網羅率'].min(), result['網羅率'].max()print(f"\n 最低 {lo:.1%} / 最高 {hi:.1%}({hi / lo:.1f} 倍の開き)")実行すると、地域によって網羅率が大きく違うことが数字で見えます。この開きが大きいなら、そのまま密度を比べてはいけないと判断できます。
公的統計がない種類のものもあります。その場合、一部の地域だけ現地または他の情報で確認して、そこから推し量る方法があります。全域は無理でも、代表的な数地域で測れば傾向は掴めます。
3. 種類ごとに違う
地域差だけでなく、対象の種類による差もあります。同じ地域でも、種類によって充実度が違います。
| 対象 | 充実しやすさ | 理由 |
|---|---|---|
| 道路 | 高い | 地図の基礎として優先的に整備される |
| 鉄道・駅 | 高い | 数が限られ、変化も少ない |
| 公共施設 | 中〜高 | 情報が公開されている |
| 大きな店舗 | 中 | 目立つので入力されやすい |
| 小さな個人店 | 低い | 入れ替わりが速く、追いつかない |
| 属性の細かさ | まちまち | 営業時間などは特に欠けやすい |
5行目が実務で問題になります。個人経営の店舗は、開店・閉店の速度にデータが追いつきません。閉店した店が残り、新しい店が入っていない。時点のずれも含めて考える必要があります。
6行目も見落とされます。「その場所がある」ことは入力されていても、営業時間や電話番号は空ということが多い。EP.35 で扱ったタグの話ですが、タグが付いている割合も種類ごとに測る価値があります。 で他のデータと組み合わせる場合、結合の鍵になる属性が欠けていると、そもそも結合できません。
4. 網羅率が低くても使える用途
網羅率が低いからといって、使えないわけではありません。用途を選べば有用です。
| 用途 | 網羅率の影響 | 使えるか |
|---|---|---|
| 特定の場所の位置を得る | ほぼ無い | 使える |
| 経路を計算する | 道路網は充実 | 使える |
| 面や境界を得る | 小さい | 使える |
| 「ここにこれがある」を確認 | 小さい | 使える |
| 地域間で密度を比較 | 大きい | 使えない |
| 時系列で増減を見る | 大きい | 使えない |
| 空白地帯を見つける | 大きい | 使えない |
上4つは「あることが分かっている対象の情報を得る」用途です。網羅率が低くても、得られた情報自体は正しいので問題ありません。ただし「正しい」のは入力された時点でであって、古くなっている可能性は別の問題として残ります。
下3つは「無いこと」に意味を持たせる用途です。ここで網羅率が効いてきます。無いのは、実際に無いのか、入力されていないのかが区別できないためです。
5. 補う方法
密度の比較をどうしてもやりたい場合、補正するか、別のデータと組み合わせるという選択があります。
- 1網羅率で補正する — 測った網羅率で割り戻す。粗い推定になる
- 2公的統計を主にして、地図データは位置だけ使う — 最も確実
- 3網羅率の高い地域だけで比較する — 対象は狭まるが信頼できる
- 4種類を絞る — 道路や駅など、充実している対象に限定
- 5比較をやめる — 目的を見直す
2番目が最も確実です。件数は公的統計から、位置は地図データからという組み合わせなら、両方の長所を使えます。公的統計は網羅的ですが座標を持たないことが多く、地図データはその逆です。
1番目の補正は可能ですが、網羅率自体に誤差があるため、粗い推定になります。補正したことを明記して、精度を過大に見せないでください。
6. 使う前に必ずやること
この回の内容を、実務の手順としてまとめます。
- 1自分の対象範囲で網羅率を測る — 一般論ではなく、実データで
- 2種類ごとにも測る — 対象によって大きく違う
- 3用途が「無いこと」に依存しないか確認 — 依存するなら注意
- 4依存するなら、公的統計と組み合わせる — 件数は統計から
- 5測った網羅率を記録に残す — 後から解釈するときに要る
5番目が実務で効きます。分析結果だけが残って、前提が失われるというのはよくあります。「この分析は網羅率◯%のデータに基づく」と書いておけば、後から読む人が信頼度を判断できます。
そして最も重要なのは、 を確認せずに「無い=存在しない」と解釈しないことです。これは地図データに限らず、あらゆるデータに共通する注意でもあります。
「データに無い」は「存在しない」ではない。有志のデータは入力する人がいる地域ほど充実するため、密度の比較は入力の充実度の比較になりかねない。公的統計と突き合わせて網羅率を測る。種類によっても大きく違う(個人店は追いつかない)。「あることが分かっている対象の位置を得る」用途なら網羅率が低くても使える。密度を比べたいなら、件数は統計から、位置は地図からが確実です。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。