注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

周庭锐教授的私人空间

你的心,创造你周围真实的世界。

 
 
 

日志

 
 
关于我

周庭锐,汉族,台湾籍。中国人民大学商学院营销系教授、博导。英国Warwick大学商学博士。详细履历请移步:http://www.yes-china.org/chou/。email:tingjui.chou@gmail.com

网易考拉推荐

真实世界里的统计分析  

2010-10-04 10:41:51|  分类: 营销精义 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
文\周庭锐

求学过程中最开心的几件事之一,是在英国Warwick大学读博士时,帮导师 Veronica 跑统计的往事。那回她和我的第二指导教授 Peter Doyle 做一个欧盟的项目,数据分析自然全是弟子服其劳,问题是,九成的变量关系都不显著,两位导师十分烦恼。正不知如何是好的时候,我提出了一番必须不显著才好的解释方针,当时年过六旬的 Peter 居然拍手一跃而起,大显茅塞顿开之快,而Veronica则当场掏出支票本,签了500英镑的赏银给我。这是我第一次认识到书中真是有黄金屋的,原来埋首电脑跑跑统计也可以挣钱!当然,只会跑统计还不大够,还要脑筋好使,能够解释数据结果才行。

那时用起SPSS简直已经出神入化了,几乎以为在统计学的范围内再没有能够难倒我的问题。很久以后才明白原来自己不过是只井蛙,而且还是生活在夜郎国里的那种劣等品种。首先遇到的困难是关于变量背后数据的统计分布问题。多变量统计推论的基础是大数法则下的中央极限定理,所假定的数据分布形态主要是正态分布,但是在真实世界里,在许多情形下是不能满足正态分布要求的。或者更精准地说,在人类社会里大多数情况下所观察到的数据形式,比较不会是正态分布形式。

满足正态分布的基本条件是对变量进行数值测量,所测量的对象必须随机抽取自母体,而且这抽取量还要巨大。其实这完全不符合人类的本能。对于任何事物,人类更擅长的是分别大小、喜好,直接进行选择,而不是主观地度量究竟有多大?有多喜欢?然后给出分数来。所以在问卷调查里要求人类对某些事项打分,完全违背人类行为的天性,即使勉强获得数据,信度一般也会很差。人类在一生之中,做得更多的也是选择。向左走还是向右走?此刻面对这篇无聊的文字,你是想到要为我打个分数呢?还是更直接一点,现在就逃开,或是继续往下看?

人类行为如此,研究人类行为所搜集到的数据自然也呈现着相同的特征。例如,零售消费数据库或是互联网行为数据库里的资料,大多是买/不买、要/不要、点击/没点击之类的二选一行为,或者是选一/选二/选三等多选一的问题,所纪录下来的消费行为数据呈现二项式或多项式分布的特征,自然不服从正态分布。又例如,长期观察到的消费者品牌转换行为,在同一品类下,不同品牌之间,在时间轴上的消费序列里,不断交替出现1或0(买或不买)的数据,这怎么可能会是正态分布呢!甚至那些经过内容分析得来的质性研究资料,主要也是以频次的形式存在,这些事后归纳出来的频次,自然也不会服从正态分布。SPSS对这类问题的处理能力极受限制。

事实上真正的大问题还在大量数据的处理效率上。如果我们决定顺应人类真实天性,放弃那以数百、数千样本量计算的问卷调查,改而观察人类那不断进行选择的行为,那么这数据量累积起来将会很可观,哦不,是很吓人!记得在很久很久以前初次接触到7-11便利店的数据时,那时台湾7-11的规模还只有现在的几分之一,营业一天的数据量已经高达几个G的大小,这样的数据量,如果还使用类似SPSS这种统计软件来进行分析,其实是很不现实的事。想想,如果分析的是中国移动的数据,注册用户6亿人,活跃用户2亿人,他们的手机音乐下载门户上随时有10万人在上面游荡,这样的分析规模,简直不可想像。

