本节书摘来自华章计算机《大数据架构和算法实现之路:电商系统的技术实战》一书中的第3章,第3.2节,作者 黄 申,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
3.2 案例实践
3.2.1 实验环境设置
本节所要进行的实验内容是,根据商品的某些历史数据,发现影响转化率的因素,以及相应的权重。
和之前的实验一样,这里所用的数据,以及结论都是实验性质的,请根据自己的情况合理运用。不要将这些测试数据及其相关结论生搬硬套地实施到自己的项目中。
首先查看位于这里的数据文件:
在R中加载该文件:
> listing_for_prediction <- read.csv("/Users/huangsean/Coding/data/BigData
ArchitectureAndAlgorithm/Sales.Prediction.txt", stringsAsFactors = FALSE, sep='\t')
数据文件的部分内容如下:
> listing_for_prediction
ID Title CategoryID CategoryName OneMonthConversionRateInUV OneWeekConversionRateInUV
SellerReputation IsDeal IsNew IsLimitedStock TargetValue
1 22785 samsung 三星 galaxy tab3 t211 1g 8g wifi+3g 可 通话 平板 电脑 gps 300万像素 白色 15 电脑
0.021 0.022 3 0 0 0 0.032
2 19436 samsung 三星 galaxy fame s6818 智能手机 td-scdma gsm 蓝色 移动 定制 机 14 手机
0.028 0.030 4 1 0 0 0.175
3 3590 金本位 美味 章 鱼丸 250g 3 海鲜水产
0.066 0.054 3 0 1 0 0.127
4 3787 莲花 居 预售 阳澄湖 大闸蟹 实物 558 型 公 3.3-3.6 两 母 2.3-2.6 两 5对 装 3 海鲜水产
0.034 0.029 4 0 0 0 0.115
5 11671 rongs 融 氏 纯 玉米 胚芽油 5l 绿色食品 非 转基因 送 300ml 小 油 1瓶 9 食用油
0.412 0.486 4 0 0 0 0.455
6 23188 kerastase 卡 诗 男士 系列 去 头屑 洗发水 250ml 去 屑 止痒 男士 专用 进口 专业 洗 护发 16 美发护发
0.268 0.254 4 1 0 1 0.403
7 25150 dove 多 芬 丰盈 宠 肤 沐浴 系列 乳 木 果 和 香草 沐浴乳 400ml 5瓶 17 沐浴露
0.193 0.214 3 0 1 1 0.228
8 14707 魏 小 宏 weixiaohong 长寿 枣 400克 袋装 美容 养颜 安徽 宣城 水 东 特产 10 枣类
0.272 0.252 4 0 0 1 0.371
9 28657 80 茶客 特级 平阴 玫瑰花 玫瑰 茶 花草 茶 花茶 女人 茶 冲 饮 50克 袋 18 茶叶
0.084 0.083 2 0 0 0 0.039
10 6275 德芙 兄弟 品牌 脆 香米 脆 米 心 牛奶 巧克力 500g 散装 6 巧克力
0.192 0.207 3 1 0 0 0.167
...
从中可以看到,除了之前的商品的ID、Title、CategoryID、CategoryName字段,这个数据集还包括了如下字段。
- OneMonthConversionRateInUV:之前一个月商品的转化率(基于唯一访问),计算方法是购买该商品的唯一访问人数除以所有浏览过该商品的唯一访问人数,取值范围是0到1之间的实数。
- OneWeekConversionRateInUV:定义与OneMonthConversionRateInUV相仿,不过时间周期是前一周。无论是传统零售还是电子商务,都会根据已有的销量和人气来预测热卖的商品。因此OneMonthConversionRateInUV和OneWeekConversionRateInUV是两个常用的考量因素。
- SellerReputation:当前商家的信誉评级,取值范围是1到5星之间的整数。在电商行业中,商家的口碑对消费者更为透明,对他们的购买决策起到了更为关键的作用,因此也会影响到销量。
- IsDeal:是否正在促销,取值范围是0或1的整数。1表示正在进行促销,价格有优惠。0表示没有。价格永远是影响销量的核心因素之一。业内经常讨论的需求价格弹性,其实也是一种回归分析,试图找出用户需求和价格之间的关系。这里我们的分析也与此类似,不过考虑了更多其他的因素。
- IsNew:是否为刚刚上市的新品,取值范围是0或1的整数。1表示为刚刚上市的新品,0表示不是新品。对于某些领域,例如电子消费品、时尚服饰等,新品可能比现有的畅销款更有吸引力,也需要考虑在内。
- IsLimitedStock:库存是否有限,取值范围是0或1的整数。当商品库存有限,即将售罄的时候,消费者有可能会加速购买的决策。
- TargetValue字段:某天销量的真实值,取值范围是0到1之间的实数。
我们的实践任务将TargetValue这个字段定义为因变量,而将其他字段定义为自变量。换言之,我们试图发现,对于某天的销量而言,哪些因素会影响它?是之前一段时间内的历史销量、商家的信誉程度、还是促销力度和剩余库存,等等?如果有影响,那么影响的程度有多大?如果能够在一定程度上进行衡量,那么对于未来的商品销量,就能依照历史数据进行合理的预测了。
3.2.2 R中数据的标准化
在这里我们假设各个自变量和因变量之间存在线性的关系。在正式开始线性回归分析之前,你可能会发现不同字段的数据没有可比性。首先是取值范围不同,例如,前一个月或前一周的转化率是0到1之间的实数,而商家的信誉度却是1到5之间的整数。其次,即使是同样的取值范围,可能含金量也不相同。例如,所有商品前一个月的转化率都是偏低的,可能0.1已经是很高的,而所有商品前一周的转化率都变得很高,那么0.1就显得很低了。因此,这里还要对原始数据进行标准化(normalization)的预处理,让不同的分数相互之间具有可比性。只有这样,回归后不同因素的系数或权重才有可比性。
一种常见的标准化方法是z分数(z-score)。该方法的主要内容具体如下。
- 假设数据呈现标准正态分布。正态分布是连续随机变量概率分布的一种,自然界、人类社会、心理和教育中大量现象均按正态形式分布,例如能力的高低,学生成绩的好坏等都属于正态分布。正态分布的特点是:分布的形式是对称的,对称轴是经过平均数点的垂线;中央点最高,然后逐渐向两侧下降,曲线的形式是先向内弯,再向外弯。曲线下的面积为1。正态分布随变量的平均数、标准差的大小与单位不同而有不同的分布形态。而标准正态分布是正态分布的一种,平均数为0,标准差为1,也就是说平均数和标准差都是固定的。
- 试图回答这样一个问题:一个给定分数距离平均数多少个标准差?在平均数之上的分数会得到一个正的标准分数,在平均数之下的分数会得到一个负的标准分数。z分数是一种可以看出某分数在分布中相对位置的方法。z分数能够真实地反映出一个分数距离平均数的相对标准距离。如果我们把每一个分数都转换成z分数,那么每一个z分数都会以标准差为单位表示一个具体分数到平均数的距离或离差。
z分数计算的具体公式如下:
其中x为原始值,μ为均值,σ为标准差。在R中,我们可以很轻松地实现这一转变,并生成若干对应的数据列:
> listing_for_prediction$OneMonthConversionRateInUVNormalized <- (listing_for_prediction$OneMonthConversionRateInUV - mean(listing_for_prediction$OneMonthConversionRateInUV)) / sd(listing_for_prediction$OneMonthConversionRateInUV)
> listing_for_prediction$OneWeekConversionRateInUVNormalized <- (listing_for_
prediction$OneWeekConversionRateInUV - mean(listing_for_prediction$OneWeekConversion
RateInUV)) / sd(listing_for_prediction$OneWeekConversionRateInUV)
> listing_for_prediction$SellerReputationNormalized<-(listing_for_prediction$
SellerReputation - mean(listing_for_prediction$SellerReputation)) / sd(listing_for_prediction$SellerReputation)
> listing_for_prediction$IsDealNormalized<-(listing_for_prediction$IsDeal - mean
(listing_for_prediction$IsDeal)) / sd(listing_for_prediction$IsDeal)
> listing_for_prediction$IsNewNormalized<-(listing_for_prediction$IsNew - mean
(listing_for_prediction$IsNew)) / sd(listing_for_prediction$IsNew)
> listing_for_prediction$IsLimitedStockNormalized<-(listing_for_prediction$Is
LimitedStock - mean(listing_for_prediction$IsLimitedStock)) / sd(listing_for_predic
tion$IsLimitedStock)
> listing_for_prediction$TargetValueNormalized<-(listing_for_prediction$Target
Value - mean(listing_for_prediction$TargetValue)) / sd(listing_for_prediction$TargetValue)
查看这些数据列:
> listing_for_prediction[c("ID", "OneMonthConversionRateInUVNormalized", "OneWeekConversion
RateInUVNormalized", "SellerReputationNormalized", "IsDealNormalized", "IsNewNormalized", "IsLimitedStockNormalized", "TargetValueNormalized")]
ID OneMonthConversionRateInUVNormalized OneWeekConversionRateInUVNormalized SellerReputation
Normalized IsDealNormalized IsNewNormalized IsLimitedStockNormalized TargetValueNormalized
1 22785 -1.3400479 -1.23567665 -0.1358754 -0.617342 -0.4638124 -0.4949747 -1.285017776
2 19436 -1.2899500 -1.18179931 0.8346633 1.587451 -0.4638124 -0.4949747 -0.351859428
3 3590 -1.0179898 -1.02016731 -0.1358754 -0.617342 2.1129232 -0.4949747 -0.665087405
4 3787 -1.2470089 -1.18853398 0.8346633 -0.617342 -0.4638124 -0.4949747 -0.743394399
5 11671 1.4582790 1.88920870 0.8346633 -0.617342 -0.4638124 -0.4949747 1.475303772
6 23188 0.4276931 0.32676603 0.8346633 1.587451 -0.4638124 1.9798990 1.135973464
7 25150 -0.1090703 0.05737936 -0.1358754 -0.617342 2.1129232 1.9798990 -0.006003536
8 14707 0.4563205 0.31329669 0.8346633 -0.617342 -0.4638124 1.9798990 0.927154812
9 28657 -0.8891666 -0.82486198 -1.1064141 -0.617342 -0.4638124 -0.4949747 -1.239338696
10 6275 -0.1162272 0.01023669 -0.1358754 1.587451 -0.4638124 -0.4949747 -0.404064090
11 18663 0.7855355 1.15513003 0.8346633 -0.617342 -0.4638124 -0.4949747 0.339852355
12 15229 -0.7675002 -0.72384198 0.8346633 -0.617342 -0.4638124 -0.4949747 -0.560678079
13 1290 0.3775952 0.28635803 -0.1358754 -0.617342 -0.4638124 -0.4949747 -0.025580285
14 22014 -1.3185774 -1.24914598 -1.1064141 -0.617342 -0.4638124 -0.4949747 -1.435106182
15 13200 -0.5456380 -0.47465931 -0.1358754 1.587451 -0.4638124 -0.4949747 0.248494195
16 3440 -1.1396562 -1.04037131 -0.1358754 -0.617342 -0.4638124 -0.4949747 -0.795599062
17 26597 -0.1663251 -0.44772064 -2.0769529 -0.617342 -0.4638124 -0.4949747 -0.815175810
18 4955 2.1023952 1.61308737 0.8346633 -0.617342 -0.4638124 -0.4949747 2.434564452
19 6083 1.1362209 0.85880470 -0.1358754 -0.617342 -0.4638124 -0.4949747 0.502991927
20 9082 1.1720052 1.31002737 -1.1064141 -0.617342 -0.4638124 1.9798990 1.494880521
21 17532 0.2129878 0.03044069 0.8346633 -0.617342 -0.4638124 -0.4949747 -1.311120108
22 4826 1.2865147 1.82186204 -0.1358754 -0.617342 -0.4638124 1.9798990 0.640029167
23 3910 -0.8032844 -0.83159664 0.8346633 -0.617342 -0.4638124 -0.4949747 -0.514998999
24 24450 0.2487720 -0.10425264 -2.0769529 1.587451 -0.4638124 1.9798990 0.640029167
25 13428 -0.5671085 -0.47465931 0.8346633 1.587451 -0.4638124 -0.4949747 0.457312847
26 1140 0.4563205 0.21227669 0.8346633 -0.617342 -0.4638124 -0.4949747 0.333326772
27 22403 -0.5742654 -0.64976064 -1.1064141 1.587451 -0.4638124 -0.4949747 -0.319231513
28 5945 0.1986741 0.23248069 -0.1358754 1.587451 -0.4638124 -0.4949747 0.392057018
29 19020 0.9716135 0.42105136 -0.1358754 -0.617342 -0.4638124 1.9798990 1.377420029
30 2068 2.6749429 3.14859138 -1.1064141 -0.617342 2.1129232 -0.4949747 3.831039184
31 21222 -1.3042637 -1.20873798 1.8052020 -0.617342 2.1129232 1.9798990 -0.123464028
32 10718 1.1433778 0.86553936 0.8346633 -0.617342 -0.4638124 -0.4949747 -0.815175810
33 15577 -0.2593641 -0.10425264 -0.1358754 -0.617342 -0.4638124 -0.4949747 -0.195245439
34 2269 -0.9106371 -0.77098464 -2.0769529 -0.617342 -0.4638124 -0.4949747 -0.952213050
35 18569 0.6710259 0.52207136 -1.1064141 1.587451 -0.4638124 -0.4949747 0.437736098
36 2998 -0.9678919 -0.82486198 1.8052020 1.587451 -0.4638124 -0.4949747 -0.351859428
37 21803 -1.3615185 -1.23567665 0.8346633 -0.617342 2.1129232 -0.4949747 -0.991366548
38 19303 -0.6673044 -0.63629131 0.8346633 -0.617342 -0.4638124 -0.4949747 -0.521524582
39 4690 0.8284765 1.08104870 -2.0769529 -0.617342 -0.4638124 -0.4949747 -0.521524582
40 19971 -1.2613226 -1.21547265 0.8346633 1.587451 -0.4638124 1.9798990 -0.006003536
41 26946 -0.5814222 -0.45445531 0.8346633 -0.617342 -0.4638124 -0.4949747 -0.397538508
42 25426 0.8642608 0.79819270 0.8346633 1.587451 -0.4638124 -0.4949747 0.013573212
43 13999 0.8213197 0.41431670 -0.1358754 1.587451 2.1129232 1.9798990 0.620452418
44 9150 -0.1949525 -0.25914997 -1.1064141 -0.617342 2.1129232 -0.4949747 -0.097361696
45 1227 0.6352417 0.59615270 -0.1358754 -0.617342 2.1129232 -0.4949747 1.018512972
46 9904 -0.2092662 -0.23221131 0.8346633 -0.617342 -0.4638124 -0.4949747 -0.286603599
47 22857 -1.4330869 -1.32322731 -0.1358754 -0.617342 2.1129232 -0.4949747 -1.089250290
48 12522 0.5350458 0.24595003 0.8346633 -0.617342 -0.4638124 -0.4949747 -0.965264216
49 7519 1.3867106 1.60635270 -1.1064141 1.587451 -0.4638124 -0.4949747 0.274596527
50 1324 0.1915172 -0.10425264 -1.1064141 -0.617342 -0.4638124 -0.4949747 -0.808650228
可以看到,对于给定的某个字段,数值有正有负,与原始数据有所不同。再来验证一下每个字段是否符合标准正态分布。这里以OneMonthConversionRateInUVNormalized和SellerReputationNormalized为例:
> mean(listing_for_prediction$OneMonthConversionRateInUVNormalized)
[1] -7.213929e-17
> sd(listing_for_prediction$OneMonthConversionRateInUVNormalized)
[1] 1
> mean(listing_for_prediction$SellerReputationNormalized)
[1] -9.990706e-17
> sd(listing_for_prediction$SellerReputationNormalized)
[1] 1
这里-7.213929e-17和-9.990706e-17是由于计算误差所导致的,可以认为0,而标准差都是1,符合标准正态分布。
3.2.3 使用R的线性回归分析
一切就绪,我们先来使用cor()函数,检视一下不同自变量之间、自变量和因变量之间的关系:
> cor(listing_for_prediction[c("OneMonthConversionRateInUVNormalized", "OneWeekConversionRateInUVNormalized", "SellerReputationNormalized", "IsDealNormalized", "IsNewNormalized", "IsLimitedStockNormalized", "TargetValueNormalized")])
OneMonthConversionRateInUVNormalized OneWeekConversionRateInUVNormalized SellerReputa-
tionNormalized IsDealNormalized IsNewNormalized IsLimitedStockNormalized TargetValueNormalized
OneMonthConversionRateInUVNormalized 1.00000000 0.97348970 -0.158011500 -0.031674657
-0.06780377 0.13685456 0.746505674
OneWeekConversionRateInUVNormalized 0.97348970 1.00000000 -0.154650456 -0.045672910
-0.04367404 0.10789623 0.752750106
SellerReputationNormalized -0.15801150 -0.15465046 1.000000000 0.001746806
-0.01326967 0.02941176 -0.002771155
IsDealNormalized -0.03167466 -0.04567291 0.001746806 1.000000000
-0.17623215 0.13363062 0.125412525
IsNewNormalized -0.06780377 -0.04367404 -0.013269666 -0.176232151
1.00000000 0.15617376 0.131333115
IsLimitedStockNormalized 0.13685456 0.10789623 0.029411765 0.133630621
0.15617376 1.00000000 0.338424764
TargetValueNormalized 0.74650567 0.75275011 -0.002771155 0.125412525
0.13133312 0.33842476 1.000000000
从中可以得出如下两个快速的结论:
- 单月销售转化率OneMonthConversionRateInUVNormalized和单周销售转化率OneWeek
- ConversionRateInUVNormalized之间的相关系数达到了0.97348970,有极强的相关性。在必要的时候,我们可以考虑放弃这两者其中之一的自变量,减少自变量的数量,降低对训练样本数量的要求。
- 待预测的目标转化率TargetValueNormalized和单月销售转化率OneMonthConversionRate
- InUVNormalized有较强的相关性,相关系数为0.74650567。
- 待预测的目标转化率TargetValueNormalized和单周销售转化率OneWeekConversionRateInUVNormalized也有较强的相关性,相关系数为0.75275011。
- 对角线上都是自己对自己,完全相关,所以系数都为1.0。
还可以使用pairs()函数可视化两两转化率之间的关系,结果如图3-3所示。
> pairs(listing_for_prediction[c("OneMonthConversionRateInUVNormalized", "OneWeek-
ConversionRateInUVNormalized", "SellerReputationNormalized", "IsDealNormalized", "IsNewNormalized", "IsLimitedStockNormalized", "TargetValueNormalized")])
然后,通过lm()函数,进行多元的线性回归,数据集为listing_for_prediction,目标值或因变量是TargetValueNormalized,将其他的标准化字段作为自变量:
> listing_prediction_linearreg_model <- lm(TargetValueNormalized ~ OneMonth
ConversionRateInUVNormalized + OneWeekConversionRateInUVNormalized + SellerReputation
Normalized + IsDealNormalized + IsNewNormalized + IsLimitedStockNormalized, data = listing_for_prediction)
查看线性回归后的结果:
> listing_prediction_linearreg_model
Call:
lm(formula = TargetValueNormalized ~ OneMonthConversionRateInUVNormalized +
OneWeekConversionRateInUVNormalized + SellerReputationNormalized +
IsDealNormalized + IsNewNormalized + IsLimitedStockNormalized,
data = listing_for_prediction)
Coefficients:
(Intercept) OneMonthConversionRateInUVNormalized OneWeekConversion
RateInUVNormalized SellerReputationNormalized IsDeal-Normalized IsNewNormalized IsLimitedStockNormalized
6.229e-17 1.996e-01 5.692e-01 1.129e-01 1.607e-01
1.685e-01 1.986e-01
从目前的结果来看,OneWeekConversionRateInUVNormalized这个因素的权重最高,为5.692e-01。下面进一步使用summary()函数查看模型的细节:
> summary(listing_prediction_linearreg_model)
Call:
lm(formula = TargetValueNormalized ~ OneMonthConversionRateInUVNormalized +
OneWeekConversionRateInUVNormalized + SellerReputationNormalized +
IsDealNormalized + IsNewNormalized + IsLimitedStockNormalized,
data = listing_for_prediction)
Residuals:
Min 1Q Median 3Q Max
-1.35461 -0.25017 0.07358 0.30216 1.47134
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 6.229e-17 8.451e-02 0.000 1.0000
OneMonthConversionRateInUVNormalized 1.996e-01 3.809e-01 0.524 0.6030
OneWeekConversionRateInUVNormalized 5.692e-01 3.784e-01 1.504 0.1398
SellerReputationNormalized 1.129e-01 8.664e-02 1.303 0.1994
IsDealNormalized 1.607e-01 8.821e-02 1.822 0.0754 .
IsNewNormalized 1.685e-01 8.933e-02 1.887 0.0660 .
IsLimitedStockNormalized 1.986e-01 8.963e-02 2.216 0.0321 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.5976 on 43 degrees of freedom
Multiple R-squared: 0.6866, Adjusted R-squared: 0.6429
F-statistic: 15.7 on 6 and 43 DF, p-value: 1.899e-09
现实中,由于被线性回归的数据不可能完全符合某条直线,因此存在误差,如前图3-1所示:左侧拟合度较好,误差小;右侧拟合度较差,误差大。上述结果的Residuals部分展示了误差的基本统计数据,例如最小值(-1.35461)、25%分位(-0.25017)、中值(0.07358)、75%分位(0.30216)和最大值(1.47134)。Coeff?icients给出了每个自变量的部分权重和统计细节。例如,OneWeekConversionRateInUVNormalized虽然有最高的权重值,但是其对应的Pr值(也就是P值)达到了0.1398,表面上这个相关性从统计的角度来看存在14%左右的偶然性,而一般业界认为0.05(5%)以内的偶然性才是可以接受的。依照5%的标准来看,只有IsLimitedStockNormalized符合条件。同时,调整后的R方(Adjusted R-squared)为0.6429,表示模型整体对于因变量变化的解释度只有64%,离最理想的值100%有较大的差距,还不够理想。
那么,这些是否就意味着线性回归无法很好地解决转化率预测问题呢?其实,我们还可以根据商品的分类进行一些尝试。不同品类的商品,其内在属性会有所不同,消费者对其的理解也会有所不同。换言之,如果将用于回归的样本限定于特定的品类,我们是否能发现其他有趣的现象?这里将整体的测试数据划分为4个大类(分组)。
- 消费电子:包括“手机”和“电脑”等分类。
- 日用品:包括“沐浴露”“美发护发”“大米”和“食用油”等分类。
- 饮料和零食:包括“坚果”“巧克力”“饼干”“饮料饮品”和“方便面”等分类。
- 生鲜和干货:包括“海鲜水产”“新鲜水果”“进口牛奶”“栆类”和“茶叶”等分类。
先来测试消费电子类这组的样本:
> listing_for_prediction_ce <- subset(listing_for_prediction, listing_for_prediction$CategoryName == "手机" | listing_for_prediction$CategoryName == "电脑")
> listing_for_prediction_ce[,1:4]
ID Title CategoryID CategoryName
1 22785 samsung 三星 galaxy tab3 t211 1g 8g wifi+3g 可 通话 平板 电脑 gps 300万像素 白色 15 电脑
2 19436 samsung 三星 galaxy fame s6818 智能手机 td-scdma gsm 蓝色 移动 定制 机 14 手机
14 22014 华 志 硕 第四代 酷 睿 i3 4130 b85 4g 500g 高性能 核 显 家用 娱乐 高清 电脑 主机 15 电脑
27 22403 sony 索尼 p13226scb 13.3英寸 触 控 超 极 本 电脑 i5 4200u 4g 128g 固态 win8.1 蓝牙 4.0 15 电脑
31 21222 lenovo 联想 g510at-ifi 酷 睿 i5 4200 4g 500g 2g 独立 显卡 笔记本电脑 15.6寸 15 电脑
37 21803 dell 戴尔 optiplex 7010mt 商用 台式 电脑 主机 i5-3470 4g 500g dvdrw 15 电脑
38 19303 htc one m8sw e8 时尚 版 4g 手机 雪 精灵 白 fdd-lte td-lte wcdma gsm 联通 版 14 手机
40 19971 samsung 三星 galaxy siv 盖世 4 s4 i9500 双 四 核 手机 大陆 行货 全国 联保 14 手机
47 22857 thinkpad t430u-8614-1c4 14英寸 i5-3337 4g 1t 24ssd win8 超级 本 笔记本电脑 15 电脑
进行同样的z分数标准化、线性回归后的结果如下:
> listing_prediction_linearreg_model_ce <- lm(TargetValueNormalized ~ OneMonth
ConversionRateInUVNormalized + OneWeekConversionRateInUVNormalized +
SellerReputation-Normalized + IsDealNormalized + IsNewNormalized + IsLimitedStockNormalized,
data = listing_for_prediction_ce)
> summary(listing_prediction_linearreg_model_ce)
Call:
lm(formula = TargetValueNormalized ~ OneMonthConversionRateInUVNormalized +
OneWeekConversionRateInUVNormalized + SellerReputationNormalized +
IsDealNormalized + IsNewNormalized + IsLimitedStockNormalized,
data = listing_for_prediction_ce)
Residuals:
1 2 14 27 31 37 38 40 47
0.01927 0.06719 0.02765 0.03496 0.10215 -0.05980 -0.04693 -0.10215 -0.04235
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.867e-15 4.429e-02 0.000 1.0000
OneMonthConversionRateInUVNormalized -1.471e+01 7.972e+00 -1.846 0.2063
OneWeekConversionRateInUVNormalized 1.507e+01 7.921e+00 1.902 0.1975
SellerReputationNormalized -1.491e+00 1.006e+00 -1.483 0.2763
IsDealNormalized 1.221e+00 3.550e-01 3.439 0.0751 .
IsNewNormalized 5.554e-01 2.145e-01 2.590 0.1223
IsLimitedStockNormalized 1.796e+00 7.535e-01 2.383 0.1400
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.1329 on 2 degrees of freedom
Multiple R-squared: 0.9956, Adjusted R-squared: 0.9823
F-statistic: 75.18 on 6 and 2 DF, p-value: 0.01318
从中可以看到,只有IsDealNormalized有比较小的偶然性(P值),并且拥有较高的正系数,证明对于此类商品,是否参加促销将对用户是否决定购买起到比较关键的作用。令人意外的是,SellerReputationNormalized竟然是负系数,也就是说商家的信誉越高,预测的转化率反而越低,这和我们的常识不符。好在其P值较大,证明该系数可信度并不高,如果使用了更多的测试数据,可能结论就会发生改变。从整体上看,调整后的R方(Adjusted R-squared)达到了98%,解释性很好。
接下来是日用品分类这组:
> listing_for_prediction_daily <- subset(listing_for_prediction, listing_for_prediction$
CategoryName == "沐浴露" | listing_for_prediction$CategoryName == "美发护发" |
listing_for_prediction$CategoryName == "大米" | listing_for_prediction$CategoryName == "食用油")
> listing_for_prediction_daily[, 1:4]
ID Title CategoryID CategoryName
5 11671 rongs 融 氏 纯 玉米 胚芽油 5l 绿色食品 非 转基因 送 300ml 小 油 1瓶 9 食用油
6 23188 kerastase 卡 诗 男士 系列 去 头屑 洗发水 250ml 去 屑 止痒 男士 专用 进口 专业 洗 护发 16 美发护发
7 25150 dove 多 芬 丰盈 宠 肤 沐浴 系列 乳 木 果 和 香草 沐浴乳 400ml 5瓶 17 沐浴露
11 18663 十月 稻田 五常 稻 花香 大米 5kg 袋 x 2 12 大米
17 26597 olay 玉兰油 冰 透 清爽 沐浴露 200ml 17 沐浴露
21 17532 金龙鱼 生态 稻 5kg 袋 12 大米
24 24450 依 风 三件套 礼品 套装 洗发水 洗发露 护发素 沐浴 盐 沐浴乳 身体 乳 专业 洗 护 套装 16 美发护发
29 19020 金龙鱼 生态 稻 5kg 袋 12 大米
35 18569 golden delight 金 怡 泰国 茉莉 香米 5kg 泰国 进口 12 大米
42 25426 safeguard 舒肤佳 沐浴露 热销 组合 纯白 清 香型 劲 爽 清新 运动型 400ml 2 17 沐浴露
48 12522 蒙 谷 香 亚麻 籽 油 冷 榨 脱蜡 礼品盒 500ml 2瓶 送 领导 送 健康 首选 送礼 首选 9 食用油
z分数标准化、线性回归后的结果如下:
> listing_prediction_linearreg_model_daily <- lm(TargetValueNormalized ~
OneMonthConversionRateInUVNormalized + OneWeekConversionRateInUVNormalized + Seller
ReputationNormalized + IsDealNormalized + IsNewNormalized + IsLimitedStockNormalized,
data = listing_for_prediction_daily)
> summary(listing_prediction_linearreg_model_daily)
Call:
lm(formula = TargetValueNormalized ~ OneMonthConversionRateInUVNormalized +
OneWeekConversionRateInUVNormalized + SellerReputationNormalized +
IsDealNormalized + IsNewNormalized + IsLimitedStockNormalized,
data = listing_for_prediction_daily)
Residuals:
5 6 7 11 17 21
24 29 35 42 48
-1.495e-02 3.101e-01 -3.903e-18 -5.792e-02 2.557e-01 -1.558e-01
-4.472e-01 1.371e-01 2.187e-01 -8.162e-02 -1.642e-01
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.792e-16 1.055e-01 0.000 1.0000
OneMonthConversionRateInUVNormalized 1.329e-01 3.597e-01 0.369 0.7305
OneWeekConversionRateInUVNormalized 8.605e-01 3.483e-01 2.470 0.0689 .
SellerReputationNormalized -3.474e-01 1.395e-01 -2.490 0.0675 .
IsDealNormalized 6.585e-02 1.247e-01 0.528 0.6255
IsNewNormalized -1.654e-01 1.851e-01 -0.893 0.4222
IsLimitedStockNormalized 7.790e-01 1.535e-01 5.076 0.0071 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.3499 on 4 degrees of freedom
Multiple R-squared: 0.951, Adjusted R-squared: 0.8776
F-statistic: 12.95 on 6 and 4 DF, p-value: 0.01346
从结果来看,IsLimitedStockNormalized的P值非常小,是最为可靠的因素,而系数为正,这表明对于刚性需求的商品而言,如果它们的库存有限,那么其销售转化率会更高。原因可能是顾客担心自己经常使用的日用品缺货。其次,OneWeekConversionRateInUVNormalized的P值也较低,说明前一周的转化对于之后的转化预测有比较可靠的贡献。而对于商家的信誉度SellerReputationNormalized依然是比较反常的负系数。从整体上看,调整后的R方(Adjusted R-squared)达到了87%,解释性比较好。
下一个大的分类组是饮料和零食:
> listing_for_prediction_drink.snack <- subset(listing_for_prediction,
listing_for_prediction$CategoryName == "坚果" | listing_for_prediction$CategoryName == "巧克力" |
listing_for_prediction$CategoryName == "饼干" | listing_for_prediction$CategoryName == "饮料饮品" |
listing_for_prediction$CategoryName == "方便面")
> listing_for_prediction_drink.snack[, 1:4]
ID Title CategoryID CategoryName
10 6275 德芙 兄弟 品牌 脆 香米 脆 米 心 牛奶 巧克力 500g 散装 6 巧克力
13 1290 雅 客 花生 口味 法式 薄饼 夹心饼干 500g 小包装 零食 美 食品 糕 点心 1 饼干
19 6083 德芙 士力架 花生 巧克力 桶装 460克 全家 桶装 6 巧克力
20 9082 圣 碧 涛 san benedetto 天然 矿泉水 500ml 瓶 意大利 进口 瓶装水 更 自然 更
健康 更 纯净 7 饮料饮品
26 1140 aji 芒 果味 夹心饼干 270g 休闲 零食 1 饼干
28 5945 hershey s 好 时 巧克力 kisses 结婚 喜糖 1斤 500g 散装 称重 约 105粒
牛奶 黑 巧 扁 桃仁 榛 仁 曲奇 6 巧克力
30 2068 康师傅 脆 海带 香 锅 牛肉面 121 5 袋 2 方便面
32 10718 大徐 南瓜子 独立 小包 散 称 500g 盐 焗 味 南瓜子 休闲 零食 小 南瓜子 8 坚果
34 2269 寿桃 牌 儿童 萝卜 面 2 方便面
44 9150 海 太 冰斗 哩 儿童 饮料 蓝 粉色 各 2瓶 280ml 韩国 进口 儿童 果汁 棉花 糖 味 正品 7 饮料饮品
45 1227 meilijia bakery cake 美丽 家 食品 饼干 礼包 煎饼 礼盒 精挑细选 大礼包 650g 1 饼干
46 9904 正 林 黑 瓜子 甘草 味 315g 8 坚果
49 7519 怡 泉 c 柠檬 味 汽水 500ml 支 7 饮料饮品
50 1324 喔 依 喜 食品 黄油 蜂蜜 杏仁酥 250g 独立 小包装 1 饼干
对该大类进行z分数标准化和线性回归,之后的结果如下:
> listing_prediction_linearreg_model_drink.snack <- lm(TargetValueNormalized ~ OneMonthConversionRateInUVNormalized + OneWeekConversionRateInUVNormalized + Seller
ReputationNormalized + IsDealNormalized + IsNewNormalized +
IsLimitedStockNormalized, data = listing_for_prediction_drink.snack)
> summary(listing_prediction_linearreg_model_drink.snack)
Call:
lm(formula = TargetValueNormalized ~ OneMonthConversionRateInUVNormalized +
OneWeekConversionRateInUVNormalized + SellerReputationNormalized +
IsDealNormalized + IsNewNormalized + IsLimitedStockNormalized,
data = listing_for_prediction_drink.snack)
Residuals:
Min 1Q Median 3Q Max
-0.82870 -0.10268 -0.00554 0.19772 0.54805
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.447e-16 1.315e-01 0.000 1.0000
OneMonthConversionRateInUVNormalized -1.228e+00 9.020e-01 -1.361 0.2157
OneWeekConversionRateInUVNormalized 1.941e+00 9.309e-01 2.085 0.0755 .
SellerReputationNormalized 1.470e-01 1.708e-01 0.861 0.4179
IsDealNormalized -1.237e-01 1.756e-01 -0.704 0.5039
IsNewNormalized 2.834e-01 1.772e-01 1.599 0.1538
IsLimitedStockNormalized 1.442e-01 1.587e-01 0.908 0.3939
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.4921 on 7 degrees of freedom
Multiple R-squared: 0.8696, Adjusted R-squared: 0.7578
F-statistic: 7.779 on 6 and 7 DF, p-value: 0.00801
从中可以看出,依旧是OneWeekConversionRateInUVNormalized的P值较低,说明前一周的转化率对于之后的转化预测仍然有着比较可靠的贡献,不过相对于日用品大类,这个因素在本大类中的权重更高。从整体上看,调整后的R方(Adjusted R-squared)只有76%左右,解释性一般。
最后一组是生鲜和干货:
> listing_for_prediction_fresh.dried <- subset(listing_for_prediction,
listing_for_prediction$CategoryName == "海鲜水产" | listing_for_prediction$CategoryName == "新鲜水果" |
listing_for_prediction$CategoryName == "进口牛奶" | listing_for_prediction$CategoryName == "枣类" |
listing_for_prediction$CategoryName == "茶叶")
> listing_for_prediction_fresh.dried[, 1:4]
ID Title CategoryID CategoryName
3 3590 金本位 美味 章 鱼丸 250g 3 海鲜水产
4 3787 莲花 居 预售 阳澄湖 大闸蟹 实物 558 型 公 3.3-3.6 两 母 2.3-2.6 两 5对 装 3 海鲜水产
8 14707 魏 小 宏 weixiaohong 长寿 枣 400克 袋装 美容 养颜 安徽 宣城 水 东 特产 10 枣类
9 28657 80 茶客 特级 平阴 玫瑰花 玫瑰 茶 花草 茶 花茶 女人 茶 冲 饮 50克 袋 18 茶叶
12 15229 民 信 南汇 8424 西瓜 4只 装 中 约 26斤 11 新鲜水果
15 13200 东阿 阿胶 金丝 枣 360g- 独立 包装 10 枣类
16 3440 宅 鲜 配 味 付 八 爪 鱼 芝麻 寿司 料理 材料 必备 1000g 盒 3 海鲜水产
18 4955 芭 蔻 玛 原装 进口 欧洲 纯正 奶 源 欧式 香浓 牛奶 榛子 味 230g 瓶 新品 上市 4 进口牛奶
22 4826 波 顿 美国 原装 进口 牛奶 borden 脱脂 牛奶 946ml 单 盒装 11月 到期 4 进口牛奶
23 3910 水 锦 洋 加拿大 牡丹 虾 刺 身 级 20-24 头 盒 1000g 进口 虾 顶级 刺 身 日 料 好 海鲜 3 海鲜水产
25 13428 绿 帝 金丝 枣 500g 2袋 河北 沧州 特产 一级 无核 红枣 阿胶 枣 金丝小枣 蜜枣 仙 枣 10 枣类
33 15577 都 乐 新西兰 佳 沛 金 奇异果 猕猴桃 大箱 装 10斤 11 新鲜水果
36 2998 光明 渔业 新西兰 青 口 贝 1000g 进口 海鲜 半 壳 新鲜 超大 海鲜 美食 肉质 鲜 滑 原装 进口 3 海鲜水产
39 4690 宾格 瑞 韩国 进口 binggrae 宾格 瑞 香蕉 牛奶 饮料 200ml 6 瓶装 1200ml 果汁 牛奶 饮品 4 进口牛奶
41 26946 杭 梅 花草 茶 金银花 特级 金银 花茶 河南 封丘 35g 罐 新花 18 茶叶
43 13999 铁 大哥 无核 蜜饯 阿胶 枣 280g 3 10 枣类
对该大类进行z分数标准化和线性回归,之后的结果如下:
> listing_prediction_linearreg_model_fresh.dried <- lm(TargetValueNormalized ~
OneMonthConversionRateInUVNormalized + OneWeekConversionRateInUVNormalized +
SellerReputationNormalized + IsDealNormalized + IsNewNormalized + IsLimitedStock
Normalized, data = listing_for_prediction_fresh.dried)
> summary(listing_prediction_linearreg_model_fresh.dried)
Call:
lm(formula = TargetValueNormalized ~ OneMonthConversionRateInUVNormalized +
OneWeekConversionRateInUVNormalized + SellerReputationNormalized +
IsDealNormalized + IsNewNormalized + IsLimitedStockNormalized,
data = listing_for_prediction_fresh.dried)
Residuals:
Min 1Q Median 3Q Max
-0.49216 -0.24227 0.03231 0.22336 0.48001
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.854e-16 9.802e-02 0.000 1.0000
OneMonthConversionRateInUVNormalized 1.619e+00 5.090e-01 3.180 0.0112 *
OneWeekConversionRateInUVNormalized -7.188e-01 5.431e-01 -1.323 0.2183
SellerReputationNormalized 3.490e-01 1.240e-01 2.815 0.0202 *
IsDealNormalized 1.550e-01 1.081e-01 1.434 0.1854
IsNewNormalized -6.841e-02 1.345e-01 -0.509 0.6232
IsLimitedStockNormalized -3.699e-02 1.368e-01 -0.270 0.7929
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.3921 on 9 degrees of freedom
Multiple R-squared: 0.9078, Adjusted R-squared: 0.8463
F-statistic: 14.76 on 6 and 9 DF, p-value: 0.0003359
终于,这次SellerReputationNormalized的系数为正了,而且P值降到了很低的范围,说明偶然性很小。这也许是因为对于生鲜和干货类商品而言,售前咨询、售中运输和售后保障等的因素更为关键,因此商家的良好口碑尤为重要。而OneMonthConversionRateInUVNormalized的系数和P值表明,销售的历史也起到了较大的作用。从整体上看,调整后的R方(Adjusted R-squared)达到84%左右,解释性尚可。
“小明哥,看来线性回归分析在不同的数据集上,会产生完全不同的结论啊!你看,将原本的数据集进行回归后,我们几乎没有什么结论。可是,将数据集合细分成几个不同的组,就会有新的发现。”
“是的,现实中也的确如此。人们在购买电子产品时所考虑的因素与购买日常快消品时所考虑的因素肯定是有所不同的,如果混为一谈,当然无法找到有趣的结论。所以,我们不仅要学会算法本身,还需要根据实际的应用环境合理使用。最后,由于线性回归基本上都是用于离线分析的,模型处理速度快,而且学习出来的系数用于实时运算也是非常高效的,因此不再需要Mahout或其他类似的Java类库来协助线上服务。我们还可以使用线性回归学习而来的系数,提升搜索或推荐系统的排序准确率。”