データのお砂場(150) R言語、diamonds、scaleを変えてみる{ggplot2}

Joseph Halfmoon

今回から ggplot2 パッケージです。ggplot2自体は「美麗な」グラフを描きたいときにお世話になってきたパッケージ。その中にもサンプル・データ・セットあり。当然、ggplot2 でグラフ化するためのデータです。今回使ってみるのは diamonds データセット。パッケージ付属の中では一番参照されているサンプル?

※「データのお砂場」投稿順Indexはこちら

※使用させていただいている Rのversionは 4.3.1。RStudioは 2024.04.2+764 “Chocolate Cosmos” です。

ggplot2

ggplot2は巨大なパッケージなので、使い方を解説するための専用のホームページが存在します。以下URLね。

ggplot2

なんで「gg」plotなんだ、とかねて疑問に思っていたのですが、上記ホームページを拝見すると The Grammar of Graphics という「知らないとモグリ」的な名著あり、GGらしいです。素人老人は当然モグリだったけど。

そして、「なんでも直ぐに忘れてしまう」この老人のためにか、要点を簡潔にまとめた「チート・シート」も以下に存在します。

https://github.com/rstudio/cheatsheets/blob/main/data-visualization.pdf

チートシート見たらggplot2でガンガン描けるようになりたいもんです。

素人老人が ggplot() を使う上での手順をかいつま差せていただくとこんな感じかと。

    1. データセットを指定する
    2. 美的マッピング指定する、aesによる
    3. レイヤ指定をする、geom_pointなど
    4. スケール指定をする、scale_colour_brewerなど
    5. ファセット仕様指定をする、facet_wrapなど
    6. 座標系指定をする、coord_flipなど

前の3つくらいの指定無にはグラフの描画ができないように思いますが、後の方は省略可だと思います。しかし、ggplot2のプロットの威力はその「美麗さ」加減にあるので、いろいろ指定したくなるのでないかと。

各指定は + で次々と重ねていけるし、途中の状態まで指定したものを変数に格納しておけるので、いろいろ変化をつけるときには便利。

diamonds

サンプルデータセットの解説ページが以下に。

Prices of over 50,000 round cut diamonds

合計 53940個のダイアモンド(装飾用)について、その諸元を並べたデータセットのようです。変数は以下の10種。

    1. price、USドル単位、ただし何時頃の価格かは不明。
    2. carat、重量カラット、1カラットは200mg
    3. cut、カットのグレード、ここではFair、Good、Very Good、Premium、Idealの5段階。後で述べる現在のGIAのグレードの呼び名とは異なる。
    4. color、カラーのグレード、ここではD(best)からJ(worst)まで、後で述べるGIAのグレードの現在はもっと多い。
    5. clarity、透明度のグレード、ここではI1(worst)、IF(best)まで、後で述べるGIAのグレードはより細かい?
    6. x、長さmm
    7. y、長さmm
    8. z、長さmm
    9. depth、深さのパーセンテージ。z / mean(x, y)
    10. table、「テーブル」のサイズの割合。テーブルはダイアモンド上面の平らな部分。最も幅の広い部分に対する比(ポイント)で示すみたい

流石にいろいろコマケー話があるので、御本家?『GIA』様の以下の記事(日本語)をご参照くだされ。

ダイヤモンドのカラット重量

ダイヤモンドのカット

ダイヤモンドのカラー

ダイヤモンドのクラリティ(透明度)

巨額のお金が動くだけに、ダイアモンドを評価するための「教育」専門機関があるのだねえ。上記をみるとなんでカラーグレードが「D」から始まるのかとかいろいろ書かれてます。

サンプル描画例

今回の diamonds データ・セットは、ggplot2の威力を示すために、非常に多数の関数のサンプルデータに使われてます。そこで自分じゃ何も考えずその中からいくつか見繕ってグラフを描いてお茶を濁すことにいたしました。前回まで、Hueとか色空間関係をやっていたのに引きずられ、まずは、scale_colour_hue関数のプロット例から。

set.seed(596)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ]
d <- ggplot(dsamp, aes(carat, price)) + geom_point(aes(colour = clarity))
d + scale_colour_hue(l = 70, c = 150)

ちなみにscale_colour_hue(l = 70, c = 150)の l はluminance(輝度)、c は彩度(chroma)です。横軸カラット(重量)、縦軸お値段($)のプロット結果が以下に。diamond_clarity_scale_colour_hue

clarityに美麗な各色割り当てできましたが、実際にはi1が一番ダメで、IFが一番良きものみたいです(ここでは、現在のGIAではもっとコマケー?)その順序関係が分かるように「色付け」変更してみました。

d + scale_colour_brewer()

この場合のプロットが以下に。diamond_clarity_scale_colour_brewer

上のグラフであるとより透明度の高いものが「濃い色」になってます、現物と逆か?でも、同じカラットなら透明度の高い奴のお値段が上にあるのが分かりますなあ。

さて、上記と軸を変えず、今度はカットのグレードをプロットしてみました。各点を「グリフ」形状であらわすscale_shape利用です。数を減らして再度サンプリングしてプロット。

dsamp2 <- diamonds[sample(nrow(diamonds), 100), ]
d1 <- ggplot(dsamp2, aes(carat, price)) + geom_point(aes(shape = cut))
d1 + scale_shape(solid = FALSE)

結果が以下に。

diamond_cut_scale_shape

カットが良いとやっぱりお高いのね。

さて最後にカットと透明度の組み合わせでどのくらいのケースがあるのか、ジッタ・プロットしてみたいと思います。

d2 <- ggplot(subset(diamonds, carat > 1), aes(cut, clarity)) + geom_jitter()
d2 + scale_x_discrete("Cut")

結果が以下に。

diamond_clarity_scale_x_discrete_Cutなんと言ったらよかろう?これにお金をウエイトにして積算したら結論は一目瞭然かも?知らんけど。

データのお砂場(149) R言語、max_chroma_table、{colorspace} へ戻る

データのお砂場(151) R言語、diamonds、facetで見方変更?{ggplot2} へ進む