機械学習の前処理をエクセルで行う



# はじめに
今回はフィッシャーの [iris のデータセット](http://archive.ics.uci.edu/ml/datasets/Iris)のデータの確認と機械学習で利用するための前処理を Python や R ではなく、エクセルを使って行います。

今回の手順は、以下になります。

1. データの入手
2. データの確認（代表値の確認）
3. データの確認（可視化）
4. 前処理

# 環境
+ Windows 10 Pro
+ Microsoft Excel 2019

# iris のデータセットとは
[iris のデータセット](http://archive.ics.uci.edu/ml/datasets/Iris)はアヤメの品種に関するのデータで、アヤメの品種名（Setosa, Versicolor, Virginica）と 4つの特徴量（Sepal Length, Sepal Width, Petal Length, Petal Width）となっています。

[iris のデータセット](http://archive.ics.uci.edu/ml/datasets/Iris)は、判別分析の例題としてよく用いられます。

|項目名|説明|
|:-----------|:------------|
|Sepal Length|がく片の長さ（cm）|
|Sepal Width|がく片の幅（cm）|
|Petal Length|花びらの長さ（cm）|
|Petal Width|花びらの幅（cm）|
|class|アヤメの品種名|

# データの入手
[iris のデータセット](http://archive.ics.uci.edu/ml/datasets/Iris)を[カリフォルニア大学アーバイン校のデータ配布サイト](https://archive.ics.uci.edu/ml/index.php)からダウンロードします。
[iris のデータセット配布サイト](http://archive.ics.uci.edu/ml/datasets/Iris)の左上にある「Download: Data Folder」をクリックし、「iris.data」をダウンロードします。

# 事前準備
1. ダウンロードしたファイルの拡張子を csv に
2. ダウンロードしたファイルをエクセルで開く（ダブルクリックで開く）
3. 先頭行に1行追加
4. 追加した先頭行に項目名（特徴量の名前）を入力（ A 列に「Sepal Length」、B 列に「Sepal Width」、C 列に「Petal Length」、D 列に「Petal Width」、E 列に「class」を入力）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425339/0f6c5843-f15e-4214-e042-207a89888746.png)

# データの確認（基本統計量）
データの各項目の代表値（平均など）を確認することで、データの概要を把握します。
## 標本数
以下のエクセルの関数を使用して、標本数（データ件数）をカウントします。
（E 列の品種名が空白でないセルの数をカウント）

|項目名|関数|結果|
|:-----------|:-----------|------------:|
|Sepal Length|=COUNTA(A2:A151)|150|
|Sepal Width|=COUNTA(B2:B151)|150|
|Petal Length|=COUNTA(C2:C151)|150|
|Petal Width|=COUNTA(D2:D151)|150|
|class|=COUNTA(E2:E151)|150|

## 平均・標準偏差・最小値・最大値・中央値・最頻値
各項目の平均（mean）・標準偏差（std）・最小値（min）・最大値（max）・中央値（median）・最頻値（mode）を標本数と同様にエクセルの関数を利用して調べます。

|項目名|平均|標準偏差|最小値|最大値|中央値|最頻値|
|:-----------|-----------:|------------:|-----------:|------------:|-----------:|------------:|
|Sepal Length|5.843333|0.828066|4.3|7.9|5.8|5|
|Sepal Width|3.054|0.433594|2|4.4|3|3|
|Petal Length|3.758667|1.76442|1|6.9|4.35|1.5|
|Petal Width|1.198667|0.763161|0.1|2.5|1.3|0.2|
|class|-|-|-|-|-|-|

項目 class は数値データではない（質的変数）ため、他の項目と同じエクセルの関数では計算できません。
項目 class の最頻値は、以下のエクセルの関数などで各品種名をカウントし、最頻値を調べます。

|品種名|関数|結果|
|:-----------|:-----------|------------:|
|setosa|=COUNTIF(E2:E151, "Iris-setosa")|50|
|versicolor|=COUNTIF(E2:E151, "Iris-versicolor")|50|
|virginica|=COUNTIF(E2:E151, "Iris-virginica")|50|

## 尖度
尖度（せんど）は、ヒストグラムの山の尖り度を示し、正規分布からどれだけ乖離しているかを表します。
尖度 0 は正規分布、0 未満は尖りが緩やかで裾が短く、0 より大きいと尖りが急で裾が長くなります。

|項目名|関数|結果|
|:-----------|:-----------|------------:|
|Sepal Length|=KURT(A2:A151)|-0.552064041|
|Sepal Width|=KURT(B2:B151)|0.290781062|
|Petal Length|=KURT(C2:C151)|-1.401920801|
|Petal Width|=KURT(D2:D151)|-1.339754171|
|class|-|-|

## 歪度
歪度（わいど）は、ヒストグラムが左右対称であるかを示します。
歪度 0 は左右対称、0 未満は左の裾が長い分布、0 より大きいと右の裾が長い分布となります。
歪度の絶対値が大きいほど、非対称性の程度は大きくなります。

|項目名|関数|結果|
|:-----------|:-----------|------------:|
|Sepal Length|=SKEW(A2:A151)|0.314910957|
|Sepal Width|=SKEW(B2:B151)|0.334052662|
|Petal Length|=SKEW(C2:C151)|-0.274464252|
|Petal Width|=SKEW(D2:D151)|-0.104996562|
|class|-|-|

## 基本統計量の簡単な求め方
実は上記の基本統計量（標本数・平均・標準偏差・最小値・最大値・中央値・最頻値・尖度・歪度）を簡単に求める機能がエクセルにはあります。

この記事では説明を割愛しますので、以下のサイトなどをご参考下さい。

+ [Microsoft Office 公式サイト　分析ツールを使用して統計学的および工学的分析を行う](https://support.office.com/ja-jp/article/%E5%88%86%E6%9E%90%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E7%B5%B1%E8%A8%88%E5%AD%A6%E7%9A%84%E3%81%8A%E3%82%88%E3%81%B3%E5%B7%A5%E5%AD%A6%E7%9A%84%E5%88%86%E6%9E%90%E3%82%92%E8%A1%8C%E3%81%86-6c67ccf0-f4a9-487c-8dec-bdb5a2cefab6)
+ [Excelで基本統計量と度数分布表、ヒストグラムを作る方法](http://seo.muraweb.net/blog/excel/%E5%9F%BA%E6%9C%AC%E7%B5%B1%E8%A8%88%E9%87%8F%E5%BA%A6%E6%95%B0%E5%88%86%E5%B8%83%E8%A1%A8%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0/)

# データの可視化
代表値では把握できない外れ値などを可視化（グラフ化）することで把握します。
## 散布図
エクセルのグラフ作成の機能で散布を作成します。
この記事では、グラフ作成の説明は割愛します。
### Sepal の散布図
Sepal（がく片）の Length（長さ）の標準偏差は 0.828066、Width（幅）は 0.433594 となっており、Width より Length はばらつきが大きいことを確認できます。特に virginica は、ばらつきが大きくなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425339/2f3afe86-bc80-8209-d997-a79729db68fe.png)
### Petal の散布図
Petal（花びら）の Length（長さ）の標準偏差は 1.76442、Width（幅）は 0.763161 となっており、標準偏差は Petal が Sepal よりも大きく、ばらつきは大きいと言えますが、実際は各品種単位ではばらつきは小さく、品種間のサイズの違いが標準偏差に大きく影響していることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425339/db47cf76-fbfa-3376-6f35-5be5711c41f9.png)

## ヒストグラム
各項目の分布をヒストグラム（度数分布を示すグラフ）で確認します。
階級の間隔は、Sepal（がく片）、Petal（花びら）とも Length は 0.2 、Width は 0.4 としています。 

Petal（花びら）は、Length（長さ）、Width（幅）ともに2つの山があります。これは Petal の散布図で確認した品種間のサイズ違いによるものです。

この記事では、ヒストグラムを作成する説明を割愛しますので、以下のサイトなどをご参考下さい。

+ [Excelで基本統計量と度数分布表、ヒストグラムを作る方法](http://seo.muraweb.net/blog/excel/%E5%9F%BA%E6%9C%AC%E7%B5%B1%E8%A8%88%E9%87%8F%E5%BA%A6%E6%95%B0%E5%88%86%E5%B8%83%E8%A1%A8%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425339/ee8c3117-23b5-2f93-8be0-99f11584b817.png) ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425339/e41fbb46-0c80-ef76-cb38-ce961a748d15.png) ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425339/80bef47a-ad86-84f5-42e1-2295f8130a71.png) ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425339/e15c0e86-c36d-1708-39af-9913b1529aab.png)

# 前処理
前処理は、生のデータを機械学習で処理する前に、精度を高めるために手を加えきれいに整えることです。

主に以下のような処理を行います。

+ データクレンジング : エラーやノイズ、欠損値などを処理（置換や除外）
+ データの統合 : さまざまなデータソースのデータを結合
+ データの変換 : 数値以外のデータを数値に変換することやデータをスケーリング

__※この記事では、データの統合については触れません。データの統合はリレーショナルデータベースを利用するのが一般的です。__

## データクレンジング
### 欠損値の補完
特徴量に欠損値（Null や空白）がある場合、以下の処理を行います。
もし欠損値があるデータ数の割合が低ければ、その行（レコード）を除外しても構いません。
何をもって割合が低いとするかは個人の判断で (^^;

+ 量的変数ならば、中央値を補完
+ 質的変数ならば、最頻値を補完

### 外れ値がある場合の処理
外れ値は散布図、ヒストグラムで確認します。

+ 外れ値があるデータ数の割合が低ければ、その行（レコード）を除外。もしくは、最小値・最大値で置換
+ 外れ値があるデータ数の割合が高ければ、その列（特徴量）自体を除外

## データの変換
### One-Hot-Encoding
質的変数（カテゴリー変数）を One-Hot-Encoding でベクトル化します。

今回は、アヤメの品種名を以下の手順で処理します。

1. アヤメの品種名（Setosa, Versicolor, Virginica）を列（特徴量）に追加
2. 品種名が該当する列の値は 1、該当しない列は 0（品種名 Setosa に対応する列の場合、関数 IF($E2="Iris-setosa", 1, 0) を使用）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425339/92937f40-e8be-364b-cad4-5e382012dae3.png)

__※今回は One-Hot-Encoding の説明のため品種名をベクトル化しましたが、品種名を目的変数とする場合は One-Hot-Encoding ではなく、品種名を数値に置換します。__
__例 : Setosa ⇒ 0, Versicolor ⇒ 1, Virginica ⇒ 2__

### 正規化
正規化は、身長（単位 : cm）、体重（単位 : kg）、年齢（単位 : 才）など単位が異なる量的変数を扱う場合に、ある基準によってデータを変換し、単位（尺度）を統一することです。
サポートベクターマシーンやディープラーニングで分析する場合、量的変数を標準化などでスケーリングする必要があります（処理を早く収束させるため）。
#### 標準化
標準化は、データ項目の平均 0, 標準偏差 1 となるようにすることです。
エクセルの関数は STANDARDIZE を使用します。

STANDARDIZE の使用法は以下のサイトをご参考下さい。

+ [Microsoft Office デベロッパーセンター](https://docs.microsoft.com/ja-jp/office/vba/api/excel.worksheetfunction.standardize)
+ [STANDARDIZE関数で数値データをもとに標準化変量を求める](https://dekiru.net/article/4557/)

#### その他の正規化
標準化以外の正規化の方法として、項目の最大値で割り最大値が 1 となるように変換する方法などがあります。

# 最後に
エクセルでもデータ分析の前処理ができることを実感していただければ、幸いです。