大数据测试 [腾讯 TMQ] 用户画像准确性评测初探 ——拨开 python 大数据分析的神秘面纱

匿名 · 2018年07月26日 · 1276 次阅读

导读

本文主要包括两部分内容,第一部分会对零零散散进行了两个多月的用户画像评测做个简要回顾和总结,第二部分会对测试中用到的 python 大数据处理神器 pandas 做个整体介绍。

Part1 用户画像评测回顾与总结

1、为什么做用户画像评测?

将时钟拨回到 2018 年初,大家迫切想打破以往资讯推荐无章可循的局面,而今日的推荐算法也似乎演成了神话,用户意图这个词在 WiFi 管家团队被一再提及,继而 AI 推荐布局被推到了前台。

用户意图识别的优劣取决于对用户实时需求的了解程度,此事古来难。AI 团队率先做的尝试是在一些特定场景下猜测用户意图,进行意图相关推荐,如住酒店用户,地铁上用户等,这是算法可以做的事情,那测试在这个过程中可以做些什么呢?算法验证相对滞后,有什么可以先行的呢?用户意图识别首要识别对用户场景,如果场景错了,后面的工作就无法关联起来。如,住酒店,是个动态场景,尝试进一步拆分成可衡量的静态场景,如,什么人(性别,工作,偏好等)?什么时间(出行时间)住什么酒店(酒店位置,级别等)?这些我们是有后套标签系统的,经过了解这些标签系统已经有些尝试应用,但是标签本身准确性却无从评估,因此,用户标签准确性评测就在懵懂中筹备开始了。

2、用户画像准确性怎么做?

感谢先行者浏览器团队,提供了最初的评测思路,他们的考虑很周全。而我在具体的实践过程中,根据业务的实际情况制定了最终的评测方案(下图),从第一轮标签提取开始,就暴露出各种细节问题,好在都一一解决了。

简单列下可供后来者借鉴的几个注意项:

(1) 问卷设计的原则:每一个问卷题目与后台标签对应关系提前考虑好,有的一对一有的一对多。问卷的每一个选项要与对应标签的取值对应好关系,这会大大简化后期脚本处理工作。

(2) 问卷下发回收:最初下发了 label 数量>9 的用户,用>8 的用户补了 1k,结果实际回收率不到 50%,于是追加了>8 的全量用户,总共 4k 多个,实际回收依然不足 1k,而此间耗费了将近 2 周的时间。

(3) 关键字选取:整个过程关键字是 imei,但下发问卷时,众测平台关键字却是 qq,这就在数据处理上又需要多一层转换处理了。

(4) 标签系统提数:标签系统的数据是周期性更新,更新频率高,建议问卷回收后进行二次提数,尽可能减少时间差造成的数据不一致。

(5) 脚本处理:因为涉及的数据量比较大,涉及到比较多文件的处理,强烈建议装两个库,jupyter notebook(交互式笔记本,可及时编写和调试代码,很好用),还有一个大数据处理的 pandas,对于 excel 的操作实在便利太多。

(6) 经纬度处理:经纬度数据没法下发问卷,因此问卷题目设计成问具体地址,大楼,小区等。数据转换接入了地图的逆地址解析接口,然后再对比具体位置信息,这里的对比也是纠结了 1 天时间,最终精确到 2 个中文字符的维度。

3、用户画像准确性怎么分析?

至问卷回收完毕,实际工作才完成一半,接下来就是远超预估的复杂繁琐的数据处理及分析过程了。我想用下面这张图来描述整个分析过程。

整个分析包括四部分:

(1) 黄框:活跃用户数据处理。

为什么要做?

活跃用户主要下发问卷前用,这里为什么还需要做分析呢?这里的分析工作是可以省掉的,方案最后会说,先来看这里的目标是什么。因为问卷没有收集 imei 数据,而 lable 标签是根据 imei 进行统计的,因此这里需要多做一层 merge 处理,以使问卷可以补足缺失的 imei 信息。

是否可优化?是否存在风险?

细心的读者可能已经发现,这里存在一个隐患!可能导致样本数量减少,因为用户的 qq 和 imei 其实不是一一对应的,可能存在一对一或一对多情况,如果下发 imei 用户更换 qq 完成了问卷,这里的 merge 就会导致部分样本数据反查不到 imei 数据从而丢失样本。庆幸的是本次测试丢失样本数不到 10 个,否则我可能要从头再来了。

如何规避?

在用户问卷设计中让用户主动反馈 imei 信息。前期设计没有考虑清楚 key 值的设计造成了这个隐患,同时还增加了分析的工作量。

(2) 蓝框:系统 lable 数据处理。

为什么要做?

细心的读者会发现,系统 lable 在最初已经提取了,用于做单个用户 lable 数量的过滤分析,这里还可以直接用原来的数据么?

答案是非常不建议!因为后台数据会周期性更新,最初提取的数据已经不能表征问卷用户当前的上报数据了。所以 lable 数据重新提取这一步不能省。

(3) 红框:问卷数据处理。

为什么要做?

问卷设计的原则是便于用户理解选择,与代码数据上报实现差异很大,所以这里的数据解析是必须的,也是结果分析最核心的部分。

做了什么?

这里我花费了大量的时间写脚本、调试,这里大量采用 pandas,感谢它大大简化了我的代码量。为了便于大家熟悉了解 pandas 的用法,我这里会截取部分代码来看。

Action1:drop 冗余数据

