转自:丁点帮你
小伙伴们,不知道你有没有通过问卷来收集数据的经历?这两天有个师妹找我,想我帮她解决一些整理问卷数据时遇到的问题。
看了这批数据,我有几个心得想分享给大家。
做好问卷设计,事半功倍
多重线性回归,一般是指有多个自变量X,只有一个因变量Y。前面我们主要是以简单线性回归为例在介绍,两者的差距主要在于自变量X的数量,在只有一个X时,就称简单线性回归本次我们数据链接:
问卷中有一个问题是“去年您的家庭平均每人的年收入是多少?”,这是一道填空题,单位是元。
我看到的答案有如下几种类型:
35000,这种属于我们希望得到的完美的答案,大部分人是照这种格式写的;
但也有相当一部分人给出了3万5千、4万7千、3.5万、5.5万、3.5w、3w5、3-4万、6w-7w……这样的答案。
看到这些,我首先想到的是问卷的设计需要改进,一个好的问卷题目一定是既能保证问题表述精准并易于理解,同时又能够收集到格式统一的答案。
今天我们姑且不说问题表述得如何,只说这道题很明显无法收集到格式统一的答案,这给后期数据处理带来了很多麻烦。
站在答题者的角度,上面列出的各种答案基本都是符合题目要求的,但这并不符合研究者的预期。研究者不希望看到任何汉字、字母,只想要一个以“元”为单位的数字。
所以在设置答案的时候,很多研究者会设为选择题,比如下面这个问卷的问法:
如果想要获得准确的收入数值,那就应该在问卷中有清晰的标注,如在问题后面写一个说明:请填写具体数字,注意以“元”为单位;
或者把填空进行限定,如: 万 千 百 十 元;
采用问卷星等电子问卷时,还可以设置自动的逻辑查验,比如这个空只能填写1000以上的数字等;
此外,有时被调查者的文化程度、理解水平各不相同,为保证问卷质量,还可采用由调研员一对一调查并填写问卷的方法,此时需严格培训调研员。
千奇百怪的答案怎么快速整理好
多重线性回归,一般是指有多个自变量X,只有一个因变量Y。前面我们主要是以简单线性回归为例在介绍,两者的差距主要在于自变量X的数量,在只有一个X时,就称简单线性回归本次我们数据链接:
然而,对于师妹这套问卷,通过修改问卷设计来补救已经来不及了,我们只能运用软件来整理数据了。
首先,把汉字、英文字母都去掉,还记得我们讲过的gsub函数吗?这是一个很实用的替换函数。
如下面的三行代码分别将字符末尾的“万”、“w”、“千”都替换为了“什么都没有”。$表示字符末尾的意思。
注意,这里并不是替换为空格,而是什么都没有,相当于把末尾的“万”、“w”、“千”都删掉了。
关于gsub函数的更多详细介绍,可复习这篇文章:如何将杂乱的数据整理好(二) | 处理混乱的格式
data$income <-gsub('万$','',data$income )
data$income <-gsub('w$','',data$income )
data$income <-gsub('千$','',data$income )
像3万5千、3w5这样的答案,我们不能简单地直接删掉其中的“万”和“w”,而是应该替换为小数点,如下:
data$income <-gsub('万','.',data$income )
data$income <-gsub('w','.',data$income )
此时,3万5千、4万7千、3.5万、5.5万、3.5w、3w5、3-4万、6w-7w……
就变成了3.5,4.7,3.5……3-4,6-7。
接下来,我们处理3-4,6-7这种情况。其实在问卷调查时,应该尽量让被调查者回答具体的数值,如果实在不愿回答,那也应该问清楚,更接近3万,还是4万,还是3.5万?总之,要让被调查者自己确定一个数值。
但是如果我们已经无法追踪到被调查者,只能拟定一个合理的估计规则,比如取平均数,3-4就用3.5来代替。
但是,这样一个一个算又太麻烦了,下面一组代码可以帮我们解决这个问题。
其中的str_split函数很关键,顾名思义,它是用来分割字符的。
下面第二行代码的意思就是:以短横线‘-’为分割符号,将其前后的字符提取出来,形成两个单独的字符,然后将其中第一个字符赋值给data$incomelower。
# 分割字符
library(stringr)
data$incomelower <- str_split(data$income,'-',n=2,simplify = TRUE)[,1]
data$incomeupper <-str_split(data$income,'-',n=2,simplify = TRUE)[,2]
# 将字符转变为数值
data$incomelower <-as.numeric(data$incomelower)
data$incomeupper <-as.numeric(data$incomeupper)
# 计算均值,生成新变量shouru
data<-transform(data,shouru=ifelse(is.na(incomeupper),incomelower,
(incomelower+incomeupper)/2))
举个简单的例子,感受一下str_split函数的功能。
好了,现在各种各样的符号都解决掉了,然后把这些被删掉了“万”/“w”的数字都乘以10000。
注意原来填写正确的数据不能乘以10000。我们通篇查看了数据,发现原来填写正确的数据都是大于1000的,且剩下的经过上面一系列处理的数据都小于50。
也就是说,我们只需要对小于50的那部分数据乘以10000就可以了。
a<-which(data$income<50)
data[a,]<-transform(data[a,], income = income * 10000)
转自:“量化研究方法”微信公众号
如有侵权,请联系本站删除!