不動産取引データを加工するretiパッケージを試す
以前国土交通省の不動産取引価格データを加工した時(不動産価格データを使って相場を推測する)に、retiというパッケージについて簡単に触れました。別の地域もデータを少し触ってみようと思い、このパッケージを使ってデータ加工をしました。公式のドキュメント以外にあまり資料がないのと、ちょっと使い方が最初わかりづらいと思ったので、メモついでに紹介します。
retiパッケージとは
Rのパッケージです。こちらが公式のドキュメントです。
スペル間違ってますけど、Real Estate Transaction-price Infomation でretiみたいです。
何をしてくれるパッケージなのかというと、国土交通省の不動産価格取引情報検索からダウンロードしたCSVファイルを読み込み、分析に便利ないくつかの変数を追加してくれる、というものです。最初はダウンロードもしてくれるのかと勘違いしていたので、使い方がよくわかりませんでしたが、なかなか便利です。
reti パッケージの使い方
インストール方法は公式ドキュメントを読んでもらうとして、国土交通省の不動産価格取引情報検索からデータをダウンロードした前提で紹介します。
データの読み込み
価格データをダウンロードして驚くのは、CP932というShift-JISを拡張したエンコードでファイルが保存されていることです。Rの環境にもよりますが、文字化けしたり、ファイルが読み込めなかったりします。どうでもいいですが「本当は怖くないCP932」という記事もあるぐらいなので、多分開発者の間では恐れられているエンコードなのでしょう。
しかしretiパッケージならそのままのエンコードでデータを読み込むことができます。例えば、csvファイル内のデータを全て読み込むには、
osaka <- reti_read_base('27_Osaka Prefecture_20053_20221.csv')
とします。国土交通省の取引価格データは、
宅地(土地と建物)
宅地(土地)
中古マンション
農地・林地
と4種類が含まれています。個別の種類のデータだけCSVから取り出すこともできて、しかも種類ごとに追加される分析用の変数も変わります。例えば中古マンションだけを取り出したい場合は、
osaka_condo <- reti_read_MS('27_Osaka Prefecture_20053_20221.csv')
とします。これで大阪の中古マンションだけのデータが取れます。宅地(土地と建物)の場合はreti_read_LB()、宅地(土地)の場合はreti_read_LO()、農地・林地の場合はreti_read_FW()を使います。
中古マンションの場合は、駅距離、駅距離カテゴリー、部屋サイズ、などの変数が追加されます。築年も追加されます。また、建築年が戦前というデータが元々のCSVに含まれることがあるのですが、戦前フラグというのがつきます。また、部屋の面積が2000㎡以上と表示されることがあって、元々の部屋の面積のデータは文字列として保存されているのですが、部屋面積は数値化されて、2000㎡以上の場合はhuge_roomというフラグで保存されます。
t_date: 取引時点を日にち換算している
t_qtr, t_year: 同じく取引時点を数字にしたもの
howfar_st: 駅分(最寄駅からの分数)を数値にしたもの
howfar_st_category: 1時間半から2時間、30分から60分といったふざけた文字列を変換してある
room_size: 面積を数値にしたもの
huge_room: 2000㎡以上となっている場合TRUE, それ以外はFALSE
データの中身をざっとみます。日本語の列名になっているのが国土交通省のデータに含まれているもので、英語名になっているものが新たに追加された変数です。
osaka_condo %>% glimpse()
Rows: 86,362
Columns: 38
$ 種類 <fct> 中古マンション等, 中古マンション等, 中古マンション等, 中古…
$ 地域 <fct> , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
$ code <int> 27102, 27102, 27102, 27102, 27102, 27102, 27102, 27102, 271…
$ 県名 <fct> 大阪府, 大阪府, 大阪府, 大阪府, 大阪府, 大阪府, 大阪府, 大…
$ 市名 <fct> 大阪市都島区, 大阪市都島区, 大阪市都島区, 大阪市都島区, 大…
$ 地区名 <fct> 網島町, 網島町, 網島町, 網島町, 網島町, 網島町, 網島町, 網…
$ 駅名 <fct> 大阪城北詰, 大阪城北詰, 大阪城北詰, 大阪城北詰, 大阪城北詰,…
$ 駅分 <fct> 1, 5, 1, 5, 3, 3, 5, 5, 5, 3, 5, 5, 5, 5, 5, 5, 6, 6, 13, 4…
$ 取引総額 <dbl> 2.1e+07, 2.1e+07, 2.2e+07, 3.0e+07, 1.6e+07, 1.6e+07, 3.0e+…
$ 坪単価 <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ 間取り <fct> 1K, 1LDK, 1K, 4LDK, 1K, 1K, 1LDK, 1K,…
$ 面積 <fct> 25, 70, 25, 145, 20, 20, 85, 25, 25, 20, 60, 85, 65, 70, 60…
$ 土地単価 <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ 土地形状 <fct> , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
$ 間口 <fct> , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
$ 延床面積 <fct> , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
$ 建築年 <fct> 令和2年, 昭和50年, 令和2年, 昭和50年, 平成27年, 平成27年, …
$ 建物構造 <fct> RC, SRC, RC, SRC, RC, RC, SRC, SRC, S…
$ 建物用途 <fct> 住宅, 住宅, 住宅, 住宅, 住宅, 住宅, 住宅, 住宅, 住宅, 住宅,…
$ 今後 <fct> 住宅, 住宅, 住宅, 住宅, 住宅, 住宅, 住宅, 住宅, 住宅, 住宅,…
$ 道路方位 <fct> , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
$ 道路種類 <fct> , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
$ 道路幅員 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ 都市計画 <fct> 第2種住居地域, 第2種住居地域, 第2種住居地域, 第2種住居…
$ 建蔽率 <int> 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,…
$ 容積率 <int> 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,…
$ 取引時点 <fct> 2022年第1四半期, 2021年第4四半期, 2021年第4四半期, 2021…
$ 改装 <fct> 未改装, 未改装, 未改装, 未改装, 未改装, 未改装, 改装済, 未…
$ 取引事情 <fct> , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
$ t_date <date> 2022-01-01, 2021-10-01, 2021-10-01, 2021-10-01, 2021-01-01,…
$ t_year <dbl> 2022, 2021, 2021, 2021, 2021, 2020, 2020, 2020, 2020, 2020,…
$ t_qtr <int> 1, 4, 4, 4, 1, 3, 3, 2, 2, 2, 4, 3, 2, 1, 4, 4, 4, 1, 2, 1,…
$ howfar_st <int> 1, 5, 1, 5, 3, 3, 5, 5, 5, 3, 5, 5, 5, 5, 5, 5, 6, 6, 13, 4…
$ howfar_st_category <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ room_size <dbl> 25, 70, 25, 145, 20, 20, 85, 25, 25, 20, 60, 85, 65, 70, 60…
$ huge_room <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FAL…
$ howold_building <dbl> NA, 46, NA, 46, 6, 5, 45, 45, 45, 5, 44, 44, 44, 44, 43, 4…
$ building_before_war <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FAL
データのフィルタリング
reti パッケージのもう1つの機能はデータのフィルタリングです。reti_filter_by_cityというコマンドがあって、これで地域名などでフィルタをかけられます。例えば
osaka_chuo <- reti_filter_by_city(osaka_condo, "大阪市中央区")
という具合です。reti_filter_by_prefecture、reti_filter_by_stationを使えば県名、駅名でもフィルタがかけられるようです。が、正直これはdplyrを使った方がいちいち関数名など覚えなくても良いので、あまり使うことはなさそうです。
reti パッケージの長所と短所
色々と試したうえで、気づいた点を整理します。
長所
データをダウンロードしてから、エンコードを直す必要がない
面積、取引時点など文字列になっている扱いづらい変数を直してくれる
築年の計算を自動でやってくれる
土地、中古マンションなどフィルタができる
まず、エンコードの処理が面倒なので、ダウンロードしたデータをそのまま読み込めるのが便利です。もちろんコマンドラインでエンコードを変換もできます。ただ国土交通省のデータは本当にいけてなくて、全国のデータを一度にダウンロードできるのですが、ファイルが県ごとに分割されています。しかもファイル名に空白が入っているためループ処理が難しいです。もっともこれも少し工夫するとできました(参考にしたページ)。
for f in "./"*".csv"
do
nkf -w "$f" > "../all_utf_20053_20221/$f"
done
コマンドラインはちょっと、とか、エンコードって何、という人には手軽にデータの読み込みができて良いのではないかと思います。
次に面積などの文字列になっている扱いづらいデータを加工してくれるのが良い点です。面積はなぜか文字列で登録されていて、そのままではデータ分析に使えません。厄介なのが「取引時点」「建築年」で、日付で登録しておいてくれれば良いのに、「2022年第1四半期」、「 2021年第4四半期」のように文字列で入っています。建築年に至っては平成30年、など頑なに元号を押し通してきます。取引時点はt_dateなどの変数で日付に変換されます。建築年はそのままなのですが、分析でよく使う築年数がhowold_buildingという名前で計算されています。
最後に中古マンション、土地など不動産の種類ごとにフィルタがかけられるのは楽ちんです。さらに種類ごとに追加される変数も変わるのが良いです。
難しい点
一方で短所というかもうちょっとここは改善の余地があるのではないかなと思う点もあります。
csvにダウンロードする手間は無くならない
変数が日本語で登録される
令和の対応ができていない。
まず、データのダウンロードはあらかじめ国土交通省のページから手作業で取っておく必要があります。パッケージ内で取り込むということはできないです。
二つ目が変数名が日本語で登録されてしまうことです。最近のRの環境では日本語も特に苦労なく扱えるようになっていますが、コマンドを入力するときにいちいち日本語入力に切り替えたりしないといけないのが若干面倒です。
最後のがちょっと深刻なのですが、築年の計算をする際に建築年が令和だと計算ができない点です。一度分析をしていて築年がないからエラーが起きたことがあって、なぜなのか調べたら結構な件数で築年がブランクになっていました。よくよく見ると建築年が令和のものがブランクになっていたので、おそらく平成の時に作ったから令和の対応ができていないのだとわかりました。ただしこれは開発者の方のせいではなくて、元々のデータを元号を使って登録してくる国土交通省のデータの作り方のせいです。ハンコを廃止したように、元号の利用も政府の統計データからは廃止か、西暦での併記をお願いしたいところです。
まとめ
というわけでreti パッケージの使い方でした。エンコードの処理をせずにデータが読み込めるので、個人的にはまずデータを読み込むところでreti を使うと便利だなと思いました。また、取引時点が日付に換算されるのも超絶便利です。分析には自分でデータ加工が必要ですが、その手間がかなり省けます。令和対応が築年でできていないのは痛いですが、結局何かしらかの下処理は行うので、ここだけ自分で加工すれば全く問題ないです。