Pythonによる重回帰分析

Pythonで重回帰分析を行ってみます。

先にPythonによる単回帰分析の記事を読んでいただいたほうが分かりやすいかもしれませんが、こちらのみ読んでいただいても分かるようにはしております。
また、今回もstatsmodelsライブラリを使用します。

Pythonによる回帰分析と結果の可視化

データの読み込み・重回帰分析の実行

今回は以下のようなデータを用いて、「temperature」(=気温)「price」(=アイスの値段)「rainy」(=雨かどうか)の3データから、「sales」(=アイスの売上)を予測してみます。

– 既知のデータ(sales_data.csv)

– 予測対象データ(sales_future.csv)

まずは以下のようにデータを読み込んで、回帰分析を実行します。
ここは単回帰分析とほとんど一緒です。

回帰分析に用いる列をX_nameに指定しています。
そして、最後のprintを実行すると・・・

「月平均気温」の値を\(x_1\)、「値段」の値を\(x_2\)、「雨」の値を\(x_3\)、とすると、\(y=48.2 x_1+1.2 x_2+193.0 x_3-341.0\)という関係があるという関係が分かりました。

上部の「Adj. R-squared」が「自由度調整済み\(R^2\)値」に当たり、0.825と計算されています。
中段の表内の「P>|t|」が、変数ごとのp値を表します。

いずれもExcelによる重回帰分析と同じ結果のようです。

変数の選択

重回帰分析で大切なのは、どの変数が大事で、どの変数が不要なのかをきちんと見極める事です。

例えば、上の結果を見てみると、「price」のp値が低いので、「price」列を消して重回帰分析してみたいですね。
その時、Excelだと、自ら不要な列を消して、再度、「データ分析」メニューから使用列を選択して重回帰分析を実行・・・という手順を踏まなければいけません。
しかしpythonでは「使う列の名前」を変更してプログラムを実行してあげるだけです。

今回の例で言えば、上記プログラムのX_nameを
X_name = ["temperature", "price", "rainy"]
から
X_name = ["temperature", "rainy"]
と変更し、実行するだけでOKです。

すると、以下のようになりました。

こちらも、Excelの時と同様の結果が得られているようです。
「Adj. R-squared」が先程より僅かに上がり、「temperature」と「rainy」のp値も低いことから、「price」を用いないほうが良い推測だと考えられます。

未知のデータの推測

それでは、「temperature」と「rainy」を用いて、未知のデータに対する予測をしてみます。
といっても先の回帰分析の結果と、読み込んだ「sales_future_j.csv」を使って機械的に計算するだけになります。

ソースは以下。

最後の「y_result」に結果が格納されました。
また、この結果をExcelに書き出したいのなら以下のようにします。(単回帰の時と一緒です。)

作成されたresult.csvを見てみると・・・。

無事に先程の結果がcsvに反映されているようです。

まとめ

さて、今回はPythonで重回帰分析を行ってみました。

重回帰分析は今回扱った変数選択以外にも、データの欠損値や外れ値を除外したり、また「ほとんど同じ列」が含まれていないか確認したりと考えることはたくさんあります。
そう考えると、Excelでも計算は可能ですが、圧倒的にPythonの方が便利で自由度の高い分析ができます。

入力するcsvの形式を合わせれば、あとはソースのコピペで動くと思われますので、ご活用ください。