R 
using NumPy, StatsModels, Pandas 
for 流通データ分析 
※上記3つのモジュールを常にインポートしている状態を仮定
目次 
• 準備 
• csvを読み込む 
• 分析する前に 
• 基本の分析 
• 散布図を書く 
• 単回帰分析(StatsModels) 
• 重回帰分析(StatsModels) 
• NumPyで分析
準備 
• 必要なモジュール 
• NumPy 
• StatsModels 
• Pandas 
• Matplotlib.pylab 
• 今後あった方が良いかもしれないモジュール 
• SymPy (分析には関係ないけど、数学の計算でかなり便利なのでそのうち 
スライド作ると思います)
csvを読み込む 
import pandas 
f = pandas.read_csv(filename, ‘,’) 
正しく読み込めているかは 
print f 
で要確認 
例では以下のファイルを用いる 
y x1 x2 
0 3 1 -5 
1 4 2 2 
2 8 4 0 
3 5 4 0 
4 7 4 -1 
5 2 0 7 
6 9 3 5
分析する前に 
• 列を代入 
定数yに列yを代入するには、 
y = f[‘y’] もしくは、y = f.y 
とする。 
print y 
0 3 
1 4 
2 8 
3 5 
4 7 
5 2 
6 9 
Name: y, dtype: int64
分析する前に 
• print fやprint yをする時に、あまりデータが多すぎる場合、先頭数行 
や末尾数行のみ表示させることも可能 
先頭4行の場合 
print f.head(4) 
末尾4行の場合 
print f.tail(4) 
head、tailともに()内空欄でデフォルト値5をとる。
基本の分析 
• 以下は 
y = f.y 
x1 = f.x1 
x2 = f.x2 
をしたとして進める。
基本の分析 
• 平均 
print y.mean() 5.4285714285714288 
• 合計 
print y.sum() 38 
• 最頻値 
print y.mode() [] 
• 中央値 
print y.median() 5.0 
• 分散 
print y.var() 6.9523809523809534
基本の分析 
• 最大値 
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
散布図を書く 
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()
散布図を書く 
• 散布図行列 
pandas.scatter_matrix(f) 
p.show() 
対角はヒストグラム
単回帰分析(StatsModels) 
• 分析するデータを指定する 
import statsmodels.api as sm 
X1 = f.x1 
Y = f.y 
• 説明変数Xに定数項を追加する 
X1 = sm.add_constant(X1, False)
単回帰分析(StatsModels) 
• 最小二乗法モデルを作る 
model = sm.OLS(Y,X1) 
• 作ったモデルで回帰分析を行う 
result = model.fit() 
• 結果のサマリを表示する 
print result.summary() 
結果は次スライド
単回帰分析(StatsModels)
単回帰分析(StatsModels) 
• 決定係数 
上段のR-squaredというのが決定係数 
サマリを表示させずとも、print result.rsquaredで表示可能 
• 回帰係数 
中段のcoefと言う部分が回帰係数 
この例でいうと、푦 = 1.2909푥1 + 2.1091ということ 
サマリを表示させずとも、print result.paramsで表示可能 
例) print 'y = {0}x1 + {1}'.format(result.params[0], result.params[1]) 
表示: y = 1.29090909091x1 + 2.10909090909
単回帰分析(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()をすると右のようになる
重回帰分析(StatsModels) 
• StatsModelsではなく、Pandasのみで相関係数行列を表示できる 
print f.corr() 
• 分析するデータを指定する 
X = f[[‘x1’,’x2’]] 
Y = f.y 
• 単回帰分析時と同様に定数項を追加する 
X = sm.add_constant(X, False)
重回帰分析(StatsModels) 
• 最小二乗法モデルを作る 
model = sm.OLS(Y,X) 
• 作ったモデルで回帰分析を行う 
result = model.fit() 
• 結果のサマリを表示する 
print result.summary() 
結果は次スライド
重回帰分析(StatsModels)
重回帰分析(StatsModels) 
• 決定係数 
上段のR-squaredというのが決定係数 
サマリを表示させずとも、print result.rsquaredで表示可能 
• 回帰係数 
中段のcoefと言う部分が回帰係数 
この例でいうと、푦 = 1.4076푥1 + 0.1734푥2 + 1.6109ということ 
サマリを表示させずとも、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
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だから) 
>>> Y 
matrix([3, 4, 8, 5, 7, 2, 9], dtype=int64) 
>>> X1 
matrix([[1, 2, 4, 4, 4, 0, 3], 
[1, 1, 1, 1, 1, 1, 1]], dtype=int64) 
>>> X 
matrix([[ 1, 2, 4, 4, 4, 0, 3], 
[-5, 2, 0, 0, -1, 7, 5], 
[ 1, 1, 1, 1, 1, 1, 1]], dtype=int64)
NumPyで分析 
• 単回帰分析の時はYとX1、重回帰分析はYとXを用いる。 
• しかしこのままでは、YもX1もXも行と列が入れ替わっているため、分 
析するには転置させる必要がある。 
ベクトルまたは行列にメソッドTをつけると転置する 
Y = Y.T 
X1 = X1.T 
X = X.T 
表示は次スライド
NumPyで分析 
>>> Y 
matrix([[3], 
[4], 
[8], 
[5], 
[7], 
[2], 
[9]], dtype=int64) 
>>> X1 
matrix([[1, 1], 
[2, 1], 
[4, 1], 
[4, 1], 
[4, 1], 
[0, 1], 
[3, 1]], dtype=int64) 
>>> X 
matrix([[ 1, -5, 1], 
[ 2, 2, 1], 
[ 4, 0, 1], 
[ 4, 0, 1], 
[ 4, -1, 1], 
[ 0, 7, 1], 
[ 3, 5, 1]], dtype=int64)
NumPyで分析 
• 単回帰分析(YとX1) 
푦 = 푎푥1 + 푏 = 
푎 
푏 
푥1 
1 
より、 
푎 
푏 
= 
푥1 
1 
−1 
푦なので、 
逆行列を求めるメソッドIを用いて、 
print X1.I * Y 
StatsModelsで求めたものと比較しても、正しいことが分かる 
a = float((X1.I * Y)[0]) 
b = float((X1.I * Y)[1]) 
と代入して進める 
表示:[[ 1.29090909] 
[ 2.10909091]]
NumPyで分析 
• 単回帰分析(YとX1) 
次に決定係数を求める푅 = 1 − 
1 
푁 
푁 푦푛− 푎 푥푛+푏 
푛=1 
2 
1 
푁 
푁 푦푛−푦 2 
푛=1 
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 表示: 
>>> R 
0.62777085927770859
NumPyで分析 
• 重回帰分析(YとX) 
핐 = 핏Βより、Β = 핏−1핐なので、 
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]])
NumPyで分析 
• 重回帰分析(YとX) 
次に決定係数を求める푅 = 1 − 
1 
푁 
푁 푦푛− 푎 푥1푛+푏 푥2푛+푐 
푛=1 
2 
1 
푁 
푁 푦푛−푦 2 
푛=1 
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 表示: 
>>> R 
0.69104351997456703

