DBSCAN和Kmeans混合演算法定位投訴焦點區域
需求描述
用戶投訴管理作為銜接客戶和產品部門、專業技術部門的橋樑和紐帶,是運營商服務作中尤為重要的一個環節,也是運營商發現同題和提升移動網路質量的重要途徑。
根據投訴工單裡面的投訴地點坐標,熱點匯聚ID唯一標誌一個投訴熱點區域,根據熱點匯聚演算法完成熱點區域渲染,實現熱點數據表格輸出的同時識別熱點區域邊界生成熱點區域圖,通過多維度投訴分析,能按地市、區縣輸出投訴熱點區域,投訴熱點內主要投訴類型並歸類統計,並結合問題分析結果推送至責任部門並實行督辦,納入省內陣地戰考核,並進行問題的跟蹤質檢。
需求分析
這裡只涉及到投訴熱點區域的匯聚和投訴中心點坐標的生成,屬於非常典型的無監督學習裡面的聚類演算法可以解決的問題。
聚類得到投訴熱點區域,可以使用DBSCAN按密度分布的演算法,主要參數有2個:ε,用來確定離給定的點多遠來搜索;和minPoints,決定一個給定的點的鄰域附近最少有多少點。通過尋找鄰近點,本地類簇開始出現,各種形狀的類簇逐漸可以被識別。過於孤立的點和離其他點太遠的點則會被分配到一個特殊的異常值集群(類別識別ID=-1)。這些獨特的屬性使DBSCAN演算法適合對地理定位事件進行聚類。
如果需要得到每個聚類生成的簇的中心點的位置(質心),可以對聚類生成的簇再使用KMEANS演算法(指定類別數量為1)即可。
原始數據如下所示:第四列是投訴工單編號,最後兩列是投訴地點的經緯度。
需求實現關鍵代碼及說明
(1)讀取excel文件,提取必要的列:
pathFile="G:sampledata"
fileName="complains.xlsx"
fileToRead=os.path.join(pathFile,fileName)
df=pd.read_excel(fileToRead,header=0,usecols=[0,3,4,15,16],names=["date","id","user","long","lat"])
(2) 去除空值
df.dropna(subset=["long", "lat"], how="any", inplace=True)
(3)過濾掉不合理的經緯度數然後去重
df=df.loc[(df.long>90) & (df.long21) & (df.lat
(4)生成距離矩陣
coords=df.as_matrix(columns=["long","lat"])
#這裡需要用到一個自定義函數,計算球面距離
distance_matrix=squareform(pdist(coords,(lambda x,y:haversine2(x,y))))
(5)調用DBSCAN聚類演算法,計算聚類後的簇(設定門限為300米內5個點)
db=DBSCAN(eps=300,min_samples=5,metric="precomputed")
y_db=db.fit_predict(distance_matrix)
df["cluster"]=y_db
(6)計算投訴工單聚類後的簇的中心點,這裡需要使用到KMEANS演算法
#去除掉異常點的類,-1,分組為-1的代表雜訊點
df2=df.loc[df.cluster !=-1]
clu_cente=[]
for i in set(df2.cluster):
kmCluster=df2.loc[(df2.cluster)==i,["long","lat"]]
km=KMeans(n_clusters=1)
clf=km.fit(kmCluster)
center=clf.cluster_centers_
clu_cente.append([i,center[0][0],center[0][1]])
center_df=pd.DataFrame(clu_cente,columns=["cluster","long_cent_clu","lat_cent_clu"])
result=df2.merge(center_df,on="cluster",how="inner",)
聚類之後的結果:最後三列分別代表聚類後的簇id,簇的中心經、緯度
實現效果
通過python的繪圖功能可以查看到聚類之後的簇:
plt.scatter(x=df2["lat"],y=df2["long"],c=df2["cluster"])
plt.show()
在百度地圖上可以將簇內的點包裹為區域,呈現出來:
擴展:
該方法可擴充到類似場景需求的很多應用當中,比如針對干擾投訴點聚類干擾集中區域、針對用戶的地理軌跡聚類得到用戶的家、辦公室地址等等
完整源代碼和數據文件可到如下地址獲取:
https://github.com/StevenYaoMing/MachineLearning
致謝:
主要程序代碼和思路借鑒了博文:
用戶地理位置的聚類演算法實現—基於DBSCAN和Kmeans的混合演算法 https://www.jianshu.com/p/8ee6bd9219f7
TAG:雲客工作室 |