《数据分析与挖掘 第十四章 基于基站定位数据的商圈分析》

本文主要是介绍《数据分析与挖掘 第十四章 基于基站定位数据的商圈分析》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于基站定位数据的商圈分析

数据抽取
以2014-1-1开始到2014-6-30结束时间作为分析窗口
数据分析
以55555这个人为例,判断其活动位置,基站号改变,说明其进入下一个区域,分析出2014-1-1下午零时53分进入36902基站,直到二时13分才进入36907基站,说明他在36902基站呆了80分钟
数据预处理
首先,去掉无用的属性,例如什么信令类型,LOC编号这些的,只留下日期,时间,基站号,EMASI号这四个属性
清楚地分出哪些人,在什么时间段,在那些基站,然后计算出:每个基站圈的 ,工作日上班时间人均停留时间,凌晨人均停留时间,周末人均停留时间,日军停留时间
得到数据:
在这里插入图片描述
因为这里我们要将商圈分类,也就是把这些基站分类出来,看哪些是有共同的以上四个属性的,比如说:哪些基站的位置是属于人均流量很多的,就值得关注,哪些基站的位置是属于周末人均停留时间很长的,那么这样的地方可能就是娱乐活动的地方,哪些基站的位置是属于工作日人均停留时间最长的,那么这里很可能就是办公楼什么的

我们采用聚类算法分类

聚类算法之前,为了使各个属性的差异值不受数量级影响,需要对数据进行标准化:

import pandas as pdfilename = 'D:\\python\\workspace\\shujufenxi\\chapter14\\chapter14\\demo\\data\\business_circle.xls' #原始数据文件
standardizedfile = 'D:\\python\\workspace\\shujufenxi\\chapter14\\chapter14\\demo\\data\\standardized.xls' #标准化后数据保存路径data = pd.read_excel(filename,index_col = u'基站编号') #读取数据data = (data - data.min())/(data.max() - data.min()) #离差标准化

这里我们先将基站编号拿出来当index,不然后面的步骤会把基站编号也标准化成小数:
在这里插入图片描述
把基站编号拿出来之后标准化:
在这里插入图片描述
然后

data = data.reset_index()ata.to_excel(standardizedfile, index = False) #保存结果,保存的表格里不出现前面的index从0开始的那串数字

在这里插入图片描述
这样达到了,基站编号不做标准化的目的

模型构建
首先我们要知道聚类算法,我们应该分为多少个类,k等于多少最好,这里用谱系聚类图分析看分多少个类:

#谱系聚类图
import pandas as pd#参数初始化
standardizedfile = 'D:\\python\\workspace\\shujufenxi\\chapter14\\chapter14\\demo\\data\\standardized.xls' #标准化后的数据文件
data = pd.read_excel(standardizedfile, index_col = u'基站编号') #读取数据import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage,dendrogram
#这里使用scipy的层次聚类函数Z = linkage(data, method = 'ward', metric = 'euclidean') #谱系聚类图
P = dendrogram(Z, 0) #画谱系聚类图
plt.show()

在这里插入图片描述
可以看出来,最好把聚类分成三个类,即k = 3
接下来进行聚类算法:

#层次聚类算法
import pandas as pd#参数初始化
standardizedfile = 'D:\\python\\workspace\\shujufenxi\\chapter14\\chapter14\\demo\\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) #训练模型

这里由于model.labels_是一个array,我们想把他变成一个Series,且索引号对应data的索引号,才能把labels和data,以axis = 1的方式拼接起来
model.labels_:
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int64)

pd.Series(model.labels_, index = data.index):
基站编号
36902 1
36903 1
36904 1
36905 1
36906 1
36907 1
36908 1
36909 1
36910 1
36911 1
36912 1
35138 1
37337 1
36181 1
38231 1
38015 1
38953 1
35390 1
36453 1
36855 1
35924 1
35988 1
37537 1
38885 1
36797 1
35976 1
37377 1
37160 1
38717 1
38608 1

36926 0

#详细输出原始数据及其类别
r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1)  #详细输出每个样本对应的类别
r.columns = list(data.columns) + [u'聚类类别'] #重命名表头

在这里插入图片描述
绘制每一类数据的各项属性值所对应值的折线图:

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 = 'D:/python/workspace/shujufenxi/chapter14/chapter14/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])#这里的range(1,5)等同于list(range(1,5)),都是值1,2,3,4

到这一步可以画出三章聚类折线图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后我们对图片进行注释和调整:

  plt.xticks(range(1, 5), xlabels, rotation = 20) #坐标标签,给1,2,3,4对应协商属性名字plt.title(u'商圈类别%s' %(i+1)) #加上title,加上类别名称,我们计数习惯从1开始plt.subplots_adjust(bottom=0.15) #调整底部plt.savefig(u'%s%s.png' %(pic_output, i+1)) #保存图片

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
模型分析
商圈1:日均流量大,工作日上班时间人均停留时间,凌晨人均停留时间和周末时间人均停留时间相对较短,可判断该区域为商业区
商圈2:周末人均停留时间长,凌晨人均停留时间长,工作日上班时间人均停留时间短,日均人流量较少,可判断为家庭住宅区
商区3:工作人均停留时间长,一看就是工作区

商区2,3人员流动主要在上下班,吃饭时间,不适合运营商的促销活动

这篇关于《数据分析与挖掘 第十四章 基于基站定位数据的商圈分析》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/231626

相关文章

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存