↑关注 + 星标 ,每天学Python新技能

后台回复【大礼包】送你Python自学大礼

从今天开始,我们再一起来学习数据分析,共同进步!

首先先来进行一个数据清洗的实战,使用比较经典的数据集,泰坦尼克号生存预测数据。

数据集下载地址

https://github.com/zhouwei713/DataAnalyse/tree/master/Titanic_dataset

导入数据

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

df = pd.read_csv('titanic_data.csv')

df

数据集信息如下:

各字段含义

pclass:船票等级

sibsp:一同登船的兄弟姐妹或配偶数量

parch:一同登船的父母或子女数量

ticket:船票号码

fare:船票价格

cabin:船舱

embarked:登船地点

数据整体查看

拿到数据之后,我们先整体查看下数据信息

df.describe()

还有些列是非数值的,所以没有展示。

这里得到的各项指标,我们先保存不动,在后面处理缺失值时会有用到。

处理缺失值

首先查看缺失值

df.isnull().sum()

>>>

pclass         1

survived       1

name           1

sex            1

age          264

sibsp          1

parch          1

ticket         1

fare           2

cabin       1015

embarked       3

dtype: int64

可以看到,缺失值比较多的是 cabin 和 age

年龄处理

查看缺失占比

print('缺失占比 %.2f%%' %((df['age'].isnull().sum()/df.shape[0])*100))

>>>

缺失占比 20.15%

下面查看下年龄的分布情况

age = df['age'].hist(bins=15, color='teal', alpha=0.6)

age.set(xlabel='age')

plt.xlim(-10,85)

plt.show()

从图中我们可以看出,整体数据是向左偏的,即大多数数据是小于平均值的,故而我们可以采用中位数来填补空值,而不是平均数。

从上面的 describe 函数的输出值也可以看出,平均值是 29.88,中位数是 28,显然中位数更加接近于大部分数据所在的区域。

使用中位数填充空缺的年龄值

data = df.copy()

data['age'].fillna(df['age'].median(skipna=True), inplace=True)

仓位处理

查看缺失百分比

print('缺失百分比 %.2f%%' %((df['cabin'].isnull().sum()/df.shape[0])*100))

>>>

缺失百分比 77.48%

由于仓位信息已经缺失了大部分,所以这里选择直接删除处理

data.drop(columns=['cabin'], inplace=True)

登船地点处理

我们先来查看下登船地点这列数据的形式

print(df['embarked'].value_counts())

sns.countplot(x='embarked', data=df, palette='Set2')

plt.show()

>>>

S    914

C    270

Q    123

Name: embarked, dtype: int64

可以看到,登船地点总共包含三类数据,S、C 和 Q,他们出现的次数分别为 914、270 和 123。

又因为该列数据总共缺失 3 个,缺失率很低,使用众数来填充这三个缺失值应该是没问题的。

使用众数填充

data['embarked'].fillna(df['embarked'].value_counts().idxmax(), inplace=True)

其他缺失值处理

对于其他列,只是缺失了一到两个,可以采用众数的方式来填充缺失值,也可以选择直接删除掉缺失的部分,不影响整体数据分布

data.dropna(axis=0, how='any', inplace=True)

最后,再查看确认下是否不存在缺失值了

data.isnull().sum()

>>>

pclass      0

survived    0

name        0

sex         0

age         0

sibsp       0

parch       0

ticket      0

fare        0

embarked    0

dtype: int64

其他特征列处理

对于 sibsp 和 parch 两列,我们可以抽象成是否是独自登船,这样就能够把两列合并为一列,并用 0,1 来表示是否独自登船。

我们新增一列 alone,把两列都是 0 的数据添加到新列中并设置为 0,把两列相加不为 0 的数据添加到新列中,并设置数值为 1。那么原来的两列就可以删除了。

data['alone']=np.where((data["sibsp"]+data["parch"])>0, 0, 1)

data.drop('sibsp', axis=1, inplace=True)

data.drop('parch', axis=1, inplace=True)

data.head()

对于 embarked 和 sex 这两列,都是字符串类型的数据,需要转化为数字才能被算法模型分析处理。

