基于地铁刷卡数据分析与可视化——以杭州市为例(一)
本文分析了2019年1月8日至1月14日杭州市地铁刷卡数据,重点关注工作日的早晚高峰分布情况。数据涵盖3条线路81个地铁站,共7000万条记录。通过路网地图的可视化,展示了各线路站点的连接关系。选择2019年1月8日(周一)的数据进行详细分析,结果显示早高峰集中在7:00-9:00,晚高峰集中在17:00-19:00,且进站晚高峰的峰值比出站晚高峰早约一小时。进一步分析表明,A线的客流量最大,其次
2019年1月1号—1月25号杭州市地铁刷卡数据
数据简介:杭州市2019年1月1号—1月25号,连续25天的地铁刷卡数据,数据条数超过7000万条。
数据字段:刷卡发生时间、地铁线路ID、地铁站ID、刷卡设备编号ID、进出站状态、用户身份、ID用户刷卡类型。
共涉及3条线路81个地铁站约7000万条数据作为训练数据(Metro_train.zip),供选手搭建地铁站点乘客流量预测模型。训练数据解压后可以得到25个csv文件,每天的刷卡数据均单独存在一个csv文件中,以record为前缀。如2019年1月1日的所有线路所有站点的刷卡数据记录存储在record_2019-01-01.csv文件中,以此类推。同时大赛提供了路网地图,即各地铁站之间的连接关系表,存储在文件Metro_roadMap.csv文件中供选手使用。
数据链接:全球城市计算AI挑战赛_算法大赛_天池大赛-阿里云天池的赛制
用户刷卡数据表(record 2019-01-xx.csv)
注:
1.record_2019-01-xx.csv文件中,除第一行外,每行包含一条用户的刷卡记录。
2.对于userID,在payType为3时无法唯一标识用户身份。即此userID可能为多人使用,但在一次进出站期间可以视为同一用户。对于其他取值的payType,对应的userID可以唯一标识一个用户。
路网地图(Metro_roadMap.csv)
大赛提供了各地铁站之间的连接关系表,相应的领接矩阵存储在roadMap.csv中,其中包含一个81x81的二维矩阵。文件中首行和首列表示地铁站ID(stationID),columns为0-80,rows为0-80。
roadMap[i][j] = 1 表示stationID为i的地铁站和stationID为j的地铁站直接相连;
roadMap[i][j] = 0 表示stationID为i的地铁站和stationID为j的地铁站不相连。
首先我们先来看路网部分,原数据包括了3条线路81个地铁站站点,原数据对站点进行了编号处理,所以我们不知道站点名称,我们先把领接矩阵根据线路进行可视化;
完整代码#运行环境Python 3.11
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
# 读取CSV文件,指定编码为GB2312
file_path = 'D://data//Metro_roadMap.csv'
df = pd.read_csv(file_path, index_col=0, encoding='gb2312')
# 将DataFrame转换为NumPy数组
adj_matrix = df.values
# 创建网络图
G = nx.Graph()
# 添加节点
nodes = list(df.index)
G.add_nodes_from(nodes)
# 添加边
for i, node_i in enumerate(nodes):
for j, node_j in enumerate(nodes):
if adj_matrix[i][j] == 1 and i < j: # 避免重复添加边
G.add_edge(node_i, node_j)
# 定义线路分类
line_c = set([34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66])
line_a = set([67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80])
line_b = set([0, 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 3, 30, 31, 32, 33, 4, 5, 6, 7, 8, 9])
# 分类节点
nodes_c = [node for node in nodes if node in line_c]
nodes_a = [node for node in nodes if node in line_a]
nodes_b = [node for node in nodes if node in line_b]
# 绘制网络图
plt.figure(figsize=(12, 12))
pos = nx.kamada_kawai_layout(G) # 使用Kamada-Kawai布局
# 绘制不同线路的节点
nx.draw_networkx_nodes(G, pos, nodelist=nodes_c, node_size=300, node_color='red', label='Line C')
nx.draw_networkx_nodes(G, pos, nodelist=nodes_a, node_size=300, node_color='blue', label='Line A')
nx.draw_networkx_nodes(G, pos, nodelist=nodes_b, node_size=300, node_color='green', label='Line B')
# 绘制边
nx.draw_networkx_edges(G, pos, alpha=0.5, edge_color='gray')
# 绘制标签
labels = {node: f'metro {node}' for node in nodes}
nx.draw_networkx_labels(G, pos, labels, font_size=8, font_weight='bold')
# 添加图例
plt.legend(scatterpoints=1)
# 设置标题和显示
plt.title('Metro Station Connection Diagram')
plt.axis('off') # 关闭坐标轴
plt.show()
可视化结果如下,这一步的目的是让我们对站点之间的空间连接关系有一个直观的了解;
因为2019年1月1日正好是元旦,我们为了消除节假日的影响,选择节后一周来进行数据分析,日期选择:2019年1月8日—1月14日;
这里我们先选取2019年1月8日周一这一天的数据进行分析,我们来计算一下这3条线路的早晚高峰分布情况,我们统计了userID 在每个小时的进出站情况,status字段(进站1,出站0),可以看的出早高峰分布在早上7:00-9:00之间,晚高峰分布在17:00-19:00之间,且进站晚高峰的峰值比出站晚高峰的峰值早一个小时左右,这同样也能反应主力通勤人群的大致通勤时间(当然这里数据分析的最小尺度就是小时尺度,所以反映客流最小变化尺度也只能到小时尺度);
接下来,这3条线路的早晚高峰分布情况,我们可以看到线路客流A线大于B线大于C线,且早晚高峰的波动形态基本一致;
结论
通过对2019年1月8日杭州市地铁刷卡数据的分析,我们得出以下结论:
- 客流量:线路A的客流量最大,其次是线路B和线路C。
- 早晚高峰:三条线路的早晚高峰波动形态基本一致,早高峰集中在7:00-9:00,晚高峰集中在17:00-19:00。
- 通勤模式:进站晚高峰的峰值比出站晚高峰的峰值早约一小时,反映了通勤人群的典型出行模式。
文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。
更多推荐
所有评论(0)