この記事を読んでわかること
- 単回帰分析/重回帰分析の意味
- 単回帰分析/重回帰分析のやり方
- 単回帰分析/重回帰分析のサンプルコード
今回実践練習として扱う例題は赤ワインの評価基準の分類です。
※単回帰分析/重回帰分析とは?
単回帰分析/重回帰分析とは与えられた数値データから、予測したい事象との関係性を数値化する分析手法です。
例えば、夏の期間気温に比例してコンビニではアイスが売られますが、何度の時に何個のアイスクリームを在庫として用意しておけば良いかなどを予測する手法です。
目次
用意するパッケージ
まずは以下のパッケージを用意しましょう。
・numpy … 数値の計算を効率化するパッケージ
・pandas … 集めたデータをcsvファイル化するパッケージ
・matplotlib … より直感的なグラフを表示するパッケージ
・scikit-learn … 単回帰分析/重回帰分析を行うパッケージ
単回帰分析と重回帰分析は以下の手順で進めてください。
単回帰分析/重回帰分析の流れ
⑴ 単回帰分析
① 必要なパッケージのインストール
② データサンプルをダウンロードし俯瞰
③ データの加工
④ 単回帰分析の実施
⑤ 予測結果の確認
まずは単回帰分析から見ていきましょう
① 必要なパッケージのインストール
# 基本的に必要なパッケージのインストール
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model
② データサンプルをダウンロードし俯瞰
今回はUCバークレー大学が提供している1600本分のワインの評価について分析していきます。
ワインデータのダウンロード先はこちら↓(今回は上から2番目の赤ワインデータを使用します)
https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/
ダウンロードしたらpython上でデータを取得し俯瞰します。
# データの読み込み
df = pd.read_csv("winequality-red.csv", sep=";")
df.head()

それぞれのカラムについて説明していきます。
fixed acidity | 酒石酸濃度 |
volatile acidity | 酢酸濃度 |
citric acid | クエン酸濃度 |
residual sugar | 残留糖分濃度 |
chlorides | 塩化ナトリウム濃度 |
free sulfur dioxide | 遊離亜硫酸濃度 |
total sulfur dioxide | 総亜硫酸濃度 |
density | 密度 |
pH | pH |
sulphates | 硫酸カリウム濃度 |
alcohol | アルコール度数 |
quality | ワインの評価 |
③ データの加工
今回の単回帰分析では目的変数をpHに、説明変数を酒石酸濃度にして分析を実装します。
# 目的変数の選択(pH)
y = df.loc[:, ["pH"]].as_matrix()
y

# 説明変数の選択(酒石酸濃度)
x = df.loc[:, ["fixed acidity"]].as_matrix()
x

④ 単回帰分析の実施
# 単回帰分析の実施
clf = linear_model.LinearRegression()
clf.fit(x,y)
単回帰分析を実装します。
⑤ 予測結果の確認
# 横軸をpHに縦軸を酢酸濃度にしたグラフをプロット(青色)
plt.scatter(x,y)
# 単回帰分析で計算した回帰直線をプロット(赤色)
plt.plot(x, clf.predict(x),color = "red")
# 分析結果
print("係数は", clf.coef_, "で")
print("切片は", clf.intercept_, "で")
print("決定係数は", clf.score(x, y), "です。")

決定係数も0.47と信頼性の高い単回帰分析ができました。
次は重回帰分析を行います。前半は単回帰分析と同じなのでデータの加工から説明します。
⑵ 重回帰分析
① データの加工
② 重回帰分析の実施
③ 予測結果の確認
① データの加工
# 重回帰分析を行う際の説明変数(quality以外)の指定
a = df.drop("quality", axis = 1)
a.head()

# 目的変数の指定(quality)
b = df["quality"]
b.head()

重回帰分析ではqualityを目的変数に、それ以外全てを説明変数にして分析を実施します。
② 重回帰分析の実施
clf = linear_model.LinearRegression()
clf.fit(a,b)
基本的に分析の実装方法は単回帰分析も重回帰分析も同じです。
③ 予測結果の確認
# 分析結果
print("各回帰係数")
print(pd.DataFrame({"Name":a.columns,"Coefficients":np.abs(clf.coef_)}))
print("切片は", clf.intercept_, "で")
print("決定係数は", clf.score(a, b), "です")

決定係数は0.36と、こちらも単回帰分析と同じく信頼性の高い分析結果を確認できました。
まとめ
以上が単回帰分析/重回帰分析の実装練習です。
もう少し分析精度を上げたい場合、それぞれの説明変数の標準化などを行うと上がると思います。
このコードはそのまま他のデータでもお使い可能なので、エラーが出るところだけ修正して使ってみてもいいかもしれないですね!
ぜひみなさんの単回帰/重回帰分析ライフを応援しています!
それでは最後に今回使ったコードを下に載せておきます。
今回、単回帰分析/重回帰分析に使用したコード
# 基本的に必要なパッケージのインストール
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model
# データの読み込み
df = pd.read_csv("winequality-red.csv", sep=";")
df.head()
# 目的変数の選択(pH)
y = df.loc[:, ["pH"]].as_matrix()
y
# 説明変数の選択(酸濃度)
x = df.loc[:, ["fixed acidity"]].as_matrix()
x
# 単回帰分析の実施
clf = linear_model.LinearRegression()
clf.fit(x,y)
# 横軸をpHに縦軸を酢酸濃度にしたグラフをプロット(青色)
plt.scatter(x,y)
# 単回帰分析で計算した回帰直線をプロット(赤色)
plt.plot(x, clf.predict(x),color = "red")
# 分析結果
print("係数は", clf.coef_, "で")
print("切片は", clf.intercept_, "で")
print("決定係数は", clf.score(x, y), "です。")
# 重回帰分析を行う際の説明変数(quality以外)の指定
a = df.drop("quality", axis = 1)
a.head()
# 目的変数の指定(quality)
b = df["quality"]
b.head()
# 重回帰分析の実施
clf = linear_model.LinearRegression()
clf.fit(a,b)
# 分析結果
print("各回帰係数")
print(pd.DataFrame({"Name":a.columns,"Coefficients":np.abs(clf.coef_)}))
print("切片は", clf.intercept_, "で")
print("決定係数は", clf.score(a, b), "です")