这里可以采用独热编码的方式,来转换数据

data =pd.get_dummies(data, columns=["embarked","sex"])

data.head()

独热编码(one-hot encoding),是一种常用的数据转换方式,对于每一个特征,如果它有 m 个可能值,那么经过独热编码后,就变成了 m 个二元特征,这些特征互斥,每次只有一个激活。

对于 name 和 ticket 两列,由于他们的存在,对于我们的数据分析没有任何意义,往往会直接删除掉这样无意义的数据

data.drop('name', axis=1, inplace=True)

data.drop('ticket', axis=1, inplace=True)

至此,我们就把一份原始的数据,处理成了比较标准的,易于数据分析的数据。

透视表分析

在处理数据之后,我们还可以使用透视表,整体分析下数据

这里主要查看下各个特征(船票等级,性别,仓位等)对于存活率的影响

注意数据集 df 与 data 的区别

性别透视表

首先来看下,不同性别,存活率的情况

sex_sur_table = pd.pivot_table(df, index=['sex'], values='survived')

print(sex_sur_table)

>>>

survived

sex

female  0.727468

male    0.190985

女性存活率是远远高于男性的,ladies first。

船票等级与存活率

pclass_sur_table = pd.pivot_table(df, index=['sex'], columns=['pclass'], values='survived')

print(pclass_sur_table)

>>>

pclass       1.0       2.0       3.0

sex

female  0.965278  0.886792  0.490741

male    0.340782  0.146199  0.152130

可以看到,一等船票的女性存活率是非常高的,同时船票等级越高,无论男女,存活率都越高

不同年龄存活率

将年龄离散化处理

data['age_cut'] = pd.cut(data['age'], [0, 18, 90])

data['sex'] = df['sex']

print(data.head())

>>>

pclass  survived      age      fare  alone  embarked_C  embarked_Q  \

0     1.0       1.0  29.0000  211.3375      1           0           0

1     1.0       1.0   0.9167  151.5500      0           0           0

2     1.0       0.0   2.0000  151.5500      0           0           0

3     1.0       0.0  30.0000  151.5500      0           0           0

4     1.0       0.0  25.0000  151.5500      0           0           0      embarked_S  sex_female  sex_male   age_cut     sex

0           1           1         0  (18, 90]  female

1           1           0         1   (0, 18]    male

2           1           1         0   (0, 18]  female

3           1           0         1  (18, 90]    male

4           1           1         0  (18, 90]  female

年龄段与存活率

age_cut_sur_table = pd.pivot_table(data, index=['sex'], columns=['pclass', 'age_cut'], values='survived')

print(age_cut_sur_table)

>>>

pclass        1.0                 2.0                 3.0

age_cut   (0, 18]  (18, 90]   (0, 18]  (18, 90]   (0, 18]  (18, 90]

sex

female   0.923077  0.969466  0.952381  0.870588  0.534483  0.474684

male     0.750000  0.321637  0.523810  0.093333  0.208333  0.142857

当然,透视表还有很多强大的功能,你可以试着探索更多。

数据清洗的重要性

要知道,一个好的数据分析师必定是一名数据清洗高手。在数据分析的过程中,数据清洗是最占用时间与精力的步骤。数据质量的高低,直接影响我们最后分析的结果,千万马虎不得。

数据质量的准则

那么既然数据清洗这么重要,我需要把原始数据处理到什么程度,才算是合格的待分析数据呢?如下我总结了一些业界的标准,可以供你参考。

完整性:数据集中是否存在空值,统计的字段是否完善。

全面性:某列数据,是否能够全面的反应真实的情况,是否只包含一部分情况。

合法性:数据的类型,内容,大小等是否合理。比如:是否有年龄超过 150 的,是否有成绩超过 1 万的,数据单位是否统一等等。

唯一性:数据是否存在重复记录。

在进行数据清洗的时候,一定要先耐心的观察数据,充分的理解每列数据的意义,从真实的情况出发分析数据是否有真实的含义,再根据生活工作中的经验,来逐一处理数据。

