国土交通省 地理空間情報データチャレンジ 12位解法

こんにちは! 地方国立大学の学部３年生のfumito203です．SIGNATEで開催された国土交通省 地理空間情報データチャレンジで12位となったので解法をアウトプットしたいと思います．今回初投稿ということで拙い文章ですが見てもらえたら嬉しいです．
![スクリーンショット 2024-12-20 043246.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960974/e37ffd92-1101-4518-d512-97766847416c.png)
# 国土交通省 地理空間情報データチャレンジ とは
国土交通省が主催として開催されたデータコンペです．国土交通省が整備する「国土数値情報」の利用を広めるために開催されました．コンペでは，株式会社LIFULLより提供された不動産データを元に，賃料・賃貸価格の予測モデルを構築します．

上記のデータ以外に，国土数値情報やZENRIN MAP API，Snowflake等の利用を行うことができます．

# 解法の概要
株式会社LIFULLの提供データ，ZENRIN MAP APIと国土数値情報からモデルへの入力データを作成しました．特に，国土数値情報のデータを最大限利用して，特徴量を可能な限り追加しました．モデルでは，目的変数を専有面積あたりの賃料として予測を行います．最終的な結果は，LightGBM，XGBoostとCatBoostのアンサンブルを予測値とします．

![可視化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960974/d8d72735-0ef9-b9e0-b2ad-157cc10e45b6.png)



## 株式会社LIFULL提供データ

今回提供されたデータは外れ値と欠損値の処理のみを行い以下の方法でモデルに入力しました．
- 数値データ　そのまま入力
- 文字列データ　賃料のtarget-encoding
    - 路線名1（rosen_name1）
    - 駅名1（eki_name1）
    - バス停名1（bus_stop1）
    - 路線名2（rosen_name2）
    - 駅名2（eki_name2）
    - バス停名2（bus_stop2）
- /区切りの文字列データ　one-hot-encoding
- 日時を表すデータ　年・月・日に分解

#### 専有面積（unit_area）
今回の解法では，目的変数を賃料（money_room）/専有面積（unit_area）にするため以下の手順でunit_areaを補完しました．
- 専有面積（unit_area）の欠損値を専有面積の代表値（house_area）で補完
- 0 - 200の範囲でクリッピング
- hhouse_areaを大きく超えるunit_areaについては、house_areaで補完

unit_areaの処理はもう少し丁寧な処理した方がよかったかもしれません．

#### 特徴量の作成
- **その他の費用の合算**:
    その他の費用を表すsonota1，sonota2，sonota3を合算し，新たな特徴量としてモデルに入力しました

- **私道負担割合の計算**:
    私道負担割合の分母（land_shidou_a）と分子（land_shidou_b）を除算し、割合として特徴量化しました

- **土地持分の計算**:
    土地持分の分母（a）と私道負担割合の分子（land_mochibun_b）を除算し、土地持分の割合を特徴量として追加しました


## ZENRIN MAP API
ZENRIN API から提供されたAPIを利用して特徴量を作成しました．利用したapiは以下の2つです．
- 住所クレンジング
- ZID検索

住所 (full_address) を入力として，「住所クレンジング」でZIDを取得します．その後，取得したZIDを入力として「ZID検索」を行い，以下のような住所の建物情報を取得しました．
- building_type_zid: 建物の種類を示す識別子
- room_count_zid: 建物内の部屋数を示す識別子
- building_top_floor_num: 建物の最上階の階数
- building_bottom_floor_num: 建物の地下階数．地下階が存在しない場合は0，地下階数が不明な場合は-1
- build_year: 建物の建築年
- shape_area: 建物の面積（単位: 平方メートル）
- shape_length: 建物の周辺長（単位: メートル）
- building_structure1: 建物構造の大分類。0は非木造、1は木造を示します
- building_structure2: 建物構造の詳細分類。1は木造、2は鉄骨造、3は鉄筋コンクリート造、4は鉄筋鉄骨コンクリート造、5は軽量鉄骨造、6はブロック造、7はその他を示します
- ownership_type: 建物の分譲/賃貸区分。1は分譲、2は賃貸を示します

これらのデータは，元データの情報を補完するために取得しましたが，欠損値を補完するのではなく、そのまま特徴量として利用した方が，クロスバリデーション（CV）とリーダーボード（LB）の精度が向上しました．

## 国土数値情報

国土数値情報は，緯度と経度情報から以下の3つ抽出方法で特徴量を作成しました．

- 近傍N点のデータの取得
- 指定座標のポリゴン情報の取得
- 範囲内のポインタの数を取得

