analyze by statsmodels or numpy

27
R using NumPy, StatsModels, Pandas for 流流流流流流流 ※ 流流 3 流流流流流流流流流流流流流流流流流流流流流流流流

Upload: toshiki-noguchi

Post on 06-Aug-2015

146 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Analyze by StatsModels or Numpy

Rusing NumPy, StatsModels, Pandas

for 流通データ分析

※ 上記 3 つのモジュールを常にインポートしている状態を仮定

Page 2: Analyze by StatsModels or Numpy

目次• 準備• csvを読み込む• 分析する前に• 基本の分析• 散布図を書く• 単回帰分析(StatsModels)

• 重回帰分析(StatsModels)

• NumPyで分析

Page 3: Analyze by StatsModels or Numpy

準備• 必要なモジュール• NumPy• StatsModels• Pandas• Matplotlib.pylab

• 今後あった方が良いかもしれないモジュール• SymPy  (分析には関係ないけど、数学の計算でかなり便利なのでそ

のうち スライド作ると思います)

Page 4: Analyze by StatsModels or Numpy

csv を読み込むimport pandasf = pandas.read_csv(filename, ‘,’)

正しく読み込めているかはprint fで要確認

例では以下のファイルを用いるy x1 x20 3 1 -51 4 2 22 8 4 03 5 4 04 7 4 -15 2 0 76 9 3 5

Page 5: Analyze by StatsModels or Numpy

分析する前に• 列を代入

定数 y に列 y を代入するには、y = f[‘y’]  もしくは、  y = f.yとする。

print y

0 31 42 83 54 75 26 9Name: y, dtype: int64

Page 6: Analyze by StatsModels or Numpy

分析する前に• print f や print y をする時に、あまりデータが多すぎる場合、先

頭数行や末尾数行のみ表示させることも可能 先頭 4 行の場合

print f.head(4) 末尾 4 行の場合

print f.tail(4)  head 、 tail ともに () 内空欄でデフォルト値 5 をとる。

Page 7: Analyze by StatsModels or Numpy

基本の分析• 以下は

y = f.yx1 = f.x1x2 = f.x2

 をしたとして進める。

Page 8: Analyze by StatsModels or Numpy

基本の分析• 平均

print y.mean()    5.4285714285714288• 合計

print y.sum()    38• 最頻値

print y.mode()    []• 中央値

print y.median()    5.0• 分散

print y.var()    6.9523809523809534

Page 9: Analyze by StatsModels or Numpy

基本の分析• 最大値

print y.max()    9• 最小値

print y.min()    2• 標準偏差

print y.std()    2.6367367999823101• 相関係数 ( y と x1 の相関係数)

print y.corr(x1)    0.79231992230266968• 共分散 ( y と x1 の共分散)

print y.cov(x1)    3.3809523809523809

Page 10: Analyze by StatsModels or Numpy

散布図を書くimport pylab as p

p.scatter(x1,y)  ※ x, y の順xlabel, ylabel で軸の名前

p.xlabel(‘x1’, size=20)p.ylabel(‘y’, size=20)

xlim, ylim でグラフ範囲p.xlim(-1,10)p.ylim(-1,10)p.show()

Page 11: Analyze by StatsModels or Numpy

散布図を書く• 散布図行列

pandas.scatter_matrix(f)p.show()

対角はヒストグラム

Page 12: Analyze by StatsModels or Numpy

単回帰分析 ( StatsModels )• 分析するデータを指定する

import statsmodels.api as smX1 = f.x1Y = f.y

• 説明変数 X に定数項を追加するX1 = sm.add_constant(X1, False)

Page 13: Analyze by StatsModels or Numpy

単回帰分析 ( StatsModels )• 最小二乗法モデルを作る

model = sm.OLS(Y,X1)• 作ったモデルで回帰分析を行う

result = model.fit()• 結果のサマリを表示する

print result.summary()結果は次スライド

Page 14: Analyze by StatsModels or Numpy

単回帰分析 ( StatsModels )

Page 15: Analyze by StatsModels or Numpy

単回帰分析 ( StatsModels )• 決定係数

上段の R-squared というのが決定係数サマリを表示させずとも、 print result.rsquared で表示可能

• 回帰係数中段の coef と言う部分が回帰係数この例でいうと、ということサマリを表示させずとも、 print result.params で表示可能

例 ) print 'y = {0}x1 + {1}'.format(result.params[0], result.params[1])

表示:  y = 1.29090909091x1 + 2.10909090909

Page 16: Analyze by StatsModels or Numpy

単回帰分析 ( StatsModels )• 回帰係数を使って、散布図に回帰直線を書く 前の「散布図を書く」スライドで、 p.show() をする前に以下をつけたす

p.plot(x1, result.params[0]*x1+result.params[2])p.text(0,0,'y = {0:.4f}x1 + {1:.4f}'.format(result.params[0],

result.params[1]), size=20) そして p.show() をすると右のようになる

Page 17: Analyze by StatsModels or Numpy

