Part 1: R(ggplot2)や可視化の導入

1 Package

# install.packages("pacman") # pacmanパッケージのインストール
library(pacman)              # pacman パッケージの読み取り

p_load(tidyverse,            # データセットのハンドリング
       causaldata            # データセット集
       )

data(nhefs)                  #データの呼び出し

*Rのコードを実行する際は、コードをコピーしRStudioのスクリプトペインにペーストします。その後、指定の部分を選択した状態で、Command(Control)+ Enterキーを同時にクリックするとRのコードが実行されます。

2 tidyなデータの作成について

可視化の実践に進む前に、Rでも他の統計解析ソフトと同様に、データ処理(変数の作成・選択など)が必要となります。今回は、tidyverseというパッケージ群を使用して処理しています。

本セミナーの趣旨と時間の都合上、tidyversedplyrtidyr)については、下記のウェブサイトや書籍を参考にしてください。

2.1 tidyverseに含まれるパッケージ

パッケージ名 機能
ggplot2 グラフィックスを作成するためのパッケージ
dplyr データ操作、抽出、加工のためのパッケージ
tidyr tidyなデータを作成、操作するためのパッケージ
readr ファイルを柔軟に読み込むためのパッケージ
purrr 関数型プログラミングを実現するためのパッケージ
tibble データ構造tibbleを作成、操作するためのパッケージ
stringr 文字列を容易に、柔軟に操作するためのパッケージ
forcats factor型のデータを柔軟に操作するためのパッケージ
magrittr パイプ (%>%) 演算子1の機能を提供するパッケージ

2.2 ウェブサイト

2.3 書籍

3 ggplot2

3.1 ggplot2とは

開発者であるHadley Wickhamが提唱した「grammar of graphics」という可視化の概念に基づいて作られたパッケージです。

このggplot2では、「レイヤーを重ねる」ことで作図をしています。イメージも湧かないと思うので、実際の事例で確認してみましょう。

3.2 基本コマンド

一番基本的なコマンドは、次のようなものになります。ggplot()では、使用するデータセットと変数を指定します。今回はデータセットがnhefs、変数が収縮期血圧sbpと拡張期血圧dbpです。

この状態では、何も描かれていない背景だけが用意されます。ここにどんどんとコマンドでグラフに関する指示を重ねていきます。

ggplot(nhefs, aes(x = sbp, y = dbp))

3.3 基本コマンド+追加コマンド1

データを指定した上で、次のレイヤーを追加するために、+記号を使用します。今回は散布図を描くので、geom_point()を使用します2

ggplot(nhefs, aes(x = sbp, y = dbp)) +
    geom_point()

描画するグラフの種類とコマンドには、次のようなものがあります。

グラフの種類 コマンド
折れ線グラフ geom_line()
面グラフ geom_area()
ヒストグラム geom_histogram()
密度プロット geom_density()
箱ひげ図 geom_boxplot()
ドットプロット

geom_dotplot()

geom_jitter()

棒グラフ geom_bar()
散布図 geom_point()

3.4 基本コマンド+追加コマンド2

描いたプロットについて、編集してみます。#の後には、メモを残すことができます。各引数3についてはこちらのコメントを参照してください。

まずは、geom_point() の点の大きさと透過度を変更してみます。

ggplot(nhefs, aes(x = sbp, y = dbp)) +
   geom_point(size = 3,        # 点のサイズ変更
              alpha = 0.6)     # 透過度(0: 透明〜1: 不透明)

3.5 基本コマンド+追加コマンド3

今度は、同じく geom_point() 内で点の形と色の変更を行ってみます。形の指定については、こちらを参照してください4

今回は、枠線と塗りつぶしの色を分けるために、shape = 21 と指定します。

ggplot(nhefs, aes(x = sbp, y = dbp)) +
   geom_point(size = 3,        # 点のサイズ変更
              alpha = 0.6,     # 透過度(0: 透明〜1: 不透明)
              shape = 21,      # 形の指定
              fill = "Red",    # 塗りつぶし色の指定
              color = "Black") # 枠線の色の指定

3.6 基本コマンド+追加コマンド4

次に、背景の体裁を変更したいと思います。ここでは、theme_bw()を新しい層に加えていきます。これもいくつかのタイプがあるので、自分で好きなものを指定しましょう5

ggplot(nhefs, aes(x = sbp, y = dbp)) +
   geom_point(size = 3,
              alpha = 0.6,
              shape = 21,
              fill = "Red",
              color = "Black") +
   theme_bw()                     # 背景の変更

3.7 基本コマンド+追加コマンド5

最後に、軸の体裁を変更したいと思います。theme()を新しい層に加え、その中で軸のタイトルとテキストのフォントサイズを変更します。

さらに、labs()も新しく加えて、軸のタイトルを定義します。

ggplot(nhefs, aes(x = sbp, y = dbp)) +
   geom_point(size = 3,
              alpha = 0.6,
              shape = 21,
              fill = "Red",
              color = "Black") +
   theme_bw() +
   theme(axis.title = element_text(size = 24), # 軸タイトルの設定
         axis.text = element_text(size = 20)   # 軸テキストの設定
         ) +
   labs(x = "SBP (mmHg)", y = "DBP (mmHg)")  # 軸タイトルの指定

このように、多くのレイヤーを重ねていくのがggplot2の醍醐味であり、これが自由度の高い可視化に繋がっています。

4 【練習】散布図描いてみよう!

nhefs データにある1971年の体重と血中コレステロール濃度を使用して、散布図を描いてみましょう。

細かい設定は、下記に示すものとします。それ以外は自由です。

  • ポイントのサイズ:2

  • 透過度:0.5

  • 軸タイトルのサイズ:20

  • 軸テキストのサイズ:18

  • X軸のラベル:Weight in 1971 (kg)

  • Y軸のラベル:Serum cholesterol (mg/100ml)

Code
ggplot(nhefs, aes(x = wt71, y = cholesterol)) +
     geom_point(size = 3,
                alpha = 0.5,
                color = "#008b8b") +
     theme_classic() +
     theme(axis.title = element_text(size = 20), 
           axis.text = element_text(size = 18)) +
     labs(x = "Weight in 1971 (kg)", y = "Serum cholesterol (mg/100ml)")

5 書籍

Footnotes

  1. 最近は|>と書くこともあります。↩︎

  2. 欠測が含まれるデータなので、Warning message: Removed 81 rows containing missing values (geom_point). という注意メッセージが出ますが、特にここでは気にしなくても大丈夫です。↩︎

  3. 引数とは、Rの関数の内部で設定するオプションのようなものです。可視化に関する関数であれば、図形の色や形を変えたり細かく編集する重要な役割を果たします。↩︎

  4. https://ggplot2.tidyverse.org/articles/ggplot2-specs.html#point↩︎

  5. https://ggplot2.tidyverse.org/reference/ggtheme.html#ref-examples↩︎