4. 第4回 データ可視化

open in colab

4.1. はじめに

前回の記述統計学では、データを手にした際に、どの様にデータの特徴を捉えるかを扱いました。

その際に、ヒストグラムや散布図、分割表等、視覚的にデータを捉える重要性を確認しました。

今回は統計学自体からは少し離れたトピックになりますが、データを可視化する方法について扱います。

前回の章でも、Rに元からある関数plothistboxplotを用いることで、簡単なグラフは作成出来ました。

しかし、第2章のRについての講義でも触れた様に、他者の作成したパッケージ(関数をまとめたもの)を利用することで、より綺麗なグラフを簡単に作成出来る関数を使用することが出来るようになります。

その代表例がggplot2というパッケージになります。

ggplot2_logo

ggplot2の公式ページ

ggplot2はHadley Wickhamによって開発されたデータ可視化のためのパッケージで、Rを使用する殆どのユーザーがグラフ描写に使用しているパッケージになります。

(Hadley WickhamはRstudioのチーフサイエンティスト・統計学者で、tydyverse等のパッケージを開発し、Rの普及に多大なる貢献をしています。)

研究室に配属された後、グラフ等を作成する機会は非常に増えるかと思いますが、その時にggplot2等を用いてグラフを作成出来る様になっておくと非常に役立ちます。

また、以降の講義でも一部のグラフの作成にはggplot2を使用する予定です。

そこで、本章ではggplot2の基本的な使い方を扱います。

4.2. ggplot2のインストール

ggplot2を使うにはggplot2をRへインストールする必要があります。

ただ、Google Colaboratoryでは、代表的なパッケージは既にインストールされているので今回はインストールする必要はありません。

もし自分のPCでRを動かしてggplot2を使用する場合にはinstall.packages関数でインストールする必要があります。

install.packages("インストールしたいパッケージ名")

[ ]:
# パッケージのインストール
install.packages("ggplot2")
Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)

4.3. ggplot2パッケージの読み込み

Rの基本の所でも扱いましたが、パッケージはインストールしただけでは使用できるようにはなりません。

library関数で必要なパッケージを明示的に読み込ませる必要があります。

library(パッケージ名)

パッケージの読み込みはRを起動する度に行う必要があります。

[ ]:
# パッケージの読み込み
library(ggplot2)

4.4. ggplot2による作図の基本

ggplot2を使用することで、散布図や棒グラフ、箱ひげ図等様々な図を作成できますが、

その使用方法は概ね下記の様な流れになります。

  1. ggplot関数にデータを渡し、どのデータを可視化するか指定する。例) x軸にどの値を使用するか、等。

  2. geom_xxx関数(geom_pointgeom_histogram等)で、自分が作りたい図(散布図なのかヒストグラムなのか…etc)の層 (layer) を加える。

  3. 軸ラベル (labs)や凡例 (legend)等、細かい設定を追加する。

  4. 図を表示・保存する。

ここからそれぞれについて見ていきます。

まずは前回使用したデータを用いて、草丈(Height)と葉身長(Leaf_length)の散布図を描くことを目標に進めていきます。

ggplot2ではplot関数とは異なり、データフレームの形式でデータを入力する形になります。

まずはread.csv関数でCSVファイルのデータをデータフレームとして読み込んでおきます。

read.csv("ファイルのURL/パス")

[ ]:
# サンプルデータをdfに読み込み
df <- read.csv("https://raw.githubusercontent.com/slt666666/biostatistics_text_wed/refs/heads/main/source/_static/data/chapter3_data.csv")
head(df)
A data.frame: 6 × 7
XFlowerResistanceAgeHeightLeaf_lengthLeaf_width
<chr><chr><chr><int><dbl><dbl><dbl>
1サンプル1YellowNormal 165.788277.8345661.2310844
2サンプル2PurpleWeak 126.705464.6540800.6596468
3サンプル3Blue Very strong1831.673946.6576420.5777713
4サンプル4Blue Very strong 241.595294.5305261.0155126
5サンプル5Blue Very strong 440.183886.6217760.5938072
6サンプル6Blue Very strong 428.851236.4525880.3979530

4.4.1. 1. データの指定

データを読み込んだら、まずはggplot関数でどのデータを使い、どの列のデータをグラフにするか指定します。

ggplot関数は

  • 1つ目の引数にデータフレームの名前

  • 2つ目の引数ではaes (aestheticsの略) という関数でデータフレーム内のどの列を何のために使うか

をそれぞれ指定します。例えばx軸とy軸にデータがある場合は…

ggplot(データフレーム名, aes(x=列名, y=列名)) # データの指定

