关于运动员伤病预测数据集的探索

🌟欢迎来到 我的博客 —— 探索技术的无限可能!


🌟博客的简介(文章目录)

在这里插入图片描述

背景说明

在竞技体育中,运动员的健康和安全是至关重要的。运动损伤不仅可能会对运动员的职业生涯造成严重影响,还可能影响到团队的整体表现。因此,预防和减少运动员的伤病风险成为了许多体育组织和教练团队的首要任务。通过深入了解运动员的身体状况、训练情况以及过往的伤病历史,我们可以更好地预测未来的伤病情况,从而采取相应的措施来保障运动员的健康。

image.png

数据说明

字段说明
Player_Age球员年龄(单位:年)
Player_Weight运动员的体重(单位:kg)
Player_Height球员身高(单位:cm)
Previous_Injuries之前是否受过伤(是:1,否:0)
Training_Intensity训练强度(区间:[0,1])
Recovery_Time从伤病中恢复所需的天数(区间:1-6天)
Likelihood_of_Injury受伤(1)或不受伤(0)的可能性

数据集来源

https://www.kaggle.com/datasets/mrsimple07/injury-prediction-dataset

分析过程

本次分析过程具体内容如下,对学生运动员的受伤风险进行了全面而深入的研究。(包括运动员受伤风险的影响因素分析、伤病恢复时间与其他因素的关联分析、特征相关性分析、特征重要性分析、建模与预测

以下是本次分析的主要技术栈和亮点:

  1. 数据处理:使用Python编程语言和Pandas库进行数据加载、清洗和初步探索。确保数据的准确性和完整性,为后续分析奠定基础。
  2. 统计分析:通过描述性统计和相关性分析,对数据集进行了全面的统计摘要,包括均值、标准差、最小值、最大值等,并计算了特征间的相关系数,来了解它们之间的关系。
  3. 数据可视化:利用Matplotlib和Seaborn库,创建了一系列的图表,包括箱线图、条形图和热图,通过直观地展示不同特征与受伤可能性之间的关系,使得分析结果更加直观易懂。
  4. 机器学习模型:使用了随机森林分类器来评估特征的重要性,并通过模型的特征重要性得分来识别对预测受伤可能性最有影响力的因素。
  5. 总结与建议:基于分析结果,为降低受伤风险提供了具体的建议,包括监控训练强度、注意体重和身高比例、考虑年龄因素、预防先前受伤的再次发生以及适当增加恢复时间。

在这里插入图片描述

在这里插入图片描述

可以看到数据已加载成功。从加载的数据中,我们可以看到以下几点:

  • Player_Age:运动员的年龄。
  • Player_Weight:运动员的体重。
  • Player_Height:运动员的身高。
  • Previous_Injuries:运动员是否有过先前的伤病,其中1表示有,0表示没有。
  • Training_Intensity:训练强度,其值在0到1之间。
  • Recovery_Time:从伤病中恢复所需的天数。
  • Likelihood_of_Injury:受伤的可能性,其中1表示受伤,0表示未受伤。

在这里插入图片描述

在这里插入图片描述

根据结果,我们可以观察以下几点内容:
数据集中没有缺失值,每个特征都有1000个数据点。

  • Player_Age(运动员年龄)的平均值为28.23岁,年龄范围在18岁到39岁之间。
  • Player_Weight(运动员体重)的平均值为74.79公斤,体重范围在40.19公斤到104.65公斤之间。
  • Player_Height(运动员身高)的平均值为179.75厘米,身高范围在145.29厘米到207.31厘米之间。
  • Previous_Injuries(先前受伤)的平均值为0.515,表示大约51.5%的运动员有过先前的伤病。
  • Training_Intensity(训练强度)的平均值为0.491,表示运动员的平均训练强度接近中等水平。
  • Recovery_Time(恢复时间)的平均值为3.466天,恢复时间范围在1天到6天之间。
  • Likelihood_of_Injury(受伤可能性)的平均值为0.5,表示大约50%的运动员有受伤的可能性。

1、探索这些特征与受伤可能性之间的关系

具体可看附录部分

在这里插入图片描述

从可视化中,我们可以得到的信息是:

  • 年龄与受伤可能性:似乎年龄与受伤可能性之间没有明显的趋势。各个年龄段中受伤和未受伤的运动员分布相似。
  • 体重与受伤可能性:在体重方面,我们也观察不到明显的趋势。各个体重范围内受伤和未受伤的运动员分布相似。
  • 身高与受伤可能性:身高方面也没有明显的趋势。各个身高范围内受伤和未受伤的运动员分布相似。
  • 先前受伤与受伤可能性:有先前受伤历史的运动员的受伤可能性略高于没有先前受伤历史的运动员。
  • 训练强度与受伤可能性:训练强度与受伤可能性之间似乎没有明显的趋势。不同训练强度下受伤和未受伤的运动员分布相似。
  • 恢复时间与受伤可能性:恢复时间方面也没有明显的趋势。各个恢复时间内受伤和未受伤的运动员分布相似。

2、检查这些因素之间是否存在多重共线性

具体可看附录部分
在这里插入图片描述

我们可以通过以下方式解读热图的相关系数:

  1. 颜色:热图中的颜色表示相关系数的大小。红色表示正相关,蓝色表示负相关,颜色越深表示相关系数的绝对值越大,即相关性越强。白色表示没有或很弱的相关性。

  2. 数值:每个格子中的数值是两个特征之间的相关系数。相关系数的范围从-1到1。接近1或-1的值表示强的正相关或负相关,接近0的值表示没有或很弱的相关性。

  3. 对角线:对角线上的值为1,因为每个特征与自身的相关性是完美的。

从热图中我们可以得到的信息是:

  • Player_Age(年龄)与Player_Height(身高)之间存在较强的正相关关系,相关系数约为0.67。这可能是由于随着年龄的增长,身高通常也会增长。
  • Training_Intensity(训练强度)与Likelihood_of_Injury(受伤可能性)之间存在微弱的正相关关系,相关系数约为0.09。这意味着随着训练强度的增加,受伤的可能性也有所增加,但这种关系不是很强。
  • 其他特征之间的相关性相对较弱。
    虽然我们观察到一些特征之间存在一定程度的线性关系,但没有特征之间的相关系数接近1或-1,这意味着数据中不存在明显的多重共线性问题。不过,这只是一个初步的检查,更深入的分析可能需要使用其他统计方法。

3、特征相关性分析

对于特征相关性分析,我们通常会关注两个关键方面:

  • 特征与目标变量的相关性:这有助于我们了解哪些特征对目标变量(在这个案例中是Likelihood_of_Injury)有较大的影响。
  • 特征之间的相关性:这有助于我们了解特征之间是否存在多重共线性问题。

在前面我们已经通过热图可视化了特征之间的相关性。现在,我们可以进一步分析每个特征与目标变量Likelihood_of_Injury的相关性。

我们可以使用皮尔逊相关系数来量化这种关系,并通过条形图来可视化。

具体可看附录部分
在这里插入图片描述

从上面的条形图中,我们可以得到的信息是:

  1. Previous_Injuries:这个特征与Likelihood_of_Injury(受伤可能性)之间的相关系数约为0.13,表示它们之间存在中等程度的正相关关系。这意味着有先前受伤历史的运动员受伤的可能性略高。
  2. Training_Intensity:这个特征与Likelihood_of_Injury之间的相关系数约为0.09,表示它们之间存在微弱的正相关关系。这意味着随着训练强度的增加,受伤的可能性也有所增加,但这种关系不是很强。
  3. 其他特征(Player_AgePlayer_WeightPlayer_HeightRecovery_Time)与Likelihood_of_Injury之间的相关系数较小,接近于0,表示它们与受伤可能性之间几乎没有线性关系。

综上所述,从相关系数的角度来看,Previous_InjuriesTraining_Intensity这两个特征与Likelihood_of_Injury有一定的相关性,而其他特征与Likelihood_of_Injury之间的相关性较弱。不过,相关系数只能告诉我们特征之间是否存在线性关系,并不能完全说明它们之间是否存在其他类型的关系。因此,在建立预测模型时,我们可能还需要考虑其他类型的分析或模型。

4、特征重要性分析

要分析特征的重要性,我们可以使用机器学习模型。一种常见的方法是使用决策树或随机森林模型,这些模型可以提供特征重要性的度量。在这里,我使用随机森林分类器来预测Likelihood_of_Injury,并基于模型的特征重要性得分来评估每个特征的重要性。

具体可看附录部分

在这里插入图片描述

从上面的条形图中,我们可以得到关于特征重要性的信息:

  1. Player_Weight:这个特征的重要性得分最高,这意味着在预测运动员受伤可能性时,体重可能是最重要的因素之一。
  2. Player_Height:这个特征的重要性得分也很高,排在第二位。这表明身高也可能是预测受伤可能性时的一个重要因素。
  3. Player_Age:年龄特征的重要性得分相对较高,排在第三位。这意味着年龄也可能是预测受伤可能性时的一个重要因素。
  4. Training_IntensityPrevious_Injuries:这两个特征的重要性得分相对较低。尽管我们在之前的分析中观察到Previous_InjuriesLikelihood_of_Injury之间存在一定的相关性,但在随机森林模型中,它的重要性不如其他特征。
  5. Recovery_Time:这个特征的重要性得分最低,意味着在预测受伤可能性时,它可能是最不重要的因素。

需要注意的是,特征重要性得分是基于随机森林模型的,它反映了特征在模型中的预测能力。不同的模型可能会给出不同的特征重要性得分。 此外,特征重要性得分也不能完全代表特征在实际问题中的重要性。因此,在做出任何结论之前,我们可能还需要进行更深入的分析或考虑其他类型的模型。

5、展示更多的特征组合

具体可看附录部分
在这里插入图片描述

从上面的配对图中,我们可以得到关于特征之间关系的信息:

  1. Player_Age vs Player_Height:这两个特征之间存在较强的正相关关系,这与我们之前的观察一致。随着年龄的增长,身高通常也会增长。
  2. Player_Weight vs Player_Height:这两个特征之间也存在较强的正相关关系。通常情况下,身高较高的个体体重也较重。
  3. Training_Intensity vs Likelihood_of_Injury:从散点图中我们可以看到,随着训练强度的增加,受伤的可能性也有所增加,但这种关系不是很强。
  4. Previous_Injuries vs Likelihood_of_Injury:有先前受伤历史的运动员的受伤可能性略高于没有先前受伤历史的运动员。
  5. Recovery_Time vs Likelihood_of_Injury:从散点图中我们看不出明显的趋势,表明恢复时间与受伤可能性之间没有明显的直接关系。

这些观察结果与我们之前的分析结果相符。配对图提供了一个更全面的视角来观察特征之间的关系,帮助我们更好地理解数据。

需要注意的是,配对图只能展示特征之间的两两关系,并不能提供关于它们之间更复杂交互作用的详细信息。 在实际应用中,我们可能还需要考虑特征之间的交互作用,或者使用更复杂的模型来捕获这些关系。

总结

为了帮助调整训练计划以降低受伤风险,我们可以基于现有的数据集来提供一些建议。以下是一些可能有助于降低受伤风险的建议:

  1. 监控训练强度:分析显示:训练强度与受伤可能性之间存在微弱的正相关关系。
    建议运动员和教练团队密切监控训练强度,避免过度训练。可以考虑使用心率监测器和其他可穿戴设备来跟踪训练强度,并据此调整训练计划。
  2. 注意体重和身高:分析显示:体重和身高是预测受伤可能性的重要因素。运动员应该确保他们的体重和身高比例适当,避免过重或过高的体重增加受伤风险。
  3. 考虑年龄因素:分析显示:随着年龄的增长,运动员的身体恢复能力和适应性可能会下降。
    建议年长的运动员可能需要更加注意训练强度和恢复时间,以降低受伤风险。
  4. 预防先前受伤的再次发生:分析显示:有先前受伤历史的运动员受伤的可能性略高。
    建议运动员在训练前进行适当的热身和拉伸,以预防先前受伤的再次发生。
  5. 适当增加恢复时间:分析显示:恢复时间与受伤可能性之间没有明显的直接关系,但适当的恢复对于避免过度训练和减少受伤风险仍然非常重要。
    但还是建议运动员确保在训练之间有足够的恢复时间。

附录

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
injury_data = pd.read_csv('injury_data.csv')
injury_data.head()
missing_values = injury_data.isnull().sum()
statistical_summary = injury_data.describe()
missing_values
statistical_summary


1、探索这些特征与受伤可能性之间的关系
具体可看正文部分

#为seaborn打造风格
sns.set_style("whitegrid")

#创建子地块
fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(15, 15))

