Pythonで回帰分析 (身長と体重の関係、PVとセッションの関係)

Pythonで回帰分析をちょっとやってみましたのでメモです。
↓このまんまです。
http://www.atmarkit.co.jp/ait/articles/1311/05/news003.html

import pandas as pd
import numpy as np
df = pd.read_csv('children_data2005_08_130819.csv', header=-1, skiprows=2, encoding='Shift_JIS')

#データが欠けている行は削除する。
df = df[np.isfinite(df[9])]
df = df[np.isfinite(df[10])]

#身長と体重のデータがある10列目と11列目のみを抽出する
height = df[9]
weight = df[10]

#プロットしてみる
plot(height, weight, 'bo')
Out[8]: []

#単回帰分析を用いてこのモデルの妥当性を検討する。
#pandasにはols関数が用意されていて
#ols関数は
# 目的変数 y
# 説明変数 x
# 直線が原点(0,0)を通るか切片を持つかどうかのパラメータ(intercept)
#を指定すると、最小二乗法(Ordinary Least Squares)を用いてモデルの計算を行う。
model = pd.ols(y=weight, x=height, intercept=True)
plot(model.x['x'], model.y_fitted, 'g-')
Out[17]: []

#modelの中身のポイントを確認してみる
model
Out[20]:
-------------------------Summary of Regression Analysis-------------------------

Formula: Y ~  + 

Number of Observations:         1602
Number of Degrees of Freedom:   2

R-squared:         0.8445
Adj R-squared:     0.8444

Rmse:              2.1957

F-stat (1, 1600):  8691.3653, p-value:     0.0000

Degrees of Freedom: model 1, resid 1600

-----------------------Summary of Estimated Coefficients------------------------
      Variable       Coef    Std Err     t-stat    p-value    CI 2.5%   CI 97.5%
--------------------------------------------------------------------------------
             x     0.0336     0.0004      93.23     0.0000     0.0329     0.0343
     intercept   -17.2343     0.3742     -46.06     0.0000   -17.9677   -16.5009
---------------------------------End of Summary---------------------------------

このモデルの数式

[体重]=[身長]×0.0336-17.2343

このモデルが統計的にどのくらい正しいのか検証する。

□決定係数(R-squared: 0.8445)
説明変数が目的変数のどれくらいを説明できるかを表す値で、0~1の間の値を取り、寄与率と呼ばれることもあります。
今回のモデルでは0.8445となっており、このモデルで84%以上説明できているということができます。

□F検定(F-stat (1, 1600): 8691.3653, p-value: 0.0000)
F検定(F-test)と呼ばれるモデル全体の妥当性を検討する際に使う値です。F値の有意確率(p-value)を判断基準として用います。
今回のモデルの場合は、F値(8691.3653)が十分に大きく、有意確率(0.0000)も十分に小さく0.01以下であるため99%以上の確率で妥当であると言えます。
有意確率の比較は、99%の場合には0.01ですが、95%の確率で検定する場合には、0.05と比較して妥当性を検証します。

□t検定
モデル全体の妥当性をF検定で判断した後は、それぞれのパラメータ(係数aと定数b)の妥当性を検証します。
係数a(x):t-stat=93.23、p-value=0.0000
定数b(intercept):t-stat=-46.06、p-value=0.0000
このモデルの場合、xの有意確率もinterceptの有意確率も0.01よりも十分に小さい値なので、両方の値は妥当であると判断できます。

■PVとセッション数の関係
せっかくなので上のやり方を真似してあるサイトのPVとセッションの関係を
回帰分析してみます。

import pandas as pd
import numpy as np
%pylab
df = pd.read_csv('data.csv', names=['PV','SESSION'], header=-1, encoding='Shift_JIS')
df = df.replace(',','', regex=True)
## 数字に「,」がはいっているので取り除いています。

pv = df['PV'].astype(float)
se = df['SESSION'].astype(float)

plot(pv, se, 'bo')
model = pd.ols(y=se, x=pv, intercept=True)
plot(model.x['x'], model.y_fitted, 'g-')

model
Out[32]: 

-------------------------Summary of Regression Analysis-------------------------

Formula: Y ~  + 

Number of Observations:         61
Number of Degrees of Freedom:   2

R-squared:         0.2639
Adj R-squared:     0.2515

Rmse:          16730.9688

F-stat (1, 59):    21.1571, p-value:     0.0000

Degrees of Freedom: model 1, resid 59

-----------------------Summary of Estimated Coefficients------------------------
      Variable       Coef    Std Err     t-stat    p-value    CI 2.5%   CI 97.5%
--------------------------------------------------------------------------------
             x     0.0319     0.0069       4.60     0.0000     0.0183     0.0455
     intercept 192177.6432 10286.0067      18.68     0.0000 172017.0700 212338.2163
---------------------------------End of Summary---------------------------------

このモデルの数式

[SESSION]=[PV]× 0.0319+192177.6432

このモデルが統計的にどのくらい正しいのか検証する。

□決定係数(R-squared: 0.2639)
今回のモデルでは0.2639となっており、このモデルで26%以上説明できているということでしょうか。

□F検定(F-stat (1, 59): 21.1571, p-value: 0.0000)
今回のモデルは、F値( 21.1571)が小さいですね。
なので、このモデルはだどうではなさそうですね。もっとサンプルがあれば変わってくるのでしょうか。

ということで、あんまりPVとセッション数の関係は妥当性のないモデルのようです。
まあでもいろいろと勉強になりました。

こいつはいろんな場面で使えそうです。
数字のコンマ(,)を取り除く方法

df = df.replace(',','', regex=True)

以上

関連する投稿:

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください