Part1 用户画像评测回顾与总结python
一、为何作用户画像评测?web
将时钟拨回到2018年初,你们迫切想打破以往资讯推荐无章可循的局面,而今日的推荐算法也彷佛演成了神话,用户意图这个词在WiFi管家团队被一再说起,继而AI推荐布局被推到了前台。算法
用户意图识别的优劣取决于对用户实时需求的了解程度,此事古来难。AI团队率先作的尝试是在一些特定场景下猜想用户意图,进行意图相关推荐,如住酒店用户,地铁上用户等,这是算法能够作的事情,那测试在这个过程当中能够作些什么呢?算法验证相对滞后,有什么能够先行的呢?用户意图识别首要识别对用户场景,若是场景错了,后面的工做就没法关联起来。如,住酒店,是个动态场景,尝试进一步拆分红可衡量的静态场景,如,什么人(性别,工做,偏好等)?什么时间(出行时间)住什么酒店(酒店位置,级别等)?这些咱们是有后套标签系统的,通过了解这些标签系统已经有些尝试应用,可是标签自己准确性却无从评估,所以,用户标签准确性评测就在懵懂中筹备开始了。sql
二、用户画像准确性怎么作?数组
感谢先行者浏览器团队,提供了最初的评测思路,他们的考虑很周全。而我在具体的实践过程当中,根据业务的实际状况制定了最终的评测方案(下图),从第一轮标签提取开始,就暴露出各类细节问题,好在都一一解决了。浏览器
简单列下可供后来者借鉴的几个注意项: 视频资料学习分享 企(Q)鹅群 519970686数据结构
(1) 问卷设计的原则:每个问卷题目与后台标签对应关系提早考虑好,有的一对一有的一对多。问卷的每个选项要与对应标签的取值对应好关系,这会大大简化后期脚本处理工做。app
(2) 问卷下发回收:最初下发了label数量>9的用户,用>8的用户补了1k,结果实际回收率不到50%,因而追加了>8的全量用户,总共4k多个,实际回收依然不足1k,而此间耗费了将近2周的时间。函数
(3) 关键字选取:整个过程关键字是imei,但下发问卷时,众测平台关键字倒是qq,这就在数据处理上又须要多一层转换处理了。工具
(4) 标签系统提数:标签系统的数据是周期性更新,更新频率高,建议问卷回收后进行二次提数,尽量减小时间差形成的数据不一致。
(5) 脚本处理:由于涉及的数据量比较大,涉及到比较多文件的处理,强烈建议装两个库,jupyter notebook(交互式笔记本,可及时编写和调试代码,很好用),还有一个大数据处理的pandas,对于excel的操做实在便利太多。
(6) 经纬度处理:经纬度数据无法下发问卷,所以问卷题目设计成问具体地址,大楼,小区等。数据转换接入了地图的逆地址解析接口,而后再对比具体位置信息,这里的对比也是纠结了1天时间,最终精确到2个中文字符的维度。
三、用户画像准确性怎么分析?
至问卷回收完毕,实际工做才完成一半,接下来就是远超预估的复杂繁琐的数据处理及分析过程了。我想用下面这张图来描述整个分析过程。
整个分析包括四部分:
(1) 黄框:活跃用户数据处理。
1.为何要作?
活跃用户主要下发问卷前用,这里为何还须要作分析呢?这里的分析工做是能够省掉的,方案最后会说,先来看这里的目标是什么。由于问卷没有收集imei数据,而lable标签是根据imei进行统计的,所以这里须要多作一层merge处理,以使问卷能够补足缺失的imei信息。
2.是否可优化?是否存在风险?
细心的读者可能已经发现,这里存在一个隐患!可能致使样本数量减小,由于用户的qq和imei其实不是一一对应的,可能存在一对一或一对多状况,若是下发imei用户更换qq完成了问卷,这里的merge就会致使部分样本数据反查不到imei数据从而丢失样本。庆幸的是本次测试丢失样本数不到10个,不然我可能要从头再来了。
3.如何规避?
在用户问卷设计中让用户主动反馈imei信息。前期设计没有考虑清楚key值的设计形成了这个隐患,同时还增长了分析的工做量。
(2) 蓝框:系统lable数据处理。
1.为何要作?
细心的读者会发现,系统lable在最初已经提取了,用于作单个用户lable数量的过滤分析,这里还能够直接用原来的数据么?
答案是很是不建议!由于后台数据会周期性更新,最初提取的数据已经不能表征问卷用户当前的上报数据了。因此lable数据从新提取这一步不能省。
(3) 红框:问卷数据处理。
1.为何要作?
问卷设计的原则是便于用户理解选择,与代码数据上报实现差别很大,因此这里的数据解析是必须的,也是结果分析最核心的部分。
2.作了什么?
这里我花费了大量的时间写脚本、调试,这里大量采用pandas,感谢它大大简化了个人代码量。为了便于你们熟悉了解pandas的用法,我这里会截取部分代码来看。
Action1:drop冗余数据
经验:感谢pandas,定义droplist,经过dataframe的drop方法,两行代码:
Action2:按lableid从新定义列名
Action3:常规各列数据处理(举个栗子)
(4)绿框:diff结果分析
1.作了什么?
在脚本处理上经纬度会更复杂,但思路大同小异,便于解说,这里以常规数据举例。
关键点1:利用dataframe将一行取出来存成array:
关键点2:定义diffresult文件列名:
关键点3:遍历每一列数据,过滤掉不存在lable:
关键点4:循环遍历比较系统数据和用户数据:
在本part最后,再总结下不足,主要有以下三方面: 视频资料学习分享 企(Q)鹅群 519970686
(1) 样本覆盖全面性不够:覆盖具备局限性,不能表明全部的用户;
(2) 没法全自动化监控:问卷设计及提数暂时没法自动化,也就仅限于一次摸底;
(3) 样本数量不足:单个用户的标签不全,致使标签总体数量偏少。
Part2 pandas使用总结
一、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-选择对应类型可打开交互式笔记本界面。
二、Pandas擅长作什么?
(1)快速读写csv、excel、sql,以原表数据结构存储,便捷操做处理行、列数据;
(2)数据文档行列索引快速一键重定义;
(3)强大的函数支持大数据文件的快速统计分析;
(4)能够对整个数据结构进行操做,没必要一行行循环读取……
若是您有上述需求,不妨继续往下看。
三、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/
四、Pandas数据结构
series:带标签的一维数组,标签能够重定义。
dataframe:二维表格性数组,导入读取的csv、excel就是这种结构,能够直接对行列作操做。
举个例子:
读取表格——获得类型是DataFrame的二维数组question_data:
其中的一列df[‘num’]就是一维数组series,像个竖起来的list。
五、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)文件读写处理; 视频资料学习分享 企(Q)鹅群 519970686
以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还有做图功能,此次暂未用到,就不展开说啦。