R パッケージ
一覧library(rmapshaper)
library(rnaturalearth) # CRAN未登録
library(sf)
library(geofacet)
library(tidyverse)
library(geofacet)
library(zipangu)
ggplot2
} で地図をプロットする方法は様々パッケージ名 | 詳細 |
---|---|
{rnaturalearth } |
:Natural Earth のデータ(国や海域の地理空間データを提供) |
{rnaturalearthdata } |
:Natural Earth のデータ(高解像度) |
{rgeos } |
|
{pacman}
パッケージの p_load()
関数を使って
3 つのパッケージを同時にダウンロードするpackman
パッケージ
・パッケージ管理ツール (packman
パッケージ)を使うと
install.packges()
コマンドを使わなくてもパッケージをインストールしロードできる
・CRAN
や GitHub
上に存在するパッケージを必要に応じてインストールしつつ読み込める
・packman
パッケージを最初に使うときには初回だけ次のコマンドをコンソールに打ちこむこと
install.packages("pacman")
::p_load(rnaturalearth, rnaturalearthdata, rgeos) pacman
{naturalearth}
が無償で提供する ne_countries()
関数scale
と retunrclass
scale
の設定:scale = "small"
と指定scale = "medium"
と指定scale = "large"
と指定retunrclass
の設定:reutrnclass = "sf"
と指定sf
クラスで読み込んでみるreturnclass = "sf"
では、地理座標系の
sf オブジェクト
を指定sf オブジェクト
をマッピングすることができる<- ne_countries(scale = "small",
world_map returnclass = "sf")
world_map
)
の中の変数と型をチェックclass(world_map)
[1] "sf" "data.frame"
data.frame
と
sf
の 2 つworld_map
のクラスがdata.frame
あることworld_map
が含む変数名とその数をチェックnames(world_map)
[1] "scalerank" "featurecla" "labelrank" "sovereignt" "sov_a3"
[6] "adm0_dif" "level" "type" "admin" "adm0_a3"
[11] "geou_dif" "geounit" "gu_a3" "su_dif" "subunit"
[16] "su_a3" "brk_diff" "name" "name_long" "brk_a3"
[21] "brk_name" "brk_group" "abbrev" "postal" "formal_en"
[26] "formal_fr" "note_adm0" "note_brk" "name_sort" "name_alt"
[31] "mapcolor7" "mapcolor8" "mapcolor9" "mapcolor13" "pop_est"
[36] "gdp_md_est" "pop_year" "lastcensus" "gdp_year" "economy"
[41] "income_grp" "wikipedia" "fips_10" "iso_a2" "iso_a3"
[46] "iso_n3" "un_a3" "wb_a2" "wb_a3" "woe_id"
[51] "adm0_a3_is" "adm0_a3_us" "adm0_a3_un" "adm0_a3_wb" "continent"
[56] "region_un" "subregion" "region_wb" "name_len" "long_len"
[61] "abbrev_len" "tiny" "homepart" "geometry"
pop_est
」があるのでこれを使う geom_sf()
幾何オブジェクトを使って世界地図を出力してみる|>
world_map ggplot() +
geom_sf() +
theme_void() # テーマは「何もない (void)」を選んでみる
world_map
のデータ型式が「データフレーム形式」pop_est
(各国の人口データ)に応じて
geom_sf()
内に fill = pop_est
でマッピングできる%>%
world_map ggplot() +
geom_sf(aes(fill = pop_est)) +
# 人口が少ない国は yellow に、多い国は brown3 色とする
scale_fill_gradient(low = "yellow", high = "green") +
labs(fill = "人口") +
theme_void(base_family = "HiraKakuProN-W3")
ne_countries()
内に continent
引数を指定asia_map
という名のオブジェクトとして格納してみる<- ne_countries(scale = "medium",
asia_map continent = "Asia",
returnclass = "sf")
|>
asia_map ggplot() +
geom_sf() +
theme_void()
|>
asia_map ggplot() +
geom_sf(aes(fill = pop_est)) +
scale_fill_gradient(low = "yellow", high = "green") +
labs(fill = "人口") +
theme_minimal() +
theme_void(base_family = "HiraKakuProN-W3")
ここでは「アジア大陸」から表示規模を「東アジア」に絞って所得規模別地図を描いてみる
まず、東アジアにおける各国の所得規模別地図を描いてみる
<- ne_countries(scale = "medium",
asia_map continent = "Asia",
returnclass = "sf")
%>%
asia_map ggplot() + # 所得グループで色塗り
geom_sf(aes(fill = income_grp)) +
theme_void() +
labs(fill = "Income Group")
filter()
関数を使って
subregion
列を基準に抽出する%>%
asia_map filter(subregion == "Eastern Asia") %>% # 「東アジア」に絞る
ggplot() +
geom_sf(aes(fill = income_grp)) +
theme_void() +
labs(fill = "Income Group")
<- ne_countries(scale = "medium",
europe_map continent = "Europe",
returnclass = "sf")
|>
europe_map ggplot() +
geom_sf() +
theme_void()
coord_sf()
関数で座標系を調整し、ヨーロッパの表示範囲を絞ってみるxlim
で、緯度は ylim
で指定%>%
world_map ggplot() +
geom_sf(aes(fill = pop_est)) +
scale_fill_gradient(low = "yellow", high = "green") +
labs(fill = "人口") +
coord_sf(xlim = c(-10, 45), ylim = c(35, 60)) +
theme_minimal(base_family = "HiraKakuProN-W3") +
theme(legend.position = "bottom")
ロシアとドイツの人口が多いことは分かるが、このマップからはあまり顕著な違いが分からない
人口を分割している単位をもう少し細分化してみる
<- ne_countries(scale = "medium", returnclass = "sf") %>%
world_map2 mutate(Population = case_when(pop_est < 30000000 ~ "3千万未満",
< 40000000 ~ "4千万未満",
pop_est < 50000000 ~ "5千万未満",
pop_est < 60000000 ~ "6千万未満",
pop_est < 70000000 ~ "7千万未満",
pop_est < 80000000 ~ "8千万未満",
pop_est TRUE ~ "8千万以上"),
Population = factor(Population,
levels = c("3千万未満", "4千万未満", "5千万未満",
"6千万未満", "7千万未満", "8千万未満",
"8千万以上")))
%>%
world_map2 ggplot() +
geom_sf(aes(fill = Population)) +
scale_fill_brewer(palette = "green", drop = FALSE) +
labs(fill = "人口") +
coord_sf(xlim = c(-10, 45), ylim = c(35, 60)) +
geom_label_repel(
data = st_crop(world_map2,
c(xmin = -10, xmax = 45, ymin = 35, ymax = 60)),
aes(label = name, geometry = geometry),
size = 11,
stat = "sf_coordinates",
min.segment.length = 0
+
) theme_minimal(base_family = "HiraKakuProN-W3") +
theme(legend.position = "bottom",
axis.text = element_text(size = 30),
legend.title = element_text(size = 32),
legend.text = element_text(size = 32),
legend.key.size = unit(1, "cm"),
legend.key.width = unit(3,"cm"))
%>%
world_map select(sovereignt, pop_est) %>%
::datatable() DT
ne_countries
に country
引数を指定するne_countries(scale = "small",
country = "Japan",
returnclass = "sf") %>%
ggplot() +
geom_sf() +
theme_void()
scale = "medium"
と指定してみるne_countries(scale = "medium",
country = "Japan",
returnclass = "sf") %>%
ggplot() +
geom_sf() +
theme_void()
rnaturalearthhires
}パッケージをインストールし、読み込む::p_load_gh("ropensci/rnaturalearthhires") pacman
p_load()
でなく
p_load_gh()
を使う理由
・{rnaturalearthhires
}は CRAN
に登録されていない(2022年9月2日時点)
・GitHub
の ropensciレポジトリーのみで公開
→ {pacman
}パッケージの p_load()
関数でなく、p_load_gh()
関数を使う
ne_states()
関数を使うsf
<- ne_states("Japan",
df_jpn_map returnclass = "sf")
%>%
df_jpn_map ggplot() +
geom_sf() +
theme_void()
ne_states()
関数を使って読み込んだ日本地図データ
df_jpn_map
に都道府県別の人口データは含まれていないここでは2022年の「都道府県人口・面積・人口密度ランキングを加工したもの
(jpn_pop.csv
)
を使う
csv
ファイルを読み込むために必要な readr
パッケージをロードする
→ tidyverse
パッケージをロードすると、自動的に
readr
パッケージもロードされる
都道府県別人口データ (jpn_pop.csv
)
をダウンロード
→ R プロジェクトフォルダ内に data
フォルダを作り、その中に入れる
・RStudio
上で人口データ (jpn_pop.csv
)
を読み込み、df_jpn_pop
と名前をつける
<- read_csv("data/jpn_pop.csv",
df_jpn_pop locale = locale(encoding = "cp932"))
::datatable(df_jpn_pop) DT
pop_2016
は2016年10月1日時点での人口pop_2021
は2021年10月1日時点での人口diff
は2011年から2021年の間の人口増減率diff
の計算式は次のとおり\[人口増減率= \frac{人口増減(2021年10月−2016年10月)}{2016年10月現在人口}×100\]
df_jpn_map
と「日本人口データ」 df_jpn_pop
を
紐付けるためマージする必要があるdf_jpn_pop
の中を確認::datatable(df_jpn_pop) DT
name
, pref
,
pop_2016
,pop_2021
, diff
の 5
つdf_jpn_map
の中を確認names(df_jpn_map)
[1] "featurecla" "scalerank" "adm1_code" "diss_me" "iso_3166_2"
[6] "wikipedia" "iso_a2" "adm0_sr" "name" "name_alt"
[11] "name_local" "type" "type_en" "code_local" "code_hasc"
[16] "note" "hasc_maybe" "region" "region_cod" "provnum_ne"
[21] "gadm_level" "check_me" "datarank" "abbrev" "postal"
[26] "area_sqkm" "sameascity" "labelrank" "name_len" "mapcolor9"
[31] "mapcolor13" "fips" "fips_alt" "woe_id" "woe_label"
[36] "woe_name" "latitude" "longitude" "sov_a3" "adm0_a3"
[41] "adm0_label" "admin" "geonunit" "gu_a3" "gn_id"
[46] "gn_name" "gns_id" "gns_name" "gn_level" "gn_region"
[51] "gn_a1_code" "region_sub" "sub_code" "gns_level" "gns_lang"
[56] "gns_adm1" "gns_region" "min_label" "max_label" "min_zoom"
[61] "wikidataid" "name_ar" "name_bn" "name_de" "name_en"
[66] "name_es" "name_fr" "name_el" "name_hi" "name_hu"
[71] "name_id" "name_it" "name_ja" "name_ko" "name_nl"
[76] "name_pl" "name_pt" "name_ru" "name_sv" "name_tr"
[81] "name_vi" "name_zh" "ne_id" "geometry"
<- df_jpn_map |>
df_jpn_map select(name, geometry)
::datatable(df_jpn_map) DT
unique()
関数をつかって df_jpn_map
の
name
の 9 番目の値を確認してみるunique(df_jpn_map$name)
[1] "Kagoshima" "Oita" "Fukuoka" "Saga" "Nagasaki" "Kumamoto"
[7] "Miyazaki" "Tokushima" "Kagawa" "Ehime" "Kochi" "Shimane"
[13] "Yamaguchi" "Tottori" "Hyogo" "Kyoto" "Fukui" "Ishikawa"
[19] "Toyama" "Niigata" "Yamagata" "Akita" "Aomori" "Iwate"
[25] "Miyagi" "Fukushima" "Ibaraki" "Chiba" "Tokyo" "Kanagawa"
[31] "Shizuoka" "Aichi" "Mie" "Wakayama" "Osaka" "Okayama"
[37] "Hiroshima" "Hokkaido" "Okinawa" "Gunma" "Nagano" "Tochigi"
[43] "Gifu" "Shiga" "Saitama" "Yamanashi" "Nara"
unique()
関数を使って df_jpn_pop
の
name
値を確認してみるunique(df_jpn_pop$name)
[1] "Aichi" "Akita" "Aomori" "Chiba" "Ehime" "Fukui"
[7] "Fukuoka" "Fukushima" "Gifu" "Gunma" "Hiroshima" "Hokkaido"
[13] "Hyogo" "Ibaraki" "Ishikawa" "Iwate" "Kagawa" "Kagoshima"
[19] "Kanagawa" "Kochi" "Kumamoto" "Kyoto" "Mie" "Miyagi"
[25] "Miyazaki" "Nagano" "Nagasaki" "Nara" "Niigata" "Oita"
[31] "Okayama" "Okinawa" "Osaka" "Saga" "Saitama" "Shiga"
[37] "Shimane" "Shizuoka" "Tochigi" "Tokushima" "Tokyo" "Tottori"
[43] "Toyama" "Wakayama" "Yamagata" "Yamaguchi" "Yamanashi"
df_map_pop
と
df_jpn_pop
) に共通する変数 name
は「変数名」(name
) と「値」(Aichi, Akita...
)
が同じ・df_jpn_map
と df_jpn_pop
を
name
を手がかりにデータをマージして、df_jpn
と名前を付ける
<- left_join(df_jpn_pop, df_jpn_map,
df_jpn by = "name") %>%
st_as_sf()
・データフレームを確認する
::datatable(df_jpn) DT
変数名 | 説明 |
1.name |
都道府県名(英語) |
2.pref |
都道府県名(日本語) |
3.pop_2016 |
2016年10月1日時点での人口 |
4.pop_2021 |
2021年10月1日時点での人口 |
5.diff |
2011〜2021の人口増減率(%) |
6.geometry |
地図情報 |
df_jpn
を使って人口の多い都道府県を濃い緑で表示するマップを描いてみる%>%
df_jpn ggplot() +
geom_sf(aes(fill = pop_2021)) +
scale_fill_distiller(name = "人口",
palette = "Greens", # 任意の色を指定
direction = 1) +
labs(fill = "人口") +
theme_void(base_family = "HiraginoSans-W3", base_size = 9) +
ggtitle("都道府県別の人口規模(2021年10月1日)") +
theme(plot.title = element_text(size = 15))
factor
化してから、そのカテゴリーに応じて色塗りをするsummary(df_jpn$pop_2021)
Min. 1st Qu. Median Mean 3rd Qu. Max.
548562 1057844 1576074 2670279 2670336 14011487
stem()
関数を使って、pop_2021
の分布を確認するstem(df_jpn$pop_2021, scale = 2)
The decimal point is 6 digit(s) to the right of the |
0 | 5777888999
1 | 01111223333456788999
2 | 0023689
3 | 6
4 |
5 | 124
6 | 3
7 | 35
8 | 8
9 | 2
10 |
11 |
12 |
13 |
14 | 0
::datatable(df_jpn) DT
# 人口規模・都道府県別日本地図 (2021)
%>%
df_jpn mutate(pop_2021a = case_when(pop_2021 >= 8000000 ~ "800万人以上",
>= 5000000 ~ "500万人以上",
pop_2021 >= 2000000 ~ "200万人以上",
pop_2021 >= 1000000 ~ "100万人以上",
pop_2021 TRUE ~ "100万人未満"),
pop_2021a = factor(pop_2021a, ordered = TRUE,
levels = c(
"800万人以上",
"500万人以上",
"200万人以上",
"100万人以上",
"100万人未満"))) %>%
ggplot() +
geom_sf(aes(fill = pop_2021a)) +
labs(fill = "人口") +
theme_void(base_family = "HiraginoSans-W3", base_size = 9) +
ggtitle("都道府県別 人口規模(2021年10月1日)") +
theme(plot.title = element_text(size = 15))
# 人口増減・都道府県別日本地図 (2016-2021)
%>%
df_jpn ggplot() +
geom_sf(aes(fill = diff)) +
scale_fill_distiller(name = "人口増減(%)",
palette = "RdBu", # 任意の色を指定
direction = 1) +
labs(fill = "人口") +
theme_void(base_family = "HiraginoSans-W3", base_size = 9) +
ggtitle("都道府県別 人口の増減(2016年〜2021年)") +
theme(plot.title = element_text(size = 15))
library(tidyverse)
library(geofacet)
library(zipangu)
df_pop
)<- pins::board_url(
board c(df_pop = "https://raw.githubusercontent.com/uribo/220828ism_ws/main/df-ssdse-b/data.rds"))
<-
df_pop |>
board ::pin_download("df_pop") |>
pins::read_rds() readr
<- df_pop |>
df_pop mutate(population = population / 1000000)
::datatable(df_pop) DT
jp_prefs_grid1
)zipangu
}パッケージを使って都道府県情報をダウンロードする<-
jp_prefs_grid1 |>
jp_prefs_grid1 left_join(
::jpnprefs |>
zipanguselect(jis_code, prefecture = prefecture_kanji),
by = c("code_pref_jis" = "jis_code"))
::datatable(jp_prefs_grid1) DT
<- df_pop |>
plt_1 ggplot() +
aes(year, population) +
geom_line() +
theme_gray(base_size = 6,
base_family = "HiraKakuProN-W3",
+
) facet_geo(~ prefecture,
grid = "jp_prefs_grid1",
scales = "free_y") +
theme(axis.text.x = element_text(angle = 80, # 40度回転
vjust = 1,
hjust = 1)) +
ggtitle("都道府県別人口の増減(2008-2019)") +
theme(plot.title = element_text(size = 15))
plt_1
・縦軸の最大値が都道府県ごとに異なるので、解釈する際には注意が必要
例えば東京の人口の最大値は約1392万人、鳥取の最大値は約56万人
マップの保存
fig
フォルダを R プロジェクトフォルダ内に作る
作成したマップを fig
フォルダに保存する
ggsave("fig/plt_1.png", # 保存したい画像の名前を指定
# 作成した画像名(オブジェクト名)
plt_1, width = 45, # 画像の横サイズ
height = 45, # 画像の縦サイズ
units = "cm") # 画像サイズの単位を指定
# インチなら "in"
# ミリメートルなら "mm"
df_ldp_vs
)<- read_csv("data/hr96-21_ken.csv") hr
head(hr)
# A tibble: 6 × 23
year pref prefect…¹ ku kun wl rank nocand seito j_name gender name
<dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <chr> <chr>
1 1996 愛知 愛知県 aichi 1 1 1 7 新進 河村… male KAWA…
2 1996 愛知 愛知県 aichi 1 0 2 7 自民 今枝… male IMAE…
3 1996 愛知 愛知県 aichi 1 0 3 7 民主 佐藤… male SATO…
4 1996 愛知 愛知県 aichi 1 0 4 7 共産 岩中… female IWAN…
5 1996 愛知 愛知県 aichi 1 0 5 7 文化… 伊東… female ITO,…
6 1996 愛知 愛知県 aichi 1 0 6 7 国民… 山田浩 male YAMA…
# … with 11 more variables: previous <dbl>, age <dbl>, exp <chr>, status <dbl>,
# vote <dbl>, voteshare <dbl>, eligible <chr>, turnout <chr>,
# seshu_dummy <chr>, jiban_seshu <chr>, nojiban_seshu <chr>, and abbreviated
# variable name ¹prefecture
hr96_21.csv
は1996年に衆院選挙に小選挙区が導入されて以来実施された 9
回の衆議院選挙(1996, 2000, 2003, 2005, 2009, 2012, 2014, 2017,
2021)の結果のデータhr
に含まれる変数名を表示させるnames(hr)
[1] "year" "pref" "prefecture" "ku"
[5] "kun" "wl" "rank" "nocand"
[9] "seito" "j_name" "gender" "name"
[13] "previous" "age" "exp" "status"
[17] "vote" "voteshare" "eligible" "turnout"
[21] "seshu_dummy" "jiban_seshu" "nojiban_seshu"
hr
には 23 個の変数が入っている変数名 | 詳細 |
---|---|
year |
選挙年 (1996-2017) |
pref |
都道府県名(例:宮城) |
prefecture |
都道府県名(例:宮城県) |
ku |
小選挙区名 |
kun |
小選挙区 |
rank |
当選順位 |
wl |
選挙の当落: 1 = 小選挙区当選、2 = 復活当選、0 = 落選 |
nocand |
立候補者数 |
seito |
候補者の所属政党 |
j_name |
候補者の氏名(日本語) |
name |
候補者の氏名(ローマ字) |
previous |
これまでの当選回数(当該総選挙結果は含まない) |
gender |
立候補者の性別: “male”, “female” |
age |
立候補者の年齢 |
exp |
立候補者が使った選挙費用(総務省届け出) |
status |
候補者のステータス: 0 = 非現職、1 現職、2 = 元職 |
vote |
得票数 |
voteshare |
得票率 (%) |
eligible |
小選挙区の有権者数 |
turnout |
小選挙区の投票率 (%) |
seshu_dummy |
世襲候補者ダミー: 1 = 世襲、0 = 非世襲(地盤世襲 or 非世襲) |
jiban_seshu |
地盤の受け継ぎ元の政治家の氏名と関係 |
nojiban_seshu |
世襲元の政治家の氏名と関係 |
voteshare
) を都道府県
(prefecture
) ごとに平均する<- hr |>
df_ldp_vs filter(seito == "自民") |>
group_by(year, prefecture) |>
summarize(ldp_vs = mean(voteshare))
::datatable(df_ldp_vs) DT
jp_prefs_grid1
)zipangu
}パッケージを使って、都道府県情報をダウンロードする<-
jp_prefs_grid1 |>
jp_prefs_grid1 left_join(
::jpnprefs |>
zipanguselect(jis_code, prefecture = prefecture_kanji),
by = c("code_pref_jis" = "jis_code"))
::datatable(jp_prefs_grid1) DT
<- df_ldp_vs |>
plt_2 ggplot() +
aes(year, ldp_vs) +
geom_line() +
theme_gray(base_size = 6, base_family = "HiraKakuProN-W3") +
facet_geo(~ prefecture,
grid = "jp_prefs_grid1",
scales = "free_y") +
theme(axis.text.x = element_text(angle = 40, # 40度回転
vjust = 1,
hjust = 1)) +
ggtitle("総選挙での自民党候補者の得票率平均 (1996-2021)") +
theme(plot.title = element_text(size = 15))
plt_2
・縦軸の最大値が都道府県ごとに異なるので、解釈する際には注意が必要
例えば山口県の最大値は約73%、沖縄の最大値は約21%
マップの保存
fig
フォルダを R プロジェクトフォルダ内に作る
作成したマップを fig
フォルダに保存する
ggsave("fig/plt_2.png", # 保存したい画像の名前を指定
# 作成した画像名(オブジェクト名)
plt_2, width = 45, # 画像の横サイズ
height = 45, # 画像の縦サイズ
units = "cm") # 画像サイズの単位を指定
# インチなら "in"
# ミリメートルなら "mm"
Q6.1:
「2.1.4 都道府県人口別に日本地図を描く(2021年)
」を参考にして、2016年における
都道府県別の人口規模を色分けした日本地図を描きなさい。
Q6.2:
「3.2 総選挙での自民党得票率を時系列で表示
」を参考にして、1996年から2021年までの総選挙における、当選者(小選挙区当選者と復活当選者)の平均年齢を都道府県ごとに計算しなさい。
F@N Communications, Inc.
)
からご助言いただいた