回帰分析の実践 〜 Fast F1を使って線形回帰分析 〜
以前は下記の二つの記事で単回帰・重回帰分析の概要をまとめてみました。
takarotoooooo.hatenablog.com
takarotoooooo.hatenablog.com
今回は上記で学んだことから、F1の分析用PythonパッケージであるFast F1を利用して回帰分析をしてみたいと思います。
F1の基礎知識
F1は各チーム自前のF1マシンを使ってサーキット毎に決められた周回数を一番早く走り切る人を決めるスポーツです。
F1決勝の周回中にはタイヤを交換したり、車両通しの接触などのアクシデントでセーフティーカーという先導車のもと、安全が確保されるまでペースを落として周回するといった様々な事象が発生します。
F1は基本的にマシンの事態の速さやドライバー個人のスキルが大事ですが、同じタイヤで走り続けると、1週走るのにかかる時間(ラップタイム)はだんだんと遅くなるので、いつタイヤを交換するか、どのタイヤ(タイヤにも種類がありそれぞれメリットデメリットがあります)に交換するか、交換したタイヤでどのくらい走らせるかなど、チームが考える戦略も勝つために大事な要因の一つであり、チーム力が試されるスポーツです。
今回やってみること
今回はそんなF1のデータを利用して、各状況でドライバーがフルペースで走った場合、どのくらいのラップタイムが出せるのかを回帰を用いて予測してみます。
準備
pipを使ってFast F1インストールします。
$ pip install fastf1
Pythonでモジュールのインポートをすることで利用できます。
import fastf1
今回は2022年のイタリアGPのデータを利用してみます
session = fastf1.get_session(2022, 'Monza', 'R') session.load()
フェラーリのルクレールというドライバーの周回情報を使ってみましょう。
lec_laps = session.laps.pick_driver('LEC')
データを眺めてみる
fig = plt.figure(figsize=(16, 9)) ax = fig.add_subplot(1, 1, 1) ax.plot(lec_laps['LapNumber'], lec_laps['LapTimeSec'], label='LEC', color='#da291c') ax.set_xlabel('LapNumber') ax.set_ylabel('LapTime') ax.set_title('LEC lap times at Monza in 2022') ax.legend() plt.show()
上記が2022年のイタリアGPのルクレールの周回ごとのラップタイムを可視化したものです。
横軸が周回数。縦軸がその週のラップタイムです。
12, 13週辺りと33, 34週目辺り、48週以降のラップタイムが上がっていることが見えます。
12, 13週辺りと33, 34週目辺りは冒頭で説明したタイヤ履き替えるためにPITに入ったためその分ロスタイムが発生し、ラップタイムが上がっている週です。
48週目以降は他者のアクシデントにより、セーフティーカーが導入され、ペースを落として周回してレースを終了したのでラップタイムが大きくなっています。
では、今回はこのそれぞれの要因でラップタイムが上がっている周回数に、何事もなくレースペースで走っていた場合、どのくらいのラップタイムで走ることができたのかを回帰分析で予測してみます。
単回帰分析で求める
単回帰分析は目的変数と一つの説明変数の相関を導き出す分析手法でした。
今回予測したいのはラップタイムなので目的変数 をラップタイムとし、説明変数 は上で可視化した横軸の周回数としてみます。
つまり周回数 とラップタイム の回帰式 のパラメータ を求めてみます。
まずは、何事もなくレースペースで走れた周回のラップタイムだけを可視化すると下記になります。
lec_clear_laps = lec_laps.query('TrackStatus == "1" and PitOutTime == "NaT" and PitInTime == "NaT"') fig = plt.figure(figsize=(16, 9)) ax = fig.add_subplot(1, 1, 1) ax.plot(lec_clear_laps['LapNumber'], lec_clear_laps['LapTimeSec'], label='LEC', color='#da291c') ax.set_xlabel('LapNumber') ax.set_ylabel('LapTime') ax.set_title('LEC clear lap times at Monza in 2022') ax.legend() plt.show()
若干ですが、周回が進むとラップタイムが小さくなっているように見えます。
これを確認していきましょう。
パラメータ を求める
単回帰分析のパラメータは下記の式で求められます。
ここで は 週目の周回数(つまり です)、 は 週目のラップタイムを表します。
は周回数の平均(= 24.09)、 はラップタイムの平均(= 85.39)です。
x_train = lec_clear_laps['LapNumber'] x_mean = x_train.mean() y_train = lec_clear_laps['LapTimeSec'] y_mean = y_train.mean() a = ((x_train - x_mean) * (y_train - y_mean)).sum() / ((x_train - x_mean) * (x_train - x_mean)).sum()
計算をすると ということがわかりました。
パラメータ を求める
単回帰分析のパラメータはを用いて下記の式で求められます。
計算をすると ということがわかりました。
可視化
回帰直線引いてみると下記のように、近しい直線が引けているように見えます。
このパラメータのときの評価関数の値は4.955でした。
周回数の単回帰分析によるの予測ラップタイムは結果は下記のように求めることができました。
周回数 | ラップタイム |
---|---|
12 | 85.78 |
13 | 85.75 |
33 | 85.10 |
34 | 85.06 |
48 | 84.61 |
49 | 84.57 |
50 | 84.54 |
51 | 84.51 |
52 | 84.48 |
53 | 84.44 |
この分析で明らかになったように、周回数とラップタイムに負の相関があるかというと、答えはYesです。因果関係はありませんが、相関関係はあります。
なぜならば、周回数を重ねるにつれ、車に搭載された燃料が減り、車体重量が軽くなるためです。
以上のように、周回数とラップタイムの関係を求め、特定の周回数のラップタイムを予測することができました。
重回帰分析で求める
先ほどは周回数という一つの説明変数 を使って、ラップタイムを分析しました。
しかし、当然のように実際にはラップタイムは他の様々な要因によって変化します。
よって次は周回数以外に装着しているタイヤの種類、とタイヤを替えてからの周回数を説明変数として追加し、ラップタイムを予測してみようと思います。
カテゴリ変数の変換
装着しているタイヤの種類はソフト、ミディアム、ハードというように種類が分かれているので、数式で扱えるように今回は下記のように数値に変換します。
ソフト | 1 |
---|---|
ミディアム | 2 |
ハード | 3 |
スケーリング
今回はどの変数(周回数、装着しているタイヤの種類、タイヤを替えてからの周回数)がどのくらいラップタイムの良し悪しに影響するのかを知るために、各変数のスケールを揃えておきます。
x_train = lec_clear_laps[['LapNumber', 'TyreLife', 'CompoundSeq']] scaled_x_train = ((x_train - x_train.mean()) / x_train.std()).values
そして下記の通り、バイアス項として最終列に1も追加しておきます。
scaled_x_train = np.insert(scaled_x_train, 3, 1, axis=1)
パラメータ を求める
重回帰分析のパラメータ は下記の式で求められます。
xt = scaled_x_train.T xtx_inv = np.linalg.inv(np.dot(xt, scaled_x_train)) xt_y = np.dot(scaled_x_train.T, y_train) w = np.dot(xtx_inv, xt_y)
可視化
上記で求められたパラメータによる予測を下記に表してみます。
直感的には単回帰分析よりも、近しい線が引かれるように見えます。
このパラメータのときの評価関数の値は2.872だったので、単回帰分析の時よりも近しい線が引けているようです。
単回帰分析の時と同様に予測ラップタイムを求めてみると下記のようになりました。
周回数 | ラップタイム | 単回帰分析による予測 |
---|---|---|
12 | 86.01 | 85.78 |
13 | 85.43 | 85.75 |
33 | 85.64 | 85.10 |
34 | 84.61 | 85.06 |
48 | 84.76 | 84.61 |
49 | 84.18 | 84.57 |
50 | 84.19 | 84.54 |
51 | 84.20 | 84.51 |
52 | 84.21 | 84.48 |
53 | 84.22 | 84.44 |
パラメータを確認する
では、実際に求めれたパラメータを確認してみます。
-0.518 | 周回数 | |
0.241 | 装着しているタイヤの種類 | |
-0.003 | タイヤを替えてからの周回数 | |
85.392 | バイアス項 |
周回数のパラメータは先ほどの通り、負の数になっているので、周回を重ねることによってラップタイムが下がることが表せている:○
装着しているタイヤの種類のパラメータは正の数になっているので、ハードタイヤよりソフトタイヤの方がラップタイムが下がることを表している:○
タイヤを替えてからの周回数は、本来は周回を重ねるごとにラップタイムは悪くなるので正の数になるはずですがそうなりませんでした:×
タイヤを替えてからの周回数を示すパラメータの値が、実際の相関とずれてしまったのは多重共線性による問題が関連しています。
タイヤを替えてからの周回数が増えると、それと同時に周回数も増加するので「タイヤを替えてからの周回数」と「周回数」には相関関係があることになります。
重回帰分析は各説明変数が独立であることを前提に行う分析なので、適切な予測ができない回帰式が出来上ってしまうので、どの説明変数を利用するのかはとても大事な要因であることがここでわかりました。
まとめ
今回は実際のデータを用いて線形の単回帰分析、重回帰分析を試してみました。
改めて回帰分析では説明変数と目的変数の相関や目的変数の予測を行うことが可能であることがわかりました。
それと同時に重回帰分析では説明変数同士が独立であることの大事さも示されました。
次は同様にロジスティック回帰に関して実際のデータを使って試してみようと思っています。
回帰分析の理解まとめ 〜 ロジスティック回帰分析 〜
これまで回帰分析のうち単回帰分析と重回帰分析についてまとめてきました。
takarotoooooo.hatenablog.com
takarotoooooo.hatenablog.com
今回はロジスティック回帰に関してまとめます。
ロジスティック回帰分析とは?
ロジスティック回帰は、事象が発生するか、発生しないかのように二値をとるような問題(コインを投げて表が出るか裏が出るかのような問題です)に関して、発生する(または発生しない)確率を予測するための分析手法です。
ロジスティック回帰ではシグモイド関数というものを利用します。
シグモイド関数
シグモイド関数は下記の式で表される関数で、下記のようなグラフを取ります。
ご覧の通り、シグモイド関数は、 の値が大きければ1に近づき、小さければ0に近づくような関数です。
このシグモイド関数に対して、重回帰分析の時と同様に 個の説明変数 と パラメータ を用いて、事象の発生確率の予測値 を求めます。
なお、ここで をバイアス項とし、
とすると
と表すことができます。
評価関数
単回帰分析、重回帰分析同様に最適なパラメータ を求めるために評価関数を用意します。
ロジスティック回帰分析の場合、観測される目的変数 の値は事象が発生した場合=1, 発生しなかった場合=0のように二値になります。
しかしながらロジスティック回帰分析では、発生する( となる)確率を予測するため、二乗誤差がそのままでは利用することができません。
そこで を観測データの個数として、下記のような式を考えます。
この式のうち前の項である下記は、事象が発生する( である)場合の誤差を表しています。
下記のグラフからわかるように、確率の予測値 が小さい(= 発生する確率が低いと予測した)場合は誤差が大きくなり、大きい(= 発生する確率が高いと予測した)場合は誤差が小さくなります
一方後の項である下記は、事象が発生しない( である)場合の誤差を表しています。
こちらの項は逆に、確率の予測値が小さい場合は誤差も小さくなり、大きい場合は誤差も大きくなります。
つまり、事象が発生した目的変数に対する説明変数 による予測確率 はより大きく、逆に 事象が発生しなかった目的変数に対する説明変数による予測確率はより小さくなれば、評価関数が最小になるので、それを満たすパラメータ を求めます。
パラメータを求めるための準備
最適なパラメータ を求めるために上記の の式をまずは変形します。
ここで下記二つの式を利用することで
下記が成り立ちます。
この値をオッズと呼び、両辺対数をとった下記をロジットと呼びます。
このロジットを利用してさらに式を変形します。
次に下記の式を考えていきます
パラメータを求める
評価関数が最小値をとるパラメータ は上記の勾配が となるところになります。
勾配は傾きが最も大きくなる方向を示すベクトルなので、勾配が示す方向に を変化させていけば、勾配が の極小値にたどり着くことができます。
勾配を利用して最適なパラメータを求める方式の一つに最急降下法があるので、ここではこの方法で説明します。
最急降下法
パラメータの初期値 を決定した上で、次の手順を繰り返すことで最適なパラメータを求めるのが最急降下法です。
- 現在のパラメータでの勾配を求める
- 求められた勾配の反対方向にあらかじめ決めた学習率 分、パラメータを移動させ新たなパラメータ とする
つまり、下記の式を繰り返し計算することで、最適なパラメータが求められます。
上記の手順を繰り返してパラメータを求めたイメージが下記になります。
まとめ
- ロジスティック回帰分析はある事象が発生する確率を予測する分析手法
- シグモイド関数を利用する
- 最適なパラメータは を繰り返し解くことで求めることができる
今回はロジスティック回帰分析に関して概要からパラメータの求め方までをまとめてみました。
具体的なデータを使っての求め方は長くなってしまったので、別でまとめてようと思います。
回帰分析の理解まとめ 〜 重回帰分析 〜
前回こちらの記事で回帰分析のうち単回帰分析について概要とパラメータの求め方をまとめした。
takarotoooooo.hatenablog.com
今回は重回帰分析に関してまとめてみようと思います。
重回帰分析とは?
ある目的変数 を複数の説明変数 で表す式を求めることです。
例えば、目的変数を下記の式で近似できると仮定した時に、最適なパラメータ を求めます。
ここで、をバイアス項(全てのが0の時の目的変数の値)とし、
とすると
と表すことができます。
評価関数
重回帰分析においても、評価関数として二乗誤差を使います。
, をそれぞれ、番目の実測値、予測値とすると
とすると
評価関数が最小値をとるパラメータを探す
まずは先ほどおいた を下記のように展開します
ここで
とすると、下記のように表せます。
これを評価関数に代入し、式を展開すると下記のように表せます。
ここで評価関数を最小にするを求めます。
つまり
つまり、下記が成り立ちます
実際に求めてみる
パラメータの求め方がわかったので、実際に以下のサンプルデータを使って求めてみます。
0 | 0 | 0 | 0 | -5.092 |
1 | 1 | 9 | 1 | 55.14354986 |
・・・ | ・・・ | ・・・ | ・・・ | ・・・ |
48 | 3 | 2 | 0 | 89.69 |
49 | 4 | 1 | 1 | 101.47423445 |
このデータを横軸を、縦軸をとしてプロットしたものが下記です。
このデータをもとにを下記の式から求めると
-0.78 | 2.069 | -4.28 | 5.41 | 11.69 |
と、なり
を計算して予測データとしてプロットしたものが下記となり、おおよそ観測データを近似できているように見えます。
が示す意味
のそれぞれの値 は単回帰分析の時と同様に が に与える影響度の大きさを表しています。
ただし、 それぞれの値のスケールが違うことで、 の時に よりも の方が により大きな影響を与えるということが言えません。
パラメータの値を見るだけで、どの変数 が に対して、どの程度の影響があるのかを知れるようにするために、各 の値を標準化した上でパラメータを求めます。
標準化
各変数の標準化の方法は変数が従う確率分布によって異なりますが、ここでは各変数が正規分布に従うと仮定して標準化してみます。
各 に関して平均を引き、標準偏差で割ることで平均0、分散1の値として標準化することができます。
-1.69 | -1.41 | -1.56 | -1 |
-1.62 | -0.70 | 1.56 | 1 |
・・・ | ・・・ | ・・・ | ・・・ |
1.62 | 0.70 | -0.87 | -1 |
1.69 | 1.41 | -1.21 | 1 |
この標準化された をもとに算出されたパラメータ が下記です。
71.54 | 29.85 | -6.05 | 15.54 | 5.84 |
これを見ると の絶対値が大きいので、 が への影響度が一番大きいことが判断できます。
まとめ
- 重回帰分析は、ある目的変数 を複数の説明変数 で表す式を求めること
- 最適なパラメータ は行列を用いて で求められる
- パラメータ は説明変数を標準化することで、説明変数毎の目的変数への影響度を表すことができる。
今回は重回帰分析に関して概要からパラメータの求め方までをまとめてみました。
次回はロジスティック回帰分析に関してまとめてみようと思います。
回帰分析の理解まとめ 〜 単回帰分析 〜
回帰分析とは?
ある目的変数 と説明変数 の関係性を明らかにする統計手法です。
単回帰、重回帰、ロジスティック回帰、主成分回帰、部分的最小二乗回帰などさまざまな種類があります。
この記事では単回帰分析に関してまとめてみます。
単回帰分析とは?
ある目的変数 を一つの説明変数 で表す式を求めることです。
例えば、身長と体重の関係。年齢と年収の関係などが、下記の式で近似できると仮定した時に、最適なパラメータ , を求めます。
最適なパラメータとは?
「最適」とはどんなものになるでしょうか?
下のようなデータを考えてみます。
このデータに対して
における , をそれぞれ変えると下記の通りさまざまな直線を書くことができます。
直感的にどの , による直線が一番観測されたデータと近いでしょうか?
それぞれ直線がどのくらい観測データに近しいかを表す関数を評価関数と呼びます。
評価関数
評価関数として二乗誤差というものがよく使われます。
番目の観測値 に対する と、あるパラメータ , によって表される推定値 の差分 の二乗を全ての において計算し総和を求めます。
を観測されたデータの個数とすると下記の式で表されます
この二乗誤差の総和を評価関数とすると、評価関数の値がより小さければ観測データをよく表しているように見えます。
よって評価関数の値をより小さくするようなパラメータ , を見つけてみます。
評価関数が最小値をとるパラメータを探す
評価関数の値が最小になる点は微分を用いることで、見つけることができます。
今回は評価関数を二乗誤差の総和としているので、下記を満たすパラメータ, を求めれば良いことになります。
パラメータ の導出
つまり
ここで、とはそれぞれ観測データのとの平均となるので、それぞれを, と表すと
パラメータ の導出
つまり
と を観測データのみで求めることができることがわかります。
なお、, は、観測データを中心化したデータであり、, と表すと下記の関係になります。
実際に求めてみる
パラメータの算出方法がわかったところで、実際のデータを使って求めてみます。
以下がサンプルデータの一部です。
0 | 45.010787 | -24.5 | -102.428666 |
1 | 62.315182 | -23.5 | -85.124271 |
2 | 66.829897 | -22.5 | -80.609556 |
・・・ | ・・・ | ・・・ | ・・・ |
47 | 245.844440 | 22.5 | 98.404987 |
48 | 238.553507 | 23.5 | 91.114054 |
49 | 246.184165 | 24.5 | 98.744713 |
なお、
なので、
これらの, を用いた直線を表してみると下記になります。
実際に観測されたデータに近しい直線で引けており、, の表すことができました。
まとめ
- 単回帰分析は目的変数 を一つの説明変数 で表す式を求めること
- 最適な直線は観測データと直線の差を表す評価関数を最小にするようなパラメータを見つけることで求められる
今回は回帰分析のうち、単回帰分析に関して概要からパラメータの求め方までをまとめてみました。
次回は重回帰分析に関してまとめてみようと思います。