计算机竞赛 地铁大数据客流分析系统 设计与实现

news2024/9/26 3:27:17

文章目录

  • 1 前言
    • 1.1 实现目的
  • 2 数据集
    • 2.2 数据集概况
    • 2.3 数据字段
  • 3 实现效果
    • 3.1 地铁数据整体概况
    • 3.2 平均指标
    • 3.3 地铁2018年9月开通运营的线路
    • 3.4 客流量相关统计
      • 3.4.1 线路客流量排行
      • 3.4.2 站点客流量排行
      • 3.4.3 入站客流排行
      • 3.4.4 整体客流随时间变化趋势
      • 3.4.5 不同线路客流随时间变化
      • 3.4.6 不同线路的客流组成
    • 3.5 收入消费指标统计
      • 3.5.1 线路收入排行
      • 3.5.2 各个站点对线路收入的贡献
      • 3.5.3 不同消费金额次数占比
    • 3.6 完整乘车记录中客流统计
      • 3.6.1 数据过滤
      • 3.6.2 不同乘车区间客流量排行
      • 3.6.3 不同线路区间客流排行
    • 3.7 实时计算
      • 3.7.1 将站点客流数据写入 Hbase 中
      • 3.7.2 按照不同的业务场景从Hbase中读取数据
  • 4 最后

1 前言

🔥 优质竞赛项目系列,今天要分享的是

地铁大数据客流分析系统

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

1.1 实现目的

使用 Flink 完成数据清洗和聚合,使用 Elasticsearch + Kibana
的的技术路线,完成了客流信息,地铁收入、乘客车费、乘车区间和乘车时间的查询和可视化。

在此基础上,还使用 Flink 实现了计算各线路、站点和乘车区间的客流信息等实时计算功能,并将实时计算的结果写入到Hbase中,供下游业务查询使用。

2 数据集

2.2 数据集概况

  1. 数据集共用 1337000 条信息,其中包括 447708 条巴士的乘车信息和 781472 条地铁的出入站信息。巴士数据和地铁数据存在明显的不同:
  • 乘坐巴士只需要上车的时候刷卡,因此一条记录就是一次乘车记录
  • 而地铁在进出站时均需要刷卡,因此需要同时拥有一张交通卡的进出站记录才能构成一条完整的乘车记录
  1. 由于巴士的乘车记录比较简单,所有本项目中主要针对地铁的乘车记录进行计算和分析
  2. 地铁部分数据集的日期是北京时间 2018-09-01 05:00 ~ 2018-09-01-11:35

2.3 数据字段

在这里插入图片描述

3 实现效果

3.1 地铁数据整体概况

本项目只针对地铁的乘车记录进行分析,下面对数据集的整体概况做介绍,如图 1 所示,当日(2018-09-01 05:00 ~
2018-09-01-11:35)共计有 8 条线路的 170 个站点完成了 781472 人次的出入站,其中入站 415741 人次、出站 365731
人次,实际营业收入 1426697.15 元。因为不是一个完整的运营日所以出入站乘客人次并不相等。

在这里插入图片描述

3.2 平均指标

在这里插入图片描述

3.3 地铁2018年9月开通运营的线路

2018年9月该地区地铁共计有8条线路投入运行,分别是1号线、2号线、3号线、4号线、5号线、7号线、9号线、11号线,其具体线路图入下所示。

在这里插入图片描述

在这里插入图片描述

3.4 客流量相关统计

有关使用 Elasticsearch + Kibana实现数据可视化的具体细节。

3.4.1 线路客流量排行

如图所示是线路的客流排行榜,其中蓝色是入站客流,绿色是出站客流,根据图中信息可得到:

  • 总客流排名:5 号线、3 号线、1 号线、4 号线、2 号线、7 号线、11 号线、9 号线

  • 入站客流排名:5 号线、3 号线、1 号线、4 号线、7 号线、11 号线、9 号线、2 号线

  • 出站客流排名:1 号线、5 号线、3 号线、2 号线、4 号线、7 号线、11 号线、9 号线

