【これで分かる!】pythonで判別分析をする方法を一つずつ丁寧になるべく分かりやすく解説してみた

この記事で解決できること
  • 判別分析ってなに?
  • 判別分析をpythonで実装したい…
  • 判別分析で実際にデータを分析したい…


こんにちは!しゅんです!

判別分析はデータの種類を分類する分析です。ぼくがデータ分析の勉強をしていたときにでてきたので皆さんにもシェアしたいと思います!また今回は説明と一緒にpythonを使ってどんなものか確かめたいと思います。

それでは解説していきましょう!

もっと深堀り!


今回は判別分析の中でも線形判別分析について解説していきます!


普段は組合せ最適化の記事を書いてたりします。
ぜひ他の記事も読んでみてください!



このブログの簡単な紹介はこちらに書いてあります。
興味があったら見てみてください。

このブログでは経営工学を勉強している現役理系大学生が、経営工学に関することを色々話していきます!


ぼくが経営工学を勉強している中で感じたことや、興味深かったことを皆さんと共有出来たら良いなと思っています。


そもそも経営工学とは何なのでしょうか。Wikipediaによると

経営工学(けいえいこうがく、英: engineering management)は、人・材料・装置・情報・エネルギーを総合したシステムの設計・改善・確立に関する活動である。そのシステムから得られる結果を明示し、予測し、評価するために、工学的な分析・設計の原理・方法とともに、数学、物理および社会科学の専門知識と経験を利用する。

引用元 : 経営工学 – Wikipedia

長々と書いてありますが、要は経営、経済の課題を理系的な観点から解決する学問です。


判別分析ってなに


判別分析をざっくり説明すると、複数のグループに分けられているデータを使って未知のデータがどのグループに属すかを予測することです。下の例を見てみましょう。


これは性別、身長、体重のデータです。下に横軸が身長、縦軸が体重の散布図を載せておきます。


これを見ると右上に男性が固まって左下に女性が固まっていますね。つまりこのデータからは身長と体重が大きい人は男性で小さい人は女性であるという傾向が読み取れます。

ここで1つの疑問が生まれます。

身長と体重が分かったら性別を予測できるのかな?



これを予測するのが判別分析です。男性と女性のように2つのグループのどちらに属すかを予測するのを二値分類と呼びます。一方男性、女性、犬のように3つ以上のグループのどれに属すかを予測するのを多値分類と呼びます。

今回は二値分類をpythonでやっていきましょう。


判別分析をpythonでやってみる


目標は先ほどのデータを使って判別分析をして、下の表にある性別を予測することです。


手順は以下の通りです。

判別分析に用いるデータの作成

今回はpandasを使ってデータを作成したいと思います。

scikit-learnからLDAをインポート

LDAはLinear Discriminant Analysis (線形判別分析) のことです。

データを整える

データを判別分析ができるように変形します。

判別分析を実行

身長と体重を入力したら男または女と出力されるようにします。

得られた結果を用いて未知の性別を予測


それでは1つずつやってみましょう。


STEP.1 判別分析に用いるデータの作成


今回はpandasを使ってデータを作成していこうと思います。pandasはpythonでデータ分析をするときに役立つライブラリです。

# pandasをpdとしてインポートする
import pandas as pd

import pandasだけでもpandasを使うことができますが、この先いちいちコードにpandasって書くのは長くてめんどくさいですよね。as pdを付け足すことでこれ以降pandasを使いたいときはpdと書けばOKになります。


pandasにはデータフレームっていう表があります。ぶっちゃけ判別分析をする際にデータフレームを利用する必要はないんですけど、今回は視覚的に分かりやすく説明するためにデータフレームを使いたいと思います。

# 今回使うデータにdfという名前を付ける
df = pd.DataFrame(data = 
                  {"性別" : ["男","女","女","男","男","男","女","男","女","女"],
                   "身長" : [170,158,163,172,166,169,160,176,165,159],
                   "体重" : [60,52,55,68,70,58,58,60,58,50]   
                  })

データフレームはpd,DataFrame()で作ることができます。(本当はpandas.DataFrameですが最初にpandasをpdと省略することを宣言したのでpdで大丈夫です。このように簡潔にコードを書くことができるので基本的にはimport pandas as pdを使います。)

