※資料作成は岩嵜航さん(東北大学)にご協力いただきました。

(左右キーで進みます!)

いよいよデータ解析の本番へ…

1. 課題を見つける/仮説を立てる

2. 実験や観察をしてデータを集める

3. データを整理する

4. データを解析して仮説を検証する


  • 整理されたデータを可視化する練習からはじめよう!

データを可視化するのはとても大事!

数値を羅列してもよくわからない…

  • よく用いられるのが平均値±エラーバー

けど平均値だけ見て可視化を怠ると構造を見逃すことも

  • 同じ平均値と分散を持つデータ(↓)

https://www.autodeskresearch.com/publications/samestats/

「いきなり棒グラフ」から卒業しよう!

平均値±分散ではなく、まず生データをプロットする!

  • Y軸
    • 調べたい値(応答変数/目的変数/従属変数)
    • 複数ある場合はグラフを並べたりすることも
  • X軸:Yのばらつきの原因となる値(説明変数/独立変数)
  • グラフの形もいろいろ…
    • 点…全ての情報を漏らさず眺められる。まずこれ。
    • 棒(平均±分散)…正規性のあるデータ以外では非推奨。
    • 箱ヒゲ…分散が偏っているデータならこれ?でも2峰型とかは表現できない。
    • バイオリン…いろんな分布が表現できる。でも中央値とかは表現できない。

ggplot2できれいなグラフを簡単に!

グラフの見せ方の検討もRでやると捗るよ!

ggplot2できれいなグラフを簡単に!

ggplot2とは

  • tidyverseパッケージ群の一つ
  • 単にいろんなグラフを「描ける」だけじゃない!
  • 「一貫性のある文法で合理的に描ける」パッケージ

ggplot2できれいなグラフを簡単に!

何がそんなに良いの?

  • レイヤー式のグラフ構成(設定を足していく+)
  • 直感的にグラフを描ける文法
  • 初期設定からグラフが美しい
  • x軸は列F, y軸は列A, 色は列F, サイズは列Aで!と書くだけ
  • 細かい設定はお好みで…

ggplot2を使ってみよう!

サンプルデータ(diamonds)を使ってグラフを描こう

library(tidyverse)                   #使う前にパッケージを読み込む
head(diamonds)                       #まずはdiamondsの中身を確認
## # A tibble: 6 x 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  0.23 Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
## 2  0.21 Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
## 3  0.23 Good      E     VS1      56.9    65   327  4.05  4.07  2.31
## 4  0.29 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
## 5  0.31 Good      J     SI2      63.3    58   335  4.34  4.35  2.75
## 6  0.24 Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
  • ダイアモンドに関するデータが入ってます!
  • 1行1個、各ダイヤの形質値(carat, cut, color…)が列ごとに

ggplot2を使ってみよう!

サンプルデータ(diamonds)を使ってグラフを描こう

  • carat(カラット)の分布を可視化しよう
gp = ggplot(data = diamonds) +       #diamondsを使ったグラフをgpに格納
     geom_histogram(aes(x = carat))  #グラフはヒストグラムでx軸はcarat
gp                                   #gpを見せて

ggplot2を使ってみよう!

文法を理解するために…

  • carat(カラット)を価格(price)に変えてみよう

ggplot2を使ってみよう!

文法を理解するために…

  • carat(カラット)を価格(price)に変えてみよう
gp = ggplot(data = diamonds) +       #diamondsを使ったグラフをgpに格納
     geom_histogram(aes(x = price))  #グラフはヒストグラムでx軸はprice
gp                                   #gpを見せて

ggplot2を使ってみよう!

文法(1)

  • aes(x =【X軸にしたい列名】, y = 【Y軸にしたい列名】)
    • X軸しか必要なければYは省略できる
  • aesはaesthetics(エステティックス, 美学)
  • X, Y軸を何にするかを考えるのが可視化の最も重要な一歩

ggplot2を使ってみよう!

[練習問題]

  • 深さ(depth)の分布を可視化しよう!
  • (次ページに答えがあります)

ggplot2を使ってみよう!

[練習問題]

  • 深さ(depth)の分布を可視化しよう!
gp = ggplot(data = diamonds) +       #diamondsを使ったグラフをgpに格納
     geom_histogram(aes(x = depth))  #グラフはヒストグラムでx軸はprice
gp                                   #gpを見せて

ggplot2を使ってみよう!

文法を理解するために…

  • ヒストグラム(histogram)を密度(density)に変えてみよう

ggplot2を使ってみよう!

