首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

超级碗历史数据集分析(1967~2020 年)

有没有想过自己对某个好玩的历史数据集进行分析呢?比如,历届春晚的历史数据集,看看谁上春晚次数多,谁人气最高等等,可是分析的思路又该是什么样的呢?InfoQ 带来了 Sadrach Pierr 博士的文章,虽然不是对春晚的历史数据集分析,但思路是类似的,话不多说,让我们看看他是怎么对超级碗历史数据集进行分析的,相信对你一定有所裨益!

超级碗(Superbowl)是美国一年一度的比赛,决定着美国国家橄榄球联盟(National Football League,NFL)的冠军。这是世界上收视率最高的年度体育赛事之一,在美国,拥有大量的国内观众,平均每年有超过 1 亿人收看超级碗。

在本文中,我们将分析超级碗历史数据集(1967-2020 年)。我们将生成汇总统计和数据可视化信息,如获胜球队、大球场、获胜得分和最有价值球员。我们将要使用的数据可以在这里找到。

言归正题。

首先,让我们用 pandas 导入数据:

代码语言:javascript
复制
import pandas as pd
df = pd.read_csv("superbowl.csv")

接下来,我们可以打印列的列表:

代码语言:javascript
复制
print(df.columns)

如你所见,有 10 列。让我们打印前五行。

代码语言:javascript
复制
print(df.head())

我们可以看到有几个分类列。让我们定义一个函数,该函数接受数据框、列名和限制作为输入。调用时,它将打印分类值字典及其出现的频率:

代码语言:javascript
复制
def return_counter(data_frame, column_name, limit):
   from collections import Counter    print(dict(Counter(data_frame[column_name].values).most_common(limit)))

让我们将函数应用到最有价值球员(Most Valuable Player,MVP)列,并将结果限制在以下五个最常见的值:

代码语言:javascript
复制
return_counter(df, 'MVP', 5)

我们将会看到,Tom Brady 拥有最多的 MVP 记录,其次是 Joe Montana。

让我们将函数应用到“Stadium”(大球场)一栏:

代码语言:javascript
复制
return_counter(df, 'Stadium', 5)

Louisiana Superdome、Rose Bowl、Orange 在数据集中出现了 5 次。

让我们试试看“Winner”(获胜者)列,它对应于获胜球队。

代码语言:javascript
复制
return_counter(df, 'Winner', 5)

New England Partriots 和 Pittsburg Steelers 以六场胜利并列。

我鼓励你将此函数应用于其余的分类列,如“State”(州)、“City”(城市)和“Loser”(失败者)等。

正如你所见到的,这是一个非常有用的快速测试,可以查看数据中是否存在任何明显的不平衡,这通常是在构建模型时需要处理的一个关键问题。

接下来,从数字列生成汇总统计数据将会很有用,如“Winner Pts”,这是获胜球队的得分。让我们定义一个函数,该函数接受一个数据框、一个分类列和一个数字列。每个类别的数字列的平均值和标准差存储在一个数据框中,数据框按照平均值降序排序。如果要快速查看特定数字列的某些类别的平均值和 / 或标准差值是否更高还是更低,这将非常有用。

代码语言:javascript
复制
def return_statistics(data_frame, categorical_column, numerical_column):
    mean = []
    std = []
    field = []
    for i in set(list(data_frame[categorical_column].values)):
        new_data = data_frame[data_frame[categorical_column] == i]
        field.append(i)
        mean.append(new_data[numerical_column].mean())
        std.append(new_data[numerical_column].std())
    df = pd.DataFrame({'{}'.format(categorical_column): field, 'mean {}'.format(numerical_column): mean, 'std in {}'.format(numerical_column): std})
    df.sort_values('mean {}'.format(numerical_column), inplace = True, ascending = False)
    df.dropna(inplace = True)
    return df

我们可以查看“Winner”和“Winner Pts”的汇总统计数据:

代码语言:javascript
复制
stats = return_statistics(df, 'Winner', 'Winner Pts')
print(stats.head(15))

旧金山 49 人队的“Winner Pts”平均得分和“Winner Pts”的标准准差都是最高的。

接下来,我们将使用箱型图根据最小值、最大值、中值、第一个四分位数和第三个四分位数的数值分布进行可视化。如果你对它们不熟悉,可以看看这篇文章《理解箱型图》(Understanding Boxplots

与汇总统计函数类似,该函数接受一个数据框、分类列和数字列,并根据限制显示最常见列表的箱型图:

代码语言:javascript
复制
def get_boxplot_of_categories(data_frame, categorical_column, numerical_column, limit):
    import seaborn as sns
    from collections import Counter
    keys = []
    for i in dict(Counter(df[categorical_column].values).most_common(limit)):
        keys.append(i)
    print(keys)
    df_new = df[df[categorical_column].isin(keys)]
    sns.set()
    sns.boxplot(x = df_new[categorical_column], y =      df_new[numerical_column])

让我们为 5 个最常见的获胜球队中的“Winner Pts”生成箱型图:

代码语言:javascript
复制
get_boxplot_of_categories(df, 'Winner', 'Winner Pts', 5)

我们还可以定义一个函数,来显示得分的时间序列图。首先,让我们将“Date”转换为“date-time”对象。

代码语言:javascript
复制
df['Date'] = pd.to_datetime(df['Date'])

接下来,让我们定义一个函数,该函数以数字框和数字列作为输入,并显示“Winner Pts”的时间序列图:

代码语言:javascript
复制
def get_time_series(data_frame, numerical_column):
    import matplotlib.pyplot as plt
    df_new = data_frame
    plt.scatter(df_new['Date'], df_new[numerical_column])
    plt.xlabel('Date')
    plt.ylabel(numerical_column)

让我们用数据框和“Winner Pts”来调用这个函数:

代码语言:javascript
复制
get_time_series(df, 'Winner Pts')

最后,让我们定义一个函数,该函数将数据框和数字列作为输入,并显示一个直方图:

代码语言:javascript
复制
def get_histogram(data_frame, numerical_column):
    df_new = data_frame
    df_new[numerical_column].hist(bins=100)

让我们用数据框调用函数,并生成得分的直方图:

代码语言:javascript
复制
get_histogram(df, 'Winner Pts')

我就讲到这里,但你可以随意使用数据并自己编写代码。

概括地说,我在本文中,研究了分析超级碗历史数据集的几种方法。这包括定义用于生成汇总统计数据的函数,如平均值、标准差和分类值计数等。我们还定义了用箱型图、直方图和时间序列图对数据进行可视化的函数。这篇文章的代码可以在 GitHub 上找到。

作者介绍:

Sadrach Pierre 博士,热情的数据科学家,对自然语言处理、机器学习、数学、物理和化学感兴趣。

原文链接:

https://towardsdatascience.com/analyzing-the-superbowl-history-dataset-1967-2020-fdee01a760c9

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/WXgEBEBRjLEf4vPouyVQ
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券