一、前言
近年来,共享单车在全球范围内普及,为城市出行提供了便捷选择。本文基于伦敦的共享单车数据集(london_merged.csv),通过 Python 数据分析工具对单车使用规律进行可视化探索,挖掘用户出行的时间特征与环境影响因素。本文主要使用的工具是 Pandas、Matplotlib、Seaborn,如果你正在学习数据分析,这会是一个很不错的案例。
二、环境与数据准备
1. 使用环境
- Python 3.10+
- pandas
- matplotlib
- seaborn
2. 数据说明
数据集包含伦敦共享单车的订单信息,核心字段包括:
timestamp:时间戳cnt:订单量t1:温度hum:湿度wind_speed:风速season:季节(1=春,2=夏,3=秋,4=冬)is_weekend:是否为周末(0=工作日,1=周末)
三、代码实现与分析
1. 数据加载与预处理
df = pd.read_csv("london_merged.csv")
df['timestamp'] = pd.to_datetime(df['timestamp'])
df['date'] = df['timestamp'].dt.date
df['hour'] = df['timestamp'].dt.hour
df['month'] = df['timestamp'].dt.month
df['year'] = df['timestamp'].dt.year
这里我们把时间戳拆分成年、月、日、小时,方便后续分析。
2. 每日订单趋势
daily_orders = df.groupby('date')['cnt'].sum()
plt.plot(daily_orders.index, daily_orders.values)
结果显示:整体订单量随时间呈现周期性波动,有明显的季节规律。
3. 小时订单趋势
hourly_orders = df.groupby('hour')['cnt'].mean()
plt.plot(hourly_orders.index, hourly_orders.values, marker="o")
结论:
- 早高峰(7–9 点)、晚高峰(17–19 点)单车使用量最高。
- 夜间和凌晨订单量极低,符合人们的日常作息。
4. 工作日 vs 周末
weekend_orders = df.groupby('is_weekend')['cnt'].mean()
- 工作日:出行高峰更明显(上下班通勤需求)。
- 周末:全天订单量相对平稳,更偏向休闲娱乐。
5. 四季对比
season_orders = df.groupby('season')['cnt'].mean()
- 夏季订单量最高,冬季最低。
- 说明天气对共享单车使用有显著影响。
6. 天气因素分析
sns.scatterplot(x="t1", y="cnt", data=df, alpha=0.3)
- 温度:10–25℃ 区间订单量最高,极端高温/低温出行需求下降。
- 湿度:高湿度条件下骑行意愿下降。
- 风速:风速超过 30 km/h 后订单量显著减少。
四、总结
通过分析伦敦共享单车数据,我们得到以下结论:
- 出行高峰集中在上下班时段,需求与人们通勤密切相关。
- 夏季使用率最高,冬季最低,天气因素对骑行需求影响显著。
- 周末订单量整体平稳,更多是休闲出行。
这些规律对于共享单车投放、运维调度具有参考价值。未来可以进一步结合机器学习模型,对订单量进行预测,从而更科学地优化投放策略。
✍️ 写在最后
本文是一次完整的 Python 数据分析实践,从数据清洗到可视化,展示了如何利用简单的工具快速发现业务规律。如果你也对数据分析感兴趣,可以尝试用自己的城市数据做同样的探索,相信会有不一样的发现。
附录:源码
# 伦敦共享单车投放数据分析
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 中文
mpl.rcParams['axes.unicode_minus'] = False # 正常显示负号
# ========== 1. 数据加载 ==========
file_path = r"E:\廖莹\软件工程\london_merged.csv"
df = pd.read_csv(file_path)
print("数据前5行:")
print(df.head())
print("\n数据字段:", df.columns)
# ========== 2. 数据预处理 ==========
# 转换时间字段
df['timestamp'] = pd.to_datetime(df['timestamp'])
df['date'] = df['timestamp'].dt.date
df['hour'] = df['timestamp'].dt.hour
df['month'] = df['timestamp'].dt.month
df['year'] = df['timestamp'].dt.year
print("\n数据集时间范围:", df['date'].min(), "到", df['date'].max())
# ========== 3. 每日订单趋势 ==========
daily_orders = df.groupby('date')['cnt'].sum()
plt.figure(figsize=(12,6))
plt.plot(daily_orders.index, daily_orders.values, color="blue")
plt.title("伦敦共享单车每日订单量趋势")
plt.xlabel("日期")
plt.ylabel("订单量")
plt.grid(True)
plt.tight_layout()
plt.show()
# ========== 4. 小时订单趋势 ==========
hourly_orders = df.groupby('hour')['cnt'].mean()
plt.figure(figsize=(10,6))
plt.plot(hourly_orders.index, hourly_orders.values, marker="o", color="green")
plt.title("伦敦共享单车平均每小时订单量")
plt.xlabel("小时")
plt.ylabel("平均订单量")
plt.xticks(range(0,24))
plt.grid(True)
plt.tight_layout()
plt.show()
# ========== 5. 工作日 vs 周末 ==========
weekend_orders = df.groupby('is_weekend')['cnt'].mean()
weekend_orders.index = ["工作日","周末"]
plt.figure(figsize=(6,6))
weekend_orders.plot(kind="bar", color=["skyblue","orange"])
plt.title("工作日与周末平均订单量对比")
plt.ylabel("平均订单量")
plt.tight_layout()
plt.show()
# ========== 6. 季节对比 ==========
season_orders = df.groupby('season')['cnt'].mean()
season_orders.index = ["春","夏","秋","冬"]
plt.figure(figsize=(8,6))
season_orders.plot(kind="bar", color="purple")
plt.title("四季平均订单量对比")
plt.ylabel("平均订单量")
plt.tight_layout()
plt.show()
# ========== 7. 天气因素分析 ==========
plt.figure(figsize=(10,6))
sns.scatterplot(x="t1", y="cnt", data=df, alpha=0.3)
plt.title("温度与订单量关系")
plt.xlabel("温度 (°C)")
plt.ylabel("订单量")
plt.show()
plt.figure(figsize=(10,6))
sns.scatterplot(x="hum", y="cnt", data=df, alpha=0.3, color="orange")
plt.title("湿度与订单量关系")
plt.xlabel("湿度")
plt.ylabel("订单量")
plt.show()
plt.figure(figsize=(10,6))
sns.scatterplot(x="wind_speed", y="cnt", data=df, alpha=0.3, color="red")
plt.title("风速与订单量关系")
plt.xlabel("风速")
plt.ylabel("订单量")
plt.show()