文法を理解するために…

  • ヒストグラム(histogram)を密度(density)に変えてみよう
gp = ggplot(data = diamonds) +       #diamondsを使ったグラフをgpに格納
     geom_density(aes(x = price))    #グラフはヒストグラムでx軸は密度分布
gp                                   #gpを見せて

ggplot2を使ってみよう!

文法(2)

  • geom_【グラフのスタイル】
    • 棒グラフ(geom_col)
    • 箱ひげグラフ(geom_boxplot)
    • 2次元ヒートマップ(geom_bin2d)
    • ヒストグラム(geom_histogram)
    • エラーバー(geom_errorbar)
    • 地図(geom_map)
    • 散布図(geom_point)
    • 帯グラフ(geom_ribbon)    などなど…

ggplot2を使ってみよう!

ここまでの文法のまとめ

  • data = 【データフレームの名前】
  • geom_【グラフのスタイル】
  • aes(x =【X軸にしたい列名】, y = 【Y軸にしたい列名】)
gp = ggplot(data = AAA) + 
     geom_BBB(aes(x = XXX, y = YYY)) 
gp   

[練習問題]以下のグラフを描こう

  • データはdiamonds
  • スタイルは散布図(geom_point)
  • X軸はカラット(carat)、Y軸は価格(price)
  • 図はgp2に格納(gp2 = …で始める)
  • (次ページに答えがあります)

ggplot2を使ってみよう!

gp2 = ggplot(data = diamonds) +             #図をgp2に格納する
      geom_point(aes(x = carat, y = price)) #散布図で、X軸はcarat、Y軸はprice
gp2                                         #gp2を見せて                      

ggplot2を使ってみよう!

文法(3)色で値を表現する → aes(color = 【列】)

gp2 = ggplot(data = diamonds) +             #図をgp2に格納する
      geom_point(aes(x = carat, y = price, color = cut)) 
                     #散布図で、X軸はcarat、Y軸はprice、色はcut
gp2                                         #gp2を見せて                      

ggplot2を使ってみよう!

文法(3)色で値を表現する → aes(color = 【列】)

[練習問題]好きな値を色で表現しよう

 ヒント:前のコードをコピペして、color=【列】を変える

head(diamonds)                       #まずはdiamondsの中身を確認
## # A tibble: 6 x 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  0.23 Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
## 2  0.21 Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
## 3  0.23 Good      E     VS1      56.9    65   327  4.05  4.07  2.31
## 4  0.29 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
## 5  0.31 Good      J     SI2      63.3    58   335  4.34  4.35  2.75
## 6  0.24 Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48

ggplot2を使ってみよう!

numericな値を指定すると連続的な色に

gp2 = ggplot(data = diamonds) +             #図をgp2に格納する
      geom_point(aes(x = carat, y = price, color = carat)) 
                    #散布図で、X軸はcarat、Y軸はprice、色はcarat
gp2                                         #gp2を見せて                      

ggplot2を使ってみよう!

factorな値を指定すると離散的な色に

gp2 = ggplot(data = diamonds) +             #図をgp2に格納する
      geom_point(aes(x = carat, y = price, color = color)) 
                    #散布図で、X軸はcarat、Y軸はprice、色はcolor
gp2                                         #gp2を見せて                      

ggplot2を使ってみよう!

文法(4)グラフを分ける → + facet_wrap(~ 【列】)

gp2 = ggplot(data = diamonds) +             #図をgp2に格納する
      geom_point(aes(x = carat, y = price, color = color)) +
      facet_wrap(~ color)                   #colorごとにグラフを分ける
gp2                                         #gp2を見せて                      

ggplot2を使ってみよう!

文法(4)グラフを分ける → + facet_grid(【列】~ 【列】)

gp2 = ggplot(data = diamonds) +       #図をgp2に格納する
      geom_point(aes(x = carat, y = price, color = color)) +
      facet_grid(cut ~ color)         #cutとcolorごとにグラフを分ける
gp2                                   #gp2を見せて                      

ggplot2を使ってみよう!

文法(4)グラフを分ける → + facet_grid(.~ 【列】)

gp2 = ggplot(data = diamonds) +       #図をgp2に格納する
      geom_point(aes(x = carat, y = price, color = color)) +
      facet_grid(. ~ color)           #colorごとにグラフを分ける
gp2                                   #gp2を見せて                      

ggplot2を使ってみよう!

[練習問題]

  • facet_wrapを使ってcutごとにグラフを分けよう
  • facet_gridを使ってcutごとにグラフを分けよう

ggplot2を使ってみよう!

