基本統計量、標準化、正規化、ヒストグラム、箱ひげ図（california housingデータセット）

# はじめに
california housingデータセットを例に用いて、**基本統計量**の算出、**標準化**・**正規化**の適用、**ヒストグラム**・**箱ひげ図**の描画を実装していきます。

# 実装
## インポート
各ライブラリをインポートします。データセットは`sklearn.datasets`から読み込みます。
```python
import pandas as pd
import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn import preprocessing
import matplotlib.pyplot as plt
```

## データセットの読み込み
`fetch_california_housing()`でインスタンスを生成。
* `.data`：データの中身（ndarray）。`as_frame=True`を指定するとpandas DataFrameが返される。
* `.target`：住宅価格(`'MedHouseVal'`)（ndarray）。`as_frame=True`を指定するとpandas Seriesが返される。
* `.feature_names`：データのラベル（リスト）。

```python
housing = fetch_california_housing()
housing_as_df = fetch_california_housing(as_frame=True)

data_arr = housing.data
data_df = housing_as_df.data
target = housing.target
features = housing.feature_names
```

## 標準化、正規化

* StandardScaler：標準化（平均0, 分散1）
* RobustScaler：外れ値に頑健な標準化
* MinMaxScaler：正規化（最大1, 最小0）

### `StandardScaler`による標準化

```python
sscaler = preprocessing.StandardScaler() # インスタンスの作成
sscaler.fit(data_arr)

ss_arr = sscaler.transform(data_arr) # 変換
ss_df = pd.DataFrame(ss_arr, columns=features) # pandas DataFrame
```

### `RobustScaler`による標準化

```python
rscaler = preprocessing.RobustScaler(quantile_range=(25., 75.))
rscaler.fit(data_arr)

rs_arr = rscaler.transform(data_arr) # 変換
rs_df = pd.DataFrame(rs_arr, columns=features) # pandas DataFrame
```


### `MinMaxScaler`による正規化
```python
mmscaler = preprocessing.MinMaxScaler() # インスタンスの作成
mmscaler.fit(data_arr)

mm_arr = mmscaler.transform(data_arr) # 変換
mm_df = pd.DataFrame(mm_arr, columns=features) # pandas DataFrame
```

## 基本統計量

### 変換前
```python
data_df.describe()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/432fe25f-60f5-d6ec-7640-5b7ba130d72d.png)


### `StandardScaler`による標準化
```python
ss_df.describe()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/a2f0a274-a3c7-318f-36b6-497fa5af4575.png)


### `RobustScaler`による標準化
```python
rs_df.describe()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/612cead8-0bfd-c43d-d0d5-dd463293fba1.png)


### `MinMaxScaler`による正規化
```python
mm_df.describe()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/cc2a0b4c-4533-d7bc-a697-ba41e966a726.png)


## ヒストグラムの描画
### 変換前
```python
fig = plt.figure(figsize=(10, 5))
plt.suptitle('raw')

for i in range(len(features)):
  ax = fig.add_subplot(2, 4, i+1)

  ax.hist(
      x=data_df[features[i]],
      bins=10,
      color='white',
      edgecolor='black'
  )
  ax.set_title(features[i])

plt.tight_layout()
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/7c1ae632-119e-521a-4397-4b2c0d6c5e5c.png)



### `StandardScaler`による標準化

<details><summary>コードを見る</summary>

```python
fig = plt.figure(figsize=(10, 5))
plt.suptitle('StandardScaler')

for i in range(len(features)):
  ax = fig.add_subplot(2, 4, i+1)

  ax.hist(
      x=ss_df[features[i]],
      bins=10,
      color='white',
      edgecolor='black'
  )
  ax.set_title(features[i])

plt.tight_layout()
plt.show()
```
</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/517b0413-7855-b4a5-1efe-a40b2947dc58.png)



### `RobustScaler`による標準化
```python
rs_df.describe()
```
<details><summary>コードを見る</summary>

```python
fig = plt.figure(figsize=(10, 5))
plt.suptitle('RobustScaler')

for i in range(len(features)):
  ax = fig.add_subplot(2, 4, i+1)

  ax.hist(
      x=rs_df[features[i]],
      bins=10,
      color='white',
      edgecolor='black'
  )
  ax.set_title(features[i])

plt.tight_layout()
plt.show()
```
</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/bd8ea3a8-93ae-a12f-9623-71109dec105d.png)


### `MinMaxScaler`による正規化
<details><summary>コードを見る</summary>

```python
fig = plt.figure(figsize=(10, 5))
plt.suptitle('MinMaxScaler')

for i in range(len(features)):
  ax = fig.add_subplot(2, 4, i+1)

  ax.hist(
      x=mm_df[features[i]],
      bins=10,
      color='white',
      edgecolor='black'
  )
  ax.set_title(features[i])

plt.tight_layout()
plt.show()
```
</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/4c877ef7-a8f3-0a0d-9571-371196512bca.png)


## 箱ひげ図の描画
### 変換前
```python
fig = plt.figure(figsize=(8, 5))
plt.suptitle('raw')

for i in range(len(features)):
  ax = fig.add_subplot(2, 4, i+1)

  ax.boxplot(
      x=data_arr[:,i],
      labels=[features[i]],
      widths=0.4
  )
  ax.set_title(features[i])

plt.tight_layout()
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/9ba9ac84-fd9f-8f72-7acd-cc9813d4776c.png)



### `StandardScaler`による標準化

<details><summary>コードを見る</summary>

```python
fig = plt.figure(figsize=(8, 5))
plt.suptitle('StandardScaler')

for i in range(len(features)):
  ax = fig.add_subplot(2, 4, i+1)

  ax.boxplot(
      x=ss_arr[:,i],
      labels=[features[i]],
      widths=0.4
  )
  ax.set_title(features[i])

plt.tight_layout()
plt.show()
```
</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/6c3b1029-02a7-8806-8968-0a946378d48f.png)




### `RobustScaler`による標準化
```python
rs_df.describe()
```
<details><summary>コードを見る</summary>

```python
fig = plt.figure(figsize=(8, 5))
plt.suptitle('RobustScaler')

for i in range(len(features)):
  ax = fig.add_subplot(2, 4, i+1)

  ax.boxplot(
      x=rs_arr[:,i],
      labels=[features[i]],
      widths=0.4
  )
  ax.set_title(features[i])

plt.tight_layout()
plt.show()
```
</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/efa962bf-fc21-bbad-f22b-1c83cd4ff0fb.png)



### `MinMaxScaler`による正規化
<details><summary>コードを見る</summary>

```python
fig = plt.figure(figsize=(8, 5))
plt.suptitle('MinMaxScaler')

for i in range(len(features)):
  ax = fig.add_subplot(2, 4, i+1)

  ax.boxplot(
      x=mm_arr[:,i],
      labels=[features[i]],
      widths=0.4
  )
  ax.set_title(features[i])

plt.tight_layout()
plt.show()
```
</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/bcda19be-eab4-dfe9-9dd8-552f73590753.png)