まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

Rではじめるデータサイエンス 演習1章① 2,3節

tidyverse系を思い出すためにHadley神の「Rではじめるデータサイエンス」の演習問題をやる。

Rではじめるデータサイエンス

Rではじめるデータサイエンス

ちなみに英語版はここで読める。

r4ds.had.co.nz

回答はここ

jrnold.github.io

1-2演習問題

1.ggplot(data = mpg)を実行しなさい。どうなるか。

ベースとなるレイヤーのみなので灰色の画像が描画される。
ここからgeom_xxなどでレイヤーを重ねてグラフを描画していく。 f:id:chito_ng:20190116090146p:plain

2.mtcarsには何行あるか。何列あるか。

length(mtcars) 
#>11

11行。

解答的にはncol。
まぁそっちのが明示的か。

nrow(mtcars)
#> [1] 32
ncol(mtcars)
#> [1] 11

3.drv変数は何を記述するか。?mpgのヘルプを読んで見つけなさい。

f = front-wheel drive, r = rear wheel drive, 4 = 4wd

4.hwyとcylの散布図を作りなさい。

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

f:id:chito_ng:20190116090113p:plain

city miles per gallonとhighway miles per gallonの散布図。 hwyの値限らずcylは一定

5.class対drvの散布図はどうなるか。なぜプロットが役に立たないか。

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

f:id:chito_ng:20190116090547p:plain

class, drvともにカテゴリ変数なので、単にclassとdrvのユニーク対応表になっている。

1.3演習問題

1.次のコードはどこがおかしいか。なぜ点が青になっていないのだろうか。

ggplot(data = mpg) + geom_point( mapping = aes(x = displ, y = hwy, color = "blue") )

エスティック属性(aes)内で文字列「color」の指定をしているだけ。
aes内では、変数への対応になるため、"blue" = 青色指定ではなく、全変数を単一文字列と対応(全てが"blue")を指定しているだけなので、"hoge"でも同じ図になる。

ggplot(data = mpg) +
  geom_point( mapping = aes(x = displ, y = hwy, color = "hoge") )

全体の色指定をしたい場合は、aes外で指定する。
この場合は、変数との対応ではなくgeo_point図自体のエスティック属性であり、単一。

ggplot(data = mpg) +
  geom_point( mapping = aes(x = displ, y = hwy), color = "blue") 

f:id:chito_ng:20190116091338p:plain

2.mpgのどれがカテゴリ変数か。どれが連続変数か(ヒント:?mpgと入力してデータセットのドキュ メントを読む)。mpgを実行した時、この情報がどのようにして得られるか。

f:id:chito_ng:20190116091732p:plain

mpgを実行すると、tibbleとして表示される。

3.連続変数をcolor, size, shapeにマップしてみる。カテゴリ変数と連続変数とでこれらのエステ ティック属性がどう振る舞いを変えるか。

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

f:id:chito_ng:20190116092438p:plain

displの数値がグラデーションで色がつく。
カテゴリ変数の場合以下。class毎に色が割り振られる。 f:id:chito_ng:20190116093058p:plain

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

f:id:chito_ng:20190116092521p:plain

displの数値に対応して大きくなる。
カテゴリ変数の場合以下。class毎に大きさが割り振られる。 f:id:chito_ng:20190116093153p:plain

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

=> Error: A continuous variable can not be mapped to shape

shapeは連続値には使えないそうな。 カテゴリ変数の場合以下。class毎に点の形が割り振られる。
ただし、6個までしか表示できないので7つめのclassは表示されない。 表示したい場合はどうやる?

4.1つの変数に複数のエステティック属性をマップするとどうなるか。

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

傾き1の描画がされる。

f:id:chito_ng:20190116093432p:plain

解答みると、解釈間違ってたようです。

ggplot(mpg, aes(x = displ, y = hwy, colour = hwy, size = displ)) +
  geom_point()

f:id:chito_ng:20190116182654p:plain

点の大きさがdispl、colorがhwyの数値の大きさを表す。 ただし、これは点に対して情報が複数付与されて直感的ではないのでバッドノウハウとのこと。

5.エステティック属性strokeは何をするか。どんな形に作用するか(ヒント:?geom_pointを使う)。

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

f:id:chito_ng:20190116093828p:plain

数値の大きさに応じて「点の縁の大きさ」が変わる。sizeと違って、カテゴリ変数の指定はできない。
連続値でのsizeとの違いとして、正確には「点の大きさ」ではなく、「点の縁の大きさ」が変わる。

6.エステティック属性を、aes(color = displ < 5)のように変数名以外にマップするとどうなる か。

ggplot(data = mpg) +
  geom_point( mapping = aes(x = displ, y = hwy, color = displ < 5))

f:id:chito_ng:20190116094053p:plain

displ < 5で、各変数に対応してTRUEかFALSEの判定がされて、判定毎に色が分かれる。