第14回 Fundamentals of Data Visualization 読書会 要約

# 本記事の位置付け

下記読書会のための要約です。

https://gaisaba.connpass.com/event/313682/


## 課題図書

https://clauswilke.com/dataviz/directory-of-visualizations.html

この記事に出てくる図は、特に断りのない限り上記ページより引用したものです。


::: note
この書式での注記は、このブログの筆者（IQぼっち）の感想です。
:::

::: note warn
この書式での注記は、このブログの筆者（IQぼっち）の感想のうち、わからなかった部分や、ちょっと気をつけたほうがいいなと思った点です。
:::

## 今回の範囲

12 Visualizing associations among two or more quantitative variables

12章 - 2つ以上の量的な変数の関係を可視化する

# 要約

## この章について

2つ以上の量的な変数の関係を知りたいことはよくある。
（例：動物の体長と体重、必要なエネルギー量など）

2つの変数間の関係であれば散布図、それ以上の場合はバブルチャート、散布図のマトリクス、これログラムなどの選択肢があるが、さらに次元が多い場合はPCA（主成分分析）のような次元削減を行う。

## 12.1 散布図 Scatter Plot

123羽のアオカケスのデータを使った散布図で説明します。

:::note
アオカケスデータはこのあたりで入手可能なもよう。
https://rdrr.io/rforge/Stat2Data/man/BlueJays.html#heading-1
（blue jays data などでググると、ブルージェイズという野球チームのデータが出てきがち）
:::

アオカケスデータは、アオカケスの頭の長さ（くちばしの先から頭の後ろまで）、頭蓋骨のサイズ（頭の長さからくちばしの長さを引いたもの）や体重などのデータを持っていますが、これらの項目には何らかの関係がありそうですよね。
（例：くちばしが長い鳥はそのぶん頭蓋骨も大きそうだし、体重が重い鳥は軽い鳥よりくちばしや頭蓋骨も大きそう）

その関係をプロットした例が12.1の図で、X軸に体重、Y軸に頭の長さをとっており、ややまばらな雲の形ではあるが、明らかに一定の傾向（＝体重が大きいほど頭の長さも大きい）を示している。

![blue-jays-scatter-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/3f343a50-7d84-8d2b-58cd-8a1d8e360c1e.png)

12.1を雌雄で色分けしたのが12.2。これで雌雄別の傾向の違いがわかる。
たとえば、同じ体重なら、メスの方がオスよりも頭の長さが短い傾向にあることがわかる。

![blue-jays-scatter-sex-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/291069d3-1d75-e1b4-1cb4-83fb1a904b1d.png)

頭の長さは「くちばしの先から頭の後ろまで」という定義なので、「頭が長い」というのはくちばしが長いか、頭蓋骨が長いか、両方かを暗に示している。
`skull size` というデータ項目を参照することで、くちばし自体の長さと頭蓋骨自体の長さを分けて考えることができる。

X軸は体重、Y軸は頭の長さ、色は雌雄の区別に既に使ってしまっているので、頭蓋骨の大きさをマップするにはもうひとつエスセティクスが必要になる。

:::note warn
aesthetic は、日本語版でもそのまま「エスセティクス」と訳されているもよう。
「データを見せる切り口」的な意味だと理解しています。
:::

（頭蓋骨の大きさをマップするエスセティクスの）選択肢のひとつはドットの大きさで、これをやるとバブルチャートになる。

![blue-jays-scatter-bubbles-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/2f196cbe-0a25-4c61-b5c2-1b4c50562f3a.png)

バブルチャートの弱点は以下。

1. 他の項目と関連性が見つけづらい
1. 位置による区別に比べ、サイズによる区別だと、その項目自体の値の大きさを判断しづらい

なのでバブルチャートよりは、総当たり式の散布図マトリックスの方が望ましい。
（以下は原文の図に、赤青でコメントを入れたもの）

![blue-jays-scatter-all-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/e6ba6531-d16b-2a87-9aeb-cd19f39ba64e.png)


この図からわかること

- 体重と頭蓋骨のサイズの関係は、オスもメスもだいたい同じ（メスが全体的に小さめ）
- 体重と頭の長さの関係になると、オスとメスではっきり違いがある。他の条件が同じなら、オスの方が長いくちばしを持っている

:::note

Rだと `ggpairs(data)`, Python(Seaborn) だと `sns.pairplot(data)` などの構文で簡単に書ける

-> 簡単に書けすぎて、「とりあえずペアプロット作ってデータ探索終わり」にしたくなる誘惑にかられることは・・・プロのデータサイエンティストたちはないと信じている。。。

:::

## 12.2 コレログラム

量的な変数が3〜4つを超えてくると、総当たり式の散布図は扱いづらくなってくる。
その場合、ペアとなる変数の関係性の度合いを定量化して、（生データではなく）その量を可視化するというのが役に立つ。

これをやる方法のひとつが相関係数（correlation coefficients）を使うこと。

相関係数は -1 から 1 までの間の数で、正の数は正の相関、負の数は負の相関をあらわし、絶対値が大きいほど2変数間の関係性が強いことを示す。

### 相関係数