我们再用一个小例子来理解下

姓名

身高

体重

年龄

年龄

张飞

180

500

500

关羽

181

100

28

28

刘备

1.78

160

30K

30k

赵云

175

140

23

23

曹操

180

150

37

37

赵云

175

140

23

曹操

把数据转化成 Pandas 数据结构

mydata = pd.read_csv('mydata.csv', index_col='name')

print(mydata)

>>>

height  weight  age age.1

name

张飞    180.00     NaN  500   500

关羽    181.00   100.0   28    28

刘备      1.78   160.0  30K   30K

赵云    175.00   140.0   23    23

曹操    180.00   150.0   37    37

赵云    175.00   140.0   23    23

典韦       NaN     NaN  NaN   NaN

完整性

查看缺失值

mydata1 = mydata.copy()  # copy

mydata1.isnull().sum()  # 查看总体缺失值

>>>

height    1

weight    2

age       1

age.1     1

dtype: int64

一般是处理空值,空行等

mydata1['weight'].fillna(mydata1['weight'].mean(), inplace=True)  # 使用平均值填充

#mydata1['height'].fillna(mydata['height'].value_counts().index[0], inplace=True)  # 使用众数填充

mydata1.dropna(how='any', inplace=True)  # 删除空行

一定要先执行空值填充,再执行删除空行的代码,否则含有空值的行都会被删除。

全面性

刘备的身高是“米”的单位,我们需要转换为“厘米”

mydata1.loc[mydata1['height']<100, 'height'] = mydata1[mydata1['height']<100]['height']*100

合理性

张飞的年龄是 500,显然不合理,需要处理。因为张飞是三弟,年龄需要比刘备和关羽小,就设置为 27 吧

mydata1.loc['张飞', 'age'] = 27

同时刘备的年龄还存在一个 K 字符,需要去掉

mydata1['age'].replace({r'[K]': ''}, regex=True, inplace=True)

唯一性

数据中还存在重复的行和列,也需要删除,保证数据的唯一性

mydata1.drop_duplicates(inplace=True)  # 删除重复行

mydata1.drop('age.1', axis=1, inplace=True)  # 删除不需要的列

最终我们的数据为

print(mydata1)

>>>

height  weight age

name

张飞     180.0   138.0  27

关羽     181.0   100.0  28

刘备     178.0   160.0  30

赵云     175.0   140.0  23

曹操     180.0   150.0  37

总结

本节我们共同完成了一个数据清洗的实战和一个练习小例子。对于缺失值,需要根据其缺失的百分比及数据分布情况,来决定如何填充缺失值。对于一些非数字类型的数据,可以选择独热编码等方式转换数据。还总结了数据清洗的准则,只要你遵循这些准则来处理数据,那么得到的数据基本就是“好”的数据了。

练习题

对于本节的例子,你还有哪些观点,对于缺失值的填充,是否还有其他的方式呢?对于 pclass,sex 等数据的缺失值,还可以怎么处理呢,欢迎留言讨论啊