今回は草丈(Height)をx軸、葉身長(Leaf_length)をy軸として散布図を作成します。

[ ]:
# グラフ化するデータの指定
g <- ggplot(df, aes(x=Height, y=Leaf_length))
g
../_images/notebooks_chapter4_11_0.png

データを指定しただけだと何のグラフを描くのか指定していないので、キャンバスだけが描写されているかと思います。

そこで次に指定したデータを用いてどんなグラフを描くのかを関数で指定します。

4.4.2. 2. グラフの種類の指定

使用するデータを指定したら、次は作図したいグラフに応じたgeometric objects(グラフのこと)を指定します。

geometric objectsには様々なものがありますが、例えば

  • geom_point:散布図

  • geom_line:折れ線グラフ

  • geom_smooth:平滑化されたグラフ

  • geom_bar:棒グラフ

  • geom_histogram:ヒストグラム

  • geom_polygon:ポリゴングラフ

  • geom_map:地図グラフ

  • geom_dotplot:ドットグラフ

等があります。

今回は散布図を描きたいので、geom_pointを使用します。

ggplotでは+でどんどん要素を追加していく形でコードを書いていきます。

先ほどggplot関数でデータを指定したところに+geom_point()を追加していきます。

g <- ggplot(データフレーム名, aes(x=列名, y=列名)) # データの指定
g <- g + geom_point()                              # グラフの指定

また、使用するグラフによってaes()の中で指定すべきものが変わります。

[ ]:
# 散布図を要素に追加
g <- ggplot(df, aes(x=Height, y=Leaf_length))
g <- g + geom_point()
g
../_images/notebooks_chapter4_14_0.png

描くグラフを散布図(geom_point)と指定したので、今度はキャンバスの上にx,yに指定したデータが使用された散布図が描かれました。

Rのplot関数で描いたものよりも何となく良い感じに見えるのではないでしょうか。

[ ]:
#参考(パッケージ無しの場合)
plot(df$Height, df$Leaf_length)
../_images/notebooks_chapter4_16_0.png

※一応、ggplot2もRのコードで作成されているので、plot関数のオプションや他のRに元々ある図形描写関数等を駆使すればggplot2で描くことが出来るグラフと全く同じものを作成する事は可能です。滅茶苦茶がんばれば。

4.4.3. 3. 軸ラベルなどの追加

基本的なグラフは先ほどのステップで描くことが出来ましたが、ラベルやタイトル等細かい部分の設定も同じように追加していくことが出来ます。

例えば今のままだと軸のラベルがHeightやLeaf_lengthとなっているので、その部分を変えてみます。ついでに図のタイトルも追加します。

labsでラベルやタイトルを編集することが出来ます。

g <- ggplot(データフレーム名, aes(x=列名, y=列名))                  # データの指定
g <- g + geom_point()                                               # グラフの指定
g <- g + labs(x="x軸ラベル名", y="y軸ラベル名", title="タイトル名") # ラベルなどの設定
[ ]:
# 軸のラベルとタイトルを付与
g <- ggplot(df, aes(x=Height, y=Leaf_length))
g <- g + geom_point()
g <- g + labs(x="Plant height (cm)", y="Leaf length (cm)", title="Scatter plot of plant height & Leaf length")
g
../_images/notebooks_chapter4_19_0.png

この様に、g <- g + 新しい要素や設定という形で、どんどんグラフにラベル等の設定や要素を追加していくことが出来ます。

当然、新しいグラフを追加し、1つのキャンバスに複数のグラフを描写することも可能です。

講義ではまだ扱っていませんが、散布図では回帰直線を描くことが多いです。

回帰直線はgeom_smoothというgeometric objectsになるので追加してみましょう。

g <- ggplot(データフレーム名, aes(x=列名, y=列名))                  # データの指定
g <- g + geom_point()                                               # グラフの指定
g <- g + geom_smooth(method = "lm")                                 # 回帰直線の追加
g <- g + labs(x="x軸ラベル名", y="y軸ラベル名", title="タイトル名") # ラベル等の設定

method = "lm"という部分で線形モデルを指定しています

[ ]:
# 散布図にgeom_smoothで回帰直線を追加
g <- ggplot(df, aes(x=Height, y=Leaf_length))
g <- g + geom_point()
g <- g + geom_smooth(method = "lm")
g <- g + labs(x="Plant height (cm)", y="Leaf length (cm)", title="Scatter plot of plant height & Leaf length")
g
`geom_smooth()` using formula = 'y ~ x'
../_images/notebooks_chapter4_22_1.png

この様な形で、g + geom_XXX()と足していくことで、複数の要素を描くことが可能です。