在这里插入图片描述

3.4.2 站点客流量排行

总客流量的排行

从图站点总客流排行可以看出,五和、布吉站(深圳东火车站)、罗湖站(深圳火车站)、深圳北(深圳北高铁站)和民治分列前五,其中五和、布吉和民治入站客流明显多于出站客流,而罗湖站和深圳北则完全相反,这些车站基本都是不同线路的换乘车站。

在这里插入图片描述

3.4.3 入站客流排行

对于入站客流,五和、布吉(深圳东火车站)、丹竹头、民治和龙华分列前五

在这里插入图片描述

3.4.4 整体客流随时间变化趋势

从图 中可以看出,出入站客流随时间变化都出现了明显的高峰,但是具体来说又存在不同:

  • 入站客流的高峰在 08:30 附近,早于出站客流高峰的 08:45 附近
  • 在 08:37 之前入站的客流都是多于出站客流
  • 出站客流在 08:35-08:55 出现了大幅增加,这也与大部分公司固定的 9 点上班相吻合。
  • 整体来说入站客流的波动性没有出站客流那么剧烈,因为入站客流相对于地铁到站瞬间大量出站乘客来说相对更平稳没有那么明显的波峰出现。

在这里插入图片描述

3.4.5 不同线路客流随时间变化

由于图表篇幅的限制只显示客流量前四的线路。从图 2.8 中可以看出 地铁 5 号线、地铁 3 号线、地铁 1 号线在不同时间段客流量的变化较大,尤其是是 5
号线早高峰十分明显,由此推测人们的工作地点多集中在 5 号线附近,从客流量也可以佐证这个观点。

在这里插入图片描述

3.4.6 不同线路的客流组成

以客流量最多的五号线为例,从图 2.9 可以看出五和、深圳北、民治三个站点的客流分别占全线客流的 9.53 9.53% 9.53、 7.96 7.96%
7.96、 7.24 7.24% 7.24,同时这三个站的客流量也排名所以站点客流的第一、第四和第五位,右侧图例从上到下客流量依次减少。

在这里插入图片描述

3.5 收入消费指标统计

3.5.1 线路收入排行

从图 可以看出,虽然 1 号线的客流量只能排在 5 号线和 3 号线之后屈居第三,但是其线路的收入却排名第一。而客流量第四的 4 号线其收入只能排在第六位。

在这里插入图片描述

3.5.2 各个站点对线路收入的贡献

以收入最多的地铁 1 号线为例,罗湖站、会展中心站和桃园站对全线的收入贡献分列前三,而前海湾则是全线副班长贡献最少。右侧图例从上到下对线路收入贡献依次减少。

在这里插入图片描述

3.5.3 不同消费金额次数占比

从图中可以看出、实际消费金额为 2.85、1.9、4.75、3.8和5.7排名总消费次数的前五。

值得注意的是消费金额为0在总消费次数中的占比为 2.13 2.13%
2.13,这个一方面是深圳地铁确实对部分人群免费乘坐,另外一部分是有内部员工卡产生的。

在这里插入图片描述

3.6 完整乘车记录中客流统计

3.6.1 数据过滤

数据中存在大量的数据不能构成完整的情况,如

  • 对于一张卡只有入站或车站单条记录的显然不能构成一条完整的行程记录
  • 对于入站点和出现点相同的情况显然是不合理的数据,同样不能构成一条合理行程记录
  • 对于入站时间在 06:00 之前的记录同样不计算在内,因为深圳地铁的所有线路平均首班车时间在06:20左右,所以猜测可站点对外开放时间不会早于6:00。
  • 对于按照时间排序之后同一张卡出现,连续两次均为入站或出站的视为不合法数据