使用した国土数値情報は以下の15個になります．

| 名前                      | id              | 特徴量抽出方法|
|---------------------------|-----------------|-------------|
| 地価公示                 | L01-24_GML     |近傍10点のデータの取得|
| 都道府県地価調査         | L02-24_GML     |近傍10点のデータの取得|
| 駅別乗降客数             | S12-23_GML     |近傍3点のデータの取得|
| 500mメッシュ別将来推計人口 | PTN_GML        |指定座標のポリゴン情報の取得
| 平年値メッシュ           | G02-22_GML     |指定座標のポリゴン情報の取得
| ニュータウン             | P26_GML        |近傍データの取得
| 人口集中地区             | A16-20_GML     |近傍データの取得
| 宿泊容量メッシュ         | P09-10_GML     |指定座標のポリゴン情報の取得
| 工業用地                 | L05_GML        |近傍データの取得
| 豪雪区域データ           | A22-m_GML      |近傍データの取得
| 医療機関                 | P04-20_GML     |範囲内のポインタの数を取得
| 福祉施設                 | P14-23_GML     |範囲内のポインタの数を取得
| 学校                     | P29-23_GML     |範囲内のポインタの数を取得
| 文化施設                 | P27-13_GML     |範囲内のポインタの数を取得
|収容施設データ　          | P33-14_GML     |範囲内のポインタの数を取得


#### 地価公示
地価公示法に基づいて鑑定・評価された国土数値情報です．賃料に関係しそうな以下のデータを選んで追加しました．特に地価公示価格は強い特徴量でした．
 - 地価公示価格（L01_008）
 - 対前年変動率（L01_009）
 - 地積（L01_027）
 - 都市計画区分（L01_053）
 - 森林法（L01_055）
 - 自然公園法（L01_056）
 - 建蔽率（L01_057）
 - 容積率（L01_058）

地価公示価格が賃料の予測に大きく貢献することが分かったので，より建物座標に近い地価公示価格を特徴量とするために近傍10点の地価公示価格のデータ取得して平均値等を計算しました．特に，重み付けを行った地価公示価格は、最も重要な特徴量となりました．
- 近傍3点の地価公示価格の追加
- 近傍3点の平均地価公示価格の追加
- 10点のデータから，距離の２乗に反比例した重み付けを行った地価公示価格の追加 

#### 都道府県地価調査
この国土数値情報のデータは，国土利用計画法施行令に基づいて都道府県ごとに調査を行った結果を集約したものです．賃料に関係しそうな，いくつかのデータを特徴量として採用しました．
 - 調査価格（L02_006）
 - 対前年変動率（L02_007）
 - 地積（L02_024）
 - 最寄り駅迄の道路距離（L02_045）
 - 都市計画の用途地域（L02_046）
 - 防火地域（L02_047）
 - 高度地区（L02_048）
 - 建ぺい率（L02_050）
 - 容積率（L02_051）

都道府県地価調査にも，地価公示価格と同じ処理を行いました．
- 近傍3点の都道府県地価の追加
- 近傍3点の都道府県地価の平均の追加
- 10点のデータから，距離の２乗に反比例した重み付けを行った都道府県地価の追加

#### 駅別乗降客数
近傍3点の駅別乗客数のデータを取得しました．最寄りの駅までの距離と乗客数を追加したことで，地域の特性と利便性を表現できたと考えられます．
- 運営会社（S12_002）
- 鉄道区分（S12_004）
- 事業者種別（S12_005）
- 2021年の駅別乗降客数（S12_049）
- 2022年の駅別乗降客数（S12_053）
- 近傍ポインタまでの距離

#### 500mメッシュ別将来推計人口
人口はその地域に住む住民を表すので，人口に応じて賃料も高くなると考えられます．国土数値情報の500mメッシュ別将来推計人口のデータには，2015年から2050年までの人口情報と予測が集約されています．今回は，2015年，2020年，2025年のデータを利用しました．また，2015年と2020年から2025年への人口の増加率を特徴量として作成しました．特に特徴量として強かったのは以下の3つで，人口そのものよりも人口比率が強かったです．
- 2020年男女計0～14歳人口比率（PTA_2020）
- 2020年から2025年への人口増加率
- 2020年男女計15～64歳人口比率（PTB_2020）

#### 平年値メッシュ
平年値メッシュは，降水量，気温，最深積雪，日照時間，全天日射量の５種類の気象要素を1kmメッシュでまとめたGISデータです．今回のコンペでは，以下の計49のデータを取り出しました．
- 月ごとの降水量(G02-02 ~ G02-14)
- 月ごとの平均気温(G02-017，G02-020，~ ，G02-050，G02-053)
- 1月から12月の最深積雪(G02-54 ~ G02-057)
- 年最深積雪(G02-058)

