空飛ぶチンアナゴの統計解析日記

統計解析を嗜むチンアナゴのメモ帳です

1.6 練習問題の解答と解説

f:id:flying-spotted-garden-eel:20220214200720p:plain

注意書き
当該記事には「Rではじめるデータサイエンス」のネタバレを多数含みます。
自分で回答することが一番の力になりますのでなるべく自力で回答するようよろしくお願いいたします。

1. 折れ線グラフを描くにはどのgeomを使うか。箱ヒゲ図では? ヒストグラムでは? 面グラフでは?

折れ線グラフ

f:id:flying-spotted-garden-eel:20220307141013p:plain

ggplot(
  data = mpg, 
  mapping = aes(x = displ, y = hwy)
  ) + 
  geom_line()

折れ線グラフでは

geom_line()

を使います。

箱ヒゲ図

f:id:flying-spotted-garden-eel:20220307141146p:plain

ggplot(
  data = mpg, 
  mapping = aes(x = displ, y = hwy)
  ) +
  geom_boxplot(
    mapping = aes(group = displ)
    )

と排気量ごとに分けた箱ヒゲ図はこのような形になります。
箱ヒゲ図では

geom_boxplot()

を使います。

ヒストグラム

f:id:flying-spotted-garden-eel:20220307142236p:plain

ggplot(
  data = mpg,
  mapping = aes(x = displ)
  ) + 
  geom_histogram(bins = 30)

ヒストグラム

geom_histgram

を使います。aesthetic属性のxに列を指定するとこのような表記となります。
ではyに列を指定するとどうなるか。
f:id:flying-spotted-garden-eel:20220307144200p:plain

ggplot(
  data = mpg,
  mapping = aes(y = hwy)
  ) + 
  geom_histogram(bins = 30)

とこのようにy軸から伸びるグラフになります。

面グラフでは?

f:id:flying-spotted-garden-eel:20220307171515p:plain

ggplot(
  data = mpg, 
  mapping = aes(
    x = displ,
    y = hwy
  )
) + 
  geom_area()

面グラフ(Area Chart)は

geom_area()

で表示します。
あんまり綺麗に作れなかったので、綺麗な作例はArea chart with R and ggplot2 – the R Graph Galleryを参照してください。

2. 次のコードを頭の中で実行して出力がどうなるか予想しなさい。それからRで実行して予測が正しかったかチェックしなさい。

ggplot(
  data = mpg, 
  mapping = aes(x = displ, 
                y = hwy, 
                color = drv)
  ) + 
  geom_point() + 
  geom_smooth(se = FALSE)

これは素直にインタプリターの気持ちになって頭から読んでいきましょう。
まず、最初のggplotではmpgというデータフレームから横軸にdipl、縦軸にhwdとするdrvで色分けでした座標空間を作ります。
次のgeom_point()では、読み込んだ座標空間に各drvで色分けされた散布図を作ります。
そして最後のgeom_smoothで各drv別の回帰直線を散布図に重ねます。
f:id:flying-spotted-garden-eel:20220307172025p:plain

3. show.legend = FALSEは何をしているのか。取り除いたら何が起こるのか。私がこれを使ったのはなぜか。

グラフの凡例を表示しなくなります。取り除くと凡例を表示します。
「私がこれを使ったのはなぜか。」については本文中でshow.legend = FALSEを使ったのは16Pの

ggplot(data = mpg) +
  geom_smooth(
    mapping = aes(x = displ, y = hwy, color = drv),
    show.legend = FALSE
  )

のグラフだけなので、そのグラフのことだけを考えればいいのでしょうか?
設問がはっきりしないのでよくわかりませんが、他の二つのグラフでは凡例がないので、それにあわせて表示しないことを選んだのだと思います。

4. geom_smooth()のse引数は何をしているのか。

Display confidence interval around smooth? (TRUE by default, see level to control.)

とあるように信頼区間を出します。
デフォルトは95%ですが、levelの引数を変えることで信頼区間の幅を調整できます。

5. 次の二つのグラフは同じかどうか。その理由は何か。

f:id:flying-spotted-garden-eel:20220307172732p:plain

ggplot(
  data = mpg,
  mapping = aes(x = displ, y = hwy)
  ) + 
  geom_point() + 
  geom_smooth()


f:id:flying-spotted-garden-eel:20220307172744p:plain

ggplot() + 
  geom_point(
    data = mpg, 
    mapping = aes(x = displ, y = hwy)
    ) + 
  geom_smooth(
    data = mpg, 
    mapping = aes(x = displ, y = hwy)
    )

ということで、この二つは全く同じグラフです。

# 6. 次のグラフを生成するコードを作りなさい

base = ggplot(
  data = mpg, 
  mapping = aes(x = displ, y = hwy)
  )

大元のコードとしてこれを宣言しておきます。
これに表示スタイル等を考えて足していきます。

1

f:id:flying-spotted-garden-eel:20220307173050p:plain

base + 
  geom_point() + 
  geom_smooth(
    formula = y ~ x,
    se = FALSE
    )

特にこれは難しくないと思います。
散布図のレイヤーを使って、その上に回帰直線を乗せるだけ。

2

f:id:flying-spotted-garden-eel:20220307173126p:plain

base + 
  geom_point() + 
  geom_smooth(
    mapping = aes(group = drv),
    formula = y ~ x,
    se = FALSE
  )

最初の図表から回帰直線を各駆動系ごとに書き直すにはどうしたらいいかを考えます。
なのでgeom_smooth()のところにaesthetic属性にgroup = drvを追加します。

3

f:id:flying-spotted-garden-eel:20220307173237p:plain

base + 
  geom_point(
    mapping = aes(colour = drv)
  ) +
  geom_smooth(
    mapping = aes(group = drv),
    formula = y ~ x,
    se = FALSE
  )

散布図もまたdrvで分けましょうということで散布図にも同様にaesthetic属性にcolour = drvを追加して色分けを行います。

4

f:id:flying-spotted-garden-eel:20220307174058p:plain

base + 
  geom_point(
    mapping = aes(colour = drv)
  ) +
  geom_smooth(
    formula = y ~ x,
    se = FALSE
  )

点の色は分かれますが、回帰直線は全体で1本のグラフです。

5

f:id:flying-spotted-garden-eel:20220307175955p:plain

base + 
  geom_point(
    mapping = aes(colour = drv)
  ) + 
  geom_smooth(
    mapping = aes(linetype = drv),
    formula = y ~ x,
    se = FALSE
  )

属性ごとに線の種類が変わります。
aesthetic属性のlinetypeで指定します。

6

f:id:flying-spotted-garden-eel:20220307184550p:plain

base + 
  geom_point(
    size = 4,
    colour = "white"
    ) +
  geom_point(
    mapping = aes(colour= drv)
  )

最後はなかなか難しい課題です。
以前に登場したstrokeではうまくいきません。
なので一旦全体を白の点で散布図を描いたのち、駆動系別に塗り分けた散布図のレイヤーを重ねるという手法を取っています。
なかなか自力では思い浮かばなかったので、
3 Data visualisation | R for Data Science: Exercise Solutions
の解答方法を参考にしました。
よく思い浮かんだなぁ。