1. 程式人生 > >基於基站定位資料的商圈分析

基於基站定位資料的商圈分析

基於基站定位資料的商圈分析

目錄


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

實驗介紹

實驗背景

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

商圈是現代市場中的重要企業活動空間,商圈劃分的目的之一是為了研究潛在的顧客分佈,以制定適宜的商業對策。本次資料,是由通訊運營商提供的,特定介面解析得到的使用者定位資料。
在這裡插入圖片描述

實驗目標

  1. 對使用者的歷史定位資料,採用資料探勘技術,對基站進行分群
  2. 對不同的商圈分群進行特徵分析,比較不同商圈類別的價值,選擇合適區域進行鍼對性的營銷活動

實驗分析方法與過程

  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基站的範圍。判斷使用者在每個基站的停留時間需要依靠當前記錄與下一條記錄的對比,發生變化則意味著使用者所在基站發生改變,可以記錄在上一個基站停留的時間。

資料預處理

資料規約

  1. 原始資料的屬性較多,由我們的挖掘目標,網路型別、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,這部分工作日人均停留時間很長,凌晨和週末停留較少,日均人流量中等,這和辦公商圈非常符合。