Pythonで回帰分析を行って散布図に回帰直線を描画する方法

Pythonで回帰分析を行って散布図に回帰直線を描画する方法 プログラミング

この記事では、Pythonで回帰分析を行う方法を説明します。
また、次のような散布図に回帰直線を描画するための説明も行います。

Pythonで作成した散布図に回帰直線を描画

本記事の内容

  • Pythonで回帰分析を行う環境
  • Pythonで散布図を作成する
  • Pythonで回帰分析を行う
  • Pyhtonで散布図に回帰直線を引く

上記の項目に沿って、本記事の説明を行います。
まずは、この記事で用いた環境の説明からです。

Pythonで散布図を作成するための環境

  • Windows 10 Home (バージョン1909)※以下の説明は64bit前提
  • Python 3.7.3
  • NumPy 1.18.5
  • Matplotlib 3.2.1
  • Pandas 0.24.2
  • scikit-learn  0.20.3
  • xlrd 1.2.0

Pythonの上記ライブラリは、すべてインストールしておいてください。
ほぼ、インストール済みとは思いますが、念のためインストールコマンドを載せておきます。

pip install numpy
pip install matplotlib
pip install pandas
pip install scikit-learn
pip install xlrd

Matplotlibのグラフを日本語化対応していない場合は、以下の記事をご覧ください。
この記事を参考にすれば、日本語化対応が簡単にできます。

Pythonで散布図を作成する

散布図の作成は、次の記事をご覧ください。
Matplotlibを使ったグラフ作成の基本から学ぶことができます。

早くPythonで回帰分析の方法を確認したい場合は、下記のコードを利用してください。
環境さえ整っていれば、コピペで動きます。

以下、下記コードを「散布図作成コード」と呼びます。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_excel('data/DL4.xls', sheet_name=0)

# 欠損値が一つでも含まれる行を削除
df = df.dropna(how='any')
x = df['週別気温']
y = df['週別指数']

# 目盛の値
x_scale = 5
y_scale = 2.5
xscale = np.arange(0, (max(x)+1)*x_scale, x_scale)
yscale = np.arange(0, (max(y)+1)*y_scale, y_scale)

fig = plt.figure(dpi=100, figsize=(4.6,3.8))
fig.suptitle('品目:スポーツ飲料等', fontsize=10, x=0.27, y=0.87)
ax = fig.add_subplot(111)
ax.yaxis.set_label_coords(-0.07,0.4)

# 散布図を描画
plt.scatter(x, y, c='#00FFFF', edgecolors="#37BAF2")
plt.title("東京都", fontsize=17)
plt.xticks(xscale, fontsize=8)
plt.yticks(yscale, fontsize=8)
plt.xlabel("平均気温(℃)", fontsize=10)
plt.ylabel("販\n売\n指\n数", fontsize=10, rotation=0)
plt.xlim(0, 35)
plt.ylim(0.0, 2.5)

plt.gca().spines['right'].set_visible(False)

plt.subplots_adjust(left=0.1, right=0.98, bottom=0.13, top=0.89)
plt.savefig("result1.png", facecolor="white")

ただし、エクセルデータ「DL4.xls」のダウンロードは、必要です。
上の記事にダウンロード方法を載せています。

エクセルファイルも用意して、上記のコードを実行すると以下のグラフが表示(保存)されます。

Pythonで作成した散布図

よって、上記コードをもとに回帰分析を行っていきます。
結果的に、上の散布図に回帰直線が描画されることになります。
また、決定係数の表示も対応します。

Pythonで回帰分析を行う

ここまでの準備が整っていれば、簡単にPythonで回帰分析は可能です。
なお、回帰分析には、機会学習用のライブラリであるscikit-learnを利用します。

上記で載せた「散布図作成コード」に、コードを追加します。
そして、追加したコードは以下。
2か所に追加しています。

from sklearn.linear_model import LinearRegression

まずは、必要モジュールの読み込みですね。
「LinearRegression」は、線形回帰と表しています。
そのままの名前のモジュールをimportです。

