代表値と散布度

## 代表値
・代表値とは、データの中心的傾向や標準を表す値のことを指します。
代表値には平均値・中央値・最頻値があります。順にその特徴について見ていきましょう。

① 平均値 (mean)
・データの合計をデータの数で割った値
・通常、標本平均を$\bar{x}$, 母集団平均を$\mu$で表す
 ```math
\bar{x} = \frac{x_1 + x_2 + ・・・ + x_n}{n}　
```
```math
\bar{x} = \frac{1}{n}\sum_{i = 1}^{n}x_i
```

Pythonで実践してみましょう。
```
import seaborn as sns
import numpy as np

# データ準備
df = sns.load_dataset('tips')
df['tip_rate'] = df['tip'] / df['total_bill']

# 平均値を求める
np.mean(df['tip_rate'])
```
結果
0.16080258172250478


####  Seriesに対して、mean()メソッドを呼ぶ

```
df['tip_rate'].mean()
```
結果
0.16080258172250478

また性別ごとの平均値を確認したい場合はgroupbyを使う
![スクリーンショット 2024-05-04 21.20.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/e9943b06-fc5a-0764-8a15-abcd50fd2f7c.png)

```
df.groupby('sex').mean()
```
結果
![スクリーンショット 2024-05-04 21.24.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/45554990-5a40-b7a2-989c-73e69400d44d.png)

特定のカラムのみの計算でいい場合は下記のように記述する
```
# 特定のカラムのみ平均値を計算する
df.groupby('sex').mean()['tip_rate']
```
結果
![スクリーンショット 2024-05-04 21.32.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/0d41a862-897d-deb4-f9b6-fca1cd197f1c.png)

では、上記の平均値をグラフで表してみよう。
・sns.barplot(x=x軸, y=y軸, data=データ)

```
# 平均値を描画する
sns.barplot(x='sex', y='tip_rate', data=df)
# barplotはデフォルトで平均値が設定されている　(estimator=<function mean)
# また、上記を実行すると、エラーバーが表示されるが、無くしたい場合は、ci=Noneを引数に渡せばよい
# ※コンフィデンスインターバル（Confidence Interval、CI）は、95%信頼区間を指す
```
結果
![barplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/bef371da-1c85-f795-68a3-27e34f6313aa.png)


#### Seriesから平均値を描画する方法
```
df.groupby('sex').mean()['tip_rate'].plot(kind='bar')
```
結果
![barplot２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/1aa0fa06-1b7d-77bf-4da1-fb5a405bdc67.png)

## ②中央値(median)

・中央値とは、データを大きい順に並べた際の真ん中の値で、真ん中の値がない場合は真ん中の二つの中間を取る。平均値より外れ値の影響を受けにくいが、計算に時間がかかることに注意する。


Pythonで実践してみましょう。
```
np.median(df['tip_rate'])
```
結果
0.15476977125802577

では、上記の中央値をグラフで表してみよう。
・sns.distplot(データカラム, kde=False)

```
sns.distplot(df['tip_rate'], kde=False)
```
結果
![スクリーンショット 2024-05-04 21.57.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/23a01daf-8fd7-532c-1781-332b9c5f7518.png)

Seriesに対して、median()メソッドを呼ぶ
・df['column'].median()
```
df['tip_rate'].median()
```
結果
0.15476977125802577

```
df.groupby('sex').median()
```
結果
||total_bill|tip|size|tip_rate|
|:-:|:-:|:-:|:-:|:-:|
|   sex||   |   |   | 
| Male|18.35|3.00|2|0.153492| 
| Female|16.40|2.75|2|0.155581| 
	

barplotで描画する場合、estimatorに中央値を指定する。
```
sns.barplot(x='sex', y='tip_rate', data=df, estimator=np.median, ci=None)
```
結果
![スクリーンショット 2024-05-04 22.07.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/93e32440-93d9-84c3-a1c0-99922fb03acb.png)


## ③最頻値(mode)
・最頻値とは、データの中で最も多く観測される値(最も頻繁)
極端に特定の値に集中している場合は、最頻値を代表値として扱い、分布の山をモーダル(modal)と呼ぶ。

Pythonで実践してみましょう。
・stats.mode()
　　　最頻値とカウントを返す
```
mode, count = stats.mode([1, 2, 2, 2, 3, 4])
```
Seriesに対して、mode()メソッドを呼ぶ
・df['column'].mode()
　　最頻値をseriesで返す
```
df['size'].mode()
```

## 散布度
・散布度とはデータの散らばり具合を表す指標である。
・平均値や中央値のような代表値だけではどういったデータなのかを説明するのには不十分であり、散布度といった平均値の周りでデータがどれだけ散らばっているかという指標が重要になってくる。
・散布度には、範囲・四分位数・平均偏差・分散・標準偏差があります。

