Azure Machine Learning Workbench でデータ整形

# 注意事項
本記事で取り上げている Workbench についてはサポート終了となっています。詳しくは下記を参照ください。
https://docs.microsoft.com/ja-jp/azure/machine-learning/overview-what-happened-to-workbench

# はじめに
この記事は [Microsoft Azure Tech Advent Calendar 2017](https://qiita.com/advent-calendar/2017/microsoft-azure-tech) の9日目の記事です。
このままシリーズ化するかどうかは未定ですが、その前に書きかけのシリーズ([1](https://qiita.com/yomatsum/items/80481121d450fb064f81)/[2](https://qiita.com/yomatsum/items/33e84119bf3785bb4ea6)/[3](https://qiita.com/yomatsum/items/b7cfcdf7a1356fa0567d))を何とかしたい今日この頃です。

# 今さら Azure Machine Learning ?
今回取り上げるのは、[Azure Machine Learning サービス](https://azure.microsoft.com/ja-jp/services/machine-learning-services/)です。Azure には、以前から Azure Machine Learning という機械学習を簡単に利用するための開発環境＋展開環境を提供するサービスがあります。しかし、[先日のイベント](https://www.microsoft.com/en-us/ignite/default.aspx)において、新たに Azure Machine Learning サービスが発表され、以前の Azure Machine Learning は現在、[Azure Machine Learning Studio](https://azure.microsoft.com/ja-jp/services/machine-learning-studio/) という名称に変更されています。

というわけで、決して今さらな内容ではないことを、まずはご承知おきください。

説明の順序を考えると、Azure Machine Learning サービスがどのようなもので構成されているかをお伝えするのが先かもしれませんが、本記事では開発環境となる Workbench で大きく変わったデータの整形機能を紹介してみたいと思います。（全体感は追々ということで）

# 環境の準備
機能を単に紹介するよりは、実際に動かしてみたいと思います。セットアップが完了するまでそこそこ時間がかかるのでくじけず行きましょう。

## Machine Learning 実験アカウントのセットアップ
Workbench を利用するためには、前提となるサービスの展開が必要になります。最近の Azure 系のドキュメントは割と手順がきれいに纏まっているので、細かい手順は[こちら](https://docs.microsoft.com/ja-jp/azure/machine-learning/preview/quickstart-installation)を参照いただくとして、ここでは要点だけざっくりと。

**Machine Learning 実験**、または**Machine Learning Experimentation**を展開します。アクセスする経路によってまだ表記ゆれがあります(2017/12現在)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/aead987d-3a0f-a5aa-cc6c-a3eae43ef561.png)

- シート数の指定は注意が必要です。パラメーターに明記されていますが、3名以上で利用する場合は課金額が変わってきます。
- Machine Learning 実験に対して、複数のワークスペースを作成できますが、初回の展開時には、まず一つ目を作成する必要があります。

## Machine Learning Workbench のインストール
前述のセットアップ内に、[Workbench のダウンロードリンク](https://aka.ms/azureml-wb-msi)があります。インストールの処理内で必要なコンポーネントを自動でダウンロードしてくるので、インターネット接続が可能な環境にインストールします。インストール対象のスペックによって前後しますが、30分から60分くらいは見ておく必要があるかと思います。

ちなみに、同時にインストールされるモジュール類は以下です。(2017年12月、0.1.1711.15263 で確認)

- Azure_cli_machinelearning (0.0.70+dev)
- Azureml.dataprep (0.1.1709.14033) and other azure libraries
- Conda (4.2.12)
- Numpy (1.11.3) 
- Pandas (0.19.2)
- Dill (0.2.6)
- Numexpr (2.6.1)
- Scipy (0.18.1)
- Regex (2017.07.28)
- Xlrd (1.1.0)
- Pyarrow (0.6.0)
- scikit-learn (0.18.1)
- jupyter (1.0.0)
- psutil (5.2.2)

えー、それ古くない？というものもあろうかと思いますが、まずはこれらがインストールされます。

## Machine Learning Workbench の起動
ここまでくれば、起動して動作を確認できます。Workbench の初回起動時には、サインインを求められます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/2b82ba71-a19c-8a10-e4a3-b1c1ff6fd569.png)


Machine Learning 実験の展開時に同時に作成したワークスペースにアクセスするためです。
サインインのアカウントには Machine Learning 実験の展開時に指定した、ワークスペースの所有者アカウントを使用します。

下記は、私のワークスペースの表示ですが、既に作成済みのプロジェクトが表示されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/36bbe73a-fee1-f536-f3fb-00b1a75d8754.png)


# データ整形機能を使ってみる
ここからが本題です。

## プロジェクトの作成
プロジェクトを新規作成します。とりあえず使ってみたい方はチュートリアルに従って Classifying Iris あたりから試していただくのがよいかと思います。

ここでは、空のプロジェクトを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/65468bfb-66d9-c8a9-c44b-1162d05f7c16.png)

プロジェクト名と格納先のディレクトリを指定します。VSTS の Git リポジトリを使用することで、複数の端末やエンジニアによる共同編集が行えるようになります。ちなみに、この記事を書いている時点(2017/12)では、Github等には未対応です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/9d0c3bde-1f95-e11a-7f45-b3db21facf78.png)

プロジェクトが作成できました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/c804c209-c2c7-5478-b17a-a4966e09e46b.png)

