2021 Spring NJUSE Data Integration
- 静态数据获取:使用Hadoop + Sqoop + Beeline完成静态数据的获取,总共获取到135M的数据(csv格式)
- 流数据获取:使用Kafka获取流数据,并先存储为txt格式文件,总共获取到52947000条记录,分析使用了4月11日0:27分到4月14日20:18分的数据,一共50216000条。
本部分描述了静态数据和流数据的元数据信息
create table buy_data
(
id bigint, # id标识符,无含义
user_id int, # user_id 用户id,和流数据userId对应
item_id int, # item_id 物品id,和流数据ItemId对应
category_id int, # category_id 类别id,和流数据category_id对应
type varchar(32), # 类型,均为buy
`timestamp` int # 操作的时间戳,UTC 秒
)| URL | 参数 | 额外参数 |
|---|---|---|
| /item/getDetail | userId、itemId、categoryId | SESSIONID、time |
{
"userId" : "708001",
"itemId" : "1073983",
"categoryId" : "4145813"
}| URL | 参数 | 额外参数 |
|---|---|---|
| /item/favor | userId、itemId、categoryId | SESSIONID、time |
{
"userId" : "846271",
"itemId" : "1594140",
"categoryId" : "983613"
}| URL | 参数 | 额外参数 |
|---|---|---|
| /item/cart | userId、itemId、categoryId | SESSIONID、time |
{
"userId" : "588929",
"itemId" : "5048272",
"categoryId" : "1567637"
}| URL | 参数 | 额外参数 |
|---|---|---|
| /item/buy | userId、itemId、categoryId、isSecondKill、success | SESSIONID、time |
{
"userId" : "805004",
"itemId" : "235951",
"categoryId" : "3112817",
"isSecondKill" : "0" // 表明这是一个秒杀请求,如果字段为1,则后面会跟一个额外字段success,表示秒杀是否成功,文档里有提到会有秒杀请求
}| URL | 参数 | 额外参数 |
|---|---|---|
| /user/login | userId、password、authCode、success | IPADDR、SESSIONID |
{
"userId" : "816972",
"password" : "3b5c41e94ca564cd54fceba81c9c16c4",
"authCode" : "74900269f04eb3decbda5bd4de0c5a62",
"success" : "1"
}- 数据处理
- 将txt格式的数据处理成csv格式的数据
- 根据请求类型将数据进行划分
- 根据SESSIONID、userId和ipaddr进行划分
- 机器人分析:补充:用户在部分时间段上会出现恶意机器人行为,而并不是一直会有恶意机器人行为
- 撞库机器人:使用ipaddr进行分类,检查如下,详见
- 某个时间段多次尝试登陆不同用户
- 大量的登录错误,并且登录成功后操作少(和每个用户成功登录的中位数对比)
- 抢单机器人:对userId进行划分,检查如下,详见
- 购买时间是否集中在整点或半点
- 检查秒杀的次数和成功的情况(目前适合整个系统的均值比较 TODO 和每个用户的成功的中位数比较)
- 数据集位置:grab
- 刷单机器人:对userId进行划分,检查如下,详见
- 是否某一个时间段购买行为集中在同一商品上,或者同一个时间购买大量非cart的商品
- 其他特征:平均浏览购买时间等
- 爬虫机器人:对userId进行划分,检查如下,详见
- 是否在某个时间段内大量顺序浏览单一或多个目录下的商品
- 检查浏览速度是不是远低于平均速度。
- 撞库机器人:使用ipaddr进行分类,检查如下,详见
- 分析目标
- 列出发现和判断出的恶意机器人
- 列出机器人的显著特征并指出他们在日志中的体现
- 需要的物化表
- 用户物化表(用户id,秒杀成功次数,秒杀次数,正常购买次数,登录成功次数,登录次数,同一商品最大购买次数)
- IP地址物化表(IP地址,登录次数,登录成功次数,登录成功用户数)
- 爬虫机器人需要流式检查。
- 静态数据需要的物化表
- 用户物化表(用户id,秒杀成功次数,秒杀次数,正常购买次数,平均购买前同一类别商品浏览次数,平均购买前浏览次数,平均购买前浏览时间,cart次数、favor次数,cart后购买次数、favor后购买次数、不同时间段的登录频率、成功登录IP地址数量)
- SESSIONID物化表(SESSIONID,用户id,getDetail次数,favor次数,cart次数,buy次数,login次数)
- 中间数据的下载地址
- format:从txt调整为csv格式的数据
- category:将csv格]式的数据转换为按照category进行划分。
- sessionId:将category的数据按照session_id进行排序的结果。
- userId:将category的数据按照user_id进行排序的结果。
- login:找到的所有的撞库机器人,认为有问题的结果存放在_result为后缀的文件中
- grab:找到的所有的抢单机器人,认为有问题的结果存放在_result为后缀的文件中
- swipe:找到所有的刷单机器人,认为有问题的结果存放在_result为后缀的文件中
静态数据中的购买时间从2017-11-25一直延续到2017-12-04,总共包含了709551名用户的3069186条购物记录,涉及到644641种商品和他们对应的7113个商品类别。
ID USER_ID ITEM_ID CATEGORY_ID TYPE TIMESTAMP
0 3145681 184 3810981 903809 buy 1511539200
1 3145682 39168 3310850 2520771 buy 1511539200
2 3145683 39168 1939721 1320293 buy 1511539200
3 3145684 39168 547219 2465336 buy 1511539200
4 3145685 39168 1163312 4181361 buy 1511539200使用Apriori算法对商品之间的购买关系进行分析,发现购买了类别A的用户更容易购买类别B的商品。例如有0.0046的支持率,来允许我们为购买了140410类商品的用户推荐1464116类商品。但是基于item级别的商品来看,由于计算能力限制,我们暂时无力得到更精确的推荐方式。
0.004
support itemsets length
110 0.004596 (140410, 1464116) 2
111 0.004434 (140410, 2735466) 2
112 0.004236 (2885642, 140410) 2
113 0.004262 (140410, 4145813) 2
114 0.004207 (4159072, 2885642) 2
0.003
support itemsets length
154 0.003349 (140410, 982926) 2
155 0.004596 (140410, 1464116) 2
156 0.004434 (140410, 2735466) 2
157 0.004236 (2885642, 140410) 2
158 0.004262 (140410, 4145813) 2
159 0.003704 (4756105, 140410) 2
160 0.003490 (4801426, 140410) 2
161 0.003132 (2735466, 982926) 2
162 0.003077 (4756105, 982926) 2
163 0.003284 (4801426, 982926) 2
164 0.003058 (2735466, 1464116) 2
165 0.003787 (2735466, 4145813) 2
166 0.003077 (4756105, 2735466) 2
167 0.003086 (4801426, 2735466) 2
168 0.004207 (4159072, 2885642) 2
169 0.003241 (4756105, 4145813) 2
我们将用户的购买行为按照时段来划分,00:00-06:00属于DAWN, 06::00-12:00属于MORNING, 12:00-18:00属于AFTERNOON,18:00-24:00属于NIGHT。我们通过统计用户在这四个时间划分上的购买情况,使用K-means方法对采购数量top25%的用户进行聚类分析,来也就是有5次以上购物行为的用户,来判断用户的购买活动分布进而判断用户的购物意愿。
我们将top25%的用户每个时段采购行为占总时段比例作为数据,将这个四维数据进行KNN聚类,其SSE值随K值变化如下图
根据手肘法则可以看出,在K值取4的时候,数据集的loss值产生了显著的降速放缓,也就是说我们将数据集划分为4类是一个合理的划分方式。
对于数据的分析结果来看,我们分为了四类
- 上午摸鱼型 占比27.1%(54599人),中心是(0.049572, 0.571720, 0.197599, 0.181109)
- 下午摸鱼型 占比26.7%(53567人),中心是(0.039305, 0.149116, 0.624923, 0.186655)
- 整天摸鱼晚上尤其型 占比23.8%(47951人),中心是(0.367889, 0.188619, 0.216204, 0.227288)
- 晚上摸鱼型 占比22.4%(45101人),中心是(0.042971, 0.133491, 0.155338, 0.668200)
为了使计算可行,我们取其中购买量前50000名用户对上文K-means聚类后得到的结果用T-sne流形嵌入的方法嵌入到二维平面,他们的分类结果为
可以看出在二维投影嵌入下,几种用户的区分度很高,也由此印证了我们分类方法的准确性。
通过对已有数据的穿刺分析,总共有3069185个购买
- favor了并且buy了 72139,共计有1053607个favor,favor且购买的占总购买的2.35%
- favor的转化率为6.85%
- cart的商品 共有2088061个记录,其中购买了215900个,cart且购买的占总购买的7.03%
- cart的转化率是10.34%
- getDetail且buy的转化率
- getDetail后favor的转化率
- getDetail后cart的转化率
- 数据清洗
- 清洗掉所有在流数据被识别为机器人的相关数据
- 根据userId进行划分分类统计
- 静态数据的时间戳和流数据的时间是一致的
- 数据处理,KPI:购买转化、用户留存等
- 对于纯粹的静态数据分析
- 用户角度:
- 所有用户的购买时间段,某个类别的购买时间段,通过浏览时间来划分用户群体
- 用户在同一个类别商品的购买数量
- 商品角度:
- 在某个特定类别中,商品的火热程度,当前类别销售王,当
- 前类别三日蝉联榜等
- 用户角度:
- 将静态数据和流数据结合,对每个用户按照流数据中的请求类型进行划分
- 对每个用户的所有login, cart, getDetail, favor, buy等操作,按照time,Category为主维度,getDetail/buy, cart/buy, favor/buy, buy等多种频数或频度,给用户打上tag,对每一个用户进行多维度的分析。以购买行为转化率作为KPI,我们可以获得
- 用户的决策速度,浏览多少同一类别商品后会产生购买行为,浏览多久商品后会产生购买行为,平均浏览多少商品后产生购买行为
- 用户的购物偏好,是会选择在购物车里的商品,或是favor的商品,还是倾向于浏览后选择
- 用户的常用时间,对用户的常见操作进行统计,获得用户在不同时间段的登录频率和频数
- 用户下单次数和频度
- 根据用户的login信息,我们可以统计出用户的持有设备数量,进而对用户购买力进行一定的划分或是相关性调查
- 对于纯粹的静态数据分析
- 数据分析:
- 获取计算得到不同用户的购买转化率
- 按照用户的不同维度信息,进行聚类分析,划分类群
- 对全局和不同类群中的用户分别统计,获得用户属性和偏好分布
- 获取到用户的购买偏好、下单次数、频数、浏览时间倾向
- 其他可供参考的思路
- 基于区段的机器人流量的分段分析
- 捆绑销售(部分商品可以进行捆绑销售,使用KNN或者aprioir算法)
- 用户画像(为每一个用户绘制特定的用户画像)
- 分析商品的复购率和热门产品
用户采购的长尾效应
- Superset
- Superset是apache下的可视化平台
- 可以直接连接hive进行可视化,也可以导入csv,简化了数据之间的流通。
- 安装配置过程较为简单
- 使用PowerBI
- 是微软旗下的BI平台,可连接到任何数据并对数据进行可视化
- 支持多种操作,并且拥有良好的人机交互。
- 交互式数据可视化效果创建不同的报表
- 使用Tableau
- 一款方便且强大的数据可视化工具
- 处理海量数据时输入很不方便
- 使用Matplotlib
- Python可视化库
- 配合Python程序使用方便、效果直观
- 图片可以用HTML、JPG、PNG等格式存储
- 腾讯云图、DataV:大屏展示效果很好


