Tidytuesdayから見てみるggplot2によるデータ可視化

:::note info
この記事は、Tokyo.R第98回R勉強会@東京で発表した資料をWeb公開用に再編したものです。
:::

# どうやってデータからグラフを作るか？
![Tokyo.Rスライド 素材用1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/e28a6db6-4f96-8778-a6e2-741f38d154f0.png)

この記事では、<font color=#e9546b><b>自分がデータを手に入れたときにggplot2でデータを可視化していく過程を、Tidytuesdayの課題を例として記してみます</font></b>。
流れとしては、

- <font color=#38a1db><b>Tidytuedayについての説明</b></font>
- <font color=#38a1db><b>データを入手してから図を完成させるまでのプロセスを分解して解説</b></font>

と順を追って説明します。
筆者のコードと作図例はこちらから　→　https://github.com/ocean-v/my_tidytuesday

:::note info
便宜上、説明には筆者が書いたコード、作成したグラフを用いますが、`#Tidytuesday`で検索すればたくさんの良い例が出てきます。ぜひそれらも見てみてください！
:::


# 初心者の方へ
- この記事はggplot2の使い方を初歩から解説するものではありません（ごめんなさい）

それに代えて、
- <font color=#f8b500><b>「ggplot2を使って作図するプロセス」を分解し、具体例を通して紹介します</b></font>
　→　個人的なまとめのようなもので正統とは言えないかもしれませんが、**ggplot2という道具を使ってデータを可視化する具体的なイメージを持つきっかけに**していただければと思います

- <font color=#d9333f><b>道具の使い方は目的をもって使うことで覚えられる！（持論）</b></font>
> 100回geom_pointのヘルプを読んで覚えようとするより、　1回「ggplotを使ってこのデータから散布図を作るには……」と作業する方が身に付く

練習のために、手ごろで回答例もあるテストデータを揃えるのは面倒…… → **課題も作例も豊富なTidytuesdayを一つの糧に！**（Github上のコード）


