应用:商品需求预估

作者: slade_sal | 来源:发表于2017-07-03 11:56 被阅读212次

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

    明确需求

    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)
    根据特征量级,切分特征组

    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,...)
    

    箱式理论,压缩特征范围

    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_data$aimed_date,label=train_data$label,status=train_data$status,aimed_status=train_data$aimed_status,data00,data01,data02,data03)

    `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函数,我们发现,
    ![](https://img.haomeiwen.com/i1129359/0f266d7c55f8d5ef.png?imageMogr2/auto-orient/strip%7CimageView2/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_new$label==1,]),seed = 1)$data```

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

    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变化,损失函数变化情况:
    ![](https://img.haomeiwen.com/i1129359/bc4008a23efad142.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    可以看到,`log(lambda)`在-6与-7之间时,为损失函数可接受范围内,惩罚力度较大的参数值,再通过`coef(las1.1se)`观察如下:
    
    ![](https://img.haomeiwen.com/i1129359/709c4d28e3488406.png?imageMogr2/auto-orient/strip%7CimageView2/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)压缩,这边最简单的就是:

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

    相关文章

      网友评论

      • ky:讲的很好

      本文标题:应用:商品需求预估

      本文链接:https://www.haomeiwen.com/subject/klpacxtx.html