見出し画像

Pythonでべき乗回帰(Power Regression)

(1)べき乗回帰を行なう

今回はべき乗回帰(Power Regression)の計算と図の作成をしたいと思います。簡単に計算できるパッケージはなさそうですね。使用頻度が高い分析方法ではないからでしょうかね。

(2)使うデータ

いつもどおりのirisデータだと、ちょっと変な感じになりましたので、以下のようなデータを用意しました。(noteって表はつくれないんですかね。csvからコピペすると図になってしまう…)

(3)べき乗回帰とは。

べき乗回帰(Power Regression)は非線形回帰の1つで、以下の式になります。

$$
y=aX^b
$$

ここで、①変数X、yの自然対数をとり、②①の2つを用いて単回帰分析を行なうことで、式中の係数a、bを計算できます。そのため、ここで示すべき乗回帰は、データを対数変換して直線近似した結果となります。

(4)実際に計算してみる。

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

df = pd.read_csv('test.csv')

#自然対数をとる
df['X-value_log'] = np.log(df['X-value'])
df['Y-value_log'] = np.log(df['Y-value'])

#変数を指定。[]が2つあるのは、sklearnとPandasの関係性のため。
X = df[['X-value_log']]
Y = df[['Y-value_log']]

#単回帰分析
reg = LinearRegression().fit(X, Y)

#予測結果をdfに追加
df['pred'] = np.exp(reg.intercept_) * df['X-value'] **reg.coef_[0, 0]

#図にしてみます。
plt.xticks(np.arange(0, 22, 1))
plt.xlim(0, 21)
plt.yticks(np.arange(0, 1.6, 0.1))
plt.ylim(0, 1.5)

plt.xlabel('X-value')
plt.ylabel('Y-value')

plt.scatter(df['X-value'], df['Y-value'])
plt.plot(df['X-value'], df['pred'], color='orange', label="べき乗回帰曲線")
plt.legend()
plt.show()

出来上がりの図はこちらです。

以下、解説です。

■6~8行目

#自然対数をとる
df['X-value_log'] = np.log(df['X-value'])
df['Y-value_log'] = np.log(df['Y-value'])

Numpyの関数を用いて、自然対数をとります。他は前回と同じですね。

(5)単回帰直線との比較

こんな感じです。

(6)まとめ

scipy(from scipy.optimize import curve_fit)を使えば、いろいろな非線形回帰もできるようですが、まだ使ったことはないです(勉強します)。べき乗回帰くらい簡単な場合は、今回のような近似でもいいのでは?と思いました。

(7)参考

from scipy.optimize import curve_fitについてはここです。
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html