传球成功率与胜率的相关性分析(PHP 实现)
足球数据分析中的经典结论
在足球数据分析领域,传球成功率(Pass Accuracy)与胜率的相关性是"弱正相关",大约在 r = 0.2 ~ 0.4 之间,具体取决于联赛和球队风格。

关键认知:
- ✅ 传球成功率高 ≠ 一定赢球(巴萨式控球不一定赢)
- ✅ 传球成功率是过程指标,胜率是结果指标
- ✅ 强队往往传球成功率高,但单纯堆传球成功率(回传、横传)与胜率无强相关
- ⚠️ 真正与胜率强相关的传球指标是:进攻三区传球成功率、关键传球数、向前传球率
PHP 实现相关性分析
数据表结构(MySQL)
CREATE TABLE team_match_stats (
id INT PRIMARY KEY AUTO_INCREMENT,
team_name VARCHAR(50),
match_date DATE,
passes_total INT, -- 总传球数
passes_completed INT, -- 成功传球数
pass_accuracy DECIMAL(5,2),-- 传球成功率 %
goals_for INT,
goals_against INT,
result ENUM('win','draw','loss')
);
CREATE TABLE team_season_summary (
team_name VARCHAR(50) PRIMARY KEY,
matches INT,
wins INT,
win_rate DECIMAL(5,2), -- 胜率 %
avg_pass_accuracy DECIMAL(5,2)
);
PHP 计算皮尔逊相关系数
<?php
/**
* 计算皮尔逊相关系数 r
* r ∈ [-1, 1],|r| 越大相关性越强
*/
function pearsonCorrelation(array $x, array $y): array
{
$n = count($x);
if ($n !== count($y) || $n < 2) {
throw new InvalidArgumentException('数组长度不一致或样本过少');
}
$sumX = array_sum($x);
$sumY = array_sum($y);
$sumXY = 0;
$sumX2 = 0;
$sumY2 = 0;
for ($i = 0; $i < $n; $i++) {
$sumXY += $x[$i] * $y[$i];
$sumX2 += $x[$i] * $x[$i];
$sumY2 += $y[$i] * $y[$i];
}
$numerator = $n * $sumXY - $sumX * $sumY;
$denominator = sqrt(
($n * $sumX2 - $sumX ** 2) * ($n * $sumY2 - $sumY ** 2)
);
if ($denominator == 0) {
return ['r' => 0, 'strength' => '无相关'];
}
$r = $numerator / $denominator;
return [
'r' => round($r, 4),
'strength' => interpretCorrelation($r)
];
}
function interpretCorrelation(float $r): string
{
$abs = abs($r);
if ($abs < 0.2) return '极弱/无相关';
if ($abs < 0.4) return '弱相关';
if ($abs < 0.6) return '中等相关';
if ($abs < 0.8) return '强相关';
return '极强相关';
}
从数据库读取并分析
<?php
$pdo = new PDO('mysql:host=localhost;dbname=football;charset=utf8mb4', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->query("
SELECT avg_pass_accuracy, win_rate
FROM team_season_summary
WHERE matches >= 10
");
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$passAccuracy = array_column($rows, 'avg_pass_accuracy');
$winRate = array_column($rows, 'win_rate');
$result = pearsonCorrelation($passAccuracy, $winRate);
echo "样本数: " . count($rows) . PHP_EOL;
echo "相关系数 r = {$result['r']}" . PHP_EOL;
echo "相关强度: {$result['strength']}" . PHP_EOL;
典型输出示例:
样本数: 20
相关系数 r = 0.3621
相关强度: 弱相关
进阶:分区域传球成功率分析
function analyzeByZone(PDO $pdo): array
{
// 攻击三区传球成功率 vs 胜率,r 会更高
$sql = "
SELECT
AVG(final_third_pass_acc) AS acc,
AVG(win_rate) AS wr
FROM team_advanced_stats
GROUP BY team_name
";
$rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
return pearsonCorrelation(
array_column($rows, 'acc'),
array_column($rows, 'wr')
);
}
实测经验数据参考
| 指标 | 与胜率相关系数 r |
|---|---|
| 总传球成功率 | 2 ~ 0.4(弱) |
| 进攻三区传球成功率 | 4 ~ 0.6(中) |
| 向前传球比率 | 4 ~ 0.5 |
| 关键传球 / 90分钟 | 5 ~ 0.7(强) |
| 射正次数 | 6 ~ 0.8(强) |
| 预期进球 xG | 7 ~ 0.9(极强) |
PHP 工程化建议
- 不要单看传球成功率:应组合多个指标做多元回归
- 用类封装分析逻辑:
class FootballCorrelationAnalyzer
{
public function __construct(private PDO $pdo) {}
public function analyze(string $metricField): array
{
$rows = $this->pdo->query(
"SELECT {$metricField} AS m, win_rate AS w
FROM team_season_summary WHERE matches >= 10"
)->fetchAll(PDO::FETCH_ASSOC);
return pearsonCorrelation(
array_column($rows, 'm'),
array_column($rows, 'w')
);
}
}
- 大样本用 SQL 聚合(
STDDEV_POP、AVG)先预处理,避免 PHP 内存压力 - 可结合 ML:PHP 调用 Python(
shell_exec或gRPC)跑随机森林,明显优于皮尔逊
传球成功率与胜率呈弱正相关(r ≈ 0.2~0.4),不能作为单独预测胜率的指标。 若要提升预测力,应聚焦:进攻三区传球成功率 + 关键传球 + xG。
如果需要我给出完整可运行的 PHP 项目 demo(含 MySQL 建表 + 模拟数据生成 + 分析页),告诉我,我可以直接输出。