我想写一点R在市场分析中的应用,一方面巩固自己对Chris Chpaman的《R for Marketing Research》(见参考1)的学习记忆,同时我也会用自己新近学习的数据处理技巧来重演书中的一些话题,尽量保证使用最新、最常用的R包。接下来,我还会围绕市场调查这一主题陆续地写一些文章。


  • 1主成分分析PCA即其应用场景
  • 2观察数据和整理数据
  • 观察数据
  • 整理数据
  • 3数据可视化
  • 4主成分分析的应用

  • 5对非度量数据的降维度处理
  • 参考文献


1主成分分析(PCA)即其应用场景

本文章偏应用,所以不会展示太多的关于PCA的技术细节。如果你对PCA的具体算法感兴趣的话,建议你看一下这篇文章。如果要简单地概括一下PCA的话,可以把PCA理解为一种减少数据维度的方法。有时候我们的数据包含了很多变量,但是有些变量之间存在着很强的相关性,所以完全可以用新的维度来替代原有的维度,来减少数据的复杂程度,以便我们跟好地理解和可视化数据。通过PCA改变数据的维度,让新生成的几个维度(主成分)尽可能地保留了原有维度的方差,这样只需要几个维度就能大致还原原有数据的信息。
我们在做问卷调查的时候经常会使用一些客户满意度的调查,即客户对某一产品的某一项指标的主观评分。这些评分可以用来帮我们比较各种产品的优劣,同时也能为我们在改善产品对客户满意度时提供相应的数据支撑。在实际的应用中,你或许可以这样设计问卷的问题:
“请问您会给a产品的潮流度打几分(1到10分)?”
当然为了方便比较,你也会对产品b,c.etc进行相同的调查,同时除了产品的潮流度,你也可以增加其它度评分项。下面我们会利用一个假想的数据(见参考1),来演示一下之后的一系列的操作,从数据的清洗、整理到可视化,再到建模。

2观察数据和整理数据

观察数据

下面我们将会:

  • 用read_csv()获取所在url的csv数据。
  • str()确定数据的结构,summary()查看数据的统计概况,用dim()来确定维度。
  • 用head()查看头6行数据,如果你使用Rstudio作为你的集成开发工具的话,可以使用View()函数来查看数据。
#获取训练数据
library(readr)
brand.rating<-read_csv("http://r-marketing.r-forge.r-project.org/data/rintro-chapter8.csv") 

#str(brand.rating)
#summary(brand.rating)
dim(brand.rating)#是一个1000*10的数据表

head(brand.rating)#查看数据表的前6行

整理数据

有时候,我们需要把很多变量合并成一个变量,即把数据表变成一个长数据表,结合ggplot2的facet.wrap()就能同时查看某一产品在不同维度上对表现。
下面我们将会使用tidyr包(整理数据的神奇)中的gather()进行合并变量。

library(dplyr)
library(tidyr)
newdata<-brand.rating%>%
  gather(key=VAR,value=rating,-brand)#把各个评分项目合并成一列

str(newdata)#数据从原来的1000*10变成了9000*3(除去branding一项

3数据可视化

用数据可视化的技巧让数据说话往往是数据分析的精髓所在,这样可以方便把调查结果更好地展示给别人。
因为原有的数据量比较大,所以进行可视化前,首先对数据按产品进行合并整理分类,在用平均值来代替每个产品在不同维度对表现,这样就大大地减少了数据对复杂度,方便后面度可视化。下面,我们将会

  • 用dplyr包的group_by()进行分类。
  • 用summarise()结合mean()对分类好度数据取均值。
newdata_summary<-newdata%>%
  group_by(brand,VAR)%>%
  summarise(meanvalue=mean(rating))

str(newdata_summary)#变成了90*3的数据

下面我们应用ggplot2让数据说话。不过数据可视化是一个很大的话题,如果想要深入了解,建议看一下ggplot2包的制作者Hadley Wickham的书(见参考3)。
其实你只需几行代码,就能得到下图的结果,这就是ggplot2的威力所在。

library(ggplot2)
p<-ggplot(newdata_summary,aes(x=brand,y=meanvalue))+
  geom_col(aes(fill=meanvalue))+facet_wrap(~VAR,nrow=3)

p

主成分分析 限制主成分数目 R语言 r进行主成分分析_数据可视化


虽然看上去还不错,但似乎还不够简练易懂。

# 让上图变的更为简练易懂
p<-p+scale_fill_gradient2( low = "blue",high = "red",mid = "white",midpoint = 5)+coord_flip()+labs(x=NULL,y=NULL,fill="Rating")
p

主成分分析 限制主成分数目 R语言 r进行主成分分析_PCA_02

