見出し画像

Pythonで最小二乗法を使って線形回帰を行い、回帰係数、決定係数、p値を求める方法

1.はじめに

みなさんこんにちは今日はデータ分析の基本の最小二乗法をpythonで実装する方法を学習していきましょう

2.前提となる基礎知識

最小二乗法とは、観測されたデータをもとに、最もデータにフィットする直線を求める方法のことです。

わかりやすいとして、気温とビールの売上の関係を考えてみましょう。
あるビール会社が、気温が高いほどビールの売り上げが伸びるかどうかを調べるために、店舗ごとに売り上げと気温のデータを集めました。
このデータをもとに、気温が高いほどビールの売り上げが伸びるかどうかを分析するとします。ここでよく使用するのが散布図ですが、この散布図には、気温とビールの売り上げの関係が分かるようにデータがプロットされています。
このデータをもとに、最もフィットする直線(回帰直線)を求めることができます。この回帰直線を使うことで気温とビールの売り上げの関係を数式で表現することができます。

回帰直線のイメージ

この回帰直線を求めるのに使用するのが最小二乗法です。
最小二乗法を使うと、観測されたデータと回帰直線の差(残差)を計算し、その残差の二乗和が最小になるような回帰直線を求めることができます。つまり、最小二乗法を使うと、実際のデータと回帰直線の予測値の差が最小になるような回帰直線を求めることができるのです。

このようにして求めた回帰直線を使えば、ある気温のときに予測されるビールの売り上げを求めることができます。また、回帰直線の傾き(回帰係数)を求めることができれば、気温とビールの売り上げの関係がどのようになっているかを数値的に表現することができます。

3.Pythonで実装する


それではpythonで実装していきましょう
1.ライブラリインポート 今回もtipsのデータを使用します

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.linear_model import LinearRegression
import statsmodels.api as sm
# seabornからtipsデータセットを読み込む
df = sns.load_dataset('tips')
読み込んだデータセット

それでは、
total_bill (支払い総額) とtip(支払われたチップ)の関係を分析します

# 総支払額を特徴量、チップを目的変数として使用する
X = df['total_bill'].values.reshape(-1, 1)
y = df['tip'].values.reshape(-1, 1)
# Xとyの散布図をプロットする
sns.scatterplot(x='total_bill', y='tip', data=df)
plt.show()
X=支払い総額とy=チップの関係

散布図で見ると支払い総額が多いとtipの支払いが多いことがわかりますね。
ではこれに対して最小二乗法で回帰直線を求めます。

# 線形回帰モデルを学習する
lr = LinearRegression()
lr.fit(X, y)

scikit-learnライブラリを使って、線形回帰モデルを学習しました
予測を行いましょう

# 予測を行う
y_pred = lr.predict(X)
# 学習済みモデルの回帰係数を出力する
print(f"回帰係数:{lr.coef_}")
回帰係数:[[0.10502452]]

回帰係数0.105024と求められました

回帰係数は、線形回帰モデルのパラメータの1つで、目的変数(y)と説明変数(X)の関係を定量化する値です。回帰係数は、回帰直線の傾きを表します。

[[0.10502452]]という値は、total_bill(説明変数)の単位増加によって、tip(目的変数)が平均して0.105ドル増加することを意味します。つまり、total_billが1ドル増加すると、tipは平均して0.105ドル増加すると予測されます。

では先ほどの散布図に回帰直線を追加しましょう

# データを含む散布図と線形回帰直線をプロットする
sns.scatterplot(x='total_bill', y='tip', data=df)
sns.lineplot(x=X.ravel(), y=y_pred.ravel(), color='red')
散布図に回帰直線を追加

できましたね!
続いてstatsmodelsライブラリを使って回帰分析を行いましょう

  • 回帰方程式、決定係数、p値を求める

# statsmodelsを使用して回帰分析を行う
X = sm.add_constant(X)
model = sm.OLS(y, X).fit()
coef = model.params[1]
intercept = model.params[0]
r_squared = model.rsquared
p_value = model.pvalues[1]
回帰係数:[[0.10502452]]
回帰方程式: y = 0.92 + 0.11x
決定係数(R2): 0.46
p値: 6.69e-34

求めることができました。

4.結果の解釈

解釈は以下の通りです
回帰方程式 決定係数 p値についての解釈と上のコードを全てまとめたものを載せております。ここまでの内容でも十分使えますが募金と思ってご購入お願いいたします。。。300円です

ここから先は

1,795字

¥ 300

この記事が気に入ったらサポートをしてみませんか?