入站时间早于06:00和入站点出站点相同的数据



    深圳地铁的运营时间都是 6 点以后,所以之前的数据记录,均有内部工作人员活所产生,视为无效数据
    如卡号为 HHJJAFGAH 的用户在同一条线路的同一站点产生的这 6 条数据,从实际消费金额为 0.0 也可以佐证此推论
    1535752434000,HHJJAFGAH,0.0,0.0,地铁入站,地铁二号线,0,大剧院,AGM-109,260036109  2018/9/1 5:53:54
    1535752629000,HHJJAFGAH,2.0,0.0,地铁出站,地铁二号线,0,大剧院,AGM-117,260036117  2018/9/1 5:57:9
    1535754065000,HHJJAFGAH,0.0,0.0,地铁入站,地铁二号线,0,大剧院,AGM-109,260036109  2018/9/1 6:21:5
    1535754386000,HHJJAFGAH,2.0,0.0,地铁出站,地铁二号线,0,大剧院,AGM-117,260036117  2018/9/1 6:26:26
    1535758541000,HHJJAFGAH,0.0,0.0,地铁入站,地铁二号线,0,大剧院,AGM-113,260036113
    1535758687000,HHJJAFGAH,2.0,0.0,地铁出站,地铁二号线,0,大剧院,AGM-105,260036105


    随然该持卡人极可能是内部用户,但是下面这条数据将被作为有效数据,因为乘车事件是真实发生的从大剧院 -> 晒布
    1535766418000,HHJJAFGAH,0.0,0.0,地铁入站,地铁二号线,0,大剧院,AGM-117,260036117  2018/9/1 9:46:58
    1535767398000,HHJJAFGAH,2.0,0.0,地铁出站,地铁三号线,0,晒布,AGM-105,261013105    2018/9/1 10:3:18
    连续两次均为入站的数据
    
    1535755820000,CBCGDHCBB,0.0,0.0,地铁入站,地铁五号线,0,太安,AGT-118,263035118
    1535759424000,CBCGDHCBB,0.0,0.0,地铁入站,地铁四号线,0,清湖,AGM-105,262011105
    1535759862000,CBCGDHCBB,2.0,1.9,地铁出站,地铁四号线,0,清湖,AGM-108,262011108
    
    1535756340000,HHACJJFHE,0.0,0.0,地铁入站,地铁四号线,0,莲花北,AGM-109,262020109
    1535756926000,HHACJJFHE,0.0,0.0,地铁入站,地铁四号线,0,上梅林,AGM-110,262019110
    1535757664000,HHACJJFHE,2.0,0.0,地铁出站,地铁四号线,0,上梅林,AGM-104,262019104
    1535758092000,HHACJJFHE,0.0,0.0,地铁入站,地铁四号线,0,上梅林,AGM-110,262019110
    1535758342000,HHACJJFHE,2.0,0.0,地铁出站,地铁四号线,0,莲花北,AGM-107,262020107


经过以上指标过滤之后得到能够构成完整且合理的出入站记录 572156 条,每两条记录组成一条完整的行程记录 ,因此有 286078
条合法行程记录,其中包含了入站和出站的时间、线路、站点、刷卡设备等,还能计算出单次乘车所用时间。

3.6.2 不同乘车区间客流量排行

排名前三的乘车区间是:赤尾 —> 华强北,福民福田 —> 口岸、五和 —> 深圳北

在这里插入图片描述

3.6.3 不同线路区间客流排行

在这里插入图片描述
从图可以看出,5 号线直达,3 号线直达和 1 号线直达的客流最多。

3.7 实时计算

通过Flink可以实时计算过去的某个时间段内,个站点的出入站客流量以及总客流量,不同站点区间的客流量,以及不同线路区间的客流量等指标。

对于实时计算的结果可以使用 Redis 或者 Hbase 来进行存储,对于两者的技术特点对比如下:

  • Redis作为纯内存NoSQL虽然读写性能十分优秀,但其支持的数据量通常受内存限制,而HBase没有这个限制,可以存储远超内存大小的数据
  • HBase采用WAL,先记录日志再写入数据,理论上不会丢失数据。而Redis采用的是异步复制数据,在failover时可能会丢失数据
  • 客流信息作为基本不需要再次变动已经固化, 非常适合使用 HBase 来存储。