这下,各个产品(a到j,在y轴)的各属性的平均得分(x轴)变的一目了然吧!

4主成分分析的应用

终于来到了这篇文章的中心内容。事实上,数据的前期处理往往会耗费大量的时间和精力。
下面我们将使用

  • slect()选取需要的变量。
  • prcomp()进行PCA的建模。
  • summary()对模型进行查看,重点看新生成度主成分对原有数据的还原程度–即保留方差的比例。
#use PCA
data_PCA<-select(brand.rating,-brand)#投入PCA模型之前,先把brand列去掉
head(data_PCA)

PCA<-prcomp(data_PCA)#因为原始数据度度量单位一样,所以不用使用scale参数,但是很多时候,各维度度单位会大不相同,这样度情况下就一定要对数据进行scale。 

summary(PCA)#重点看Proportion of Variance和Cumulative Proportion这两项,我前面说过了,方差代表了信息,所以这个比例越高对元数据的还原程度就越高,可以看到前三个大累计方差值接近7成,遂可以选取前三个作为主成分。
#再结合使用特征值来查看
sum(eigen(cor(data_PCA))$value>1)#有3个特征值大于1,所以一般选取前三个主成分即可
#用R自带的可视化工具对上面的结果进行可视化
biplot(PCA)#啥也看不清,但这个图后面还有用

因为数据太多,所以没办法直接获取太多有效信息,所以需要对原数据进行整理。

#用aggregate()让数据按brand项取均值
data_PCA2 <- aggregate(.~brand, data=brand.rating, mean)

#用brand添加rownames,方便后面可视化度呈现
rownames(data_PCA2)<-data_PCA2$brand

#去掉brand列
data_PCA2<-data_PCA2[,-1]

PCA2<-prcomp(data_PCA2)

biplot(PCA2)

主成分分析 限制主成分数目 R语言 r进行主成分分析_PCA_03

这样事情就变的清楚多了,从这张图中我们可以知道产品a、j比较有趣,b、c比较严肃刚好和a所处的位置相反。
但是还需要比较一下这张图和原来那张图有没有较大的出入,因为我们用每个产品的平均得分取代里原来的各个单一评分,然而由于有时候数据的形态不太正常,或者严重偏离“钟形”,那么平均值是不能够很好地反应原始数据的,相应地由此得到的知觉图也会和原始的大相径庭。

5对非度量数据的降维度处理

PCA能够在尽可能保留原始数据信息对情况下,减少数据对维度,但是又一个问题是,PCA不能用于对类似排名这样的非度量数据进行处理。我们在做市场调查或者别的问卷调查时,常常会进行如下设问:

“请您对以下产品的潮流度进行排序(从低到高):”

在这样对情况下,我们只能得到排名而非度量数据。我们可以使用多维尺度分析(MDS)来作为替代。不同于PCA,MDS通过计算数据之间的距离(比如欧几里得距离)来确定数据的相对位置,当然MDS也可用作对度量数据度处理,那种情况下一般都可以选用PCA,这里就不细说。
下面我们将

  • 用rank()把原变量转化为排名。
  • 用cluster包的daisy()来计算数据点之间对距离。
  • 用MASS包中的isoMDS() 进行建模。
data_MDS<-as.data.frame(lapply(data_PCA2,function(x)
  {ordered(rank(x))}))#和直观有所不同的是,评分最低排名为1,评分最高排名为10


str(data_MDS)

library(cluster)
data_MDS.dist<-daisy(data_MDS,metric="gower")


library(MASS)
data_MDS.r<-isoMDS(data_MDS.dist)#isoMDS()生成了有两个维度的数据表
#利用data_MDS.r进行数据可视化可视化
#先给数据增加一个产品名称的变量
data_MDS.r$brand<-letters[1:10]#原数据按“a-j”的产品顺序进行排列的,所以可以直接选取letters(26英文字母)的前10个作为每一个数据点的代替

ggplot(as.data.frame(data_MDS.r),aes(points.1,points.2))+geom_text(aes(label=brand),size=10)

主成分分析 限制主成分数目 R语言 r进行主成分分析_PCA_04

如果拿上图同前面的PCA的结果相对比,可以看到两图中数据点的相对位置还是类似的,比如a和j的位置相近,且在b、c的对面。

参考文献

1、Chris Chapman&Elea McDonnell Feit(2015)R for Marketing Research and Analytics,Springer
2、张洋(2013)PCA的数学原理:http://blog.codinglabs.org/articles/pca-tutorial.html
3、Hadley Wickham(2016)ggplot2 Elegant Graphics for Data Analysis second edition,Springer