Python 数学、統計、機械学習:散布図と相関分析(2) 単回帰分析

1.単回帰分析

  • 単回帰分析とは、2つのデータ群を「原因」と「結果」でとらえたときに、その関係を「回帰直線」であらわすことのできる分析手法
  • 単回帰式 y = ax + b を求めることで、値を予測できる
項目 内容
説明変数(x) 原因系のデータ
目的変数(y) 結果系のデータ
回帰係数(a) 最小二乗法による傾き
切片(b) 最小二乗法によるy切片
決定係数回帰式の精度判断基準として一般的に「単相関係数」を二乗した値が使われる。(決定係数、寄与率などと呼ばれる)0 から 1の値をとり、1に近いほど回帰式の精度がよい(xとyの関係が強い)

2.試してみる

Python 数学、統計、機械学習:散布図と相関分析(1) で描いた散布図に回帰直線を重ねる

scikit-learn に含まれる、線形回帰モデルを利用する。


from sklearn import datasets
from sklearn import linear_model
import pandas as pd
import matplotlib.pyplot as plt
import math


def liner_regression(*feature_index):
    """
    https://pythondatascience.plavox.info/scikit-learn/%E7%B7%9A%E5%BD%A2%E5%9B%9E%E5%B8%B0
    :return:
    """

    # 線形回帰予測クラス
    lr = linear_model.LinearRegression()

    boston = datasets.load_boston()

    df_ex = pd.DataFrame(boston.data)
    df_ex.columns = boston.feature_names
    import pprint
    print(pprint.pprint(df_ex))

    df_res = pd.DataFrame(boston.target)
    df_res.columns = ['Price']

    y = df_res['Price']
    fig = plt.figure()

    cnt = len(feature_index)
    cols = 1 if cnt == 1 else (2 if cnt < 6 else 4)
    rows = math.ceil(cnt / cols)
    idx = 1
    for feature in feature_index:

        x = df_ex[feature]
        ax = fig.add_subplot(rows, cols, idx)

        ax.set_title(feature, fontdict={'fontsize': 10}, pad=2)
        ax.scatter(x, y, s=0.5)

        mat_x = x.reshape((-1, 1))
        mat_y = y.reshape((-1, 1))

        # 予測モデルを作成
        # y = ax + b
        lr.fit(mat_x, mat_y)

        # a:回帰係数
        a = lr.coef_

        # b:切片 (誤差)
        b = lr.intercept_

        # R^2:決定係数
        r2 = lr.score(mat_x, mat_y)

        # 予測を実行
        predict = lr.predict(mat_x)

        # 予測をプロット
        ax.plot(x, predict, 'k--', lw=0.5)

        label = "y = {0:.4f}x + {1:.4f}\nR^2 = {2:.4f}".format(a[0][0], b[0], r2)
        ax.text(x.min(), y.min(), label, fontdict={'fontsize': 8})

        idx = idx + 1

    plt.tight_layout()
    plt.show()


if __name__ == "__main__":
    # liner_regression('CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT')
    liner_regression('RM', 'AGE', 'TAX', 'B')

以下のようなエラーがでるので、指示に従って、x.reshape(-1, 1) としています。

Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

https://stackoverflow.com/questions/35082140/preprocessing-in-scikit-learn-single-sample-depreciation-warning

>>> import pandas as pd
>>> df = pd.DataFrame([1,2,3])
>>> df.columns = ['x']
>>> x = df['x']
x
0    1
1    2
2    3
Name: x, dtype: int64
>>> x.reshape((-1,1))
array([[1],
       [2],
       [3]])

LinearRegressionのAPIについて以下サイトから引用させてもらいます。

https://pythondatascience.plavox.info/scikit-learn/%E7%B7%9A%E5%BD%A2%E5%9B%9E%E5%B8%B0

sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False,
                                      copy_X=True, n_jobs=1)
パラメータ 内容
fit_intercept False に設定すると切片を求める計算を含めない。目的変数が原点を必ず通る性質のデータを扱うときに利用。 (デフォルト値: True)
normalize True に設定すると、説明変数を事前に正規化します。 (デフォルト値: False)
copy_X メモリ内でデータを複製してから実行するかどうか。 (デフォルト値: True)
n_jobs 計算に使うジョブの数。-1 に設定すると、すべての CPU を使って計算します。 (デフォルト値: 1)
属性 内容
coef_ 偏回帰係数
intercept_ 切片
メソッド 内容
fit(X, y[, sample_weight]) 線形回帰モデルのあてはめを実行
get_params([deep]) 推定に用いたパラメータを取得
predict(X) 作成したモデルを利用して予測を実行
score(X, y[, sample_weight]) 決定係数 R2を出力
set_params(**params) パラメータを設定

line_reg