特に特徴量として重要度が高かったのは以下の4つでした．雪が降るかどうかは，利便性に大きく影響するので，これが特徴量として強かった理由だと考えられます．
 - 12月の最深積雪（G02_057）
 - 10月の降水量（G02_011） 
 - 4月の平均気温（G02_026）
 - 7月の降水量（G02_008）

#### ニュータウン
ニュータウンとして開発された建物群は近しい賃料を持つ可能性があるという予測の元，国土数値情報のニュータウンのデータを特徴量に追加した．特に事業手法と近傍までの距離が有力な特徴量となりました．
 - 事業手法（P26_009）
 - 計画戸数（P26_012）
 - 計画人口（P26_013）
 - 近傍ポインタまでの距離（P26_distance）

#### 人口集中地区
人口密度の高い地域を集計した，国土数値情報です．以下のような特徴量を追加しました．
- 人口（A16_005）
- 面積（A16_006）
- 全域に占める人口集中地区の人口割合（A16_009）
- 全域に占める人口集中地区の面積割合（A16_010）
- 人口（男）（A16_012）
- 人口（女）（A16_013）
- 世帯数（総数）（A16_014）

#### 収容人数
全国の宿泊施設約1.8万件における宿泊可能人数をまとめたGISデータです．観光地など地域特徴を捉えることを期待して追加しました．
- 施設総数（P09_012）
- 収容人数（P09_013）
- 客室数（P09_014）

### 工業用地
工業用地をまとめたGISデータです．工業用地の近くは，労働者向けの賃貸が集まっていて賃料に特徴があると考えて以下のような特徴量を追加しました．
- 臨海・内陸区分コード（L05_005）
- 全体開発面積（L05_010）
- 工業用地面積（L05_011）
- 立地企業数（L05_014）

#### 豪雪区域データ
豪雪区域データには，過去の雪害のデータをまとめた国土数値情報です．雪害が起こった地点に近いほど冬に住みにくい地域だと考えて，雪害までの距離を特徴量として採用しました．

#### 医療機関
slack内の投稿で，1km範囲内の医療機関の個数を採用することで精度が上がったという投稿を見て採用した．医療機関の数はコンビニの数よりも多いらしいです．

#### 福祉施設
1km範囲内の福祉施設の個数を特徴量として追加しました．福祉施設が集まっている地域ほど利便性が高く賃料も高くなると考えて追加しました．

#### 学校
私自身が大学生として物件選びをした経験から，大学に近いほど賃料が高いというイメージがありました．そこで，1km以内に大学が存在するかを特徴量として追加しました．

#### 文化施設
1km範囲内の文化施設の個数を特徴量として追加しました．文化施設が集まっている地域ほど利便性が高く賃料も高くなると考えて追加しました．

#### 集客施設データ
1km範囲内の集客施設の個数を特徴量として追加しました．集客施設が集まっている地域ほど利便性が高く、賃料も高くなると考えて追加しました．

# モデル
- building_id の Group K-Fold 5分割を使用
- 予測は専有面積あたりの賃料（money_room/unit_area）を使用
- 最終的に提出した予測はlightGBMとCatboost,XGBoost のアンサンブル 

![可視化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960974/d8d72735-0ef9-b9e0-b2ad-157cc10e45b6.png)

# 反省点
今回のコンペでは，Public7位からPrivate13位にシェイクダウンしました．提出ファイルのスコアなどを確認して，以下のような原因を発見しました．
- **unit_areaの補完**
私の専有面積（unit_area）の補完は雑だったと思います．予測値を賃料あたりの専有面積にする関係上，専有面積が予測に与える影響は大きいです．もう少し丁寧な調査と補完を行うべきでした．
- **アンサンブル**
コンペ終盤にlightGBM以外のモデルをアンサンブルに加えることでPublic LBのスコアを向上させましたが、Privateでは同様の改善が見られませんでした。lightGBMの異なるシード値を用いたモデルのアンサンブルを試すべきでした。
# 感想
今回のコンペは提供データが非常に多く，データ分析や特徴量の作成において，できることが多くとても楽しい経験でした。しかし，惜しくも金メダルには届かず，非常に悔しい気持ちです．特に，もう少し丁寧にデータの分析や考察を行っていれば，金メダルに手が届いた可能性があったと思います．この経験を次回のコンペに活かし，さらなる成長を目指したいです．