Beta

It’s a beautiful thing when free data meets free algorithm.

Rexer Analytics 关于数据挖掘的年度调查开始于 2007 年,本次(2010年)是第四次年度调查,原文链接在这里

调查的关键要点如下:

1.调查样本量

2010年前期,735个参与者,来自于60个国家

2.数据挖掘覆盖领域

数据挖掘覆盖很多领域,但CRM/Marketing在过去的几年一直排名第一。

3.涉及算法

决策树、回归、聚类是主要的使用方法,但其他算法也被广泛使用。虽然第一次涉及 Ensemble Models,但22%的人宣称正在使用。

4.模型

三分之一的建模人员使用了10个及以下的变量建模,同时28%的建模人员宣称模型一般使用45个以上的变量

5.工具

随着过去几年稳定的增长,开源数据挖掘软件R已经成为挖掘人员的首选(43%),其次是 STATISTICA(18%)。STATISTICA、IBM SPSS Modeler 和 R 在2009、2010年被参与调查的挖掘人员给了最高满意得分。

6.技能

数据挖掘依然主要发生在个人电脑上(而不是服务器),数据一般也是存储在本地。模型的结果依然主要依赖于软件本身。STATISTICA 用户比其他软件用户,更倾向于使用PMML标准。

7.挑战

脏数据,数据挖掘概念的普及、对数据的访问

8.未来

参与调研的人员对于数据挖掘还是非常乐观的。这个领域仍然有上升空间,只有13%的挖掘人员给自己的公司的分析能力评为“excellent”,只有8%的人认为他们的数据质量可以被认为“very strong”。

同往常一样,一些评论:
  1. 鉴于数据挖掘从业人员的总体数量,有735个样本已经很不错了。
  2. CRM/Marketing在中国国内也依然是数据挖掘最重要的应用领域。
  3. 比较惊讶的是,Ensemble Models 居然在国外的使用率已到到22%。
  4. 模型的变量问题是具体业务所决定,甚至是效率、成本的考虑,多少都是正常。
  5. R语言成为挖掘人员的首选工具是必然的(包括在 KDNuggets 上的调查也是如此)。当然如果从数据分析的本源出发的话,R语言有不可替代的天然优势。
  6. PMML标准依然可以在R语言上实现,感谢Graham Williams和他的同事。
  7. 挑战估计是每个挖掘从业人员都遇到过的问题,大家多多交流吧
  8. 数据挖掘的未来是美好的,毕竟我们生活的世界数据越来越多,扔在那儿太可惜了~~

集智俱乐部是我最近两年来比较关注的俱乐部,尤其集智在三号会所的线下活动,一帮来自五湖四海、背景迥异的年轻人,因为一个共同感兴趣的主题,各抒己见(头脑风暴),过程非常奇妙。至今依然清晰的记得第一次参加集智活动时,大家对超自然(超能力)现象的热烈讨论。说实话,当时刚听完报告,还以为进入一个邪教组织了,呵呵~~

2010年12月9日,集智俱乐部的 计算士 和 Jake 发布了头脑风暴论坛数据分析报告。报告很有趣,其中讲到了 Zipf 定律和以社会网络分析为主的网络骨架图。Jake 同时将头脑风暴论坛的数据发布,数据为XML格式文件。而我,恰恰对头脑风暴论坛的兴趣也是非常浓厚,所以这边本地将这些数据处理了一下(大家可参考这里),并作了一些简单分析同大家分享。

首先是头脑风暴论坛中最为关键的几个actors:

这里考虑了两个因素,网络的 Eigenvector Centrality 和 Betweenness Centrality(即vertex和edge信息),从上图看:jake 的地位最高,且Eigenvector和Betweenness相差较小;紧随其后的是东方隐,当然这个紧随其后是指相对概念。

由于 jake 的地位(重要到有点儿离群点的意思了),其他会员的状态不是很明显,所以考虑将 jake 这点去掉:

这样处理以后,除 jake 和 东方隐 以外的用户状态浮出。如果主观上增加“第二梯队”的概念(除去jake和东方隐两人,个人对头脑风暴论坛不是很熟悉,权且这么划分。当然也可以做个聚类啥的,不折腾了),那么属于这一梯队的ID包括

zcard2000、ruiaijun、黄淼鑫、计算士、Michael0607、天狮星11、飞鸟、yywwkk等。

问题来了,论坛上这些比较重要的actors是如何组织在一起(相互作用)的呢?

上图为重要节点的网络图,不难看出:jake 在头脑风暴论坛的地位是无可替代的,牢牢地占据论坛关系中最核心的位置,估计这种结构在COS论坛也同样存在,其中的核心不用我多言,哈~~

