たまに時間があると統計を身に着けようと試みているのだけど、データサイエンティストというわけでは当然ないので、すぐにやり方を忘れてしまう。というわけで今日のエントリは完全にメモ書きです。はい。
環境
Python は Anaconda を使ってインストールするのが一番簡単なようだ。
実行は Anaconda をインストールするといっしょに入る Jupyter Notebook という REPL ツールを使うのが一般的な模様。たしかにグラフがその場で表示できるのは便利。
- 実行は「Shift+Enter」
- ヘルプは「h」
- 行挿入は「a」、行削除は「dd」。ちょっと vi っぽい。
データ操作
データ操作は pandas を使うのが一般的らしい。numpy は直接使わず、pandas 経由で使うのが今風なようだ。使ってみるとたしかに便利。ライブラリで SQL 的な操作ができる。
データの読み込み
# インポート import pandas as pd # TSV の読み込み(1行目は列名) data = pd.read_table("パス") # CSV の読み込み(1行目は列名) data = pd.read_csv("パス") # NaN (= Not a Number) を 0 に置換 data2 = data.fillna(value = 0) # 列の選択 (SQL で言えば SELECT) data3 = data["列1"] data3 = data[["列1", "列2"]] # 行の選択 data4 = data.iloc[3] # 抽出(SQL で言えば WHERE) data5 = data[data["列1"] > 0] # ソート (SQL で言えば ORDER BY) data6 = data.sort_values(by=["列1", "列2"])
統計処理
統計処理はいくつか方法があるけど、R 相当のことをやりたい場合は、statsmodels を使うのが良いようだ。statsmodels には python っぽい通常の API と R っぽい formula API の2種類があるが、今のところ、通常の API を使ってみている。
# インポート import statsmodels.api as sm # 単回帰 result = sm.OLS(data["従属変数列"], data["説明変数列"]).fit() # 重回帰 result = sm.OLS(data["従属変数列"], data[["説明変数列1", "説明変数列2"]]).fit() # ロバスト回帰 result = sm.RLM(data["従属変数列"], data["説明変数列"]).fit() # 分位点回帰 import statsmodels.regression.quantile_regression as smqr result = smqr.QuantReg(data["従属変数列"], data["説明変数列"]).fit(q=0.5) # 統計サマリー情報の表示 result.summary() # 説明変数に対する予測値 result.fittedvalues
グラフの表示
最近のブログを読むと seaborn というライブラリを使うのが流行りみたいなのだけれど、自動で統計処理までやってくれる系のライブラリらしく、自前で計算した数値列をグラフ表示したい場合は従来通り matplotlib を使うのが良いようだ。
# インポート import matplotlib.pyplot as plt # グラフを描画 plt.plot(data["説明変数列"], result.fittedvalues) # 散布図を描画(o で丸記号を表示と言う意味になるらしい) plt.plot(data["説明変数列"], data["従属変数列"], "o") # グラフを表示 plt.show() # グラフのクリア plt.clf()
調べたところ、pandas にも plot 機能があるようだ。単なるラッパーのようではあるけど、こちらを使ったほうが便利かもしれない。
gdata = pd.DataFrame({"x": data["説明変数列"], "y":data["従属変数列"], "p": result.fittedvalues }) # scatter で散布図を描画 ax = gdata.plot.scatter(x = 'x', y = 'y') # ax でグラフを重ねることができる gdata.plot.line(x = 'x', y = 'p', ax = ax)