足球運動員的數據分析實戰(python)

2022-01-12 數據森麟

columns = ["Name", "Age", "Nationality", "Overall", "Potential", "Club",
           "Value", "Wage", "Preferred Foot","Position", "Jersey Number",
           "Joined","Height", "Weight", "Crossing","Finishing","HeadingAccuracy",
           "ShortPassing", "Volleys","Dribbling", "Curve","FKAccuracy","LongPassing",
           "Jumping","Stamina","Strength","Aggression","Interceptions","Positioning",
           "Vision","Penalties","Marking","StandingTackle", "SlidingTackle","GKDiving",
           "GKHandling","GKKicking","GKPositioning", "GKReflexes", "Release Clause"]
           
pd.read_csv("G:\\2大數據學習\\data.csv",engine="python",encoding="utf-8-sig",usecols=columns)

# 查看數據集共有多少行、多少列
data.shape

# 查看數據集的前5行
data.head()

# 查看數據集的後5行
data.tail()

# 隨機從數據集中抽取5行,顯示
data.sample(5)

# 顯示每列的列名、非空值數量、數據類型,內存佔用等信息。
data.info()

# 此函數可以幫助我們掌握數據的分布情況
data.describe()


3、缺失值處理
1)查看缺失值


data.info()
data.isnull().sum(axis=0)


結果分析:通過上面的展示可以發現,info()方法雖然可以看到哪些欄位具有缺失值,但是並不直觀。通過data.isnull().sum(axis=0)結果顯示,可以很清楚的看到哪些欄位具有缺失值,有多少個缺失值。

2)刪除缺失值


data.dropna(axis=0,inplace=True)
data.isnull().sum(axis=0)



4、異常值處理

① info()方法展示出的信息

結果分析:上圖截取了部分列的結果展示,其中count表示非空記錄數;mean表示該列所有數據的均值;std表示該列所有數據的標準差;min表示該列數據中的最小值;max表示該列數據中的最大值;25%表示該列中有1/4的數據,小於該值;50%表示該列中有1/2的數據,小於該值;75%表示該列中有3/4的數據,小於該值。

② 利用箱線圖,查看異常值

由於數據集列數太多,因此我隨意選取兩列畫出其箱線圖進行展示。


sns.boxplot(data=data[["Age", "Overall"]])


結果分析:此數據集主要是一些打分情況,幾乎沒有什麼特別的異常值,同時有時候一些異常值數據的產生也是合理的,並不是能夠隨意刪除的,因此實際生產中,可以按照上述介紹的方法,結合實際業務進行異常值的處理。

5、重複值處理


data.duplicated().sum()
# data.drop_duplicates(inplace=True)


結果分析:從上面的結果中可以看出,此數據集中沒有重複的數據,duplicated()函數默認是將兩行完全一樣的記錄,稱之為「重複值」,當然此函數還有一些其他參數,供我們選擇,你可以根據需求,隨意指定某兩行數據有多少個欄位相同,可以稱之為「重複值」。當數據集中含有重複值的時候,可以使用這句代碼data.drop_duplicates(inplace=True)原地刪除數據集中的重複值。

6、足球運動員的身高體重分布1)數據轉換

想要統計身高與體重的分布情況,由於數據集中的身高與體重數據並不是我們熟悉的身高與體重的單位,同時也並不是數值類型的數據,因此處理之前需要我們先做數據轉換。

1英尺 = 30.48釐米

1英寸 = 2.54釐米

1磅 = 0.45千克

原始數據展示如下:


def tran_height(height):
  v = height.split("'")
  return int(v[0])*30.48 + int(v[1])*2.54

def tran_weight(weight):
  v = int(weight.replace("lbs", ""))
  return v*0.45



2)繪製核密度圖


fig, ax = plt.subplots(1, 2)
fig.set_size_inches((18, 5))
sns.distplot(data[["Height"]], bins=50, ax=ax[0], color="g") sns.distplot(data["Weight"], bins=50, ax=ax[1])


結果分析:通過上圖展示可以發現,足球運動員的身高和體重的分布近似呈現正態分布,這個也與顯示情況相似,身高和體重處在兩端的人數較少,處在均值附近的人數最多。當數據量足夠大的時候,根據中心極限定理可以知道,數據集的結果幾乎呈現一個正態分布。

7、左撇子適合踢足球嗎?
1)數量上對比


number = data["Preferred Foot"].value_counts()
display(number)

sns.countplot(x="Preferred Foot", data=data)


結果分析:Preferred Foot這個欄位指的是足球運動員的慣用腳,通過上圖展示的左腳和右腳的數量上的對比分析可以發現,左腳人數明顯多於右腳的人數。

