挑战杯 地铁大数据客流分析系统 设计与实现

news/发布时间2024/5/16 7:25:21

文章目录

  • 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:541535752629000,HHJJAFGAH,2.0,0.0,地铁出站,地铁二号线,0,大剧院,AGM-117,260036117  2018/9/1 5:57:91535754065000,HHJJAFGAH,0.0,0.0,地铁入站,地铁二号线,0,大剧院,AGM-109,260036109  2018/9/1 6:21:51535754386000,HHJJAFGAH,2.0,0.0,地铁出站,地铁二号线,0,大剧院,AGM-117,260036117  2018/9/1 6:26:261535758541000,HHJJAFGAH,0.0,0.0,地铁入站,地铁二号线,0,大剧院,AGM-113,2600361131535758687000,HHJJAFGAH,2.0,0.0,地铁出站,地铁二号线,0,大剧院,AGM-105,260036105随然该持卡人极可能是内部用户,但是下面这条数据将被作为有效数据,因为乘车事件是真实发生的从大剧院 -> 晒布1535766418000,HHJJAFGAH,0.0,0.0,地铁入站,地铁二号线,0,大剧院,AGM-117,260036117  2018/9/1 9:46:581535767398000,HHJJAFGAH,2.0,0.0,地铁出站,地铁三号线,0,晒布,AGM-105,261013105    2018/9/1 10:3:18连续两次均为入站的数据1535755820000,CBCGDHCBB,0.0,0.0,地铁入站,地铁五号线,0,太安,AGT-118,2630351181535759424000,CBCGDHCBB,0.0,0.0,地铁入站,地铁四号线,0,清湖,AGM-105,2620111051535759862000,CBCGDHCBB,2.0,1.9,地铁出站,地铁四号线,0,清湖,AGM-108,2620111081535756340000,HHACJJFHE,0.0,0.0,地铁入站,地铁四号线,0,莲花北,AGM-109,2620201091535756926000,HHACJJFHE,0.0,0.0,地铁入站,地铁四号线,0,上梅林,AGM-110,2620191101535757664000,HHACJJFHE,2.0,0.0,地铁出站,地铁四号线,0,上梅林,AGM-104,2620191041535758092000,HHACJJFHE,0.0,0.0,地铁入站,地铁四号线,0,上梅林,AGM-110,2620191101535758342000,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.bcls.cn/mafG/2105.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

3DSC特征描述符、对应关系可视化以及ICP配准

一、3DSC特征描述符可视化 C #include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pcl/search/kdtree.h> #include <pcl/io/pcd_io.h> #include <pcl/features/normal_3d_omp.h>//使用OMP需要添加的头文件 #include <pcl…

微信小程序引入官方《评价组件》的一些坑点

作为微信小程序开发者&#xff0c;多少有些想对其吐槽的冲动。文档是多&#xff0c;却混乱、自相矛盾等等。 这次遇到的坑就是官方的《评价组件》&#xff0c;原本引入该组件是为了增加用户体验&#xff0c;结果却不如人意。 按官方文档引入组件&#xff08;代码层面的引入&a…

Unity设备分级策略

Unity设备分级策略 前言 之前自己做的设备分级策略&#xff0c;在此做一个简单的记录和思路分享。希望能给大家带来帮助。 分级策略 根据拟定的评分标准&#xff0c;预生成部分已知机型的分级信息&#xff0c;且保存在包内&#xff1b;如果设备没有被评级过&#xff0c;则优…

学习如何在js中指定按照数组中某一个值排序sort方法

学习如何在js中指定按照数组中某一个值排序sort方法 定义和用法排序数组按升序对数组中的数字进行排序按降序对数组中的数字进行排序获取数组中的最小值获取数组中的最大值获取数组中的最大值按字母顺序对数组进行排序&#xff0c;然后反转排序项的顺序&#xff08;降序&#x…

如何选择最适合的图纸加密软件?用户体验及性价比

安秉网盾图纸加密软件是一款功能强大的图纸加密工具&#xff0c;具有以下特点和优势&#xff1a; 全盘加密&#xff1a;安秉网盾采用先进的加密算法&#xff0c;能对文件、文件夹、磁盘等数据进行全面加密&#xff0c;确保数据在存储和传输过程中的安全性。 监控与审计&#…

open3d k-means 聚类

k-means 聚类 一、算法原理1、介绍2、算法步骤 二、代码1、机器学习生成kmeans聚类2、点云学习生成聚类 三、结果1、原点云2、机器学习生成kmeans聚类3、点云学习生成聚类 四、相关链接 一、算法原理 1、介绍 K-means聚类算法是一种无监督学习算法&#xff0c;主要用于数据聚…

[嵌入式系统-28]:开源的虚拟机监视器和仿真器:QEMU(Quick EMUlator)与VirtualBox、VMware Workstation的比较

