有没有想过自己对某个好玩的历史数据集进行分析呢?比如,历届春晚的历史数据集,看看谁上春晚次数多,谁人气最高等等,可是分析的思路又该是什么样的呢?InfoQ 带来了 Sadrach Pierr 博士的文章,虽然不是对春晚的历史数据集分析,但思路是类似的,话不多说,让我们看看他是怎么对超级碗历史数据集进行分析的,相信对你一定有所裨益!
超级碗(Superbowl)是美国一年一度的比赛,决定着美国国家橄榄球联盟(National Football League,NFL)的冠军。这是世界上收视率最高的年度体育赛事之一,在美国,拥有大量的国内观众,平均每年有超过 1 亿人收看超级碗。
在本文中,我们将分析超级碗历史数据集(1967-2020 年)。我们将生成汇总统计和数据可视化信息,如获胜球队、大球场、获胜得分和最有价值球员。我们将要使用的数据可以在这里找到。
言归正题。
首先,让我们用 pandas 导入数据:
import pandas as pd
df = pd.read_csv("superbowl.csv")
复制代码
接下来,我们可以打印列的列表:
如你所见,有 10 列。让我们打印前五行。
我们可以看到有几个分类列。让我们定义一个函数,该函数接受数据框、列名和限制作为输入。调用时,它将打印分类值字典及其出现的频率:
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)列,并将结果限制在以下五个最常见的值:
return_counter(df, 'MVP', 5)
复制代码
我们将会看到,Tom Brady 拥有最多的 MVP 记录,其次是 Joe Montana。
让我们将函数应用到“Stadium”(大球场)一栏:
return_counter(df, 'Stadium', 5)
复制代码
Louisiana Superdome、Rose Bowl、Orange 在数据集中出现了 5 次。
让我们试试看“Winner”(获胜者)列,它对应于获胜球队。
return_counter(df, 'Winner', 5)
复制代码
New England Partriots 和 Pittsburg Steelers 以六场胜利并列。
我鼓励你将此函数应用于其余的分类列,如“State”(州)、“City”(城市)和“Loser”(失败者)等。
正如你所见到的,这是一个非常有用的快速测试,可以查看数据中是否存在任何明显的不平衡,这通常是在构建模型时需要处理的一个关键问题。
接下来,从数字列生成汇总统计数据将会很有用,如“Winner Pts”,这是获胜球队的得分。让我们定义一个函数,该函数接受一个数据框、一个分类列和一个数字列。每个类别的数字列的平均值和标准差存储在一个数据框中,数据框按照平均值降序排序。如果要快速查看特定数字列的某些类别的平均值和 / 或标准差值是否更高还是更低,这将非常有用。
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”的汇总统计数据:
stats = return_statistics(df, 'Winner', 'Winner Pts')
print(stats.head(15))
复制代码
旧金山 49 人队的“Winner Pts”平均得分和“Winner Pts”的标准准差都是最高的。
接下来,我们将使用箱型图根据最小值、最大值、中值、第一个四分位数和第三个四分位数的数值分布进行可视化。如果你对它们不熟悉,可以看看这篇文章《理解箱型图》(Understanding Boxplots)
与汇总统计函数类似,该函数接受一个数据框、分类列和数字列,并根据限制显示最常见列表的箱型图:
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”生成箱型图:
get_boxplot_of_categories(df, 'Winner', 'Winner Pts', 5)
复制代码
我们还可以定义一个函数,来显示得分的时间序列图。首先,让我们将“Date”转换为“date-time”对象。
df['Date'] = pd.to_datetime(df['Date'])
复制代码
接下来,让我们定义一个函数,该函数以数字框和数字列作为输入,并显示“Winner Pts”的时间序列图:
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”来调用这个函数:
get_time_series(df, 'Winner Pts')
复制代码
最后,让我们定义一个函数,该函数将数据框和数字列作为输入,并显示一个直方图:
def get_histogram(data_frame, numerical_column):
df_new = data_frame
df_new[numerical_column].hist(bins=100)
复制代码
让我们用数据框调用函数,并生成得分的直方图:
get_histogram(df, 'Winner Pts')
复制代码
我就讲到这里,但你可以随意使用数据并自己编写代码。
概括地说,我在本文中,研究了分析超级碗历史数据集的几种方法。这包括定义用于生成汇总统计数据的函数,如平均值、标准差和分类值计数等。我们还定义了用箱型图、直方图和时间序列图对数据进行可视化的函数。这篇文章的代码可以在 GitHub 上找到。
作者介绍:
Sadrach Pierre 博士,热情的数据科学家,对自然语言处理、机器学习、数学、物理和化学感兴趣。
原文链接:
https://towardsdatascience.com/analyzing-the-superbowl-history-dataset-1967-2020-fdee01a760c9
评论