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

  • 背景
    • 随着个人手机终端的普及,出行群体中手机拥有率和使用率已经达到相当高的比例,手机移动网络也基本上实现了城乡空间区域的全覆盖。根据手机信号在真实地理空间上的覆盖情况,将手机用户时间序列的手机定位数据,映射至现实的地理空间位置,即可完整、客观地还原出手机用户的现实活动轨迹,从而挖掘得到人口空间分布与活动联系的特征信息。
    • 移动通信网络的信号覆盖逻辑上被设计成由若干个六边形的基站小区相互邻接而构成的蜂窝网络面状服务区,手机终端总是与其中某一个基站小区保持联系,移动通信网络的控制中心会定期或者不定期地主动或被动地记录每个手机终端时间序列的基站小区编号信息。
    • 商圈是现代市场中企业市场活动的空间,同时也是商品和服务享用者的区域。商圈划分的目的之一是为了研究潜在的顾客的分布以制定适宜的商业对策。
  • 目标
    • 从某通信运营商提供的特定接口解析得到用户的定位数据。定位数据以基站小区进行标识,利用基站小区的覆盖范围作为商圈区域的划分,那如何对用户的历史定位数据进行科学的分析,归纳出商圈的人流特征和规律,识别出不同类别的商圈,选择合适的区域进行运营商的促销活动?
    • 故目标如下
      • 对用户的历史定位数据,采用数据挖掘技术,对基站进行分群。
      • 对不同的商圈分群进行特征分析,比较不同商圈类别的价值,选择合适的区域进行运营商的促销活动。
  • 分析
    • 手机用户在使用短信业务、通话业务、开关机、正常位置更新、周期位置更新和切入呼叫的时候均产生定位数据,定位数据记录手机用户所处基站的编号、时间和唯一标识用户的EMASI号等。历史定位数据描绘了用户的活动模式,一个基站覆盖的区域可等价于商圈,通过归纳经过基站覆盖范围的人口特征,识别出不同类别的基站范围,即可等同地识别出不同类别的商圈。衡量区域的人口特征可从人流量和人均停留时间的角度进行分析,所以在归纳基站特征时可针对这两个特点进行提取。
    • 基于移动基站定位数据的商圈分析主要步骤
      • 1)从移动通信运营商提供的特定接口上解析、处理、并滤除用户属性后得到用户定位数据。
      • 2)以单个用户为例,进行数据探索分析,研究在不同基站的停留时间,并进一步进行预处理,包括数据规约和数据变换。
      • 3)利用步骤2)形成的已完成数据预处理的建模数据,基于基站覆盖范围区域的人流特征进行商圈聚类,对各个商圈分群进行特征分析,选择合适的区域进行运营商的促销活动。
  • 处理过程
    • 数据获取
      • 从运营商提供的接口解析、处理、并滤除用户属性之后得到位置数据,以2014-1-1为开始时间,2014-6-30为结束时间作为分析的观测窗口,抽取观测窗口内某市某区域的定位数据形成建模数据。
    • 数据探索
      • 对单个用户轨迹进行研究分析。
    • 数据预处理
      • 数据规约
      • 数据变换
        • 离差标准化
    • 数据挖掘建模
      • 构建商圈聚类模型
        • 采用层次聚类算法对建模数据进行基于基站数据的商圈分析,画出谱系聚类图。
        • 谱系聚类图
        • 从图中看出,可以将聚类类别数取k=3,输出结果typeindex为每个样本对应的类别号。
        •   # -*- coding:utf-8 -*-
            import pandas as pd
            
            
            def pic():
                standardizedfile = '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()
            
            
            def clu():
                # 参数初始化
                standardizedfile = '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)  # 训练模型
            
                # 详细输出原始数据及其类别
                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 = 'data/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), xlabels, rotation=20)  # 坐标标签
                    plt.title(u'商圈类别%s' % (i + 1))  # 我们计数习惯从1开始
                    plt.subplots_adjust(bottom=0.15)  # 调整底部
                    plt.savefig(u'%s%s.png' % (pic_output, i + 1))  # 保存图片
            
            
            if __name__ == '__main__':
                # pic()
                clu()
          
    • 后续处理
      • 由不同类别的特征折线图,商圈1日均人流量大,工作日上班时间人均停留时间、凌晨人均停留时间、周末人均停留时间短,类似商业区,适合展开促销活动。
  • 补充说明
    • 案例参考书《Python数据分析与挖掘实战》
    • 与原书有借鉴,但是较大改动代码
    • 修复了原书一些旧版本代码错误
    • 具体数据集和代码可以查看我的Github,欢迎star或者fork
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