还有就是东方隐这个节点也非常有意思,需要关注。但详细的说明,这里就省略了,毕竟对头脑风暴论坛不像统计之都那么熟悉,硬搬着去解释,难免贻笑大方。简单陈述一下绘制关系图的原则:

  • 同计算士绘制的骨架图一样,这里也同样将一些不太重要的节点做了删除处理(subgraph),只留下了重要节点的骨架;
  • 骨架中的节点也并不是每一个都做了展示,而是通过 Eigenvector 和 Betweenness 的对比,将差异比较明显的节点做(名称)展示。而表示为红色的节点大小即为二者差异的大小。

写在最后

这篇文章实际上写的非常仓促,有很多细节考虑不是很完备,并且从数据上看,能够展现的也不止上面的一些信息(比如发帖时间的分析、还有一些条件密度类的内容,等等)。但与其无限期放在草稿箱里,不如直接放出来。因此这篇文章可能会有比较大的改动(主要是绘图部分),但什么时候,就不得而知了。如果有集智俱乐部的童鞋看到这篇文章的话,多多指正,并——欢迎在统计之都上讨论。

关于集智俱乐部

2003 年,集智俱乐部创始人张江(Jake)创办了集智俱乐部网站,该网站一直致力于宣传、普及、推广复杂系统科学,并展开广泛的跨学科交流,俱乐部渐渐聚集了一批有识之士。 5 年后的 2008 ,集智俱乐部的交流和活动开始从虚拟世界走向现实,并尝试发展一个现实世界中的学术组织。目前集智俱乐部的日常管理工作由集智核心成员负责,主要活动有开放式的讲座与交流,以及其它主题小组活动。……

前些天在准备中国第三届R语言会议(上海)的时候, 翻到以前记录在Google Notebook里的一些材料, 一篇是关于Google Codes关于R代码的规范,非常值得借鉴。

规范这个东西平时多多注意一些还是有好处的,就和作文一样,漂亮的字体总能有不错的加分。这里就不翻译原文了,摘一些 tips 供大家参考:

R风格规范

文件命名

以 .R 结尾的文件必须有实际意义,比如

GOOD: predict_ad_revenue.R 
BAD: foo.R

变量名和函数名

  • 变量名建议使用小写字母和dots,比如 variable.namevariableName 也是可以被接受的
  • 函数名起始字母为大写,不能包含dots,如 FunctionName

间隔和间距

  • 所有的二元运算符(=, +, -, <-, etc.)两端均需要有空格。
  • 不要在逗号前增加空格,但逗号后必须有一个

比如:

tab.prior <- table(df[df$days.from.opt < 0, "campaign.id"])
total <- sum(x[, 1])
total <- sum(x[1, ])
  • 在左括号前应增加空格,除了 function call 情况
1
2
3
4
5
# GOOD: 
if (debug)

# BAD:
if(debug)
  • 多余的空格是允许的,比如为了对齐增加可读性:

    plot(x = x.coord, y = data.mat[, MakeColName(metric, ptiles[1], "roiOpt")], ylim = ylim, xlab = "dates", ylab = metric, main = (paste(metric, " for 3 samples ", sep = "")))

大括号

左大括号不能独立成行,右大括号必须独立成行(除else情况),比如

if (is.null(ylim)) {
  ylim <- c(0, 0.06)
}

else情况的标准写法:

if (condition) {
  one or more lines
} else {
  one or more lines
}

行长度

不应超过80个字符

缩进

严格使用两个空格,不能使用 tabs

赋值

尽量使用 <-,而不要使用 =

一般性声明

如果我们遵循一致的声明,对代码的阅读和理解会更快更准确。这里包含

1. Copyright statement comment
2. Author comment
3. File description comment, including purpose of program, inputs, and outputs
4. source() and library() statements
5. Function definitions
6. Executed statements, if applicable (e.g., print, plot)

注释

  • 一定要注意在代码间增加你的注释。长注释以 # 开始,后跟一个空格
  • 短注释发生在代码后,两个空格间隔,# 开始,后跟一个空格
1
2
3
4
5
6
# Create histogram of frequency of campaigns by pct budget spent.
hist(df$pct.spent,
breaks = "scott", # method for choosing number of buckets
main = "Histogram: fraction budget spent by campaignid",
xlab = "Fraction of budget spent",
ylab = "Frequency (count of campaignids)")

函数定义

  • 函数的定义,优先无默认参数值的参数,有参数值的参数在后。
  • 每行一个参数是允许的,但有参数值的赋值不能断开。
1
2
3
4
5
6
# GOOD:
PredictCTR <- function(query, property, num.days,
show.plot = TRUE)
# BAD:
PredictCTR <- function(query, property, num.days, show.plot =
TRUE)

