ふくふくHukuhuku Inc.
EP.25Data Fetch 9分公開: 2026-09-02

土地の価格データを取る ── 公示地価と取引価格は別物

地価公示は取引が無い場所にも値が付き、取引価格情報は個人が特定されないよう丸められています。どちらを使うかで、出せる結論が変わります。

#不動産#オープンデータ#Python
執筆 / 監修
松尾 亮合同会社ふくふく 代表社員

データ基盤・データパイプライン構築 / BI / 生成 AI 活用支援を専門とするエンジニア (28 年)。 本記事は AI 利用ポリシーに基づき、生成 AI の補助で執筆 → 人間が監修・編集して公開しています。

プロフィール詳細
シェア

土地の値段を扱いたいとき、公的に手に入るデータは大きく2種類あります。です。名前が似ているので混同されがちですが、性質がまったく違います。

前者は、国が選んだ地点について「この土地は1平方メートルあたりいくらが妥当か」を毎年評価したものです。実際に売買が行われていなくても値が付きます。地点は固定されているので、同じ場所の推移を長期で追えます。

後者は、実際に売買された取引の記録です。実勢を反映していますが、取引が無い場所には何もありません。さらに個人が特定されないよう、面積や価格が丸められています。この丸めが分析に効いてきます。

丸めが単価の計算を歪める

取引価格情報では、面積が「100平方メートル」のように区切りの良い値に丸められ、価格も同様に丸められています。ここから単価を出すと、丸めの誤差が割り算で拡大します

面積が小さいほど影響が大きくなります。実際の面積が55平方メートルなのに50と記録されていれば、単価は1割ほど高く出ます。小さい物件ばかりを集めて平均を取ると、系統的にずれた数字になります

2つのデータの違い
項目公示地価取引価格情報
値の性質評価額(理論値)実際の取引価格
取引が無い場所値が付く何も無い
地点の継続性同じ地点を毎年評価取引のあった場所だけ
精度丸められていない面積・価格とも丸め済み
更新の頻度年1回四半期ごと
2つを同じ列に混ぜない

「土地の価格」という同じ名前の列に両方を入れると、評価額と取引価格が混ざります。片方は理論値、片方は実績なので、平均を取っても意味のある数字になりません。出所を示す列を必ず持たせてください。

地点をどう突き合わせるか

どちらのデータも場所の情報を持っていますが、粒度が違います。公示地価は具体的な地点、取引価格情報は町名までといった粗さです。そのまま結合しようとしても鍵が合いません

共通の粒度に揃えるなら、が最も確実です。ただしこのコードは市町村合併で変わるので、古いデータを扱うときは時点を意識する必要があります。合併前のコードで集計した数字と、合併後の数字は直接比較できません。

自治体コードで揃えるとき、桁の落ちを防ぐ
Python
import pandas as pd

def normalize_muni_code(s: pd.Series) -> pd.Series:    """自治体コードは 5 桁(または 6 桁)の文字列。    数値として読むと先頭ゼロが落ち、北海道の 01xxx が 1xxx になる。"""    out = s.astype(str).str.strip()
    # すでに数値として読まれてしまっている場合を救う    out = out.where(out.str.len() >= 5, out.str.zfill(5))
    if not out.str.fullmatch(r"\d{5,6}").all():        bad = out[~out.str.fullmatch(r"\d{5,6}")].unique()[:5]        raise ValueError(f"自治体コードの形式が不正: {list(bad)}")    return out

配信の形と、取得の頻度

公示地価は年1回の公表なので、取得も年1回で足ります。取引価格情報は四半期ごとに更新されるので、こちらは定期的に取りに行くことになります。更新の頻度が違うものを同じ処理でまとめて取ろうとすると、無駄な取得が増えます

配信の形は のダウンロードとの両方があります。 があるなら条件で絞れるので、必要な地域だけを取れます。全件をダウンロードして手元で絞るより、相手の負荷も自分の待ち時間も小さくなります。

取得したものは、で読んだあと年ごとに分けて保存しておくと扱いやすくなります。年1回しか変わらないデータを毎回全期間読み直す必要はありません。

価格の列を数値に直す。単位と丸めの情報を落とさない
Python
import pandas as pd

def to_price(s: pd.Series, unit: str) -> pd.DataFrame:    """価格の列を数値にしつつ、単位を列として残す。    単位を列名に埋め込むだけだと、結合したときに失われる。"""    if unit not in ("yen", "10k_yen"):        raise ValueError("yen か 10k_yen を指定してください")
    v = (        s.astype(str)        .str.replace(",", "", regex=False)        .str.strip()        .replace({"": None, "-": None})    )    return pd.DataFrame({"price": pd.to_numeric(v, errors="coerce"), "price_unit": unit})

どちらを使うかは問いで決まる

「この地域の土地は値上がりしているか」を長期で見たいなら公示地価です。地点が固定されているので、同じ場所を比較できます。取引価格情報だと、年によって取引された場所が違うため、場所の違いが値動きに見えてしまいます

逆に「いま実際にいくらで売れているか」を知りたいなら取引価格情報です。評価額は実勢とずれることがあるので、取引の実態を見たい用途には向きません。問いを先に決めてから、データを選んでください

地理データ全般の扱いについては データの宝石箱 EP.20 で扱っています。次回は、時間の粒度が細かい公的データを見ます。

土地の価格は、地域差が非常に大きいデータです。全国平均を出しても、都心と地方のどちらの実態も表しません。集計の単位を先に決めてから取りにいくほうが、無駄な取得を避けられます。

なお、どちらのデータも土地に関するものです。建物を含む価格を見たい場合は、また別の情報が要ります。分析の対象が土地なのか建物込みなのかで、使うデータが変わります。

シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp