BoatraceCSV

Motor Pt Breakdown(モーターpt 素点の内訳)

data/estimate/motor_pt/{runs,motors,baseline}/YYYY/MM/DD.csv

Strength Index の N枠_モーターpt を作る 素点 (raw pt)の計算過程を、そのまま明細として配る派生データ。生成は scripts/build_motor_pt_breakdown.py(日次バッチ)。

なぜ配る必要があるか

素点は

素点 = n_eff / (n_eff + k) × Σ(w × z) / Σw          k = 10
  z  = (生得点 − μ_セル) / σ_セル                    セル = 級別 × グレード分類 × 進入
  w  = exp(−ln2 / 60 × 経過日数)                     半減期 60 日

で決まり、この計算には次の 4 つが要る。

  1. 当場の直近 6 節ぶん、全モーターの全走(programs/race_cards の節間 14 スロット成績)
  2. 各節の開催グレード(programs/title)
  3. モーター期起算日(programs/motor_stats。期をまたいだ節を履歴から剪定する)
  4. 全 24 場を横断したコース補正ベースライン μ/σ

4 があるため、1 基ぶんの素点でも全場のコーパスに依存する。当日ぶんの CSV しか 取得しない下流(fun-site 等)では、1〜3 を全部揃えても再現できない。選手pt に対する Recent National / Local Form と同じ立ち位置で、 「内訳を配ることで下流が計算過程を表示できるようにする」のがこのファイル群。

計算は boatrace.index_features.motor_ability_breakdown() 1 本に集約してあり、 build_index.py が呼ぶ motor_ability_pt() はその raw_pt を返すだけのラッパ。 index CSV のモーターptと内訳が食い違うことはない。

対象範囲

その日の race_cards に出てくる (場コード, モーター番号) だけ。全場全モーター ぶんは下流が使わないので出さない。2026-08-22(13 場開催)の実測で 567 基 / 19,470 走 / 約 1.8MB。

baseline は絞り込み前の全場コーパスから算出した値をそのまま出す(素点計算に 実際に使われたのがその値だから)。

runs/YYYY/MM/DD.csv(1 走 1 行)

素点に寄与した走の明細。集計対象外の走(F / L / 失 / 妨 / 欠 / 不)は 行として現れない。機材起因の 転 / 落 / 沈 / エ は生得点 -100 で計上される。

列 説明
記録日 対象日(パスの日付と同じ)。時間減衰の基準日でもある
場コード 2 桁
モーター番号 物理モーター番号
節 0 = 直近節。新→旧で 0〜5(最大 6 節)
節最終日 その節の最終開催日
走行日 この走の実日付。記録日 − 走行日 が減衰の経過日数
日次 / 走 由来スロット D{日次}走{走}(節の何日目の何走目か)
級別 A1 / A2 / B1 / B2。スコア表の行キー
グレード分類 SG_G1 / G2_G3_一般 / 全(B1・B2 は常に 全)
進入 進入コース 1〜6。0 は不明(コース補正のフォールバック対象)
着順 正規化済み着順トークン(1〜6 / 転 / 落 / 沈 / エ)
生得点 スコア表の値。転落沈エ は -100
セルμ / セルσ この走に適用されたコース補正セルの平均・標準偏差
残差z (生得点 − セルμ) / セルσ
減衰重み exp(−ln2 / 60 × (記録日 − 走行日))

motors/YYYY/MM/DD.csv(1 モーター 1 行)

集計値。採点対象の走が 1 本も無いモーターも 1 行出す(素点以下の列が空欄)ので、 下流は「ファイルに無い」と「履歴が無い」を区別できる。

列 説明
記録日 / 場コード / モーター番号 識別子
節数 素点に寄与した節の数(0〜6)
走数 runs に出ている行数
Σw / Σw2 減衰重みの和 / 二乗和
n_eff Σw² / Σw2。Kish の有効サンプル数
加重平均残差 Σ(w × z) / Σw。収縮前の値
素点 n_eff / (n_eff + 10) × 加重平均残差。= N枠_モーターpt の入力

素点から表示用の偏差値pt までは index CSV 側の変換で、 モーターpt = 50 + 10 × (素点 − μ_場) / σ_場(μ/σ は stadium/weights/{predictor_id}/YYYY-MM.csv)。

baseline/YYYY/MM/DD.csv(コース補正セル)

列 説明
記録日 対象日
級別 / グレード分類 セルのキー
進入 1〜6。0 は「級別 × グレード分類」のフォールバックセル
μ / σ 母集団平均 / 母集団標準偏差(σ は下限 10 で丸め)
サンプル数 このセルを構成した走の本数

サンプル数 5 本未満のセルは行として出てこない(LANE_BASELINE_MIN_SAMPLES)。 そのため cell_stats() のフォールバック階層は、行の有無をそのまま使って再現できる:

  1. (級別, グレード分類, 進入) の行があればそれ
  2. 無ければ (級別, グレード分類, 進入=0) の行
  3. それも無ければ (μ, σ) = (0, 1)(= コース補正なし、生得点をそのまま使う)

runs の セルμ / セルσ は既にこの解決を通した後の値なので、下流は通常 baseline を引き直す必要はない(セルの中身やサンプル数を表示したいときに使う)。

下流での再構成

runs の行だけで素点まで戻せる:

Σw   = Σ 減衰重み
Σw2  = Σ 減衰重み²
n_eff = Σw² / Σw2
素点  = n_eff / (n_eff + 10) × Σ(減衰重み × 残差z) / Σw

CSV は丸めた値なので motors の 素点 と末尾数桁がずれる(2026-08-22 実測の 最大差 6.4e-7)。表示用途では無視できるが、厳密な値が要るときは motors の 素点 を使うこと。参照実装は boatrace.motor_pt_breakdown.recompute_raw_pt()。

注意

関連