:::note
原文では数式で説明していますが、ここではその数式を日本語で説明します。
:::

#### 相関係数の求め方（プレーンな数式）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/bc4aba47-f2ee-18bd-c324-c5248f464aa8.png)

#### 相関係数の求め方（👆をわかりやすい単位で色分け）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/266d8b57-13ae-547f-a5b7-c53c44eb39d7.png)

#### 相関係数の求め方（👆の色分けした部分をさらに解説）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/5ea4090e-bad6-f298-5883-d9d05a1a77e2.png)

#### 分母について - なんで2乗して平方根をとるのか

- 2乗する意図として、大きい値を罰したい場合に使うというイメージだが、なんで相関係数のときに分母をまず2乗するのかはうまく説明できない。。。（それが定義だから、と言ったらそこまでだけど。。。）
- 2乗のあとに平方根をとる理由としては、もとの値（分子）と単位を揃えるため。

:::note
👆について、勉強会の中で色々教えてもらえました！

相関係数はベクトルの内積と関係しているから
https://note.com/oniniko/n/neef9ff866f7d

👆の考え方をわかりやすく説明した本
https://www.amazon.co.jp/dp/B079PTFSL7
:::

### コレログラム

そんな相関係数を可視化するのがコレログラム！

以下のコレログラムは、7つの異なる酸化物について、すべてのペアの組み合わせ（6+5+4+3+2+1 = 21個）の相関係数をコレログラムで示したもの。

マグネシウムは他のほぼ全ての酸化物と負の相関があるんだな（＝マグネシウムが含まれているほど、他の酸化物は含まれている度合いが低いんだな）とか、アルミニウムとバリウムは強い正の相関があるんだな（＝アルミニウムがいっぱい含まれていると、バリウムもいっぱい含まれているんだな）などがすぐにわかる。

![forensic-correlations1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/0f55b511-11e1-c9a3-8cec-6a7e3a11edec.png)

コレログラムの弱点は、相関がほぼ0に近いような関係性でも、見た目にあまり「ほぼゼロだよ感」が出ないこと（原文：are not as visually suppressed as they should be.）

なので相関の強さを大きさでも示してみると、以下のようになる。

![forensic-correlations2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/568236c0-e38f-0397-1710-8fc307141453.png)

:::note warn
同じ要素を異なるエスセティクスで重複して示すのはあまり良いやりかたじゃない、とどこかで聞いた気がしますが、ありなときはありなのか。
まぁ、たとえば支店の違いを、線グラフの異なる線（エスセティクス１）で示すととも色（エスセティクス２）でも分けるようなことはあるし、それで見やすくなることもあるからいいのか。。。
:::

### コレログラムの弱点

抽象的であること。
パターンを一瞥して認識するにはよいが、個々のデータポイントが隠れてしまう。

抽象的なデータよりは、個々のデータポイントを可視化できるほうが常にベターである。

:::note warn
それを言うなら、7項目くらいのデータならペアプロットでいいんでねーのと思い作ってみました。
結果は・・・

![pairplot_no_hue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/414d2ce2-a7f5-6dab-b19d-6b9ac758b00c.png)

- 7個とはいえ、ペアプロットを多項目で見るのはたしかにしんどい。。。
- 今回のデータのように、一定の数のデータポイントが X軸／Y軸上のゼロ付近に集中しているパターンが多いときは、全体がきれいにななめの形になっているパターンに比べて相関が見えづらい気がする（私が慣れていないだけ？）
- とはいえ、👆の形状も一定の気づきにはなりそうなので悩ましいですね。

:::

## 12.3 次元削減

### 次元削減とは

機械学習などで、データの項目数が多すぎると「次元の呪い」と呼ばれる現象が起こる。

https://atmarkit.itmedia.co.jp/ait/articles/2006/29/news023.html

それを防ぐための手法が次元削減であり、次元削減の手法として最も一般的なのが主成分分析（PCA）である。

次元削減は、多数の項目があっても、すべての項目が異なる情報を示しているわけではなく、「いくつかの項目はカバーしている情報が重なっている」という洞察に基づいてる。

（例：ある人の身長、体重、腕の長さ、脚の長さ、胸囲、腹囲 etc... は、「体のサイズ」的な共通の指標を指し示すよね？）

:::note
次元削減の目的：なるべく元データの情報量を失わずに、項目の数を減らしたい
:::

主成分分析の考え方をわかりやすくまとめた記事⏬

https://www.nttcoms.com/service/research/dataanalysis/principal-component-analysis/

### 主成分の求め方

原文の図12.8に番号を振りました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/348dfabb-9a0f-f8b9-9848-9f517d6259eb.png)

#### ① データを標準化する

平均がゼロ、分散が一定になるようにデータを標準化します。
（12.8の補足説明の(b)に相当）

-> なので図の b では、真ん中が0で、両端の値が X軸、Y軸とも同じ値に統一されている

#### ② 最も分散が大きいラインに軸その1を引く（←これが第1主成分）

b の図中の、この赤い矢印の部分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/e40662d3-6828-27f9-3b8e-25016def1419.png)

なぜ一番分散が大きいところに線を引くのかというと、「そのラインが最も情報量が多いから」。