重回帰分析 ( StatsModels )• StatsModels ではなく、 Pandas のみで相関係数行列を表示でき

るprint f.corr()

• 分析するデータを指定するX = f[[‘x1’,’x2’]]Y = f.y

• 単回帰分析時と同様に定数項を追加するX = sm.add_constant(X, False)

Page 18: Analyze by StatsModels or Numpy

重回帰分析 ( StatsModels )• 最小二乗法モデルを作る

model = sm.OLS(Y,X)• 作ったモデルで回帰分析を行う

result = model.fit()• 結果のサマリを表示する

print result.summary()結果は次スライド

Page 19: Analyze by StatsModels or Numpy

重回帰分析 ( StatsModels )

Page 20: Analyze by StatsModels or Numpy

重回帰分析 ( StatsModels )• 決定係数

上段の R-squared というのが決定係数サマリを表示させずとも、 print result.rsquared で表示可能

• 回帰係数中段の coef と言う部分が回帰係数この例でいうと、ということサマリを表示させずとも、 print result.params で表示可能

例 ) print 'y = {0}x1 + {1}x2 + {2}'.format(result.params[0], result.params[1], result.params[2])

表示:  y = 1.40758392043x1 + 0.173435557397x2 + 1.61085785329

Page 21: Analyze by StatsModels or Numpy

NumPy で分析• こちらは、 StatsModels とは違ってパッと計算できない (宿題で分析手順を追うなら、こちらの方が適している)• NumPy のメソッド• numpy.matrix(list)  リストを行列に変換するY = numpy.matrix(y)X1 = numpy.matrix([[x1,[1]*7]])X = numpy.matrix([[x1,x2,[1]*7]])

X1 と X の後ろの [1]*7 は定数項( x1,x2 のデータ数が 7 だから)

>>> Ymatrix([3, 4, 8, 5, 7, 2, 9], dtype=int64)>>> X1matrix([[1, 2, 4, 4, 4, 0, 3], [1, 1, 1, 1, 1, 1, 1]], dtype=int64)>>> Xmatrix([[ 1, 2, 4, 4, 4, 0, 3], [-5, 2, 0, 0, -1, 7, 5], [ 1, 1, 1, 1, 1, 1, 1]], dtype=int64)

Page 22: Analyze by StatsModels or Numpy

NumPy で分析• 単回帰分析の時は Y と X 1、重回帰分析は Y と X を用いる。• しかしこのままでは、 Y も X1 も X も行と列が入れ替わっている

ため、分析するには転置させる必要がある。 ベクトルまたは行列にメソッド T をつけると転置する

Y = Y.TX1 = X1.TX = X.T

 表示は次スライド

Page 23: Analyze by StatsModels or Numpy

NumPy で分析>>> Ymatrix([[3], [4], [8], [5], [7], [2], [9]], dtype=int64)>>> X1matrix([[1, 1], [2, 1], [4, 1],

[4, 1], [4, 1], [0, 1], [3, 1]], dtype=int64)>>> Xmatrix([[ 1, -5, 1], [ 2, 2, 1], [ 4, 0, 1], [ 4, 0, 1], [ 4, -1, 1], [ 0, 7, 1], [ 3, 5, 1]], dtype=int64)

Page 24: Analyze by StatsModels or Numpy

NumPy で分析• 単回帰分析 (Y と X1 ) より、なので、 逆行列を求めるメソッド I を用いて、

print X1.I * Y

  StatsModels で求めたものと比較しても、正しいことが分かるa = float((X1.I * Y)[0])b = float((X1.I * Y)[1])

 と代入して進める

表示: [[ 1.29090909] [ 2.10909091]]

Page 25: Analyze by StatsModels or Numpy

NumPy で分析• 単回帰分析 (Y と X1) 次に決定係数を求めるY2temp = Y-Y.mean()Y2 = numpy.average([float(Y2temp[i]**2) for i in range(7)])Y1temp = [f.y[i] - (a*x1[i] + b) for i in range(7)]Y1 = numpy.average([Y1temp[i]**2 for i in range(7)])R = 1 – Y1/Y2

表示:>>> R0.62777085927770859

Page 26: Analyze by StatsModels or Numpy

NumPy で分析• 重回帰分析 (Y と X ) より、なので、

print X.I * Y

StatsModels で求めたものと比較しても、正しいことが分かるA = float((X.I * Y)[0])B = float((X.I * Y)[1])C = float((X.I * Y)[2])

 と代入して進める

表示:matrix([[ 1.40758392], [ 0.17343556], [ 1.61085785]])

Page 27: Analyze by StatsModels or Numpy

NumPy で分析• 重回帰分析 (Y と X) 次に決定係数を求めるY2temp = Y-Y.mean()Y2 = numpy.average([float(Y2temp[i]**2) for i in range(7)])Y1temp = [f.y[i] - (A*x1[i] + B*x2[i] + C) for i in range(7)]Y1 = numpy.average([Y1temp[i]**2 for i in range(7)])R = 1 – Y1/Y2

表示:>>> R0.69104351997456703