基於基站定位數據的商圈分析

基於基站定位數據的商圈分析


由於本書中很多沒有給出最原始的數據。多是處理過程中的數據,失去了很多做數據特徵工程的訓練。
以後會更加註重kaggle比賽上的數據特徵分析。

實驗介紹

實驗背景

隨着個人手機和網絡的普及,手機已經基本成爲所有人必須持有的工具。根據手機信號再地理空間的覆蓋情況結合時間序列的手機定位數據可以完整的還原人羣的現實活動軌跡從而得到人口空間分佈於活動聯繫的特徵信息。

商圈是現代市場中的重要企業活動空間,商圈劃分的目的之一是爲了研究潛在的顧客分佈,以制定適宜的商業對策。本次數據,是由通信運營商提供的,特定接口解析得到的用戶定位數據。
在這裏插入圖片描述

實驗目標

  1. 對用戶的歷史定位數據,採用數據挖掘技術,對基站進行分羣
  2. 對不同的商圈分羣進行特徵分析,比較不同商圈類別的價值,選擇合適區域進行針對性的營銷活動

實驗分析方法與過程

通過數據是由通信運營商提供,可以推測手機用戶在使用短信業務、通話業務和上網業務等信息時產生的定位數據。由於數據中是由不同基站作爲位置的辨別,可以將每個基站當做一個”商圈“,再通過歸納基站範圍的人口特徵,運用聚類算法,識別不同類別的基站範圍,即可等同識別不同類別的商圈。衡量區域人口特徵,可以從人流量和人均停留時間的角度進行分析。

分析流程

在這裏插入圖片描述

1)從移動通信運營商提供的特定接口上解析、處理、並濾除用戶屬性後得到用戶定位數據。
2)以單個用戶爲例,進行數據探索分析,研究在不同基站的停留時間,並進一步地進行預處理,包括數據規約和數據變換。
3)利用步驟2)形成的已完成數據預處理的建模數據,基於基站覆蓋範圍區域的人流特徵進行商圈聚類,對各個商圈分羣進行特徵分析,選擇合適的區域進行運營商的促銷活動。

數據抽取分析

數據抽取

從移動通信運營商提供的特定接口上解析、處理和過濾後,獲得位置數據。時間設定爲,2014-1-1爲開始時間,2014-6-30爲結束時間作爲分析的觀測窗口,抽取窗口內某市某區域的定位數據形成建模數據。

數據分析

爲了便於觀察數據,先提取用戶的ID即EMASI號爲”55555“的用戶再2014年1月1號的定位數據。

觀察數據,可以發現,兩條數據可能是同一基站的不同時間
在這裏插入圖片描述

從表中可以看到,用戶在2014年1月1日00:31:48處於36908基站的範圍,下一個記錄是用戶在2014年1月1日00:53:46處於36908基站的範圍,這表明了用戶從00:31:48到00:53:46都是處於36908基站,共停留了21分58秒,並且在00:53:46進入了36902基站的範圍。判斷用戶在每個基站的停留時間需要依靠當前記錄與下一條記錄的對比,發生變化則意味着用戶所在基站發生改變,可以記錄在上一個基站停留的時間。

數據預處理

數據規約

原始數據的屬性較多,由我們的挖掘目標,網絡類型、LOC編號和信令類型這三個屬性沒有作用,剔除。衡量用戶停留時間,沒有必要精確到毫秒,故一同刪除。在計算用戶的停留時間,只計算兩條記錄的時間差,爲了減少數據維度,把年月日合併爲日期,時分秒合併爲時間,得到數據。
在這裏插入圖片描述

數據變換

挖掘的目標是尋找高價值的商圈,需要根據用戶的定位數據,提取出基站範圍內區域的人流特徵,如人均停留時間和人流等。高價值商圈,在人流特徵上有人流量大和人均停留時間長的特點。寫字樓的上班族在白天所處基站範圍固定,時間也較長,人流量也大。居住區,也有基站範圍固定,時間長,人流量大的特點。所以,單純的停留時間無法判斷商圈類別。現代社會工作,以一週爲一個工作小週期,分爲工作日和週末。一天中,分爲上班時間和下班時間。

綜上所述,設計人流特徵的四個指標,工作日上班時間人均停留時間、凌晨人均停留時間、週末人均停留時間和日均人流量。工作日上班時間人均停留時間,意思是所有用戶在上班時間9:0018:00處在該基站範圍內的平均時間凌晨人均停留時間,意思是所有用戶在凌晨時間00:0007:00處在該基站範圍的平均時間週末人均停留時間,如上類推。日均人流量,指的是平均每天曾經在該基站範圍內的人數。

這四個指標的計算,直接從原始數據計算比較複雜,需要先處理成中間數據,再從中計算得出四個指標。對於基站1,有以下公式,再帶入所有基站,得出結果。
在這裏插入圖片描述
在這裏插入圖片描述