经验:感谢 pandas,定义 droplist,通过 dataframe 的 drop 方法,两行代码:

Action2:按 lableid 重新定义列名

Action3:常规各列数据处理(举个栗子)

(4)绿框:diff 结果分析

做了什么?

在脚本处理上经纬度会更复杂,但思路大同小异,便于解说,这里以常规数据举例。

关键点 1:利用 dataframe 将一行取出来存成 array:

关键点 2:定义 diffresult 文件列名:

关键点 3:遍历每一列数据,过滤掉不存在 lable:

关键点 4:循环遍历比较系统数据和用户数据:

在本 part 最后,再总结下不足,主要有如下三方面:

(1) 样本覆盖全面性不够:覆盖具有局限性,不能代表所有的用户;

(2) 无法全自动化监控:问卷设计及提数暂时无法自动化,也就仅限于一次摸底;

(3) 样本数量不足:单个用户的标签不全,导致标签整体数量偏少。

Part2 pandas 使用总结

1、jupyter 环境准备 ##(web 交互式笔记本,python 快速编码运行调试神器)。

(1)pip install jupyter

解决:下载 ipython-5.7.0-py2-none-any.whl,notebook-5.5.0-py2.py3-none-any.whl 放到 python 的 Scripts 目录下,pip install xxx.whl。

(2)再次 pipinstall jupyter

(3)使用 jupyter notebook

new-选择对应类型可打开交互式笔记本界面。

2、Pandas 擅长做什么?

(1)快速读写 csv、excel、sql,以原表数据结构存储,便捷操作处理行、列数据;

(2)数据文档行列索引快速一键重定义;

(3)强大的函数支持大数据文件的快速统计分析;

(4)可以对整个数据结构进行操作,不必一行行循环读取……

如果您有上述需求,不妨继续往下看。

3、pandas 安装

(1)安装:一般用 pip,安装第三方库前不妨先更新下 pip。

python -m pip install -U pip

pip install pandas

(2)导入

import pandas as pd

(3) 帮助

查看 python 第三方库帮助,利用 python 自带 pydoc 文档生成工具

Step1:配置 pydoc 服务

Cmd 下 python –m pydoc –p 1234

Step2:浏览器打开http://localhost:1234/

4、Pandas 数据结构

series:带标签的一维数组,标签可以重定义。

dataframe:二维表格性数组,导入读取的 csv、excel 就是这种结构,可以直接对行列做操作。

举个例子:


读取表格——得到类型是 DataFrame 的二维数组 question_data:

其中的一列 df[‘num’] 就是一维数组 series,像个竖起来的 list。

5、pandas 的数据处理

(1)数据检索处理。

(a)查询首尾;

(b)查询某行,列;

注意:iloc、loc、ix(尽量用 ix,避免搞不清楚 index 和行号)。

loc:主要通过 index 索引行数据。df.loc[1:] 可获取多行,df.loc[[1],[‘name’,’score’]] 也可获取某行某列 iloc:主要通过行号索引行数据。与 loc 的区别,index 可以定义,行号固定不变,index 没有重新定义的话,index 与行号相同。

ix:结合 loc 和 iloc 的混合索引。df.ix[1],df.ix[‘1’]。

(c)按条件查询指定行和列;

(d)多条件查询;

(2)数据增删改处理。

(a)增删行;


(b)增删列;


(c)行列数据相连:参看(3)(c)。

(3)多表数据处理;

(a)merge;

eg:合并两张表:

stu_score1 = pd.merge(df_student, df_score, on='Name')——内连接,交集。

stu_score1

stu_score2 =pd.merge(df_student, df_score, on='Name',how='left')——左连接,以左边为准。

stu_score2

how 参数:inner(默认),left,right,outer,分别为内、左、右、外连接,inner 为交集,outer 为并集。

(b)join——how 原则同 merge,默认 how=‘left’
主用于索引拼接列,两张表不同列索引合并成一个 DataFram,比较少用。

(c)concat——axis=0,按行合并,axis=1,按列合并
stu_score2 = pd.concat([df_student,df_score], axis=0)。

stu_score2

(4)数据统计处理;

(a)df.describe()

根据某列计算一系列统计值,df[‘xxx’].describe(),返回如下数据表:

(b)df.set_index(‘列 a’) 与 df.reset_index(‘列 a’)

需要对某列数据处理时可以通过 set_index() 设为索引,再用 df.sort_index() 进行排序,然后再通过 reset_index() 设回数据。

(5)文件读写处理;

以 csv 为例
df = pd.read_csv("D:/pandas_test.csv", encoding='utf-8')
df.to_csv(r"D:\test.csv", index=False,sep=',', encoding='utf_8_sig')

写文件时设置 encoding='utf_8_sig'可解决中文乱码问题。

(6)数据集批量处理。

(a)apply 和 applymap

df[‘’].apply(函数) 对某列数据应用函数,df.applymap(函数) 对整个表应用函数。

(b)groupby

根据某列或某几列分组,本身没有任何计算,返回,用于做分组后的数据统计,如:

group_results = total_result.groupby(['lable', 'diff_value']).size() 返回每个分组的个数,常用的有 max(),min(),mean()

如上是本次脚本分析涉及到的功能,此外,pandas 还有作图功能,这次暂未用到,就不展开说啦。

关注腾讯移动品质中心 TMQ,获取更多测试干货!

版权所属,禁止转载!!!

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册