「線形回帰」とは、データの中の直線関係をモデル化する方法の1つです。
「線形」とは、データのある変数が増えたら別の変数も直線的に増える(または減る)という状態を指します。
「回帰」とは、データを式で表現することを言います。
線形回帰分析を行うことで、データの性質を表現した数式が得られます。
その数式を線形回帰直線や線形回帰モデルと呼びます。
線形回帰の例としては、例えば、fxでトレンドやチャネルを考える時に用いられたりします。
- 線形回帰の求め方は?
- 線形回帰を行うアルゴリズムは?
- 最小二乗法とは?
と思われる方も多いかと思います。
そこで本記事では、
- 線形回帰を Python で行う方法
- 線形回帰のアルゴリズム
- 線形回帰モデルのサンプルコード・実装
などについて、サンプルコードを交えながら、わかりやすくまとめます。
【線形回帰 Python】線形回帰とは?線形回帰モデルのアルゴリズム、最小二乗法とは?回帰直線式や係数の求め方など、線形回帰分析を Python でやりたいあなたはこちらをどうぞ【scikit-learn】
線形回帰のやり方とは
線形回帰のやり方の全体像は以下になります。
(1), データの準備
(2), 線形回帰の実行
(3), 結果の解釈
の3ステップになります。
以下でそれぞれについて解説していきますね。
線形回帰のためのデータ準備
線形回帰は、2つの変数の関係を調べる方法です。
線形回帰分析では、2つの変数を含んだデータが必要です。
例えば、
- 身長と体重
- 気温と売り上げ
などの「値のペア」のデータとなります。
- 線形回帰分析では、分析に必要な形式のデータが必要
ということになります。
これを読まれているあなたは、線形回帰を行ってみたいデータをお持ちかもしれません。
もしあるなら、ぜひそのデータを使ってみてください。
自分のデータで分析すると習得も早くなるかと思います。
この記事では、「人工データ」を使って、線形回帰を行ってみたいと思います。
人工データは使うメリットがあるからです。
理由を説明しますね。
人工データを使うメリット
通常、線形回帰のゴールは、数式を決めることですが、
ここでは線形回帰を学ぶのを主目的にしています。
なので、以下のようにしてみます。
(1), 答えである数式からデータを発生させる
(2), そのデータに線形回帰分析を実行する
(3), 得られた数式が、データを発生させた数式を再現できるかどうかを確かめる
この3ステップを人工データで再現してみてほしいと思います。
それを1度やっておくことで、
ご自分のデータを線形回帰分析するときにも
同じ方法で数式を作れるんだという感覚を得ることができるからです。
この人工データを使う方法は、線形回帰に限らず、
日々開発される新しい手法を身につける際にも、
いつでも使えるやり方になっています。
線形回帰のアルゴリズムとは(最小二乗法)
- 具体的にどうやって数式作るの?
ということを説明します。
繰り返しになりますが、線形回帰の目的は、
- データをよりよく再現する数式を作ること
です。
最初からいきなり正解の数式を作ろう!と考えると理解が難しくなります。
なので考え方を変えて、
- 最初は大まかに数式を決め、改良を加えて良い数式を作る
という考え方を知っておくと理解しやすくなるかと思います。
具体的には、以下のイメージです。
(1), 数式を仮定
(2), 数式にデータの片方を入れ、もう一方を計算
(3), 計算して得た値と、本物(正解)の値との差を計算する
(4), 正解との差が小さくなるように、数式を変化させる
より具体的に説明しますね。
(1), 数式を仮定
線形回帰では、ペアのデータを使います。
気温と売り上げ、のようなデータです。
仮に数式が
(売上)=3×(気温) + 5
だとします。
y=3x+5
のような式と同じことになります。
これは最適な数式ではないかもしれませんが、
とりあえずこうしてみます。
以下(2),(3),(4)で、数式を改良していくわけです。
(2), 数式にデータの片方を入れ、もう一方を計算
手元のデータに気温が10度の時に売り上げが150万とします。
(気温、売り上げ)=(10、150)
といったデータになります。
上で仮定した数式の気温にこの10を入れてみます。
すると、
(売上)=3×10 + 5 = 35
となります。
(3), 計算して得た値と、本物の値との差を考える
計算した売り上げの値は、35です。
本物の売り上げの値は、150です。
この差を考えると、150−35=115
となります。
(4), この差が小さくなるように、数式を変化させる
ここで数式を以下のように変えてみます。
(変える前)
(売上)=3×(気温) + 5
(変えた後)
(売上)=13×(気温) + 25
としてみます。
そして、変えた式を使い、
上と同じようにデータを入れて計算してみます。
(売上)=13×10 + 25 = 155
差を考えると
150ー155=ー5
となりました。
- 最初の式での差は115
- 変えた式での差はー5
誤差が負の数になっています。
これは都合が悪いので、正の数にするために二乗します。
負の数だけ二乗するわけにはいかないので、正の数も二乗します。
すると、
- 最初の式の差の二乗は、13225
- 変えた式の差の二乗は、25
となっています。
同じ正の数なので、大きさを比べることができます。
数式を変えることで、誤差を小さくできています。
誤差を小さくすることを言い換えると、
- データをよりよく表現した
と言い、使った数式を
- データをよりよく表現した数式
と呼びます。
これが最小二乗法のイメージになります。
- 誤差の二乗を最小にする方法
というわけです。
数式の係数を変化させて、誤差を最小にしているわけです。
実際は、多くのデータを扱うので、線形代数の行列計算などを使い解きます。
しかしその原理は上で説明した内容を出発点にしています。
- 線形代数?行列?って何?
- 数学は苦手なんだよなぁ〜
と思われる方も多いかもしれません。
だいじょうぶです。
Python なら、サクッと線形回帰を実行できます。
線形回帰ができるライブラリがあるので、
細かいアルゴリズムをプログラミングしなくても、
線形回帰をラクに実行することができます。
以下で線形回帰の実装を説明しますね。
Python による線形回帰のためのライブラリ sklearn とは?
Python で線形回帰分析は、
scikit-learn(サイキット・ラーン)
というライブラリパッケージを使うとサクッと実行できます。
scikit-learn は、無料で使える高性能ライブラリです。
線形回帰だけでなく、
その他の様々な統計解析なども実行できます。
使い慣れておいて損はないライブラリとなっています。
以下で scikit-learn を使って、
線形回帰分析を Python でサンプルコードを示しながら、実装したいと思います。
線形回帰モデルの作成・実装
実装の流れは以下になります。
(1), scikit-learn などの必要なライブラリをインポート
(2), データの準備(今回は人工データを使います)
(3), 線形回帰分析の実行
(4), 結果の解釈(今回はグラフで可視化します)
(1), scikit-learn などの必要なライブラリをインポート
ここで使っているライブラリは
「NumPy」は、データを扱いやすくするライブラリです。行列計算などを高速に行うことができます。
「matplotlib」「seaborn」は、グラフを表示するためのライブラリです。
「scikit-learn」が、線形回帰を行うためのライブラリで、コードの中では「sklearn」と書かれています。
(2), データの準備(人工データの生成)
今回はデータを人口的にランダムに生成します。
気温と売上という2つの変数を生成します。
In[45]: 気温のデータは、50個のデータ(0から30までの実数)を生成しています。
(seed.rand(50)で0から1の間の数値をランダムに50個生成しています。
In[46]: 売上のデータは、気温データを使って、
以下の式で生成されています。
(売上)=2×(気温)−10 + ランダム数
ランダムな数字のイメージがわかないかもしれないので、実際の値を示しておきますね。こんな感じです↓
「10*seed.rand(50)」は、0から10の間の数値です。
「−10+10*seed.rand(50)」は、0から−10の間の数値が50個生成されていることがわかります。
これを平均すると、約−5.2となっています↓
なので、結局、データを生成するために使った数式は、
(売上)=2×(気温)ー 5. 2
ということになります。
これで、必要だった2つの変数(気温、売上)のデータがそろいました。
可視化して確かめてみるととこんな感じです↓
横軸が気温、縦軸が売上になります。
今回は、数式
(売上)=2×(気温)−10+ランダム数
をもとにして、ランダムな数値を使い、
ばらつきを加えている様子が見てとれるかと思います。
(3), 線形回帰分析の実行
Python で線形回帰分析を行うには、
scikit-learn の LinearRegressionモジュールを
使います。
In[66] まずモデルの入れ物(空)を作ります(インスタンスの生成)。
今回は、売上モデル(uriage_model)という名前にしました。
In[67] 生成したモデルの回帰メソッド(fitメソッド)を使い、回帰をしています。
fitメソッドはカッコの中に、2つの変数を指定します。
今回は、気温から売上を予測したいので、
fit( 気温、売上) の順番で指定します。
気温については、変数の次元を調整するために
kion[: , newaxis]
としています。
LinearRegressionのfitメソッドの仕様に合わせるための処理となっています。
気温の次元は、50行0列の「ベクトル」ですが、
修正後は、50行1列の「行列」になっています。
(4-1), 結果の解釈(グラフで可視化)
得られた直線の式を可視化しています。
In[70] 直線を加えるために、点を大量にかくことで実現しています。
np.linspace で0から30までを1000間隔で点を生成して、変数 kion_fit に代入しています。
ここでも次元を仕様に合うように変更しています。
生成したそれぞれの点(1000点)について、
得られた直線の式を使って、売上の値を求めて、uriage_fit に代入しています。。
これで線形回帰で求めた直線上の点(kion_fit, triage_fit)の1000点のデータが得られたわけです。
このデータと最初のデータを同じグラフに表示すれば上の図になります。
(4-2), 結果の解釈(最適な直線)
線形回帰では、1次関数をデータに合うように最適化にします。
1次関数には、傾きと切片の2つの係数があり、
これらの最適な値を求めることが線形回帰になります。
求めた傾きと切片を表示してみます
切片(intercept)が、−4.8
傾き(coefficient)が、2、0
ということがわかりました。
つまり、求めた最適な直線は
売上=2.0 ×(気温) – 4.8
ということがわかりました。
今回のデータは、数式
(売上)=2×(気温)ー 5. 2
をもとにして、生成されました。
求めた数式と元にした数式はほとんど同じですね。
つまり、線形回帰を使って、データに最適な直線を得られたと思えるかと思います。
というわけで、本記事では、
- 線形回帰を Python で行う方法
- 線形回帰のアルゴリズム
- 線形回帰モデルのサンプルコード・実装
などについて、サンプルコードを交えながら、わかりやすくまとめました。
線形回帰では、他にも、標準誤差、p値などを使い、
- データへの数式の当てはまりの良さ
を数値で評価できたりします。
さらに、今回はデータに合うような最適な「直線」を考えましたが、
直線じゃなくても線形回帰のアルゴリズムが使えます。
線形回帰は曲線にも応用でき、その場合。非線形回帰と呼ばれたりします。
例えば、ロジスティック回帰などが有名どころとなります。
また、線形回帰は、機械学習を学ぶ上でも基礎となります。
本記事で自信がついたら、これらのトピックを勉強してみるのもオススメです。
こちらもございます↓