这个php项目怎么看双方射门转化率差异?

wen PHP项目 1

如何分析 PHP 项目中双方射门转化率差异

在足球数据分析类 PHP 项目中,射门转化率(Shot Conversion Rate) 通常指:

这个php项目怎么看双方射门转化率差异?

转化率 = 进球数 / 射门数 × 100%

要对比双方(主队 vs 客队)的差异,可以从以下几个层面来做。


先看数据来源

通常数据库里会有这类表:

-- 比赛统计表 match_stats
match_id | team_id | side | shots | shots_on_target | goals

或者原始事件表:

-- 事件表 match_events
id | match_id | team_id | event_type | minute
  • 如果只有汇总数据 → 直接算转化率
  • 如果有事件流 → 更有价值(可算射正转化、定位球转化等)

SQL 层:一次性算出双方转化率

SELECT
    match_id,
    team_id,
    side,
    shots,
    shots_on_target,
    goals,
    ROUND(goals / NULLIF(shots, 0) * 100, 2) AS conversion_rate,
    ROUND(shots_on_target / NULLIF(shots, 0) * 100, 2) AS shot_accuracy
FROM match_stats
WHERE match_id = ?
ORDER BY side;

关键点:

  • NULLIF(shots, 0) 防止除零 → 返回 NULL 而不是报错
  • 只算 shots > 0 的比赛,避免无射门场次污染均值

PHP 层:计算并呈现差异

<?php
$stmt = $pdo->prepare("SELECT side, shots, goals FROM match_stats WHERE match_id = ?");
$stmt->execute([$matchId]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stats = [];
foreach ($rows as $r) {
    $stats[$r['side']] = [
        'shots' => (int)$r['shots'],
        'goals' => (int)$r['goals'],
        'rate'  => $r['shots'] > 0 
                    ? round($r['goals'] / $r['shots'] * 100, 2) 
                    : null,
    ];
}
$home = $stats['home'] ?? null;
$away = $stats['away'] ?? null;
if ($home && $away && $home['rate'] !== null && $away['rate'] !== null) {
    $diff = $home['rate'] - $away['rate'];
    echo "主队转化率: {$home['rate']}%<br>";
    echo "客队转化率: {$away['rate']}%<br>";
    echo "差异: " . ($diff >= 0 ? '+' : '') . "{$diff} 个百分点";
}

看“差异”的几种正确姿势

光看一场比赛的两个百分比意义不大,建议分三层:

单场差异

直接对比,如 主队 20% vs 客队 8%,差距 12 个百分点。

赛季平均差异(更稳)

SELECT
    m.home_team_id,
    m.away_team_id,
    AVG(h.goals / NULLIF(h.shots,0)) * 100 AS home_avg,
    AVG(a.goals / NULLIF(a.shots,0)) * 100 AS away_avg
FROM matches m
JOIN match_stats h ON h.match_id = m.id AND h.side = 'home'
JOIN match_stats a ON a.match_id = m.id AND a.side = 'away'
WHERE m.league_id = ?
GROUP BY m.home_team_id, m.away_team_id;

显著性 / 样本量检查

  • 射门数 < 5 时,转化率波动极大(1 球就能让百分比跳 20%)
  • 建议展示时附上 shots 数,或加一个「样本不足」提示
function conversionLabel(?float $rate, int $shots): string {
    if ($shots < 5) return '样本不足';
    if ($rate === null) return '—';
    return number_format($rate, 1) . '%';
}

推荐的展示维度(前端可视化)

指标 主队 客队 差异
射门数
射正数
进球
射门转化率 Δ
射正转化率 Δ
  • 用条形图对比双率
  • 差异用颜色区分(绿/红 or 正/负箭头)
  • 括注样本量:25% (5/20)

常见坑

  1. 除零:一定要 NULLIF 或 PHP 里判断
  2. 点球算不算射门:需统一口径(很多数据源点球不计入 shots)
  3. 乌龙球:通常不计入球员射门、也不计入球队转化
  4. 加时赛:看要不要排除 90 分钟后事件
  5. 小数精度:比较时用 round() 后再比,避免 1+0.2 类问题

如果你能贴一下你的表结构现有查询代码,我可以直接帮你写出针对该项目的转化率对比逻辑(包括赛季级、单场级、以及显著性提示)。

抱歉,评论功能暂时关闭!