RStudio - tidyverse, ggplot2を用いたデータ可視化の用例集

Googleデータアナリティックスプロフェッショナルを通したR言語の学習が完了しました。今回は、学習の途上で作成したtidyverse, ggplot2を用いたデータ可視化について纏めてみることにしました。

https://www.coursera.org

# R言語でデータ可視化

R言語ではデータの可視化には標準的にggplot2を使いますが、他にも可視化に役立つパッケージが多く配布されています。
- ggplot2
- plotly
- lattice
- RGL
- Dygraphs
- Leaflet
- Highcharter
- Patchwork
- gganimate
- ggridges

ggplot2の用例集には、公式サイトのGalleryをチェックするのが便利です。
https://exts.ggplot2.tidyverse.org/gallery/

## ggplot2の機能一覧

ggplot2を使えば棒グラフ・折れ線グラフ、散布図等々のプロットを描けるほか、プロットの内容をカスタマイズしラベル・軸などを操作することができます。また、パイプ演算子を使うことでデータ操作と可視化を同時に進行することができます。

- Aesthetics - オブジェクトの視覚的特性
- Geom - データを表現するのに用いる幾何学的なオブジェクト
- Facets - データの小グループ・サブセットごとにデータを表示する
- Labels and annotations - プロットの内容を記述する

今回はデータの分析の例題として著名な、アデリーペンギンの生態を研究したデータを用います。このデータはCRANに登録されているため、install.packages()を通してインストールすることができます。

https://allisonhorst.github.io/palmerpenguins/

# データ分析の準備
データ分析の準備として、まず分析にかけるデータ・分析に使うパッケージをインポートします。データがインポートできたら、まず以下の作業を行うようにしてます。
- データを要約（skim_without_charts）
- データのラベル名を表示（colname）
- データの要約統計量・度数を算出（summary）
- データの先頭5行を表示（head）
- データをペインに表示（view）

```r
library(tidyverse)
library(ggplot2)
library(palmerpenguins)
library(skimr)

library(ggExtra)
library(ggdensity)

#データの要約、データの要約統計量、先頭5行、データをペインに表示
skim_without_charts(penguins)
colname(penguins)
summary(penguins)
head(penguins)
view(penguins)
```
![スクリーンショット 2023-02-11 145714.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/a5e1c966-c934-b925-acdd-e289b00b8e0a.png)


# 注釈を表示
annotateを使うと注釈を図に表示することができます。注目するべき分布などをプレゼン時に強調したい時に使えます。
```r
#散布図を描く
ggplot(data=penguins) + 
geom_point(mapping=aes(x=flipper_length_mm, y=body_mass_g, color = species))+
annotate("text", x=220, y=3500, label="・The Gentoos are the largest.", fontface="bold", angle=25)
```
![スクリーンショット 2023-02-11 150115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/5ae3125c-4cb6-3877-e337-1aeb3ca818fa.png)

# 散布図・等高線図
散布図を描いたグラフをより視覚的にわかりやすくするには、分布の割合を表した等高線図と合わせるのが効果的です。散布図自体は、定量データと定量データの相関・関係を表したい時に使えます。

```r
#散布図に等高線を描く(別グラフ)
ggplot(penguins, aes(x=flipper_length_mm, y=body_mass_g)) + 
    stat_density2d(aes(alpha=..level.., fill=..level..), size=2, bins=10, geom="polygon") + 
    scale_fill_gradient(low = "yellow", high = "red") +
    scale_alpha(range = c(0.00, 0.8), guide = FALSE) +
    geom_density2d(colour="black", bins=10) +
　 geom_point(aes(shape=species, color=species), alpha=0.5, size=1) +
    facet_wrap(~species)
```
![スクリーンショット 2023-02-11 150703.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/5016a6da-ae6c-8200-bb5e-5651e4393923.png)

```r
#散布図に等高線を描く(同グラフ)
ggplot(penguins, aes(x=flipper_length_mm, y=body_mass_g)) + 
stat_density2d(aes(color=species, fill=species), geom="polygon", bins=10, alpha=0.1) +
geom_point(aes(shape=species, color=species), alpha=0.5, size=1) 
```
![スクリーンショット 2023-02-11 150443.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/1a329f6b-25f6-a6db-4d26-695f8a97a6a6.png)

```r
#散布図に等高線を描く(同グラフ、分布の度数を表す割合を表示する)
install.packages("ggdensity")
library(ggdensity)

ggplot(penguins, aes(x=flipper_length_mm, y=body_mass_g, fill = species)) +
  geom_hdr() +
  geom_point(shape = 21)
```
![スクリーンショット 2023-02-11 150523.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/aa35a8c4-efeb-6ea6-cd1d-101c71d36bdf.png)

# プロットサイズを使った可視化
```r
#x=羽の長さ、y=くちばしの長さ、プロットサイズで体重を表す
#プロットの形を変更することで3次以上のデータを表現できる
ggplot(penguins, aes(flipper_length_mm, bill_length_mm, size = body_mass_g, fill = species)) +
    geom_point(shape = 21) 
```
![スクリーンショット 2023-02-11 151839.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/c634e49e-45ed-9f0f-1693-175235e2e0a1.png)

```r
#グリッドごとに性別・種別ごとのデータを表示
ggplot(penguins, aes(flipper_length_mm, bill_length_mm, size = body_mass_g, fill = species)) +
    geom_point(shape = 21) + 
    facet_grid(sex~species)
```
![スクリーンショット 2023-02-11 151914.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/69f99386-0954-5be0-498e-daf4c0de0ea7.png)

# 平滑化曲線・近似曲線を使った可視化
```r
#平滑化曲線 - 平滑化・重回帰分析をした結果得られた係数をもとに近似曲線を描く。levelでは信頼水準の範囲を描写できる
#メソッド：lm-単回帰、gam-重回帰、loess-平滑化
ggplot(data=penguins, aes(flipper_length_mm, bill_length_mm)) +
geom_point(color = "red", alpha=0.5) + 
geom_smooth(level=0.9, method="loess")
```
![スクリーンショット 2023-02-11 152141.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/b05f7331-8f31-b51d-cff6-3bf68ab1ce87.png)

```r
#ペンギンの種類ごとに異なる近似曲線を描く
ggplot(data=penguins, aes(flipper_length_mm, bill_length_mm, linetype=species)) +
geom_point(color = "red", alpha=0.5) + 
geom_smooth(level=0.9, method="gam")
```
![スクリーンショット 2023-02-11 152337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/9fb86794-3aa1-b878-b7ff-6fd02f24182f.png)

# 棒グラフを使った可視化

```r
#棒グラフで可視化する。定性データの度数・割合を可視化するのに使う

ggplot(data=penguins) + 
geom_bar(aes(x=species, fill=sex), position="dodge")
```
![スクリーンショット 2023-02-11 152619.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/c940d2d8-2152-b0e6-156d-3de0c1588f0c.png)

# マージナルヒストグラムを使った可視化
マージナルヒストグラムを表示します。カテゴリー・軸ごとにどれ位値が分布しているかを可視化できます。分布の形状や、平均値などの値に有意差があるかを表したい時に使えます。
```r
library(ggExtra)
library(ggdensity)

mh_penguin <- ggplot(penguins, aes(flipper_length_mm, bill_length_mm, colour=species, fill=species)) + 
geom_point() +
geom_hdr_lines(xlim = c(100, 300), ylim = c(0, 100))

ggMarginal(mh_penguin, groupColour = TRUE, groupFill = TRUE)
```
![スクリーンショット 2023-02-11 153045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/61e31f10-75e0-8857-7b6b-ea3ee6efe034.png)