• このセクションで使っている R packages
library(DT)
library(gapminder)
library(gghighlight)
library(ggrepel)
library(stargazer)
library(tidyverse)

1. 散布図とは

  • 散布図 (scatter plot) は 2 つの連続変数(=間隔尺度、比率尺度で測定された変数)間の関係を調べる代表的な可視化方法
  • 散布図は 2 次元平面上に複数の点を可視化したもの
  • ここで使う幾何オブジェクトは ggplot()geom_point()
幾何オブジェクト 意味
ggplot() 図を描くキャンバスを用意する
geom_point() 散布図を描く
  • 1996-2021年総選挙データから、2014年データを抜き出し「選挙費用」と「得票率」の散布図を描いてみる

  • 必要なデータは次の 2 つ:

  1. 選挙費用 (exp)
  2. 得票率 (voteshare)
  • データを読み込む
  • hr96-21.csv をダウンロード
df <- read_csv("data/hr96-21.csv",
               na = ".")  
  • 2009年データを抜き出し df09 と名前を付ける
df09 <- df %>%
  filter(year == 2009)

1.1 最もシンプルな散布図

  • 横軸上の位置は x に、縦軸上の位置は y にマッピングする
  • 2 つの変数の間に原因と結果の関係(因果関係)が考えられる2変数の場合
    ・原因と考えられる要因を x 軸に設定(ここでは「選挙費用 exp」)
    ・結果と考えられる要因を y 軸に設定(ここでは「得票率 voteshare」)
df09 %>%
  ggplot() +
  geom_point(aes(x = exp, 
                 y = voteshare)) 

  • 横軸と縦軸のタイトルが exp, votehsare
  • 図を見る人にはこれらが何を意味するか分からない

1.2 ラベルとドットの色をカスタマイズ

  • x 軸と y 軸にラベルを付ける
  • ggtitle() 関数を使ってメインタイトルを付ける
  • ドットの色を指定する
df09 %>%
   ggplot() +
   geom_point(aes(x = exp, 
                  y = voteshare), 
              color = "royalblue") +
   labs(x = "選挙費用", 
        y = "得票率") +
  ggtitle("選挙費用と得票率の散布図: 2009年総選挙") +
  theme_bw(base_family = "HiraKakuProN-W3")

1.3 ドットの形をカスタマイズ

  • shape = 番号 でドットの形を指定できる
  • ここでは三角() に指定してみる
df09 %>%
   ggplot() +
   geom_point(aes(x = exp, 
                  y = voteshare), 
              color = "royalblue",
              shape = 2) +
   labs(x = "選挙費用", 
        y = "得票率") +
  ggtitle("選挙費用と得票率の散布図: 2009年総選挙") +
  theme_bw(base_family = "HiraKakuProN-W3")

  • ドットの形は次の 25 種類から選べる  
  • ドットの形のデフォルトは 19 の「

  • 0 〜 14 の場合・・・中身が透明で枠線のみの形
  • 枠線の色を変えたい場合・・・color 引数で調整
  • 15 〜 20 の場合・・・中身が埋まり枠線のない形
  • 中身の色も color で調整可能
  • 15 〜 25 の場合・・・枠線は color、内側の色塗りは fill で調整
shape = 22 を使い「内側がバイオレット」で「枠線がアクアマリン」の「」を表示させてみる  
df09 %>%
   ggplot() +
   geom_point(aes(x = exp, 
                  y = voteshare), 
              color = "violet",    # 枠線の色を指定 
              fill = "aquamarine", # 内側の色塗り指定
              shape = 22) +     # ドットの形を指定  
   labs(x = "選挙費用", 
        y = "得票率") +
  ggtitle("選挙費用と得票率の散布図: 2009年総選挙") +
  theme_bw(base_family = "HiraKakuProN-W3")

2. 次元の追加

  • 前節で作った散布図はexpvotehsare という 2 つの情報 (= 2 次元) をもつ
  • 散布図は情報の数(=次元)を拡大できる
  • ここでは if_else() 関数を使って民主党ダミー dpj を作成し、散布図に次元を追加してみる
  • aes() 関数の内側に shape = dpj と指定してみる

2.1 ドットの「形」を変えて次元追加

  • aes() の内側に shape = dpj と指定
    → 民主党候補者か否かでドットの形を変えることができる
df09 %>%
  mutate(dpj = if_else(seito == "民主", "民主党", "非民主党")) %>%
   ggplot() +
   geom_point(aes(x = exp, 
                  y = voteshare,
                  shape = dpj)) + # dpj をドットの形で区別
   labs(x = "選挙費用", 
        y = "得票率") +
  ggtitle("選挙費用と得票率の散布図: 2009年総選挙") +
  theme_bw(base_family = "HiraKakuProN-W3")

  • shape = dpj と指定すると、Rが自動的に「」と「」を割り当てる
  • じっくり見れば、民主党候補者とそれ以外を区別できるが、全体に占める民主党候補者の傾向がわかりにくい
    → ドットの形を指定してみる
    ・民主党・・・「」(空っぽのマル)
    ・非民主党・・・「×
  • scale_shape_manual() を使う