综上本项目中使用 Hbase 来存储实时计算的数据结果。

3.7.1 将站点客流数据写入 Hbase 中

  1. 首先在 Hbase shell 中使用以下命令建立存储表


create ‘StationTraffic’, {NAME => ‘traffic’}

  1. 执行 com.ngt.traffic.HBaseWriterStationTraffic 将站点的客流信息写入 Hbase 中


# 时间 客流排名
2018-09-01 11:30 001 column=traffic:count, timestamp=1609614078234, value=117
2018-09-01 11:30 001 column=traffic:name, timestamp=1609614078234,value=\xE8\x80\x81\xE8\xA1\x97

代码中统计的是,过去五分钟的客流量信息,每一分钟滚动一次


.timeWindow(Time.minutes(5), Time.minutes(1))

3.7.2 按照不同的业务场景从Hbase中读取数据

执行 com.ngt.traffic.HBaseReaderStationTraffic 实现相关功能

需求1:查询 2018-09-01 08:30 - 2018-09-01 08:45 各站点最近五分钟的客流


case class Traffic(time: String, rank: String, station: String, count: String)
val dataStream1: DataStream[(String, String)] =
// 表名,列族名,起始Rowkey,终止Rowkey(取不到)
env.addSource(new HBaseReader(“StationTraffic”, “traffic”,“2018-09-01 08:30”, “2018-09-01 08:46”))

dataStream1.map(x => {
    val keys: Array[String] = x._1.split(" ")
    val values: Array[String] = x._2.split("_")
    Traffic("时间:" + keys(1), "站点:" + values(1), "排名:" + keys(2), "客流量:" + values(0))
})
.map(data => {
    println(data.time, data.rank, data.station, data.count)
})

---------------------------------------
(时间:08:30,排名:001,站点:五和,客流量:548)
(时间:08:30,排名:002,站点:民治,客流量:386)
(时间:08:30,排名:003,站点:布吉,客流量:369)
(时间:08:30,排名:004,站点:丹竹头,客流量:343)
(时间:08:30,排名:005,站点:南山站,客流量:340)
(时间:08:30,排名:006,站点:深圳北,客流量:313)
(时间:08:30,排名:007,站点:罗湖站,客流量:306)
......

需求2:查询 2018-09-01 06:30 - 2018-09-01 11:30 客流量排名前 3 的站点


val dataStream2: DataStream[(String, String)] =
env.addSource(new HBaseReader(“StationTraffic”, “traffic”,“2018-09-01 06:30”, “2018-09-01 11:31”))

dataStream2.map(x => {
    val keys: Array[String] = x._1.split(" ")
    val values: Array[String] = x._2.split("_")
    Traffic("时间:" + keys(1), "排名:" + keys(2), "站点:" + values(1), "客流量:" + values(0))
})
.filter(_.rank.substring(3).toInt <= 3)
.map(data => {
    println(data.time, data.rank, data.station, data.count)
})
---------------------------------------
(时间:08:30,排名:001,站点:五和,客流量:548)
(时间:08:30,排名:002,站点:民治,客流量:386)
(时间:08:30,排名:003,站点:布吉,客流量:369)
(时间:08:31,排名:001,站点:五和,客流量:577)
(时间:08:31,排名:002,站点:南山站,客流量:436)
(时间:08:31,排名:003,站点:布吉,客流量:405)
(时间:08:32,排名:001,站点:五和,客流量:602)
(时间:08:32,排名:002,站点:南山站,客流量:439)
(时间:08:32,排名:003,站点:布吉,客流量:413)
(时间:08:33,排名:001,站点:五和,客流量:594)
(时间:08:33,排名:002,站点:南山站,客流量:451)
(时间:08:33,排名:003,站点:布吉,客流量:393)
......

不同乘车区间是同样的道理,更多的业务场景不在列举。

4 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/907446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

根据源码,模拟实现 RabbitMQ - 转发规则实现(6)

