【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B:美国纽约公共自行车使用量预测分析 问题一Python代码分析

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 本文分析了2023年第二届钉钉杯大学生大数据挑战赛初赛B题"美国纽约公共自行车使用量预测分析",重点讨论了问题一的Python代码实现,包括自行车借还网络图的构建、网络密度的计算以及平均最短路径长度和网络直径的分析。

2023 年第二届钉钉杯大学生大数据挑战赛 初赛 B:美国纽约公共自行车使用量预测分析 问题一

在这里插入图片描述

1 题目

Citi Bike是纽约市在2013年启动的一项自行车共享出行计划,由“花旗银行”(Citi Bank)赞助并取名为“花旗单车”(Citi Bike)。在曼哈顿,布鲁克林,皇后区和泽西市有8,000辆自行车和500个车站。为纽约的居民和游客提供一种 方便快捷,并且省钱的自行车出行方式。人们随处都能借到Citi Bank,并在他们的目的地归还。本案例的数据有两部分:第一部分是纽约市公共自行车的借还交易流水表。Citi Bik自行车与共享单车不同,不能使用手机扫码在任意地点借还车,而需要使用固定的自行车桩借还车,数据集包含2013年7月1日至2016年8 月31日共38个月(1158天)的数据,每个月一个文件。其中2013年7月到2014年8 月的数据格式与其它年月的数据格式有所差别,具体体现在变量starttime和stoptime的存储格式不同。

第二部分是纽约市那段时间的天气数据,并存储在weather_data_NYC.csv文 件中,该文件包含2010年至2016年的小时级别的天气数据。

公共自行车数据字段表

变量编号 变量名 变量含义 变量取值及说明
1 trip duration 旅行时长 骑行时间,数值型,秒
2 start time 出发时间 借车时间,字符串,m/d/YYY HH:MM:SS
3 stop time 结束时间 还车时间,字符串,m/d/YYY HH:MM:SS
4 start station id 借车站点编号 定性变量,站点唯一编号
5 start station name 借车站点名称 字符串
6 start station latitude 借车站点维度 数值型
7 start station longtude 借车站点经度 数值型
8 end station id 还车站点编号 定性变量,站点唯一编号
9 end station name 还车站点名称 字符串
10 end station latitude 还车站点纬度 数值型
11 end station longitude 还车站点经度 数值型
12 bile id 自行车编号 定性变量,自行车唯一编号
13 Use type 用户类型 Subscriber:年度用户; Customer:24小时或者7天的临时用户
14 birth year 出生年份 仅此列存在缺失值
15 gender 性别 0:未知 1:男性 2:女性

天气数据字段简介表

变量编号 变量名 变量含义 变量取值及说明
1 date 日期 字符串
2 time 时间 EDT(Eastern Daylight Timing)指美国东部夏令单位
3 temperature 气温 单位:℃
4 dew_poit 露点 单位:℃
5 humidity 湿度 百分数
6 pressure 海平面气压 单位:百帕
7 visibility 能见度 单位:千米
8 wind_direction 风向 离散型,类别包括west,calm等
9 wind_speed 风速 单位:千米每小时
10 moment_wind_speed 瞬间风速 单位:千米每小时
11 precipitation 降水量 单位:毫米,存在缺失值
12 activity 活动 离散型,类别包括snow等
13 conditions 状态 离散型,类别包括overcast,light snow等
14 WindDirDegrees 风向角 连续型,取值为0~359
15 DateUTC 格林尼治时间 YYY/m/d HH:MM

二、解决问题

  1. 自行车借还情况功能实现:

实现各个站点在一天的自行车借还情况网络图,该网络图是有向图,箭头从借车站点指向还车站点(很多站点之间同时有借还记录,所以大部分站点两两之间是双向连接)。

(一)以2014年8月3日为例进行网络分析,实现自行车借还网络图,计算网络图的节点数,边数,网络密度(表示边的个数占所有可能的连接比例数),给出计算过程和画图结果。

(二)使用上述的网络分析图,对经度位于40.695~40.72,纬度位于- 74.023~-73.973之间的局域网区域进行分析,计算出平均最短路径长度(所有点 两两之间的最短路径长度进行算数平均)和网络直径(被定义网络中最短路径的 最大值)。

  1. 聚类分析

