这学期期末智慧交通大作业,我选择使用手机信令数据研究人类交通出行特征,期间我也查阅了许多资料,但绝大多数帖子只有手机信令数据的应用方向,没有具体实现做法。经过一两周的探索,我大概根据数据和应用方向实现了具体的方法。但本人才学疏浅,也只能提供一些简单的解决思路与简单的处理数据方法,但我还是很愿意和大家一起分享,为同样被大作业折磨的同学提供一些思路和经验。
我先测试一下能不能追更, 因为我一天肯定更不完~
测试完成,可以编辑~好的,我先将我接下来要实现的方法目录放在下方,后续会慢慢更新具体的实现方法。
1.数据预处理
老师给的数据很多,毕竟手机信令数据真的太庞大了,每个人每天能产生几十上百条数据都很正常,我使用的数据一共1048576条,这也是我电脑wps表格所能载入的最多的数据量。数据特征如下图。我将停留时间(秒)转换为停留时间(小时),多增加了一列,便于后续筛选。start_time是进入基站的开始时间。
以上是贵州省2017.2.26日的部分用户信令数据,数据量有限,所以并不完整。我主要介绍处理方法。
1.1 数据清洗
数据清洗:①字段有空的数据;②重复的记录;③数据标记为不正常数据;④事件类型错误的数据;⑤用户字段异常数据;⑥其他错误数据。
我的数据无以上缺失现象,但有不完整用户出行点,需要删除。
不完整用户出行点:删除只有一条居民记录并且时长小于4小时的用户数据记录,(用户仅有1条记录但停留时长大于4小时的说明用户在家,并未出行),如果用户仅有1条记录但停留时长小于4小时的说明用户出行但出行信息缺失了,这是无用数据,删除就行了,数据量也不大。
1.2 “乒乓切换”数据修正
“乒乓切换”:用户没有移动但上传的数据连续使用周边两个或多个经纬度基站扇区。 数据特点:(1)单点停留时长较小;(2)前一次与后一次位置变更附着的基站位置与当前位置的夹角较小。
处理方法:(1)对于已生成的未修正的数据轨迹,去除停留时长小于5秒的轨迹点;(2)对于同一用户的连续轨迹,若某一个轨迹点与其前一个出现的轨迹点以及后一个出现的轨迹点所构成的夹角均小于30度,则删除该轨迹点。
第一步就直接用excel就可以完成。将筛选处理后的数据保留,接下来使用python代码进行处理30度夹角修正。
import numpy as np
import pandas as pd# 读取数据
from geographiclib.geodesic import Geodesic #计算夹角的库
excel_data=pd.read_csv('数据1.csv',header = None)
print(excel_data.shape)
data_dataframe = pd.DataFrame(excel_data)
data_numpy = np.array(data_dataframe)
print(data_numpy.shape)
data_final = data_numpy[:,6:8]#经纬度数据 矩阵,根据经纬度的所在列适当修改就行
for i in range(2,541493):#根据行数目修改数据
geodict1 = Geodesic.WGS84.Inverse(float(data_final[i-1][1]), float(data_final[i-1][0]),
float(data_final[i][1]), float(data_final[i][0]))
#点1纬度、经度,点2纬度、经度
geodict2 = Geodesic.WGS84.Inverse(float(data_final[i][1]), float(data_final[i][0]),
float(data_final[i+1][1]), float(data_final[i+1][0]))
az1 = geodict1['azi1']
az2 = geodict2['azi1']
if az1<30 and az2<30:#30度角修正
data_final[i]=['0' '0']
pandas_data1=pd.DataFrame(data_final,columns=['1','2'])
pandas_data1.to_excel('30度乒乓数据修正.xlsx',sheet_name='sheet1')
运行代码后,若如果某一个轨迹点与其前一个出现的轨迹点以及后一个出现的轨迹点所构成的夹角均小于30度,表中会显示00。将运行后的数据替换原经纬度数据,删除包含00的数据点即可。
(这里没有区分不同用户的夹角,因为根据结果我发现,不同用户间的夹角都大于30度,所以就不存在这种误差了)
1.3 异常漂移点数据修正
基于常规轨迹算法计算后的轨迹数据,通常还会出现异常漂移点,再次运行30度夹角修正代码,删除异常漂移点数据即可。代码和上述代码相似。(这种方法虽然不够精确的识别出异常飘逸点数据,但也能够使用。更精确的方法可以自行查找论文和资料)
数据量变化:
最终处理后,可用数据就是466221条。将此文件和后续文件都保存为csv文件,便于后续图表制作处理。
(由于excel最大行数限制,导入的原始数据并不完整,这些数据并不能覆盖整个贵州省,只有贵阳、遵义、安顺、黔南、黔东南、铜仁这几个城市的部分居民数据)
2.数据分析
数据分析需要用到Arcgis软件,(Arcgis10.2版本链接我放在文章最后可自行选择下载),首先需要根据分析地区下载对应的shp地图。(下载shp地图可观看视频全国、省市区县shp下载_哔哩哔哩_bilibili 进行下载)
2.1 职驻地分析
根据手机信令数据的接收信号时间与用户停留时间筛选分析,可识别居民常住地、固定工作地:(1)选择工作时段9:00- 11:30与14:00-17:00,筛选停留时间在2小时以上的数据整理成表,导入Arcgis,可制作居民工作地热力图;(2)选择夜间休息时段 0:00-5:00,筛选停留时间在4小时以上的数据整理成表,导入Arcgis软件,可制作居民常住地热力图。
1.在arcgis中连接表所在的文件夹,拖入shp文件和两个csv文件,右击csv文件进行xy数据转换,根据经纬度转换即可。
2.在ArcToolbox内点击Spatial Analyst工具\密度分析\核密度分析,选择下图的按绘制顺序列出即可调换图层顺序,双击密度结果图层选择符号系统即可更改颜色,调节适当的分类颜色,最终结果如下图(数据结果仅供参考)。
3.居住地人口热力图操作步骤与上述一致。获得结果图后可进行对比分析。
2.2 居民就业岗位分析
选择某居民连续工作日的出行点进行分析,可大致分析居民的工作岗位,结合地图导航等工具,甚至能定位居民的工作地点、公司等。我的数据只有一天,所以就简陋进行猜测分析。
在最终数据表中根据user id筛选出某位居民的出行数据,导入arcgis,即可得到该居民的出行点地图。右击csv文件进行xy数据转换,根据经纬度转换即可。根据始末出行点的经纬度标出始末点,然后调整颜色。
1.更改背景颜色。在背景图地方右击选择数据框属性,点击框架更改背景颜色。
2.标红始末点。导入仅含有始末两个点的数据表将其颜色设置为红色就行。再次导入此居民的全部出行点,注意图层位置。
根据该居民出行轨迹点图可大致推测,该居民工作为长途汽车司机,或者在该天出行旅游。
2.3 出行活动强度空间分析
分别筛选白天与夜晚居民出行数据进行分析。白天时段为7:00-17:00,夜晚时段为0:00-5:00,并选择停留时间小于2小时的数据。分别将白天时段出行点与夜晚时段出行点数据导入arcgis,进行核密度分析。
这里需要注意的是数据颜色的分段值,因为晚上出行人数比白天少很多,它自动分类的分割值是等分的,这样就没办法和白天的出行数据点进行对比,所以要根据白天的出行密度分割值,来改变夜晚密度颜色的分割值。
双击要更改的数据,在图层属性界面点击分类,即可更改分割值。
结果图如下。左图夜晚,右图白天。可据此进行分析。
2.4 居民通勤/非通勤OD分析
2.4.1 居民通勤OD分析
从数据集筛选出在上下班时间段(7-9点与17-19点)有出行记录的用户数据点,并将停留时长大于2小时的轨迹点作为起点和终点。 然后对用户的单个出行轨迹点进行起始与到达点合并。有两个轨迹点的用户即为一次出行,有3个轨迹点的用户即为2次出行,以此类推。
所以我们需要居民把下一个基站记录的经纬度作为上一次出行的终点,需要先使用excel筛选出有重复值的居民出行点,再合并OD。这里合并用代码处理,用excel处理的话会使用户OD混乱。代码和结果如下。
#向OD表中写入终点信息
import pandas as pd
data= pd.read_csv(r"od.csv")
data_dataframe = pd.DataFrame(data)
data_numpy = np.array(data_dataframe)
print(data_numpy.shape)
for i in range(0,100957): #注意自己的行数和列数进行修改
if data_numpy[i+1][1]==data_numpy[i][1]:
data_numpy[i][11]=data_numpy[i+1][6]
data_numpy[i][12]=data_numpy[i+1][7]
#将矩阵写入excel表格
pandas_data1=pd.DataFrame(data_numpy)
pandas_data1.to_excel('od1.xlsx',sheet_name='sheet1')
将上表结果复制到OD表中,删除有空白的行,就可以得到完整的居民出行OD了。
将上述表导入arcgis中,打开ArcToolbox——数据管理工具——要素——XY转线。根据信息选择OD点,线类型处可以选GREAT_CIRCLE,这样有些线可以自动换为弧形。
最后主要是对成果图进行美化。首先对线条按照流动量进行分级符号的设置。方法:右键图层—属性—符号系统—数量—分级符号。可根据自己需求选择分类的数量。(网上还有很多博主的帖子制作更好看的od图,可以自行搜索)
该OD图根据出行距离进行分级色彩分类,颜色越红代表出行距离越远,颜色越绿代表出行距离越近。可据此进行分析。
2.4.2 非通勤OD分析
选择不是通勤时段(除通勤时间外)的数据进行上述同样操作即可分析。
2.5 人口流入/流出分析
2.5.1 人口流入
选出数据集中包含的城市机场(贵阳机场、遵义机场、安顺机场)附近区域,这里可以在机场经纬度附近小范围里进行筛选,如机场(109.87,25.76)可分别筛选经度109.85-109.89,纬度范围25.74-25.79,选择停留时间大于等于15分钟的轨迹点,作为在机场降落的省外人员起始点,并选出其轨迹终点(停留时间大于1小时),运用上面的写入终点经纬度的代码做出OD表格。
然后就是把筛选出来的数据点导入arcgis制作OD图,操作和上面的OD图制作方法一样,我就不赘述了。这里展示一下结果图。
2.5.2 人口流出
选出数据集中包含的城市机场(贵阳机场、遵义机场、安顺机场)并筛选出附近区域,选择停留时间大于等于15分钟的轨迹点,作为在机场降落的省外来员轨迹终点,然后选出其起始点(在某地停留时间大于2小时),运用上面的代码运行出OD结果表,导入arcgis制作OD图就可以了。
2.6 交通方式识别
筛选停留时间大于2小时的轨迹点作为某个用户的起始点与终点,计算该居民从O点到D点经历的时间,然后与之前整理的OD表整合,计算OD两点间的距离和平均速度,得到最终OD配速表,根据平均速度可大概分类其出行交通工具。
(1)在之前整合的OD表里,利用excel计算该居民从O点到D点经历的时间,时间差的单位是小时(我是先换为秒再转换为小时,因为秒可以直接相减计算出来),便于速度的计算。
(2)根据OD经纬度计算两点间距离。这里用代码解决。
import pandas as pd
import numpy as np
data= pd.read_csv(r"OD.csv")
data_dataframe = pd.DataFrame(data)
data_numpy = np.array(data_dataframe)
print(data_numpy.shape)
#根据经纬度计算距离
import math
R = 6371.393
Pi = math.pi
for i in range(0,7509): #注意修改shape和列数
# A地
jingduA, weiduA= data_numpy[i][6], data_numpy[i][7]
# B地
jingduB, weiduB = data_numpy[i][8], data_numpy[i][9]
a = (math.sin(math.radians(weiduA/2-weiduB/2)))**2
b = math.cos(weiduA*Pi/180) * math.cos(weiduB*Pi/180) * (math.sin((jingduA/2-jingduB/2)*Pi/180))**2
data_numpy[i][12] = 2 * R * math.asin((a+b)**0.5)
# 单位是千米
#将矩阵写入excel表格
pandas_data1=pd.DataFrame(data_numpy)
pandas_data1.to_excel('od距离.xls',sheet_name='sheet1')
运算结果出来后,将其复制整合到筛选的OD表中,利用excel公式计算平均速度。
(3)我将居民的交通方式划分为7种:(1)0-10km/h:步行 (2)10-20km/h:自行车 (3)20-30km/h:电瓶车 (4)30-50km/h:公交车 (5)50-110km/h:汽车 (6)110-400km/h:火车+其他 (7)400-900km/h:飞机+其他。这里最低速度范围偏小是因为考虑到人还需要走路、赶路等时间,平均速度就慢了些。然后就根据计算的平均速度和这些工具速度筛选就可以知道交通方式了,计算不同交通方式的数量作图就可以分析。
上面的图是我的结果,其实可以再将交通工具的最低速度范围设置小一些,因为人在路上走路啥的会拉低平均速度,所以我的结果不太准确。
————————————————————————分割线
接下来的分析方面是我同伴做的分析,因为老师给出的手机信令数据中还含有每个人的移动流量套餐数据,所以她探究了一下影响话费套餐的因素,以及景点受欢迎度分析,大致目录如下。下面的方面我就大概说一下方法,具体过程不详细说明,因为也不是我做的。
2.7 空间自相关分析
想要判断贵州省每个移动用户的话费套餐是否存在空间自相关(也就是在空间上是否相关联),先要将花费套餐从字符串转化为数值,由于数据中的套餐是一个范围,在这里取平均值将其转化为数值,例如将“150-200元”表达为“175”,将“100-150元”表达为“125”。如图,标记出来的arpu2即为转化后的数据。
为了结果数据的准确性,对用户名即user_id进行去重处理,去重处理之前先筛选出0:00到6:00时段的用户,因为这个时间段的用户极大概率在居住地。将得到的excel表导入ArcGIS进行空间自相关分析即可。空间自相关可自行搜索如何操作,也是arcgis里一个比较简单的步骤就是了。生成报表如下。
从结果图可知,Z为0.824643,P值为0.409574,表明移动话费套餐金额空间分布并不存在显著的空间关系。
2.8 影响话费套餐因素的主成分分析
由于移动话费套餐金额空间分布并不存在显著的空间关系,这里进一步探讨动话费套餐金额与什么因素有关,本部分用到SPSS进行分析。为方便计算,在之前修改过的分析数据的基础上,再次进行修改。 将性别里的 “男”改为数值“1”,“女”改为数值“2”,年龄同与话费金额的处理方法一样,取平均值,例如将字符串“31到50岁”改为数值“35”。将该excel表导入SPSS软件,进行主成分分析(可自行查找资料)。本步对sex、age、longitude和latitude四个特征进行分析。
分析结果如下图所示。
再结合碎石图,可知性别和年龄是影响移动话费套餐金额的主要成分。
2.9 x市景点受欢迎度分析
为方便分析,在规划云网站上选取了贵阳市的景点poi,得到了景点名称、经纬度和地址,将其导入excel表,再导入ArcGIS MAP中。
这里选择了人口密度集中的城市进行分析,选择的是贵州省的省会城市贵阳市的六个行政区白云区、乌当区、云岩区、南明区、观山湖区和花溪区。根据年龄将用户分为三个部分(14岁以下和15至20岁的用户数据量较少,故不纳入分析范围):年轻人(21至40岁)、中年人(41至60岁)和老年人(60岁以上)。导入ArcGIS MAP后将各景点表示为红色菱形。
(1)对年轻人的聚集程度进行分析:
利用点密度分析工具(核密度的下面就是点密度了)得到的人口聚集程度结果图,观察结果图可知在花溪区年轻人聚集密度更大,将图层进一步放大就可以得出受年轻人欢迎的景点。
(2)对中年人的聚集程度进行分析:
利用点密度分析工具得到的人口聚集程度结果图,观察结果图可知在花溪区年轻人聚集密度更大,将图层进一步放大就可以得出受中年人欢迎的景点。
(3)对老年人的聚集程度进行分析:
利用点密度分析工具得到的人口聚集程度结果图,观察结果图可知在花溪区年轻人聚集密度更大,将图层进一步放大就可以得出受老年人欢迎的景点。
————————————————————————正文完
大概分析方面如上述所示,我会在接下来的一段时间里慢慢更新具体的实现方法。如果大家关注到了本篇帖子,并且迫切想知道具体如何实现,可以在评论区催更哦~因为我自己时不时更新的话速度可能会有些慢,毕竟这也快过年了哈哈哈。所以如果有感兴趣的小伙伴记得向我催更!我收到了消息动力也会up的!如果大家有其他的更好的方法实现也欢迎与我在评论区讨论~
Arcgis10.2版本安装包(百度网盘):
链接:https://pan.baidu.com/s/1B8cjBET46aedL4Nq6VoHVA
提取码:zxsm
到这里就差不多更新完了!我有些地方说得比较简略,如果有疑问的朋友可以在评论区留言~