研究区域说明
本次研究区域为北京市,研究范围为东经115°25′至117°30′,北纬39°26′至41°03′之间,包括东城区、西城区、朝阳区、丰台区、石景山区、海淀区等16个区。
本研究将通过对信令数据的深入挖掘和分析,揭示北京市的人口分布、流动规律以及空间特征,基于分析结果,结合城市发展规划的实际需求,对人口分布优化、交通设施布局、公共服务设施配置等提出针对性的规划建议。
信令数据格式
信令数据是由移动通信网络记录的用户通信活动相关信息的集合,记录了用户与通信基站之间的交互信息。
为了方便后续的算法处理,将得到的所有信令数据存入数据库,这里选用MySQL数据库。
列名 | 数据类型 | 注释 |
---|---|---|
uid | int | 用户编号 |
time | datetime | 信令时间 |
longitude | decimal(10,6) | 经度 |
latitude | decimal(10,6) | 纬度 |
这里只展示一部分信令数据:
用户 | 时间 | 经度 | 纬度 |
---|---|---|---|
2 | 20240927 23:47:46 | 116.254753 | 39.887227 |
134 | 20240927 23:47:47 | 116.29467 | 39.85779 |
1716 | 20240927 23:47:51 | 116.281807 | 39.948059 |
4873 | 20240927 23:47:54 | 116.185365 | 39.921688 |
1572 | 20240927 23:47:55 | 116.336388 | 39.790555 |
767 | 20240927 23:47:55 | 116.514214 | 39.743594 |
5638 | 20240927 23:47:56 | 116.254349 | 39.901931 |
489 | 20240927 23:47:56 | 116.255012 | 40.141082 |
3172 | 20240927 23:47:56 | 116.31892 | 40.00735 |
3176 | 20240927 23:47:57 | 116.278114 | 40.169339 |
一共有1w用户,id为从0~9999,信令时间为使用手机进行了一次通信的发生时间,经纬度坐标为基站的坐标位置。
通过对上述这些信令数据的挖掘和分析,我们能够深入了解城市内部的人口分布情况,揭示出不同区域的人口密度和活动热点,为城市资源配置提供科学依据。其次,基于信令数据的研究可以帮助我们更好地理解城市人口的流动模式,分析人口迁移和通勤等行为规律,为交通规划和基础设施建设提供指导。最重要的是,通过深度分析信令数据,我们能够把握城市发展的趋势,为制定科学合理的城市规划和发展策略提供有力支持。
数据预处理
数据预处理的过程如下:
(1)缺失数据
缺失数据是指由于通信系统记录有误,导致用户的记录存在某一个或多个关键字段的内容缺失。缺失的内容会影响对用户有效信息的提取,因此需要剔除。
(2)重复数据
重复冗余数据是由于用户在同一基站范围内活动,导致同一用户在同一时间连接同一个基站。这样的数据各个字段的值完全相同,只需要保留一条即可。
(3)乒乓切换
在多个邻近基站交叉覆盖区域,两者信号强度相似,手机会在两者之间频繁进行切换。本文对信令记录进行统计,以基站对的形式考察各对之间的切换数量,短时间内切换数量过多则认为其存在乒乓效应。以乒乓效应发生期间连接次数最多的基站为主基站,剔除期间主基站外的记录。
(4)漂移数据
通信用户突然从邻近基站切换至远处基站一段时间后又切回邻近基站的情况,这种数据可以通过计算用户的移动速度来识别,剔除移动速度超过阈值的信令数据。
伪代码如下:
1.遇到缺失数据,直接剔除,不进行下一步处理
for `row` in `csv_reader`:
if [uid] and [time] and [longitude] and [latitude]:
TODO NEXT
2.遇到完全重复数据,直接跳过
for `row` in `csv_reader`:
if {
uid, time, longitude, latitude} in all_data :
continue
3.删除乒乓切换信令数据
# 根据id/time排序 → 统计切换次数 → 阈值识别 → 确定主基站
all_data.sort_by(['uid', 'time'])
for_each(all_data):
swap({
curr_longitude, curr_latitude}, {
next_longitude, next_latitude})
switch_count(count+1 if swap in all_switch_data)
if switch_count > threshold:
ping_pong_periods()
if count < max(switch_count):
delete
4.剔除漂移数据
calculate_distance({
curr_longitude, curr_latitude}, {
next_longitude, next_latitude})
calculate_time({
curr_time}, {
next_time})
# 漂移速度过大,或者短时间内两次信令跨越多个基站,删除
If (distance / time > threshold) or isInclude(lotPoints):
delete
人口分布特征分析
这里主要是根据信令数据,划分出人口的工作区域和生活区域。
首先需要做的是,根据经纬度来得到用户所在的北京市区域情况,这里用python解析实现:
# 读取JSON文件,该文件为北京市区域地理位置文件
with open('./files/110000.json', 'r', encoding='utf-8') as file:
area_local = json.load(file)
# 构建区域边界的shapely Polygon对象
polygons = []
for feature in area_local['features']:
polygon = shape(feature['geometry'])
polygons.append((feature['properties']['name'], polygon))
# 解析xinlin.csv信令文件数据, 数据格式[{}, {}...]
data_list = []
with open('./files/xinlin.csv', 'r') as file:
csv_reader = csv.reader(file)
for row in csv_reader:
row_info = {
}
row_info['uid'] = int(row[0])
row_info['time'] = datetime.strptime(row[1], '%Y-%m-%d %H:%M:%S').strftime(