目次(まとめ)
◾️ Rのplotlyパッケージを使って散布図を色分けする
◾️ 次元圧縮の結果を特徴量の大きさによって色分けする
こんにちは、みっちゃんです。
今回の記事では、無料の統計解析ソフトウェアであるRをつかって散布図を描く際に、それぞれの点に連続的に変化するような色を割り当てて、ヒートマップのように表示する方法を紹介します(Rについてはこちらの記事をご参照ください)。
Rのplotlyパッケージを使って散布図を色分けする
ここでは、以下のように、正規分布にしたがう乱数を10個ずつ変数 "x" と "y" に保存して散布図にすることを考えます。
> x <- rnorm(10)
> y <- rnorm(10)
散布図をヒートマップのように色分けするために、"plotly" パッケージをインストールして使える状態にします。
> install.packages("plotly")
> library(plotly)
この "plotly" パッケージでは、データフレーム型のデータを取り扱うので、以下のように、データフレーム型の変数 "data" を準備します。
> data <- data.frame(x, y)
> data
x y
1 -0.99062837 -1.0032767
2 -0.74323922 1.7578982
3 0.05470839 -0.3100840
4 1.40402747 0.2827941
5 0.77926949 0.1458672
6 0.22671545 0.7865892
7 0.04208401 1.7374705
8 1.73918747 0.6613166
9 -0.10033588 0.5183486
10 2.12288393 -1.8416065
"data" 変数は、"x" の列と "y" の列に、それぞれ10個ずつの乱数が入っているようなデータフレームになっています。
以下のように実行すれば、その変数が何型なのか確認することができます。
> class(x)
[1] "numeric"
> class(y)
[1] "numeric"
> class(data)
[1] "data.frame"
"plotly" パッケージを使って散布図を描くためには以下のように "plot_ly" 関数を実行します。
> plot_ly(data, x = data$x, y = data$y, color = data$x, colors = c("green", "white", "red"))
この実行結果は、以下のようにブラウザ上に表示され、"color" で指定した "data" の "x" 列の値に沿って色分けされています。
ここでは、"x" の値の大小関係に基づき、緑色から赤色が割り当てられているので、横軸に沿って、緑から赤へと、点の色が変わっていることがわかります。
"colors" の指定は、例えば、"rainbow(12)" などに指定することも可能です(12という数字は色分けの細かさで、値を大きくするほど細かい色分けになります)。
また、以下のように実行しても、同じ結果を得ることができます。
> plot_ly(data, x = ~x, y = ~y, color = ~x, colors = c("green", "white", "red"))
次元圧縮の結果を特徴量の大きさによって色分けする
上の例では、2次元データの散布図を例にしましたが、多次元データに対する次元圧縮の結果を、任意の次元の値に応じて色分けすることも可能です。
ここでは、以前の記事と同様に、"mtcars" のデータを使って主成分分析(PCA)を実行して得られた次元圧縮の結果を使用します。
> data <- scale(mtcars)
> data.pca <- prcomp(data)
"mtcars" というデータセットは、さまざまな車について、以下のような11個の特徴量を集めたデータです。
> colnames(data)
[1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear"
[11] "carb"
ここでは、主成分分析(PCA)を行って得られた第1主成分、第2主成分をプロットして、それぞれの点を "mpg" の値で色分けしてみます。
まず、以下のようにデータフレーム "frame" を準備します。
> frame <- data.frame(data.pca$x[,1], data.pca$x[,2], as.data.frame(data)$mpg)
> names(frame) <- c("PC1", "PC2", "mpg")
このように実行すると、"frame" は以下のような中身になっています。
> head(frame)
PC1 PC2 mpg
Mazda RX4 -0.64686274 1.7081142 0.1508848
Mazda RX4 Wag -0.61948315 1.5256219 0.1508848
Datsun 710 -2.73562427 -0.1441501 0.4495434
Hornet 4 Drive -0.30686063 -2.3258038 0.2172534
Hornet Sportabout 1.94339268 -0.7425211 -0.2307345
Valiant -0.05525342 -2.7421229 -0.3302874
それぞれの車の名前に対して、第1主成分(PC1)、第2主成分(PC2)、mpg値が並んでいます。
このデータを使って、PC1とPC2の散布図を作成し、mpg値にしたがって色分けしてみます。
> plot_ly(frame, x = ~PC1, y = ~PC2, color = ~mpg, colors = c("green", "white", "red"))
この結果から、"mpg" 値が大きい車は第1主成分が小さい領域に分布し、"mpg" 値が小さい車は第1主成分が大きい領域に分布していることがわかります。