作业用到的数据集:
链接: churn数据集
提取码:6666
这个数据集应该是记录用户特征与是否流失的数据集,今天使用churn数据集对数据进行预处理。
数据库中包含的大部分原始数据都是未经预处理、不完整且存在大量噪声的。
存在过时、冗余的字段
存在缺失值
存在异常值
数据格式不适合进行数据挖掘
数据不符合政策或者常识
因此,在进行数据挖掘之前需要进行数据清洗。
实际上,在实际操作中,数据清洗通常会占据分析过程的50%—80%的时间
R只支持单行注释,注释符号为 #
要打开数据集文件,可以使用绝对路径,但用过python编辑器,如pycharm或jupyter notebook就会明白,可以使用相对路径,但是使用相对路径就需要对当前工作路径搞清楚。
在Rstudio中,修改工作路径的文章already exists,please refer to the link:
Rstudio中修改工作路径的三种方法
下面展示my operation:
getwd() # output:"C:/Users/Jiacheng/Documents"
我在D盘下新建了一个文件夹用于存放数据集和代码,因此选择的是第二种global options设置
参阅:RStudio 清除历史记录,变量,窗口
abstract:
清空控制台:
Ctrl+L
清除变量历史记录
rm(list = ls())
churn=read.csv("datasets/churn.txt",stringsAsFactors=TRUE)
any(is.na(churn))
read.csv(“datasets/churn.txt”,stringsAsFactors=TRUE)
以CSV格式读取数据集文件,stringsAsFactors参数表示将字符串转化为factor,参见解释
is.na(churn)
返回和churn维度相同的dataframe,里面的值为布尔值,标志churn对应位置是否是空值
any(x)
判断表达式是否至少有一个为TRUE
出现了这个结果,说明churn里面每一个element都不是空值
美国各州的行政区简称参阅:百度百科
美国各州的地区码对应关系参阅:美国各州区号查询
美国各州与其地区码是一对多的关系,一个州可以有多个地区码,而一个地区码只能对应一个州。
参阅链接2,可知地区码415是加利福尼亚州的一个区号,而在数据中415却对应了堪萨斯州、俄亥俄州等,这里是明显的abnormal.
hist(churn$CustServ.Calls,xlim = c(0,10))
hist(churn$CustServ.Calls)
churn$CustServ.Calls表示将churn中的CustServ.Calls字段取出
hist函数用于绘制直方图,其中可以设置绘制范围、直方图cell的大小等
根据直方图可以看出,the number of calls to customer service在5、6、7、8、9次时,是离群点
churn$z_custcall=(churn$CustServ.Calls-mean(churn$CustServ.Calls))/sd(churn$CustServ.Calls)
list = which(churn$z_custcall>3 | churn$z_custcall< -3)
unique(churn[list,]$CustServ.Calls)
boxplot(churn$CustServ.Calls) # 绘制箱线图
boxplot()函数用于绘制箱线图
which()函数返回满足条件表达式的行的行号
unique()函数返回切片后取CustServ.Calls列中不重复出现的特征值
z-score的公式如下图:
在z-score标准化后,可以假定数据服从标准正态分布,根据3-σ准则,可以认为大于3或者小于-3的值是离群点。
箱线图的原理是数据的四分位数,如下图所示:
在使用箱线图对离群点进行检测时,计算四分位数:Q1,Q2,Q3 分别是25%,50%,75%分位数,IQR=Q3-Q1,小于Q1的1.5* IQR或者大于Q3的1.5* IQR ,判断为离群点。
z-score返回结果说明the number of calls to customer service在6、7、8、9次时是离群点。
由箱线图可知,the number of calls to customer service 在4、5、6、7、8、9次时是离群点。
根据两次结果和上一个题作比较,在上一题中得到的离群值5、6、7、8、9,其实是比较保守的主观估计,因为这里面没有引入定量的指标,完全依靠观测者的主观感受。在本题中z-score得到的离群点明显要少于上一题和箱线图的结果,这是因为离群点本身就会影响z-score中的均值的标准差,因此离群点的大小和数量是会对结果造成较大影响的。
因此,IQR方法判断离群点更加robust。
churn$z_daymins=(churn$Day.Mins-mean(churn$Day.Mins))/sd(churn$Day.Mins)
z-score原理在上面介绍过,不再赘述。
无
(a)计算day minutes的倾斜度
(b)计算day minutes进行z-score后的倾斜度,与上一个计算作比较
(c)根据之前计算的倾斜度,是否能认定day minute这个属性是倾斜的或者是近乎完美对称的。
3*(mean(churn$Day.Mins)-median(churn$Day.Mins))/sd(churn$Day.Mins)
3*(mean(churn$z_daymins)-median(churn$z_daymins))/sd(churn$z_daymins)
倾斜度的的定义为:
倾斜度大于0和小于0的两种情况如下图所示:
由结果可知在经过z-score前后,倾斜度的计算结果不变。由于倾斜度很小,仅为0.02左右,是可以认为它是完美对称的。
qqnorm(churn$z_daymins,
datax = TRUE,
col = "red",
#ylim = c(0.6931, 4.7875),
#main = "对数变换后的dist的Q-Q图"
) #画QQ图
qqline(churn$z_daymins,
col = "blue",
datax = TRUE)#画对比直线
QQ图是一种常见的用于衡量两个分布的相似性的方法,原理如下:
首先画出两个分布的CDF图,
如红色虚线所示,对于一个概率,得到这两个分布的分位数x0和y0,然后以(x0,y0)为坐标在QQ图中画一个点。
变化不同的概率,重复上述步骤,就可以得到不同的点,把这些点连接起来就是QQ图。
如果两个数据集的分布一致,画出的线是一条直线。
由上图可以看出,z-score后的day minutes的概率分布与标准正态分布的QQ图与一条直线很相像,故可以认为具有正态性。
(a)构建正态概率图
(b)是什么导致这个属性不服从正态分布的
(c)构建一个标志变量能够指示(b)中出现的这种情况
(d)对于非负的international minutes进行绘制正态概率图,判断其正态性
churn$z_IntlMins=(churn$Intl.Mins-mean(churn$Intl.Mins))/sd(churn$Intl.Mins)
# 进行z-score标准化
qqnorm(churn$z_daymins,
datax = TRUE,
col = "red",
#ylim = c(0.6931, 4.7875),
#main = "对数变换后的dist的Q-Q图"
) #画QQ图
qqline(churn$z_daymins,
col = "blue",
datax = TRUE)#画对比直线
# 以上是绘制全部的qq图
qqnorm(churn$z_daymins,
datax = TRUE,
col = "red",
ylim = c(0, 3),
#main = "对数变换后的dist的Q-Q图"
) #画QQ图
qqline(churn$z_daymins,
col = "blue",
datax = TRUE)#画对比直线
# 以上只对y>0的地方进行绘制
无
对Intl.Minsz-score标准化后,绘制的QQ图如下图所示:
(b)可以从第一张图看出,在真实数据中有太多的离群点,造成这样的原因是有相当一部分人几乎不打国际电话。但是这种看似是“离群点”,其实它却对数据后面的部分符合正态分布做出了不小的贡献。
©可以用离群点占总点数的比例来看,根据比例来对离群点的严重情况进行处理。如可以利用3-σ准则,如果离群点的数量超过了3-σ准则所规定的,那么就要进行进一步的处理了。
(d)仅显示非负部分的QQ图可以看到数据与正态分布拟合得很好。
churn$z_netmins=(churn$Night.Mins-mean(churn$Night.Mins))/sd(churn$Night.Mins)
boxplot(churn$z_netmins)
无
使用箱线图对标准化的值进行范围显示,按照箱线图的理论,在最上下两根线之间范围内的值为正常值,之外的都是离群值。