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

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

1.7の練習問題で詰まっています

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

これなんだけど、?stat_summary()で調べてもこれといって参考になる回答が出てこないので困る。

ggplot2-book.org
ggplot2のいつもの本を見ても

stat_summary(): summarise y values at distinct x values.

と書いてあるだけ?
どういうこっちゃと悩みながら、今に至ります。

R for Data Scienceの練習問題は明らかに本文やhelpに書いてないようなことまで聞いてくるので困ります。

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
の解答方法を参考にしました。
よく思い浮かんだなぁ。

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:画像の使い回しじゃないよ、本当だよ

1.3 練習問題の解答と解説

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

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

続きを読む

1.2 練習問題の解答と解説

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

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

続きを読む

そういえばSTATAの公式チャンネル

www.youtube.com
意外と歴史は長く最初の動画は2012年に投稿されている。
www.youtube.com
これが最初の動画みたい。
しかし、STATA12.1がもう10年前かと思うと思えば遠くに来たものである。