1章 ggplot2によるデータ可視化
1.0 ライブラリーの読み込み
1.1 はじめに
練習問題はありません。
1.2 第1ステップ
練習問題1 : ggplot(data = mpg)を実行しなさい。どうなるか。
ggplot()
は座標平面を表示する関数なので、何かが表示されるわけではありません。
練習問題2 : mtcarsには何行あるか。何列あるか。
基本的にはncol()
、nrow()
、dim()
などでデータフレームのサイズは確認できます。
他にも{glimpse}
パッケージのglimpse()
でも確認できます。
普通のやり方ではないので非推奨だけど、無理やり調べられなくもない。
練習問題3 : drv変数は何を記述するか。?mpgのヘルプを読んで見つけなさい。
drv
変数は、前輪、後輪、または四輪駆動に車を分類するカテゴリ変数です。
Variable | Content |
drv | f = front-wheel drive, r = rear wheel drive, 4 = 4wd |
練習問題4 : hwyとcylの散布図を作りなさい。
練習問題5 : classとdrvの散布図はどうなるのか。なぜプロットが役に立たないのか。
この散布図は、カテゴリカル変数とカテゴリカル変数の散布図なので、わずかな点しかプロットされず役に立たない。つまり、カテゴリの組み合わせが存在しているかどうかしかわかりません。
組み合わせ自体は下記の通りではあるが、drv
のカーディナリティは3で、class
のカーディナリティは7なので、組み合わせは21通りあるはずが12通りしかなく、存在していない組み合わせがあることがわかります。
その場合、{tidyr}
のcomplete()
を使うと、全ての組み合わせを補完できる。そして、geom_point(aes(size = n))
と指定すれば、組み合わせだけではなく、組み合わせ数の多さを「大きさ」で表現することが可能です。ここでは、組み合わせ数が0でも小さな点で表示されるようにしています。
組み合わせが21通りなので、丸の「大きさ」でも判断ができるが、組み合わせがどんどん増えると確認するのが辛くなるので、その時は「色の濃さ」で大小を判断できるヒートマップなどを使うのも一つのやり方として良いかもしれません。
1.3 エステティックマッピング
練習問題1 : このコードはどこがおかしいか。点が青くないのはなぜか?
実際にプロットすると、color = "blue"
と記述しているにも関わらず、点が赤くなります。これは、 aes()は、変数と値の間のマッピングを行う関数なので、colour = "blue"
は単一の値のみをとるカテゴリカル変数として解釈されます(これは色が青という意味ではく、カーディナリティが1のカテゴリカル変数というニュアンス)。なので、すべての点が赤色になります。colour = "1"
でも同様の結果です。
単色を使って点に色を付ける場合は、aes()
の外で行います。
練習問題2 : mpgのどれがカテゴリカル変数なのか。
もちろんtbl_df
データフレームをそのまま表示してもデータの型はわかるので、これでもよいと思います。
for-loop
で各カラムのデータ型を取得する方法でも良いが、これだと少し長いので{purrr}
を使うとシンプルに書けます。
{purrr}
のmap()
を使うとこんな感じです。
練習問題3 : 連続変数をcolor, size, shapeにマッピングしてみる。カテゴリカル変数と連続変数ではこれらのエステティック属性がどのように振る舞うか。
colorやsizeは問題ないですが、連続値がshapeにマッピングされると、エラーが発生します。小さい点が小さい値に対応し、カラースケールでは、どの色が大きく、その色が小さいと対応させることができますが、形状で大きいか小さいかは判断できません。
練習問題4 : 1つの変数に複数のエステティック属性をマップするとどうなるか。
色の濃さと丸の大きさで値の大小を表現することになりますが、いずれかがエステティック属性にマッピングされていれば充分です。
練習問題5 : エステティック属性のstrokeは何をするのか。
stroke
は、図形の境界線のサイズを変更します。これらは塗りつぶされた図形で、枠の色とサイズは図形の塗りつぶされた内部の色とサイズとは異なります。
練習問題6 : エステティック属性をaes(color = displ < 5)とするとどうなるのか。
エステティック属性には式を使って、マッピングすることが可能です。この場合、5よりも小さいものはTRUE
となり、それ以外がFALSE
となって色分けされます。
1.4 よくある不具合
演習問題なし
1.5 ファセット
練習問題1 : 連続変数でファセットを作るとどうなるのか。
連続変数はカテゴリカル変数に変換され、プロットはファセットごとに表示されます。
練習問題2 : facet_grid(drv ~ cyl)
の空のセルは何か?
facet_grid(drv ~ cyl)
の空のセルは何か?空のセルは、組み合わせがない場合の表示です。
練習問題3 : 次のコードはどのようなプロットになりますか?.
はなんですか?
.
はなんですか?drv ~ .
は、drv
の値でファセットを行方向に作ります。行分割 ~ 列分割
というイメージです。
練習問題4 : このセクションの最初のファセットプロットを再現してください。
練習問題5 : ?facet_wrap
を読み、nrow
とncol
はどう作用するのか調べなさい。
?facet_wrap
を読み、nrow
とncol
はどう作用するのか調べなさい。nrow(ncol)
は、ファセットをレイアウトするときに使用する行数と列数を決定します。
練習問題6 : facet_grid()
を使うとき、レベルが多い方を行にするべきなのはなぜでしょうか。
facet_grid()
を使うとき、レベルが多い方を行にするべきなのはなぜでしょうか。プロットが水平方向(横方向)にレイアウトされていると、比率が横長に保たれるため、通常のプロットを小さくしたように見ることができるから。列にカーディナリティが多い変数を使うと、列数が多くなり、縦長の親しみのないプロットになるためです。
1.6 幾何オブジェクト
練習問題1 : 折れ線グラフを作成するためには、どのような幾何オブジェクトを使用するのか。
基本的には、geom_line()
で問題ないと思いますが、層化プロットを作りたいのであれば、geom_area()
を使用します。
練習問題2 : 次のコードの出力を予想してください。
練習問題3 : show.legend = FALSE
は何をしているのか。
show.legend = FALSE
は何をしているのか。show.legend = FALSE
は 、凡例を非表示にしています。
練習問題4 : geom_smooth()
のse
は何をしているのか。
geom_smooth()
のse
は何をしているのか。標準誤差(Standard Error, SE)を表示するかどうかの引数です。
練習問題5 : この2つのグラフは違って見えるでしょうか?その理由はなんでしょうか?
geom_point()
とgeom_smooth()
は、同じデータのマッピングを使用するため、両方の見た目は同じです。ggplot()
にマッピングするための変数を入れておけば、何度も指定する必要はありません。
練習問題6 : 次のグラフを生成しなさい。
1.7 統計変換
練習問題1 : 関連付けられているデフォルトのgeom
はstat_summary()
でしょうか。?geom関数で書き換えることができますか?
geom
はstat_summary()
でしょうか。?geom関数で書き換えることができますか?質問で参照されている「前のプロット」は次のとおりです。デフォルトのgeom
はstat_summary()
です。geom_pointrange()
を使い、stat = "summary"
を使うことで再現できます。
練習問題2 : geom_col()
関数はgeom_bar()
は異なるデフォルト統計変換を持ちますか?
geom_col()
関数はgeom_bar()
は異なるデフォルト統計変換を持ちますか?geom_col()
関数はgeom_bar()
とは異なるデフォルトのstat
を持ちます。geom_col()
のデフォルトのstat
はstat_identity()
で、データをそのまま表示します。 geom_col()
関数は、x値とデータに棒の高さを表すy値が含まれることを前提とします。
geom_bar()
のデフォルトのstatはstat_bin()
です。geom_bar()
関数はx変数のみを期待します。stat
、stat_bin()
は、xの値ごとにサンプルのデータを数えることによって入力データを前処理します。yのエスティックはこれらの数の値を使います。
練習問題3 : ほとんどのgeoms
とstats
はペアになっています。ドキュメントを読み、すべてのペアのリストを作成してください。
geoms
とstats
はペアになっています。ドキュメントを読み、すべてのペアのリストを作成してください。geom | Stat |
geom_bar() | stat_count() |
geom_bin2d() | stat_bin_2d() |
geom_boxplot() | stat_boxplot() |
geom_contour() | stat_contour() |
geom_count() | stat_sum() |
geom_density() | stat_density() |
geom_density_2d() | stat_density_2d() |
geom_hex() | stat_hex() |
geom_freqpoly() | stat_bin() |
geom_histogram() | stat_bin() |
geom_qq_line() | stat_qq_line() |
geom_qq() | stat_qq() |
geom_quantile() | stat_quantile() |
geom_smooth() | stat_smooth() |
geom_violin() | stat_violin() |
geom_sf() | stat_sf() |
練習問題4 : stat_smooth()
は何を計算しますか。パラメタはどのようにふるまいますか。
stat_smooth()
は何を計算しますか。パラメタはどのようにふるまいますか。stat_smooth()
は下記のパラメタをもちます。
y
: 予測値ymin
: 下側信頼区間ymax
: 上側信頼区間se
: 標準誤差
練習問題5 : 100%棒グラフのgroup = 1
はなぜ必要なのでしょうか。
group = 1
はなぜ必要なのでしょうか。group = 1
が含まれていない場合、プロット内のすべてのバーは同じ高さ、1の高さになります。stat
はグループ内のカウントを計算するので、関数geom_bar()
はグループが値に等しいと見なされます。
1.8 位置の調整
練習問題1 : このプロットの問題点を何か。改善点を上げてください。
cty
とhwy
の組み合わせで複数の観測値があるため、点と点が重なっており、組み合わせのカウントが1の場合と、組み合わせのカウントが複数の場合に、大乗を判断できない。ジッターを使用してプロットを改善させるほうがよい。
練習問題2 : geom_jitter()
のジッター量を調整するパラメタはどれか。
geom_jitter()
のジッター量を調整するパラメタはどれか。練習問題1を参照してください。
width
: 垂直方向の移動量を制御します。height
: 水平方向の移動量を制御します。
練習問題3 : geom_jitter()
と geom_count()
を比較しなさい
geom_jitter()
と geom_count()
を比較しなさいgeom_jitter()
は点にランダムな変化を加えます。geom geom_count()
は、観測数に比例して点のサイズが決まります。
練習問題4 : geom_boxplot()
のデフォルトの位置調整は何か。
geom_boxplot()
のデフォルトの位置調整は何か。geom_boxplot()
のデフォルトは、position = "dodge"
です。何も指定しない場合、position = "dodge"
を指定した場合と 同じになります。
1.9 座標系
練習問題1 : 積み上げ棒グラフを、coord_polar()
で円グラフに変換しなさい。
coord_polar()
で円グラフに変換しなさい。角度で割合を表現する場合は、coord_polar(theta = "y")
を指定する。指定しない場合は、ブルズ・アイチャートがデフォルトで設定されている。
練習問題2 : labs()
は何をするのか。
labs()
は何をするのか。labs()
はタイトル、サブタイトル、軸の名前、キャプションを追加できます。
練習問題3 : coord_quickmao()
と coord_map()
は何が違うのか。
coord_quickmao()
と coord_map()
は何が違うのか。MapProjectionsのページによると下記の通り。
In general, map projections must account for the fact that the actual length (in km) of one degree of longitude varies between the equator and the pole. Near the equator, the ratio between the lengths of one degree of latitude and one degree of longitude is approximately 1. Near the pole, it tends towards infinity because the length of one degree of longitude tends towards 0. For regions that span only a few degrees and are not too close to the poles, setting the aspect ratio of the plot to the appropriate lat/lon ratio approximates the usual mercator projection. This is what coord_quickmap does, and is much faster (particularly for complex plots like geom_tile()) at the expense of correctness.
地図関係の知識が乏しいので、正確ではないかもしれませんが、coord_map()
は、メルカトル図法を使用して作図しますが、 coord_quickmap()
は、地球の曲率を無視し、近似的な緯度/経度比のマップを作図します。
練習問題4 : geom_boxplot()
のデフォルトの位置調整は何か。
geom_boxplot()
のデフォルトの位置調整は何か。coord_fixed()
は座標系を同じ比率に固定します。例えば、geom_abline()
が生成する角度を、視覚的に45度に見えるように座標比率を調整できます。
1.10 階層グラフィック図法
練習問題はありません。
最終更新