案例分析:FIFA2018球员数据分析

案例分析练习:

FIFA2018球员数据分析
# 引入要使用的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

一、首先要明确分析的目标

当获取一份数据集时,应该对数据信息做个总体的了解。
1、加载数据文件

# 加载数据文件
df = pd.read_csv('FIFA_2018_player.csv')

2、简单查看下数据,有哪些列,都是什么类型的值

# 简单查看下数据,有哪些列,都是什么类型的值
df.head()

head方法默认显示头部的5行
默认显示

  • 数据字段信息
* name:球员姓名
* full_name:球员姓名全称
* nationality:国家
* league:联赛
* club:俱乐部
* age:年龄
* birth_date:出生日期
* height_cm:身高
* weight_kg:体重
* eur_value:身价
* eur_wage:工资

3、看下数据整体统计信息,了解下数据总体分布。

# 看下数据的整体信息
df.describe()

在这里插入图片描述

二、对数据进行预处理

所有需要分析的数据都需要查看,对于数值型,可以看describe⽅法输出的信息,重点关注最⼤值、最⼩值、平均值、行数等数据。

1、对需要分析的字段依次查看是否有null值

# name是否有null值
df[df.name.isnull()]

执行显示:name没有null值

# full_name是否有null值
df[df.full_name.isnull()]

执行显示:full_name没有null值

# nationality是否有空值
df[df.nationality.isnull()]

执行显示:nationality没有null值

# league是否有空值
df[df.league.isnull()]

在这里插入图片描述
执行显示:league有253条null值数据,需要进行处理

所在联赛、俱乐部都没有值,身价和周薪也是0,253条数据对于一万多条数据来说影响还好,可以删除。
删除数据一般放在后面进行,这里因为其他列数据也是异常,所以可以先删掉

2、使用drop方法删除league空值数据

# 删除league的null值数据
df.drop(df[df.league.isnull()].index, inplace=True)
  • 检查一下是否已删除成功
# 在看一下是否删除成功
df[df.league.isnull()]
  • 在查看下club是否还有空值
# club是否有空值
df[df.club.isnull()]

3、如果觉得age最小值有问题,单独输出来看下;其他列处理方法类似。

# 如果觉得age最小值有问题,可以输出看下
# 其他列类似
df[df['age'] == 16]
# eur_value列最小值是0,需要看下
df[df['eur_value'] < 1000]

4、 eur_value为0的列可以使用平均值来填充(只有几条数据,也可以删除)

# eur_value为0的列可以使用平均值来填充(只有几条数据,也可以删除)
df['eur_value'].replace(0, df['eur_value'].mean(), inplace=True)
  • 查看eur_value为0的列是否填充成功
# 在看下是否填充成功
df[df['eur_value'] < 1000]
df.loc[3272]
df[df.ID == 176900]

在这里插入图片描述

  • eur_wage列最⼩值也是0,也需要检查下
# eur_wage列最⼩值是0,也需要看下
df[df['eur_wage'] < 1000]

5、最后看下有⽆重复值(如果有可以⽤drop_duplicates处理)

# 最后看下有⽆重复值(如果有可以⽤drop_duplicates处理)
df[df.duplicated()]
  • 指定列判断是否有重复值
# 对指定的列判断是否有重复值
df[df.loc[:,['full_name', 'nationality', 'league', 'club','birth_date']].duplicated()]
  • 也可以单独查看full_name是否有重复值
# 也单独看下full_name是否有重复值,同名的有很多,所以不用处理
len(df.full_name.unique()), len(df)
df[df.full_name.duplicated()]

在这里插入图片描述

  • 随便找条full_name重复的记录看下
# 随便找条full_name重复的记录看下
df[df['full_name'] == 'Gonzalo Castro']

数据清洗完毕,开始分析

三、确定分析维度和指标

1、查看数据样本总数

# 查看样本总数
df.count()

在这里插入图片描述
2、对于数值类型列的⼀些常⻅的统计学指标,使用describe方法查看

# 数值类型列的⼀些常⻅的统计学指标
df.describe()

在这里插入图片描述
3、对于离散类型数据,直接使用groupby分组,如:国家、俱乐部等维度

# 国家维度的运动员数
# 使用groupby分组,并计算总和
nationality_data = df.groupby('nationality', as_index=False).count()[['nationality','ID']]
nationality_data

在这里插入图片描述

  • 将ID列重命名为player_count
# 重命名ID列
nationality_data.rename(columns={'ID':'player_count'}, inplace=True)
nationality_data
  • 使用sort_values()函数按照运动员数量进行排序

pandas中的sort_values()函数原理类似于SQL中的order by,可以将数据集依照某个字段中的数据进行排序,该函数即可根据指定列数据也可根据指定行的数据排序。

# 按照运动员数量排名
nationality_sorted_data = nationality_data.sort_values('player_count', ascending=False)
nationality_sorted_data

在这里插入图片描述

  • 运动员数量⼤于100的国家列表
# 运动员数量⼤于100的国家列表
nationality_sorted_data[nationality_sorted_data.player_count > 100]
  • 使用league列进行分组统计各⼤联赛得运动员数量
# 各⼤联赛得运动员数量
league_data = df.groupby('league', as_index=False).count()[['league','ID']].sort_values('ID', ascending=False)
league_data
  • 求各俱乐部平均周薪
# 各俱乐部平均周薪
df.groupby('club', as_index=False).mean()[['club', 'eur_wage']].sort_values('eur_wage', ascending=False).head(50)
  • 使用groupby先对club进行分组,再用mean()方法求得英超联赛English Premier League各个俱乐部球员的平均⽉薪,然后排序sort_values()
# 英超联赛English Premier League各个俱乐部球员的平均⽉薪
df[df.league == 'English Premier League'].groupby('club',as_index=False).mean()[['club', 'eur_wage']].sort_values('eur_wage', ascending=False)

4、对于连续型数据,通常使用分区间的方式;如:年龄、时间等维度,使用pd.cut()方法分区间进行统计。

  • 使用numpy的arange()函数生成等差的数组用于分段统计
# 球员年龄段分布
# 生成桶, 5岁一个分桶,最小16岁, 最大47
bins = np.arange(15, 50, 5)
bins

在这里插入图片描述

  • 使用cut()将数据进行分区间
bins_data = pd.cut(df['age'], bins)
bins_data

在这里插入图片描述

  • 以年龄的维度,对已分出区间的数据进行groupby分组统计。
bins_counts = df['age'].groupby(bins_data).count()
bins_counts

在这里插入图片描述

四、可视化展示

简单的折线图展示:

bins_counts.plot()

在这里插入图片描述
为了使图标展示更好看处理index

# 为了图标展示好看处理index
bins_counts.index = [str(x.left) + '~' + str(x.right) for x in bins_counts.index]
bins_counts.index

在这里插入图片描述
柱状图展示:

bins_counts.plot(kind='bar', alpha=1, rot=0)
plt.show()

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值