読者です 読者をやめる 読者になる 読者になる

チョコレート狂地図 choroplethrバージョン

これをchoroplethrで描きたい。

wafdata.hatenablog.com

前回e-Statからとってきたデータをchroplethrで可視化します。

choroplethr

choroplethrは簡単にコロプレス図が描けるパッケージです。都道府県にあたるレベルの区画なら、これでさくっと地図が描けます。

qiita.com

データ加工

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はvalueregionという名前のカラムが必須です。上のデータはそのままでは使えずrename()等をする必要があります。

今回はとりあえず合計支出額のコロプレス図を描いてみます。

library(choroplethr)

admin1_choropleth(country.name = "japan",
                  df           = rename(d_spread, value = 合計, region = pref_alpha),
                  title        = "チョコ狂マップ",
                  legend       = "チョコへの愛情(a.k.a.お金)",
                  num_colors   = 1)

f:id:yutannihilation:20151029004722p:plain

離散化するとたぶんこんな感じ。

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

f:id:yutannihilation:20151029004741p:plain

num_coloursの使い方がちょっとわからないかも。

choroplethrが返すのはggplot2のオブジェクトなので、こんな感じに色を変えたりできます。

p + scale_fill_brewer(palette = 7, type = "qual")

f:id:yutannihilation:20151029010742p:plain

感想

チョコより猪口派です。