精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻

💖🔥作者主页:计算机毕设木哥🔥 💖

一、项目介绍

世界杯球员单场表现数据字段多、行数大。位置、进攻、防守、体能和赛程信息散在宽表里,靠手工筛选很难对照期望进球与实际产出,也很难看出球员群体结构。本文通过开发一个基于大数据的国际足联世界杯球员表现数据分析与可视化系统,用以帮助解决世界杯球员表现数据难汇总、难对照、难分群阅读的问题。
本系统采用 Hadoop 与 Spark 做数据上传、预处理和分维统计,用 Python 与 scikit-learn 完成 K-Means、Isolation Forest 和 PCA。后端 Django 把分析结果接口化,前端 Vue 配合 ECharts 呈现分析页与可视化大屏。功能覆盖球员画像、进攻效能、防守贡献、赛事进程、体能负荷和表现分群,并带球员比赛数据维护与登录后的大屏浏览。
经过系统测试,本系统能满足体育数据分析人员、教练组观察人员和计算机专业学生在世界杯球员表现对照、分群查看与可视化展示方面的需求。约五万余条单场记录被整理成可筛选的分析页和大屏后,阅读门槛会低一些。这套做法对教学演示和业务阅读都有实际帮助。

二、开发环境

  • 大数据技术:Hadoop、Spark、Hive
  • 开发技术:Python、Django框架、Vue、Echarts
  • 软件工具:Pycharm、DataGrip、Anaconda
  • 可视化 工具 Echarts

三、视频展示

基于大数据的国际足联世界杯球员表现数据分析与可视化

四、项目展示

登录模块:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、代码展示

# Hadoop_Spark/performance_cluster_analysis.py
FEATURE_COLS = [
    'offensive_contribution', 'defensive_contribution', 'possession_impact',
    'creativity_score', 'pressure_resistance', 'consistency_score',
    'clutch_performance_score', 'performance_score', 'stamina_score',
]
df = df_all.filter(col('minutes_played') > 0)

def _build_player_feature_pdf(input_df):
    sdf = _ensure_float(input_df, FEATURE_COLS + ['player_rating', 'minutes_played'])
    agg_exprs = [spark_avg(c).alias(c) for c in FEATURE_COLS]
    agg_exprs += [
        spark_avg('player_rating').alias('player_rating'),
        spark_count(lit(1)).alias('appearance_count'),
    ]
    player_df = sdf.groupBy('player_id', 'player_name', 'position', 'team').agg(*agg_exprs)
    w = Window.partitionBy('player_id').orderBy(spark_desc('appearance_count'))
    player_df = (
        player_df.withColumn('_rn', row_number().over(w))
        .filter(col('_rn') == 1).drop('_rn')
    )
    pdf = player_df.toPandas()
    for c in FEATURE_COLS + ['player_rating']:
        pdf[c] = pd.to_numeric(pdf[c], errors='coerce')
    return pdf.dropna(subset=FEATURE_COLS)

def _label_clusters_by_centers(centers, feature_names):
    off = centers[:, feature_names.index('offensive_contribution')]
    deff = centers[:, feature_names.index('defensive_contribution')]
    perf = centers[:, feature_names.index('performance_score')]
    cre = centers[:, feature_names.index('creativity_score')]
    off_med, def_med, perf_med, cre_med = np.median(off), np.median(deff), np.median(perf), np.median(cre)
    labels = {}
    for i in range(len(centers)):
        parts = [
            '攻强' if off[i] >= off_med else '攻弱',
            '守强' if deff[i] >= def_med else '守弱',
            '高创造' if cre[i] >= cre_med else '低创造',
            '高综合' if perf[i] >= perf_med else '中低综合',
        ]
        summary = f"进攻{off[i]:.1f}/防守{deff[i]:.1f}/综合{perf[i]:.1f}/创造{cre[i]:.1f}"
        labels[i] = f"{''.join(parts[:2])}型({parts[2]}·{parts[3]};{summary})"
    return labels