目录 一、转发规则实现 1.1、需求分析 1.2、实现 Router 转发规则 1.2.1、bindingKey 和 routingKey 参数校验 1.2.2、消息匹配规则 1.2.3、主题交换机匹配规则 一、转发规则实现 1.1、需求分析 这里主要实现 routingKey 和 bindingKey 参数的校验&#xff0c;以及 Topic…

邀请函 | 高质量区块链·元宇宙—标准行系列沙龙(北京站)即将开启

区块链、元宇宙是近年来备受关注的新兴技术&#xff0c;也是推动数字经济发展的重要力量。高质量标准引领高质量发展&#xff0c;加快形成标准引领&#xff0c;充分释放区块链、元宇宙对实体经济牵引赋能效应&#xff0c;推进形成相关产业体系高质量发展新格局刻不容缓。 为进…

AIGC|万字长文!带你了解AI大模型技术演进

一、AI的起源 在下面这张图中&#xff0c;我们可以看到两个人物&#xff1a;图中左边的人物是一位演员&#xff0c;他出演了一部名为《模仿游戏》的电影。而这部电影实际上讲述的是图中右边的人物&#xff0c;他就是是人工智能之父图灵&#xff08;Alan Turing&#xff09;。 …

Python可视化在量化交易中的应用(17)_Seaborn核密度曲线图

Seaborn中核密度图的绘制方法 seaborn中绘制核密度图使用的是sns.kdeplot()函数&#xff1a; sns.kdeplot(x,y,shade,vertical,kernel,bw,gridsize200,cut3,clip,legend,cumulative,shade_lowest,cbar,cbar_ax,cbar_kws,ax,weights,hue,palette,hue_order,hue_norm,multiple‘…

做好产品设计应遵循的5大原则

产品设计原则是产品设计需遵循的基础规则&#xff0c;如果没有遵循设计原则&#xff0c;直接进行产品设计&#xff0c;往往会造成产品设计不稳定、冗杂&#xff0c;不能真正满足用户需求&#xff0c;这为项目带来较大风险&#xff0c;影响项目顺利交付。 一般来说&#xff0c;做…

【实用工具】ScreenToGif 制作GIF

1、介绍 官方地址 ScreenToGif是一款优秀的录屏软件&#xff0c;可将屏幕上的软件操作、会议视频、视频聊天等录制为GIF或MP4格式的文件。 ScreenToGif的启动界面包含屏幕录像机、电脑摄像头录制、画板录制和编辑器4个功能。启动录像机功能后&#xff0c;会有一个录制窗口&am…

【Axure高保真原型】通过输入框动态控制折线图

今天和大家分享通过输入框动态控制折线图的原型模板&#xff0c;在输入框里维护项目数据&#xff0c;可以自动生成对应的折线图&#xff0c;鼠标移入对应折点&#xff0c;可以查看对应数据。使用也非常方便&#xff0c;只需要修改输入框里的数据&#xff0c;或者复制粘贴文本&a…

Docker容器与虚拟化技术:Docker-Compose

目录 一、理论 1.Docker-Compose 二、实验 1. Docker Compose 安装部署 2.Docker Compose撰写nginx 镜像 3.Docker Compose撰写tomcat 镜像 三、问题 1.Docker Compose 和 Dockerfile 的区别 四、总结 一、理论 1.Docker-Compose &#xff08;1&#xff09;使用场景…

【Linux】进程间通信之信号机制2

文章目录 信号阻塞代码验证验证信号的阻塞验证信号的阻塞不影响信号注册验证可靠信号不会丢信号&#xff0c;不可靠信号会丢信号验证9号和19号信号不能被阻塞 用信号解决僵尸进程volatile关键字 信号阻塞代码验证 在上篇详解信号机制的博文中&#xff0c;我们提到了设置阻塞位…

RISC-V公测平台发布 · 数据库在RISC-V服务器上的适配评估

