数字化时代,数据可以说是如同企业的血液。然而,不准确、不完整、不一致的数据却让企业的运营处处受阻。很多企业最初的出发点是好的,想要降本增效,结果呢,是降本增笑。企业怎么能从海量数据中找到准确的信息而避免耗费大量时间和精力?又怎么能避免数据混乱而导致的决策失误?
答案是——数据清洗。简单来说,数据清洗就是对数据进行审查和校验的过程,目的是删除重复信息、纠正存在的错误,并提供数据一致性。如何有效进行数据清洗,走好数字化转型的每一步,是企业要思考的重要命题。
先给大家分享一份《数据仓库建设方案》,包含了数仓的技术架构、数仓建设关键动作、数仓载体/工具、配置参考、大数据场景支撑案例等内容,限时免费下载!
https://s.fanruan.com/gp9fn 「链接」
一、数据清洗的意义.
众所周知,在数据分析报告中,未经清洗的数据很可能会导致错误的结论,降低报告的可信度。而通过数据清洗,就可以去除错误、冗余或不完整的数据,提高数据分析的准确性。
作为预处理的重要环节,数据清洗在各个领域都有着广泛的应用:
(1)对于建立数据仓库,当多个数据库合并或多个数据源集成时,需要进行数据清洗。数据清洗包括数据的清洗和结构转换两个过程,为数据仓库的高效运行提供保障。
(2)在机器学习和人工智能领域,数据清洗的作用主要体现在数据收集、清洗、预处理、存储和分析等方面。通过数据清洗处理不完整、错误或重复的数据,为模型训练提供高质量的数据。
二、常见的数据清洗问题及处理方法
其实,数据清洗作为数据处理的一部分,不是简单的过程,而是会面临各种各样的问题,这里给大家列举几个常见的数据清洗问题,并给出相应的处理方法,希望对大家有所帮助!
(一)缺失值处理
1. 识别缺失值的方法
- 热图可视化是一种有效的识别缺失值的方法。通过将数据以热图的形式展示,可以直观地看出哪些数据点存在缺失。颜色的深浅可以代表数据的完整性程度,颜色越浅表示缺失值越多。比如下图就是数据可视化热图:
- 列出缺失数据百分比也是一种常见的方法。可以计算每个字段的缺失值比例,例如,假设有一个包含 1000 条记录的数据集,某个字段有 200 条记录存在缺失,那么该字段的缺失数据百分比为 20%。
- 缺失数据直方图可以帮助我们更直观地了解数据的缺失情况。将数据集中的缺失值数量以直方图的形式展示,可以清晰地看出不同字段的缺失值分布情况。比如在下图展示的缺失数据直方图中。
2. 处理缺失值的策略
- 丢弃观察值是一种处理缺失值的方法。在丢弃观察值时,我们一般要满足两个条件:一是缺失值数量较少;二是缺失数据对整体数据影响较小,所以,这就要求我们树立“大局观念”,从数据的整体大局出发。例如,在一个包含 1000 条记录的数据集,如果只有几十条记录存在缺失值,并且这些记录的缺失不会对数据分析结果产生重大影响,那么可以考虑删除这些记录。千万不能只看数据量的差异,这样很可能就会把一些关键数据误删!
- 丢弃特征也是一种处理方法。如果某个特征的缺失值比例过高,比如超过 50%,那么可以考虑删除这个特征。因为过多的缺失值可能会导致该特征在数据分析中失去意义。
- 填充缺失值是一种常用的处理策略。可以根据业务知识或过往经验给出推测填充,例如根据用户的其他行为特征推测缺失的信息。也可以利用同一指标数据计算结果填充,如使用均值、中位数等。还可以利用不同指标数据推算结果填充,比如用身份证信息可以揭示年龄等信息。
(二)重复数据处理
在处理数据集中完全或部分重复的记录时,可以使用多种方法。
首先,可以使用去重工具自动识别和删除重复数据行。许多数据库管理系统和数据分析软件都提供了去重功能,可以快速地找出重复的数据并进行删除。这里就不给大家推荐一些专业的数据处理工具了,就用最简单的Excel就能解决,在 Excel 中,可以使用 “数据” 菜单下的 “删除重复项” 功能,选择要去重的列,即可自动删除重复的数据行。
此外,还可以合并多列数据实现去重。有时候,重复的数据可能不是完全相同的记录,而是某些关键列的值相同。在这种情况下,可以将多个列的数据合并起来,作为判断重复的依据。例如,将姓名、身份证号和出生日期三个列的数据合并起来,如果合并后的结果相同,则认为是重复记录。
(三)异常值处理
目前来说,分箱、聚类和回归等方法是识别和处理数据中异常值的有效手段。
1. 分箱方法
分箱方法可以将数据划分为若干个区间,将落在区间外的数据点视为异常值。例如,可以使用等宽分箱法,将数据划分为若干个宽度相等的区间,然后判断每个数据点所在的区间。如果一个数据点落在了区间范围之外,那么可以认为它是异常值。
2. 聚类方法
聚类方法可以将数据点分为不同的簇,异常值通常会落在较小的簇或者远离其他簇的位置。例如,使用 KMeans 聚类算法,将数据点分为多个簇,然后观察每个簇的大小和分布情况。如果某个数据点所在的簇非常小,或者该数据点与其他簇的距离很远,那么可以认为它是异常值。
【补充】
K-means算法是一种迭代求解的聚类分析算法,其核心思想是将数据集中的n个对象划分为K个聚类,使得每个对象到其所属聚类的中心(或称为均值点、质心)的距离之和最小。这里所说的距离通常指的是欧氏距离,但也可以是其他类型的距离度量。K-means算法的执行过程通常包括以下几个步骤:
(1)初始化:选择K个初始聚类中心
在算法开始时,需要随机选择K个数据点作为初始的聚类中心。这些初始聚类中心的选择对最终的聚类结果有一定的影响,因此在实际应用中,通常会采用一些启发式的方法来选择较好的初始聚类中心,如K-means++算法。
(2)分配:将每个数据点分配给最近的聚类中心
对于数据集中的每个数据点,计算其与每个聚类中心的距离,并将其分配给距离最近的聚类中心。这一步通常使用欧氏距离作为距离度量,计算公式如下:
(3)更新:重新计算每个聚类的中心
对于每个聚类,重新计算其聚类中心。新的聚类中心是该聚类内所有数据点的均值,计算公式如下:
(4)迭代:重复分配和更新步骤,直到满足终止条件
3. 回归方法
回归方法可以通过建立数据的回归模型,预测数据的趋势和范围,将超出预测范围的数据点视为异常值。最常见的是使用线性回归模型,根据已知的数据点建立回归方程,然后预测未知数据点的值。如果某个数据点的实际值与预测值相差较大,那么可以认为它是异常值。
在分析数据不合理值时,需要结合统计方法和实际业务情况进行人工处理。例如,可以计算数据的均值、中位数、标准差等统计量,判断数据点是否超出了合理的范围。同时,还需要结合业务知识,了解数据的实际含义和可能的取值范围,对异常值进行合理的判断和处理。
例如某电商公司,记录了每天的订单金额数据。
首先,计算订单金额数据的均值、中位数和标准差。假设经过计算,订单金额的均值为 500 元,中位数为 480 元,标准差为 150 元。
根据统计学的经验法则,通常认为数据落在均值加减三个标准差范围内是比较合理的。即 [500 - 3×150, 500 + 3×150] = [50, 950]。如果发现有订单金额数据为 1500 元,那么这个数据点就明显超出了合理范围。
(四)数据字段格式问题处理
1. 确定正确的数据字段格式
在处理数据字段格式问题时,首先需要确定正确的数据字段格式。不同的数据类型有不同的格式要求,例如日期字段通常需要按照特定的格式进行存储,如 “YYYY-MM-DD”。数字字段可以分为整数、小数等不同类型,这就需要根据实际情况进行处理。文本字段也需要注意字符编码、大小写等问题。
通过对数据的元数据进行分析,可以了解每个字段的正确格式要求。同时,可以抽取一部分数据进行人工查看,确定哪些字段需要进行格式转换或清洗。
2. 清洗文本格式
清洗文本格式是处理数据字段格式问题的一个重要方面。去除多余的空格、特殊字符、标点符号等格式问题可以提高数据的质量和一致性。
可以使用正则表达式等工具来去除文本中的特殊字符和标点符号。例如,使用 Python 的正则表达式模块,可以定义一个正则表达式模式,匹配除了字母和数字以外的所有字符,然后用空字符串替换这些字符,从而去除特殊字符和标点符号。
去除多余的空格可以使用字符串处理函数。例如,在 Python 中,可以使用strip()函数去除字符串两端的空格,使用replace()函数去除字符串中的多个连续空格。
三、高效的数据清洗方法
其实,在数据清洗过程中,可以通过封装函数和使用pipe()方法串联起来,形成数据清洗的标准模板,从而提高数据清洗的效率和准确性。
1. 去除缺失值和重复值
对于缺失值的处理,可以采用多种方法。如果数据集中存在少量缺失值,可以选择直接删除含有缺失值的记录。但如果缺失值较多,简单删除可能会影响数据的完整性。这时,可以考虑用中位数、平均数或众数来填充缺失值。例如,对于数值类型的特征值,可以使用中位数填充,就像这样:
def fill_missing_values_num(df, col_name):
val = df[col_name].median()
df[col_name].fillna(val, inplace=True)
return df
对于离散类型的缺失值,可以用众数填充:
def fill_missing_values_cate(df, col_name):
val = df[col_name].value_counts().index.tolist()[0]
df[col_name].fillna(val, inplace=True)
return df
对于重复值的处理,可以使用drop_duplicates()方法。将这些处理步骤封装成一个函数:
def fill_missing_values_and_drop_duplicates(df, col_name):
val = df[col_name].value_counts().index.tolist()[0]
df[col_name].fillna(val, inplace=True)
return df.drop_duplicates()
2. 转换数据类型
在使用pandas处理数据时,经常会遇到数据集中的变量类型被自动变成object的情况。这时可以使用convert_dtypes来进行批量的转换,它会自动推断数据原来的类型,并实现转换。同时,可以打印出里面各列的数据类型,方便查看和检查数据的正确性。以下是封装成函数的代码:
def convert_dtypes(df):
print(df.dtypes)
return df.convert_dtypes()
3. 检测极值
对于极值的检测,可以通过箱型图或z-score方法。箱型图由最大值、上四分位数(Q3)、中位数(Q2)、下四分位数和最小值五个统计量组成,其中 Q1 和 Q3 之间的间距称为是四分位间距(IQR),通常样本中的数据大于 Q3 + 1.5IQR 和小于 Q1 - 1.5IQR 定义为异常值。以下是通过箱型图检测异常值的示例代码:
sample = [11, 500, 20, 24, 400, 25, 10, 21, 13, 8, 15, 10]
plt.boxplot(sample, vert=False)
plt.title("箱型图来检测异常值", fontproperties="SimHei")
plt.xlabel('样本数据', fontproperties="SimHei")
z-score是以标准差为单位去度量某个数据偏离平均数的距离,计算公式为:
outliers = []
def detect_outliers_zscore(data, threshold):
mean = np.mean(data)
std = np.std(data)
for i in data:
z_score = (i - mean) / std
if (np.abs(z_score) > threshold):
outliers.append(i)
return outliers
对待异常值,可以将其删除或者替换成其他的值,如上面箱型图提到的上四分位数或者下四分位数。以下是删除异常值的代码:
def remove_outliers1(df, col_name):
low = np.quantile(df[col_name], 0.05)
high = np.quantile(df[col_name], 0.95)
return df[df[col_name].between(low, high, inclusive=True)]
以下是替换异常值的代码:
def remove_outliers2(df, col_name):
low_num = np.quantile(df[col_name], 0.05)
high_num = np.quantile(df[col_name], 0.95)
df.loc[df[col_name] > high_num, col_name] = high_num
df.loc[df[col_name] < low_num, col_name] = low_num
return df
最后,将这些函数用pipe()方法串联起来,形成一个数据清洗的标准模板:
df_cleaned = (df.pipe(fill_missing_values_and_drop_duplicates, 'History').pipe(remove_outliers2, 'Salary').pipe(convert_dtypes))
通过这种方式,可以将数据清洗的各个步骤封装成函数,然后用pipe()方法串联起来,形成一个可重复使用的数据清洗标准模板,提高数据清洗的效率和准确性,为后续的数据分析和建模工作奠定坚实的基础。
综上所述,数据清洗在数据分析和企业决策中起着至关重要的作用。企业若想在数字化时代实现精准决策和高效运营,离不开高质量的数据支撑,而数据清洗正是确保数据质量的关键环节。说实话,数据清洗是一项复杂而又关键的工作,需要企业各方面的合力。只有公司高层、IT人员和业务部门共同发力,建立正确的数据清洗流程和方法,才能为企业的数据分析和决策提供高质量的数据支持。
想要进一步了解企业数据清洗和治理方法的,可以点击链接进行咨询,解决数据处理过程中的难题!https://s.fanruan.com/upmfv 帆软通行证登录