def performance_kmeans_analysis(input_df):
    from sklearn.cluster import KMeans
    from sklearn.preprocessing import StandardScaler
    from sklearn.metrics import silhouette_score
    pdf = _build_player_feature_pdf(input_df)
    scaler = StandardScaler()
    Xs = scaler.fit_transform(pdf[FEATURE_COLS].values.astype(float))
    best_k, best_score, best_model = 3, -1.0, None
    for k in range(3, 7):
        km = KMeans(n_clusters=k, random_state=42, n_init=10)
        score = silhouette_score(Xs, km.fit_predict(Xs))
        if score > best_score:
            best_k, best_score, best_model = k, score, km
    cluster_labels = best_model.predict(Xs)
    centers = scaler.inverse_transform(best_model.cluster_centers_)
    label_map = _label_clusters_by_centers(centers, FEATURE_COLS)
    out = pdf[['player_id', 'player_name', 'position', 'team', 'appearance_count']].copy()
    out['cluster_id'] = cluster_labels.astype(int)
    out['cluster_label'] = out['cluster_id'].map(label_map)
    out['performance_score'] = pdf['performance_score'].round(2)
    out['offensive_contribution'] = pdf['offensive_contribution'].round(2)
    out['defensive_contribution'] = pdf['defensive_contribution'].round(2)
    return _write_pdf(out, 'performance_kmeans_analysis')

def anomaly_isolation_forest_analysis(input_df):
    from sklearn.ensemble import IsolationForest
    from sklearn.preprocessing import StandardScaler
    pdf = _build_player_feature_pdf(input_df)
    feat_cols = FEATURE_COLS + ['player_rating']
    Xs = StandardScaler().fit_transform(pdf[feat_cols].values.astype(float))
    clf = IsolationForest(n_estimators=200, contamination=0.05, random_state=42, n_jobs=-1)
    pred = clf.fit_predict(Xs)          # -1 异常, 1 正常
    scores = clf.decision_function(Xs)  # 越低越异常
    out = pdf[['player_id', 'player_name', 'position', 'team', 'appearance_count']].copy()
    out['anomaly_score'] = np.round(scores.astype(float), 2)
    out['is_anomaly'] = (pred == -1).astype(int)
    out['anomaly_flag'] = out['is_anomaly'].map({1: '异常', 0: '正常'})
    out['player_rating'] = pdf['player_rating'].round(2)
    out['performance_score'] = pdf['performance_score'].round(2)
    return _write_pdf(out.sort_values('anomaly_score'), 'anomaly_isolation_forest_analysis')

def performance_pca_analysis(input_df):
    from sklearn.decomposition import PCA
    from sklearn.preprocessing import StandardScaler
    pdf = _build_player_feature_pdf(input_df)
    Xs = StandardScaler().fit_transform(pdf[FEATURE_COLS].values.astype(float))
    pca = PCA(n_components=min(3, len(FEATURE_COLS)), random_state=42)
    scores = pca.fit_transform(Xs)
    rows = []
    cum = 0.0
    for i, var in enumerate(pca.explained_variance_ratio_):
        cum += float(var)
        rows.append({'component': f'主成分{i+1}', 'feature': '全部特征',
                     'metric_type': '方差贡献率', 'metric_value': round(float(var)*100, 2)})
        rows.append({'component': f'主成分{i+1}', 'feature': '全部特征',
                     'metric_type': '累计方差贡献率', 'metric_value': round(cum*100, 2)})
        for j, fname in enumerate(FEATURE_COLS):
            rows.append({'component': f'主成分{i+1}', 'feature': FEATURE_ZH.get(fname, fname),
                         'metric_type': '特征权重', 'metric_value': round(float(pca.components_[i, j]), 2)})
    for idx, row in pdf.reset_index(drop=True).iterrows():
        rows.append({'component': '主成分得分散点', 'feature': str(row['player_name']),
                     'metric_type': '主成分1得分', 'metric_value': round(float(scores[idx, 0]), 2)})
        rows.append({'component': '主成分得分散点', 'feature': str(row['player_name']),
                     'metric_type': '主成分2得分', 'metric_value': round(float(scores[idx, 1]), 2)})
    return _write_pdf(pd.DataFrame(rows), 'performance_pca_analysis')

六、项目文档展示

在这里插入图片描述

七、总结

本课题以国际足联世界杯球员单场表现数据为对象,面向攻防体能和赛程信息分散、难对照、难分群的问题,开发了数据分析与可视化系统。数据经 Hadoop 上传、预处理中文化并派生出场标记后,用 Spark 完成球员画像、进攻效能、防守贡献、赛事进程、体能负荷五维统计,表现分群维在按球员聚合的基础上做 K-Means 聚类、Isolation Forest 异常识别和 PCA 降维。Django 提供分析结果接口,Vue 与 ECharts 呈现分维分析页、可视化大屏和球员比赛数据维护。系统把约五万余条记录整理成可筛选图表,便于数据分析人员、教练组观察和教学演示阅读世界杯球员表现。

大家可以帮忙点赞、收藏、关注、评论啦👇🏻👇🏻👇🏻

💖🔥作者主页:计算机毕设木哥🔥 💖

更多推荐