R packages
library(DT)
library(gapminder)
library(gghighlight)
library(ggrepel)
library(stargazer)
library(tidyverse)
boxplot
)
は連続変数の分布を示す方法の一つ変数 | 可視化の方法 | 特徴 |
---|---|---|
連続変数 | 箱ひげ図 | ①中央値・四分位範囲・最小値・最大値情報が瞬時にわかる |
②グループの分布を1つのプロットの中で比較できる | ||
出典:浅野・矢内『Rによる計量政治学』p.107.
x
を作る<- c(10, 7, 9, 1, 0, 2, 5, 8, 3, 4, 6)
x x
[1] 10 7 9 1 0 2 5 8 3 4 6
x
を小さい方から順に並べるsort(x)
[1] 0 1 2 3 4 5 6 7 8 9 10
Base R
を使って x
の箱ひげ図を描いてみるboxplot(x)
<- read_csv("data/hr96-21.csv",
df na = ".")
ldp
) を作る<- df %>%
df mutate(ldp = if_else(seito == "自民", "自民党", "非自民党")) # 自民党ダミー (ldp) を作る
df
を使って、得票率 (voteshare
)
の箱ひげ図を描いてみるgeom_boxplot()
y
にも x
にもマッピングできるパイプ演算子(%>%
と
|>
) ・2021年5月リリースされた
R 4.1
以降、R
内蔵演算子としてパイプ演算子(|>
)が追加
・パイプ演算子は %>%
でも |>
でも、どちらを使っても結果は同じ
%>%
df filter(year == 2021) %>% # 2021年総選挙データだけに絞る
ggplot() +
geom_boxplot(aes(y = voteshare, x = seito)) +
labs(x = "政党", y = "得票率") +
ggtitle("政党ごとの得票率:2021年総選挙") +
theme_bw(base_family = "HiraKakuProN-W3")
color = ""
aes()
の「内側に」 color = "skyblue"
のように指定できる%>%
df filter(year == 2021) %>% # 2021年総選挙データだけに絞る
ggplot() +
geom_boxplot(aes(y = voteshare,
x = seito),
color = "skyblue") +
labs(x = "政党", y = "得票率") +
ggtitle("政党ごとの得票率:2021年総選挙") +
theme_bw(base_family = "HiraKakuProN-W3")
fill = ""
aes()
の「外側に」 fill = "skyblue"
のように指定するcolor = "skyblue"
とマッピングすると、箱内の色でなく、枠線の色が変更される%>%
df filter(year == 2021) %>% # 2021年総選挙データだけに絞る
ggplot() +
geom_boxplot(aes(y = voteshare,
x = seito),
fill = "skyblue") +
labs(x = "政党", y = "得票率") +
ggtitle("政党ごとの得票率:2021年総選挙") +
theme_bw(base_family = "HiraKakuProN-W3")
scale_fill_manual()
レイヤーを追加する%>%
df filter(year == 2021) %>% # 2021年総選挙データだけに絞る
ggplot() +
geom_boxplot(aes(y = voteshare,
x = seito,
fill = seito)) +
labs(x = "政党", y = "得票率") +
ggtitle("政党ごとの得票率:2021年総選挙") +
theme_bw(base_family = "HiraKakuProN-W3") +
theme(legend.position = "none")
scale_color_manual()
を使う%>%
df filter(year == 2021) %>% # 2021年総選挙データだけに絞る
ggplot() +
geom_boxplot(aes(y = voteshare,
x = seito,
color = seito)) +
labs(x = "政党", y = "得票率") +
ggtitle("政党ごとの得票率:2021年総選挙") +
theme_bw(base_family = "HiraKakuProN-W3") +
theme(legend.position = "none") +
scale_color_manual(values = c("N党" = "grey",
"れい" = "grey",
"公明" = "red",
"共産" = "grey",
"国民" = "grey",
"無所" = "grey",
"社民" = "grey",
"立憲" = "grey",
"維新" = "grey",
"自民" = "red",
"諸派" = "grey"))
gender
) を追加してみるaes()
の「内側に」 fill = "gender"
のように指定する%>%
df filter(year == 2021) %>% # 2021年総選挙データだけに絞る
ggplot() +
geom_boxplot(aes(y = voteshare,
x = seito,
fill = gender)) +
labs(x = "政党", y = "得票率") +
ggtitle("政党別・男女別の得票率:2021年総選挙") +
theme_bw(base_family = "HiraKakuProN-W3") +
theme(legend.position = "bottom")
aes()
の外側に
width
を指定する%>%
df filter(year == 2021) %>% # 2021年総選挙データだけに絞る
ggplot() +
geom_boxplot(aes(y = voteshare,
x = seito),
width = 0.25) + # 幅を 0.25 に設定
labs(x = "政党", y = "得票率") +
ggtitle("政党ごとの得票率:2021年総選挙") +
theme_bw(base_family = "HiraKakuProN-W3")
%>%
df filter(year == 2021) %>% # 2021年総選挙データだけに絞る
ggplot() +
geom_boxplot(aes(y = voteshare,
x = seito)) +
labs(x = "政党", y = "得票率") +
ggtitle("政党ごとの得票率:2021年総選挙") +
theme_bw(base_family = "HiraKakuProN-W3")
x
と y
を交換すれば縦長になる%>%
df filter(year == 2021) %>% # 2021年総選挙データだけに絞る
ggplot() +
geom_boxplot(aes(y = seito,
x = voteshare)) +
labs(x = "政党", y = "得票率") +
ggtitle("政党ごとの得票率:2021年総選挙") +
theme_bw(base_family = "HiraKakuProN-W3")
scale_y_discrete(limits = rev)
%>%
df filter(year == 2021) %>% # 2021年総選挙データだけに絞る
ggplot() +
geom_boxplot(aes(y = seito,
x = voteshare)) +
labs(x = "政党", y = "得票率") +
theme_bw(base_family = "HiraKakuProN-W3") +
ggtitle("政党ごとの得票率:2021年総選挙") +
scale_y_discrete(limits = rev)
|>
df filter(year == 2021) |>
group_by(seito) |>
summarize(ave_vs_2021 = mean(voteshare)) |>
::datatable() DT
ggplot()
に渡す前に seito
を
factor
化して、順番を決める
seito
を factor
化して図を描いてみる
%>%
df filter(year == 2021) %>% # 2021年総選挙データだけに絞る
mutate(seito = factor(seito,
levels = c("公明",
"自民",
"立憲",
"国民",
"維新",
"社民",
"無所",
"共産",
"れい",
"諸派",
"N党"))) %>% # N党の「N」は全角英字
ggplot() +
geom_boxplot(aes(y = seito,
x = voteshare)) +
labs(x = "政党", y = "得票率") +
ggtitle("政党ごとの得票率:2021年総選挙") +
theme_bw(base_family = "HiraKakuProN-W3")
平均値 (mean
) と中央値
(median
) ・箱ひげ図内の太い線は「中央値
(median
)」を表している
・ここでは政党の位置は「平均値
(mean
)」を基準として並べている
→ 平均値 (mean
) と中央値
(median
)は必ずしも一致するとは限らない
箱ひげ図は「グループごとに比較」することで、それぞれの変数の分布を素早く確認できる
2021年衆院選で最も平均得票率が高かった政党は公明党
視覚的に、ばらつきの最も大きいのは国民民主党
自民党と比べると、公明党のばらつきは小さい
N党、諸派、れいわ、公明党のばらつきは小さい
|>
df filter(year == 2021) |>
group_by(seito) |>
summarize(ave_sd_2021 = sd(voteshare)) |>
::datatable() DT
右に伸びる線の最先端・・・最大値
左に伸びる線の最先端・・・最小値
最大値より大きい値や、最小値より小さい値がある!!
→ 最先端の左右にあるドット「●」=
外れ値
箱ひげ図の最小値・・・「第1四分位点 - 1.5 × 四分位範囲
」より大きい値の中での最小値
箱ひげ図の最大値・・・「第1四分位点 + 1.5 × 四分位範囲
」より大きい値の中での最小値
これらの「最小値」や「最大値」に収まらないケース → 外れ値 して表示される
自民党には極端に大きな得票率の候補者(外れ値)が数人いる
これらの候補者の氏名を表示させてみる
%>%
df filter(year == 2021) %>% # 2021年総選挙データだけに絞る
filter(voteshare > 75) %>% # 得票率が 75% 以上の候補者だけに絞る
select(pref, kun, seito, age, voteshare, vote, j_name) %>%
head(10)
# A tibble: 10 × 7
pref kun seito age voteshare vote j_name
<chr> <dbl> <chr> <dbl> <dbl> <dbl> <chr>
1 宮崎 3 自民 56 80.7 111845 古川禎久
2 宮城 6 自民 61 83.2 119555 小野寺五典
3 群馬 5 自民 47 76.6 125702 小渕優子
4 広島 1 自民 64 80.7 133704 岸田文雄
5 香川 3 自民 53 79.8 94437 大野敬太郎
6 山口 2 自民 62 76.9 109914 岸信夫
7 山口 3 自民 60 76.9 96983 林芳正
8 秋田 3 自民 57 78.0 134734 御法川信英
9 石川 2 自民 47 78.4 137032 佐々木紀
10 鳥取 1 自民 64 84.1 105441 石破茂
fill = seito
を追加すれば、カラーで表示できる%>%
df filter(year == 2021) %>% # 2021年総選挙データだけに絞る
mutate(seito = factor(seito,
levels = c("公明",
"自民",
"立憲",
"国民",
"維新",
"社民",
"れい",
"共産",
"無所",
"N党",
"諸派"))) %>% # N党の「N」は全角英字
ggplot() +
geom_boxplot(aes(x = voteshare,
y = seito,
fill = seito)) +
labs(x = "政党", y = "得票率") +
ggtitle("政党ごとの得票率:2021年総選挙") +
theme_bw(base_family = "HiraKakuProN-W3") +
theme(legend.position = "none")
Q3.1:「2.2 箱ひげ図の色を変える
」の分析手法を使い、2009年総選挙における得票率を政党ごとに箱ひげ図を使って描きなさい
・その際、政党ごとに色をカスタマイズし、民主党候補者を
blue
、自民党候補者を red
それ以外の政党を
grey
にすること
Q3.2:
「2.4.4 政党名の表示順番をカスタマイズしたい場合
」の分析手法を使い、2009年総選挙における得票率を政党ごとに箱ひげ図を使って描きなさい
・その際、箱ひげ図の上から得票率の高い順に白黒で表示しなさい
Q3.3:
「2.4.4 政党名の表示順番をカスタマイズしたい場合
」の分析手法を使い、2009年総選挙において最も得票率の高かった民主党候補者の氏名・選挙区・年齢・得票率・票数の一覧を表示しなさい