第7回:データの可視化(2)

https://data-science-chiba-2024.github.io/day7/

連絡事項

  • オンデマンド回の課題と倫理教育e-learningの締め切りは 11月21日(木) です。
    • 早めの提出を心がけてください。

クイズ

注意: 質問は複数選択です。すべての正しい答えを選んでください。

クイズ中は質問に回答してください。他の行為(スライドの閲覧やRStudioの操作など)は禁止です。

今日のアウトライン

  • 前回のおさらい
  • データの可視化(2)
    • グラフにモデルを加える
    • グラフのラベルを整える
    • グラフの色を整える

前回のおさらい

  • ggplot2のggは「grammar of graphics」(「図の文法」)を意味します。
  • 図の文法:
    • グラフ中の要素とデータの紐付け(aesthetics)
    • 形状(geometry)

準備

  • 前回欠席した方は、Moodleから第7回のpenguins_analysis.zipをダウンロードして、デスクトップで解凍してください。
  • penguins_analysisプロジェクトを開き、その中のpenguins.Rを開きます。

  • パッケージとデータをロードします:

penguins.R
library(tidyverse)
library(palmerpenguins)

penguins
# A tibble: 344 × 8
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
   <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           NA            NA                  NA          NA
 5 Adelie  Torgersen           36.7          19.3               193        3450
 6 Adelie  Torgersen           39.3          20.6               190        3650
 7 Adelie  Torgersen           38.9          17.8               181        3625
 8 Adelie  Torgersen           39.2          19.6               195        4675
 9 Adelie  Torgersen           34.1          18.1               193        3475
10 Adelie  Torgersen           42            20.2               190        4250
# ℹ 334 more rows
# ℹ 2 more variables: sex <fct>, year <int>

目的:このグラフを作る

前回の最後に書いたグラフ

ggplot(
  data = penguins,
  mapping = aes(
    x = flipper_length_mm,
    y = body_mass_g,
    color = species
  )
) +
  geom_point()

前回の最後に書いたグラフ

ggplot(
  data = penguins,
  # グラフ中の要素とデータの紐付け
  mapping = aes(
    x = flipper_length_mm,
    y = body_mass_g,
    color = species
  )
) +
  geom_point()

前回の最後に書いたグラフ

ggplot(
  data = penguins,
  mapping = aes(
    x = flipper_length_mm,
    y = body_mass_g,
    color = species
  )
) +
  # グラフの形状
  geom_point()

モデルとは、データを予測する数式

  • 次に、データの関係を表すモデルを加えます。
  • 線形モデル(linear model)は、二つの変数の関係を一直線で表すモデルです。
  • \(y=ax+b\) という数式で表されます。

geom_smooth()で線形モデルを加える

ggplot(
  data = penguins,
  mapping = aes(
    x = flipper_length_mm,
    y = body_mass_g,
    color = species
  )
) +
  geom_smooth(method = "lm")

  • ただし、現在のモデルは種ごとになっています(それぞれに異なる傾きと切片があります)。

  • 今回の目的は、一つのモデルで全ての種をまとめることです。

colorを外すと、全ての種が同じモデルに含まれます

ggplot(
  data = penguins,
  mapping = aes(
    x = flipper_length_mm,
    y = body_mass_g
  )
) +
  geom_smooth(method = "lm")

geom_point()で元のデータを点で表現する

ggplot(
  data = penguins,
  mapping = aes(
    x = flipper_length_mm,
    y = body_mass_g
  )
) +
  geom_smooth(method = "lm") +
  geom_point()

そうか、色をまた戻さないと・・

ggplot(
  data = penguins,
  mapping = aes(
    x = flipper_length_mm,
    y = body_mass_g,
    color = species
  )
) +
  geom_smooth(method = "lm") +
  geom_point()

しまった、また種別ごとの線になった。どうすればよいか?

geom_()の中にmappingを指定する

ggplot(data = penguins) +
  geom_point(
    mapping = aes(
      x = flipper_length_mm,
      y = body_mass_g,
      color = species
    )
  )

aes()geom_()の中に入れることで、それぞれのgeom_異なるデータの表示方法を指定できます!

geom_()の中にmappingを指定する

ggplot(data = penguins) +
  geom_point(
    mapping = aes(
      x = flipper_length_mm,
      y = body_mass_g,
      color = species
    )
  ) +
  geom_smooth(
    mapping = aes(
      x = flipper_length_mm,
      y = body_mass_g
    ),
    method = "lm"
  )

でも、毎回書くのは手間がかかりますね・・

  • ggplot()の中にaes()を指定すると、それが全てgeom_()に適用されます

  • 共通するデータの表示方法だけをggplot()に記述すればOK!

共通の表示方法をggplot()に、その他はそれぞれのgeom_()に記述します:

ggplot(
  data = penguins,
  mapping = aes(
    x = flipper_length_mm,
    y = body_mass_g)
  ) +
  geom_point(aes(color = species)) +
  geom_smooth(method = "lm")

チャレンジ ①

種を点の形で表現してください。

レイヤーについて

  • +で追加するコードを「レイヤー」(layer)と呼びます
  • レイヤーには順序があります:下から上へと重ねていきます

チャレンジ ②

geom_point()のレイヤーとgeom_smooth()のレイヤーの順番を入れ替えてみてください。

グラフがどのように変化しましたか?

