スプレッドシート(エクセル)とPythonで統計分析(2) 単回帰分析の方法

スプレッドシート(エクセル)とPythonで統計分析(2) 単回帰分析の方法

単回帰分析

単回帰分析とは、以下のような回帰式を用いて、1つの説明変数の値から目的変数の値を予測するモデルです。

単回帰分析の公式
$$
y = ax + b
$$

データの準備

用意したデータはある店舗における1日の最高気温とアイスクリーム購入数です。
(注)データの数値は架空の数値です。

温度とアイスクリーム購入数

 データの開閉はここをclick

最高気温 アイスクリーム販売数
20 28
21 26
22 24
23 31
24 33
25 38
26 36
27 37
28 42
29 39
30 43
31 48
32 49
33 46
34 52
35 49

散布図の作成

2種類のデータの相関関係をみるには、散布図を作ります。
Googleスプレッドシートでの散布図の作り方の手順は次の通りです。

  1. 2種類のデータの項目を含めて全て選択します。今回のサンプルのデータ範囲は「A1:B17」
  2. メニューの「挿入」から「グラフ」を選択、またはツールバーのグラフのアイコンをクリック
  3. グラフエディッタで散布図を選択
  4. グラフのサイズが正方形になるように調整する
  5. トレンド線を引くにはグラフエディッタのカスタムタブを選択して、系列の中のトレンドラインにチェックを入れる

スプレッドシートの分析ツール XLMiner Analysis ToolPakを使う

XLMiner Analysis ToolPak導入方法

Googleのスプレッドシートで回帰分析を行うには別途「XLMiner Analysis ToolPak」を用意する必要があります。
「XLMiner Analysis ToolPak」はGoogle Chromeのアドオン形式で提供されています。
Google Chromeのアドオンで「XLMiner Analysis ToolPak」を検索すると出てきます。これをインストールすればOKです。

XLMiner Analysis ToolPakの使い方

「XLMiner Analysis ToolPak」のインストールを行った後次の操作を行います。

  • スプレッドシートのメニューから「アドオン」を選択
  • 「XLMiner Analysis ToolPak」から「start」の順に選択
  • 項目の「Linear Regression」部分をクリックして入力欄を展開します
  • Input Y Range:に「アイスクリーム販売数」データ範囲を指定(項目を含む)
  • Input X Range:に「最高気温」のデータ範囲を指定(項目を含む)
  • Labelsにチェックを入れて、Output Range:に出力したい場所を指定します

出力結果

項目説明
項目 日本語 意味
Regression Statistics 回帰統計 回帰式の制度を判断する指標がこのグループに表示されます。
Multiple R 重相関 R 重相関係数のことで、-1~1の値をとり、説明変数と従属変数の間の関係の強さを示します
R Square 重決定 R2 重決定係数のことで、重相関係数の2乗値です。「寄与率」とも呼ばれます。
Adjusted R Square 補正 R2 自由度調整済み決定係数のことで、説明変数の数の影響を受けて寄与率が実際よりも大きくなる(より1に近付くことになる)ため、それを回避する目的で使用されます。
Standard Error 標準誤差 回帰式から求められる予測値のバラツキを示す値です。この値が小さいほど精度が良いことになります。
Observations 観測数 データの数です。
ANOVA 分散分析 分散分析グループは、切片以外の全ての説明変数は無効つまり、切片以外の説明変数の真の係数は全て0であるという帰無仮説の検定を行っています。
Regression 回帰 ある特定のグループ
Residual 残差 ある特定グループ以外
Total 合計 全てのデータ
df 自由度 ある変数において自由な値をとることのできるデータの数。
SS 変動 偏差の平方 (二乗のこと) の合計なので,偏差平方和と呼んだり,単に平方和(SS と略記する) と呼んだりする。変動と呼ぶこともあります。
MS 分数
F 観測された分散比
Significance F 有意 F F値は全ての係数が0である可能性は何%であるかを表しています。通常、P値やt値で個別の変数が0である可能性を判断していきますので、F値を見ることはあまりありません。
Coefficients 係数 下の数値が回帰係数でこれとここの切片で回帰式を求められる
Intercept 切片 切片の(推定)係数は、他の全ての説明変数がゼロの場合における回帰分析による予測値に該当します。
Standard Error 標準誤差 推定係数の不確かさつまり、推定精度の悪さを示します。
t Stat t値 t値は平均値から何個の標準偏差分離れているかを表し、P値はt値がそれ以下となる確率を表します。
P-value P値 P値とは、統計処理により計算された値の本当の答えがゼロである確率をさしています。
Lower 95% 下限95% 下限95%は、信頼係数95%で真の係数がありそうな範囲を示しています。
Upper 95% 上限95% 上限の95%は、信頼係数95%で真の係数がありそうな範囲を示しています。
Lower 95% 下限95%
Upper 95% 上限95%