df09 %>%
  mutate(dpj = if_else(seito == "民主", "民主党", "非民主党")) %>%
   ggplot() +
   geom_point(aes(x = exp, 
                  y = voteshare,
                  shape = dpj)) + # dpj をドットの形で区別
   labs(x = "選挙費用", 
        y = "得票率") +
  ggtitle("選挙費用と得票率の散布図: 2009年総選挙") +
  theme_bw(base_family = "HiraKakuProN-W3")  +
  theme(legend.position = "bottom") + # レジェンドの位置を下に
  scale_shape_manual(values = c("民主党" = 1,    # 「○」は 1  
                                "非民主党" = 4))  # 「×」は 4  

  • 」と「」よりずっと見やすくなった

2.2 ドットの色を変えて次元追加

  • 全体に占める民主党候補者の傾向をさらに見やすくするためには
    → 色分けして表示してみる
  • aes() 関数の内側に color = dpj と指定してみる
df09 %>%
  mutate(dpj = if_else(seito == "民主", "民主党", "非民主党")) %>%
   ggplot() +
   geom_point(aes(x = exp, 
                  y = voteshare,
                  color = dpj,    # dpj を色分け
                  alpha = 0.5)) + # 透明度を追加  
   labs(x = "選挙費用", 
        y = "得票率") +
  ggtitle("選挙費用と得票率の散布図: 2009年総選挙") +
  theme_bw(base_family = "HiraKakuProN-W3") +
  theme(legend.position = "bottom") # レジェンドの位置を下に

  • 自民党から民主党に政権交代が起こった 2009 年総選挙では、民主党候補者の方がより多く得票している傾向がよく分かる

2.3 ドットの色を指定する

  • ドットを好みの色に指定したい場合
  • scale_color_manual() レイヤーを追加
  • 引数は values
  • c("値1" = "色1", "値2" = "色2", ...) のように名前を付け
    → character 型ベクトルを指定
df09 %>%
  mutate(dpj = if_else(seito == "民主", "民主党", "非民主党")) %>%
   ggplot() +
   geom_point(aes(x = exp, 
                  y = voteshare,
                  color = dpj,    # dpj を色分け
                  alpha = 0.5)) + # 透明度を追加  
   labs(x = "選挙費用", 
        y = "得票率") +
  ggtitle("選挙費用と得票率の散布図: 2009年総選挙") +
  theme_bw(base_family = "HiraKakuProN-W3") +
  theme(legend.position = "bottom") + # レジェンドの位置を下に
  scale_color_manual(values = c("民主党" = "blue",
                                "非民主党" = "gold"))

  • 自民党から民主党に政権交代が起こった 2009 年総選挙では、民主党候補者の方がより多く得票している傾向がよく分かる

  • ggplot2 で使える色は 657 種類!

  • "red""skyblue""royalblue"のように文字で指定できる

  • Rで使用可能な色のリストはコンソール上で colors() と打ち込むと確認できる

  • ここでは最初の 6 色を示す

head(colors())
[1] "white"         "aliceblue"     "antiquewhite"  "antiquewhite1"
[5] "antiquewhite2" "antiquewhite3"
  • これ以外にも RGBカラー(HEmathコード; 16進数)で指定することもできる
  • たとえば赤なら "#FF0000"、ロイヤルブルーなら "#4169E1"と表記
  • HEmathコードを使う場合 → 非常に細かく色を指定可能
    → 16,777,216 種類!!! の色が使える  
  • 以下の例は R で使える色の一部

3. 回帰直線を加えた散布図 (1)

  • 2009年総選挙における「選挙費用」と「得票率」の散布図に回帰直線を加えてみる
  • 回帰直線を加えるためには geom_smooth(method = lm) を加える
  • ggplot() の内側に aes() 関数を指定し、そこに x 軸、y 軸、color の設定をする
plot_vs_09 <- df09 %>%
   ggplot(aes(x = exp,
              y = voteshare,
              color = seito,
              alpha = 0.5)) + # ドットの透明度を指定
   geom_point() +     
  geom_smooth(method = lm) +   # 回帰直線を引く
   labs(x = "選挙費用", 
        y = "得票率") +
  ggtitle("選挙費用と得票率の散布図: 2009年総選挙") +
  theme_bw(base_family = "HiraKakuProN-W3")

plot_vs_09

  • facet_wrap() 関数を使って、政党ごとに見やすく表示してみる
plot_vs_09 +
  facet_wrap(~seito)    # 政党ごとに facet する