伦敦共享单车投放数据分析实践

98 阅读4分钟

一、前言

近年来,共享单车在全球范围内普及,为城市出行提供了便捷选择。本文基于伦敦的共享单车数据集(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 后订单量显著减少。

四、总结

通过分析伦敦共享单车数据,我们得到以下结论:

  1. 出行高峰集中在上下班时段,需求与人们通勤密切相关。
  2. 夏季使用率最高,冬季最低,天气因素对骑行需求影响显著。
  3. 周末订单量整体平稳,更多是休闲出行。

这些规律对于共享单车投放、运维调度具有参考价值。未来可以进一步结合机器学习模型,对订单量进行预测,从而更科学地优化投放策略。


✍️ 写在最后
本文是一次完整的 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()

image.png

image.png

image.png

image.png

image.png

image.png

image.png