# 回帰分析 線形
mod = LinearRegression()
df_x = pd.DataFrame(x)
df_y = pd.DataFrame(y)
# 線形回帰モデル、予測値、R^2を評価
mod_lin = mod.fit(df_x, df_y)
y_lin_fit = mod_lin.predict(df_x)
r2_lin = mod.score(df_x, df_y)
ax.text(19.0, 0.6, '$ R^{2} $=' + str(round(r2_lin, 4)))
plt.plot(df_x, y_lin_fit, color = '#000000', linewidth=0.5)

fit関数では、DataFrameを引数にしています。
そのため、xやyをSeriesからDataFrameに変換する必要があります。

それ以外は、おまじないのようなモノです。
mod_linとy_lin_fitは、回帰直線を描くために必要となります。

r2_linは、決定係数です。
この決定係数は、0~1の間の値を取ります。

この記事では、回帰分析の説明自体を行いません。
あくまでPythonで回帰分析を行う方法を説明することが目的です。

話がそれましたが、Pythonでの回帰分析はたった数行でできます。
これもすべて、便利なライブラリのおかげです。

ここまでライブラリが便利だと、関数に渡すデータを用意するまでポイントになりますね。
今回のプログラムであれば、df_xとdf_yを作るまでと言えます。

Pythonで回帰分析を行う方法は、以上です。

Pyhtonで散布図に回帰直線を引く

散布図に回帰直線を描画・決定係数を表示するコードは以下。

ax.text(19.0, 0.6, '$ R^{2} $=' + str(round(r2_lin, 4)))
plt.plot(df_x, y_lin_fit, color = '#000000', linewidth=0.5)

たった、2行です。
もし、axやpltの詳細を知りたい場合は、次の記事をご覧ください。

回帰分析を行うコードと、回帰直線を描く(決定係数の表示含む)コードを「散布図作成コード」に追加します。
この状態のコードは以下。

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

df = pd.read_excel('data/DL4.xls', sheet_name=0)

# 欠損値が一つでも含まれる行を削除
df = df.dropna(how='any')
x = df['週別気温']
y = df['週別指数']

# 目盛の値
x_scale = 5
y_scale = 2.5
xscale = np.arange(0, (max(x)+1)*x_scale, x_scale)
yscale = np.arange(0, (max(y)+1)*y_scale, y_scale)

fig = plt.figure(dpi=100, figsize=(4.6,3.8))
fig.suptitle('品目:スポーツ飲料等', fontsize=10, x=0.27, y=0.87)
ax = fig.add_subplot(111)
ax.yaxis.set_label_coords(-0.07,0.4)

# 散布図を描画
plt.scatter(x, y, c='#00FFFF', edgecolors="#37BAF2")
plt.title("東京都", fontsize=17, fontweight="bold")
plt.xticks(xscale, fontsize=8)
plt.yticks(yscale, fontsize=8)
plt.xlabel("平均気温(℃)", fontsize=10)
plt.ylabel("販\n売\n指\n数", fontsize=10, rotation=0)
plt.xlim(0, 35)
plt.ylim(0.0, 2.5)

# 回帰分析 線形
mod = LinearRegression()
df_x = pd.DataFrame(x)
df_y = pd.DataFrame(y)
# 線形回帰モデル、予測値、R^2を評価
mod_lin = mod.fit(df_x, df_y)
y_lin_fit = mod_lin.predict(df_x)
r2_lin = mod.score(df_x, df_y)
ax.text(19.0, 0.6, '$ R^{2} $=' + str(round(r2_lin, 4)))
plt.plot(df_x, y_lin_fit, color = '#000000', linewidth=0.5)
        
plt.gca().spines['right'].set_visible(False)

plt.subplots_adjust(left=0.1, right=0.98, bottom=0.13, top=0.89)
plt.savefig("result1.png", facecolor="white")

そして、このコードを実行した結果は以下。

Pythonで作成した散布図に回帰直線を描画

冒頭の画像と同じモノになりました。
今回の記事で追加したコードは、10行未満です。

たった、それだけで回帰分析が実行できます。
おまけに、回帰直線も引くことが可能。

このようなデータ解析やグラフ表示を行うとなると、Pythonは圧倒的な破壊力です。
これを他の言語でやろうとすると、かなり大変です。

タイトルとURLをコピーしました