labsレイヤーでグラフのラベルを整える

  • 発表時には、図を誰にでも分かりやすくする必要があります
  • あなた(図を作った人)はflipper_length_mmが何を指しているか分かるでしょうが、見る人には分かりにくいことがあります

labsレイヤーでグラフのラベルを整える

  • 名前の作り方は使う人によって異なります:
    • flipper_length_mm:コードを書く人
    • Flipper length (mm):図を見る人
  • 解決策:元のデータの変数名(列名)は変更せずに、分かりやすいラベルをグラフの作成時に指定します

labsレイヤーでラベルを指定する

ggplot(
  data = penguins,
  mapping = aes(
    x = flipper_length_mm,
    y = body_mass_g)
  ) +
  geom_point(aes(color = species, shape = species)) +
  geom_smooth(method = "lm") +
  labs(
    x = "Flipper length (mm)"
  )

チャレンジ ③

縦軸のラベルを読みやすくしてください。

ラベルを整えたグラフ

ggplot(
  data = penguins,
  mapping = aes(
    x = flipper_length_mm,
    y = body_mass_g)
  ) +
  geom_point(aes(color = species, shape = species)) +
  geom_smooth(method = "lm") +
  labs(
    title = "Body mass and flipper length",
    subtitle = "Dimensions for Adelie, Chinstrap, and Gentoo Penguins",
    x = "Flipper length (mm)", y = "Body mass (g)",
    color = "Species", shape = "Species"
  )

色を整える

  • ラベルだけでなく、も誰にでも分かりやすくする必要があります
  • 世界人口の約4〜5%色覚異常を持つ(男性8%、女性0.5%)
  • ggplot2のデフォルトの色は色覚異常の方にとって識別が難しい場合があります
  • 色覚異常に配慮したカラーパレットを使用することが重要です

ggthemesの色を使う

  • ggthemesパッケージには色覚異常に配慮した色が含まれています
  • tidyverseには含まれていないので、インストールが必要です
install.packages("ggthemes")

library(ggthemes)

ggthemesの色を使う

ggplot(
  data = penguins,
  mapping = aes(
    x = flipper_length_mm,
    y = body_mass_g)
  ) +
  geom_point(aes(color = species, shape = species)) +
  geom_smooth(method = "lm") +
  labs(
    title = "Body mass and flipper length",
    subtitle = "Dimensions for Adelie, Chinstrap, and Gentoo Penguins",
    x = "Flipper length (mm)", y = "Body mass (g)",
    color = "Species", shape = "Species"
  ) +
  scale_color_colorblind()

完成!

グラフの保存方法

  • ggsave()でグラフをファイルに書き出す
ggsave("penguins.pdf")

グラフの保存方法

  • ファイルの拡張子を変えると、出力ファイルが自動的にそのファイル形式になる
ggsave("penguins.jpg")

文字化けを防ぐ方法

  • ggplot2のデフォルトフォントでは日本語が文字化けする可能性があります
ggplot(
  data = penguins,
  mapping = aes(
    x = flipper_length_mm,
    y = body_mass_g,
    shape = species)
  ) +
  geom_point(aes(color = species)) +
  geom_smooth(method = "lm") +
  labs(
    title = "ペンギンの体重および翼の長さ"
  ) +
  scale_color_colorblind()

showtextで日本語フォントを利用する

  • showtextパッケージを使用するとカスタムフォントが利用可能になります
  • tidyverseには含まれていないので、インストールが必要です
install.packages("showtext")

library(showtext)

showtextで日本語フォントを利用する

  • ggplot()の前にフォント設定を行います:
# Add a Japanese font
font_add_google("Noto Sans JP", "noto")
showtext_auto()

theme_()でフォントを指定する

font_add_google("Noto Sans JP", "noto")
showtext_auto()

ggplot(
  data = penguins,
  mapping = aes(
    x = flipper_length_mm,
    y = body_mass_g,
    shape = species)
  ) +
  geom_point(aes(color = species)) +
  geom_smooth(method = "lm") +
  labs(
    title = "ペンギンの体重および翼の長さ"
  ) +
  scale_color_colorblind() +
  theme_grey(base_family = "noto")

theme_()でグラフ全体のデザインを整える

ggplot(
  data = penguins,
  mapping = aes(
    x = flipper_length_mm,
    y = body_mass_g,
    shape = species)
  ) +
  geom_point(aes(color = species)) +
  geom_smooth(method = "lm") +
  labs(
    title = "Body mass and flipper length",
    subtitle = "Dimensions for Adelie, Chinstrap, and Gentoo Penguins",
    x = "Flipper length (mm)", y = "Body mass (g)",
    color = "Species", shape = "Species"
  ) +
  scale_color_colorblind() +
  theme_minimal()

他のtheme_()

ggplot2には以下のtheme_()が用意されています:

  • theme_grey() (デフォルト)
  • theme_bw()
  • theme_linedraw()
  • theme_light()
  • theme_dark()
  • theme_minimal()
  • theme_classic()
  • theme_void()

チャレンジ ④

他のテーマを試してみてください。どのテーマが好きですか?

ggthemesパッケージにはさらに多くのテーマがあります

まとめ

  • geom_smooth()でモデルを追加できる
  • +でレイヤーを増やす
  • labsでラベルを整える
  • scale_color_()でデータの色を整える
  • theme_()でグラフ全体のデザインを整える