cucumber flesh

Rを中心としたデータ分析・統計解析らへんの話題をしていくだけ

郵便番号データの操作と祝日判定の機能を追加したzipangu v0.2.0を公開

昨年バージョン0.1.0をリリースした、日本人が扱う住所や年号、漢数字のデータ操作を楽にするRパッケージ、{zipangu}に新しい機能を追加し、バージョン0.2.0としてCRANに登録しました。この記事では0.2.0で扱える新機能を紹介します。表題の通り、郵便番号データの操作と、祝日の判定機能がメインです。

uribo.hatenablog.com

https://cran.r-project.org/web/packages/zipangu/news/news.html

library(zipangu)
library(dplyr, warn.conflicts = FALSE)
packageVersion("zipangu")
## [1] '0.2.0'

1. 郵便番号

日本郵便が住所別の郵便番号データを公開しています。このファイルをRに取り込む関数を用意しました。郵便番号ファイルは頻繁に更新されるため、ローカルでのパス指定だけでなくURLによるファイル読み込みも可能となっています。

公開されるファイルには、住所の表記に関していくつかの種類や事業所を含めたデータがありますが、こうしたバリエーションにも対応します。具体的には、type引数に対象ファイルを元に以下の値を与えます。

  • oogaki: 読み仮名データの促音・拗音を小書きで表記しないもの
  • kogaki: 読み仮名データの促音・拗音を小書きで表記するもの
  • roman: 読み仮名データがローマ字
  • jigyosyo: 事業所の個別郵便番号
# パッケージに含まれるサンプルデータを読み込みます
zipcode_file <- 
  system.file("zipcode_dummy/13TOKYO_kogaki.CSV", package = "zipangu")
df_oogaki <- 
  zipangu::read_zipcode(path = zipcode_file, type = "oogaki")
glimpse(df_oogaki)
## Observations: 1
## Variables: 15
## $ jis_code             <chr> "13101"
## $ old_zip_code         <chr> "100"
## $ zip_code             <chr> "1000001"
## $ prefecture_kana      <chr> "トウキヨウト"
## $ city_kana            <chr> "チヨダク"
## $ street_kana          <chr> "チヨダ"
## $ prefecture           <chr> "東京都"
## $ city                 <chr> "千代田区"
## $ street               <chr> "千代田"
## $ is_street_duplicate  <dbl> 0
## $ is_banchi            <dbl> 0
## $ is_cyoumoku          <dbl> 0
## $ is_zipcode_duplicate <dbl> 0
## $ status               <dbl> 0
## $ modify_type          <dbl> 0

URLを直接指定する際は type の指定が不要です。

read_zipcode("https://www.post.japanpost.jp/zipcode/dl/jigyosyo/zip/jigyosyo.zip")

read_zipcode() では圧縮ファイルをRに読み込みますが、dl_zipcode_file()によりファイルをダウンロードしておくことも可能です。

dl_zipcode_file(path = "https://www.post.japanpost.jp/zipcode/dl/oogaki/zip/02aomori.zip")

このほか、is_zipcode()zipcode_spacer() を用意しました。前者は入力が7桁の郵便番号かどうかをチェック、後者は郵便番号に使われるハイフンを追加・除去するちょっとした関数です。

is_zipcode(7000027)
## [1] TRUE
is_zipcode("700-0027")
## [1] TRUE
zipcode_spacer("3050053")
## [1] "305-0053"
# ハイフンを取り除く際は remove = TRUE を指定します
zipcode_spacer("305-0053", remove = TRUE)
## [1] "3050053"

郵便番号データの公開は貴重ですが「KEN_ALL.csvの闇」と噂される記録のされ方で、実際に扱う場合は処理が面倒です。こうしたデータをtidyにする試みについては前回書いたとおりです。

uribo.hatenablog.com

この課題に関して、id:yutannihilation さんにも取り込んでいただきました。

github.com

機能要望として郵便番号の検索が提案されています。どういう形でデータを整形・表示すれば良いのかについて、議論の余地が残ると判断し、完成に至っていません。

2. 日本の祝日

祝日(国民の休日)判定のための関数を用意しました。これらは{zipangu}パッケージの開発のきっかけとなる{Nippon}で提供されていた機能でもあります。最初のリリースでは実装が追いついていませんでしたので、当初の目的を果たせました(拍手)。

入力に与えた日付が祝日かを返却する is_jholiday() と その年の祝日を調べる jholiday() があります。

Nippon::is.jholiday(as.Date("2019-12-23"))
## [1] TRUE
is_jholiday(date = as.Date("2019-12-23"))
## [1] FALSE
# 今年の祝日を調べる
jholiday(year = 2020, lang = "jp")
## $元日
## [1] "2020-01-01"
## 
## $成人の日
## [1] "2020-01-13"
## 
## $建国記念の日
## [1] "2020-02-11"
## 
## $天皇誕生日
## [1] "2020-02-23"
## 
## $春分の日
## [1] "2020-03-20"
## 
## $昭和の日
## [1] "2020-04-29"
## 
## $憲法記念日
## [1] "2020-05-03"
## 
## $みどりの日
## [1] "2020-05-04"
## 
## $こどもの日
## [1] "2020-05-05"
## 
## $海の日
## [1] "2020-07-23"
## 
## $スポーツの日
## [1] "2020-07-24"
## 
## $山の日
## [1] "2020-08-10"
## 
## $敬老の日
## [1] "2020-09-21"
## 
## $秋分の日
## [1] "2020-09-22"
## 
## $文化の日
## [1] "2020-11-03"
## 
## $勤労感謝の日
## [1] "2020-11-23"
# 天皇誕生日は時代に合わせて変更されます
jholiday_spec(year = 1988, name = "天皇誕生日", lang = "jp")
## [1] "1988-04-29"
jholiday_spec(2018, "天皇誕生日", lang = "jp")
## [1] "2018-12-23"
jholiday_spec(2020, "天皇誕生日", lang = "jp")
## [1] "2020-02-23"

大元の祝日の一覧は内閣府が配布するcsvファイルを参照しています。2020年1月現在に決まっているものなので、将来、祝日の変更があった際はデータを更新しなくてはいけなくなりますが、アーカイブされてしまった{Nippon}で用意されていた機能を復活させたこと、天皇の即位や東京オリンピック開催に関する2019、2020年の祝日の変更に対応できた点は良かったと思います。

また、ここでの作業の副産物として「ある月の第二月曜日」などを調べるための関数 find_date_by_wday() ができました。年 (year)、月 (month)、曜日 (wday… デフォルトでは日曜日が1)、週番号 (ordinal) を指定して実行します。

find_date_by_wday(year = 2020, month = 1, wday = 2, ordinal = 2)
## [1] "2020-01-13"

不具合や新機能の提案はGitHub issuesまたは Twitter @u_ribo までお願いします。