これを表示してみます。

# dfを表示
df

データフレームはこのように表になっています。csvファイルを使いたいときなどに非常によく使います。

線形判別には使いませんが一応散布図のコードも載せておきます。

#男女で色分けしてプロットした散布図
import matplotlib.pyplot as plt
df_Men = df[df["性別"] == "男"]
df_Women = df[df["性別"] == "女"]
plt.scatter(df_Men["身長"],df_Men["体重"], color = "blue",label = "Men")
plt.scatter(df_Women["身長"],df_Women["体重"], color = "red", label = "Women")
plt.xlabel("Height")
plt.ylabel("Weight")
plt.legend()
plt.show()

今回は重要でないので説明は省略します。気になる人がいたら散布図の作り方を調べてみてください!


STEP.2 scikit-learnからLDAをインポート

#scikit-learnのdiscriminant_anapysis(判別分析)からLDA(線形判別分析)をインポート
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

scikit-learnは機械学習やデータ分析をするのに無料で使える非常に便利なライブラリです。

機械学習やデータ分析をするには色々数式を駆使する必要があります。したがってpythonで実装する場合も何行にも及ぶ計算式をプログラムする必要があります。それは面倒ですよね。scikit-learnはこのようなめんどいプログラムを全部やってくれる非常に便利なやつなんです。

判別分析をするにはscikit-learnからLDAというものをインポートする必要があります。LDAはLinear Discriminant Analysisの略で日本語では線形判別分析と訳します。


STEP.3 予測に使うデータと予測したいデータに分ける

# 身長、体重のデータを用意する
x = df[["身長","体重"]]
# 性別のデータを用意する
y = df["性別"]

判別分析は「身長、体重」のデータから「性別」を予測することです。そのためdfをこの2グループに分ける必要があります。今回は「身長、体重」をx、「性別」をyとします

dfの中からある1列を抽出したい場合は「df[“列の名前”]」でできます。また2列以上抽出したい場合は「df[[“1列目の名前”, “2列目の名前”, …]]」でできます。

もっと深堀り!


予測に使うデータを説明変数、予測したいデータを目的変数と言ったりします。


STEP.4 判別分析を実行

# 判別分析を実行
lda = LinearDiscriminantAnalysis()
lda.fit(x, y)

ここまでで判別分析をするための下準備が整いました。それでは上のコードで判別分析をやってみましょう。判別分析の結果にはldaという名前を付けました。(別に名前は何でもよいです。)

これでもう判別分析ができてしまいました。判別分析の結果は下のグラフのようになります。

今回の判別分析では、この斜めの線よりも右上だったら男性と判断し、左下だったら女性と判断するようです。

もっと深堀り!


今回扱うデータのように、直線で分類できるデータに対しては線形判別分析を活用することができます。一方で直線で分類することが難しいデータに対しては、線形判別分析はあまり有効ではなく他の分析手法を使う必要があります。


STEP.5 得られた結果を用いて未知の性別を予測


それでは最後に未知のデータを予測していきましょう。下のデータを予測したいと思います。


まずは身長と体重のデータを用意しましょう。データフレーム形式にするのがめんどいので普通のリストで作成します。リストでも判別分析はできます。

# 予測するデータを作成
new_x = [[185,72],[166,58],[153,45]]

判別分析で得られた結果から未知のデータを予測するには自分で付けた名前(今回はlda)の後ろに「.predict()」をくっつければ良いです。()の中には予測したいデータを入れてください。下のようになります。

# 未知のデータを予測して表示する
print(lda.predict(new_x))

ということで今回の判別分析の結果によると、左のデータから順に男性、女性、女性と判断されるようです。


おわりに


いかがでしたでしょうか。

今回の記事ではpythonを使って判別分析について説明していきました。こんな感じでプログラミングを使えばいろいろなことができます。非常に興味深いですよね。

データの数値をいじるとまた違う結果が得られるので興味がある人はぜひやってみてください!またこの記事では判別分析の中でも線形判別分析について説明しました。他にも色々な手法があるので是非調べてやってみてください!

これからもこのようにプログラミングで色々やっていきたいと思います。ぼくが一番勉強になるので続けていきたいです!

最後までこの記事を読んでくれてありがとうございました。

この記事が役に立ったら幸いです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA