Step 4. 線形回帰

  1. 「ワインの品質」データ読み込み
  2. 単回帰分析
  3. 重回帰分析
  4. 練習 </ol>
  5. Step 4 の目標

    回帰直線を描く。

    
    
    In [ ]:
    # 数値計算やデータフレーム操作に関するライブラリをインポートする
    import numpy as np
    import pandas as pd
    
    
    
    In [ ]:
    # URL によるリソースへのアクセスを提供するライブラリをインポートする。
    # import urllib # Python 2 の場合
    import urllib.request # Python 3 の場合
    
    
    
    In [ ]:
    # 図やグラフを図示するためのライブラリをインポートする。
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    
    
    In [ ]:
    # 線形回帰を行なうライブラリ
    from sklearn import linear_model
    

    1. 「ワインの品質」データ読み込み

    データは UC Irvine Machine Learning Repository から取得したものを少し改変しました。

     詳細

    1. fixed acidity : 不揮発酸濃度(ほぼ酒石酸濃度)
    2. volatile acidity : 揮発酸濃度(ほぼ酢酸濃度)
    3. citric acid : クエン酸濃度
    4. residual sugar : 残存糖濃度
    5. chlorides : 塩化物濃度
    6. free sulfur dioxide : 遊離亜硫酸濃度
    7. total sulfur dioxide : 亜硫酸濃度
    8. density : 密度
    9. pH : pH
    10. sulphates : 硫酸塩濃度
    11. alcohol : アルコール度数
    12. quality (score between 0 and 10) : 0-10 の値で示される品質のスコア
    
    
    In [ ]:
    # ウェブ上のリソースを指定する
    url = 'https://raw.githubusercontent.com/chemo-wakate/tutorial-6th/master/beginner/data/winequality-red.txt'
    # 指定したURLからリソースをダウンロードし、名前をつける。
    # urllib.urlretrieve(url, 'winequality-red.csv') # Python 2 の場合
    urllib.request.urlretrieve(url, 'winequality-red.txt') # Python 3 の場合
    
    
    
    In [ ]:
    # データの読み込み
    df1 = pd.read_csv('winequality-red.txt', sep='\t', index_col=0)
    
    
    
    In [ ]:
    df1.head() # 先頭5行まで表示
    

    2. 単回帰分析

    まずは、説明変数を1つだけ用いて単回帰分析を行います。

    
    
    In [ ]:
    clf = linear_model.LinearRegression()
    
    
    
    In [ ]:
    X = df1.loc[:, ['pH']].as_matrix() # 説明変数 = pH
    
    
    
    In [ ]:
    pd.DataFrame(X).T # 中身の確認。縦に長いと見にくいので転置して表示。
    
    
    
    In [ ]:
    Y = df1['fixed acidity'].as_matrix() # 目的変数 = fixed acidity
    
    
    
    In [ ]:
    pd.DataFrame(Y).T # 中身の確認。縦に長いと見にくいので転置して表示。
    
    
    
    In [ ]:
    clf.fit(X, Y) # 予測モデルを作成
    
    
    
    In [ ]:
    # 回帰係数
    clf.coef_
    
    
    
    In [ ]:
    # 切片
    clf.intercept_
    

    以上の結果は、説明変数と目的変数の関係が次の回帰式で表されることを示しています。

    [fixed acidity] = -7.70229968 × [pH] + 33.822823396397531

    決定係数は寄与率とも呼ばれ、説明変数が目的変数のどれくらいを説明できるかを表す値であり、1に近いほどモデルの精度が高いことを表します。

    
    
    In [ ]:
    # 決定係数
    clf.score(X, Y)
    

    結果を 2 次元座標上にプロットすると、以下のようになります。青線が回帰直線を表します。

    
    
    In [ ]:
    # 散布図
    plt.scatter(X, Y)
     
    # 回帰直線
    plt.title('Linear regression')
    plt.plot(X, clf.predict(X))
    plt.xlabel('pH')
    plt.ylabel('fixed acidity')
    plt.grid()
    plt.show()
    

    3. 重回帰

    続いて、「quality」を目的変数に、「quality」以外を説明変数として、重回帰分析を行います。

    
    
    In [ ]:
    clf = linear_model.LinearRegression()
     
    # 説明変数に "quality (品質スコア以外すべて)" を利用
    df1_except_quality = df1.drop('quality', axis=1)
    X = df1_except_quality.as_matrix()
     
    # 目的変数に "quality (品質スコア)" を利用
    Y = df1['quality'].as_matrix()
     
    # 予測モデルを作成
    clf.fit(X, Y)
      
    # 切片 (誤差)
    print(clf.intercept_)
    
    # 偏回帰係数
    pd.DataFrame({'Name':df1_except_quality.columns, 'Coefficients':clf.coef_}).sort_values('Coefficients', ascending=False)
    

    上記の結果からワインの品質スコアは、以下のような回帰式で表せることがわかります。

    [quality] = 21.9652084495 + 0.916334 × [sulphates] + 0.276198 × [alcohol] + 0.024991 × [fixed acidity] + 0.016331 × [residual sugar] + 0.004361 × [free sulfur dioxide] + (-0.003265) × [total sulfur dioxide] + (-0.182564) × [citric acid] + (-0.413653) × [pH] + (-1.083590) × [volatile acidity] + (-1.874225) × [chlorides] + (-17.881164) × [density] +

    ただし決定係数は次の値です。

    
    
    In [ ]:
    clf.score(X, Y)
    

    各変数がどの程度目的変数に影響しているかを確認するには、各変数を正規化 (標準化) し、平均 = 0, 標準偏差 = 1 になるように変換した上で、重回帰分析を行うと偏回帰係数の大小で比較することができるようになります。

    
    
    In [ ]:
    clf = linear_model.LinearRegression()
     
    # データフレームの各列を正規化
    df1s = df1.apply(lambda x: (x - np.mean(x)) / (np.max(x) - np.min(x)))
     
    # 説明変数に "quality (品質スコア以外すべて)" を利用
    df1s_except_quality = df1s.drop("quality", axis=1)
    X = df1s_except_quality.as_matrix()
     
    # 目的変数に "quality (品質スコア)" を利用
    Y = df1s['quality'].as_matrix()
     
    # 予測モデルを作成
    clf.fit(X, Y)
     
    # 偏回帰係数
    pd.DataFrame({'Name':df1s_except_quality.columns,
                        'Coefficients':np.abs(clf.coef_)}).sort_values('Coefficients', ascending=False)
    

    正規化した偏回帰係数を確認すると、alcohol (アルコール度数) が最も高い値を示し、品質に大きな影響を与えていることがわかります。

    練習4.1

    白ワインのデータ(https://raw.githubusercontent.com/chemo-wakate/tutorial-6th/master/beginner/data/winequality-white.txt) を読み込み、単回帰分析、重回帰分析を行なってください。

    
    
    In [ ]:
    # 練習4.1