利用基站定位數據進行商圈划分


一、問題概述

  手機用戶在使用短信、通話等業務、開關機、位置更新等的時候均產生定位數據,每條定位數據均包含了手機用戶所處基站的編號、時間和唯一標識用戶的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個時段人均停留時間均不長,但人流量最大,我們認為這類人群相對於住宅區居民和上班人士,往往會對促銷之類活動更有興趣,因此,該類商圈是最宜進行促銷的。在輸出的結果文件中找到該類的基站編號,即能確定具體的活動地點。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM