大家好,我是云朵君!
众所周知,我们生活在一个信息时代,数据在其中发挥着关键作用。可以毫不夸张地说,如果你拥有数据,你就拥有一切。
但是获得数据后会发生什么?这取决于你得到什么样的数据。你可能手头上有某种数据,必须对其进行分析才能获得有价值的信息。如果你在某个广告公司工作,那么你也必须在那里进行数据分析。通过分析他们的数据,你可以为公司提供一些有价值的信息和策略。
用Python进行数据分析,几乎是如今我们数据分析师必备的技能之一。我们平时学习了不少有关Python的基础知识,但使用Python进行数据分析实战比较少。今天云朵君就和大家一起学习结合使用 Pandas、NumPy、Seaborn 和 Matplotlib 库等对印度超级联赛数据 (IPL, 2008-2020) 进行可视化数据分析!看看我们能从这些数据中得到哪些有趣的信息。
印度超级联赛 (IPL) 是世界上最大的板球联赛。我们用 2008 年到 2020 年的 IPL 比赛数据(来源Kaggle,文末有免费获取方法)进行数据分析。如果你对IPL不是很了解,不用担心,重点掌握数据分析方法,你完全可以换个数据集,使用这些方法分析一遍。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
本次数据分析所有代码均是在 Jupyter Notebook 中运行,在其中使用下面代码加载数据。
match=pd.read_csv('./Dataset/matches.csv')
delivery=pd.read_csv('./Dataset/deliveries.csv')
简单查看下正在处理的数据:
match.head(5)
delivery.head(5)
从数据结果可以看出, 2008 年的第一场比赛是 KKR
vs RCB
。M Chinnaswamy体育场的比赛是 KKR
获胜了,而本场比赛的最佳球员是BB McCullum。
如果你想查看数据表最后五行数据,可通过match.tail(5)
查看。
有关 2008 年至 2020 年间比赛数据的更多信息。可以使用info()函数查看
match.info() #816
delivery.info() #193468
all_teams = match['team1'].tolist() + match['team2'].tolist()
all_teams = list(set(all_teams))
all_teams
由此我们获得了 2008 年至 2020 年期间参加过比赛的球队名单。如果你是职业 IPL 等铁杆粉丝,那么你应该会在名单上会发现一些细节内容,如该名单中包含一些后来没有参加比赛的旧球队名称,尽管如此,也不要忽略他们在 IPL 历史上还是贡献的不少有价值的信息。
sns.countplot('venue', data=match)
plt.xticks(rotation='vertical')
结果所示的是IPL(2008-2020)每个场地的比赛数量。如你所见,伊甸园是 IPL 球迷最喜欢的场地,在那里举办了近 80 场比赛。
x = match['team1'].value_counts()
y = match['team2'].value_counts()
(x+y).plot(kind='barh')
IPL(2008-2020)各队的比赛
我们计算第一列中每支球队的价值,并将第二支球队的每支球队的数量相加,以获得所需的输出。例如,如果 CSK 在第一队参加了 90 次,在第二队参加了 85 次,那么图表中会显示总共 175 场比赛。你可以看到 Mumbai Indians 在 IPL 中的比赛次数最多。
x=pd.DataFrame({"Winner":match['winner']}).value_counts()
print(x)
Winner
Mumbai Indians 120
Chennai Super Kings 106
Kolkata Knight Riders 99
Royal Challengers Bangalore 91
Kings XI Punjab 88
Rajasthan Royals 81
Delhi Daredevils 67
Sunrisers Hyderabad 66
Deccan Chargers 29
Delhi Capitals 19
Gujarat Lions 13
Pune Warriors 12
Rising Pune Supergiant 10
Kochi Tuskers Kerala 6
Rising Pune Supergiants 5
dtype: int64
从以上结果可以看到 Mumbai Indians 赢得最多的比赛,其次是 CSK 和其他球队。如果你想以图形形式绘制此结果,可以通过sns.countplot()
函数绘制,如下图所示。
sns.countplot('winner', data=match)
plt.xticks(rotation='vertical')
IPL(2008-2020) 每支球队赢得的比赛次数
如果你是球队的管理人员并且这些球员受到重创(这是比赛中常有的事情),那么你必须密切关注这些球员,因为这些球员是获得了最多的比赛最佳球员。
那么如何找到这些最有价值的球员呢?,我们可以尝试如下方式。
temp_data=match['player_of_match'].value_counts().head()
print(temp_data)
sns.barplot(x=temp_data.index,y=temp_data.values,data=match)plt.title("Top 5 MoM")
plt.xticks(rotation=90)
plt.xlabel("Match Count")
plt.ylabel("Player")
plt.show()
AB de Villiers 23
CH Gayle 22
RG Sharma 18
DA Warner 17
MS Dhoni 17
Name: player_of_match, dtype: int64
IPL(2008-2020)最佳击球手
结果中你有喜欢的球员出现在上面的名单中吗?
想想我们如何得到这部分数据?我们必须找出跑垒次数最多的球员。因而必须从击球手的得分数据及其跑垒次数来总结。其实这个逻辑挺简单的。
top_batsman=delivery.groupby('batsman')['batsman_runs'
].agg('sum').reset_index().sort_values('batsman_runs',
ascending=False).head(10)
top_batsman.set_index('batsman', inplace=True)
top_batsman.plot(kind='bar')
IPL(2008-2020)顶级击球手
我们从数据中选出了排名前十的击球手,并对他们的跑垒次数进行了总结。并将此信息绘制成图。
从结果中可以看出,科利国王(V Kohli)位居榜首,其次是苏雷什·雷纳 (SK Raina) 和其他击球手。
对在 IPL 比赛中投球的前 10 名投球手分组,并总结了最终出口的投球。
delivery.groupby('bowler')['total_runs'].agg('sum'
).reset_index().sort_values('total_runs',
ascending=False).head(10)
假设你在和CSK比赛,你必须找出在前几年和这支球队的比赛中哪个投球手的表现很好。要找出投球手的团队表现分析,可以通过如下方法:
mask=delivery['bowler']=='PP Chawla'
delivery[mask].groupby('batting_team')['total_runs'].agg('sum').plot(kind='bar')
PP Chawla 对 IPL 球队的保龄球表现
以 PP Chawla 为例,这位投球手在 2020 年之前的 IPL 历史中贡献了最多的跑分。最终计算了 PP Chawla 给对手球队的总跑分。
很明显,如果你的团队中有 PP Chawla,那么不要让他与 MI、CSK、RCB、RR 和 DC 比赛。
Delivery6=delivery[mask]
delivery6=delivery6[['batting_team','over','batsman_runs']]
x=delivery6.pivot_table(values='batsman_runs',
index='batting_team',
columns='over',
aggfunc='count')
sns.heatmap(x, cmap='summer')
这里使用数据透视表,然后计算击球队击球手的跑动情况,并将数据转换为热图,如下所示:
IPL(2008-2020)每支球队的过智击球表现
从结果可以看出,如果你与MI或CSK比赛,那么你必须从一开始就使用最佳阵容。MI的击球手在第二局和第三局都保持静默,但之后他们进入狂暴模式对抗对手。并且CSK和RCB也是如此。
从数据结果看,这些数据不仅对投球队有帮助,对击球队也有帮助。如果你是一个团队经理,你看到你的团队在deadline时表现不佳,那么你可能应该在下一次下注中专注于购买一个优秀队员。正如上面的热图所示,除了CSK 和 MI,大多数球队在比赛末尾时期都落后了。
我想这就是MI和CSK是IPL中最热的两个球队的原因了。
temp_df = delivery.groupby('batsman')['batsman_runs'].agg(lambda x:(x==6).sum()).reset_index().sort_values(by='batsman_runs', ascending=False).head(10).reset_index(drop=True)
temp_df
sns.barplot(x=temp_df['batsman'],y=temp_df['batsman_runs'],data=temp_df)
plt.title("Most sixes")
plt.xticks(rotation=90)
plt.xlabel("Batsman")
plt.ylabel("Number of 6's")
plt.show()
IPL(2008-2020)中六分球数最多的前10名球员
temp_df = delivery.groupby('bowler')['is_wicket'].agg('sum').reset_index().sort_values(by='is_wicket', ascending=False).reset_index(drop=True).head(10)
sns.barplot(x=temp_df['bowler'],y=temp_df['is_wicket'],data=temp_df)
plt.title("Most wickets by a bowler")
plt.xticks(rotation=90)
plt.xlabel("Bowler")
plt.ylabel("Number of wickets")
plt.show()
END
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有