数据分析案例-足球运动员分析

目录

加载数据

查看数据

数据详细

 ​缺值处理

 异常值处理

重复值处理

运动员身高和体重分布

 左脚右脚使用数量

 俱乐部球员评分分析

 足球运动员数是否与出生日期相关

 身高与体重是否具有相关性


加载数据

#加载足球运动员数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#支持中文
#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['KaiTi'] #
指定默认字体
plt.rcParams['axes.unicode_minus'] = False #
解决保存图像是负号'-'显示为方块的问题
player = pd.read_csv('FullData.csv')

查看数据

#head() 显示前几行
player.head()

#tail()后几行
player.tail(6)
#sample 随机采样
player.sample()
#设置显示的列
pd.set_option('display.max_columns',10)
player.head()

数据详细

 缺值处理

查看数据的数据类型

player.info()

 

从上述示例可以看到总共17588行,但National_Position(国家队 位置) 是1075行,Club_Position (俱乐部位置)17587行。我们 知道有的足球运动员是没有进入国家队的,所以National_Position 缺值是正常情况。但Club_Position缺值需要处理。

 删除Club_Position的缺失值

#查看缺失值
player['Club_Position'].isnull().any()
#获取缺失值数据
player[player['Club_Position'].isnull()]
#获取非缺失值数据
player =
player[player['Club_Position'].notnull()]
player.info()

 异常值处理

describe方法得到数据的描述性统计信息,比如max min, mean,std进行异常值分析

数据的描述性统计信息

player.describe()

 使用箱线图辅助查看异常值

player.plot(kind='box')
#获取评分 和盯人能力
player[['Rating','Marking']].plot(kind='box')
player['Rating'].describe()

重复值处理

查看是否有重复数据

player.duplicated().any()
# 重复值
# 没有重复值
# 如果有重复值,查看重复的数据是什么,根据
duplicated得到布尔数据,将布尔数组传递给players,
得到重复值数据
# 设置keep参数,【first last False】
players[players.duplicated()]
# 如果想查看数据集中所有重复数据
players[players.duplicated(keep=False)]
# 假设存在重复值,删除重复值,可以通过keep设置删除的
方式,【first last False】
players.drop_duplicates(inplace=True)

运动员身高和体重分布

从查看数据结果可以看到运动员身高Height、体重Weight的数据后 都添加了相应的单位。要分析运动员身高和体重的分布,首先需要 将身高Height和Weight数据的单位去掉。

# 使用矢量化字符串方式处理
player['Height'] = player['Height'].str.replace('cm','')
player['Weight'] = player['Weight'].str.replace('kg','')
players.head()
players.info()
# 替换后,身高和体重仍然是Object类型,不是数值型,需要进一步的类型转换
players['Height'] = players['Height'].astype(np.int)
players['Weight'] = players['Weight'].astype(np.int)
players.info()
# 使用map和apply
def handle(m:str) ->int:
    return int(m.replace('cm',''))
players['Height'] =players['Height'].map(lambda item:int(item.replace('cm','')))
players['Weight'] =players['Weight'].map(lambda item:int(item.replace('kg','')))
players.head()
players.info()

 

身高、体重、评分分布 

players['Height'].describe()
# 使用直方图查看分布
plt.hist(players['Height'])
players['Height'].plot(kind='hist',bins=15)
players['Weight'].plot(kind='hist',bins=15)
players['Rating'].plot(kind='hist',bins=15)
# 使用核密度图查看数据分布
players['Height'].plot(kind='kde')
players['Weight'].plot(kind='kde')
players['Rating'].plot(kind='kde')

 左脚右脚使用数量

查看足球运动员左脚右脚使用情况

player['Preffered_Foot'].head(10)

 可以看到,足球运动员踢球有使用左脚也有使用右脚。要统计使用 左脚和右脚的数量,需要按Preffered_Foot进行分组,计算其 count()值。我们可以使用饼状图来显示左脚右脚选手数量的差别。

使用饼状图来显示左脚右脚选手数量的差别

g = player.groupby('Preffered_Foot')
s = g['Preffered_Foot'].count()
s.plot(kind='pie',autopct='%.2f')

 使用条形图来显示左脚右脚选手数量的差别

# 上面的操作,其实就是针对Preffered_Foot分组,再统计每组的数量
player['Preffered_Foot'].value_counts().plot(kind='barh')

 俱乐部球员评分分析

从球员平均分角度分析,拥有top10评分能力俱乐部。

俱乐部球员的平均评分

group = player.groupby('Club')
group['Rating'].mean()

对俱乐部平均评分进行排序取前10

top10=group['Rating'].mean().sort_values(ascending=False).head(10)
#绘制条形图
top10.plot(kind='barh')

 对俱乐部人数大于30人的俱乐部,平均评分进行排序取前 10

#俱乐部人数大于20
group['Rating'].agg(['mean','count']).sort_values('mean',ascending=False).head(10).plot(kind='bar')
#俱乐部人数大于30
result =group['Rating'].agg(['mean','count']).sort_values('mean',ascending=False)
result[result['count']>30].head(10).plot(kind='bar')

国家球员的平均分前10,且国家人数大于20

group=player.groupby('Nationality')
result =group['Rating'].agg(['mean','count']).sort_values('mean',ascending=False)
result[result['count']>20].head(10).plot(kind='bar')

 足球运动员数是否与出生日期相关

获取足球运动员日期

#获取出生日期
player['Birth_Date']
#切分
t =player['Birth_Date'].str.split('/',expand=True)
# 对月份进行分析:根据月份来分组,统计每一个月对应球员数量,最后柱状图表示
t[0].value_counts(ascending=False).plot(kind='bar')
t[1].value_counts(ascending=False).plot(kind='bar')
t[2].value_counts(ascending=False).plot(kind='bar')

 身高与体重是否具有相关性

# 通过散点图查看变量之间关系:身高与体重
players.plot(kind='scatter',x='Height',y='Weight')
# # 身高和评分之间的关系
players.plot(kind='scatter',x='Height',y='Rating')
#使用相关系数描述身高和体重之间的关系
players['Height'].corr(players['Weight'])
players['Height'].corr(players['Rating'])

 与评分相关性强的指标有哪些?

#相关系数矩阵
players.corr()
#相关系数矩阵类型
type(players.corr())
players.corr()
['Rating'].sort_values(ascending=False)

 年龄与评分是否相关

# 散点图
players.plot(kind='scatter',x='Age',y='Rating')
# # 相关系数
players['Age'].corr(players['Rating'])
# cut将数据切分为离散区间表示,bins表示切分成几个区间
# 默认情况下,区间对应数值范围,通过labels设置区间标签内容
pd.cut(players['Age'],bins=4,labels=['少年队','青年队','成年队','老将队'])
# 根据年龄段来分组,统计每组年龄均值,用折线图描述年龄段和评分之间关系
players['Age2'] =pd.cut(players['Age'],bins=4,labels=['少年队','青年队','成年队','老队'])
players.groupby('Age2')
['Rating'].mean().plot('line',marker='o')
# bins设置区间个数,区间等分
# 还可以自定义区间范围
pd.cut(players['Age'],bins=[10,16,22,33,45],labels=['少年队','青年队','成年队','老将队'])

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾派森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值