また、フォントサイズなども調整可能でtheme関数を用いて調整できます。

[ ]:
# フォントサイズを調整
g <- ggplot(df, aes(x=Height, y=Leaf_length))
g <- g + geom_point()
g <- g + geom_smooth(method = "lm")
g <- g + labs(x="Plant height (cm)", y="Leaf length (cm)", title="Scatter plot of plant height & Leaf length")
g <- g + theme(text = element_text(size = 18))
g
`geom_smooth()` using formula = 'y ~ x'
../_images/notebooks_chapter4_24_1.png

4.4.4. 4. 図を表示・保存する

Google ColaboratoryやR、Rstudioでも最後にgとすることで図を表示させることが出来ました。

これはplot(g)print(g)を省略している形になります。

g <- ggplot(df, aes(x=列名, y=列名)) # データの指定
g <- g + geom_point()                # グラフの指定
g                                    # plot(g)やprint(g)でも可

複数の図を作図するプログラムや、プログラムの途中で図を表示させたい場合には、print(g)等と明示しておくと分かりやすいでしょう。

また、作成した図を保存したい時にはggsave関数を使用します。

ggsave関数を使用することで図の幅・高さや画質等を指定して図を保存することが出来ます。

特に論文等に載せる図は、解像度300dpi以上が要求されることが多いです。

ggsave(filename = "保存した時のファイル名", plot = 図の変数, device = "png", dpi = 300)

他にもwidth=5, height=5の様な形で幅・高さを指定できます。

g <- ggplot(df, aes(x=列名, y=列名))                                             # データの指定
g <- g + geom_point()                                                            # グラフの指定
ggsave(filename = "保存した時のファイル名", plot = g, device = "png", dpi = 300) # 図の保存
[ ]:
# 作成した図の保存
g <- ggplot(df, aes(x=Height, y=Leaf_length))
g <- g + geom_point()
g <- g + geom_smooth(method = "lm")
g <- g + labs(x="Plant height (cm)", y="Leaf length (cm)", title="Scatter plot of plant height & Leaf length")
g <- g + theme(text = element_text(size = 18))
ggsave(filename = "figure.png", plot = g, device = "png", dpi = 300)
Saving 6.67 x 6.67 in image
`geom_smooth()` using formula = 'y ~ x'

以上の様に、必要な要素をどんどん加えていく形で、

基本的には 1. データを指定、2. グラフの指定(、3. ラベル等の調整、4. 図の保存)という流れでggplot2ではグラフを作成します。

4.5. 色を用いたデータの可視化

4.5.1. 散布図の色分け

先ほど描いた散布図は黒い点で全ての観測値を表示していましたが、データの種類に応じて色分けすることも可能です。

今回は花の色毎に点を色分けしてみます。

データの色分けは、geometric objects(散布図だとgeom_point)の引数でaes(colour=XXX)と指定します。

g <- ggplot(データフレーム名, aes(x=列名, y=列名))      # データの指定
g <- g + geom_point(aes(colour=色分けの基準とする列名)) # グラフの指定 & 色分けの指定
[ ]:
# データの色分け
g <- ggplot(df, aes(x=Height, y=Leaf_length))
g <- g + geom_point(aes(colour=Flower))
g
../_images/notebooks_chapter4_30_0.png

こうすることで花の色毎に点が色付けされ、データの特徴がより分かりやすくなります。

(※花の色と点の色が一致していないですが、scale_colour_identity等の関数を使用して色を決めることも出来ます。)

回帰直線を描くgeom_smoothでは、色分けを行うと各色毎に回帰直線を描いてくれます。

g <- ggplot(データフレーム名, aes(x=列名, y=列名))                       # データの指定
g <- g + geom_point(aes=(colour=色分けの基準とする列名))                 # グラフの指定 & 色分けの指定
g <- g + geom_smooth(method = "lm", aes=(colour=色分けの基準とする列名)) # 回帰直線の追加 & 色分けの指定
g <- g + labs(x="x軸ラベル名", y="y軸ラベル名", title="タイトル名")      # ラベルやタイトルの設定
[ ]:
# 回帰直線ごとに色分け
g <- ggplot(df, aes(x=Height, y=Leaf_length))
g <- g + geom_point(aes(colour=Flower))
g <- g + geom_smooth(method = "lm", aes(colour=Flower))
g
`geom_smooth()` using formula = 'y ~ x'
../_images/notebooks_chapter4_33_1.png

各花の色のデータ毎に回帰直線を描くことが出来ました。

このように、各geometric_objectsにおいて、aesの中でcolourhue等を指定すると、データを色分けしたり分けてグラフを描いたりすることが出来ます。

