整理下到目前的情况:
我们有一份包含了街区名称、面积、总价、楼层、装修程度和每平米单价的房源信息,其中各项根据现实中的情况,认为有关联的如下
其中总价与面积关联程度最高,为正向线性关系,通过昨天的计算得到了线性模型的残差值
现在,我们面临的问题是装修程度中有将近1/4是未知项(7 of 33),希望通过其他相关的信息推测出这些未知项应当划分到高配还是低配,这就变成了一个分类问题
现在我们拥有的推测条件有:
1) 当总价中排除了面积的主要影响后,得到的残差列,这列为数值型
2) 小区名称,这列为分类型
这时就出现了两种思路,如果我们使用贝叶斯分类器来解决这个问题,就需要把残差列的数值划分成分类型变量,这个叫离散化;而如果采用逻辑回归,就要把街区按照某种规律编成数值,这个叫连续性指派
今天试第一种,残差列离散化,按篇幅估计贝叶斯分类要明天写了
先用hist画个直方图,看看残差列的分布情况
hist(Table1$Cancha1)
零值附近的多,两头则少得厉害,这个形状用正常的等宽分箱肯定不合适,想想也知道直接等宽的话分出来得有多不均匀,看来还是得先分成比较小的组再做合并,比如,先用等宽分成12段,函数名seq ——由于包括了首尾,所以长度设为13
接下来这段可能我用的法子不太好,不过看在能做出来的份上就这样了吧,每一步的具体意思请看注释
x <- rep(Table1$Cancha1,each=12) #把残差列每个值重复12遍
y <- ifelse(x>=Group1[1:12],1,0) #跟分组比较大小
dim(y) <- c(12,33) #上面结果划分成12行33列的矩阵
GroupNo1 <- apply(y,2,sum) #矩阵每列求和得到33个残差对应的分组号
看下等宽分成12组的情况:
呵呵,够不均匀的,头尾两端数据都太少了,咱适当合并一下吧
levels(GroupNo1)<-list("1"=c("1","2","3"),"2"="4","3"="5","4"="6","5"="7","6"=c("8","9","11","12"))
可以把对应的Group1数值也整理下
由于想要结合下装修情况,看看目前分组是否合适,所以把这两列合并到一个表格做了计数分析
按实际情况来说,一般高配的装修总归会应该要贵一点,对应的残差值应该也会属于更高的分组,所以,这里用每列中高配的个数/每列总数,看看各分组情况
各分组高配所占比例的图表:
虽然感觉教科书在这个地方给的方法有点不太能理解,不过既然做都做到这儿了,我还是进行到底吧
接下来的切割原则是,当分组对应的比例逐渐变小降到最低点时,此处作为新的切割点,照这逻辑,应该是234合并、56合并吧
levels(GroupNo1)<-list("1"="1","2"=c("2","3","4"),"3"=c("5","6"))
就三个组了,不过还是再画个图,反正就一行代码偷懒也没啥意思
plot(z1[2,]/apply(z1,2,sum),type="l")
虽然不是太有自信,但是还是先按照这个方式把残差列分成3组吧,把分组号GroupNo1添加到总表上,存档,今天到此结束,收工