hidekatsu-izuno 日々の記録

プログラミング、経済政策など伊津野英克が興味あることについて適当に語ります(旧サイト:A.R.N [日記])

Python での統計処理メモ

たまに時間があると統計を身に着けようと試みているのだけど、データサイエンティストというわけでは当然ないので、すぐにやり方を忘れてしまう。というわけで今日のエントリは完全にメモ書きです。はい。

環境

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)