Upload
toshiki-noguchi
View
146
Download
0
Embed Size (px)
Citation preview
Rusing NumPy, StatsModels, Pandas
for 流通データ分析
※ 上記 3 つのモジュールを常にインポートしている状態を仮定
目次• 準備• csvを読み込む• 分析する前に• 基本の分析• 散布図を書く• 単回帰分析(StatsModels)
• 重回帰分析(StatsModels)
• NumPyで分析
準備• 必要なモジュール• NumPy• StatsModels• Pandas• Matplotlib.pylab
• 今後あった方が良いかもしれないモジュール• SymPy (分析には関係ないけど、数学の計算でかなり便利なのでそ
のうち スライド作ると思います)
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
分析する前に• 列を代入
定数 y に列 y を代入するには、y = f[‘y’] もしくは、 y = f.yとする。
print y
0 31 42 83 54 75 26 9Name: y, dtype: int64
分析する前に• print f や print y をする時に、あまりデータが多すぎる場合、先
頭数行や末尾数行のみ表示させることも可能 先頭 4 行の場合
print f.head(4) 末尾 4 行の場合
print f.tail(4) head 、 tail ともに () 内空欄でデフォルト値 5 をとる。
基本の分析• 以下は
y = f.yx1 = f.x1x2 = 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 smX1 = f.x1Y = 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 と言う部分が回帰係数この例でいうと、ということサマリを表示させずとも、 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 と言う部分が回帰係数この例でいうと、ということサマリを表示させずとも、 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 だから)
>>> 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)
NumPy で分析• 単回帰分析の時は Y と X 1、重回帰分析は Y と X を用いる。• しかしこのままでは、 Y も X1 も X も行と列が入れ替わっている
ため、分析するには転置させる必要がある。 ベクトルまたは行列にメソッド T をつけると転置する
Y = Y.TX1 = X1.TX = X.T
表示は次スライド
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)
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]]
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
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]])
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