Part1 用戶畫像評測回顧與總結(jié)
1、為什么做用戶畫像評測?
將時鐘撥回到2018年初,大家迫切想打破以往資訊推薦無章可循的局面,而今日的推薦算法也似乎演成了神話,用戶意圖這個詞在WiFi管家團隊被一再提及,繼而AI推薦布局被推到了前臺。
用戶意圖識別的優(yōu)劣取決于對用戶實時需求的了解程度,此事古來難。AI團隊率先做的嘗試是在一些特定場景下猜測用戶意圖,進行意圖相關(guān)推薦,如住酒店用戶,地鐵上用戶等,這是算法可以做的事情,那測試在這個過程中可以做些什么呢?算法驗證相對滯后,有什么可以先行的呢?用戶意圖識別首要識別對用戶場景,如果場景錯了,后面的工作就無法關(guān)聯(lián)起來。如,住酒店,是個動態(tài)場景,嘗試進一步拆分成可衡量的靜態(tài)場景,如,什么人(性別,工作,偏好等)?什么時間(出行時間)住什么酒店(酒店位置,級別等)?這些我們是有后套標簽系統(tǒng)的,經(jīng)過了解這些標簽系統(tǒng)已經(jīng)有些嘗試應(yīng)用,但是標簽本身準確性卻無從評估,因此,用戶標簽準確性評測就在懵懂中籌備開始了。
2、用戶畫像準確性怎么做?
感謝先行者瀏覽器團隊,提供了最初的評測思路,他們的考慮很周全。而我在具體的實踐過程中,根據(jù)業(yè)務(wù)的實際情況制定了最終的評測方案(下圖),從第一輪標簽提取開始,就暴露出各種細節(jié)問題,好在都一一解決了。
簡單列下可供后來者借鑒的幾個注意項:?視頻資料學(xué)習(xí)分享 企(Q)鵝群 519970686
(1) 問卷設(shè)計的原則:每一個問卷題目與后臺標簽對應(yīng)關(guān)系提前考慮好,有的一對一有的一對多。問卷的每一個選項要與對應(yīng)標簽的取值對應(yīng)好關(guān)系,這會大大簡化后期腳本處理工作。
(2) 問卷下發(fā)回收:最初下發(fā)了label數(shù)量>9的用戶,用>8的用戶補了1k,結(jié)果實際回收率不到50%,于是追加了>8的全量用戶,總共4k多個,實際回收依然不足1k,而此間耗費了將近2周的時間。
(3) 關(guān)鍵字選?。赫麄€過程關(guān)鍵字是imei,但下發(fā)問卷時,眾測平臺關(guān)鍵字卻是qq,這就在數(shù)據(jù)處理上又需要多一層轉(zhuǎn)換處理了。
(4) 標簽系統(tǒng)提數(shù):標簽系統(tǒng)的數(shù)據(jù)是周期性更新,更新頻率高,建議問卷回收后進行二次提數(shù),盡可能減少時間差造成的數(shù)據(jù)不一致。
(5) 腳本處理:因為涉及的數(shù)據(jù)量比較大,涉及到比較多文件的處理,強烈建議裝兩個庫,jupyter notebook(交互式筆記本,可及時編寫和調(diào)試代碼,很好用),還有一個大數(shù)據(jù)處理的pandas,對于excel的操作實在便利太多。
(6) 經(jīng)緯度處理:經(jīng)緯度數(shù)據(jù)沒法下發(fā)問卷,因此問卷題目設(shè)計成問具體地址,大樓,小區(qū)等。數(shù)據(jù)轉(zhuǎn)換接入了地圖的逆地址解析接口,然后再對比具體位置信息,這里的對比也是糾結(jié)了1天時間,最終精確到2個中文字符的維度。
3、用戶畫像準確性怎么分析?
至問卷回收完畢,實際工作才完成一半,接下來就是遠超預(yù)估的復(fù)雜繁瑣的數(shù)據(jù)處理及分析過程了。我想用下面這張圖來描述整個分析過程。
整個分析包括四部分:
(1) 黃框:活躍用戶數(shù)據(jù)處理。
1.為什么要做?
活躍用戶主要下發(fā)問卷前用,這里為什么還需要做分析呢?這里的分析工作是可以省掉的,方案最后會說,先來看這里的目標是什么。因為問卷沒有收集imei數(shù)據(jù),而lable標簽是根據(jù)imei進行統(tǒng)計的,因此這里需要多做一層merge處理,以使問卷可以補足缺失的imei信息。
2.是否可優(yōu)化?是否存在風(fēng)險?
細心的讀者可能已經(jīng)發(fā)現(xiàn),這里存在一個隱患!可能導(dǎo)致樣本數(shù)量減少,因為用戶的qq和imei其實不是一一對應(yīng)的,可能存在一對一或一對多情況,如果下發(fā)imei用戶更換qq完成了問卷,這里的merge就會導(dǎo)致部分樣本數(shù)據(jù)反查不到imei數(shù)據(jù)從而丟失樣本。慶幸的是本次測試丟失樣本數(shù)不到10個,否則我可能要從頭再來了。
3.如何規(guī)避?
在用戶問卷設(shè)計中讓用戶主動反饋imei信息。前期設(shè)計沒有考慮清楚key值的設(shè)計造成了這個隱患,同時還增加了分析的工作量。
(2) 藍框:系統(tǒng)lable數(shù)據(jù)處理。
1.為什么要做?
細心的讀者會發(fā)現(xiàn),系統(tǒng)lable在最初已經(jīng)提取了,用于做單個用戶lable數(shù)量的過濾分析,這里還可以直接用原來的數(shù)據(jù)么?
答案是非常不建議!因為后臺數(shù)據(jù)會周期性更新,最初提取的數(shù)據(jù)已經(jīng)不能表征問卷用戶當前的上報數(shù)據(jù)了。所以lable數(shù)據(jù)重新提取這一步不能省。
(3) 紅框:問卷數(shù)據(jù)處理。
1.為什么要做?
問卷設(shè)計的原則是便于用戶理解選擇,與代碼數(shù)據(jù)上報實現(xiàn)差異很大,所以這里的數(shù)據(jù)解析是必須的,也是結(jié)果分析最核心的部分。
2.做了什么?
這里我花費了大量的時間寫腳本、調(diào)試,這里大量采用pandas,感謝它大大簡化了我的代碼量。為了便于大家熟悉了解pandas的用法,我這里會截取部分代碼來看。
Action1:drop冗余數(shù)據(jù)
經(jīng)驗:感謝pandas,定義droplist,通過dataframe的drop方法,兩行代碼:
Action2:按lableid重新定義列名
Action3:常規(guī)各列數(shù)據(jù)處理(舉個栗子)
(4)綠框:diff結(jié)果分析
1.做了什么?
在腳本處理上經(jīng)緯度會更復(fù)雜,但思路大同小異,便于解說,這里以常規(guī)數(shù)據(jù)舉例。
關(guān)鍵點1:利用dataframe將一行取出來存成array:
關(guān)鍵點2:定義diffresult文件列名:
關(guān)鍵點3:遍歷每一列數(shù)據(jù),過濾掉不存在lable:
關(guān)鍵點4:循環(huán)遍歷比較系統(tǒng)數(shù)據(jù)和用戶數(shù)據(jù):
在本part最后,再總結(jié)下不足,主要有如下三方面:?視頻資料學(xué)習(xí)分享 企(Q)鵝群 519970686
(1) 樣本覆蓋全面性不夠:覆蓋具有局限性,不能代表所有的用戶;
(2) 無法全自動化監(jiān)控:問卷設(shè)計及提數(shù)暫時無法自動化,也就僅限于一次摸底;
(3) 樣本數(shù)量不足:單個用戶的標簽不全,導(dǎo)致標簽整體數(shù)量偏少。
Part2 pandas使用總結(jié)
1、jupyter環(huán)境準備(web交互式筆記本,python快速編碼運行調(diào)試神器)。
(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-選擇對應(yīng)類型可打開交互式筆記本界面。
2、Pandas擅長做什么?
(1)快速讀寫csv、excel、sql,以原表數(shù)據(jù)結(jié)構(gòu)存儲,便捷操作處理行、列數(shù)據(jù);
(2)數(shù)據(jù)文檔行列索引快速一鍵重定義;
(3)強大的函數(shù)支持大數(shù)據(jù)文件的快速統(tǒng)計分析;
(4)可以對整個數(shù)據(jù)結(jié)構(gòu)進行操作,不必一行行循環(huán)讀取……
如果您有上述需求,不妨繼續(xù)往下看。
3、pandas安裝
(1)安裝:一般用pip,安裝第三方庫前不妨先更新下pip。
python -m pip install -U pip
pip install pandas
(2)導(dǎo)入
import pandas as pd
(3) 幫助
查看python第三方庫幫助,利用python自帶pydoc文檔生成工具
Step1:配置pydoc服務(wù)
Cmd下python –m pydoc –p 1234
Step2:瀏覽器打開http://localhost:1234/
4、Pandas數(shù)據(jù)結(jié)構(gòu)
series:帶標簽的一維數(shù)組,標簽可以重定義。
dataframe:二維表格性數(shù)組,導(dǎo)入讀取的csv、excel就是這種結(jié)構(gòu),可以直接對行列做操作。
舉個例子:
讀取表格——得到類型是DataFrame的二維數(shù)組question_data:
其中的一列df[‘num’]就是一維數(shù)組series,像個豎起來的list。
5、pandas的數(shù)據(jù)處理
(1)數(shù)據(jù)檢索處理。
(a)查詢首尾;
(b)查詢某行,列;
注意:iloc、loc、ix(盡量用ix,避免搞不清楚index和行號)。
loc:主要通過index索引行數(shù)據(jù)。df.loc[1:]可獲取多行,df.loc[[1],[‘name’,’score’]]也可獲取某行某列iloc:主要通過行號索引行數(shù)據(jù)。與loc的區(qū)別,index可以定義,行號固定不變,index沒有重新定義的話,index與行號相同。
ix:結(jié)合loc和iloc的混合索引。df.ix[1],df.ix[‘1’]。
(c)按條件查詢指定行和列;
(d)多條件查詢;
(2)數(shù)據(jù)增刪改處理。
(a)增刪行;
(b)增刪列;
(c)行列數(shù)據(jù)相連:參看(3)(c)。
(3)多表數(shù)據(jù)處理;
(a)merge;
eg:合并兩張表:
stu_score1 = pd.merge(df_student, df_score, on='Name')——內(nèi)連接,交集。
stu_score1
stu_score2 =pd.merge(df_student, df_score, on='Name',how='left')——左連接,以左邊為準。
stu_score2
how參數(shù):inner(默認),left,right,outer,分別為內(nèi)、左、右、外連接,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)數(shù)據(jù)統(tǒng)計處理;
(a)df.describe()
根據(jù)某列計算一系列統(tǒng)計值,df[‘xxx’].describe(),返回如下數(shù)據(jù)表:
(b)df.set_index(‘列a’)與df.reset_index(‘列a’)
需要對某列數(shù)據(jù)處理時可以通過set_index()設(shè)為索引,再用df.sort_index()進行排序,然后再通過reset_index()設(shè)回數(shù)據(jù)。
(5)文件讀寫處理;?視頻資料學(xué)習(xí)分享 企(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')
寫文件時設(shè)置encoding='utf_8_sig'可解決中文亂碼問題。
(6)數(shù)據(jù)集批量處理。
(a)apply和applymap
df[‘’].apply(函數(shù))對某列數(shù)據(jù)應(yīng)用函數(shù),df.applymap(函數(shù))對整個表應(yīng)用函數(shù)。
(b)groupby
根據(jù)某列或某幾列分組,本身沒有任何計算,返回,用于做分組后的數(shù)據(jù)統(tǒng)計,如:
group_results = total_result.groupby(['lable', 'diff_value']).size()返回每個分組的個數(shù),常用的有max(),min(),mean()
如上是本次腳本分析涉及到的功能,此外,pandas還有作圖功能,這次暫未用到,就不展開說啦。