前言 上一期讲到YCSB在RISC-V服务器上对MySQL进行性能测试&#xff08;RISC-V公测平台发布 使用YCSB测试SG2042上的MySQL性能&#xff09;&#xff0c;在这一期文章中&#xff0c;我们继续深入讨论RISC-V数据库的应用。本期就继续利用HS-2平台来测试数据库软件在RISC-V服务器…

基于PaddlePaddle实现的声纹识别系统

前言 本项目使用了EcapaTdnn、ResNetSE、ERes2Net、CAM等多种先进的声纹识别模型&#xff0c;不排除以后会支持更多模型&#xff0c;同时本项目也支持了MelSpectrogram、Spectrogram、MFCC、Fbank等多种数据预处理方法&#xff0c;使用了ArcFace Loss&#xff0c;ArcFace loss…

❤echarts折线图完整使用及详细配置参数

❤echarts折线图完整使用及详细配置参数 进入echarts官网 查看案例&#xff0c;下面说说一些echarts图的调节 一、配置echarts具体参数 01 基础版本的折线图 option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun]},yAxis: {type: value},series: [{data…

Charles通过逍遥模拟器抓包APP,亲测可用

1.设置http代理. Proxy-->Proxy settings 2.设置ssl proxy-->ssl proxying settings 3.Charles安装证书 弹出证书安装界面,点击"安装证书" 选择当前用户, 选择: 将所有的证书都放入下列存储: 直接下一步,最后确定提示"导入成功" 4.接着设置Charles安…

年薪47500美元|眼科硕士赴弗吉尼亚大学从事博士后研究

K医生只有医学硕士学位&#xff0c;起初只考虑申请访问学者&#xff0c;最终我们为其争取到“Post-Doctoral Research Associate”&#xff08;博士后研究助理&#xff09;职位&#xff0c;年薪47500美元&#xff0c;大大超出了本人的预期。 K医生背景&#xff1a; 申请类型&a…

提升管班小诀窍

在传统教育中&#xff0c;将考试结果告知家长一直是一项相对麻烦的任务。老师们不得不一个一个的打电话或发短信&#xff0c;耗费大量时间和精力。然而&#xff0c;现在有了易查分&#xff0c;老师们可以轻松地创建自己的成绩查询系统&#xff0c;大大简化了这项任务。 好消息&…

iOS代码混淆

文章目录 一、混淆的原理二、实现混淆1. 创建文件2. 将文件拖导入目录中3. 将以下脚本拷贝到刚新建的confuse.sh文件中4. 修改文件权限5. 修改项目配置6. 添加需要混淆的方法名7. 配置PCH文件8. 运行效果 一、混淆的原理 这里使用的混淆的原理是&#xff0c;用一串随机生成的字…

百华劳保|听厂家聊聊如何检测防水劳保鞋?

说起防水劳保鞋大家可能并不陌生&#xff0c;在有积水或水利工程这些工作场景中使用&#xff0c;是防止水渗透鞋子的安全防护鞋。许多企业会为员工发放防水劳保鞋&#xff0c;在采购时一般都需要进行防水测试&#xff0c;提供相对应的检测报告。今天百华小编与大家聊聊都是如何…

毛利率下滑至负数,但小鹏汽车仍有信心

KlipC报道&#xff1a;8月18日周五&#xff0c;港股盘后美股盘前&#xff0c;小鹏汽车公布截至2023年6月30日的二季度业绩&#xff0c;据数据显示本季度小鹏营收50.6亿人民币&#xff0c;略超预期。但受G3i的存货减值及存货购买合约损失拖累&#xff0c;毛利率下滑至-3.9&#…

vellum (Discovering Houdini VellumⅡ柔体系统)学习笔记

视频地址&#xff1a; https://www.bilibili.com/video/BV1ve411u7nE?p3&spm_id_frompageDriver&vd_source044ee2998086c02fedb124921a28c963&#xff08;搬运&#xff09; 个人笔记如有错误欢迎指正&#xff1b;希望可以节省你的学习时间 ~享受艺术 干杯&#x1f37b…