データを分析していて2つの指標間に関係性について直線をあてはめたい(直線をフィットさせたい)状況があるかと思います.自分で関数を用意する必要はないと思いますが,さて,Pythonではどのパッケージを使うべきでしょうか?
- numpy.linalg.lstsq()
http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.lstsq.html - numpy.polyfit()
http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.polyfit.html#numpy.polyfit - scipy.optimize.curve_fit()
http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html#scipy.optimize.curve_fit - scipy.stats.linregress()
http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.html#scipy.stats.linregress - statsmodels.api.OLS()
http://statsmodels.sourceforge.net/stable/regression.html - statsmodels.formula.api.OLS()
http://statsmodels.sourceforge.net/stable/example_formulas.html - sklearn.linear_model.LinearRegression()
http://scikit-learn.org/stable/modules/linear_model.html#ordinary-least-squares - pandas.ols() ... 古いバージョンのpandasでサポートされていた.
ケースバイケースで使い分けるのでしょうが,一つの考え方として以下を提案します.
- ただ直線を引きたい ... numpy,scipyの関数.
- 複雑な統計モデルを考えてしている.(それで線形モデルから始めている.)決定係数等,各統計量情報を知りたい ... statsmodelsの関数.
- データへモデルを当てはめた後,他のデータにモデルを適用する,過適合(overfit)を避けるための正則化(regularization)も後で検討したい ... scikit-learnの関数.
(pandasのものは,サポートされなくなったので使わない方が無難です.)
(もちろんTensorFlow, Chainer等のDeep Learningフレームワークでも実装可能ですが,ここでは触れません.)
例としてIris Data(あやめに似た植物データ)を使ったプロットを示します.
import numpy as np
...
# 直線の傾きと切片を求めるfunction
def linfit(xdat, ydat):
params = np.polyfit(xdat, ydat, 1) # numpy.polyfit(), order=1
slope = params[0]
interc = params[1]
return slope, interc
...
# この後,この傾き,切片を使って線を引く
今回,numpy.polyfit() を用いましたが,特に難しいところはありませんでした.
Irisの"sepal"(がく片)という部位の長さ(sepal length)と幅(sepal width)の関係を示しています.3種類のIrisにおいて,それぞれ2つのパラメータに直線的な関係があることが分かります.(余談ですが,Irisの分類問題(赤/青/緑の分類)において,上図の"sepal length"-"sepal width"の直線の傾きの違いから,"setosa"(緑)を先に区別して除外し,次のステップで "versicolor"(赤)と"virginica"(青)の2つを分類します,という機械学習の記事をよく見かけます.)
回帰のコンセプト
さて,「直線を引くこと」と「回帰分析」のコンセプトの違いは何でしょうか?Wikipediaと文献の助けを借ります.
回帰(かいき、英: regression)とは、統計学において、Y が連続値の時にデータに Y = f(X) というモデル(「定量的な関係の構造」)を当てはめる事.別の言い方では、連続尺度の従属変数(目的変数)Y と独立変数(説明変数)X の間にモデルを当てはめること.
https://ja.wikipedia.org/wiki/%E5%9B%9E%E5%B8%B0%E5%88%86%E6%9E%90
回帰分析は,2変数X, Yのデータがあるとき回帰方程式と呼ばれる説明の関係を定量的に表す式を求めることを目的としている.(中略) 回帰分析の目的は,XとYとの定量的な関係の構造を求めることであるが,注意すべき点はYをXで説明しようということであり,主としてXとYとの間に関係があるかどうかだけを調べる相関分析とは,この点において本質的に異なる.
統計学入門(東京大学教養学部統計学教室 編)より
XとYを対称に扱ってしまうと回帰ではなくなり,X → Y の因果関係を意識すると回帰になるようです.少し例を挙げたいと思います.
- 背の高いバスケットボール選手は,シュート成功率が高そう.身長 → シュート成功率の因果関係があるので回帰のコンセプトと合う.
- IrisのSepal長さとSepal幅には,直線的な関係がありそう.因果関係はないので回帰ではない(?).
2番めのIrisデータについては回帰,回帰でない,の判断は微妙で,データX,Yを対称に扱うのであれば回帰ではありませんが,「いやいや,植物の遺伝的な経緯で,Sepalの幅がSepalの長さ抑制に影響を与えてきた」と考えればこれは因果関係を考えていますので,回帰のコンセプトに合います.
いかがでしょうか?もし「上の説明がよく分からない」とお感じでしたら,統計の文献(教科書)を参照いただければと思います.
ところで,Pythonのドキュメントを調べていると,時々,回帰関係の技術用語(terminology)で戸惑うことがあるので,次に,リストアップしておきたいと思います.(自分用メモになります.)
回帰分析で出てくる技術用語
Group | Term | 訳 | Remark |
---|---|---|---|
X(原因側) | independent variable | 独立変数 | よく使われます |
Y(結果側) | dependent variable | 従属変数 | よく使われます |
X(原因側) | explanatory variable | 説明変数 | よく使われます |
Y(結果側) | explained variable | 被説明変数 | |
X(原因側) | exogenous variable | 外生変数 | "exog" と略されます |
Y(結果側) | endogenous variable | 内生変数 | "endog" と略されます |
X(原因側) | predictor | 予測子 |
「独立変数」と「説明変数」のように同じコンセプトで複数の用語があるので大変ですね.個人的には"exogenous"と"endogenous"の判別で(同じ"e"で始まるので)苦労しています.
その他,気になる用語を挙げておきます.
Term | 訳 |
---|---|
causation | 因果関係 |
causality | 因果関係,因果律 |
interpolation | 内挿 |
extrapolation | 外挿 |
coefficient determination (R-squared) | 決定係数 |
confidence interval | 信頼区間 |
OLS (= ordinary least squares) | 最小二乗法, 最小二乗回帰 |
こんなところでしょうか?
技術用語は最初,覚えるのが大変ですが,後で英語の文献を読むときに「知ってる単語!」ということで,長い英文の読解の手がかりとなるはずです.
参考文献(website)
- 各パッケージへのリンクは,本文中に入れました.
- 統計学入門(東京大学教養額部統計学教室 編)
- Think Stats, 2nd Edition - Allen B. Downey, O'reilly Media
- 「回帰分析」に関して,たくさんのQiita記事も参照させていただきました.
(リンク詳細は割愛いたします.)