レーシングシミュレータの実データを使って、データサイエンスの概念を実装とともに解説しています。
この記事では EDA(探索的データ分析) を扱います。
こんな人に役立ちます
- 特徴量エンジニアリング後の「次のステップ」を知りたい
- 相関係数の棒グラフとヒートマップの読み方を実例で理解したい
- 多重共線性がなぜ問題になるかを具体的なデータで確認したい
問い:104個の特徴量テーブルができた。最初に何を見るか
104個の特徴量を作った。でも——どれを見ればいい?
実は、この時点で分析の8割は決まります。
前の記事で、GT7(Gran Turismo 7、PlayStation向けレーシングシミュレータ)のテレメトリ1ラップ分(約6,000行)をT1区間の統計量に集約し、「1ラップ = 1行、104個の特徴量」のテーブルを作りました。
特徴量1 特徴量2 ... 特徴量104 t1_time
ラップ001 0.523 2.341 147.2 12.200
ラップ002 0.541 2.352 148.5 12.100
:
※ 特徴量とは「1ラップの走行データを数値で要約した指標」です。今回はスロットル・ブレーキ・横G・サスペンション高さなど約26種類のテレメトリ信号それぞれに、平均・標準偏差・最大値・最小値の4統計量を計算しました(統計量の選択は分析の目的によって変わります)。合計104個になります。
今回は汎用的な4統計量を使いましたが、レースデータならではの派生特徴量も考えられます。たとえば「ブレーキ解除からアクセル踏み始めまでの移行時間」「左右サスペンション高さの差(荷重移動量の指標)」「ステアリング角に対して横Gが小さい割合(アンダーステアの定量化)」などです。どの特徴量を使うかで、モデルが捉えられる情報の質が変わります。
ここからいきなりモデルを学習することもできますが、それをやると無関係な変数が混在したまま学習が進み、「どの変数が効いたのか」が解釈できなくなります。事前に「どの変数が効きそうか」「変数同士が似た情報を持っていないか」を把握しておくと、モデルの解釈が格段にしやすくなります。この事前確認の作業を EDA(Exploratory Data Analysis、探索的データ分析) と呼びます。
結論
- T1通過タイムと最も強く相関する特徴量は
sus_height_rl__mean(r = -0.919) - 上位15特徴量は全て統計的に有意(p < 0.001)※偶然この相関が現れた確率が0.1%未満
- ヒートマップにはサスペンション高さ系(sus_height_rl/fl)やブースト圧・スロットル系が強く相関する明確なブロック構造—— 多重共線性 の予兆
つまり、T1の速さを決めているのは操作そのものより、操作の結果として生まれる車体挙動です。
「でも、操作を改善しないと速くはならないのでは?」
その通りです。速さを変えるのは最終的には操作です。ただしデータが強く捉えているのは操作そのものではなく、その結果として現れる車体挙動です。「良い操作かどうか」は直接ではなく、挙動を通して見えてきます。
① ターゲットとの相関係数ランキング
相関係数 r は「2つの変数がどれくらい一緒に動くか」を -1〜+1 で表します。-1に近いほど逆方向、+1に近いほど同じ方向に動く関係です。
まず「T1通過タイムとの相関係数(ピアソンの r)」を全104個の特徴量について計算し、絶対値の大きい順に並べます。
from scipy import stats
corr_rows = []
for col in feat_cols:
r, p = stats.pearsonr(X[col], y)
corr_rows.append({'feature': col, 'r': r, 'abs_r': abs(r), 'p': p})
corr_df = pd.DataFrame(corr_rows).sort_values('abs_r', ascending=False)
赤いバーが長いほど「タイムが速くなる傾向の変数」(負の相関)、青いバーが長いほど「タイムが遅くなる傾向の変数」(正の相関)です。
上位に並んだ変数を見ると、次のことが読み取れます。
-
sus_height_rl__mean(r = -0.919): 後輪左サスペンションの平均高さ。値が低いほど(サスが縮むほど)タイムが速く、スロットルや車速より強い相関を示した -
body_height__mean(r = +0.871): 車体の平均高さ。サスペンションが縮むと車体は下がるため、sus_height系とは逆方向(正の相関)を示している -
sus_height_fl__mean(r = -0.854): 前輪左サスペンションの平均高さ。1位と同系統の変数で、前後サスペンションが連動して変化していることを示す
「直接操作できない変数」が上位に来た意味
上位を占めるサスペンション高さ系の変数は、ドライバーが走行中に直接操作するものではありません。しかしこれらは 操作の結果として変化する変数 です。
- スロットルを丁寧に開けてブレーキを滑らかに解除するラップ → 重心移動が穏やか → サスが安定した高さを保つ
- 突っ込みすぎてアンダーステアが出るラップ → 車体が暴れる → サスの挙動が乱れる
サスペンション高さは、ドライバーの操作の「結果」を映す変数です。
一方、6位の throttle_pct__mean(r = -0.795)はアクセルの踏み込み量そのもので、操作に直結しています。「T1区間でのスロットル開度の平均が大きいラップほど、タイムが速い傾向がある」と読み替えられます。
相関分析では「何が速さと結びついているか」はわかりますが、それが 直接操作できる変数か ・ 操作の結果を映す変数か を区別して読むことが、実際の改善につながります。
一方、多くの変数はほぼ r ≈ 0 であり、T1タイムとの線形な関係が見られません。
104個の特徴量を作りました。しかし実際に効いていたのは、数個だけです。ただし r ≈ 0 は「無関係」を意味するわけではなく、直線では表せない非線形な関係が隠れている可能性があります。たとえばブレーキ圧は「強すぎても弱すぎても遅い」という山型の関係がある可能性があり、そのような変数は r ≈ 0 でも実際には重要な予測変数かもしれません。
相関係数の注意点
相関係数は「線形な関係」しか捉えられません。非線形な関係(たとえば「ある閾値を超えると急に効く」など)は r≈0 でも予測に寄与することがあります。これが後述の Random Forest 重要度との使い分けにつながります。
上位3変数の散布図
直線的な傾向が明確な変数がある一方、点がばらついているものもあります。ばらつきが大きい変数は、T1タイム以外の要因(ライン取りや車体姿勢など)が混在しているためです。
② 特徴量間の相関ヒートマップ
次に「特徴量同士がどれだけ似た情報を持っているか」を確認します。ターゲット相関の上位20個に絞って相関行列を計算し、ヒートマップで可視化します。
top20_cols = corr_df.head(20)['feature'].tolist()
corr_matrix = X[top20_cols].corr()
各マスが2変数間の相関係数を表しており、濃い赤(r≈+1)は正の方向に、濃い青(r≈−1)は逆方向に値が連動する変数の組み合わせです。
ヒートマップを見ると、サスペンション高さ系(sus_height_rl、sus_height_fl)やブースト圧・スロットル(boost_pressure、throttle_pct)がそれぞれかたまって相関するブロック構造が確認できます。たとえばboost_pressure__meanとthrottle_pct__meanの r は 0.945 に達しており、どちらか一方だけで実質同じ情報を持っていることになります。
多重共線性とは
複数の特徴量が互いに強く相関している状態を 多重共線性(multicollinearity)といいます。多重共線性が高い変数を両方モデルに入れると、次の問題が起きます。
- 回帰モデル(線形回帰など): 係数が不安定になり、解釈が難しくなる
- 特徴量重要度(Random Forest): 重要度が2つの変数に分散し、どちらも「中程度に重要」と見えてしまう
EDAの段階でヒートマップを確認しておけば、どの変数ペアを整理すべきかがわかります。
③ EDAから読める次のアクション
| 観察 | 次のアクション |
|---|---|
| 相関が高い変数(|r| > 0.3)が数個に集中 | この変数を優先的にモデルに投入し、効果を確認する |
| 多くの変数が r ≈ 0 | 線形では捉えられない関係がある可能性 → Random Forest 重要度で再評価 |
| ヒートマップで強相関のブロック | どちらか一方を除外するか、主成分分析(PCA)でまとめることを検討 |
EDAは「モデルを作る前の地図を描く」作業です。変数の数が多いほど、この地図なしに進むと解釈が難しくなります。
よくある失敗
- 相関だけ見て終わる: 相関係数は線形関係しか捉えられません。r ≈ 0 でも非線形な重要変数が潜んでいる可能性があります
- 全部の特徴量をモデルに入れる: 多重共線性のある変数を両方入れると係数が不安定になり、解釈が難しくなります
- 重要度だけで判断する: Random Forest の特徴量重要度は強力ですが、相関係数による事前確認を省くと多重共線性の影響を見落としがちです
まとめ
今回は104個の特徴量テーブルに対して2種類のEDAを実施しました。
相関係数ランキングでは sus_height_rl__mean(r = -0.919)がT1通過タイムと最も強く関係することがわかりました。一方、ヒートマップではサスペンション高さ系やブースト圧・スロットル系が強く相関するブロック構造が現れ、多重共線性の予兆が確認できました。
特徴量の数が多いとき、いきなりモデルを学習するより先に「どの変数が効きそうか」「変数同士が似た情報を持っていないか」をEDAで把握しておくと、その後の分析の精度と解釈しやすさが上がります。今回の結果が示すように、速さに関係するのは操作変数そのものより 操作の結果として生まれる車体挙動 でした。EDAなしでは、この発見に気づかないまま分析が進む可能性があります。
相関係数は線形な関係しか捉えられないという限界もあります。次のステップとしてRandom Forestを使うと、非線形な関係も含めて「モデルの予測に実際に貢献する変数」を改めて評価できます。
参考
- データ:GT7テレメトリ(富士スピードウェイ、Supra18、RM、Dry、95ラップ)
- ライブラリ:numpy、pandas、scipy、matplotlib
- 特徴量の作り方:時系列データから特徴量を作る
- 外れ値除外(IQR法)の詳細:1コーナーの通過タイムは100本でどれくらいバラつくのか
- T1(富士スピードウェイ1コーナー)の解説:富士スピードウェイの1コーナーを、データサイエンスで分析する(note)


