Categories
程式開發

超級碗歷史數據集分析(1967~2020 年)


有沒有想過自己對某個好玩的歷史數據集進行分析呢?比如,歷屆春晚的歷史數據集,看看誰上春晚次數多,誰人氣最高等等,可是分析的思路又該是什麼樣的呢? InfoQ 帶來了Sadrach Pierr 博士的文章,雖然不是對春晚的歷史數據集分析,但思路是類似的,話不多說,讓我們看看他是怎麼對超級碗歷史數據集進行分析的,相信對你一定有所裨益!

超級碗(Superbowl)是美國一年一度的比賽,決定著美國國家橄欖球聯盟(National Football League,NFL)的冠軍。這是世界上收視率最高的年度體育賽事之一,在美國,擁有大量的國內觀眾,平均每年有超過 1 億人收看超級碗。

在本文中,我們將分析超級碗歷史數據集(1967-2020 年)。我們將生成匯總統計和數據可視化信息,如獲胜球隊、大球場、獲勝得分和最有價值球員。我們將要使用的數據可以在這裡找到。

言歸正題。

首先,讓我們用 pandas 導入數據:

import pandas as pd
df = pd.read_csv("superbowl.csv")

接下來,我們可以打印列的列表:

print(df.columns)

超級碗歷史數據集分析(1967~2020 年) 1

如你所見,有 10 列。讓我們打印前五行。

print(df.head())

超級碗歷史數據集分析(1967~2020 年) 2

我們可以看到有幾個分類列。讓我們定義一個函數,該函數接受數據框、列名和限製作為輸入。調用時,它將打印分類值字典及其出現的頻率:

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)

超級碗歷史數據集分析(1967~2020 年) 3

我們將會看到,Tom Brady 擁有最多的 MVP 記錄,其次是 Joe Montana。

超級碗歷史數據集分析(1967~2020 年) 4

讓我們將函數應用到“Stadium”(大球場)一欄:

return_counter(df, 'Stadium', 5)

超級碗歷史數據集分析(1967~2020 年) 5

Louisiana Superdome、Rose Bowl、Orange 在數據集中出現了 5 次。

讓我們試試看“Winner”(獲勝者)列,它對應於獲胜球隊。

return_counter(df, 'Winner', 5)

超級碗歷史數據集分析(1967~2020 年) 6

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))

超級碗歷史數據集分析(1967~2020 年) 7

舊金山 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)

超級碗歷史數據集分析(1967~2020 年) 8

我們還可以定義一個函數,來顯示得分的時間序列圖。首先,讓我們將“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')

超級碗歷史數據集分析(1967~2020 年) 9

最後,讓我們定義一個函數,該函數將數據框和數字列作為輸入,並顯示一個直方圖:

def get_histogram(data_frame, numerical_column):
    df_new = data_frame
    df_new[numerical_column].hist(bins=100)

讓我們用數據框調用函數,並生成得分的直方圖:

get_histogram(df, 'Winner Pts')

超級碗歷史數據集分析(1967~2020 年) 10

我就講到這裡,但你可以隨意使用數據並自己編寫代碼。

概括地說,我在本文中,研究了分析超級碗歷史數據集的幾種方法。這包括定義用於生成匯總統計數據的函數,如平均值、標準差和分類值計數等。我們還定義了用箱型圖、直方圖和時間序列圖對數據進行可視化的函數。這篇文章的代碼可以在 GitHub 上找到。

作者介紹:

Sadrach Pierre 博士,熱情的數據科學家,對自然語言處理、機器學習、數學、物理和化學感興趣。

原文鏈接:

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