在数据科学的生命周期中,数据清洗是一个至关重要的步骤,即便是数据分析师也必须进行。数据科学家和他们的日常工作是清理数据,以便机器学习算法能够获得足够好的数据进行训练。因此,需要有一个数据集清洗的模板。本文将学习如何清洗数据集,即在开始数据科学项目的数据准备阶段之前必须知道的一些强制性步骤。这样,刚开始他们的旅程的新手将理解清洗/准备数据集的关键步骤,以进行不同的处理,如特征工程和机器学习模型开发。简而言之,将尝试使用Python及其著名的库(Numpy和Pandas)构建一个数据清洗模板。
在实际开始数据清洗之前,应该做的第一件事是——向自己提问。例如,想从分析中得出什么洞见?根据业务需求需要纠正什么?同样,也为这个实例策划了一些关键任务:数据集如何处理无效值?想对空值做什么?否想要总结、分组或过滤数据?
首先,将导入构建模板所需的所有库。Pandas和Numpy是处理结构化数据或表格数据时最推荐和强大的库。Pandas被每个数据分析师(无论是经验丰富的还是新手)标记为数据操作库,因为它拥有重要的功能,并且能够处理表格数据。Numpy主要用于处理数组和复杂的数学计算,提供线性代数、傅里叶变换和矩阵中一些有用的函数。
import pandas as pd
import numpy as np
使用read.csv()函数读取数据集(这是UCI机器学习库中著名的糖尿病数据集),然后使用info()方法进行进一步的干预,该方法为提供了以下洞见:数据集中是否有任何空值?答案是没有!因为可以看到768个非空值。BMI和Pedigree函数的实数据类型被检测为浮点数。对于其余的,它是整数。
df = pd.read_csv("diabetes.csv")
df.info()
因此,看起来他们在没有数据的地方使用了0值。不认为他们使用了NaN,但如果他们使用了,可以选择删除那些行(drop)或用某个值填充它们(fill)。因为他们已经使用了0,所以这样做可能是明智的,以防万一。
df = df.fillna(0)
现在知道有NaN值。也可以直接检查NaN,但现在试图展示可以使用的功能。那么,如何处理这些零值呢?有时,可以用一些合理的值填充它们,但这通常会对数据产生偏见。所以,通常会忽略它们。所以,想问如何使用数据。会使用SkinThickness吗?否关心非物理的异常值?如果主要关心Glucose、BMI和Age,可以摆脱很多这些问题,但只关注这些列。
df2 = df[["Glucose", "BMI", "Age", "Outcome"]]
在这里,抓取了更感兴趣的列进行分析,这可以是任何数据清洗过程中广泛和重要的一步,因为不需要所有的列来处理。因此,选择正确的数据集非常重要。
df2.head()
现在,让摆脱任何零散的零。想做的是找到有任意数量零的行并删除该行。或者用掩码来说,找到有任意零(True)的行,然后反转它(到False),这样当使用loc应用掩码时,False条目被丢弃。
df3 = df2.loc[~(df2[df2.columns[:-1]] == 0).any(axis=1)]
很好,已经选择了关心的数据,并确保它没有空值。将继续检查事情是否合理,用一些图表在下一节。最后,可以按结果对数据进行分组。这可能使寻找诊断中的模式变得更容易。可以通过将DataFrame分成两个(一个用于是,一个用于否),或者如果想要汇总统计数据,可以使用groupBy函数来实现这一点:
df3.groupby("Outcome").mean()
这可以告诉,一般来说,血糖水平越高,就越超重,越老,被诊断出糖尿病的机会就越大。这可能并不那么令人惊讶。可以使用groupBy语句做其他事情,如下所示:
df3.groupby("Outcome").agg({"Glucose": "mean", "BMI": "median", "Age": "sum"})
有多种使用GroupBy函数的方法。这是第二种方式,可以使用AGG函数帮助使用多种中心趋势方法,如mean、median、sum等。
df3.groupby("Outcome").agg(["mean", "median"])
positive = df3.loc[df3["Outcome"] == 1]
negative = df3.loc[df3["Outcome"] == 0]
print(positive.shape, negative.shape)
df3.to_csv("clean_diabetes.csv", index=False)