案例:FIFA2018球员数据分析

对FIFA2018球员做数据分析

整体思路:

1、确定分析目标
2、导入数据文件
3、查看数据
4、确定分析维度和指标
5、清理需要的数据
6、利用数据做分析
7、根据需要做图

首先要对FIFA_2018中球员信息做个总体了解

1. 导入所需要的库/包:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
2. 加载数据文件(FIFA_2018_player.csv)
df = pd.read_csv('./FIFA_2018_player.csv')
3. 简单查看数据,有哪些列,都是什么类型的值
df.head()

在这里插入图片描述
有哪些列:

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

4. 看下数据的整体信息 (包括count、mean、min、max等)
df.describe()

在这里插入图片描述
在数据的整体信息中,也可以看出哪些数据是不太正常的。
像身价eur_value最小值为0,可以后续查看是否异常。
年龄age最小值是16岁,也可以查看是否正常等。

5. 开始数据清理

所有需要分析的数据都需要查看,是否有缺失或者不正常的数据。
对于数值型,可以看下describe⽅法输出的信息,重点关注最⼤值、最⼩值、平均值、⾏数等数据。

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

isnull返回的是布尔类型的值,如果没有null值返回的就是False
在这里插入图片描述
name没有null值

7.full_name是否有null值
df[df.full_name.isnull()]
8.nationality是否有null值
df[df.nationality.isnull()]
9. league是否有null值
df[df.league.isnull()]
10.可以通过count查看总数(非null数量)以及查看对应列有没有null值。
df.count()

在这里插入图片描述
总数是17994条,可以看到 league和club 中有null值。

11.查看league和club的null值
df[df.league.isnull()]

在这里插入图片描述
可以看到league列中有253条null值。
此时我们可以对存在的null值做处理。
①如果不需要联赛league或者俱乐部club的信息那么我们可以删掉,因为null值的数量也不是很多;
②如果我们做分析时需要用到league或者club的值,在数据量小的情况下可以在了解真实数据后进行重新赋值。
253条数据对于⼀万多条数据来说影响还好,可以删掉,那么我们要把league和club中的null值删掉。

12.删除league联赛缺失的数据
df.drop(df[df.league.isnull()].index,inplace=True)

查看是否删除成功:df[df.league.isnull()]
club俱乐部的缺失值也可以删除,方法和删除联赛league一样。
删除:df.drop(df[df.club.isnull()].index,inplace=True)
查看:df[df.club.isnull()]

13.根据4.查看数据的描述性信息describe可知,如果觉得age列最⼩值有问题,可以输出查看下,其他的类似
df[df['age'] == 16]

在这里插入图片描述
可以看出age年龄最小的16的数据没有问题。

14.身价eur_value列最⼩值是0,也需要看一下
df[df['eur_value'] < 1000]
#df[df['eur_value'] == 0]

在这里插入图片描述
eur_value为0的列可以使⽤平均值填充(只有⼏条数据,也可以删除)

df['eur_value'].replace(0,df['eur_value'].mean(),inplace=True)

填充完查看是否填充成功

df[df['eur_value']<1000]
# df.loc[7734]  #通过索引查看
# df[df.ID==148745]  #通过ID查看

填充成功,eur_value为0的数据已经没有了。
eur_wage列最⼩值是0,也需要看下
df[df['eur_wage'] < 1000]

df[df['eur_wage'] == 0] 查看,处理方法类似。

15.最后看下有⽆重复值(如果有可以⽤drop_duplicates处理)
df[df.duplicated()]
16.对指定的列判断是否有重复值
df[df.loc[:,['full_name', 'nationality', 'league', 'club','birth_date']].duplicated()]
17.我们还可以查看下name姓名、全称full_name以及出生日期等有没有重复的值,对应数据查看有没有一样的数据,如果有的话可以进行删除操作。
df[df.full_name.duplicated()]

在这里插入图片描述
可以看到有102条全称的名字有重复值
我们可以随便找一条重复记录看一下:

df[df['full_name'] == 'Carlos Sánchez']

在这里插入图片描述
可以看到虽然全称名字一样,但是国家、俱乐部,出生日期等都不一样,所以就是简单的重名而已。

数据清洗完毕,可以开始分析

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

在这里插入图片描述

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

在这里插入图片描述

分析最主要的就是确定维度和指标
什么是维度和指标呢?
维度指的就是一列或者多列,指标就是统计值或者数据

3.统计不同国家的人数
nationality_data = df.groupby('nationality', as_index=False).count()[['nationality', 'ID']]
nationality_data

我们不需要将国家作为索引,所以要加 as_index=False
在这里插入图片描述
这样也不利于查看,我们一般将统计后的数据要进行排序,方便我们查看,升序或者降序排列要根据需求定。(查看下面的4.小题)
现在显示的是ID,我们其实求出来的是人员数量,我们需要给其重命名一下:

nationality_data.rename(columns={'ID':'player_count'}, inplace=True)
nationality_data

在这里插入图片描述

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

ascending=False 从大到小排序

在这里插入图片描述

5.运动员数量⼤于100的国家列表
nationality_sorted_data[nationality_sorted_data.player_count > 100]
6.各⼤联赛得运动员数量

要根据联赛league分组

league_data = df.groupby('league', as_index=False).count()[['league','ID']].sort_values('ID', ascending=False)
league_data.rename(columns={'ID':'people_count'},inplace=True)
league_data

分组groupby,排序sort_values,重命名rename

7.计算各俱乐部平均周薪(工资)

根据club分组,计算工资的平均值

df.groupby('club', as_index=False).mean()[['club','eur_wage']].sort_values('eur_wage', ascending=False).head(10)
#head(10)查看前10行

在这里插入图片描述

8.计算英超联赛English Premier League各个俱乐部球员的平均⽉薪
df[df.league == 'English Premier League'].groupby('club',as_index=False).mean()[['club', 'eur_wage']].sort_values('eur_wage',
ascending=False)

在这里插入图片描述

9.计算球员年龄段分布

我们要使用numpy的arange进行分段
使用cut进行区间划分,相关于分组,在arange的基础上

bins = np.arange(15, 50, 5)
bins_data = pd.cut(df['age'], bins)
bin_counts = df['age'].groupby(bins_data).count()
bin_counts

以年龄为维度,最小值15,最大值50,每5个划分一个区间
在这里插入图片描述
可以看出15-20岁的球员有3300个

简单的绘图

折线图:

bin_counts.plot

在这里插入图片描述
为了图标展示好看处理index
条形图:

bin_counts.index = [str(x.left) + '~' + str(x.right) for x in bin_counts.index]
bin_counts.plot(kind='bar', alpha=1, rot=0)

在这里插入图片描述
饼图:

bin_counts.plot(kind='pie')
plt.show()

在这里插入图片描述

发布了49 篇原创文章 · 获赞 76 · 访问量 2693

猜你喜欢

转载自blog.csdn.net/qq_39783601/article/details/104753561