python清洗数据教程_数据分析入门系列教程-数据清洗相关推荐

  1. python亲和性分析_数据挖掘入门系列教程(一)之亲和性分析

    数据挖掘入门系列教程(一)之亲和性分析 教程系列简介 该教程为入门教程,为博主学习数据挖掘的学习路径步骤.教程为入门教程,从最简单的开始.使用的编程语言为Python3.8.1,使用JupyterNo ...

  2. graphviz 画决策树_数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris

    数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris 加载数据集 数据特征 训练 随机森林 调参工程师 结尾 数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iri ...

  3. Linux pwn入门教程,pwn堆入门系列教程1

    pwn堆入门系列教程1 因为自己学堆的时候,找不到一个系统的教程,我将会按照ctf-wiki的目录一步步学下去,尽量做到每周有更新,方便跟我一样刚入门堆的人学习,第一篇教程研究了4天吧,途中没人指导. ...

  4. Excel Dax教程_编程入门自学教程_菜鸟教程-免费教程分享

    教程简介 DAX代表 Data Analysis Expressions. DAX是一种公式语言,是函数,运算符和常量的集合,可以在公式或表达式中用于计算和返回一个或多个值. DAX是与Excel P ...

  5. 高级Excel功能教程_编程入门自学教程_菜鸟教程-免费教程分享

    教程简介 Excel是办公室自动化中非常重要的一款软件,Excel函数则是Excel中的内置函数.Excel函数共包含11类,分别是数据库函数.日期与时间函数.工程函数.财务函数.信息函数.逻辑函数. ...

  6. jQuery教程_编程入门自学教程_菜鸟教程-免费教程分享

    教程简介 jQuery入门教程 - 从简单的步骤开始了解jQuery,从基本到高级概念,包括jQuery概述,基础知识,选择器,属性,遍历,CSS,DOM操作,AJAX支持,拖放,效果,事件处理,UI ...

  7. Apache POI(Word)教程_编程入门自学教程_菜鸟教程-免费教程分享

    教程简介 IT宝库整理的Apache POI Word入门教程 - 从基本到高级概念的简单简单步骤学习Apache POI Word,其中包括概述,Apache POI安装,核心类,文档,段落,边框, ...

  8. EJB教程_编程入门自学教程_菜鸟教程-免费教程分享

    教程简介 EJB入门教程 - 从简单的步骤了解EJB 3.0和3.1(Enterprise Java Bean)框架,从基本概念到高级概念,包括概述,环境设置,应用服务器,容器,企业Bean,注释,会 ...

  9. Perl教程_编程入门自学教程_菜鸟教程-免费教程分享

    教程简介 Perl入门教程 - 从基本到高级概念的简单简单步骤了解Perl,包括简介,环境,语法,数据类型,变量,标量,数组,哈希,IF ... ELSE,循环,运算符,日期和时间,子程序,引用,格式 ...

  10. PHP 7 教程_编程入门自学教程_菜鸟教程-免费教程分享

    教程简介 PHP7入门教程 - 从简单的步骤了解PHP 7,从基本到高级概念,包括简介,性能,环境设置,标量类型声明,返回类型声明,空值合并运算符,Spaceship运算符,常量数组,匿名类,Clos ...

最新文章

  1. 【内核】嵌入式linux内核的五个子系统
  2. php 去除二维数组中的包含某一个值的数组
  3. 哈希表及哈希冲突解决办法
  4. Spring4:具有Java 8 Date-Time API的@DateTimeFormat
  5. mysql utf8 4位_mysql中utf8和utf8mb4区别
  6. java求sum的前n项和_【LeetCode-面试算法经典-Java实现】【015-3 Sum(三个数的和)】...
  7. 【tool】firewall防火墙
  8. 基于Stm32F746g_disg平台下移植zephry使用TinyML预测模型
  9. 总结常见的10种破解密码方法
  10. 神操作,用Python教你暴力破解WiFi密码,附赠技术实现视频
  11. 三角形边长求高的c语言函数公式,三角形内三角函数与边长计算公式
  12. java实现身份证正反面图片的身份信息的识别
  13. 根下有长长的白色根须
  14. Excel 属性及方法
  15. grapher_概述所有Grapher链接和Collection2模式
  16. 实用的60个CSS代码片段
  17. 蘑菇云【行空板Python入门教程】第五课:2D迷宫
  18. python实现excel搜索_从几百个Excel中查找数据,用Python一分钟搞定
  19. 第二章 [分布式CMS]
  20. python学习准备

热门文章

  1. 如何判断自己的计算机网络故障,电脑网卡坏了怎么修复 如何判断网卡是否坏了...
  2. 程序员实习期馒头加酸菜,转正后月薪10K起步:走路都带风
  3. UVa 12118 Inspector's Dilemma
  4. LaTeX中的拼写及语法检查
  5. MYSQL 只能回环口链接_loopback回环口详解
  6. 第一章:Swoole结构和流程
  7. stm32增量式编码器使用流程
  8. 半透明旋转魔方特效的实现
  9. Codeforces Round #469 (Div. 2) C. Zebras
  10. Android持久化存储——(包含操作SQLite数据库)