#年龄与受伤可能性
sns.boxplot(x="Likelihood_of_Injury", y="Player_Age", data=injury_data, ax=axes[0, 0])
axes[0, 0].set_title("Age vs Likelihood of Injury")

#重量与受伤可能性
sns.boxplot(x="Likelihood_of_Injury", y="Player_Weight", data=injury_data, ax=axes[0, 1])
axes[0, 1].set_title("Weight vs Likelihood of Injury")

#身高与受伤可能性
sns.boxplot(x="Likelihood_of_Injury", y="Player_Height", data=injury_data, ax=axes[1, 0])
axes[1, 0].set_title("Height vs Likelihood of Injury")

#既往受伤与受伤可能性
sns.barplot(x="Previous_Injuries", y="Likelihood_of_Injury", data=injury_data, ax=axes[1, 1])
axes[1, 1].set_title("Previous Injuries vs Likelihood of Injury")

#训练强度与受伤可能性
sns.boxplot(x="Likelihood_of_Injury", y="Training_Intensity", data=injury_data, ax=axes[2, 0])
axes[2, 0].set_title("Training Intensity vs Likelihood of Injury")

#恢复时间与受伤可能性
sns.boxplot(x="Likelihood_of_Injury", y="Recovery_Time", data=injury_data, ax=axes[2, 1])
axes[2, 1].set_title("Recovery Time vs Likelihood of Injury")

