案例分析练习:
# 引入要使用的库
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()
* 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是否有空值
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)
# 在看下是否填充成功
df[df['eur_value'] < 1000]
df.loc[3272]
df[df.ID == 176900]
# 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是否有重复值,同名的有很多,所以不用处理
len(df.full_name.unique()), len(df)
df[df.full_name.duplicated()]
# 随便找条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列
nationality_data.rename(columns={'ID':'player_count'}, inplace=True)
nationality_data
pandas中的sort_values()函数原理类似于SQL中的order by,可以将数据集依照某个字段中的数据进行排序,该函数即可根据指定列数据也可根据指定行的数据排序。
# 按照运动员数量排名
nationality_sorted_data = nationality_data.sort_values('player_count', ascending=False)
nationality_sorted_data
# 运动员数量⼤于100的国家列表
nationality_sorted_data[nationality_sorted_data.player_count > 100]
# 各⼤联赛得运动员数量
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)
# 英超联赛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()方法分区间进行统计。
# 球员年龄段分布
# 生成桶, 5岁一个分桶,最小16岁, 最大47
bins = np.arange(15, 50, 5)
bins
bins_data = pd.cut(df['age'], bins)
bins_data
bins_counts = df['age'].groupby(bins_data).count()
bins_counts
四、可视化展示
简单的折线图展示:
bins_counts.plot()
# 为了图标展示好看处理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()