1. 程式人生 > >使用者畫像準確性評測初探 ——撥開python大資料分析的神祕面紗

使用者畫像準確性評測初探 ——撥開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還有作圖功能,這次暫未用到,就不展開說啦。