我想写一点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


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

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

这下,各个产品(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)

这样事情就变的清楚多了,从这张图中我们可以知道产品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,评分最高排名为10str(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)

如果拿上图同前面的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

R在市场调查中的应用--主成分分析相关推荐

  1. R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型、分类预测器(分类变量)被自动替换为一组虚拟编码变量、summary函数查看检查模型、使用table函数计算混淆矩阵评估分类模型性能

    R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型(Logistic regression).分类预测器(分类变量)被自动替换为一组虚拟编码变量.summary函数查看检查模型.使用t ...

  2. R可视化ggplot2中绘制趋势线

    R可视化ggplot2中绘制趋势线 目录 R可视化ggplot2中绘制趋势线 添加线性趋势线 添加线性趋势线并指定置信区间

  3. r语言中调用c 程序,如何在R程序包中调用C函数

    程序包名称为pareto.这是.c文件中src目录:如何在R程序包中调用C函数 #include #include #include "Rinternals.h" #include ...

  4. 在R语言环境中无法载入rJava包的解决办法

    问题描述: 安装包xlsx包后,运行library("xlsx")后弹出错误窗口: RGui (64-bit): Rgui.exe - 系统错误 无法启动此程序,因为计算机中丢失 ...

  5. r语言mfrow全程_如何使用R完成文章中图片处理小教程

    一起成长的经历 - 技术服务  课程定制 - - 如何使用R完成文章中图片处理小教程 - Two Histograms with melt colors 柱状图显示数值变量的分布.这篇文章解释了如何在 ...

  6. r roc函数_如何处理R(pROC包)中的多类ROC分析?

    例如,当我在R(pROC包)中使用multiclass.roc函数时,我训练了随机森林的数据集,这是我的代码: # randomForest & pROC packages should be ...

  7. python随机森林库_随机森林库:R和Python中的不同结果

    下面的代码用R和python训练一个随机森林模型.正如您所注意到的,R(1-0.27=0.73)中的精度要比Python中的(0.69)好.此外,特性在R和Python中的重要性是不同的.在 [EDI ...

  8. R语言使用psych包进行主成分分析PCA和探索性因子分析EFA的常用函数介绍:principal、fa、fa.parallel、factor.plot、fa.diagram、scree

    R语言使用psych包进行主成分分析PCA和探索性因子分析EFA的常用函数介绍:principal.fa.fa.parallel.factor.plot.fa.diagram.scree 目录

  9. android studio有时候r.id找不到,Android Studio:R.id.editText中的错误

    Im新的Android Studio和Android开发.所以我按照developer.android.com给出的教程,我在这一行中有一个错误:EditText editText = (EditTe ...

最新文章

  1. QIIME 2教程. 16纵向和成对样本比较q2-longitudinal(2020.11)
  2. OpenCV meanshift目标追踪
  3. Page.LoadTemplate的使用
  4. 为什么我认为现阶段HIDS处于攻防不对等的地位?(ids、nta、绕过)
  5. docker 代码中的文件路径_docker修改默认存储路径
  6. Win7如何修复开机画面
  7. python基础:集合(set)
  8. 使c语言程序变成流程图的软件6,下载_AutoFlowchart(C语言流程图生成器) V3.5.3 英文版_6z6z下载站...
  9. dnastar拼接反向互补序列_DNAstar 教程
  10. matlab进行多光栅衍射仿真,光栅衍射MATLAB仿真.docx
  11. android webp格式的图片,Android应用中对webp格式图片的处理
  12. 水星d128路由器虚拟服务器,幻影D128路由器怎么设置?
  13. LaTeX系统找不到指定文件解决方案
  14. OpenCASCADE开发环境搭建之OCCT库编译
  15. 我最爱的超女-琪琪格
  16. js正则只能匹配正整数或零
  17. 实战篇:手动编译安装微软 Linux 开源版 CBL-Mariner
  18. UIKit 力学教程
  19. html从入门到精通胡菘,高职电商网页设计教学实践(共2831字).doc
  20. cocos2dx 网上资源

热门文章

  1. 智能手机销售网后台管理系统手机销售网程序设计
  2. 6月30日,入职感悟、未来规划、本周工作总结,记录印象深刻的BUG。
  3. 计算机进位制转换方法,进位计数制及其转换方法过程详解
  4. python运维工程师前景及待遇_做运维工程师有前途吗?
  5. [bzoj1003]物流运输trans
  6. android layout文件夹下新建子文件夹 及解决文件夹爆红
  7. 2022苹果春季发布会带来新款iPhoneSE价格预计2500左右
  8. 小米手机风筝守护显示服务器异常,风筝守护只能小米用吗
  9. PCB电路板去耦电容配置原则有哪些?
  10. DataX系列8-HdfsWriter介绍