mengineer's blog

ニッチなネタばかりですが。

Excel無しでR2を計算してみる

以前書いた下記ネタの続きです

mengineer.hatenablog.com

mengineer.hatenablog.com

この時は、C#からExcelを起動→LINEST関数を呼んで計算する方法でしたが、
今回はExcelを使わずに、C#内でR2を計算する方法を検討してみました。

再び、R2とは?

今回は下記サイトを参考にして検討しました。

bellcurve.jp

要は、①回帰式を求める → ②回帰式を使って予測値を計算 →
③残差変動(実測値と予測値の差)を計算 という流れになります。

残差変動の二乗和を、全変動(実測値と平均との差)の二乗和で割り、
それを1から引いたものを決定係数R2としています。

 \displaystyle
R^2 = 1 - \frac{\Sigma_{i=1}^{n} (y_i-\widehat{y_i})^2}{\Sigma_{i=1}^{n} (y_i-\overline{y})^2}

 \widehat{y_i}は回帰式より求めた予測値、 \overline{y}は実測値の平均値、
予測値が実測値に近くなるほどR2は1に近づく、という訳です。

以前のネタで決定係数には何種類か定義が有り、
Excelがどの方法か判らないと書きましたが、上式が最も一般的な定義らしいです。

回帰式を求める

次は先ほどの①、回帰式の計算です、今回は下記サイトの計算式を使いました。

最小2乗法

y=ax+b(直線)の場合、およびy=ax2+bx+c(2次曲線)の場合の計算式を使います。

正直、詳しい仕組みは理解出来ていませんが、Excelの線形近似/多項式近似でも、
最小二乗法を使っているそうなので、それなりに近い式が得られることを期待。

ここで得た式(→回帰式)が、より近似出来ているほど予測値は実測値に近づき、
結果として決定係数R2も1に近づくので、実はここが一番のポイント!

C#でプログラム

というわけで、あとはプログラムするだけです、サンプルソフトを作成しました、
画面のXとYにデータを貼り付けて、”X/Yデータ取得”ボタンを押すと計算します。

f:id:mengineer:20170904132500p:plain

以前のネタと同じ簡単なデータで試してみます、まずは線形近似の場合

f:id:mengineer:20170904132630p:plain

近似式 { y = ax + b} で、aは9.6、bが1、R2は0.9944となり、
ExcelのLINEST関数と全く同じ結果が得られました!

次に多項式近似(二次)の場合

f:id:mengineer:20170904133012p:plain

近似式 { y = ax^2 + bx + c}で、aは-0.1429、bは10.457、cは0、
R2は0.9947となり、こちらもほぼ同じ結果が得られました。

Excelでcは9E-14(ほぼ0)になってますが、計算誤差っぽいですね。

f:id:mengineer:20160530201329p:plain

ソースファイルは下記参照

決定係数R2計算

まとめ

最小二乗法を使って回帰式を求めることで、Excelで求めていたのと同じ結果を
得られそうなことが判りました、Excelが無い環境でも計算出来るので便利。

ExcelのLINEST関数等は、今回と同じような計算を内部でやっているんでしょうね。

余談ですが今回もインターネットの便利さを痛感、色々有用な情報が開示されてて、 本当に助かりました、参考にさせて頂いたサイトの皆さんに感謝致します!