如何对聚类结果进行分析_如何更合理地给聚类结果贴标签——由一个挖掘学生用户的项目说开去...
”聚類一時爽,判斷兩行淚“——這是解決任何一個無監督問題時都會面臨的苦惱:最近接到了一個無監督問題的項目——給一群無標簽的結構化數據貼標簽,隨后我便立即展開了工作,首先開始查閱資料,然后把EDA(數據探索) 、特征工程、數據標準等三板斧悉數打出,最后輸入'KMeans(n_clusters= num).fit(x)'這個命令行之后胸有成竹,自信得打開手機,邊“吃雞”邊等待跑數結果,所謂的數據挖掘工作就……就這!?
——然而,在幾分鐘之后,映入眼簾的只是一個個'簇'的索引,真是一頓操作猛如虎,定睛一看都是'簇’,看著這一連串‘莫的感情’、沒有任何意義的簇的序列 ,到底如何才能根據合適的理由判斷哪一簇(類)是學生、哪一簇(類)是教師?
方法一:實際調研總結規律。由于學生群體過于龐大,可以從詢問教師群體開始,因為教師授課的同時學生也在聽課,所以二者具有一定的關聯性,通過總結教師群體用戶的行為特征,推測學生用戶的行為特征,例如可以詢問教師們最早從二月份的哪一日開始使用釘釘,通常在工作日和節假日的具體哪個時段在哪個教育類app比較活躍等等。
隨即我便打消了這個念頭,首先,找到目標群體——該地區教師用戶耗費的成本過大;其次,雖然上課有統一的時間,但是上傳課件、打卡等操作時間因人而異,最后可能只得到一個分布平均的數據,不便于總結教師用戶行為特征;假如統計上課時間,雖然分布特征明顯,但因為和學生用戶是統一的,所以也難以區分是教師的行為特征還是學生的。
方法二:發放問卷。讓不同的被調查者根據每一簇的行為特征決定該簇用戶所屬標簽的最大可能性,然后根據每一簇的票數分布,判斷該簇用戶的所屬群體。設定這一方法的前提是,聚類之后,簇與簇之間的行為特征差異明顯,雖然也可以主觀判斷,但是說服力不足,讓不同的調查者共同決定,可以推測不同群體的行為習慣,增強判斷的可信度。(具體執行過程于本文第七節)
廢話不多說,開始我們的探索之旅!
1 項目背景
1.1 2020年教育行業井噴式爆發
教育部公布首批通過備案教育應用 釘釘等152款APP在列?baijiahao.baidu.com阿里旗下優酷和釘釘發起“在家上課”計劃 提供免費課程?new.qq.com因為本次疫情各學校紛紛開展線上教學,在通信網絡數據上突出了這群高初小學生的行為特征,如使用釘釘打卡、在直播平臺的流量使用增多、觀看時間有規律、基站位置無改變等等,因此移動通信運營商希望結合以上疫情期間教育類app的使用特征合理推測用戶的屬性(學生or老師or其他),然后進行精準營銷、完成商品套餐推薦等一系列操作,而在僅僅給定用戶行為數據的情況下,如何合理地把學生用戶從茫茫用戶中區分開來,也是一個不小的難題。
1.2 為什么選擇釘釘
圖1-1 二月份每一天教育類app所有用戶產生的平均流量由圖1-1可知,該地區的釘釘用戶在二月份15—17日有一段明顯的峰值,原來這段時間恰好是該地區網上開學的日子(見南方都市報),這給用戶中存在不少學生用戶這一論據提供了不小的佐證。在出現峰值的日期之外,釘釘每日的流量使用情況相較不規則,其余教育類app的流量使用情況周期性明顯,app之間只有使用的量的差別,挖掘難度較大,而且釘釘在用戶數量相對較少的情況產生的流量數據并不低于猿輔導、學而思,有量的支撐,才有挖掘的價值。
1.3 項目要求
在給定的結構化數據下:該地區二月份釘釘用戶數量為45萬,產生了大約90萬條數據,對這90萬條數據進行數據清洗、特征工程,然后使用合理的算法,找到目標用戶群體——學生。
圖1-2 部分數據節選,流量單位為Kb1.4 項目計劃
對于二月份的該地區用戶,單獨找出釘釘用戶進行KMeans聚類后,根據簇的行為特征篩選出學生用戶;對于三、四、五月份,找出特地的app(帶'家長'/'學生'字眼的客戶端,如學而思網校學生版等)用戶,設置特定的時段和流量使用最低值,進行規則識別。
2 模型介紹
2.1 什么是KMeans聚類?
k-均值是一種聚類算法。聚類算法根據數據在空間中的分布方式將其分組。聚類是一種非監督學習方法,它不需要任何形式的標簽——這種算法的目的就是基于數據本身的結構推測出簇標簽。一個簡單的例子,假如從事相同體育項目的運動員是同一類運動員,他們在具體的身體特征上是相似的,表現為空間上比較接近,自然得將其歸為一類。
具體算法過程見下:
3 數據分析
3.1 app的使用具有明顯的時段效應
圖3-1 釘釘用戶在一天各個時段產生的數據量和生活經驗相符,8-18點是人們活動和工作的時間,該時段的數據量最多;19點之后進入下班時間,數據量逐漸減少;0-7點是休息時間,數據量最少。
3.2 重要的時間節點
由圖1-1可知,在當日使用的平均流量上,該地區的用戶在二月份的15-16期間存在一個明顯的峰值,而且這段期間恰好就是該地區中小學的網上開學日。不妨假設,教師用戶在開學前就開始使用釘釘進行教學的準備,學生用戶多數在開學日當天以及開學日之后才第一次使用釘釘。
4 特征工程
4.1 構建特征
4.1.1 對使用時間進行分箱
把原本取值為0-23的連續變量——使用時間,進行分箱,轉化為取值0-2的分類變量
使用時間為0-7的,用0代替;
使用時間為8-18點的,用1代替;
使用時間為19-23點的,用2代替
data['using_time'] = pd.cut(data['using_time'],bins = [-np.inf,8,18,23],labels = False)4.1.2 對使用時間的翌日進行分類
根據數據量產生的當天是工作日與否先將數據量分開
data_work = data[data[self.daycol].dt.weekday <= 4] data_holiday = data[data[self.daycol].dt.weekday>4]4.1.3 根據使用時段和流量進行交互
二月份各個用戶在工作日和節假日對應三個時段的使用流量總和
data_bins_flux = data.groupby(['c_usr_nbr','using_time_bins'])['gprs_flux'].sum().unstack() #'c_usr_nbr'是用戶號碼這一變量名稱4.1.4 根據時間節點構建0-1變量
因為給定的數據集中 ,有顯示每條數據數據的裝載時間,為了將此方法推廣到后續地區使用,方便起見,直接取二月份平均流量的峰值日為開學日,故將最早使用時間在16號之前的變量取值為1,最早使用時間在16號之后(包括16號)設為0
data['before_schooldate_ornot'] = data['date'].apply(lambda x:1 if x < schooldate else 0)4.1.5 計算用戶在特定時間段的數據量
data_installed_times = data.groupby([self.object_col,'using_time_bins'])['gprs_flux'].count().unstack()因為數據量出現的次數代表用戶使用app的頻率,若某時段用戶使用app的流量較小,可以把數據裝載次數作為代替的參考指標之一。
最終使用的特征有:
['0-7installed_times_holiday','8-18installed_times_holiday', '19-23installed_times_holiday','0-7installed_times_work', '8-18installed_times_work','19-23installed_times_work', '0-7sum_gprs_flux_holiday','8-18sum_gprs_flux_holiday', '19-23sum_gprs_flux_holiday','0-7sum_gprs_flux_work', '8-18sum_gprs_flux_work','19-23sum_gprs_flux_work', 'before_schooldate_ornot']
圖4-1 部分數據節選,流量單位為kb4.2 離群值的處理以及數據標準化
因為在各個使用時段流量使用的分布上,存在明顯的右偏重尾分布,算法進行時容易受到離群值的影響,所以需要使用’對數變換‘將高值區間壓縮并擴展至低值區間。
np.log10(data['0-7gprs_flux_holiday']+1) ……因為K-means聚類算法涉及距離計算,還需要對數值型數據進行標準化,在這里選擇‘z-score'數據標準方法,即每個特征各自減去各自的均值再除以各自的標準差,將各個特征的均值轉化為0、方差轉化為1
(data[num_feas]-data[num_feas].mean()) / data[num_feas].std()圖4-2 標準化后的數據節選,流量單位為kb5 建模調參
5.1 超參數——'k'
關于聚類效果的評估標準,現在主要參考的指標有輪廓系數和CH指數(Calinski-Harabaz Index)。考慮到數據量大,輪廓系數計算速度較慢,這里采用‘CH’指數。在進行K從2-20的參數搜索之后,把K決定為15。
5.2 KMeans聚類
由于數據量較大,決定把最大迭代次數設為10000,為了保證每次聚類的效果不變,需要設定‘random_state = 10'
cluster = KMeans(n_clusters = 15,max_iter = 10000,random_state = 10)6 結果分析
6.1 各個簇的數量
圖6-1 KMeans聚類后各個簇的數量6.2 各個簇的特征
圖6-2 每一簇各個特征的均值大小圖6-3 全體用戶各個特征的均值經過多次的迭代計算之后,簇與簇之間行為特征區別較明顯,表現為某簇用戶會在工作日/節假日的特定時段較為活躍,其他時段在釘釘使用的流量較少,或者干脆不適用釘釘。
圖6-4 簇的索引為12的用戶行為特征例如簇的索引為12的9359位用戶,總體用戶中只有百分之48的用戶在開學前使用釘釘,但是該簇的百分之81的用戶在開學前就使用釘釘,說明該簇用戶使用釘釘時間較早,而且該簇用戶在工作日和節假日的任意時段使用的流量都遠大于總體均值,由此可知該簇用戶可以說是釘釘的深度使用用戶了,根據生活常識,他們有可能是互聯網人,但大概率既不是學生、也不是教師。
圖6-5 簇的索引為1的用戶行為特征再看這一簇的152919位用戶,只有在工作日的8-18時段才有使用釘釘的痕跡,而且流量不低,其余時間段可以說不打開釘釘。有聽直播課經驗的讀者也許深有體會,學生一般在上課時間才會使用釘釘,其余時間段幾乎不會打開釘釘;而且通過實際調研可知,學生的課后作業提交多數通過QQ郵箱發送或者微信拍照的形式,意味著在非上課時間使用釘釘的概率較小。綜上,我們有一定的信心可以認為該簇用戶有可能是我們需要尋找的學生用戶。
以上推斷看似合理,但畢竟都是主觀推測,說服性較小,因為我一個人的習慣,并不代表所有人的習慣,所以決定設立問卷調查協助分類。
7 發放問卷協助分類
具體問卷見:二月份學生用戶識別(準備發放)
問題節選:
圖7-1 調查問卷的問題10及票數分布果然大部分被調查者和我的想法基本吻合,但是也有人認為該簇用戶有可能是教師,也許該部分調查者對教師這個群體充滿敬畏,認為教師群體中存在工作狂;但是這并不影響我的大致判斷。
再看我們推測有可能為學生的那一簇:
圖7-2 調查問卷的問題2及票數分布雖然仍然有一部分的被調查者認為也有可能是'教師群體',但是推測該簇用戶為學生者居多,說明我的推測大致合理。
因為該項目的目標是找出學生群體,所以統計每一題選擇學生的票數分布,每一題的具體票數分布如下:
圖7-3 調查問卷的每一題選擇學生的票數分布根據簇1的用戶行為習慣,有百分之45的被調查者認為該簇是學生,遠遠大于其他簇為學生的可能性。
8 項目結論
從項目的二月份原數據集中,篩選出屬于‘釘釘’的數據,然后進行特征工程、數據標準化,最后進行KMeans聚類(k=15),找到索引為1的用戶便是我們的目標用戶 ——學生群體。
由于三月份已經不是開學的月份了,各個app(包括釘釘)的流量使用分布開始有了明顯的周期性;而且四月份、五月份不少中小學生開始逐漸回到校園,所以對后續月份的新增用戶,決定采用針對特定app產生的數據(明確帶'學生'/家長'字眼的客戶端,如學而思網校學生版等),進行規則識別的方法:規則的設定參考問卷調查結果,即該特定app用戶在'工作日的8-18時段使用流量是否大于總體均值'。
由于涉及用戶隱私,數據集概不外傳;
需要項目數據分析、特征工程源碼的同學可以填完問卷、點贊本文章之后,可以私聊我發送。
總結
以上是生活随笔為你收集整理的如何对聚类结果进行分析_如何更合理地给聚类结果贴标签——由一个挖掘学生用户的项目说开去...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片md5修改工具_如何修改视频和图片的
- 下一篇: 3个阶段 项目征名_2020年即将上线的