奥运会数据分析,奥林匹克数据分析并绘图,python数据分析绘图,期末大作业项目
目录
设置Python环境
查看输入目录中的文件
加载并查看数据集
计算不重复活动次数
根据活动特定的身高-体重平均值填充缺失值
处理年龄列中的缺失值
删除奖牌列中的缺失值
数据可视化
年龄的箱形图
城市频率的条形图
奖牌频率的条形图
季节频率的条形图
性别身高体重的散点图
编辑
不同奖牌获得者的身高体重分布
按季节划分的年龄分布箱形图
按性别划分的体重分布(按季节)
部分运行截图:





以下为部分代码示例以及运行截图:
完整代码以及数据集在以下链接:
<>
设置Python环境
# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
含义与作用 :
- 注释解释 :这里的注释介绍了当前环境是基于Kaggle提供的Python Docker镜像构建的,这个镜像预装了多个对数据分析非常有帮助的库。
- 导入库 :我们首先导入了
numpy(用于数值计算,特别是线性代数运算)和pandas(用于数据处理和CSV文件的读写)。这两个库是数据分析任务中最常用的工具之一。
查看输入目录中的文件
# Input data files are available in the read-only "../input/" directory
# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory
import os
for dirname, _, filenames in os.walk('/kaggle/input'):
for filename in filenames:
print(os.path.join(dirname, filename))
含义与作用 :
- 注释解释 :这段注释告诉用户,所有输入的数据文件都存放在只读目录
../input/中,并且通过运行下面的代码可以列出该目录下的所有文件。 - 遍历目录并打印文件路径 :使用
os.walk()函数遍历指定的输入目录,对于每一个找到的文件,它将完整路径打印出来。这一步骤对于了解可用的数据集非常重要,同时也方便后续直接引用文件路径进行数据加载。
加载并查看数据集
df = pd.read_csv('input/120-years-of-olympic-history-athletes-and-results/athlete_events.csv')
df.head()
含义与作用 :
- 加载CSV文件到DataFrame :使用
pandas的read_csv()函数从指定路径加载CSV文件到一个名为df的DataFrame对象中。这个CSV文件包含了120年的奥林匹克历史运动员和比赛结果数据,是分析奥运会相关问题的重要资源。 - 显示前几行数据 :调用
df.head()方法来显示DataFrame的前五行内容,这样可以快速浏览数据结构和样本记录,验证数据是否正确加载并且初步了解数据格式。
计算不重复活动次数
essiz_etkinlik = pd.unique(df.Event)
print("不重复活动次数: {}".format(len(essiz_etkinlik)))
essiz_etkinlik[:10]
含义与作用 : 这段代码用于计算并打印数据集中不同(不重复)活动的数量,并显示前10个活动名称。这有助于了解数据集包含多少种不同的体育项目。
根据活动特定的身高-体重平均值填充缺失值
df_gecici = df.copy()
boy_kilo_liste = ["Height", "Weight"]
for e in essiz_etkinlik:
etkinlik_filtre = df_gecici.Event == e
df_filtreli = df_gecici[etkinlik_filtre]
# 根据活动分别计算身高和体重的平均值
for s in boy_kilo_liste:
ortalama = np.round(np.mean(df_filtreli[s]),2)
if ~np.isnan(ortalama):
df_filtreli[s] = df_filtreli[s].fillna(ortalama)
else:
tum_veri_ortalamasi = np.round(np.mean(df[s]),2)
df_filtreli[s] = df_filtreli[s].fillna(tum_veri_ortalamasi)
df_gecici[etkinlik_filtre] = df_filtreli
df = df_gecici.copy()
df.info()
含义与作用 : 这段代码遍历每个唯一的活动,并为每个活动中身高和体重列的缺失值填充该活动对应的平均值。如果某个活动没有有效的平均值,则使用整个数据集的平均值来填充。最后,它更新原始数据框df,并调用info()方法检查数据框的信息,以确保填充过程成功完成。
处理年龄列中的缺失值
df['Age'].fillna(df['Age'].mean(), inplace=True)
含义与作用 : 这段代码用于处理年龄列中的缺失值,通过用所有记录的平均年龄来填充这些缺失值。这样可以确保年龄列中不再有缺失值,从而便于后续分析。
删除奖牌列中的缺失值
df = df.dropna(subset=['Medal'])
df.head(10)
含义与作用 : 这里我们删除了奖牌列中有缺失值的所有行,只保留那些有明确奖牌信息的记录。这样做可以专注于获奖运动员的数据,提高分析的准确性。
数据可视化
接下来,我们将绘制一些数值变量的直方图,以便更好地理解数据分布情况。
def plotHistogram(variable):
plt.figure()
plt.hist(df[variable], bins = 85, color = "orange")
plt.xlabel(variable)
plt.ylabel("Frequency")
plt.title("Data Frequency - {}".format(variable))
numeric_variables = ["Age", "Height", "Weight", "Year"]
for i in numeric_variables:
plotHistogram(i)
含义与作用 : 这段代码定义了一个名为plotHistogram的函数,用于绘制指定变量的直方图。它设置了图表的颜色、标签和标题,使图表更易于阅读。然后,对于每个数值变量(如年龄、身高、体重和年份),调用此函数生成相应的直方图,帮助我们直观地了解这些变量的数据分布。