函数文档

  • 函数在定义完成之后需要紧跟注释内容
  • 注释内容包含一句话对函数的描述,每个参数(arguments)的描述,用 Args 表示;以及返回值的描述,用 Returns 表示。
  • 注释必须非常清楚,调用者可以不用读后续任何代码就可直接调用。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CalculateSampleCovariance <- function(x, y, verbose = TRUE) {
# Computes the sample covariance between two vectors.
#
# Args:
# x: One of two vectors whose sample covariance is to be calculated.
# y: The other vector. x and y must have the same length, greater than one,
# with no missing values.
# verbose: If TRUE, prints sample covariance; if not, not. Default is TRUE.
#
# Returns:
# The sample covariance between x and y.
n <- length(x)
# Error handling
if (n <= 1 || n != length(y)) {
stop("Arguments x and y have different lengths: ",
length(x), " and ", length(y), ".")
}
if (TRUE %in% is.na(x) || TRUE %in% is.na(y)) {
stop(" Arguments x and y must not have missing values.")
}
covariance <- var(x, y)
if (verbose)
cat("Covariance = ", round(covariance, 4), ".\n", sep = "")
return(covariance)
}

TODO注释

用于指明临时代码、短期解决方案或足够好但还不够完美的地方。username处写的是了解该问题详细情况的人的名字,并不是指实际解决该问题的人。因此,当你建立一个TODO时,写上你自己的名字就可以了。 例如:

1
# TODO(liusizhe): Remove this code after the NewService has been checked in.

R语言规范

attach

避免使用它

对象和方法

  • 在S语言体系下有两套对象的定义,S3和S4,且都可以在R中使用。
  • S3体系的方法更加灵活、交互性更好,S4更加正式和严格。两套体系方法可以参考这里
  • 尽量使用S3体系,除非有足够的理由使用S4
  • 绝对要避免混合使用 S3 和 S4 的情况

声明1:估计这篇博文的受众会很少很少……

声明2:请将下载的漫画于24小时内删除,balabala……

话说到,为了保护我已经不太好的视力,前几天购置了一台Kindle DX,用来阅读电脑上大量存在电脑中的的pdf格式电子书。这个东东确实比较强悍,除了对这些pdf文字书籍支持比较不错外(当然有些书籍需要进行一些处理),对pdf格式的漫画支持更赞。

而我是一个彻底的漫粉,闲暇之余,从网上下载jpg格式的漫画(推荐下载工具ComicAiII),悠然自得看漫画,实在惬意的很~~

不过,有些下载的漫画有些问题,比如下面的这种的:

如果直接合并为pdf在Kindle DX上阅读,纵向显示的话,上下各有很大一块白边,画面非常小;

如果横向显示,效果更差,底部有一部分不能显示。想看完两页漫画的话,需要向上下翻页反复操作:

琢磨来琢磨去,还是得手动把漫画裁剪为适合Kindle阅读的大小(Kindle DX的标准9英寸屏显示区域和32开纸大小接近),并且把裁剪后的漫画顺序调换(日本漫画的阅读习惯是从左向右)。

说白了需要对每页jpg漫画做两件事:
  • 从中间分割,将一张jpg图片变为两张;
  • 为左右两张子图的增加顺序标记。

如果将分割的两张图片,右边图增加_0,左边图增加_1,即可满足要求。拿上面的086.jpg举例:170页(即右边部分)会被命名为086_0.jpg,171页会被命名为086_1.jpg,由于有了0、1标记,这样所有更新过的jpg合并为pdf文件的话,即可保证顺序的正确。

这一过程使用ImageMagickR来实现(Windows XP平台):

假如你的火影忍者的目录为D:/漫画/Naruto04,文件为001.jpg、002.jpg……,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
setwd("D:/漫画/Naruto04")
dd <- dir()
ff <- function(x){
convert &lt;- paste("convert " , x ,
" -crop 2x1@ +repage +adjoin ",
"%d_",substr(x,1,3),".jpg",sep = '')
shell(convert)
reverse0 &lt;- paste("convert " , "0_", x ,
" ", substr(x,1,3), "_1.jpg", sep = '')
reverse1 &lt;- paste("convert " , "1_", x ,
" ", substr(x,1,3), "_0.jpg", sep = '')
shell(reverse0)
shell(reverse1)
shell(paste("del " ,"0_", x , sep = ''))
shell(paste("del " ,"1_", x , sep = ''))
shell(paste("del " , x , sep = ''))
}

for (j in dd) ff(j)
shell(paste('convert *.jpg ', '1.pdf',sep = ''))

注意:目标文件夹的所有文件将被替换!

