【kaggle】データの視覚化 - 散布図【備忘翻訳】

# はじめに
当記事はkaggleのLearnの[Intro to Machine Learning](https://www.kaggle.com/learn/intro-to-machine-learning)の[Bar Charts and Heatmaps](https://www.kaggle.com/code/alexisbcook/bar-charts-and-heatmaps)を翻訳して備忘としたものです。
拙い英語力なので間違い等あればご指摘いただけたらと思います。

まとめ:[【kaggle】翻訳記事まとめ【備忘翻訳】](https://qiita.com/leafeon00000/items/71e57af5b2d9b0b7c846)
前:[【kaggle】データの視覚化 - 折れ線グラフ【備忘翻訳】](https://qiita.com/leafeon00000/private/6ff5e946e56cc42803e0)
次:[【kaggle】データの視覚化 - 分布【備忘翻訳】](https://qiita.com/leafeon00000/private/6b8fc35f21e15beefde7)

:::note warn
当記事に含まれるコードはkaggle内のnotebook内で正常に動作します。動作を試したい場合はkaggleのnotebookで試してください。
:::

----

# 散布図
座標平面を活用して変数間の関係を調べる。

このチュートリアルでは高度な散布図を作成する方法を学びます。

## notebookのセットアップ

いつものように、コーディング環境の設定から始めます。

<details><summary>set up</summary>

```python
import pandas as pd
pd.plotting.register_matplotlib_converters()
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
print("Setup Complete")
```

```console:consle
Setup Complete
```

</details>

## データのロードと調査
保険料の(合成)データセットを用いて、一部の顧客が他の顧客よりも高い保険料を支払う理由を理解できるかどうかを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547651/25048936-20fc-ced4-3496-36287da8561a.png)

時間があれば、データセットの詳細を[こちら](https://www.kaggle.com/mirichoi0218/insurance/home)からお読みください。

```python
# Path of the file to read
insurance_filepath = "../input/insurance.csv"

# Read the file into a variable insurance_data
insurance_data = pd.read_csv(insurance_filepath)
```

いつものように最初の５行を表示してデータセットが適切に読み込まれたかどうかを確認しましょう。

```python
insurance_data.head()
```

| |age|sex|bmi|children|smoker|region|charges|
|-----|-----|-----|-----|-----|-----|-----|-----|
|0|19|female|27.900|0|yes|southwest|16884.92400|
|1|18|male|33.770|1|no|southeast|1725.55230|
|2|28|male|33.000|3|no|southeast|4449.46200|
|3|33|male|22.705|0|no|northwest|21984.47061|
|4|32|male|28.880|0|no|northwest|3866.85520|

## 散布図
単純な**散布図**を作成するには、`sns.scatterplot`コマンドを使用して次の引数を指定します。

* 水平軸 X軸 (`x=insurance_data['bmi']`)と、
* 垂直軸 Y軸(`y=insurance_data['charges']`)

```python
sns.scatterplot(x=insurance_data['bmi'], y=insurance_data['charges'])
```

```console:console
<AxesSubplot:xlabel='bmi', ylabel='charges'>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547651/227d2717-8c82-e0ba-b925-1da4c325565d.png)

上記の散布図は、[ボディマス指数](https://en.wikipedia.org/wiki/Body_mass_index)(BMI)と保険料が正の相関関係があり、BMIが高い顧客は通常、保険料も高くなる傾向があることを示唆しています。(この相関関係は理にかなっています。なぜなら、BMIが高いと、一般に慢性疾患のリスクが高くなるからです。)

この相関関係の強さを再確認するには、回帰線、つまりデータに最も適合する線を追加すると良いでしょう。これを実現するコマンドである、`sns.regplot`に変更します。

```python
sns.regplot(x=insurance_data['bmi'], y=insurance_data['charges'])
```

```console:console
<AxesSubplot:xlabel='bmi', ylabel='charges'>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547651/c600ef0f-6a18-fc9c-adc1-ff0723d6c877.png)

## 色分けされた散布図
散布図を使用すると、(2つではなく)3つの変数間の関係を表示できます。これを行う方法は、ポイントを色分けすることです。

例えば、喫煙がBMIと保険料の関係にどのように影響するかを理解するために、ポイントを「喫煙者」ごとに色分けし、他の2つの列(「BMI」、「料金」)を軸にプロットすることができます。

```python
sns.scatterplot(x=insurance_data['bmi'], y=insurance_data['charges'], hue=insurance_data['smoker'])
```

```console:console
<AxesSubplot:xlabel='bmi', ylabel='charges'>
```

![__results___11_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547651/2ce82173-ba0f-adff-27d4-50216e8dc236.png)

この散布図は、非喫煙者はBMIが増加するにつれて支払う金額がわずかに増加する傾向があるのに対し、喫煙者ははるかに多く支払う傾向があることを示しています。

この事実をさらに強調するために、`sns.Implot`コマンドを使用して、喫煙者と非喫煙者に対応する2つの回帰線を追加できます。(喫煙者の回帰線は、非喫煙者の線に比べて、はるかに急な傾きになっていることに気付くでしょう。)


```python
sns.lmplot(x="bmi", y="charges", hue="smoker", data=insurance_data)
```

```console:console
<seaborn.axisgrid.FacetGrid at 0x7c1b45c4d510>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547651/e94b74d4-8872-c88a-7aec-0ef10f9d35dd.png)

上記の`sns.Implot`コマンドは、これまで学習したコマンドとは少し異なる動作をします。

* `insurance_data`の`'BMI'`列を選択するために`x=insuranxe_data['BMI']`を設定する代わりに、列の名前のみを指定するために`x="BMI"`を設定します。
* 同様に`y="charges"`と`hue="Smoker"`にも列の名前が含まれています。
* データセットは、`data=insurance_data`で指定します。

最後に、もう1つ学ぶプロットがあります。これは、散布図で見慣れているものとは少し異なるかもしれません。通常、散布図は、2つの連続変数(「bmi」と「料金」など)の関係を強調するために使用します。しかし、散布図のデザインを適応させて、カテゴリ変数(「喫煙者」のような)を主軸の1つにフィーチャーすることができます。このプロットタイプをカテゴリー散布図と呼び、`sns.swarplot`コマンドで作成します。

```python
sns.swarmplot(x=insurance_data['smoker'],
              y=insurance_data['charges'])
```

```console:console
/opt/conda/lib/python3.7/site-packages/seaborn/categorical.py:3544: UserWarning: 37.4% of the points cannot be placed; you may want to decrease the size of the markers or use stripplot.
  warnings.warn(msg, UserWarning)
<AxesSubplot:xlabel='smoker', ylabel='charges'>
/opt/conda/lib/python3.7/site-packages/seaborn/categorical.py:3544: UserWarning: 60.8% of the points cannot be placed; you may want to decrease the size of the markers or use stripplot.
  warnings.warn(msg, UserWarning)
```

![__results___15_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547651/9cdcfc3f-161e-0467-5977-1c45d689474c.png)

このグラフから、次のことが分ります。

* 平均すると非喫煙者は喫煙者よりも料金が安く、
* 最も多く支払う人は喫煙者であり、最も少なく支払う人は非喫煙者です。