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

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

1.5 練習問題の解答と解説

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

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

1.連続変数でファセットを作ったらどうなるか?

では、実際に連続変数であるctyを使ってグラフを書いてみましょう。

ggplot(data=mpg) + 
  geom_point(
    mapping = aes(x = drv, y=cyl)
    ) + 
  facet_wrap(~cty)

f:id:flying-spotted-garden-eel:20220225161757p:plain
とこのように連続変数の数だけグラフができます。

2. facet_grid(drv ~ cyl)のプロットの空白セルは何を意味するか。

次のプロットとどのように関係するか。

ggplot(data = mpg) + 
  geom_point(
    mapping = aes(x = drv, y = cyl)
    )

ということでまず例示されているグラフをプロットしてみましょう。
f:id:flying-spotted-garden-eel:20220227171900p:plain
5気筒の四駆や7気筒の四駆は存在していないことがわかります。
では、facet_grid(drv ~ cyl)を入れるとどうなるのでしょうか?

ggplot(data = mpg) + 
  geom_point(
    mapping = aes(x = drv, y = cyl)
  ) +
  facet_grid(drv ~ cyl)

f:id:flying-spotted-garden-eel:20220227172149p:plain
先ほどのグラフでプロットのないところは空欄のグラフになります。
また、7気筒のようにも元のグラフでどの駆動形式でもプロットがないところのファセットは表示されないことがわかります。

3. 次のコードはどんなプロットになるか。「.」は何を意味しているか。

ggplot(data = mpg) + 
  geom_point(
    mapping = aes(x = displ, y = hwy)
    ) +
  facet_grid(drv ~ .)

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

ggplot(data = mpg) + 
  geom_point(
    mapping = aes(x = displ, y = hwy)
    ) +
  facet_grid(. ~ cyl)

f:id:flying-spotted-garden-eel:20220227173057p:plain
コードとプロットを並べてみました。
前者はdrvに従って行で分割します。後者はcylに従って列で分割します。
ggplot2-book.org
このあたりの詳細は「ggplot2: Elegant Graphics for Data Analysis」にありますのでそちらを参照してください。

なお、「.」の役割ですが、

ggplot(data = mpg) + 
  geom_point(
    mapping = aes(x = displ, y = hwy)
    ) +
  facet_grid(~ cyl)

f:id:flying-spotted-garden-eel:20220228005021p:plain
のように「.」を省いても同じ図を書くことができます*1
実際はなくてもコードとしては機能するみたいなのですが、「.」のあるところは行や列に分けないと宣言しておいたほうが安全かもしれません。

4. ファセットを使うのは、色のエスティック属性を使うのと比べてどんな利点があるか。逆にどんな欠点があるか。データセットがもっと大きいと、それらはどう変わるだろうか。

ggplot(data = mpg) + 
  geom_point(
    mapping = aes(x = displ, y = hwy)
    ) + 
  facet_wrap(~ class, nrow = 2)

これはもう描いて比べてみましょう。
colourで分けた時のグラフはこうなります。

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

f:id:flying-spotted-garden-eel:20220228002950p:plain
f:id:flying-spotted-garden-eel:20220228003000p:plain
どっちが見やすい?
colourで分けた場合、どうしても点が重なり合ったりして見づらいというのと、色が多い分カラーでないとわかりづらいというのがあります。
特にモノクロの環境が求められる際に、colourで各車種を分けたグラフを使われると点の判別がきついと思うのでこれはfacetを使って分けたほうがグラフとしてはみやすいと思います。
もちろん、カラーが使える環境であれば、この程度の分類数であればcolourのほうが大雑把な雰囲気はつかみやすいかもしれません。

5. ?facet_wrapを読みなさい。nrowは何をするだろうか。ncolは何をするだろうか。他のオプションは個別パネルの配置にどう影響するのか。なぜfacet_grid()にはnrowやncolがないのだろうか。

問題が多いので区切ります

nrowは何をするだろうか。ncolは何をするだろうか。

nrowで指定した時は、
f:id:flying-spotted-garden-eel:20220228002950p:plain
のとおり2行になるように自動的にならべてくれます。
ncolで指定した時は、

ggplot(data = mpg) + 
  geom_point(
    mapping = aes(x = displ, y = hwy)
  ) + 
  facet_wrap(~ class, ncol = 2)

f:id:flying-spotted-garden-eel:20220228003738p:plain
のように2列に並びます。

facet_wrap()のオプションは個別パネルの配置にどう影響するのか。

17 Faceting | ggplot2の17.1に

You can control how the ribbon is wrapped into a grid with ncol, nrow, as.table and dir.

とあるようにncol, nrow以外にはas.tableとdirが配置に影響します。
as.tableは並び始めの始点を変え、dirは並べる方向を変えます。詳細は?facet_wrap()やリンク先の記事を確認してください。

なぜfacet_grid()にはnrowやncolがないのだろうか。

これは、17 Faceting | ggplot2の図17.1をみるとわかると思います。
facet_wrap()は一定方向へのグラフの並べ方を指定しています。
一方でfacet_grid()は二つの変数のレベルに合わせて自動的にグリッドを作って並べます。なので並べ方を指定する必要はありません。

6. facet_grid()を使うとき、レベルの多いほうを行の変数として使うのが普通です。なぜだろうか。

紙は長方形で、縦に使うことが多いことから、レベルの多いほうを縦に並べたほうが感覚的に見やすくなると思います。
一方でパワーポイントのスライドのような横方向に長い画面にfacet_grid()で作った表を並べるときは、逆にレベルの多いほうを列の変数としたほうが綺麗に並ぶような気がします。

*1:画像の使い回しじゃないよ、本当だよ