Excelの回帰分析の結果出力は3つのブロックに分かれ、上2つのブロックが回帰分析全体に関する出力に相当し、最下段のブロックが個別の説明変数に関する出力の結果になります。
色々な指標が算出されますが、今回の分析で重要な指標は「R Square(重決定 R)」の値と「Significance F(有意 F)」の値、そして「Coefficients(係数)」になります。

出力結果の「R Square」の値「0.920300641543021」が重決定R2となり、これは回帰式の精度である寄与率を表します。
この値は0から1の値を取り、1に近いほど回帰式の精度が良いことになります。つまりアイスクリームの販売数は最高気温という変数で92%説明がつくことを表しています。

「Significance F」の値は有意Fを意味しています。この値が0.05以下なら回帰関係の有意性があると言えます。

「Intercept」は「y = ax + b」のbに当たるもので切片を表します。

「最高気温(℃)」は「y = ax + b」のaに当たるもので、最高気温の係数に当たります。つまり傾きを表します。

これで「y = 1.76617647058823x – 9.75735294117681」の方程式を導き出すことができます。
そしてこの式から予測値を求めることが可能になります。

Pythonで単回帰分析

簡単に分析するには、scikit-learn を用いた線形回帰を行うのが簡単ですが、その仕組みを理解するためにもまずはscikit-learn を使用しない方法を行います。
Pythonで相関係数を求めるには、「numpy」,「pandas」のライブラリが必要になります。また、散布図を描くには「matplotlib」が必要です。
プログラムを書く時には、まずこの3つのライブラリをインポートしておきます。

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

次にcsvファイルを読み込んで、確認のために一部を表示してみます。

# CSVファイル読み込み
df = pd.read_csv('icecafe.csv')
# 5件だけ表示
df.head(5)

データの抽出を行います。

# データの抽出
x = df['最高気温']
y = df['アイスクリーム販売数']

散布図を作成します。

# 散布図作成 横軸x,縦軸y
plt.scatter(x,y)
plt.show()

統計基本データ出力

# describe出力
df.describe()

相関係数を求めます。

# 相関係数
correlation = np.corrcoef(x, y)
print(correlation[0,1])

結果:0.9593230120991683

中心化から傾きを求める

# 中心化
y_c = y - y.mean()
x_c = x - x.mean()

xx = x_c * x_c
xy = x_c * y_c

a = xy.sum() / xx.sum()

a=1.7661764705882352

この直線の傾きaの求め方には「最小二乗法」が用いられます。これは以下の式で計算されます。

最小二乗法の公式
$$
a = \frac{\frac{1}{n}{\displaystyle\sum_{i=1}^{n}}(X_i – \overline{X})(Y_i – \overline{Y})}
{\displaystyle{\frac{1}{n}\sum_{i=1}^{n}}(X_i – \overline{X})^{2}}
= \frac{\displaystyle\sum_{i=1}^{n}(X_i – \overline{X})(Y_i – \overline{Y})}
{\displaystyle\sum_{i=1}^{n}(X_i – \overline{X})^{2}}
$$