判別分析をしてみよう!~pythonでデータ分析をしてみよう~【経営工学を専門にしている大学生の日記】


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

今回は判別分析について解説していきたいと思います。

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

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


普段はNBAのデータ分析をしたりしています。
ぜひこちらの記事も読んでみてください!

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


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


そもそも経営工学とは何なのでしょうか。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は機械学習やデータ分析をするのに無料で使える非常に便利なライブラリです。

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

判別分析をするにはscikit-learnからLDAというものをインポートする必要があります。LDAはLinear Discriminant Analysisの略で日本語では線形判別分析と訳します。(判別分析には線形判別や非線形判別などがありますが、少し難しい話になるので飛ばします。今回の記事では線形判別分析のことを判別分析と言っていると思ってください。)

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

STEP.3 データを整える


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

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

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