# 基于历史大数据出租车载客点预测 **Repository Path**: likehao554/Data-analysis ## Basic Information - **Project Name**: 基于历史大数据出租车载客点预测 - **Description**: 数据分析-基于历史大数据进行出租车载客点预测 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 1 - **Created**: 2023-03-24 - **Last Updated**: 2024-12-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 数据分析-基于历史大数据进行出租车载客点预测 #### 项目介绍   在这个数字化的时代,人们的出行都被数据所记录。车辆的出行数据在一定程度上反应了城市人流的动态变化趋势。出租车作为缓解城市压力的重要工具,在交通高峰时期却存在人找不到车,车找不到人的情况。由于车辆的流动性较强,很难对附近车辆进行规划管理,但是通过分析大量的乘客出行信息,可以达到预测上车点的目标。
  本项目通过使用滴滴快车智能出行平台的数据集,当已经有上车点和所有载客点的位置信息时,对于载客点密度大的区域便可认为此区域为高频上车区域,通过K-Means聚类算法,对经纬度进行聚类。聚类后将每个上车点设置权重,以划分推荐等级。将得到的数据点导入百度地图中,选择了权重较大的点的分布范围,发现中心点大多集中在市中心或者火车站附近,聚类效果与实际结果一致。同时为了避免全局聚类带来的误差,又通过实验对全局聚类和局部聚类的效果进行了比较,结果显示该项目中两种聚类方式整体的差别很小。最后通过百度地图的api,结合各个点的权重值,对某个中心点进行了圆形搜索载客点推荐,实现了数据的可视化。
#### 数据描述   数据采用的是滴滴快车智能出行平台的开源数据集,描述了延安市在2018年12月份的车辆数据情况。数据集为未处理的原始数据,文件格式为bson,一共包含有十几种集合,本项目是进行预测载客点,所以需要的数据应该包括车牌号、车主电话号、车辆经纬度、日期、上车时间、车辆速度、载客状态等信息,包含有这些信息的有Adresshistory和Meter集合。Address history集合数据类型如图所示。
![输入图片说明](%E5%9B%BE%E7%89%87.png)
  在这些数据类型中,需要用到isuNum、latitude、longitude、speed、time,其中isuNum(车主电话号码)主要用途是和其他集合的数据比较时确保数据一一对应,latitude和longitude(经纬度)是核心数据,但是这个经纬度包括了所有状态下的位置信息,后期数据清洗要将上车点位置从里面找出来,speed(速度)可以筛选出各类状态,因为所有的载客点的速度一定为零,time(时间)用于确定上车时间以及将来对不同时段的数据进行分类。Meter集合数据类型如图所示。
![输入图片说明](%E5%9B%BE%E7%89%87%EF%BC%91.png) #### 数据清洗   在MongoDB的bin目录下输入指令 mongorestore -d taxi_data E:\python\HxGps808Test 就可以将数据导入已有的数据库中。如图所示。
 ![输入图片说明](%E5%9B%BE%E7%89%87%EF%BC%92.png)
  将数据导出为csv集合后,由于数据为脏数据,首先对数据进行清洗,去除数据中的重复值、空值、超过经纬度的异常值。选择了经度、纬度、速度、状态、时间五个字段作为进行数据分析的原始数据。
  为了实现自动地将所有集合完成数据清洗工作,将前期数据清洗代码封装成了函数,在主函数内循环读入需要清洗的文件,减少人工输入的工作量。
  考虑到有些集合数据量过大有可能产生 MemoryError,在读取 csv 文件时,将 chunksize 设置为 1000000,即每次读 1000000 条数据到内存,对数据分批进行处理,每次处理都会返回一个可迭代的对象,再对这个对象进行数据清洗的工作.
  在将清洗完的数据重新导出 csv 文件时,由于在读取文件时是分批次写入的,所以在重新导出csv文件时,需要设置为每次追加写入,并且在写入文件的过程中判断是否为第一次写入,以决定是否写入header。
  整合后的函数代码如下:
![输入图片说明](%E5%9B%BE%E7%89%87%EF%BC%94.png)
#### 算法实现   使用sklearn 机器学习包中的 K-Means 算法:
![输入图片说明](%E5%9B%BE%E7%89%87%EF%BC%95.png)
  1.程序使用了一个时间段的数据进行聚类,K 值选择了300。
  2.n_ job 参数为并行数设置,(-1 表示使用所有 CPU),处理大数据时,最好将其设置为 CPU 数或者-1,聚类速度会有很大很大的提升,相应的CPU的开销也会变大。
  3.对于聚类完的数据,只保留了中心点的经纬度。
  4.统计了每个簇所包含的数据总数,并且重新生成一列保存
##### 权重设置   现在已经使用 K-Means 算法将一个时间段的数据聚类,对于得到的 300 个上车点,要对其进行进一步分类,为每个上车点设置权重,以划分推荐等级。总共划分了5个等级,并将权重作为新的一列,重新导出。
  数据分布图 ![输入图片说明](%E5%9B%BE%E7%89%87%EF%BC%96.png) #### 可视化结果分析   将得到的数据点导入百度地图中,在百度地图 API 的 MapV 编辑器中对聚类结果进行了分析,将聚类之后得到的中心点导入,并为其设置权重(此处以时间段 8:00~9:00 的数据为例)并且选取了两个权重较大的点分布较多的范围,发现中心点大多集中在市中心或者火车站附近,聚类效果与预期相吻合。
![输入图片说明](%E5%9B%BE%E7%89%87%EF%BC%97.png)
![输入图片说明](%E5%9B%BE%E7%89%87%EF%BC%98.png)
  对未聚类的原始数据新建一个图层并使用热力图显示,对比分析聚类的效果,聚类结果和原始数据的热力中心点基本相吻合
![输入图片说明](%E5%9B%BE%E7%89%87%EF%BC%99.png)
![输入图片说明](%E5%9B%BE%E7%89%87%EF%BC%91%EF%BC%90.png)
#### 程序演示   之前对于最终结果的展示,只是简单地导入到地图上,然而要实现预测载客点的话,不可能一次性将所有点都进行推荐,只需要对一个小范围的载客点进行推荐,所以通过使用圆形搜索的方式,以乘客当前位置为圆心,规定半径后对圆形范围内的载客点进行推荐。最终的可视化版本有两个,一个是可以定位到当前 用户位置的 GPS 版本,一个是比较灵活方便系统的测试和最终的可视化展示的鼠标模拟 CLICK 版本。 利用百度 javascript api 提供的画圆函数在地图上画出圆形范围。
  利用浏览器定位获取当前位置,并以获取的用户当前位置的GPS 坐标为圆心画出圆形搜索范围,对于乘客,可以确定是步行去找出租车,所以乘客的搜索半径不宜过大,将搜索半径设置为了 200m。画出圆形搜索范围以后,通过百度提供GeoUtils 类中的isPointInCircle 可以直接判断点与圆形的关系,需要导入百度地图的 GeoUtils.js。筛选出位于当前圆形搜索范围的点之后,再对这些点画出标注,同时,根据之前划 分的权重的不同使用不同颜色的标记,并且当鼠标放到相应的点上时,会显示当前点的 推荐等级 ![输入图片说明](%E5%9B%BE%E7%89%87%EF%BC%91%EF%BC%92.png)