iris(あやめ)データを利用して、単回帰分析を行いmatplotlibで結果を表示させてみます。
irisデータには、setosa(セトナ)、versicolor(バーシクル)、virginica(バージニカ)の3種類のirisそれぞれにおいて、sepal length(がく片の長さ「単位cm」)、sepal width(がく片の幅)、petal length(花びらの長さ)、petal width(花びらの幅)のデータが収められています。
今回はsetosaのsepal lengthとsepal widthに焦点をしぼり単回帰分析を行い、単回帰式を表示させてみます。
関連ページ
スポンサーリンク
開発環境
Mac(OS X EL Captin/10.11.3)
Python 3.5.1 :: Anaconda 2.5.0 (x86_64)
jupiter 4.0.6 scikit-learn 0.17
pandas 0.18.0 matplotlib 1.5.1
numpy 1.10.4
単回帰分析の大まかな流れは以下のようになります。
2変数のデータの関係を可視化(散布図)し、相関係数を確認する。
単回帰式(y=a+bx)を求める。
aが切片、bが偏回帰係数。
xを説明変数、yを目的変数。単回帰分析に値を代入し、予測する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn import datasets,linear_model #Irisデータを読み込む iris = datasets.load_iris() #データフレーム作成 df = pd.DataFrame(iris.data, columns = ['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth']) #「Name」を追加 df["Name"] = pd.Series(iris.target) #Nameにirisの種別名を適用していく df["Name"] = df["Name"].apply(lambda x: iris.target_names[x]) #線形回帰モデルを生成する model = linear_model.LinearRegression() #setosaのがく片と花びらのデータを抽出 setosa = df[df['Name']=='setosa'] X = setosa[["SepalLength"]] Y = setosa[["SepalWidth"]] #モデルにデータを学習させる model.fit(X, Y) #散布図 plt.scatter(X, Y, color="black") #Xの最小値から最大値まで0.1刻み、モデルに合わせてYの値を出力 #[:,np.newaxis]で2次元データに変換する px = np.arange(X.min(), X.max(), .01)[:,np.newaxis] #学習したモデルでpyを出力 py = model.predict(px) #回帰直線 plt.plot(px, py, color="blue", linewidth=1) plt.title("散布図と単回帰式") plt.xlabel("SepalLength") plt.ylabel("SepalWidth") plt.show() |
正の相関があることを確認できます。
切片、偏回帰係数等は以下のようになります。
1 2 3 4 5 6 7 8 |
print(model.intercept_) #切片=>[-0.62301173] print(model.coef_) #偏回帰係数(傾き)=>[[ 0.80723367]] print(model.score(X,Y))#決定係数=>0.557680925892 corr = np.corrcoef(setosa["SepalLength"],setosa["SepalWidth"]) print(corr[0,1])#相関係数=>0.746780373264 |
参照文献
第4章 Pythonによる機械学習 早川敦士
Chapter05 未知のデータを予測する