目录 一、QEMU概述 1.1 QEMU架构 1.2 QEMU概述 1.3 什么时候需要QEMU 1.4 QEMU两种操作模式 1.5 QEMU模拟多种CPU架构 二、QEMU与其他虚拟机的比较 2.1 常见的虚拟化技术 2.1 Linux KVM 2.2 Windows VirtualBox 2.3 Windows VMware workstation 三、VirtualBox、VM…

elementui 中el-date-picker 选择年后输出的是Wed Jan 01 2025 00:00:00 GMT+0800 (中国标准时间)

文章目录 问题分析 问题 在使用 el-date-picker 做只选择年份的控制器时&#xff0c;出现如下问题&#xff1a;el-date-picker选择年后输出的是Wed Jan 01 2025 00:00:00 GMT0800 (中国标准时间)&#xff0c;输出了两次如下 分析 在 el-date-picker 中&#xff0c;我们使用…

FISCO BCOS(十七)利用脚本进行区块链系统监控

要利用脚本进行区块链系统监控&#xff0c;你可以使用各种编程语言编写脚本&#xff0c;如Python、Shell等 利用脚本进行区块链系统监控可以提高系统的稳定性、可靠性&#xff0c;并帮助及时发现和解决潜在问题&#xff0c;从而确保区块链网络的正常运行。本文可以利用脚本来解…

day09-MongoDB

文章目录 day09-MongoDB一、回顾1.1. 行为实战核心要点说明 二、评论系统2.1 MongoDB2.1.1 MongoDB简介①简介②体系结构与术语 2.1.2 安装与连接2.1.3 Springboot整合MongoDB①引入依赖②添加服务端配置③准备实体类④测试-新增⑤测试-查询⑥测试-更新测试-删除 2.2 app端评论…

fastApi笔记04-查询参数和字符串校验

额外校验 使用Query可以对查询参数添加校验 from typing import Unionfrom fastapi import FastAPI, Queryapp FastAPI()app.get("/items/") async def read_items(q: Union[str, None] Query(defaultNone, max_length50)):results {"items": [{"…

Java,SpringBoot项目中,Postman的测试方法。

目录 展示查询搜索 根据id展示数据 根据id删除数据 根据id更新数据 添加数据 展示查询搜索 // 根据姓名分页查询用户GetMapping("/getUsersByName")public IPage<User> getUsersByName(RequestParam(defaultValue "1") Long current,RequestPar…

Vue-route核心知识整理

目录 1 相关理解 1.1 对 vue-router 的理解 1.2 对 SPA 应用的理解 1.3 对路由的理解 1.3.1 什么是路由&#xff1f; 1.3.2 路由的分类 2 几个注意点 3 路由的基本使用 4 嵌套 (多级) 路由 5 路由传参 5.1 query 方式传参 5.1.1 跳转路由并携带query参数&#xff0…

32单片机基础:OLED调试工具的使用

下面会介绍OLED显示屏的驱动函数模块&#xff0c;先学会如何使用&#xff0c;至于OLED屏幕的原理和代码编写&#xff0c; 我们之后会再写一篇。 现在我们就是用OLED当一个调试的显示屏&#xff0c;方便我们调试程序。 为什么要调试呢&#xff0c;是为了方便我们看现象&#…

深度学习在时间序列预测的总结和未来方向分析

2023年是大语言模型和稳定扩散的一年&#xff0c;时间序列领域虽然没有那么大的成就&#xff0c;但是却有缓慢而稳定的进展。Neurips、ICML和AAAI等会议都有transformer 结构(BasisFormer、Crossformer、Inverted transformer和Patch transformer)的改进&#xff0c;还出现了将…

四川宏博蓬达法律咨询有限公司守护您的法律安全

在法治社会日益完善的今天&#xff0c;法律咨询服务的需求日益增长。四川宏博蓬达法律咨询有限公司作为一家专业的法律服务机构&#xff0c;始终致力于为客户提供全面、高效、安全的法律服务&#xff0c;为社会和谐稳定贡献自己的力量。 一、专业团队&#xff0c;铸就信赖 四川…

数据模型概念

一、概念 (1) 定义 在数据库系统中针对不同的使用对象和应用目的&#xff0c;采用不同的数据模型。根据模型的应用的不同目的&#xff0c;可以将这些模型划分为两类&#xff1a; (2) 分类 A&#xff1a;概念数据模型 它也称信息模型它是按用户的观点&#xff08;观念世界&…

【转载】企业资产收集与脆弱性检查工具

简介 云图极速版是针对拥有攻击面管理需求的用户打造的 SaaS 应用&#xff0c;致力于协助用户管理互联网资产攻击面的 SaaS 化订阅服务产品。可实现对备案域名、子域名、IP、端口、服务、网站、漏洞、安全风险等场景进行周期性监控&#xff0c;支持多维度分析攻击面。利用可视化…

相机图像质量研究(33)常见问题总结:图像处理对成像的影响--锯齿

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

Leetcode 283.移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […
推荐文章