数据清洗是数据分析和机器学习算法中不可或缺的一步,它涉及到识别和修正数据集中的错误、损坏和缺失值,以确保数据的适用性。这个过程没有固定的规则,完全取决于数据集的质量和所需的精确度。数据可能会因为多种原因而损坏,包括从不同结构化和非结构化来源收集数据时产生的重复和错误标记的值,不同位置存储的数据字典定义不一致,手动输入错误/打字错误,不正确的大写,以及错误标记的类别/类别。
数据质量对于分析至关重要。有几个质量标准需要检查,包括完整性、准确性、一致性和有效性。完整性是指数据集中填写的条目百分比,数据集中缺失值的百分比是数据集质量的良好指标。准确性是指数据集中的条目与其实际值的接近程度。一致性是指数据在同一数据集内以及跨多个数据集的一致性。有效性是指数据符合业务规则施加的约束的程度。
数据剖析是探索数据并从中发现洞见的过程。Pandas剖析报告是获取数据集完整信息的最快方式。数据清洗的第一步是进行探索性数据分析。使用Pandas剖析的步骤包括安装Pandas剖析包、使用Pandas加载数据集、读取前五行以及生成剖析报告。剖析报告包括概览、变量、交互、相关性和缺失值五部分。
pip install pandas-profiling
import pandas as pd
df = pd.read_csv(r"C:UsersDellDesktopDatasethousing.csv")
df.head()
from pandas_profiling import ProfileReport
prof = ProfileReport(df)
prof.to_file(output_file='output.html')
剖析报告的概览部分提供了关于变量数量、观测值数量、缺失值、重复项和分类及数值变量数量的一般统计信息。变量信息详细说明了不同值、缺失值、平均值、中位数等统计信息。相关性描述了不同变量之间的相关程度,通常以热图形式展现。交互部分显示了变量之间的交互。缺失值部分描绘了每个列中缺失值的数量。
现在已经对数据集中的缺失数据、错误值和错误标记的类别有了详细的了解,接下来将看到用于清洗数据的一些技术。这些技术完全取决于数据集的质量以及如何处理数据。一些技术包括处理缺失值、处理重复项和编码。
处理缺失值是数据清洗中最重要的一步。首先,应该问自己为什么数据会缺失?是因为数据输入操作员没有记录,还是故意留空的?还可以查阅文档以找到相同的原因。处理这些缺失值有不同的方法,包括删除包含缺失值的所有行,或者使用均值或中位数值替换缺失值,或者在适合列的值范围内生成随机数。
df.dropna()
from sklearn.impute import SimpleImputer
my_imputer = SimpleImputer()
imputed_df = pd.DataFrame(my_imputer.fit_transform(df))
重复行通常发生在数据从多个来源合并时。解决方案是简单地删除它们。可以使用unique()函数找出列中的唯一值,然后决定哪些值需要被删除。
字符编码定义了从原始二进制字节字符串到人类可读文本字符串的一对一映射规则集。有多种编码可用,包括ASCII、utf-8、US-ASCII、utf-16、utf-32等。可能会发现一些文本字段有不规则和无法识别的模式,这是因为utf-8是Python的默认编码。所有代码都在utf-8中。因此,当数据从多个结构化和非结构化来源合并并保存在一个地方时,文本中会出现不规则的模式。
import chardet
with open("C:/Users/Desktop/Dataset/housing.csv",'rb') as rawdata:
result = chardet.detect(rawdata.read(10000))
print(result)
df.to_csv("C:/Users/Desktop/Dataset/housing.csv")
缩放指的是转换数据的范围并将其移动到其他值范围。这在比较不同属性时很有用。一个有用的例子是货币转换。归一化指的是改变数据的分布,使其能够代表一个钟形曲线,其中属性的值在平均值周围均匀分布。这种类型的分布也被称为高斯分布。对于假设数据是正态分布的机器学习算法来说,这是必要的。
from mlxtend.preprocessing import minmax_scaling
import seaborn as sns
import matplotlib.pyplot as plt
random_data = np.random.exponential(size=100)
scaled_version = minmax_scaling(random_data, columns=[0])
sns.distplot(random_data, ax=ax[0],color='pink')
sns.distplot(normalized_data[0], ax=ax[1],color='purple')
df['Date'].dtype
import datetime
df['Date_parsed'] = pd.to_datetime(df['Date'], format="%m/%d/%y")
df['ReginonName'] = df['ReginonName'].str.lower()
df['ReginonName'] = df['ReginonName'].str.strip()
region = df['Regionname'].unique()
import fuzzywuzzy
from fuzzywuzzy import process
regions=fuzzywuzzy.process.extract("WesternVictoria",region,limit=10,scorer=fuzzywuzy.fuzz.token_sort_ratio)