[練習問題]

gp2 = ggplot(data = diamonds) +       #図をgp2に格納する
      geom_point(aes(x = carat, y = price, color = color)) +
      facet_wrap( ~ cut)           #cutごとにグラフを分ける
gp2                                   #gp2を見せて                      

ggplot2を使ってみよう!

[練習問題]

gp2 = ggplot(data = diamonds) +       #図をgp2に格納する
      geom_point(aes(x = carat, y = price, color = color)) +
      facet_grid(. ~ cut)           #cutごとにグラフを分ける
gp2                                   #gp2を見せて                      

ggplot2を使ってみよう!

[練習問題]以下のグラフを描こう

  • データはdiamonds
  • スタイルは箱ひげ図(geom_boxplot)
  • X軸はカット(cut)、Y軸はカラット(carat)
  • cutごとに色を付ける
  • 図はgp3に格納(gp3 = …で始める)
  • (次ページに答えがあります)

ggplot2を使ってみよう!

[練習問題]以下のグラフを描こう

gp3 = ggplot(data = diamonds) +                           #図をgp3に格納する
      geom_boxplot(aes(x = cut, y = carat, color = cut))  #xはcut, yはcarat
gp3                                                       #gp2を見せて      

ggplot2を使ってみよう!

文法(5)テーマ(theme_)で全体の雰囲気を変える

gp3 = ggplot(data = diamonds) +                
      geom_boxplot(aes(x = cut, y = carat)) + 
      theme_classic()                  #テーマはクラシック
gp3                                                     

ggplot2を使ってみよう!

文法(5)テーマ(theme_)で全体の雰囲気を変える

  • 公式サイトにリストがある
  • theme_bw(白黒)
  • theme_dark(黒背景)
  • theme_minimal(シンプル)
  • theme_void(線なし)

ggplot2を使ってみよう!

文法(6)線を特定の色にする(aesの外で設定)

gp3 = ggplot(data = diamonds) +                
      geom_boxplot(aes(x = cut, y = carat), color = "red") + #線は赤
      theme_classic()                 
gp3                                                     

ggplot2を使ってみよう!

文法(6)箱を特定の色にする(aesの外で設定)

gp3 = ggplot(data = diamonds) +                
      geom_boxplot(aes(x = cut, y = carat), fill = "red") + #箱は赤
      theme_classic()                 
gp3                                                     

ggplot2を使ってみよう!

文法(6)箱を値に応じた色にする(aesの中で設定)

gp3 = ggplot(data = diamonds) +                
      geom_boxplot(aes(x = cut, y = carat, color = cut)) + #線の色はcut
      theme_classic()                 
gp3                                                     

ggplot2を使ってみよう!

文法(7)軸の範囲やタイトルを変える

gp3 = ggplot(diamonds) + 
geom_boxplot(aes(y = carat, x = cut, color = cut)) +
theme_classic() +
coord_cartesian(ylim = c(-1, 6)) +   
                      #直角座標(Cartesian coordinates)のy軸は-1から6まで
labs(title = "Diamonds", x = "Size (carat)", y = "Price (USD)")
                      #タイトルや軸のラベル(labs)を設定
gp3

ggplot2を使ってみよう!

文法(7)文字の大きさなどを細かく設定(theme)

gp3 = ggplot(diamonds) + 
geom_boxplot(aes(y = carat, x = cut)) +
theme_classic() + 
theme(axis.title.x = element_text(size = 20), #X軸のタイトル
      axis.title.y = element_text(size = 20), #Y軸のタイトル
      axis.text.x = element_text(size = 15, angle = 30, hjust = 1),
                                              #X軸の文字
      axis.text.y = element_text(size = 15)) #Y軸の文字
gp3

ggplot2を使ってみよう!

ggplot2を使ってみよう!

文法(8)図をファイルとして保存 ggsave()

ggsave("fig1.png", gp3, width = 4, height = 3, dpi = 300) 
  • 図のファイル名
  • 保存したい図を格納した変数
  • 図の幅
  • 図の高さ
  • 図の解像度

ggplot2のまとめ

こんなグラフを描きたいな

  • だいたいなんでもggplot2でできるよ

どうやるんだっけ

  • レイヤーを足す
    • pg = ggplot(でーた) + geom_なんとか(x, y) + theme_*()
  • 保存 ggsave()
  • 忘れるたびにググる。徐々に身につく。

ちゃんと描こうと思うと結構な長さになるね…

  • そうだけど、一度書いたプログラムはどこでも使い回せるよ!

Step 3:データを解析しよう