## ①範囲(range)
　・最大値−最小値
   「範囲」だけでは全体のばらつきを示すには不十分

Pythonで実践してみましょう。
最小値を求める
・np.min()
・df['column'].min()
・df.groupby('column').min()

```
np.min(df['tip'])
```
最大値を求める
・np.max()
・df['column'].max()
・df.groupby('column').max()
```
np.max(df['tip'])
```

![範囲.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/63f41d23-b0ea-ab0b-6234-1f1bbc4a60a9.png)



## ②四分位数(quartile)
データを並べて四分割したときの25%, 50%, 75%の値
全体のばらつきを示すにはまだ不十分

```math
Q_3 - Q_1 : 四分位範囲（IQR:Interquartile\:range）
```
```math
\frac{Q_3 - Q_1}{2} : 四分位偏差（QD:quartile\:deviation）
```

![四分位数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/d1814111-c0e3-88f8-b9e2-f0a9a73f6a7a.png)

Pythonで実践してみましょう。
四分位数を求める
・np.quantile(data, [0.25, 0.5, 0.75])
・df['column'].quantile([0.25, 0.5, 0.75])
```
np.quantile(df['tip_rate'], [0.25, 0.5, 0.75])
```
```
df['tip_rate'].quantile([0.25, 0.5, 0.75])
```


四分位範囲(IQR)を求める
・stats.iqr()
```
stats.iqr(df['tip_rate'])
```

四分位数を使ったグラフである箱ひげ図(box plot)を描画してみましょう
```
import matplotlib.pyplot as plt
%matplotlib inline

plt.boxplot(df['tip_rate'])
plt.show()
```
![箱ひげ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/e5a43b45-fef0-7916-c6a5-e28f84064ffd.png)

seabornを使った箱ひげ図
```
sns.boxplot(df['tip_rate'])
```
![スクリーンショット 2024-05-05 11.50.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/b1a16594-644f-504a-3e59-d1e48929ea09.png)

性別ごとに箱ひげ図を並べることも可能
```
sns.boxplot(x='sex', y='tip_rate', data=df)
```
![スクリーンショット 2024-05-05 11.52.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/578a8ad1-5447-ee3b-2e0d-0125a7281623.png)

## ③平均偏差(MD:mean deviation)
平均からの偏差や絶対値の平均
全てのデータを使うので、範囲や四分位数より散布度としては適している


```math
MD = \frac{1}{n}(|x_1 - \bar{x}| + |x_2 - \bar{x}|+ ・・・　+ |x_n - \bar{x}| = \frac{1}{n}\sum_{i = 1}^{n}|x_i - \bar{x}|
```

しかし、絶対値の中身がマイナスの場合、マイナスを掛けてプラスにしなければいけないため、絶対値が扱いにくい
→だからと言って、単純に絶対値を外すと、平均値からの偏差の和はゼロになってしまうため、絶対値は外せない。
→絶対値は扱いにくいため、二乗しようと考えたのが、次に説明する分散です。

## ④分散(variance)
・平均からの偏差の2乗の平均
・通常標本nの分散は$s^2$, 母集団の分散は$\sigma^2$で表す
・nではなくn-1で割る不偏分散もよく使われる

```math
s^2 = \frac{1}{n}((x_1 - \bar{x})^2 + (x_2 - \bar{x})^2+ ・・・　+(x_n - \bar{x})^2) = \frac{1}{n}\sum_{i = 1}^{n}(x_i - \bar{x})^2
```

しかし、2乗したことで新たな問題があります。それは、尺度がずれてしまうことです。
尺度がずれるということは、統計的な意味での尺度の変化を指します。
その単位は元のデータの単位の2乗です。つまり、もともとのデータが異なる尺度を持っている場合、分散もその尺度の2乗になります。そのため、2乗した後に平方根をとることで尺度を戻そうと考えたのが、次の標準偏差です。

## ⑤標準偏差(standard deviation)
・平均からの偏差の2乗の平均の平方根（分散の平方根）
・通常標本の標準偏差は$s$, 母集団の標準偏差は$\sigma$で表す

```math
s = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(x_i - \bar{x})^2}
```

Pythonで実践してみましょう。
分散を求める
・np.var()
```
np.var(df['tip'])
```

標準偏差を求める
・np.std()
```
np.std(df['tip'])
```

分散や標準偏差がわかると、データの散らばりがわかります。そして、平均$\pm$標準偏差にどれくらいデータが入っているかを考えることができます。

| $\bar{x}\pm s$| 約$\frac{2}{3}$ | 
|:-----------|------------:|
| $\bar{x}\pm 2s$ | 約95%|
| $\bar{x}\pm 3s$ | 約99%〜100%|