PlayerAgg対応 MVP採点関数仕様
本資料は、既存 PlayerAgg フィールドに対応した「今月のMVP」計算関数の実装仕様です。
1. 対象データ(既存 PlayerAgg)
入力: Map<String, PlayerAgg> byPlayerId
PlayerAgg フィールド(抜粋)
- 打撃系:
pa,ab,h,hr,rbi,r,bb,hbp,so,roe - 走塁系:
steals,caughtStealing - 守備系:
putouts,assists - 投手系:
pitchingOuts,pitchingRunsAllowed,pitchingHitsAllowed,pitchingStrikeouts,pitchingWalks,pitchingHitByPitch,pitchingPitchCount
2. 出力仕様
typedef MvpScoreBreakdown = ({
double batting,
double pitching,
double fielding,
double running,
double total,
});
typedef MvpRankEntry = ({
String playerId,
MvpScoreBreakdown score,
});
返却: List<MvpRankEntry>(降順、1〜3位を利用)
3. 計算フロー
- 各選手の派生指標を計算
- 指標ごとに 0〜100 へ正規化
- カテゴリ内重みでカテゴリ点を計算
- カテゴリ重みで総合点を計算
- 同点時ルールで順位確定
4. 派生指標の定義(PlayerAgg対応)
4.1 打撃
avg = (ab > 0) ? h / ab : 0onBaseRaw = h + bb + hbppowerRaw = hr * 4 + rbisoRate = (pa > 0) ? so / pa : 1(低いほど良い)
4.2 投手
eraLike = (pitchingOuts > 0) ? (pitchingRunsAllowed * 27) / pitchingOuts : 99(低いほど良い)kRate = (pitchingOuts > 0) ? pitchingStrikeouts / pitchingOuts : 0bbRate = (pitchingOuts > 0) ? pitchingWalks / pitchingOuts : 1(低いほど良い)
4.3 守備
putoutsRaw = putoutsassistsRaw = assists
4.4 走塁
sbRaw = stealscsRate = (steals + caughtStealing > 0) ? caughtStealing / (steals + caughtStealing) : 0.5(低いほど良い)
5. 正規化関数
double minMax(double x, double min, double max) {
if (max <= min) return 50.0;
return ((x - min) / (max - min) * 100).clamp(0, 100);
}
double minMaxInverse(double x, double min, double max) {
if (max <= min) return 50.0;
return ((max - x) / (max - min) * 100).clamp(0, 100);
}
- 逆指標:
soRate,eraLike,bbRate,csRate
6. 重み(v1)
6.1 カテゴリ重み(総合)
- 打撃:
0.40 - 投手:
0.25 - 守備:
0.20 - 走塁:
0.15
6.2 カテゴリ内重み
- 打撃
- AVG:
0.40 - 出塁寄与:
0.30 - 長打/打点寄与:
0.20 - 三振率(逆):
0.10
- AVG:
- 投手
- 失点率(逆):
0.45 - 奪三振率:
0.30 - 与四球率(逆):
0.25
- 失点率(逆):
- 守備
- 刺殺:
0.55 - 補殺:
0.45
- 刺殺:
- 走塁
- 盗塁:
0.70 - 盗塁死率(逆):
0.30
- 盗塁:
7. 有効データの下限
- 打撃率指標は
ab >= 5のとき有効 - 投手率指標は
pitchingOuts >= 3のとき有効 - 下限未満の場合
- 率指標は中立点
50を適用 - カウント指標は通常どおり正規化
- 率指標は中立点
8. 同点時の順位決定
- 出場寄与(
pa + pitchingOuts)が大きい選手 - 打撃カテゴリ点が高い選手
- 守備カテゴリ点が高い選手
playerId昇順(最終安定化)
9. 推奨関数シグネチャ(Dart)
List<MvpRankEntry> computeMonthlyMvpRankings({
required Map<String, PlayerAgg> byPlayerId,
int topN = 3,
});
補助関数
computeCategoryScores(byPlayerId)normalizeMetric(values, inverse: false)applyMinimumThresholds(agg)
10. 実装時の注意
- 月次MVPは「当月データのみ」を入力にする。
- 無料画面は
topN=3のみ表示。 - 有料画面でカテゴリ内訳(打撃/投手/守備/走塁)を表示できる形で保持。
- 重みは定数化し、将来は Remote Config で調整できるようにする。