![見出し画像](https://assets.st-note.com/production/uploads/images/78021641/rectangle_large_type_2_678fecc2721a2f9fa96cd11bf70a95d4.jpeg?width=1200)
Pythonでべき乗回帰(Power Regression)
(1)べき乗回帰を行なう
今回はべき乗回帰(Power Regression)の計算と図の作成をしたいと思います。簡単に計算できるパッケージはなさそうですね。使用頻度が高い分析方法ではないからでしょうかね。
(2)使うデータ
いつもどおりのirisデータだと、ちょっと変な感じになりましたので、以下のようなデータを用意しました。(noteって表はつくれないんですかね。csvからコピペすると図になってしまう…)
![](https://assets.st-note.com/img/1651910046098-t50n0TmCr1.png)
(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()
出来上がりの図はこちらです。
![](https://assets.st-note.com/img/1651909874121-vqLKFUgRR1.png?width=1200)
以下、解説です。
■6~8行目
#自然対数をとる
df['X-value_log'] = np.log(df['X-value'])
df['Y-value_log'] = np.log(df['Y-value'])
Numpyの関数を用いて、自然対数をとります。他は前回と同じですね。
(5)単回帰直線との比較
こんな感じです。
![](https://assets.st-note.com/img/1651909940934-hVBYQECFzM.png?width=1200)
(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