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

转化率 = 进球数 / 射门数 × 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)
常见坑
- 除零:一定要
NULLIF或 PHP 里判断 - 点球算不算射门:需统一口径(很多数据源点球不计入 shots)
- 乌龙球:通常不计入球员射门、也不计入球队转化
- 加时赛:看要不要排除 90 分钟后事件
- 小数精度:比较时用
round()后再比,避免1+0.2类问题
如果你能贴一下你的表结构或现有查询代码,我可以直接帮你写出针对该项目的转化率对比逻辑(包括赛季级、单场级、以及显著性提示)。