4.6. その他のグラフ

4.6.1. ヒストグラム

1次元データの記述統計の所で扱ったヒストグラムもggplot2で描くことが出来ます。

草丈(Height)でヒストグラムを描いてみましょう。

今回は草丈のデータしか用いないので、最初のggplot関数でどのデータをx軸,y軸で使用するかを指定するところでは、x軸のデータのみ指定すればOKです。

g <- ggplot(データフレーム名, aes(x=列名))

そして、散布図(geom_point)からヒストグラム(geom_histogram)へgeometric objectsを変更します。

g <- ggplot(データフレーム名, aes(x=可視化したい列名)) # データの指定
g <- g + geom_histogram()                              # グラフの指定
[ ]:
# ヒストグラムの描写
g <- ggplot(df, aes(x=Height))
g <- g + geom_histogram()
g
`stat_bin()` using `bins = 30`. Pick better value `binwidth`.
../_images/notebooks_chapter4_37_1.png

ヒストグラムでは、geom_histogramの引数でcolour=色を指定することで、枠組みの色を付けたり、

binwidth=幅でヒストグラムの幅の長さを指定することも出来ます。

g <- ggplot(データフレーム名, aes(x=可視化したい列名))    # データの指定
g <- g + geom_histogram(colour="色名", binwidth=幅の長さ) # グラフの指定
[ ]:
# ヒストグラムの枠組みの色、幅の長さを調整
g <- ggplot(df, aes(x=Height))
g <- g + geom_histogram(colour="black", binwidth=10)
g
../_images/notebooks_chapter4_39_0.png

ヒストグラムについても、先ほどの散布図と同様に、データを特定の指標で分けて複数のヒストグラムに色分けして描くことが可能です。

geom_histogramの引数でaes(fill=分ける指標の列名)を指定することで、分割できます。

g <- ggplot(データフレーム名, aes(x=可視化したい列名)) # データの指定
g <- g + geom_histogram(aes(fill=分ける指標の列名))    # グラフの指定
[ ]:
# ヒストグラムをデータごとに色分け
g <- ggplot(df, aes(x=Height))
g <- g + geom_histogram(aes(fill=Flower), alpha=0.75)
g
`stat_bin()` using `bins = 30`. Pick better value `binwidth`.
../_images/notebooks_chapter4_41_1.png

追加で平均値のところに直線を引いたりも出来ます。

縦に直線を引くにはgeom_vlineを使用します。

geom_vline(xintercept=直線を引くx座標, color="色名", linetype="線の種類")

g <- ggplot(データフレーム名, aes(x=可視化したい列名))                 # データの指定
g <- g + geom_histogram(aes(fill=分ける指標の列名))                    # グラフの指定
g <- g + geom_vline(xintercept=x座標, color="色名", linetype="dashed") # 垂直な線の追加
[ ]:
# 平均値の場所に直線を引く
g <- ggplot(df, aes(x=Height))
g <- g + geom_histogram(colour="black")
g <- g + geom_vline(xintercept=mean(df$Height), color="red", linetype="dashed")
g
`stat_bin()` using `bins = 30`. Pick better value `binwidth`.
../_images/notebooks_chapter4_43_1.png

4.6.2. 棒グラフ

ヒストグラムに似たグラフとして棒グラフもあります。

棒グラフのgeometric objectsはgeom_barになります。

今回は年齢(Age)の列のデータを棒グラフにしてみましょう。

g <- ggplot(データフレーム名, aes(x=可視化したい列名)) # データの指定
g <- g + geom_bar()                                    # グラフの指定
[ ]:
# 棒グラフを描写
g <- ggplot(df, aes(x=Age))
g <- g + geom_bar()
g
../_images/notebooks_chapter4_45_0.png

4.6.3. ボックスプロット(箱ひげ図)

データの代表値やばらつき具合を可視化するために良く用いられるのが、ボックスプロット(箱ひげ図)です。

ボックスプロットのgeometric objectsはgeom_boxplotになります。

この際、ggplot関数によるデータの指定でy軸にデータを指定すると縦にボックスプロットが描写されます。

(x軸にデータを指定すると、横向きになります)

g <- ggplot(データフレーム名, aes(y=可視化したい列名)) # データの指定
g <- g + geom_boxplot()                                # グラフの指定
[ ]:
# boxplotの描写
g <- ggplot(df, aes(y=Height))
g <- g + geom_boxplot()
g
../_images/notebooks_chapter4_47_0.png

また、ggplot関数でx軸、y軸両方のデータを指定すると、例えば花の色毎にボックスプロットを描くことも出来ます。