由於各個屬性之間的差異較大。爲了消除數量級數據帶來的影響,在聚類之前,需要進行離差標準化處理,離差標準化處理的代碼如下,得到建模的樣本數據。

#-*- coding: utf-8 -*-
#數據標準化到[0,1]
import pandas as pd

#參數初始化
filename = '../data/business_circle.xls' #原始數據文件
standardizedfile = '../tmp/standardized.xls' #標準化後數據保存路徑
#########使用index_col來建立索引列,不包含在data中
data = pd.read_excel(filename, index_col = u'基站編號') #讀取數據

data = (data - data.min())/(data.max() - data.min()) #離差標準化
data = data.reset_index()

data.to_excel(standardizedfile, index = False) #保存結果

標準化後數據:
在這裏插入圖片描述

模型構建——層次聚類算法

層次聚類

層次聚類方法對給定的數據集進行層次的分解,直到某種條件滿足爲止。

在已經得到距離值之後,元素間可以被聯繫起來。通過分離和融合可以構建一個結構。傳統上,表示的方法是樹形數據結構,層次聚類算法,要麼是自底向上聚集型的,即從葉子節點開始,最終匯聚到根節點;要麼是自頂向下分裂型的,即從根節點開始,遞歸的向下分裂。

1.凝聚層次聚類:AGNES算法(自底向上)

首先將每個對象作爲一個簇,然後合併這些原子簇爲越來越大的簇,直到某個終結條件被滿足

2.分裂層次聚類:DIANA算法(自頂向下)

首先將所有對象置於一個簇中,然後逐漸細分爲越來越小的簇,直到達到了某個終結條件。

數據進行預處理以後,已經形成了建模數據。這次聚類,採用層次聚類算法,對建模數據進行基於基站數據的商圈聚類,畫出譜系聚類圖,代碼如下。

#-*- coding: utf-8 -*-
#譜系聚類圖
import pandas as pd

#參數初始化
standardizedfile = '../data/standardized.xls' #標準化後的數據文件
data = pd.read_excel(standardizedfile, index_col = u'基站編號') #讀取數據

import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (15.0, 4.0)
plt.rcParams['figure.dpi'] = 100

from scipy.cluster.hierarchy import linkage,dendrogram
#這裏使用scipy的層次聚類函數

Z = linkage(data, method = 'ward', metric = 'euclidean') #譜系聚類圖
P = dendrogram(Z, 0) #畫譜系聚類圖
plt.savefig(u'cluster.png')
plt.show()

根據代碼,得到譜系聚類圖,如圖。
在這裏插入圖片描述

從圖中可以看出,可以把聚類類別數取3類,再使用層次聚類算法進行訓練模型,代碼如下。

#-*- coding: utf-8 -*-
#層次聚類算法
import pandas as pd

#參數初始化
standardizedfile = '../data/standardized.xls' #標準化後的數據文件
k = 3 #聚類數
data = pd.read_excel(standardizedfile, index_col = u'基站編號') #讀取數據

from sklearn.cluster import AgglomerativeClustering #導入sklearn的層次聚類函數
model = AgglomerativeClustering(n_clusters = k, linkage = 'ward')#凝聚層次聚類
model.fit(data) #訓練模型

#詳細輸出原始數據及其類別
r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1)  #詳細輸出每個樣本對應的類別
r.columns = list(data.columns) + [u'聚類類別'] #重命名錶頭
r.to_excel('../tmp/r.xls')

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號

style = ['ro-', 'go-', 'bo-']
xlabels = [u'工作日人均停留時間', u'凌晨人均停留時間', u'週末人均停留時間', u'日均人流量']
pic_output = '../tmp/type_' #聚類圖文件名前綴

for i in range(k): #逐一作圖,作出不同樣式
  plt.figure()
  tmp = r[r[u'聚類類別'] == i].iloc[:,:4] #提取每一類
  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+1)) #保存圖片

本節我們使用了scipy和sklearn兩種python庫來實現層次聚類算法。根據scipy庫的linkage聚類結果,將聚類類別個數定爲3。再使用sklearn庫的層次聚類模型將數據分爲3類,進行類別分析。

模型分析

針對聚類結果,按不同類別畫出了3個特徵的折線圖:
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

  1. 商圈類別1,工作日人均停留時間、凌晨人均停留時間都很低,週末人均停留時間中等,日均人流量極高,這符合商業區的特點。
  2. 商圈類別2,工作日人均停留時間中等,凌晨和週末人均停留時間很長,日均人流量較低,這和居住區的特徵符合
  3. 商圈類別3,這部分工作日人均停留時間很長,凌晨和週末停留較少,日均人流量中等,這和辦公商圈非常符合。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章