Analyze by StatsModels or Numpy

  • 1.
    R using NumPy,StatsModels, Pandas for 流通データ分析 ※上記3つのモジュールを常にインポートしている状態を仮定
  • 2.
    目次 • 準備 • csvを読み込む • 分析する前に • 基本の分析 • 散布図を書く • 単回帰分析(StatsModels) • 重回帰分析(StatsModels) • NumPyで分析
  • 3.
    準備 • 必要なモジュール • NumPy • StatsModels • Pandas • Matplotlib.pylab • 今後あった方が良いかもしれないモジュール • SymPy (分析には関係ないけど、数学の計算でかなり便利なのでそのうち スライド作ると思います)
  • 4.
    csvを読み込む import pandas f = pandas.read_csv(filename, ‘,’) 正しく読み込めているかは print f で要確認 例では以下のファイルを用いる y x1 x2 0 3 1 -5 1 4 2 2 2 8 4 0 3 5 4 0 4 7 4 -1 5 2 0 7 6 9 3 5
  • 5.
    分析する前に • 列を代入 定数yに列yを代入するには、 y = f[‘y’] もしくは、y = f.y とする。 print y 0 3 1 4 2 8 3 5 4 7 5 2 6 9 Name: y, dtype: int64
  • 6.
    分析する前に • printfやprint yをする時に、あまりデータが多すぎる場合、先頭数行 や末尾数行のみ表示させることも可能 先頭4行の場合 print f.head(4) 末尾4行の場合 print f.tail(4) head、tailともに()内空欄でデフォルト値5をとる。
  • 7.
    基本の分析 • 以下は y = f.y x1 = f.x1 x2 = f.x2 をしたとして進める。
  • 8.
    基本の分析 • 平均 print y.mean() 5.4285714285714288 • 合計 print y.sum() 38 • 最頻値 print y.mode() [] • 中央値 print y.median() 5.0 • 分散 print y.var() 6.9523809523809534
  • 9.
    基本の分析 • 最大値 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
  • 10.
    散布図を書く import pylabas 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()
  • 11.
    散布図を書く • 散布図行列 pandas.scatter_matrix(f) p.show() 対角はヒストグラム
  • 12.
    単回帰分析(StatsModels) • 分析するデータを指定する import statsmodels.api as sm X1 = f.x1 Y = f.y • 説明変数Xに定数項を追加する X1 = sm.add_constant(X1, False)
  • 13.
    単回帰分析(StatsModels) • 最小二乗法モデルを作る model = sm.OLS(Y,X1) • 作ったモデルで回帰分析を行う result = model.fit() • 結果のサマリを表示する print result.summary() 結果は次スライド
  • 14.
  • 15.
    単回帰分析(StatsModels) • 決定係数 上段のR-squaredというのが決定係数 サマリを表示させずとも、print result.rsquaredで表示可能 • 回帰係数 中段のcoefと言う部分が回帰係数 この例でいうと、푦 = 1.2909푥1 + 2.1091ということ サマリを表示させずとも、print result.paramsで表示可能 例) print 'y = {0}x1 + {1}'.format(result.params[0], result.params[1]) 表示: y = 1.29090909091x1 + 2.10909090909
  • 16.
    単回帰分析(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()をすると右のようになる
  • 17.
    重回帰分析(StatsModels) • StatsModelsではなく、Pandasのみで相関係数行列を表示できる print f.corr() • 分析するデータを指定する X = f[[‘x1’,’x2’]] Y = f.y • 単回帰分析時と同様に定数項を追加する X = sm.add_constant(X, False)
  • 18.
    重回帰分析(StatsModels) • 最小二乗法モデルを作る model = sm.OLS(Y,X) • 作ったモデルで回帰分析を行う result = model.fit() • 結果のサマリを表示する print result.summary() 結果は次スライド
  • 19.
  • 20.
    重回帰分析(StatsModels) • 決定係数 上段のR-squaredというのが決定係数 サマリを表示させずとも、print result.rsquaredで表示可能 • 回帰係数 中段のcoefと言う部分が回帰係数 この例でいうと、푦 = 1.4076푥1 + 0.1734푥2 + 1.6109ということ サマリを表示させずとも、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
  • 21.
    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だから) >>> Y matrix([3, 4, 8, 5, 7, 2, 9], dtype=int64) >>> X1 matrix([[1, 2, 4, 4, 4, 0, 3], [1, 1, 1, 1, 1, 1, 1]], dtype=int64) >>> X matrix([[ 1, 2, 4, 4, 4, 0, 3], [-5, 2, 0, 0, -1, 7, 5], [ 1, 1, 1, 1, 1, 1, 1]], dtype=int64)
  • 22.
    NumPyで分析 • 単回帰分析の時はYとX1、重回帰分析はYとXを用いる。 • しかしこのままでは、YもX1もXも行と列が入れ替わっているため、分 析するには転置させる必要がある。 ベクトルまたは行列にメソッドTをつけると転置する Y = Y.T X1 = X1.T X = X.T 表示は次スライド
  • 23.
    NumPyで分析 >>> Y matrix([[3], [4], [8], [5], [7], [2], [9]], dtype=int64) >>> X1 matrix([[1, 1], [2, 1], [4, 1], [4, 1], [4, 1], [0, 1], [3, 1]], dtype=int64) >>> X matrix([[ 1, -5, 1], [ 2, 2, 1], [ 4, 0, 1], [ 4, 0, 1], [ 4, -1, 1], [ 0, 7, 1], [ 3, 5, 1]], dtype=int64)
  • 24.
    NumPyで分析 • 単回帰分析(YとX1) 푦 = 푎푥1 + 푏 = 푎 푏 푥1 1 より、 푎 푏 = 푥1 1 −1 푦なので、 逆行列を求めるメソッドIを用いて、 print X1.I * Y StatsModelsで求めたものと比較しても、正しいことが分かる a = float((X1.I * Y)[0]) b = float((X1.I * Y)[1]) と代入して進める 表示:[[ 1.29090909] [ 2.10909091]]
  • 25.
    NumPyで分析 • 単回帰分析(YとX1) 次に決定係数を求める푅 = 1 − 1 푁 푁 푦푛− 푎 푥푛+푏 푛=1 2 1 푁 푁 푦푛−푦 2 푛=1 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 表示: >>> R 0.62777085927770859
  • 26.
    NumPyで分析 • 重回帰分析(YとX) 핐 = 핏Βより、Β = 핏−1핐なので、 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]])
  • 27.
    NumPyで分析 • 重回帰分析(YとX) 次に決定係数を求める푅 = 1 − 1 푁 푁 푦푛− 푎 푥1푛+푏 푥2푛+푐 푛=1 2 1 푁 푁 푦푛−푦 2 푛=1 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 表示: >>> R 0.69104351997456703