数据清洗和规整要依据实际数据的特征进行,其包括缺失值和冗余值的处理、数据重归类、字符类型转换等。这里将使用“狗熊会”的基础案例 “高考填报志愿,你选好了吗?”的数据进行介绍。该案例用于预测高校录取分数线的相关影响因素,因变量为x2015年平均线。
数据下载链接:http://mp.weixin.qq.com/s/8jkUfoK2_-VGntfVWjnp1A
一、数据读入与结构分析
将下载的数据转为文本格式并保存到目标文件夹下,然后读入数据,查看数据格式与内容。
>colleges<-read.csv("colleges.csv",stringsAsFactors=FALSE) #禁止将所有字符转换为因子,以方便后续清洗和规整
>str(colleges) #查看数据结构与内容
由上可知,该数据包含1169条记录和13个变量,其中因变量 x2015年平均线 为字符型,需要转换为数值型:
>colleges$X2015年平均线<-as.numeric(colleges$X2015年平均线)
接下来,分别查看各字段,以确定是否需要进行清洗和规整。经分析,发现 所在地、隶属 字段中的字符不规范,要进行规整。
二、数据清洗与规整
1.所在地 数据清洗与规整
所在地 中存在冗余数据,要将多余的“市”删除
colleges$所在地<-gsub("市","",colleges$所在地) #将 所在地 中存在“市”替换成空(“”)
同时,由于 所在地 中的城市过多,且大部分城市出现频次很小,在进行分析的时候会造成因子数量过多,因此对这些城市按行政级别将城市进行归类,副省级及以上城市归为“特大城市”,省会城市及苏州、珠海划分为“大城市”,其余归为“中等城市”。
>lcity<-c("北京","上海","天津","重庆","广州","深圳","南京","武汉","沈阳","西安","成都","济南","杭州","哈尔滨","长春","大连","青岛","厦门","宁波")
>bcity<-c("石家庄","郑州","太原","合肥","长沙","南昌","福州","海口","南宁","贵阳","昆明","西宁","兰州","银川","乌鲁木齐","呼和浩特","拉萨","苏州","珠海")
>szd<-colleges$所在地 #将所在地 赋予szd
>for(i in 1:1169) #一共1169条记录,故要循环1169次
{
>ifelse(szd[i]%in%lcity,szd[i]<-"特大城市",ifelse(szd[i]%in%bcity,szd[i]<-"大城市",szd[i]<-"中等城市"))
} #如果第i条记录(城市)包含在lcity中,则将该条记录替换为“特大城市”,包含在bcity中,则替换为“大城市”,都不包含在上述两个向量中,则替换为“中等城市”
>colleges$所在地<-szd #将所在地 中的值用szd替代
2.隶属 数据清洗与规整
隶属 数据中包含了所在地与机构,而上述所在地已经可以体现出所在地的影响,因而我们要对冗余数据进行清理,仅突出隶属级别上的差异。如福建省教育厅与甘肃省教育厅同属于“教育厅”,无需凸显其所在地。
>ls<-colleges$隶属
>for(i in 1:1169)
{
>ifelse(substr(ls[i],nchar(ls[i])-2,nchar(ls[i]))=="教育厅",ls[i]<-"教育厅",ls[i])
} #截取ls中第i个记录,由倒数第三个(nchar(ls[i])-2)开始截取字符,若截取下的字符为“教育厅”,则将该记录替换成“教育厅”,否则不变。
此外,还需将北京、上海、天津、重庆等直辖市教育委员会与教育厅同级,也需修改为教育厅。
>for(i in 1:1169)
{
> ifelse(substr(ls[i],1,2)=="北京",ls[i]<-"教育厅",ls[i])
} #从=截取ls中第i个记录的前两个,若为北京,则替换为教育厅,上海、天津、重庆也是如此。
还有一些个别的为省份的,如广东、河北省的记录也替换为教育厅。
3.将数据类型转换为因子
>colleges<-colleges[,-1] #大学名称 相对于id,故去除该字段
地址 字段无用也剔除,将所在地、隶属、类型等转换为因子
>colleges[1:2]<-lapply(colleges[1:2],factor) #同时将处于1,2两个位置的所在地和隶属转换为因子
查看数据结构,可见此时个字段的因子数量要比为处理前少许多
三、建立回归模型
1.查看缺失值
通过查看各自的数据,发现仅 x2015年平均线 中存在缺失值,且缺失值超过60%(736/1169)
因变量缺失的记录数要远多于因变量无缺失数,此时对缺失的因变量进行插补将影响到整体数据的真实性,故直接删除因变量缺失的记录
>colleges1<-colleges [!is.na(colleges$X2015年平均线),] #删除平均线缺失的记录
>ts<-lm(colleges1$X2015年平均线~.,data = colleges1) #以x2015年平均线为因变量,其余全部字段(.)为变量建立回归模型
>summary(ts) #查看回归模型
残差
R