如何使用R语言解决可恶的脏数据

本文详细介绍了在数据分析过程中处理脏数据的方法,包括缺失值、异常值与数据不一致性。针对缺失值,文章提供了缺失值识别与处理的策略,如剔除、用众数或均值替换以及多重插补法。对于异常值,通过绘制箱形图识别离群点,并讨论了离群点的处理方法,包括剔除和替换。数据不一致性则可通过数据变换解决。本文旨在帮助数据分析人员有效处理脏数据,提升数据质量。

在数据分析过程中最头疼的应该是如何应付脏数据,脏数据的存在将会对后期的建模、挖掘等工作造成严重的错误,所以必须谨慎的处理那些脏数据。

脏数据的存在形式主要有如下几种情况:

1)缺失值

2)异常值

3)数据的不一致性

下面就跟大家侃侃如何处理这些脏数据。


一、缺失值

缺失值,顾名思义就是一种数据的遗漏,根据CRM中常见的缺失值做一个汇总:

1)会员信息缺失,如身份证号、手机号、性别、年龄等

2)消费数据缺失,如消费次数、消费金额、客单价,卡余等

3)产品信息缺失,如批次、价格、折扣、所属类别等

根据实际的业务需求不同,可以对缺失值采用不同的处理办法,如需要给会员推送短信,而某些会员恰好手机号不存在,可以考虑剔除;如性别不知道,可以使用众数替代;如年龄未知,可以考虑用均值替换。当然还有其他处理缺失值的办法,如多重插补法。下面以一个简单的例子,来说明缺失值的处理。


#模拟一批含缺失值的数据集

set.seed(1234)

Tel <- 13812341000:13812341999

Sex <- sample(c('F','M'), size = 1000, replace = T, prob = c(0.4,0.6))

Age <- round(runif(n = 1000, min = 18, max = 60))

Freq <- round(runif(n = 1000, min = 1, max = 368))

Amount <- rnorm(n = 1000, mean = 134, sd = 10)

ATV <- runif(n = 1000, min = 23, max = 138)

df <- data.frame(Tel = Tel, Sex = Sex, Age = Age, Freq = Freq, Amount = Amount, ATV = ATV)


上面的数据框是一个不含有任何缺失值的数据集,现在我想随机产生100个缺失值,具体操作如下:


#查看原始数据集的概要

summary(df)

0?wx_fmt=png
#随机参数某行某列的下标

set.seed(1234)

i <- sample(1:6, size = 100, replace = T)

j <- sample(1:1000, size = 100)

#将下标组合成矩阵

index <- as.matrix(data.frame(j,i))

#将原始数据框转换为矩阵

df <- as.matrix(df)

#将随机参数的行列赋值为NA

df[index] <- NA

#重新将矩阵转换为数据框

df2 <- as.data.frame(df)

#变换变量类型

df2$Age <- as.integer(df2$Age)

df2$Freq <- as.integer(df2$Freq)

df2$Amount <- as.numeric(df2$Amount)

df2$ATV <- as.numeric(df2$ATV)

#再一次查看赋予缺失值后的数据框概要

summary(df2)

0?wx_fmt=png

很明显这里已经随机产生100个缺失值了,下面看看这100个缺失值的分布情况。我们使用VIM包中的aggr()函数绘制缺失值的分布情况:


library(VIM)

aggr(df2, prop = FALSE, numbers = TRUE)

0?wx_fmt=png
图中显示:Tel变量有21个缺失,Sex变量有28个缺失,Age变量有6个缺失,Freq变量有20个缺失,Amount变量有13个缺失,ATV有12个缺失。

为了演示,下面对Tel变量缺失的观测进行剔除;对Sex变量的缺失值用众数替换;Age变量用平均值替换;Freq变量、Amount变量和ATV变量用多重插补法填充。


#剔除Tel变量的缺失观测

df3 <- df2[is.na(df2$Tel)==FALSE,]

#分别用众数和均值替换性别和年龄

#性别的众数

Sex_mode <- names(which.max(table(df3$Sex)))

#年龄的均值

Age_mean <- mean(df3$Age, na.rm = TRUE)

library(tidyr)

df3 <- replace_na(df3,replace = list(Sex = Sex_mode, Age = Age_mean))

summary(df3)