## データの取得
どんなデータが分かりやすいか悩みましたが、あくまでもデータの整形が紹介したいポイントなので、以下のデータを使っていきたいと思います。

[人口動態調査 人口動態統計 確定数 人口 年次 2016年](http://www.data.go.jp/data/dataset/mhlw_20171204_0015)

上記から、4_年次・都道府県・性別人口_(1) 総数 をダウンロードしておきます。データの内容は以下のような感じです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/16067a0a-443d-cdd7-9ee7-c0dc2257c991.png)

なお、現時点ではいい感じに日本語表記が取り込めないので、エンコードを UTF-8 に変更します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/bb031d01-9614-ac83-0c66-d2e664970c28.png)


## データの読み込み
データ用のビューに切り替えて、データソースを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/29afe123-1642-b79c-3a71-177c04a00eba.png)

CSV としてダウンロードしてきているので、Text Files を指定して進めていきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/4e03a3a6-7c19-bef9-9576-323bac5d989f.png)

CSV ファイルのパスを指定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/805d0d6a-767d-70be-0112-05f3320d56dc.png)

次の画面では、指定するポイントがいくつかあります。

- Line to skip には 11 を指定しています。西暦年がヘッダーとして含まれていますが、自動的に除外されてしまっているため、取り込む開始行をコントロールするためです。
- File Encoding には UTF-8 を指定します。
- Promote Headers Mode には Use Headers From First File を指定します。ファイル内の先頭行がヘッダーになります。

上記を指定すると、プレビューとしての表示が変わります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/cc6eb69d-c8f8-c95f-0680-7dace536611f.png)

データ型は、既定の状態のままとします。事前にデータを見ていただくとわかるのですが、沖縄県については特定の年代のデータが欠落しています。このため、埋まっている文字列を自動的に考慮して String 型が指定されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/a90df614-e58b-78eb-d58c-d68b6f775308.png)

最後に、Path Column をどうするか指定します。今回は除外するという既定の設定を採用します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/5f5c64a6-6b2c-ebc1-b80f-8f9736c71d1f.png)

これで、Workbench へのデータの取り込みは完了です。画面の右側に、データの読み込み時に設定した内容が STEPS として記録されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/81c7d5ae-a4e3-92c4-1662-1b774fe3cd25.png)

## データの加工
実際の分析にデータを利用するためには、もう少しデータを加工する必要があるケースが大半です。ここでは、シンプルなデータの加工と、Workbench に備わっている便利な機能が分かるようなデータ加工を追加してみたいと思います。

読み込んだデータを加工するためには、Data Preparation を作成する必要があります。画面上部の Prepare をクリックすると、Data Preparation の作成画面が表示されます。適切な名前を設定しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/891454c9-343e-21eb-f75a-bca56ecc6a32.png)

データ加工用の画面に切り替わります。パッと見た感じは何も変わっていないように見えますが、新しいタブとして表示されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/98493137-dd3e-c412-3646-26e503398628.png)

