根据移动通信运营商基站历史定位数据分析人流特征规律,识别不同类型的商圈,判断是否适合进行促销。
#导入所需类库
import pandas as pd
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage,dendrogram
from sklearn.cluster import AgglomerativeClustering
import matplotlib.pyplot as plt
#读取原始数据
data = pd.read_excel('data/business_circle.xls', index_col = u'基站编号')
#展示前五条记录
data.head()
工作日上班时间人均停留时间 凌晨人均停留时间 周末人均停留时间 日均人流量
基站编号
36902 78 521 602 2863
36903 144 600 521 2245
36904 95 457 468 1283
36905 69 596 695 1054
36906 190 527 691 2051
#数据标准化到[0,1]
data = (data - data.mean())/(data.max() - data.min())
#展示前五条记录
data.head()
工作日上班时间人均停留时间 凌晨人均停留时间 周末人均停留时间 日均人流量
基站编号
36902 -0.280457 0.550470 0.482363 -0.207109
36903 -0.121036 0.694107 0.357555 -0.258052
36904 -0.239394 0.434107 0.275891 -0.337353
36905 -0.302196 0.686834 0.625660 -0.356231
36906 -0.009925 0.561379 0.619497 -0.274045
#使用scipy的层次聚类函数绘制谱系聚类图
Z = linkage(data, method = 'ward', metric = 'euclidean')
P = dendrogram(Z, 0)
plt.show()
#训练模型
model = AgglomerativeClustering(n_clusters = 3, 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.groupby(u'聚类类别').head()
工作日上班时间人均停留时间 凌晨人均停留时间 周末人均停留时间 日均人流量 聚类类别
基站编号
36902 -0.280457 0.550470 0.482363 -0.207109 1
36903 -0.121036 0.694107 0.357555 -0.258052 1
36904 -0.239394 0.434107 0.275891 -0.337353 1
36905 -0.302196 0.686834 0.625660 -0.356231 1
36906 -0.009925 0.561379 0.619497 -0.274045 1
37371 0.383795 -0.264075 -0.292676 -0.109837 2
35162 0.407949 -0.222257 -0.187899 0.066406 2
35425 0.444181 -0.247711 -0.211012 -0.216259 2
37064 0.593939 -0.218621 -0.172491 -0.086508 2
38792 0.562539 -0.245893 -0.137052 -0.052463 2
35571 -0.236978 -0.229530 -0.306543 0.498522 0
38267 -0.258718 -0.216802 -0.232583 0.419056 0
36387 -0.236978 -0.304075 -0.032275 0.613269 0
37459 -0.188669 -0.264075 -0.244910 0.156670 0
37795 -0.224901 -0.244075 -0.004540 0.506765 0
#正常显示中文和负号
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#设置图表点线和标签
style = ['ro-', 'go-', 'bo-']
xlabels = [u'工作日人均停留时间', u'凌晨人均停留时间', u'周末人均停留时间', u'日均人流量']
#分别绘制各类别数据折线图
for i in range(3):
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 = 45)
plt.title(u'商圈类别%s' %(i+1))
plt.show()