そもそもなんのために軸をとりなおすのかという解説は、こちらがわかりやすいという噂。
（私も見ましたが、これだけでは私自身は理解できなかった）

https://www.youtube.com/watch?v=bBEKlulWPH4

#### ③ 上記②と直角に交わるところに、軸その2を引く（←これが第2主成分）

b の図中の、こちらの赤い矢印の部分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/c376ec6f-2041-509f-4871-73e099f1f789.png)

なぜ直交する軸をとるのかというと、「直交する軸が、最も主成分1との相関がないから」。

:::note 
👆このポイントがずっとわからなくて、ようやくわかったときの叫びがこちら⏬
:::

https://x.com/IQ_Bocchi/status/1770789629974700450

:::note warn
ちなみに主成分分析の説明では大抵 12.8 のような図が出てきますが、これは主成分分析の考え方をわかりやすく2項目（2次元）で説明するためにそうしているだけで、実際には図解できないもっと多次元の世界でこの操作が行われているという理解（←あってます？）

三次元の世界で軸をとる際の考え方（バリマックス回転）を説明する下記の動画を見て、何かを理解した気持ちになっています。。。

:::

https://www.youtube.com/watch?v=YekFFyuVwyY

(5:46 の図にすべてが凝縮されている)

このあたりもわかりやすかったです。

https://qiita.com/NoriakiOshita/items/460247bb57c22973a5f0

#### ④ 第1主成分がX軸になるように、プロット全体を回転させる

なぜ回転させるかというと、こうすることによって、第1主成分をX軸、第2主成分をY軸とする散布図として分析ができるようになるから・・・？

:::note warn
👆あってます？？
:::

### 主成分の利用

とりなおした軸の中で、もとの値（各元素ごとの含有量（を標準化したもの））は、それがどの程度 第1主成分と第2主成分に貢献しているかという

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/e002f04c-8ff9-fce9-ee18-47b32bf77478.png)
▲原文12.9に赤＆緑で説明を入れたもの

この図を見ると、バリウムとナトリウムは主に主成分1に関わっているけど主成分2とはあまり関係がなく、カルシウムとカリウムは主に主成分2に関わっているけど主成分1とは関係がなく、他の要素（鉄、アルミ、マグネシウム）は主成分1,2両方にそれぞれの割合で関わっていることがわかります。

矢印の長さが違うのは、主成分は2つ以上あるからです。
たとえば、鉄の矢印が短いのは、ここに示されていないより高次元の主成分に関わっているからです。

:::note warn
⏫ここに示されていない高次元の主成分（higher-order PCs (not shown)）ってなんだ。。。
データとして取得できていない何らかの要素も含むのか。。。
:::

最後に、もとのデータを主成分分析の空間上にプロットしなおしてみます。

![forensic-PCA-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/7413394c-0475-6ad3-d100-b3c70b5c6e38.png)

ヘッドランプと窓ガラスは、明らかに他とは区別された一定の位置を占めています（原文：fall into clearly delineated regions）。

食器や容器のガラスはもう少し範囲が広がっていますが、それでもヘッドランプや窓のかたまりとは明らかに違う場所にあります。

12.9 と 12.10 を比べることで、窓ガラスはマグネシウムの含有量が平均より多く、バリウム、アルミ、ナトリウムの含有量が平均より少ないこと、ヘッドランプはその逆であることがわかります。

## 12.4 対応のあるデータ Paired Data

:::note
Paired Data が「対応のあるデータ」という訳なのは、日本語版の索引を見て知りました。
:::

多変量データの特殊な形のひとつが「対応のあるデータ」です。

対応のあるデータとは、たとえば以下。

- 同じ人の右腕と左腕のデータ
- 時系列で変化するデータ（同じ人のある日付の体重と、その日付から一定期間経過後の体重）
- 双子を１組とするデータ

このような対応のあるデータを可視化するときは、対応される項目同士の違いが強調されるような方法を使う必要があります。

二酸化炭素の排出量の、国ごとの時系列での変化を例に見ていきましょう。

#### 散布図

ペアの項目の一方をX軸、他方をY軸にとった散布図でデータをあらわす方法

![CO2-paired-scatter-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/e88afebe-187b-06c1-87de-4d834aeca23f.png)

この図を見ると、1970年の排出量と、2010年の排気量はだいたい比例していて、かつ、全体傾向として、2010年の方が排出量が高いとわかります。(悲しい現実)

散布図は、データポイントが多い場合に全体傾向を把握するのに最適。

#### スロープグラフ

データポイントが少ない場合で、かつ、個々のデータポイントごとの対応や推移を見たいときはこの形がいいよ。

![CO2-slopegraph-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/cbc091ec-1ff2-42ba-c06f-b9c94936455b.png)

スロープグラフだと、ペアの対応だけではなく、もっと多くの時系列の推移も可視化することができるよ。

![CO2-slopegraph-three-year-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/5b797b4b-5284-ebe0-ee70-b1fe5388de4a.png)

# さいごに

要約は以上です。

これを読んで、読書会に参加したくなった方はこちら👇まで！

https://gaisaba.connpass.com/event/