R言語所蔵のサンプルデータをABC順に眺めてます。前回はカナダの都市をプロットするのにカナダ単独の地図データがみあたらないじゃん、と慌てました。今回は米国の郡レベルの地域に割り当てられているらしいFIPSコードというものを白地図上に表示してみたいと思います。郵便番号に相当するZIPコードとは異なるコードだよ。
※「データのお砂場」投稿順Indexはこちら
※使用させていただいている Rのversionは 4.3.1。RStudioは 2024.04.2+764 “Chocolate Cosmos” です。
FIPSコード
今回取り扱おうとしている maps パッケージ内のサンプルデータセットは、
county.fips
というデータセットです。米国の郡(county)レベルに割り振られているIDの一種、FIPSコードというものと郡名を列挙したものです。米国の郡(county)は、州の下の階層になりますが、面積的には日本の県など凌駕する面積を持つところも多いじゃないかと思います、特に西部では。流石に広い米国のこと、3085もの郡がならんでます。
例によってGoogleのAI、Gemini様にお伺いをたててみるとこんな感じ。
FIPSコードは5桁のコードで、上2桁が州、下3桁が郡を表すように割り振られているようです。ただし諸般の慮りから連続ではなく基本奇数のトビトビな数値を割り当てて「いた」みたいです。上記のGemini様の解説には言及ありませんが、調べてみるとこのFIPSコードを規定していた以下の規格、2008年に廃止されてました。
FIPS 6-4 (Federal Information Processing Standard Publication 6-4)
FIPS、何やら聞いたことがあるじゃんと思って調べてみたら、NIST様がお決めになっている規格でした。暗号やハッシュ関数などの以下規格などはお世話になっているような気がしないでもないです。
-
- FIPS 197 AES
- FIPS 180-4 Secure Hash Standard
上記のようなFIPSチョメチョメと呼ばれる規格を列挙しているページが以下に。
https://csrc.nist.gov/publications/fips
しかし、NIST様が上記のFIPS 6-4を含む10個の規格の廃止を決定したという文書が以下にあります(2008年)
Announcing Approval of the Withdrawal of Ten Federal Information Processing Standards (FIPS)
後ろの方まで読んでいくと、確かにFIPS 6-4の廃止も含まれてますが、そっけない文書で、何で廃止したとか、それでどうするなどは一切書かれてません。
まあ廃止されたということは、それ以前は米国連邦政府に何か納入する業者は上記の規格に適合していなければいけなかったものが、以降は別の規格に適合を求められているということなんだと思います。
調べるとFIPS 6-4をおきかえる新規格は、2009年制定の「INCITS 31」という規格らしいです。URLからANSI様のWebページへ行って大枚$60をお支払いするとPDFをダウンロードできるみたいです(お金のない老人は買わんけど。)
調べてみると、EAS (the Emergency Alert System)とかNOAAとかがいまだにFIPSコードベースのIDを使っているとか、新コードはNIST制定でなくなったけれどもFIPSの名前が引き続き使われているとか、素人老人にはサッパリな状況です。まあ、結論から言うと、今でも「通用」するのだろうよ。
先ずは生データ
ライブラリをロードし、サンプルデータセットを開いてみます。こんな感じ。
データセット自体はFIPSの数値と地図のポリゴンデータ名の列挙です。FIPS値は10進5桁といいつつ単なる整数であるので、頭の0は消えて4桁になったりしてます。なおNOAAとかは「6桁目」に0を含む6桁符号を使っているみたい。知らんけど。
カウンティの白地図にFIPS番号をふったプロットをして~
折角データセットをロードしたので、カウンティ毎にFIPS番号が分かるようなプロットをしたいと考えました。しかし、3000以上もある郡全てを処理してもなんだかわかりません。そこで「お馴染み」のカリフォルニア州について、その郡とFIPS番号をプロットしてみることに。
今回は米国の州、郡レベルであるので、mapsパッケージ内から地図データを呼びだすのは簡単っす。こんな感じ。
stateNam <- c('California') map('county', stateNam, fill = TRUE, col = palette())
FIPS番号をプロットする場合は、county.fipsデータベースからカリフォルニア州内の郡のデータを抽出し、ラベルとして表示する必要があります。上のようなカラフルな地図でなく、渋い白地図にラベルだけね。
califCounties<-county.fips[grep("calif", county.fips$polyname), ] map.text('county', califCounties$polyname, labels=as.character(califCounties$fips))
なお、上記ではlabels=にFIPS番号のベクタ(数値を文字列に変換必要)を与えたですが、labelsを指定せず、デフォのまま以下のように描いてもらうと郡名をプリントできます。
map.text('county', califCounties$polyname)
まあ、maps.textも使えそうな気がしてきた。一回やっただけだろうが。