分享

基于基站定位数据的商圈分析代码详细解释

 不丁真人 2017-07-26

这一章的代码注意,作者只在windows下面运行过,没有在Linux下面运行过


第一个代码是为了看下数据的稳定程度,代码中主要关注点是那个离差标准化

[python] view plain copy
  1. #-*- coding: utf-8 -*-  
  2. #数据标准化到[0,1]  
  3. import pandas as pd  
  4.   
  5. #参数初始化  
  6. filename = '../data/business_circle.xls' #原始数据文件  
  7. standardizedfile = '../tmp/standardized.xls' #标准化后数据保存路径  
  8.   
  9. data = pd.read_excel(filename, index_col = u'基站编号') #读取数据  
  10.   
  11. data = (data - data.min())/(data.max() - data.min()) #离差标准化  
  12. data = data.reset_index()  
  13.   
  14. data.to_excel(standardizedfile, index = False) #保存结果  


第二个代码的意图是为了获知把数据分成几类合适

[python] view plain copy
  1. #-*- coding: utf-8 -*-  
  2. #谱系聚类图  
  3. import pandas as pd  
  4.   
  5. #参数初始化  
  6. standardizedfile = '../data/standardized.xls' #标准化后的数据文件  
  7. data = pd.read_excel(standardizedfile, index_col = u'基站编号') #读取数据  
  8.   
  9. import matplotlib.pyplot as plt  
  10. from scipy.cluster.hierarchy import linkage,dendrogram  
  11. #这里使用scipy的层次聚类函数  
  12.   
  13. Z = linkage(data, method = 'ward', metric = 'euclidean') #谱系聚类图  
  14. P = dendrogram(Z, 0) #画谱系聚类图  
  15. plt.show()  


纵轴是类别数量,在3的地方横向画一条横线,此时对应就是分成3类。




第三个代码的分类总数根据第二个代码来确定

[python] view plain copy
  1. #-*- coding: utf-8 -*-  
  2. #层次聚类算法  
  3. import pandas as pd  
  4.   
  5. #参数初始化  
  6. standardizedfile = '../data/standardized.xls' #标准化后的数据文件  
  7. k = 3 #聚类数  
  8. data = pd.read_excel(standardizedfile, index_col = u'基站编号') #读取数据  
  9.   
  10. from sklearn.cluster import AgglomerativeClustering #导入sklearn的层次聚类函数  
  11. model = AgglomerativeClustering(n_clusters = k, linkage = 'ward')#AgglomerativeClustering的意思是层次聚类  
  12. model.fit(data) #训练模型  
  13.   
  14. #详细输出原始数据及其类别  
  15. r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1)  #详细输出每个样本对应的类别,Series是种数据结构  
  16. print("r=",r)#把建模后的数据传给r  
  17. r.columns = list(data.columns) + [u'聚类类别'] #重命名表头,这样同一类数据就会有相同的标签  
  18. print("************************************************************")  
  19. print("list(data.columns)",list(data.columns))  
  20. print("------------------------------------------------------------")  
  21. print("------------------------------------------------------------")  
  22. print("r.columns=",r.columns )  
  23.   
  24. import matplotlib.pyplot as plt  
  25. plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签  
  26. plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号  
  27.   
  28. style = ['ro-', 'go-', 'bo-']#这个表示绘图的样式,r代表红色,g代表绿色,b代表蓝色,o-中,o表示用粗点标记,-表示连线  
  29. xlabels = [u'工作日人均停留时间', u'凌晨人均停留时间', u'周末人均停留时间', u'日均人流量']  
  30. pic_output = '../tmp/type_' #聚类图文件名前缀  
  31.   
  32.   
  33. #下面两重for循环的意思是,外循环控制画哪个图,内循环负责把一条条彩线画上去  
  34. #前面分成几类,那么下面就会有几个图,图中的每条线代表excel中的整行数据  
  35. for i in range(k): #逐一作图,作出不同样式  
  36.   plt.figure()  
  37.   tmp = r[r[u'聚类类别'] == i].iloc[:,:4] #前面把建模后的数据传给了r,所以这里从r中获取其中一类的所有行和前4列数据。  
  38.   #iloc是index location的意思,意思是用序号对行进行索引  
  39.   print("tmp=",tmp)  
  40.   print("ENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN")  
  41.   for j in range(len(tmp)):#由于前面k=3,总数据量为431,所以j的范围是1~146,1~146 1~139  
  42.     plt.plot(range(1, 5), tmp.iloc[j], style[i])#这个range指的是对数据的前四列属性的具体值  
  43.   #上面的tmp.iloc[j]指的是分类后,某一特定类早上的某条数据。  
  44.   #上面的这个style用到了前面定义的一句话style = ['ro-', 'go-', 'bo-']  
  45.   plt.xticks(range(1, 5), xlabels, rotation = 20) #坐标标签,rotation就是x轴标签的倾斜程度  
  46.   #如果要根据需要来修改程序,那么上面的两个(1,5)和前面的tmp = r[r[u'聚类类别'] == i].iloc[:,:4]这句话中的范围要同时修改  
  47.   plt.title(u'商圈类别%s' %(i+1)) #我们计数习惯从1开始  
  48.   plt.subplots_adjust(bottom=0.15) #调整底部  
  49.   plt.savefig(u'%s%s.png' %(pic_output, i+1)) #保存图片  

上面这个代码的意思有两部分:

一、聚类

二、三类数据各自绘图


----------------------------------------------------------------------------------------------------------------------------------------------------


-----------------------------------------------------------------------------------------------------------------------------------------------------



最后来分析这三个图,这三个图到底什么意思呢?

这三个图分别代表不同地点的情况。

注意,人均停留时间是不能根据离差标准化后的数据来进行观察的。

离差标准化只是反应数据的波动程度。


由于最终目的是仅仅在一个进行经营,所以需要在以上三个图(也就是三个地点中)中选择同时满足以下两点的图(地点):

一、在三个“停留时间”属性中的数值波动不大

二、在原数据集中停留时间较长


以此进行商圈建设,会有较好的收益。

总结:对三个地方获取数据,代码的最终目标是判断哪个地方建立商区比较合适,其余两个地方放弃。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多