年龄的箱形图
plt.figure()
plt.boxplot(df.Age)
plt.title("Box plot - Age")
plt.xlabel("Age")
plt.ylabel("value")
plt.show()
含义与作用 : 这段代码创建了一个关于年龄的箱形图。箱形图是一种用于显示一组数据分散情况的数据可视化工具,它展示了最小值、第一四分位数(Q1)、中位数(Q2)、第三四分位数(Q3)和最大值,以及可能存在的异常值。通过这个图表,我们可以快速了解年龄数据的分布特征。

城市频率的条形图
import pandas as pd
import matplotlib.pyplot as plt
sehir_frekans = df['City'].value_counts()
sehir_frekans.plot(kind='bar', color='skyblue')
plt.title('Bar Plot - City')
plt.xlabel('City')
plt.ylabel('frequency')
plt.show()
含义与作用 : 这段代码生成了一个条形图,展示了各个城市举办奥运会的频率。value_counts()函数统计了每个城市的出现次数,并用条形图的形式展示出来。这有助于我们了解哪些城市是奥运会的主要举办地。

奖牌频率的条形图
frekans = df['Medal'].value_counts()
frekans.plot(kind='bar', color='orange')
plt.title('Bar Plot - Medal')
plt.xlabel('Medal')
plt.ylabel('frequency')
plt.show()
含义与作用 : 这段代码绘制了不同奖牌类型的频率条形图。通过统计每种奖牌的数量,我们可以直观地看到金牌、银牌和铜牌的获奖情况。这对于分析不同奖牌的分布非常有用。

季节频率的条形图
frekans = df['Season'].value_counts()
frekans.plot(kind='bar', color='red')
plt.title('Bar Plot - Season')
plt.xlabel('Season')
plt.ylabel('frequency')
plt.show()
含义与作用 : 这段代码展示了夏季和冬季奥运会的频率。通过统计每个季节的记录数量,我们可以了解到哪一季举办的奥运会更多。这对于理解奥运会的时间分布非常重要。

性别身高体重的散点图
plt.figure()
plt.scatter(kadin.Height, kadin.Weight, alpha=0.4, label="woman")
plt.scatter(erkek.Height, erkek.Weight, alpha=0.4, label="man")
plt.xlabel("Height")
plt.ylabel("Weight")
plt.title("The Relationship Between Height and Weight")
plt.legend()
plt.show()
含义与作用 : 这段代码绘制了男性和女性运动员的身高与体重之间的关系图。通过使用散点图,我们可以观察到两组数据的分布情况及潜在的相关性。这有助于分析性别差异对身体特征的影响。
不同奖牌获得者的身高体重分布
plt.figure(figsize=(10, 6))
for medal in df['Medal'].unique():
subset = df[df['Medal'] == medal]
plt.scatter(subset['Height'], subset['Weight'], label=medal)
plt.title('Height and Weight Distribution by Medal')
plt.xlabel('Height')
plt.ylabel('Weight')
plt.legend(title='Medal')
plt.grid(True)
plt.show()
含义与作用 : 这段代码展示了不同奖牌获得者的身高与体重分布。通过为每种奖牌类型绘制一个散点图,我们可以比较获奖者之间的身体特征差异。这对于探索不同奖牌获得者之间的共同点和区别非常有帮助。

按季节划分的年龄分布箱形图
plt.figure(figsize=(10, 6))
seasons = df['Season'].unique()
colors = plt.cm.tab10.colors[:len(seasons)]
for i, season in enumerate(seasons):
subset = df[df['Season'] == season]
plt.boxplot(subset['Age'], positions=[i], widths=0.6, patch_artist=True, boxprops=dict(facecolor=colors[i]))
plt.xticks(range(len(seasons)), seasons)
plt.title('Age Distribution by Season')
plt.xlabel('Season')
plt.ylabel('Age')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
含义与作用 : 这段代码展示了按季节划分的年龄分布箱形图。通过为每个季节绘制一个箱形图,我们可以对比夏季和冬季奥运会参赛选手的年龄结构。这有助于了解不同季节的比赛是否吸引了不同年龄段的运动员。

按性别划分的体重分布(按季节)
seasons = df['Season'].unique()
# 获取 Sex 列的所有唯一值
genders = df['Sex'].unique()
# 创建一个颜色映射
colors = plt.cm.Set2.colors[:len(genders)]
plt.figure(figsize=(10, 6))
for i, season in enumerate(seasons):
for j, gender in enumerate(genders):
subset = df[(df['Season'] == season) & (df['Sex'] == gender)]
plt.boxplot(subset['Weight'], positions=[i + j * 0.2], widths=0.15, patch_artist=True, boxprops=dict(facecolor=colors[j]))
plt.xticks([i + 0.1 for i in range(len(seasons))], seasons)
plt.title('Weight Distribution by Season with Gender Hue')
plt.xlabel('Season')
plt.ylabel('Weight')
plt.legend(genders, title='Gender', loc='upper right')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
含义与作用 : 这段代码创建了一个箱形图,展示了不同季节中男性和女性运动员的体重分布。通过为每个季节和性别组合绘制一个箱形图,我们可以直观地比较夏季和冬季奥运会参赛选手的体重特征,并观察性别差异对体重的影响。这有助于了解季节性和性别对运动员体格的影响。

以上为部分代码示例以及运行截图:
完整代码以及数据集在以下链接:
<>

