目录
加载数据
查看数据
数据详细
缺值处理
异常值处理
重复值处理
运动员身高和体重分布
左脚右脚使用数量
俱乐部球员评分分析
足球运动员数是否与出生日期相关
身高与体重是否具有相关性
加载数据
#加载足球运动员数据
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=['少年队','青年队','成年队','老将队'])