使用者畫像準確性評測初探 ——撥開python大資料分析的神祕面紗
Part1 使用者畫像評測回顧與總結
1、為什麼做使用者畫像評測?
將時鐘撥回到2018年初,大家迫切想打破以往資訊推薦無章可循的局面,而今日的推薦演算法也似乎演成了神話,使用者意圖這個詞在WiFi管家團隊被一再提及,繼而AI推薦佈局被推到了前臺。
使用者意圖識別的優劣取決於對使用者實時需求的瞭解程度,此事古來難。AI團隊率先做的嘗試是在一些特定場景下猜測使用者意圖,進行意圖相關推薦,如住酒店使用者,地鐵上使用者等,這是演算法可以做的事情,那測試在這個過程中可以做些什麼呢?演算法驗證相對滯後,有什麼可以先行的呢?使用者意圖識別首要識別對使用者場景,如果場景錯了,後面的工作就無法關聯起來。如,住酒店,是個動態場景,嘗試進一步拆分成可衡量的靜態場景,如,什麼人(性別,工作,偏好等)?什麼時間(出行時間)住什麼酒店(酒店位置,級別等)?這些我們是有後套標籤系統的,經過了解這些標籤系統已經有些嘗試應用,但是標籤本身準確性卻無從評估,因此,使用者標籤準確性評測就在懵懂中籌備開始了。
2、使用者畫像準確性怎麼做?
感謝先行者瀏覽器團隊,提供了最初的評測思路,他們的考慮很周全。而我在具體的實踐過程中,根據業務的實際情況制定了最終的評測方案(下圖),從第一輪標籤提取開始,就暴露出各種細節問題,好在都一一解決了。
簡單列下可供後來者借鑑的幾個注意項: 視訊資料學習分享 企(Q)鵝群 519970686
(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) 黃框:活躍使用者資料處理。
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使用總結
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)檔案讀寫處理; 視訊資料學習分享 企(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還有作圖功能,這次暫未用到,就不展開說啦。