根据移动通信运营商基站历史定位数据分析人流特征规律,识别不同类型的商圈,判断是否适合进行促销。
#导入所需类库
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()
- 可以观察到聚类类别为3
数据聚类
#训练模型
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()
分析结果
- 类别1:
工作日人均停留时间、凌晨人均停留时间和周末人均停留时间短,日均人流量高,适合最为促销的商圈。 - 类别2:
工作日人均停留时间短,凌晨人均停留时间和周末人均停留时间长,日均人流量低,类似于住宅区,不利于促销。 - 类别3:
工作日人均停留时间长,凌晨人均停留时间和周末人均停留时间短,日均人流量低,类似于工作区,不利于促销。