2)能力上對比


data.groupby("Preferred Foot")["Overall"].mean()
sns.barplot(x="Preferred Foot", y="Overall", data=data)


結果分析:Overall這個欄位指的是足球運動員的綜合能力評分,這裡我們將子球運動員的慣用腳進行分組後,求出足球運動員的綜合能力評分,可以看出左腳和右腳的綜合能力得分,沒有太大區別。

3)位置上對比

由於在綜合能力上體現不明顯,我們現在通過每個位置,進行更細緻的分析。為了分析的客觀性,我們只統計左腳與右腳都超過50人(含50人)的位置。

① 首先,計算哪些位置左右腳球員都達到了50人。


t = data.groupby(["Preferred Foot", "Position"]).size()
t = t.unstack()
t[t < 50] = np.NaN t.dropna(axis=1, inplace=True)
display(t)


② 然後,我們根據之前計算的那些位置,對數據集進行過濾。


display(t.columns)
t2 = data[data["Position"].isin(t.columns)]
plt.figure(figsize=(18, 10))
sns.barplot(x="Position", y="Overall", hue="Preferred Foot", hue_order=["Left", "Right"], data=t2)


結果分析:從上圖中可以清晰地看出,左腳選手更適合RW(右邊鋒)的位置。而在其他位置上,左右腳的人數差別並沒有顯著性的差異。

8、哪個的俱樂部、國家擁有綜合能力更好的球員(展示top10)。

由於每個俱樂部、國家隊足球年動員的人數不一,為了統計的客觀性,只考慮人數達到一定規模的俱樂部、國家。

1)俱樂部


g = data.groupby("Club")
r = g["Overall"].agg(["mean", "count"])
r = r[r["count"] >= 20]
r = r.sort_values("mean", ascending=False).head(10)
display(r)
r.plot(kind="bar")


2)國家隊


g = data.groupby("Nationality")
r = g["Overall"].agg(["mean", "count"])
r = r[r["count"] >= 50]
r = r.sort_values("mean", ascending=False).head(10)
display(r)
r.plot(kind="bar")



9、哪些俱樂部擁有效力更久的球員(5年及以上)?


t = pd.to_datetime(data["Joined"])
t = t.astype(np.str)
join_year = t.apply(lambda item: int(item.split("-")[0]))
over_five_year = (2018 - join_year) >= 5
t2 = data[over_five_year]
t2 = t2["Club"].value_counts()
display(t2)
t2.iloc[:15].plot(kind="bar")


10、足球運動員是否是出生日期相關?

我們現有的數據集中,不含有具體的出生日期,因此,我們使用另外一個數據集,該數據集包含2018年世界盃所有球員。


data2 = pd.read_csv("G:\\2大數據學習\\wc2018-players.csv",engine="python",encoding="utf-8-sig")
data2.head()
t = data2["Birth Date"].str.split(".", expand=True)
t[0].value_counts().plot(kind="bar")
t[1].value_counts().plot(kind="bar")
t[2].value_counts().plot(kind="bar")


結論如下:對於球員與出生日期這張圖,並看不出一定的規律性,由於樣本量並不夠大,不同日期的球員數量差別10個左右,並不能說明什麼問題。對於球員與出生月份這張圖,可以看出年初出生的運動員比年尾出生的運動員多,由於年初出生的運動員和年尾出生的運動員,都是同一年的,但是年初出生的運動員比年尾出生的運動員,要多學習了那麼幾個月,因此能力稍微更強、更有一些經驗,因此在同齡人選拔的時候,會更有優勢一些(這個是概率問題,並不是說年尾出生的運動員優秀的不多)。對於球員與出生年份這張圖,可以看出本階段球員中1992年出生的球員最多,1999出生的球員最少。

足球運動員與出生日期是有關的,在年初出生的運動員要明顯多於在年末出生的運動員。

11、足球運動員號碼是否與位置相關?


g = data.groupby(["Jersey Number", "Position"])
t = g.size()
#display(t)
t = t[t >= 100]
t.plot(kind="bar")


結論如下:球員的號碼與位置是相關的,例如,1號通常都是守門員,9號通常是中鋒等,這個在圖中有著很好的體現。

12、身價與薪水,違約金是否相關?

因為身價與違約金的單位既有M,也有K,為了便於分析,我們統一使用K作為單位,同時,將類型轉換為數值類型,便於統計。


def to_numeric(item):
  item = item.replace("€", "")
  value = float(item[:-1])
  if item[-1] == "M":
    value *= 1000
  return value