对于2013年7月1日至2015年8月31日数据集的自行车数据进行聚类分析,选 择合适的聚类数量K值,至少选择两种聚类算法进行聚类,并且比较不同的聚类 方法以及分析聚类结果。

  1. 站点借车量的预测分析:

对所有站点公共自行车的借车量预测,预测出未来的单日借车量。将2013年 7月-2015年7月数据作为训练集,2015年8月1-31日的数据作为测试集,预测2015 年8月1-31日每天的自行车单日借车量。给出每个站点预测结果的MAPE,并且给 出模型的参数数量,最后算出所有站点的MAPE的均值(注:测试集不能参与到训 练和验证中,否则作违规处理)。
$$MAPE = \frac{1}{n} \sum{|\frac{y_i-\hat{y_i}}{y_i}|} \times 100\% $$

2 问题分析

2.1 问题一

  1. 绘制有向图

a. 读入数据并分别提取“起始站点编号”和“结束站点编号”两列数据,构建自行车借还网络图。

b. 对于第一步构建的网络图,我们需要计算网络图的节点数,边数,网络密度。节点数即为站点数,边数为借还次数。网络密度为边的数量占所有可能的连接比例。

c. 画出自行车借还网络图。

e. 计算平均最短路径长度和网络直径

首先选出符合条件(经度位于40.695~40.72,纬度位于- 74.023~-73.973之间)的借车站点和还车站点,并以它们为节点构建一个子图进行分析。然后可以直接使用networkx库中的函数来计算平均最短路径长度和网络直径。

2.2 问题二

  1. 数据预处理:对进行数据清洗和特征提取。可以使用PCA、LDA算法进行降维,减小计算复杂度。

  2. 聚类算法:
    a. K-means: 进行数据聚类时,选择不同的K值进行多次试验,选取最优的聚类结果。可以使用轮廓系数、Calinski-Harabaz指数等评价指标进行比较和选择。
    b. DBSCAN: 利用密度对数据点进行聚类,不需要预先指定聚类的数量。使用基于密度的聚类算法时,可以通过调整半径参数和密度参数来得到不同聚类效果。
    c. 层次聚类:可分为自顶向下和自底向上两种方式。通过迭代计算每个数据点之间的相似度,将数据点逐渐合并,最后得到聚类结果。

    d.改进的聚类算法

    e. 深度聚类算法

  3. 聚类结果分析:选择最优的聚类结果后,对不同类别骑车的用户进行画像。分析每个类别的用户行为特征。

2.3 问题三

  1. 导入数据并进行数据预处理,整合以站点为单位的借车数据。
  2. 对数据进行时间序列分析,使用ARIMA模型进行单日借车量预测。
  3. 使用时间序列交叉验证方法进行模型评估,计算每个站点预测结果的MAPE。
  4. 计算所有站点的MAPE的均值,给出模型的参数数量。

3 Python代码实现

3.1 问题一

以1000条数据为例

import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
# 导入数据
data = pd.read_csv('初赛数据集/2013-08 - Citi Bike trip data.csv')
df = data[0:1000]

。。。略

# 添加边
# 添加自行车借还关系作为网络图的边
for idx, row in df.iterrows():
    G.add_edge(row['start station id'], row['end station id'])

# 获取节点数和边数
node_num = G.number_of_nodes()
edge_num = G.number_of_edges()

# 计算网络密度
density = nx.density(G)
plt.figure(figsize=(15,10))
# 绘制网络图
pos = nx.spring_layout(G, k=0.1) # 用Spring算法布局网络图
nx.draw_networkx(G, pos=pos, node_size=20, edge_color='gray', alpha=0.5)
plt.savefig('img/有向图.png',dpi=300)
plt.show()

# 输出结果
print('节点数:', node_num)
print('边数:', edge_num)
print('网络密度:', density)

在这里插入图片描述


import pandas as pd
import networkx as nx

# 导入数据
df = pd.read_csv('初赛数据集/2013-08 - Citi Bike trip data.csv')