### 列の削除
数値データの欠損があったので、古いデータは今回は使わないという選択をしたと仮定します。1935年から1995年までのデータは取り除いてしまいます。

複数の列を選択し、右クリックから Remove Columns を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/523f62c4-9fbb-1c7e-402e-a948689ba1ab.png)

画面から列が削除され、ずいぶんとスッキリしました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/9f613da6-e557-b38e-b5d1-fff0cf81aa89.png)

### 行の削除
全国合計のデータは不要な気がします。フィルターを使って取り除きましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/9325772f-aa83-cef2-2914-784d5e3cff0b.png)

### データを加工した列を追加
Column1 に都道府県番号が付与されているため、これを取り除いた列を作ってみましょう。Column1 の列を選択して右クリックから Derive Column by Example を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/75f42b06-6e41-348b-28c4-81904e443875.png)

列に対してチェックボックスが表示され、空の列が追加されます。この追加された列に、加工後の期待する値を入力してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/9f85b9ed-6a75-87dc-cec9-846f9205cc52.png)

まずは、1行目の「０１北海道」に対して「北海道」を入力します。すると、追加された Column 列に都道府県番号が削除された値が一律で設定されます。通常、データの加工に関しては、私たちが加工のための変換ルールをコードで実装していく必要があります。（Excel でも関数を駆使しますよね。）Machine Learning Workbench はコードを検討するのではなく、どういう結果が欲しいかを記載することで、加工済みのデータを得ることができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/6e137250-0774-6c56-669e-f4f133e2b851.png)

別の変換を試してみたいので、まずは「OK」をクリックして確定させます。併せて列名を「変換1」としておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/afdadf54-3d9f-5f33-d57b-ec3ef43e48d8.png)

次に、少し欲張って都道府県番号と空白文字が除去できないかを試してみます。もう一度、Column1 から Derive Column by Example で新しく列を作成し、今度は2行目に「青森」を設定してみます。都道府県番号と同時に間の空白も除去してくれます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/40072ebc-db39-f9dc-8e10-fe5dbdcfabed.png)

その一方で、北海道や神奈川など三文字の場合は何も埋まりません。試しに北海道に対して「北海道」入力してみると、他の都道府県の処理が全部行われなくなってしまいます。（この後の説明は、この変換をキャンセルした状態で進めます）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/a05e62ab-8db8-a994-69e5-f9dfd1062597.png)

このように、こちらの期待するありとあらゆる変換を満たしてくれるわけではありません。何ができるかについては、ドキュメントにまとまっているので[こちら](https://docs.microsoft.com/ja-jp/azure/machine-learning/preview/data-prep-derive-column-by-example)を参照しましょう。

というわけで、空白を削除するところは自分でコードを書いてみます。変換1 列を右クリックして Add Column (Script) を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/3ad10ccf-a37b-e3c9-3b0a-d0c48e481a52.png)

列名は任意の列名を指定します。挿入位置も指定できます。Python コードとしては、以下を入力してみます。

```py3
row["変換1"].replace('　','')
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/e6724332-12e4-2f08-e1c4-831f146a5097.png)

これで、無事に空白も除去できました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/f82cb7c7-28ed-63b8-1ffd-ba576e947be9.png)

都道府県番号の除去については、今回コードを書かずに例を設定するという対応をしました。このように「例から変換ルールを導出する」部分については、PROSE なるものが使用されています。

##PROSE (Microsoft Program Synthesis using Examples)
入力と出力のペアをいくつか例として与えることで、変換ルールを導出するためのライブラリです。Excel でいうところのフラッシュフィル機能ですよ、なんていう説明がなされています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163305/b7f48dc1-a475-6182-deed-4e6403900da3.png)

一通りのリソースは [https://microsoft.github.io/prose/](https://microsoft.github.io/prose/) からアクセスできます。動作用の[サンプル](https://github.com/Microsoft/prose)もあります。

#まとめ
Azure Machine Learning の第二世代として登場した Azure Machine Learning Workbench は、データの整形を効率的に行うための機能が備わっています。データ分析の8割の時間はデータ整形ともいわれることもありますので、積極的に活用していきたいと思います。