data["Value"] = data["Value"].apply(to_numeric)
data["Wage"] = data["Wage"].apply(to_numeric)
data["Release Clause"] = data["Release Clause"].apply(to_numeric) data.head()

sns.scatterplot(x="Value", y="Wage", data=data)
sns.scatterplot(x="Value", y="Release Clause", data=data)
sns.scatterplot(x="Value", y="Height", data=data)


結論如下:從上圖可以看出,足球運動員的身價與薪水和違約金均存在一定的線性關係,但是身價和違約金的線性關係更強(具體是什麼樣的線性關係,就需要建模了)。因此可以得出足球運動員的身價與其薪水是緊密關聯的,尤其是違約金,與身價的關聯更大。最下面這張圖是隨意畫的球員身價與升高的關係,可以看出球員身價與升高並沒有什麼關係。

13、哪些指標對綜合評分的影響較大?


plt.figure(figsize=(25, 25))
sns.heatmap(data.corr(), annot=True, fmt=".2f", cmap=plt.cm.Greens)
plt.savefig("corr.png", dpi=100, bbox_inches="tight")


這張圖就不展示結果了,由於圖太大。

14、年齡與評分具有怎樣的關係?


sns.scatterplot(x="Age", y="Overall", data=data)
data["Age"].corr(data["Overall"])
# 對一個數組進行切分,可以將連續值變成離散值。
# bins 指定區間數量(桶數)。bins如果為int類型,則進行等分。此處的區間邊界與為前開後閉。
# pd.cut(t["Age"], bins=4)
# 如果需要進行區間的不等分,則可以將bins參數指定為數組類型。數組來指定區間的邊界。
min_, max_ = data["Age"].min() - 0.5, data["Age"].max()
# pd.cut(t["Age"], bins=[min_, 20, 30, 40, max_])
# pd.cut 默認顯示的內容為區間的範圍,如果我們希望自定義內容(每個區間顯示的內容),可以通過labels參數進行指定。
t = pd.cut(data["Age"], bins=[min_, 20, 30, 40, max_], labels=["弱冠之年", "而立之年","不惑之年","知天命"])
t = pd.concat((t, data["Overall"]), axis=1)
g = t.groupby("Age")
display(g["Overall"].mean())
sns.lineplot(y="Overall", marker=" ", ms=30, x="Age", data=t)


結論如下:運動員隨著年齡的增長,球員得到更多的鍛鍊與經驗,總體能力提升,綜合能力評分因此也不斷增長,但三十幾歲之後,由於體力等其它因素的影響,綜合能力評分呈現下降趨勢。

長按二維碼關注我們

數據森麟公眾號的交流群已經建立,許多小夥伴已經加入其中,感謝大家的支持。大家可以在群裡交流關於數據分析&數據挖掘的相關內容,還沒有加入的小夥伴可以掃描下方管理員二維碼,進群前一定要關注公眾號奧,關注後讓管理員幫忙拉進群,期待大家的加入。

管理員二維碼:

