チョコレート狂地図 choroplethrバージョン
これをchoroplethrで描きたい。
前回e-Statからとってきたデータをchroplethrで可視化します。
choroplethr
choroplethrは簡単にコロプレス図が描けるパッケージです。都道府県にあたるレベルの区画なら、これでさくっと地図が描けます。
データ加工
library(dplyr) library(stringr) library(stringi) library(lubridate) # dateカラムをPOSIXctに変換。 # Windowsの場合はなぜかnative(SJIS)じゃないとfast_strptimeが動かなかったのでstri_enc_tonativeを挟んでいる。 d <- value_df %>% mutate(date = stri_enc_tonative(date), date = fast_strptime(date, "%Y年%m月")) # itemとcityカラムには「352 チョコレート」のように番号が入ってるので取り除く d <- d %>% mutate_each(funs(str_replace(., "^[ 0-9]+", "")), item, city) # 必要なデータだけ残す d <- d %>% select(date, value, item, city) %>% filter(!is.na(value), city != "全国") d #> Source: local data frame [9,836 x 4] #> #> date value item city #> (time) (dbl) (chr) (chr) #> 1 2015-08-01 257 チョコレート 札幌市 #> 2 2015-07-01 284 チョコレート 札幌市 #> 3 2015-06-01 440 チョコレート 札幌市 #> 4 2015-05-01 383 チョコレート 札幌市 #> 5 2015-04-01 576 チョコレート 札幌市 #> 6 2015-03-01 672 チョコレート 札幌市 #> 7 2015-02-01 1456 チョコレート 札幌市 #> 8 2015-01-01 505 チョコレート 札幌市 #> 9 2014-12-01 704 チョコレート 札幌市 #> 10 2014-11-01 488 チョコレート 札幌市 #> .. ... ... ... ...
都道府県名
※この部分のやり方は@u_ribo氏のアドバイスが役立ちました。ありがとう!
choroplethrを使うには、以下のような都道府県名に合わせる必要があります。
library(choroplethrAdmin1) get_admin1_regions("japan")$region [1] "aichi" "akita" "aomori" "chiba" "ehime" "fukui" "fukuoka" "fukushima" "gifu" "gunma" "hiroshima" [12] "hokkaido" "hyogo" "ibaraki" "ishikawa" "iwate" "kagawa" "kagoshima" "kanagawa" "kochi" "kumamoto" "kyoto" [23] "mie" "miyagi" "miyazaki" "nagano" "nagasaki" "nara" "niigata" "oita" "okayama" "okinawa" "osaka" [34] "saga" "saitama" "shiga" "shimane" "shizuoka" "tochigi" "tokushima" "tokyo" "tottori" "toyama" "wakayama" [45] "yamagata" "yamaguchi" "yamanashi"
しかし、e-Statからとってきたデータは市町村名しかありません。これを都道府県にマッチングさせるために、別のデータを使います。具体的には、総務省が配ってる全国地方公共団体コードのファイル。
このページにあります:http://www.soumu.go.jp/denshijiti/code.html
tmp <- tempfile(fileext = ".xls") # なぜかmethod="curl"じゃないとファイルがおかしい。 download.file("http://www.soumu.go.jp/main_content/000318342.xls", destfile = tmp, method = "curl") prefnames_soumu <- readxl::read_excel(tmp) # 列名は文字化けしてるので文字コードを設定...してもいいけどめんどくさいので適当な名前に。 names(prefnames_soumu) <- c("code", "pref_kanji", "city_kanji", "pref_kana", "city_kana") unlink(tmp)
漢字からアルファベットへの変換はNipponパッケージのkakasi()
という関数が使えます。ただし、この関数もなぜかSJISじゃないとだめなのでstri_enc_tonative()
を使っています。
library(Nippon) prefnames <- prefnames_soumu %>% mutate(pref_alpha = str_sub(pref_kanji, end = -2), # 都道府県を取り除く pref_alpha = kakasi(stri_enc_tonative(pref_alpha)), # アルファベットに変換 pref_alpha = str_replace_all(pref_alpha, "o[ou]", "o"), # choroplethrと表記を合わせる pref_alpha = ifelse(pref_alpha == "hokkai", "hokkaido", pref_alpha)) # 北海道だけは「道」がつく prefnames #> Source: local data frame [1,788 x 6] #> #> code pref_kanji city_kanji pref_kana city_kana pref_alpha #> (chr) (chr) (chr) (chr) (chr) (chr) #> 1 010006 北海道 NA ホッカイドウ NA hokkaido #> 2 011002 北海道 札幌市 ホッカイドウ サッポロシ hokkaido #> 3 012025 北海道 函館市 ホッカイドウ ハコダテシ hokkaido #> 4 012033 北海道 小樽市 ホッカイドウ オタルシ hokkaido #> 5 012041 北海道 旭川市 ホッカイドウ アサヒカワシ hokkaido #> 6 012050 北海道 室蘭市 ホッカイドウ ムロランシ hokkaido #> 7 012068 北海道 釧路市 ホッカイドウ クシロシ hokkaido #> 8 012076 北海道 帯広市 ホッカイドウ オビヒロシ hokkaido #> 9 012084 北海道 北見市 ホッカイドウ キタミシ hokkaido #> 10 012092 北海道 夕張市 ホッカイドウ ユウバリシ hokkaido #> .. ... ... ... ... ... ...
これをもとのデータにjoinします。東京都だけは"東京都区部"
という謎なやつになってるので、手動で"tokyo"
にします。
d <- d %>% left_join(prefnames, by = c("city" = "city_kanji")) %>% mutate(pref_alpha = ifelse(city == "東京都区部", "tokyo", pref_alpha))
集計
今回は、2012年~2014年の平均ということなので、そこだけ抜き出して、年間の平均支出額を集計します(年間なので12をかけています)。都道府県によっては都市が2つ以上あるところもありますが、まあ平均をとるので気にしないことにします。
d_summary <- d %>% filter(between(date, as.POSIXct("2012-01-01"), as.POSIXct("2014-12-31"))) %>% group_by(pref_alpha, item) %>% summarise(value = mean(value) * 12)
このままだと「チョコレート」と「チョコレート菓子」が混在しているので、別々のグラフを書くためにtidyr::spread()
でカラムを分けます。
library(tidyr) d_spread <- d_summary %>% spread(item, value) %>% mutate(合計 = チョコレート + チョコレート菓子)
これで準備完了です。
描く
choroplethrはvalue
とregion
という名前のカラムが必須です。上のデータはそのままでは使えずrename()
等をする必要があります。
今回はとりあえず合計支出額のコロプレス図を描いてみます。
library(choroplethr) admin1_choropleth(country.name = "japan", df = rename(d_spread, value = 合計, region = pref_alpha), title = "チョコ狂マップ", legend = "チョコへの愛情(a.k.a.お金)", num_colors = 1)
離散化するとたぶんこんな感じ。
d_cut <- d_spread %>% mutate(value = ggplot2::cut_interval(合計, n = 3, labels = 1:3), region = pref_alpha) p <- admin1_choropleth(country.name = "japan", df = d_cut, title = "チョコ狂マップ", legend = "チョコへの愛情(a.k.a.お金)", num_colors = 3) p
num_colours
の使い方がちょっとわからないかも。
choroplethrが返すのはggplot2のオブジェクトなので、こんな感じに色を変えたりできます。
p + scale_fill_brewer(palette = 7, type = "qual")
感想
チョコより猪口派です。