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

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

1.7 練習問題の回答と解説

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

1. stat_summary()のデフォルトgeomは何か。stat関数ではなくgeom関数を用いて先ほどのコードを書き直すにはどうするか。

stat_summary()のデフォルトgeomは何か。

stat_summary()のhelpを見ると

stat_summary(
mapping = NULL,
data = NULL,
geom = "pointrange",
position = "identity",
...,
fun.data = NULL,
fun = NULL,
fun.max = NULL,
fun.min = NULL,
fun.args = list(),
na.rm = FALSE,
orientation = NA,
show.legend = NA,
inherit.aes = TRUE,
fun.y,
fun.ymin,
fun.ymax
)

とあるようにデフォルトのgeomは「pointrange」です。

stat関数ではなくgeom関数を用いて先ほどのコードを書き直すにはどうするか。

ggplot(data = diamonds) +
  stat_summary(
    mapping = aes(x = cut, y = depth),
    fun.ymin = min,
    fun.ymax = max,
    fun.y = median
  )

をgeom_pointrange()を用いて書き換えます。
この際、geom_pointrange()の引数statを指定せねばなりません。
statはどのように指定するかは
ggplot2-book.org
に記載があります。今回はsummaryを使います。
単純に

ggplot(data = diamonds) +
  geom_pointrange(
    stat = "summary",
    mapping = aes(x = cut, y = depth)
  )

とした場合、

となり、「No summary function supplied, defaulting to `mean_se()`」とエラーが出ます。
そこで、

ggplot(data = diamonds) +
  geom_pointrange(
    stat = "summary",
    mapping = aes(x = cut, y = depth),
    fun.min = min,
    fun.max = max,
    fun = median
  )

とfun.min、fun.max、funで最小値、最大値、中央値を指定すると

同じグラフができます。

2. geom_col()は何をするか。geom_bar()とどのように異なるか。

ggplot2.tidyverse.org
ggplotのhelpにもある通りどちらも棒グラフを書きます。
ただし、geom_bar()は棒の高さはデフォルトでは個数をstat_count()で数えることに対して、geom_colはyで与えられたデータの高さを表示します。

3. ほとんどのgeomとstatは対になっており、一緒に使われる。ドキュメントを読んでこれらの対のすべてのリストを作る。何が共通しているか。

ggplot2.tidyverse.org
を参考に表を作ってみました

geom stat
geom_bar()
geom_col()
stat_count()
geom_bin_2d() stat_bin_2d()
geom_boxplot() stat_boxplot()
geom_contour()
geom_contour_filled()
stat_contour()
stat_contour_filled()
geom_count() stat_sum()
geom_density() stat_density()
geom_density_2d()
geom_density_2d_filled()
stat_density_2d()
stat_density_2d_filled()
geom_function() stat_function()
geom_hex() stat_bin_hex()
geom_freqpoly()
geom_histogram()
stat_bin()
geom_qq_line()
geom_qq()
stat_qq_line()
stat_qq()
geom_quantile() stat_quantile()
geom_smooth() stat_smooth()
geom_violin() stat_ydensity()
coord_sf()
geom_sf()
geom_sf_label()
geom_sf_text()
stat_sf()

基本的に統計変換が行われるやつはgeomとstatが対になっているという理解で良さそうです。

4. stat_smooth()はどの変数を計算するか。振る舞いはどの引数が制御するか。

ggplot2.tidyverse.org
さて、公式のドキュメントを参照しましょう。
計算するのはaes()のyです。

5. 比率棒グラフでは、group=1に設定する必要がある。なぜか。言い換えると次の二つのグラフの問題は何か。

ggplot(data = diamonds) + 
  geom_bar(mapping=aes(x=cut, y=..prop..))

ggplot(data = diamonds) + 
  geom_bar(mapping=aes(x=cut, y=..prop..))


のようにcutの各パラメータをそれぞれ1つのグループとして認識しています。
なのでgroup=1を指定することで、

ggplot(data = diamonds) + 
  geom_bar(mapping=aes(x=cut, y=..prop.., group=1))


ggplot(data = diamonds) + 
  geom_bar(
    mapping=aes(x=cut, fill=color, y=..prop.., group=1)
  )


とこのようにcut全体に対する比率として比率棒グラフを描くことができますが、2つめのグラフのfill=colorが反映されていません。
比率棒グラフを書いて、その中の各要素の割合を描くのはなかなか単純な話ではなさそうです。