# Tidytuesdayとは？
>A weekly social data project in R
A weekly data project aimed at the R ecosystem. As this project was borne out of the R4DS Online Learning Community and the R for Data Science textbook, an emphasis was placed on understanding <font color=#ee827c><b>how to summarize and arrange data to make meaningful charts with ggplot2</b>, tidyr, dplyr, and other tools in the tidyverse ecosystem.</font> However, any code-based methodology is welcome - just please remember to share the code used to generate the results.
from [https://github.com/rfordatascience/tidytuesday](https://github.com/rfordatascience/tidytuesday)　（強調は筆者）

（ものすごくざっくり言ってしまうと）**毎週データを持ってきて、Rなどを使ってみんなでデータの可視化をしよう！という企画**

## Tidytuesdayどうすればいいの？
簡略化すると以下だけ：
![Tokyo.Rスライド 素材用10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/ec45c245-8538-7aec-83c0-84a1045ace31.png)

1⃣ 火曜日に更新される<font color=#ee827c><b>課題を公式レポジトリで確認</font></b>（https://github.com/rfordatascience/tidytuesday）

2⃣ （tidytuesdayRパッケージから）以下の<font color=#ee827c><b>コードでデータをロード</b></font>
```example_dataload.r
# from https://github.com/rfordatascience/tidytuesday/blob/master/data/2022/2022-01-18/readme.md
tuesdata <- tidytuesdayR::tt_load('2022-01-18')
tuesdata <- tidytuesdayR::tt_load(2022, week = 3)

chocolate <- tuesdata$chocolate
```

3⃣ <font color=#ee827c><b>コードを書いて作図。図を出力</b></font>
**↑この記事で解説します！**

**～～以下Twitterに投稿する場合～～**
4⃣自分のレポジトリに<font color=#ee827c><b>コードをアップ</b></font>

5⃣画像に追加する<font color=#ee827c><b>alt text (alternative text)を記述</b></font>

:::note info
Alt textとは？

> When you Tweet photos using the Twitter app for iOS or Android, or on twitter.com, you have the option to compose a description of the images so the content is accessible to more people, including those who are blind or low-vision.
> from https://help.twitter.com/en/using-twitter/picture-descriptions

視覚的に見ることが難しい方にも画像の情報を伝えるための、補助的な説明文。Twitterの機能として画像に添付できる。
Tidytuesdatyでは、作成した図についてのAlt textを書くことが推奨されている。
筆者としても、アクセシビリティの向上、情報を言葉で整理する練習、英語の練習などの観点から、作成を推奨します。
:::

6⃣<font color=#007bbb><b>#Tidytuesday</b></font>のハッシュタグをつけて<font color=#ee827c><b>Twitterに投稿</b></font>

## Tidytuedayの良いところ・難しいところ
### 良いところ
- **定期的に課題が出る**　→　継続は力なり
- **「投稿」という明確な区切りがある**　→　完成させようというモチベーションになる
- **言語の違い**　→　英語の練習にもなる（Title、Caption、Alt text）

### 難しいところ
- **火曜日にアップするのは難しい**
他のこともしながらとなると、課題が出された日に満足のいく作図をしてアップするのはなかなか難しい
- （Twitterにアップされている図の）**クオリティが高い！**
少し及び腰になってしまう＆テーマや見せ方でオリジナリティを出すのは結構難しい
- **言語（圏）の壁**
翻訳サイト等で翻訳すればよいと言っても、英語の説明を読む、英語の説明を書くというのは最初は結構ハードルが高い＆欧米では広く知られた文化、あるいは問題意識に基づくデータが課題だった場合、それらの背景を理解していないとなかなかとっつきにくい

# Tidytuesdayのグラフを「分解する」
- #Tidytuesdayで検索すると、「どうやったらそんなのができるんだ……」というような美麗なプロットがたくさん出てきます
- その「美麗さ」は我々には理解不能・再現不能な方法によってもたらされているのか？
→ **No！** ほとんどがggplot2のベースの機能を使いこなした結果の作品

**図を完成させるまでの思考過程をトレースすることで、データ可視化の練習になる！**

## 可視化の流れの一例とコードとの対応
![Tokyo.Rスライド 素材用2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/c21c5e14-ae9f-6edd-e697-7ff70a7f8594.png)

※例えば、Irisデータを用いて作図する場合……
![Tokyo.Rスライド 素材用3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/bff860c6-ea4d-e7cf-725e-a714bc5605ab.png)

上記の流れに沿って、各ステップについて解説していきます。

## **伝えることを決める**：まず課題データをよく理解する
> **具体的には・・・**
> - RのView等で全体を見てみる
> - `group_by`, `count`, `summarise`等を使っていじってみる（各列にはどのような値が入っているのか、欠損や重複はあるか）
> - 課題ページにある説明を読む・データ提供元の説明を読む（＝データの背景を知る）
> - **とりあえず手当たり次第に図示してみる**（＝様々な側面から大まかな傾向をつかむ）

→　**これらの作業を通して、<font color=#ee827c>課題データから図として伝えるべき内容を見出す</font>**

:::note warn

・ただし、データ的、コード的に作図が実現できない場合もある（そのため、実際には後ろのプロセスとの間を行ったり来たりしながら、伝える内容を考えていくことになる）
・もちろん、テーマがはっきりしていて伝えたいことが先に決まっている場合もある
:::

:::note info
Example
![Tokyo.Rスライド 素材用4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/c9891d7e-17e9-41de-8932-46a07e3d0632.png)
:::


## <font color=#ee827c>「どんなグラフで見せるのか」を決める</font>

◎伝えることが決まったあと問題になるのは、**「どのようにそれを図として表現するのか」**

> 先ほどの例でいえば、
>- **パッケージのアップデート頻度というものは……**
		「アップデート回数/期間」を横軸にしたヒストグラムとしても表現できる……
		期間をX軸、アップデート回数をY軸とした散布図としても表現できる……
>- **CRANとBiocの違いも……**
		色分けで表現する方法もあれば、グラフ自体を2つに分けて表現する方法もある……

→　<font color=#ee827c>**自分の作図の目的に合わせてより適した形式を選択する！**</font>

◎**具体的には`geom_`の選択、`aes`の設定、`facet_`の設定としてコード上で記述される**
　→　（実際のコードの流れとは前後が逆になるが）これらの設定に対して求められる`aes`の設定に合わせてデータを整形することになる

ただし、大きさと解像度に限界がある2次元のプロットという性質上、
◎**盛り込める情報には限りがあり、作図にも制限がある**
>たとえば、具体的には……
> - 4~5属性以上の違いを1枚のグラフで表現すること
> - `facet_*`で分割して数十個のグラフを表示すること
> はかなり難しい……


これらの現実的な問題を考慮して、
◎ **「伝えたいこと」と「どのようなグラフで見せるのか」を考え直す作業**がしばしば必要になる

:::note warn

ただし、覚えていくうちに可能なことが増えていく
:::

:::note info
Example
**2022 week03: Chocolate Ratings**
![2022_week03_result_plot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/dffb33fc-29ae-4ffb-4e1d-88c780e4ab32.png)
グラフを`facet_`で分割し、国別に棒グラフを示したが、かなり見にくくなってしまった。

**2022 week09: Alternative fuel stations**
![2022_week09_anime.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/f4adfd23-40c9-dd19-4e60-cc2e8c9df6c6.gif)
アニメーションを使うことで、属性を1つ追加するという手もある（と考えて自分はときどき使います）。
:::

## <font color=#f8b500>作図に用いるデータの準備</font>
「伝えたいこと」と「どのようなグラフで見せるのか」が決まったとしても、
◎ **ロードしたデータフレームをそのまま使って目的の図を作成できるとは限らない**
> Ex.「パッケージの更新頻度」という属性が課題データに格納されているわけではない

→　**ggplot2による作図で使える形にデータフレームを整形（選択、要約etc.）する必要がある**
つまり、**<font color=#ee827c>ggplot2におけるデータの参照方法</font>** を考慮した整形が必要
（＝　`aes`内の`x`, `y`, `color`, …に指定する属性（列）を作る！）

◎どうやって整形する？　→　**Tidyverseの諸関数を使うと便利！**

:::note info
Example
![Tokyo.Rスライド 素材用5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/fb8100a1-bc77-14f3-f7e2-206705c676ac.png)
![Tokyo.Rスライド 素材用6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/3d6a7b31-e229-0e39-02cb-af55f1ec1964.png)
課題データとして複数のデータフレームが提供され、それぞれの形式が微妙に異なっていた。そのため、Tidyverseを用いてデータを成型し、ggplot2の作図に用いることができるデータフレームに整形した。
※この例では作図の関係上、リスト内に2つの同形式のデータフレームを格納しています。
:::

## <font color=#007bbb>グラフの見せ方の調整</font>
◎伝えたいことを決め、データを成型し、geomの選択をした時点で概ねグラフの全容が決まる。しかしそれで図のすべてが決まってしまうわけではなく、**そこからさらに`scale_`関数によって各属性の値の強調方法の調整したり、`coord_`関数によって軸配置の設定などを変更することができる**。
→　**伝えられる情報が変わらなくとも、「見え方」が変わる！**
→　最終的な完成図のレイアウトを考えてそれぞれを設定する！

◎ **`scale_`の設定**
- X軸、Y軸、および色分け、サイズ分けの詳細設定はscale_*関数で行うことができる
- 描画範囲、目盛の設定、色分け方法など、最終的なレイアウトを考えて調整する

:::note info
Example
**2022 week05: Dog breeds**
![2022_week05_result_plot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/00ef000f-4f96-ec51-4032-75b42351f8a9.png)
Rankの数値の強調方法を調整（上位20位までと下位から20位までを強調）。
:::

◎ **`coord_の設定`**
- X軸とY軸によって作られる座標系の調整は`coord_`関数で行うことができる
- 多くの場合用いるのはcoord_flip（軸の入れ替え）やcoord_polar（極座標系化）
- 場合によってはcoord_cartesianやcoord_sfも用いる

:::note warn
描画する値の範囲について
`coord_`関数で設定することもできるし、`scale_`関数でも設定することができる。
:::

:::note info
**2022 week06: Tuskegee Airmen**
![2022_week06_result_plot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/f0652779-62f0-0516-d578-bc3cce104f90.png)
`geom_count`による描画でもともとは直交軸上にプロットされたグラフであったが、`coord_polar`で円形に調整
:::

## <font color=#aacf53>グラフの装飾・配置の調整</font>
**≒「themeの設定をどうするのか」という問題**
個人的には文字を見やすくするためのサイズ調整以外については、完全にこだわりの領域という認識

:::note warn
もちろん必要であれば規定に合わせるための調整、あるいはさらに見やすさを追究するための調整をするべき
:::

**ハッシュタグで検索して怖くなる大きな原因の一つ**
練習として取り組むのであれば、ここにこだわりすぎて挫折するのはもったいないのでとりあえずの調整ができればいいと思います

:::note info
themeの設定方法について
themeの設定方法は、こちらの記事で詳しく説明しています！
[【ggplot2】themeの使い方まとめ2021：作ったグラフの見た目をきれいにコントロールするために](https://qiita.com/ocean_f/items/03a31a8a7ce222bb3838)
:::

:::note info
Example
![Tokyo.Rスライド 素材用8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/86be176d-4b2d-7471-5345-5ca0346691b1.png)
:::

# Tidytuedayはこわくない！
- ネット上で見かける素晴らしい図も、
　**<font color=#d9333f>元をたどれば1ステップ1ステップの積み重ねでできている！</font>**
- Rを使うのがはじめてなら、課題データで使い方を覚えるのも手！
- （繰り返しになりますが）
　**<font color=#d9333f>道具の使い方は目的をもって使うことで覚えられる！</font>**
　**Tidytuedayは存分に「使える場所！」**　→　ぜひ活用してください！