0?wx_fmt=png
这个时候,Tel变量、Sex变量和Age变量已不存在缺失值,下面对Freq变量、Amount变量和ATV变量使用多重插补法。

可通过mice包实现多重插补法,该包可以对数值型数据和因子型数据进行插补。对于数值型数据,默认使用随机回归添补法(pmm);对二元因子数据,默认使用Logistic回归添补法(logreg);对多元因子数据,默认使用分类回归添补法(polyreg)。其他插补法,可通过?mice查看相关文档。


library(mice)

#对缺失值部分,进行5次的多重插补,这里默认使用随机回归添补法(pmm)

imp <- mice(data = df3, m = 5)

#查看一下插补的结果

imp$imp

#计算5重插补值的均值

Freq_imp <- apply(imp$imp$Freq,1,mean)

Amount_imp <- apply(imp$imp$Amount,1,mean)

ATV_imp <- apply(imp$imp$ATV,1,mean)


#并用该均值替换原来的缺失值

df3$Freq[is.na(df3$Freq)] <- Freq_imp

df3$Amount[is.na(df3$Amount)] <- Amount_imp

df3$ATV[is.na(df3$ATV)] <- ATV_imp


#再次查看填补完缺失值后的数据集和原始数据集概况

summary(df3)

summary(df2)

0?wx_fmt=png
通过不同的方法将缺失值数据进行处理,从上图可知,通过填补后,数据的概概览情况基本与原始数据相近,说明填补过程中,基本保持了数据的总体特征。


二、异常值

异常值也是非常痛恨的一类脏数据,异常值往往会拉高或拉低数据的整体情况,为克服异常值的影响,我们需要对异常值进行处理。首先,我们需要识别出哪些值是异常值或离群点,其次如何处理这些异常值。下面仍然以案例的形式,给大家讲讲异常值的处理:

1、识别异常值

一般通过绘制盒形图来查看哪些点是离群点,而离群点的判断标准是四分位数与四分位距为基础。即离群点超过上四分位数的1.5倍四分位距或低于下四分位数的1.5倍四分位距。

例子:

#随机产生一组数据

set.seed(1234)

value <- c(rnorm(100, mean = 10, sd = 3), runif(20, min = 0.01, max = 30), rf(30, df1 = 5, df2 = 20))

#绘制箱线图,并用红色的方块标注出异常值

library(ggplot2)

ggplot(data = NULL, mapping = aes(x = '', y = value)) + geom_boxplot(outlier.colour = 'red', outlier.shape = 15, width = 1.2)

0?wx_fmt=png
图中可知,有一部分数据落在上四分位数的1.5倍四分位距之上,即异常值,下面通过编程,将异常值找出来:


#计算下四分位数、上四分位数和四分位距

QL <- quantile(value, probs = 0.25)

QU <- quantile(value, probs = 0.75)

QU_QL <- QU-QL

QL;QU;QU_QL

0?wx_fmt=png

2、找出异常点

which(value > QU + 1.5*QU_QL)

value[which(value > QU + 1.5*QU_QL)]

0?wx_fmt=png
结果显示,分别是第104、106、110、114、116、118和120这6个点。下面就要处理这些离群点,一般有两种方法,即剔除或替补。剔除很简单,但有时剔除也会给后面的分析带来错误的结果,接下来就讲讲替补。

#用离异常点最近的点替换

test01 <- value

out_imp01 <- max(test01[which(test01 <= QU + 1.5*QU_QL)])

test01[which(test01 > QU + 1.5*QU_QL)] <- out_imp01


#用上四分位数的1.5倍四分位距或下四分位数的1.5倍四分位距替换

test02 <- value

out_imp02 <- QU + 1.5*QU_QL

test02[which(test02 > QU + 1.5*QU_QL)] <- out_imp02


#对比替换前后的数据概览

summary(value)

summary(test01)

summary(test02)

0?wx_fmt=png

三、数据的不一致性

数据的不一致性一般是由于不同的数据源导致,如有些数据源的数据单位是斤,而有些数据源的数据单位为公斤;如有些数据源的数据单位是米,而有些数据源的数据单位为厘米;如两个数据源的数据没有同时更新等。对于这种不一致性可以通过数据变换轻松得到一致的数据,只有数据源的数据一致了,才可以进行统计分析或数据挖掘。由于这类问题的处理比较简单,这里就不累述具体的处理办法了。

标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值