加载数据
#加载足球运动员数据 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=['少年队','青年队','成年队','老将队'])