g <- ggplot(データフレーム名, aes(x=分類の基準となるデータの列名, y=可視化したい列名)) # データの指定
g <- g + geom_boxplot()                                                                # グラフの指定
[ ]:
# ボックスプロットを花の色ごとに分けて描写
g <- ggplot(df, aes(x=Flower, y=Height))
g <- g + geom_boxplot()
g
../_images/notebooks_chapter4_49_0.png

また、geom_boxplotで引数にaes(fill=色分けの基準となるデータ列名)aes(colour=色分けの基準となるデータ列名)と指定することで、色付けも可能です。

g <- ggplot(データフレーム名, aes(x=分類の基準となるデータの列名, y=可視化したい列名)) # データの指定
g <- g + geom_boxplot(aes(fill=色分けの基準とする列名))                                # グラフの指定 & 色分けの設定
[ ]:
# ボックスプロットの色分け
g <- ggplot(df, aes(x=Flower, y=Height))
g <- g + geom_boxplot(aes(fill=Flower))
g
../_images/notebooks_chapter4_51_0.png

ボックスプロットを描写する際に注意したいポイントとしては、ボックスプロットはあくまでも代表値(平均値)や4分位点等のデータを要約した値の情報しか得られません。

そのため、これらの要約した値の元データの点もプロットしておくとより良いボックスプロットとなります。

ジッタープロットと呼ばれるグラフになり、ggplot2ではgeom_jitterで追加可能です。

g <- ggplot(データフレーム名, aes(x=分類の基準となるデータの列名, y=可視化したい列名)) # データの指定
g <- g + geom_boxplot(aes(fill=色分けの基準とする列名))                                # グラフの指定 & 色分けの指定
g <- g + geom_jitter()                                                                 # ジッタープロットの追加
[ ]:
# ジッタープロットの追加
g <- ggplot(df, aes(x=Flower, y=Height))
g <- g + geom_boxplot(aes(fill=Flower))
g <- g + geom_jitter()
g
../_images/notebooks_chapter4_53_0.png

これで、要約した値やばらつき具合だけでなく、実際のデータがどの様に分布していたのかも捉えることが出来るグラフになります。

ボックスプロットを描く際には、ジッタープロットで元データのプロットも忘れないようにしましょう。

4.6.4. バイオリンプロット

先ほどのボックスプロットでは、データを要約した値を可視化していましたが、よりデータの分布を視覚的に強調したプロットがバイオリンプロットです。

バイオリンプロットのgeometric objectsはgeom_violinになります。

データの指定などはボックスプロットと概ね同じです。

g <- ggplot(データフレーム名, aes(x=分類の基準となるデータの列名, y=可視化したい列名)) # データの指定
g <- g + geom_violin(aes(fill=色分けの基準とする列名))                                 # グラフの指定 & 色分けの指定
[ ]:
# バイオリンプロットの描写
g <- ggplot(df, aes(x=Flower, y=Height))
g <- g + geom_violin(aes(fill=Flower))
g
../_images/notebooks_chapter4_56_0.png

バイオリンプロットだと、観察値の頻度が高い部分等の情報が可視化されています。

バイオリンプロットについてもボックスプロット同様に、元データをプロットしておきましょう。

g <- ggplot(データフレーム名, aes(x=分類の基準となるデータの列名, y=可視化したい列名)) # データの指定
g <- g + geom_violin(aes(fill=色分けの基準とする列名))                                 # グラフの指定 & 色分けの指定
g <- g + geom_jitter()                                                                 # ジッタープロットの追加
[ ]:
# ジッタープロットの追加
g <- ggplot(df, aes(x=Flower, y=Height))
g <- g + geom_violin(aes(fill=Flower))
g <- g + geom_jitter()
g
../_images/notebooks_chapter4_58_0.png

代表的なグラフをいくつか紹介しましたが、ggplot2ではその他にもたくさんのグラフを描画することが可能です。

以下のurlにRで描くことが出来る様々なグラフの詳細が書かれているので、一度見ておくと良いと思います。

https://www.r-graph-gallery.com/index.html

また、今日扱った関数を含めて、ggplot2で使用可能になる関数の細かい使い方は公式ドキュメントに載っています。

公式ドキュメント: https://ggplot2.tidyverse.org/reference/

チートシート: https://rstudio.github.io/cheatsheets/html/data-visualization.html

細かい解説書も無料でアクセス可能なので、これらの資料を必要に応じて使用してみてください。

解説書: https://ggplot2-book.org/

4.7. 課題

今回の課題は下の課題ページを実施し、Pandaのテスト・クイズに記述してください。

課題のノートブックへのリンク

[ ]: