背景:
移动终端的普及,手机用户时间序列的手机定位数据,映射到现实的地理空间位置,即可完整、客观地还原出手机用户的现实活动轨迹,从而挖掘出人口空间分布与活动联系的特征信息。
注:移动通信网络的信号覆盖逻辑上被设计成由若干六边形的基站小区相互邻接而构成的蜂窝网络面状服务区
目标:
(1)对用户的历史定位数据,采用数据挖掘技术,对基站进行分群。
(2)对不同的商圈分群进行特征分析,比较不同商圈类别的价值,选择合适的区域进行运营商的促销活动。
项目分析建模过程:
(1)从移动通信运营商提供的特定接口上解析、处理、并滤除用户属性后得到用户定位数据。
(2)以单个用户为例,进行数据探索分析,研究在不同基站的停留时间,并进一步地进行预处理,包括数据规约和数据变换。
(3)利用已完成的数据预处理的建模数据,基于基站覆盖范围区域的人流特征进行商圈聚类,对各个商圈分群进行特征分析,选择适合的区域进行运营商的促销活动。
本例设计工作日上班时间人均停留时间、凌晨人均停留时间、周末人均停留时间和日均人流量作为基站覆盖范围区域的人流特征。
(1)对样本数据进行数量级规约,使用离差标准化方法
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 31 10:39:57 2018
@author: JiaQi_Lee
"""
import pandas as pd
filename = "business_circle.xls"
#standardization1 = "standardization1.xls"
standardization2 = "standardization2.xls"
#data数据矩阵为431*5,数据中有基站编号一列
#data = pd.read_excel(filename)
#print("读入数据(没有参数):")
#print(data)
#data数据矩阵为431*4,数据中没有基站编号一列
data1 = pd.read_excel(filename,index_col=u'基站编号')
print("读入数据(有参数):")
print(data1)
#程序中不需要基站编号一列数据,所以data1中不需要基站编号一列
#是各个数据值的数量级保持一致,对数据进行离差标准化
data1 = (data1 - data1.min())/(data1.max() - data1.min())
print("data1:")
print(data1)
#对数据中除了基站编号一列进行离差标准化以后,将基站编号一列通过reset_index()函数重新整合至文件中
data2 = data1.reset_index()
print("data2:")
print(data2)
#data2.to_excel(standardization1)
data2.to_excel(standardization2,index=False)
#data_standardization1 = pd.read_excel(standardization1)
#print("读入数据standardization1:")
#print(data_standardization1)
#结果保存起来
data_standardization2 = pd.read_excel(standardization2)
print("读入数据standardization2:")
print(data_standardization2)
(2)使用scipy中的层次聚类方法对数据进行聚类,画出谱系聚类图
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 31 11:33:26 2018
@author: JiaQi_Lee
"""
import pandas as pd
#标准化数据文件
standardizationdfile = "standardization2.xls"
data = pd.read_excel(standardizationdfile,index_col=u"基站编号")
#将聚类图画出来
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage,dendrogram
#methid为类与类之间的判定函数, metric为数据点与数据点之间的距离计算函数
z = linkage(data,method = 'ward',metric = 'euclidean')
dendrogram(z,0)
plt.show()
如图可将聚类类别设置为3类
(3)使用sklearn中的层次聚类方法对数据进行聚类,并将分类结果画出来
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 31 15:07:55 2018
@author: JiaQi_Lee
"""
import pandas as pd
standardizationfile = "standardization2.xls"
k = 3
data = pd.read_excel(standardizationfile,index_col=u'基站编号')
from sklearn.cluster import AgglomerativeClustering
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'聚类类别']
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#画图
style = ['ro-','go-','bo-']
xlables = [u'工作日人均停留时间',u'凌晨人均停留时间',u'周末人均停留时间',u'日均人流量']
pic_output = '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),xlables ,rotation=20)
plt.subplots_adjust(bottom=0.15)
plt.savefig(u'%s%s.png'%(pic_output,i))
结论:
由图分析可知,图一的商圈类别为商业区,图二的商圈类别为住宅区,图三的商业类别为工作区,商圈类别一的人流量大,在这样的商业区有利于进行运营商的促销活动。