相關焦點

  • 基於python的大數據分析-pandas數據讀取(代碼實戰)
    書籍推薦《大話軟體測試》出版啦,內容包括但不限於性能、自動化、接口、安全、移動APP非功能測試、抓包、loadrunner、jmeter、soapui、Appium、python
  • 超適合Python小白的乾貨,Python數據分析50個實戰項目
    2.大話NBA | 用數據帶你回顧喬丹的職業生涯3.分析幾十萬條知乎數據,我挖掘出了這些秘密4.用(大)數據全方位解讀電視劇《大秦帝國之崛起》5.以虎嗅網4W+文章的文本挖掘為例,展現數據分析的一整套流程6.從大數據輿情傳播角度看《三生三世十裡桃花》7.北京二手房房價分析8.kaggle數據分析實踐項目練習
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    ,然後再根據自 己的需求和規劃選擇學習其他方向課程,學完後一定要多實踐 總目錄 零基礎全能篇(4套課程) 實用編程技巧進價(1套課程) 數據分析與挖掘(8套課程) 辦公自動化(3套課程) 機器學習與人工智慧(7套課程) 開發實戰篇(4套課程) 量化投資(2套課程) 網絡爬蟲(
  • 呆瓜半小時入門python數據分析_v2
    我在這裡教授新手如何半小時入門數據分析,為初學者入門節約時間,結構化,系統化了解數據分析工作。歡迎各位報名《呆瓜半小時入門python數據分析》 課程概述教會python小白快速學會python數據分析,數據可視化,覆蓋python基礎,pandas,seaborn,matplotlib,SQL,sqlite,
  • HiC數據分析實戰(一)
    首先需要明白數據分析流程,可以查看第一講:三維基因組學習筆記,提煉流程如下:實戰數據來自於Tung B. K.
  • python數據分析專題 (7):python數據分析模塊
    python是一門優秀的程式語言,而是python成為數據分析軟體的是因為python強大的擴展模塊。
  • python金融風控評分卡模型和數據分析
    (原創課程,版權所有,項目合作QQ:231469242,微信公眾號:pythonEducation) 課程介紹python金融風控評分卡模型和數據分析微專業課包含《python信用評分卡建模(附代碼)》,《python風控建模實戰lendingClub》,《金融現金貸用戶數據分析和畫像》三套課程系列
  • Python高級編程、科學計算等多本數據分析書籍推薦!
    Keras深度學習實戰    029 TensorFlow機器學習項目實戰    030 TensorFlow解析與實戰    031 統計學習基礎:數據挖掘、推理與預測    032 Python數據科學手冊
  • Python入門學習之數據分析實戰獲取數據
    想用一個完整的案例講解Python數據分析的整個流程和基礎知識,實際上以一個數據集為例,數據集是天池上的一個短租數據集,後臺回覆:短租數據集,即可獲得。先來想一下數據分析的流程,第一步獲取數據,因此本節內容就是獲取數據以及對數據的基本操作。
  • Python數據分析可視化教程學習
    來源:博學谷 作者:照照隨著數據分析與數據挖掘行業的日益火爆,Python數據分析可視化教程也成為了許多人提升職業競爭力的必修課。本文將詳細為大家介紹Python數據分析可視化教程的具體內容,全文會圍繞著為什麼學?學什麼?學了有什麼用?
  • 廣安市6名足球運動員入選四川省青少年校園足球最佳陣容
    昨日,從省教育廳獲悉,在2020年四川省青少年校園足球「最佳陣容遴選」活動中,我市鄰水中學初中女子甲組足球運動員龔靜琪、鄧餘;高中女子乙組足球運動員吳佳樂、盧麗雯;高中女子甲組足球運動員楊銀妃、湯曼藝分別入選四川省校園足球三個組別的「最佳陣容」。
  • 小白數據分析——Python職位數據分析全鏈路
    數據採集巧婦難為無米之炊,我們做數據分析大部分情況是用公司的業務數據,因此就不需要關心數據採集的問題。然而我們自己業餘時間做的一些數據探索更多的需要自己採集數據,常用的數據採集技術就是爬蟲。數據清洗有了數據後,先不要著急分析。我們需要對數據先有個大概的了解,並在這個過程中剔除一些異常的記錄,防止它們影響後續的統計結果。
  • Python數據分析經典案例
    本課程選擇經典案例基於真實數據集,從數據預處理開始到建立機器學習模型以及效果評估,完整的講解如何使用python及其常用庫進行數據的分析和模型的建立
  • Python數據分析之路| 入門起航篇
    ,相信很多小夥伴的基本功應該練的差不多了,可以蛟龍出海了,基本功連紮實了,對後面深入學Python非常有好處,Python有兩個非常有趣的方向,一條是數據分析,然後掌握數據分析的基本方法(NumPy,Pandas,mapplotlib),然後再往下就是數據挖掘,機器學習,深度學習,人工智慧,另外一條就是web開發.有同學說爬蟲呢,爬蟲其實是獲取數據的一個手段
  • 從零開始學Python數據分析【25】--嶺回歸及LASSO回歸(實戰部分)
    作者:劉順祥個人微信公眾號:每天進步一點點2015前文傳送門:從零開始學Python數據分析
  • Python數據分析實戰基礎
    這是Python數據分析實戰基礎的第三篇內容
  • 首發‖全網最適合小白學習的python+數據分析資料,免費領取
    話外之意,數據將成核心推動力,引領一個時代。而數據分析人才也因此更加重要。但提到數據分析,網課泛濫,資料成災,學習起來毫無頭緒,甚至知識零星,抓不住重點。除此之外設有門檻,對新手小白滿是惡意。本次便為大家帶來由光環大數據特邀北大碩士李曉華老師,斥重金打造的《python+數據分析》視頻,幫助大家完成從零到一的蛻變。
  • Python數據分析實戰之數據獲取三大招
    一個數據分析師,最怕的一件事情莫過於在沒有數據的情況下,讓你去做一個詳細的數據分析報告。
  • Python數據分析—apply函數
    在對海量數據進行分析的過程中,我們可能要把文本型的數據處理成數值型的數據,方便放到模型中進行使用。
  • 從零開始學Python數據分析【27】--Logistic回歸(實戰部分)
    作者:劉順祥個人微信公眾號:每天進步一點點2015前文傳送門:從零開始學Python數據分析