【Python in Excel】Excelで機械学習ができる！

2023年8月にPython in Excelが発表されました。
これにより、Excelでscikit-learnやpandas（Pythonのライブラリ）を使うことができ、簡単に機械学習を実装できるようになりました。

なので今回は機械学習においてHello World!の位置づけ（入門者向け）にある**アヤメの分類**をやっていきたいと思います。

**Python in Excelの始め方はこちら**

https://arika-blog.com/pythoninexcel/

**Python環境(Google Colabratory)のアヤメの分類はこちら**

https://arika-blog.com/scikit-learn/

## 動画Ver
YouTubeにこの記事の内容を動画にしたものがあります。
動画で流れを確認したい方はこちらをご活用ください。

<iframe width="" height="400" src="https://www.youtube.com/embed/10w7vi91jlM?si=lqEf6jqpSLLJ6C7N" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## 概要

アヤメの分類は機械学習の中でも**教師あり学習**の範囲になります。
教師あり学習とは、学習データに答えを付けた状態で学習をさせる方法です。

つまり、機械学習モデルに対して答え付きでデータを渡し学習をさせ、未知のデータに対して分類をさせます。

※同じ写真ばかり使っていますが実際は違うもの（データ）を準備します。

![図解　ブログ用 (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/071a46d7-92bc-fe31-1528-a6918f0df573.png)


機械学習にはscikit-learnを使用します。機械学習ライブラリというもので、様々なアルゴリズムを使うことができますが、今回はサポートベクトルマシン（サポートベクターマシン）というアルゴリズムを使って分類を行います。

サポートベクトルマシンは簡単に言うと、データに対して境界線を引くことで分類をしていくアルゴリズムです。

![図解　ブログ用 (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/6d00e0c6-98c8-6cd2-76f8-8f0adf780815.png)

## Step1 機械学習に使うデータを準備する

機械学習を使うデータを準備していきます。ExcelでPythonを使うには＝Py( とセルに入力するか、数式タブのPythonの挿入ボタンを押します。

![スクリーンショット (556).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/ca889174-9030-bb5b-83a9-de90c8ab2a9f.png)


`iris = load_iris()`でアヤメのデータセットをダウンロードします。

この先`import`という単語が良く出てきますが、これはscikit-learnやpandasなどと言った便利な機能を持つものを使うために宣言をしています。


~~~py
from sklearn.datasets import load_iris

iris = load_iris()
~~~

実行するとBunchと出力されます。Bunchとは束という意味でこの中には色々なデータが含まれています。このデータの中から必要なものだけ取り出していきます。

![スクリーンショット (548).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/238fb0dc-6d21-91e8-e1a8-f5129528f410.png)

ここでpandasというライブラリを使用します。pandasは表形式を扱うライブラリで、2次元（Excelで言う表データ）のDataFrameと1次元のSeriesというものがあります。

![図解　ブログ用 (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/aa66cc4b-7ded-b27e-0ab2-c035221f1483.png)

Bunchの中からアヤメの情報（がく片の長さ、がく片の幅、花びらの長さ、花びらの幅）とそれに対する答え（花の種類）を取り出します。

~~~py
import pandas as pd

iris_data = pd.DataFrame(iris.data, columns=["がく片の長さ","がく片の幅","花びらの長さ","花びらの幅"])
iris_target = pd.DataFrame(iris.target, columns=["花の種類"])
iris_all = pd.concat([iris_data,iris_target], axis=1)
~~~

`import pandas as pd`でpandasを使えるようにしています。`as pd`とはpdという名前で使えるようにしており、Pythonは慣習的にこのように宣言する場合があります。（別にimport pandasでも構いません。）

`pd.DataFrame`でBunchの中にあるデータをDataFrameに変換しています。
`pd.concat`で2つのデータフレームを結合しています。（axis=1で横方向、axis=0で縦方向に結合）

![スクリーンショット (549).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/bab7425c-519f-5f2b-5184-ba62abdaccde.png)

セルにDataFrameと出力されます。Python形式で表示されているのでExcel形式に変換します。

![図解　ブログ用 (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/6794c38e-0b5f-b4e1-3680-ed92b5cdc3fe.png)

データを確認することができました。

![スクリーンショット (551).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/e03a4258-9844-3c03-df42-fbd009b6575f.png)

次に、このデータを学習用とテスト用に分けます。scikit-learnにはtrain_test_splitというデータを分ける便利な機能があるのですが、どういうわけかPython in Excelで使うことができませんでした。（もし何か知っている方がいたら教えてください。）

なので今回はpandasを使って自力でデータを分割します。

~~~py
iris_df = iris_all.sample(frac=1)
train = iris_df[:100]
test = iris_df[100:]
X_train = train.loc[:,["がく片の長さ","がく片の幅","花びらの長さ","花びらの幅"]]
y_train = train.loc[:,"花の種類"]
X_test = test.loc[:,["がく片の長さ","がく片の幅","花びらの長さ","花びらの幅"]]
y_test = test.loc[:,"花の種類"]
~~~

`iris_df = iris_all.sample(frac=1)`でデータをランダムに並べ替えます。
今回は、150ヶのデータセットになるので、学習用に100ヶ、テスト用に50ヶで分けます。（2行目と3行目）
そして分けたデータに対して、さらにアヤメの情報と答えで分けます。（4～7行目）

X_train,y_train,X_test,y_testをそれぞれを出力するとこんな感じ。

![図解　ブログ用 (21).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/106f30db-fafa-5a41-302b-ddb6f3151203.png)

これでデータの準備は完了です！

## Step2 機械学習を使って未知のデータを予測しよう

準備したデータを使って機械学習を実装していきます。
まずは学習用のデータを使って機械学習モデルを作ります。

~~~py
from sklearn import svm

model = svm.LinearSVC(max_iter=1000)
model.fit(xl("B2:E101"), xl("H2:H101"))
~~~

`max_iter`は学習回数になります。`model.fit`で学習をさせていますが、`xl`でX_train,y_trainの範囲を指定しています。

![スクリーンショット (553).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/f416457d-61b0-e4d7-d4d2-777ec7dfd075.png)

学習が完了するとLinearSVCと出力されます。

この機械学習モデルを使って未知のデータを予測をします。

~~~py
pred = model.predict(xl("K2:N51"))
ans = pd.DataFrame(pred,columns=["推論結果"])
~~~

` model.predict`で先ほど作成したモデルを使って推論を行っています。`xl`にはX_testを指定します。

出力結果を確認すると、ある程度正解していることが分かります。（左側がy_testで右側が推論結果になります。）

![スクリーンショット (554).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/6255c725-50fc-0dbd-f505-166f5d104aae.png)

最後に正答率を確認します。

~~~py
from sklearn.metrics import accuracy_score
accuracy_score(xl("Q2:Q51"), pred)
~~~

`xl`はy_testを指定します。

![スクリーンショット (555).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/1b7f703a-b0cd-312a-1b54-c7f2606e7fb9.png)

今回の正答率は96％（画面右上）でした。max_iterの回数を上げればもう少し精度が上がるかもしれません。（別のアルゴリズムを使うのもありです。）

## おわりに
今回はPython in Excelを使ってアヤメの分類を行いました。
比較的短いコードで実装できるので、興味のある方は是非挑戦してみてください。（scikit-learnには他のサンプルデータセットもあります。）

YouTubeにて、Pythonチュートリアル（公式ドキュメント）を使ってPythonの基礎文法を解説しています。
こちらもよろしければご活用ください。

https://www.youtube.com/channel/UCl_e49nQhOMoYkQOo_4ew2Q

**あわせて読みたい**

https://qiita.com/python_academia/items/f2b3833b457e79a9bdcd