plt.tight_layout()
plt.show()


2、创建一个成对图以可视化要素之间的关系
具体可看正文部分

# 计算相关性矩阵
correlation_matrix = injury_data.corr()

# 创建热力图可视化相关性矩阵
plt.figure(figsize=(15, 12))  # 调整图形大小
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
plt.title("Correlation Heatmap of Features")
plt.show()


3、特征相关性分析
具体可看正文部分

correlation_with_target = injury_data.corr()["Likelihood_of_Injury"].drop("Likelihood_of_Injury")

plt.figure(figsize=(10, 6))
correlation_with_target.sort_values().plot(kind='bar')

plt.title("Correlation of Features with Likelihood of Injury")
plt.xlabel("Features")
plt.ylabel("Correlation Coefficient")
plt.xticks(rotation=45)
plt.grid(axis='y')
plt.show()


4、特征重要性分析
具体可看正文部分

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
#将数据拆分为训练集和测试集
X = injury_data.drop("Likelihood_of_Injury", axis=1)
y = injury_data["Likelihood_of_Injury"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
#初始化随机林分类器
rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)
#训练分类器
rf_classifier.fit(X_train, y_train)
#获取功能重要性
feature_importances = rf_classifier.feature_importances_

#创建条形图以可视化功能重要性
plt.figure(figsize=(10, 6))
sorted_idx = feature_importances.argsort()
plt.barh(range(len(sorted_idx)), feature_importances[sorted_idx], align='center')
plt.yticks(range(len(sorted_idx)), [X.columns[i] for i in sorted_idx])
plt.xlabel("Feature Importance")
plt.title("Feature Importances from Random Forest")
plt.grid(axis='x')
plt.show()

5、展示更多的特征组合
具体可看正文部分

sns.pairplot(injury_data, hue="Likelihood_of_Injury", diag_kind="kde")
plt.suptitle("Pairplot of Features with Likelihood of Injury", y=1.02)
plt.show()
  • 16
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZShiJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值