# 筛选符合条件的借还车站点
df_filtered = df[(df['start station longitude']>=-74.023) & (df['start station longitude']<=-73.973) &
                 (df['end station longitude']>=-74.023) & (df['end station longitude']<=-73.973) &
                 (df['start station latitude']>=40.695) & (df['start station latitude']<=40.72) &
                 (df['end station latitude']>=40.695) & (df['end station latitude']<=40.72)]

。。。略

# 添加边
# 添加自行车借还关系作为网络图的边
for idx, row in df_filtered.iterrows():
    G.add_edge(row['start station id'], row['end station id'])

# 计算平均最短路径长度和网络直径
average_shortest_path_length = nx.average_shortest_path_length(G)
diameter = nx.diameter(G)

# 输出结果
print('平均最短路径长度:', average_shortest_path_length)
print('网络直径:', diameter)

3.2 问题二

见另一篇博客,持续更新

3.3 问题三

见另一篇博客,持续更新

4 完整代码下载

见知乎文章底部链接,包括所有问题的全部代码

zhuanlan.zhihu.com/p/643865954

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
5天前
|
存储 机器学习/深度学习 SQL
大数据处理与分析技术
大数据处理与分析技术
26 2
|
7天前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
8天前
|
存储 监控 数据挖掘
【Clikhouse 探秘】ClickHouse 物化视图:加速大数据分析的新利器
ClickHouse 的物化视图是一种特殊表,通过预先计算并存储查询结果,显著提高查询性能,减少资源消耗,适用于实时报表、日志分析、用户行为分析、金融数据分析和物联网数据分析等场景。物化视图的创建、数据插入、更新和一致性保证通过事务机制实现。
48 14
|
9天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
16天前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
61 7
|
14天前
|
消息中间件 分布式计算 大数据
数据为王:大数据处理与分析技术在企业决策中的力量
【10月更文挑战第29天】在信息爆炸的时代,大数据处理与分析技术为企业提供了前所未有的洞察力和决策支持。本文探讨了大数据技术在企业决策中的重要性和实际应用,包括数据的力量、实时分析、数据驱动的决策以及数据安全与隐私保护。通过这些技术,企业能够从海量数据中提取有价值的信息,预测市场趋势,优化业务流程,从而在竞争中占据优势。
46 2
|
15天前
|
数据采集 机器学习/深度学习 搜索推荐
大数据与社交媒体:用户行为分析
【10月更文挑战第31天】在数字化时代,社交媒体成为人们生活的重要部分,大数据技术的发展使其用户行为分析成为企业理解用户需求、优化产品设计和提升用户体验的关键手段。本文探讨了大数据在社交媒体用户行为分析中的应用,包括用户画像构建、情感分析、行为路径分析和社交网络分析,以及面临的挑战与机遇。
|
15天前
|
机器学习/深度学习 搜索推荐 大数据
大数据与教育:学生表现分析的工具
【10月更文挑战第31天】在数字化时代,大数据成为改善教育质量的重要工具。本文探讨了大数据在学生表现分析中的应用,介绍学习管理系统、智能评估系统、情感分析技术和学习路径优化等工具,帮助教育者更好地理解学生需求,制定个性化教学策略,提升教学效果。尽管面临数据隐私等挑战,大数据仍为教育创新带来巨大机遇。
|
16天前
|
存储 数据处理 Python
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第27天】在科学计算和数据分析领域,Python凭借简洁的语法和强大的库支持广受欢迎。NumPy和SciPy作为Python科学计算的两大基石,提供了高效的数据处理和分析工具。NumPy的核心功能是N维数组对象(ndarray),支持高效的大型数据集操作;SciPy则在此基础上提供了线性代数、信号处理、优化和统计分析等多种科学计算工具。结合使用NumPy和SciPy,可以显著提升数据处理和分析的效率,使Python成为科学计算和数据分析的首选语言。
26 3
|
17天前
|
存储 机器学习/深度学习 算法
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第26天】NumPy和SciPy是Python科学计算领域的两大核心库。NumPy提供高效的多维数组对象和丰富的数学函数,而SciPy则在此基础上提供了更多高级的科学计算功能,如数值积分、优化和统计等。两者结合使Python在科学计算中具有极高的效率和广泛的应用。
33 2