Advertisement

奥运会数据分析,奥林匹克数据分析并绘图,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 :使用pandasread_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()
    
    
    
    

含义与作用 : 这段代码创建了一个箱形图,展示了不同季节中男性和女性运动员的体重分布。通过为每个季节和性别组合绘制一个箱形图,我们可以直观地比较夏季和冬季奥运会参赛选手的体重特征,并观察性别差异对体重的影响。这有助于了解季节性和性别对运动员体格的影响。

以上为部分代码示例以及运行截图:

完整代码以及数据集在以下链接:

<>

全部评论 (0)

还没有任何评论哟~