一、問題概述
手機用戶在使用短信、通話等業務、開關機、位置更新等的時候均產生定位數據,每條定位數據均包含了手機用戶所處基站的編號、時間和唯一標識用戶的EMASI號等。
將每個基站覆蓋區域視為一個商圈,通過歸納基站覆蓋區域的人流量和人均停留時間等特征,即可划分出不同類別的商圈。然后挑選出高價值商圈,並結合商圈用戶活動特點,有針對性開展促銷等活動。
現在共有431名用戶的定位信息(Excel格式),包含用戶編號以及如下考查指標:
1.人均流量:反應商圈的大致用戶密度
2.工作日上班時段人均停留時間:用以識別上班人群集中的商圈
3.凌晨人均停留時間:用以識別住宅區居民集中的商圈
4.周末人均停留時間:用以識別周末時段人群集中的商圈
分析主要分兩步,首先用tableau進行可視化分析,了解各基站(商圈)的大致情況;然后通過機器學習,采用聚類算法,對各商圈進行進一步的標識。
二、初步分析
從以下圖中,可以看到各商圈的日均人流量和各時段的停留時間情況。其中在人均停留時間的三張圖中,均有明顯的斷層現象,我們可以初步判定,斷層處即為商圈的類別划分點,斷層左邊的商圈表示該時段人均停留時間長,右邊表示停留時間短。
三、聚類分析
由於各個屬性之間的數量級相差較大,在進行聚類前,需要進行離差標准化處理,即將各屬性數據按比例縮放到一定范圍,得到建模數據。
代碼如下:
import pandas as pd import sklearn.preprocessing as prc import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] # 用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus']=False # 用來正常顯示負號 data=pd.read_excel("../data/business_circle.xls") # 讀取數據 pm=prc.MinMaxScaler() data_rd=pm.fit_transform(data.ix[:,1:]) # 數據標准化 data_rd= pd.DataFrame(data_rd,columns=data.columns[1:]) # 標准化后的數據重新轉為df格式
采用層次聚類算法對建模數據進行聚類,畫出譜系聚類圖 。聚類類別數取3 ,根據聚類結果,輸出聚類結果存入excel,並繪制各類別的四個特征折線圖。
代碼如下:
import pandas as pd import sklearn.preprocessing as prc import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] # 用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus']=False # 用來正常顯示負號 data=pd.read_excel("../data/business_circle.xls") # 讀取數據 pm=prc.MinMaxScaler() data_rd=pm.fit_transform(data.ix[:,1:]) # 數據標准化 data_rd=pd.DataFrame(data_rd,columns=data.columns[1:]) # 標准化后的數據重新轉為df格式 # print(data_rd) from scipy.cluster.hierarchy import linkage,dendrogram # 導入scipy的層次聚類函數 Z=linkage(data_rd,method="ward",metric="euclidean") # 譜系聚類圖 P=dendrogram(Z,0) # 畫譜系聚類圖 # plt.show() from sklearn.cluster import AgglomerativeClustering # 導入sklearn的層次聚類函數 model = AgglomerativeClustering(n_clusters = 3, linkage = 'ward') # 設置參數,建立模型 model.fit(data_rd) # 訓練模型 r= pd.concat([data_rd,pd.Series(model.labels_,index = data_rd.index)],axis = 1) # 詳細輸出每個樣本對應的類別 r.columns = list(data_rd.columns) + [u'聚類類別'] # 重命名表頭 style = ['ro-', 'go-', 'bo-'] xlabels = [u'工作日上班時間人均停留時間', u'凌晨人均停留時間', u'周末人均停留時間', u'日均人流量'] pic_output = '../result/picture/type_' # 聚類圖片文件名前綴 for i in range(3): # 逐一作圖,作出不同樣式 plt.figure() tmp = r[r[u'聚類類別'] == i].ix[:, :4] # 提取每一類,用於繪制折線圖 data_rs=r[r[u'聚類類別'] == i].ix[:,:] # 提取每一類,包含類別號 data_rs=pd.merge(data,data_rs,how="outer", \ on=[u'工作日上班時間人均停留時間', u'凌晨人均停留時間', u'周末人均停留時間', u'日均人流量'], \ ) # 加上基站編號,再用於輸出 data_rs["聚類類別"] = i + 1 data_rs.to_excel("../result/data"+str(i+1)+".xls") # 每一類保存為一個單獨excel文件 for j in range(len(tmp)): plt.plot(range(1, 5), tmp.iloc[j], style[i]) plt.xticks(range(1, 5), xlabels, rotation=20) # 坐標標簽 plt.title(u'商圈類別%s' % (i + 1)) # 商圈類別名稱,從1開始編號 plt.subplots_adjust(bottom=0.15) # 調整底部 plt.savefig(u'%s%s.png' % (pic_output, i)) # 保存圖片
譜系聚類圖:
從以上三張圖來看
類別2凌晨和周末人均停留時間較長,工作日人均停留時間短,日均人流量小,可以認為是住宅區域。
類別3工作日人均停留時間長,凌晨和周末人均停留時間較短,人流量偏小,可以認為是工作區域。
以上兩類區域,如果開展促銷活動,可以考慮采取一些針對居民和上班族特點的方式。
類別1在3個時段人均停留時間均不長,但人流量最大,我們認為這類人群相對於住宅區居民和上班人士,往往會對促銷之類活動更有興趣,因此,該類商圈是最宜進行促銷的。在輸出的結果文件中找到該類的基站編號,即能確定具體的活動地點。