应用:商品需求预估

2018-08-27 11:24:14 浏览数 (1)

摘要:想要更好的改变用户体验,非常重要的点在于在用户交易过程前,提前预测到用户的需求,做到“口未开,物先呈”

明确需求

1.用户会是哪些人?

假设现在有这么一个人,23岁,一线城市白领,常常出入城市CBD,之前没有任何的平台行为,刚刚注册app,那么他会买什么?

我们的用户

接下来,我们通过用户仅有的一些特征做一些角色分析:

(1)23岁 一线城市,这意味着他90%的可能以上是单身,90后且极有可能刚毕业不久,同时又在一线城市,属于中低收入但是中高开支。所以,可以排除该用户属于大家电、女性用品、奢侈品、旅游用品、理财等需求

(2)常常出入CBD,城市中心,这说明有稳定工作,稳定收入(虽然不多),饮食可能不规律,同时可能私人时间较少。所以,一定程度上可能用户对休闲夸张的服饰需求较少,对便携式的健身器材、速食品存在潜在的可能

(3)从未用过app,是app的新用户,根据app的定位,易购因为便利的物流体验,多吸引大家电、电子产品的目标用户,结合1、2两条,可能用户这次注册的可能需求是手机或者电脑这些电子产品较大

以上的过程其实是通过用户的特征画像对用户进行刻画,也就是特征筛选,从性别,年龄,角色等一些特征来划分群体,结合对应群体的购买行为,推荐群体契合度高的商品。


2.用户会买或者考虑买什么?

选择.png

这种过程也就是数据挖掘过程中的特征准备,根据历史经验看来,诸如:搜索、浏览、历史订单等,再加上用户的近期行为,我们可以得到几个方向:

物品喜好:一个月前他想买什么,近几天他想买什么样的东西,我们都有个大概的范围

风格喜好:有个大概的范围,分析用户的相应行为,比如对应的手机的话,可能带了一些关键词,简约,白色等等这些,所以我们不妨试试iphone或者锤子

价值喜好:到底是iphone或者是锤子,通过当前手机型号比如安卓旗舰机器,可能用户对ip好呢的需求会大一些,若是安卓千元款,用户可能更偏向一些相对廉价的手机

其实这样的过程,可以总结为:f(x)= R(a1*x1) ...,通过用户的行为x,用户行为的对需求结果的价值a,需求时效性R,综合判断出此刻,这个用户对各类产品的需求程度。

除此之外,有一些决定性因素,需要单独考虑:

a.商品周期性,假设用户最有可能购买的是冰箱,但是这个用户1周之前刚买了冰箱,那你此刻再给他推送冰箱,他购买的可能性几乎为0;而要是把冰箱换作是零食或者水,结果往往截然相反

b.商品合理性,夏天买取暖器,冬天买花露水等行为不是不可能发生,但是它发生的可能性要远远小于可接受的可信值,所以一定程度上,避免发生这种情况

其实这样的过程,可以总结为:g(x)=w' * f(x),通过w'压缩用户需求可能性f(x)变化区间在[0,1]上

3.那么如何实现呢?

现在,我们通过R语言实现一次简单的用户需求预测:

a.首先,我们对若干数据进行清洗,干掉不合理的异常值、缺失值、规范化数值特征等

读取历史上购买目标商品的用户(label=1)与未购买的用户(label=0)的特征数据 data_base<-read.table('supermarket_second_dried_milk_train_another.txt',header=T) 数据备份 train_data<-data_base 将是否老用户、是否目标类目下的老用户0-1化,将是否变成机器可读的语言 train_data$status<-as.factor(train_data$status) train_data$aimed_status<-as.factor(train_data$aimed_status) 根据特征量级,切分特征组

代码语言:javascript复制
data00<-subset(data_all,select = c(max_date_diff,aimed_max_date_diff))
data01<-subset(data_all,select = c(max_pay,per_pay,six_month_max_pay,six_month_per_pay...)
data02<-subset(data_all,select = c(cnt_time,six_month_cnt_time,three_month_cnt_time,...)
data03<-subset(data_all,select = c(pv_visit_last_period,search_last_period,...)

箱式理论,压缩特征范围

代码语言:javascript复制
data_action00<-function(x){
        x<-as.numeric(as.character(x))
        y<-quantile(x,0.98,na.rm = T)
        x[x>y]<-y
        x[is.na(x)]<-max(x[!is.na(x)&x>0])
        x[x<0]<-max(x[!is.na(x)&x>0])
        return(x)
}

for(i in 1:ncol(data00)){
        data00[,i]<-data_action00(data00[,i])
}```
*整理后的数据合并*

data_new<-cbind(date=train_dataaimed_date,label=train_datalabel,status=train_datastatus,aimed_status=train_dataaimed_status,data00,data01,data02,data03)

代码语言:javascript复制
`data_action01`、`data_action02`、`data_action03`同理,此处的p值,根据业务实际选取,压缩p值以上的离群点
这边建议参考:
[[数据预处理-缺失值处理](http://www.jianshu.com/p/5d883a293730)](http://www.jianshu.com/p/5d883a293730)
[数据预处理-异常值处理](http://www.jianshu.com/p/b490ac402fe6)
****
通过table函数,我们发现,
![](http://upload-images.jianshu.io/upload_images/1129359-0f266d7c55f8d5ef.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)
用户数据数据极度不均匀,未购买的用户数量级:购买用户的数量级:未购买用户的数量级=33:1
关于数据预测中,数量级极度不平衡的处理方式通过交叉抽样的方法,及随机有放回抽取label=0、1的用户数据,组成新数据集

library(ROSE) data_balanced_both <- ovun.sample(label ~ ., data = data_new, method = "both",p=0.3,N = 8*nrow(data_new[data_newlabel==1,]),seed = 1)data```

这边method=‘both’为双向采样,‘under’为欠采样,通常为常见采样方法。p=0.3为label=1的采样结果占比,N为总采样用户数据量 接下来在通过lasso压缩特征个数:

代码语言:javascript复制
library(glmnet)
y<-data_balanced_both$label
x<-data_balanced_both[,5:ncol(data_balanced_both)]
x<-as.matrix(x)
las1 <- glmnet(x,y, family = "binomial", alpha = 1)
las1.cv <- cv.glmnet(x = x, y = y, family = "binomial", alpha = 1, nfold = 10)
las1.1se <- glmnet(x = x, y = y, family = "binomial", alpha = 1, lambda = las1.cv$lambda.1se)```

我们,先看下las1.cv中,随着lambda变化,损失函数变化情况:
![](http://upload-images.jianshu.io/upload_images/1129359-bc4008a23efad142.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)

可以看到,`log(lambda)`在-6与-7之间时,为损失函数可接受范围内,惩罚力度较大的参数值,再通过`coef(las1.1se)`观察如下:

![](http://upload-images.jianshu.io/upload_images/1129359-709c4d28e3488406.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)

再删除被lasso剔除掉的变量,诸如six_month_per_pay等,得到新的数据集:
`data_balanced_both_new_one<-subset(data_balanced_both,select=-c(six_month_per_pay,...)`

再通过logistic模型计算用户的下单概率,并通过逐步回归剔除不显著的变量:

model<-glm(label~.,data = data_balanced_both_new_one[,-1],family = binomial(link='logit')) step(model)```

保证得到的变量系数均显著,每个变量存在均有意义 最后得到的model即为目标函数R(x)

在通过sigmod变形即可得到f(x),再考虑最初我们提到的商品周期性、商品合理性的g(x)压缩,这边最简单的就是:

当用户触发商品周期性或商品合理性原则的时候采取第二个公式,否则第一个公式

0 人点赞