那么如何是好呢?其实也不困难,我主要是利用R软件,来进行这种大量离散数据的统计分析。这种大规模的离散数据,通常是使用机器自动获取的,日积月累的搜集后,一般贮存在类似甲骨文(Oracle)或MySQL这种大型数据库服务器里,这些数据库服务器自带对外界的数据传输介面(例如甲骨文用的是ODBC),我们只要在R里面通过这些介面,与数据库建立好传输通道,就可以直接对数据库进行各种标准的SQL存取,所存取的结果,可以使用R直接进行统计分析。

不过刚刚装好的R是不带数据库存取能力的,必须先加载一些函数库之后,才具备大规模数据挖掘的能力。我们在这里以MySQL为例,来说明一些基本观念与程序。首先需要安装DBI介面库,然后以此为基础,安装RMySQL库(如果使用ODBC,那么就安装RODBC库)。安装RMySQL库的前提是所使用的电脑里已经安装MySQL数据库服务器。其实ODBC也是一样的,假定电脑使用Windows操作系统,必须先从Oracle网站里下载ODBC驱动程序,然后在系统管理器里面建立好Windows与ODBC的联系。如果使用Linux系统就没这些麻烦啦,因为系统自带ODBC与MySQL的接口。

在上述前提已经齐备的情形下,打开R,键入如下命令:

> library(RMySQL)
选用RMySQL库

> drv<-dbDriver("MySQL")
指定使用MySQL驱动程序

> con<-dbConnect(drv, dbname='数据库名称', user='账户', password='密码', host='服务器地址')
取得与数据库的联系

> mydata<-dbGetQuery(con, 'select * from 栏位')
取得某栏位全部数据并指定给 mydata

> result<-dbGetQuery(con, 'SELECT parts.name, parts.description,
+ supplier.name AS supplier
+ FROM parts INNER JOIN
+ suppliers USING(supplierid)')
使用 supplierid 做为键值,来合并 parts 与 suppliers 两个数据表,并将结果指定给 result

> parts<-dbGetQuery(con,'SELECT * FROM parts')
> suppliers<-dbGetQuery(con,'SELECT * FROM suppliers')
> result<-merge(parts,suppliers,by='supplierid')
相同效果的另一种做法

> parts<-dbGetQuery(con,'SELECT * FROM parts')
> suppliers<-dbGetQuery(con,'SELECT * FROM suppliers')
> result<-data.frame(name=parts$name,price=parts$price,
+ supplier=factor(parts$supplierid,
+ levels=suppliers$supplierid,
+ labels=suppliers$name))
更细致的做法

将数据库里的数据指定给相应的变量后,剩下的分析就全是R的事了。例如对数据库里的顾客资料进行聚类分析,假定抓下来的数据库资料 data 里的栏位很多,但是我们只想利用其中的 fit1、fit2、与 fit3 等三个变量对所有样本进行分群,那么可以这么做:

> b<-data[,c('fit1','fit2','fit3')]
将这三个变量里的数据从 data 里面拆解出来,并指定给 b

> kb<-kmeans(b,2)
假定使用 kmeans 分成两群,并将分群结果指定给 kb

> for(i in 1:3) {
> fm<-t.test(b[,i] ~ kb$cluster)
> cat("\n","b$fit",i," ~ kb$cluster","\n")
> print(fm)
> print(summary(fm))
> }
分别利用 fit1、fit2、与 fit3 等三个变量来检查将样本分成两群是否分得显著,由于只分成两群,所以使用 t检定

> kb<-kmeans(b,4)
假定使用 kmeans 分成四群,并将分群结果指定给 kb

> for(i in 1:3) {
> fm<-anova(lm(b[,i] ~ kb$cluster))
> cat("\n","b$fit",i," ~ kb$cluster","\n")
> print(fm)
> print(summary(fm))
> }
分别利用 fit1、fit2、与 fit3 等三个变量来检查将样本分成四群是否分得显著,由于在这里分成四群,所以使用 ANOVA 来进行检定
  评论这张
 
阅读(2087)| 评论(4)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017