最后要强调的是,虽然 Kindle 没有辐射,和一般的纸质书区别不大,但看多了仍然有损视力 ^_^

上周末一时无聊,跟朋友跑去看房子。回来总结一下,当作经验和大家分享一下。现在这年代,看房子主角向来都是职业顾问(俗称中介),跟中介打交道,斗智斗勇那是相当有意思!回想起来,看房子的过程,几乎可以说是一部部大片的集合!且请听我细细道来:

看房子的地带有些远,通州九棵树附近(北京除了五棵松以外,还有九棵树,囧)

因为不是自己买房子,所以心态比较随意。等我睡饱爬起,吃过早饭,收拾妥当已然11点有余。慢条斯理的奔向长椿街,记录了一下从长椿街到九棵树的地铁运行时间,差不多1小时。出轻轨,打黑车,果然被黑之,忍之……

奔向朋友看中的房子,留意了一下小区的环境——环境确实非常不错,低密度6层板楼,让人很放松的感觉。房主是个搞艺术的,内部装修非常有品位,当听到中介MM说物业费是每月0.9元时,我自己差点没忍不住,要出手。

警匪篇

我见到的第二波中介一行有5个,其中三个男的,各个满脸横肉,凶神恶煞一般,若不是说带我们去看房子,我还真把他们当成劫匪了。不过最让我纳闷的是,总共就我们3个看房的,来5个中介陪同,兴师动众。搞得卖房的业主开门时都愣了,明显提高了警觉(估计当时想的是不是抢劫)。

这段时间中介日子不好过,真热情啊~~

科技篇

第三波中介是店长加助理组合(一个中介店面会有3、4个店长),店长颇能侃,一边走一边胡扯,其实聊的和房子没点实际关系。更牛的是,最后一套房子也没给我们看,直接把我们忽悠到他店里了,现在想想也纳闷的很,怎么当时就听他的了。

最奇怪的是,进到他们的店里,我们3人的手机全没信号。本来,一路上不同的中介给我们通电话,突然手机没了信号,没有电话可接,相当不习惯。中介谈生意的手段非常高明:许诺我们中意的那套房子的业主30分钟必到,马上可以进入真刀真枪的划价阶段。然而30分钟过后……中介解释为:在路上,再等30分钟……又一个30分钟过去,中介解释:下班点,路上,有些堵(周日,囧),再等一刻钟……仍没到,解释:手机打不通了!不信你听听~~再等5分钟……演的真像,绝对不亚于我们敬爱的影帝爷爷。

就这样从4点半耗到了7点。事后我又看了看别人看房经历,发现中介店里都会有个房间可以屏蔽手机信号的,为什么把我们拉到店里,恐怕是不想让别的中介从抢走这单生意吧(高科技成就业务,真NB了)。

惊悚篇

第四波中介是两小伙儿,其中的一个文质彬彬,颇有好感。路上,聊到我们刚刚看的一套房子,中介告诉我们,那是小区里最便宜的一套。而后问我们,上一波的中介有没有告诉我们便宜的原因。当时我就冒疑问了,里面还有文章?

中介小伙儿说,你们没看到他们正对楼下的红垫子么?没觉得有问题?我心说了,估计可能要说屋里面有人去世之类的话题,不过也很正常么。但后来,中介小伙儿说的话还是让我打了个冷战:

“这楼下住了个老头,就一个人儿,有天直接挂在屋里了,但也没人知道。过了一个月,天气炎热,尸体腐烂,散发出恶臭才被邻居发现……后来医院过来人,整个楼都是福尔马林消毒水。上面的住户受不了,想快速出手……”

惊悚归惊悚,我其实是对着老头的子女是很有看法的。老头就一个人,不在身边照顾就罢了,电话也不勤着点打。真是林子大了,什么鸟都有。

后编

中介MM,中介GG都太牛了,坐在屋里谈费用的时候,手里只用一台20元的计算器完全搞定。嘴里还念叨着,这我们可以给你避税,这儿我们有优惠……

我还好事了一下,提议搞个Excel表,把房价输入,生成明细单,你我这边都省时间。结果被中介鄙视了一下,理由是周围政策环境变化是很快的,这东西只能装脑子里(言外之意,只能意会不能言传,额……)

据中介说,买房子有个费用叫“代书费”,是北京建委收的,收费的缘由是要求网签,而网签是由建委“代书”的,故要收这一笔。问题是,这笔费用不是常量,而是房价×0.5%,也是一笔不小的银子。我没忍住又好事了一把,搜了一下所谓的“代书费”,原来又是中介巧立名目。实际是“10元工本费和80元手续费”。

额,这中介也太无良了吧!

0%