You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中可视化骑手起点-终点轨迹及骑行距离的最优方法咨询

骑手骑行差异分析与路线可视化解决方案

问题背景

项目目标

确定临时骑手(casual riders)与会员骑手(membership riders)的骑行距离差异,并制作支撑数据结论的可视化图表。

已完成工作

  • 完成数据清洗与导入
  • 使用mapview和ggplot2绘制起点、终点散点图
  • 完成K-means聚类分析,相关代码如下:
mapview(testmap, map.types = "Stamen.Toner", zcol = "member_casual")
ggplot(A202004.divvy.tripdata, aes(end_lat, end_lng, col=member_casual)) + geom_point() + ggtitle("end clustering")

set.seed(55)
cluster.A202004.divvy.tripdata <- kmeans(A202004.divvy.tripdata[,11:12], 3, nstart = 20)
cluster.A202004.divvy.tripdata
table(cluster.A202004.divvy.tripdata$cluster, A202004.divvy.tripdata$member_casual)
ggplot(A202004.divvy.tripdata, aes(end_lat, end_lng, color=member_casual, shape=cluster.A202004.divvy.tripdata$cluster)) + geom_point() + ggtitle("A202004 Cluster Plot")

当前需求

  1. 绘制起点(start_lng/start_lat)到终点(end_lng/end_lat)的连线,并支持按骑行长度等参数调整线条颜色
  2. 明确两类骑手的骑行距离差异、路线特征,寻求技术方向建议

解决方案

一、绘制按骑行距离着色的起点-终点连线

推荐使用ggplot2(快速实现)或sf(专业空间可视化)结合geosphere计算准确的骑行距离。

1. 准备工作:计算骑行距离

# 安装并加载必要包
install.packages(c("ggplot2", "geosphere", "dplyr"))
library(ggplot2)
library(geosphere)
library(dplyr)

# 计算每段行程的球面距离(转换为公里)
A202004.divvy.tripdata <- A202004.divvy.tripdata %>%
  mutate(
    ride_distance = distHaversine(
      cbind(start_lng, start_lat),
      cbind(end_lng, end_lat)
    ) / 1000
  )

2. 使用ggplot2绘制连线(含骑手类型对比)

ggplot(A202004.divvy.tripdata) +
  # 绘制骑行路线连线,颜色映射到距离
  geom_segment(
    aes(
      x = start_lng, y = start_lat,
      xend = end_lng, yend = end_lat,
      color = ride_distance
    ),
    alpha = 0.5  # 降低透明度避免线条重叠
  ) +
  # 叠加起点/终点散点
  geom_point(aes(start_lng, start_lat), shape = 1, size = 0.8, color = "black") +
  geom_point(aes(end_lng, end_lat), shape = 16, size = 0.8, color = "darkred") +
  # 按骑手类型拆分面板,直观对比
  facet_wrap(~member_casual) +
  # 设置颜色渐变(更易区分距离)
  scale_color_viridis_c(option = "plasma", name = "骑行距离(km)") +
  labs(
    title = "临时骑手vs会员骑手骑行路线",
    x = "经度", y = "纬度"
  ) +
  theme_bw()

3. 专业空间可视化(sf包)

如果处理大样本数据或需要更规范的空间输出,使用sf包:

install.packages("sf")
library(sf)

# 将行程转换为LINESTRING类型的sf对象
trip_lines <- A202004.divvy.tripdata %>%
  rowwise() %>%
  mutate(
    geometry = st_sfc(st_linestring(matrix(c(start_lng, start_lat, end_lng, end_lat), ncol=2, byrow=TRUE)))
  ) %>%
  st_as_sf(crs = 4326)

# 绘制空间路线图
ggplot(trip_lines) +
  geom_sf(aes(color = ride_distance), alpha = 0.4) +
  facet_wrap(~member_casual) +
  scale_color_viridis_c(name = "骑行距离(km)") +
  labs(title = "骑手骑行路线空间分布") +
  theme_minimal()

二、骑手距离差异与路线特征分析技术方向

1. 距离差异量化分析

(1)描述性统计

快速对比两类骑手的距离分布:

distance_summary <- A202004.divvy.tripdata %>%
  group_by(member_casual) %>%
  summarise(
    样本量 = n(),
    平均距离(km) = round(mean(ride_distance, na.rm=TRUE), 2),
    中位数距离(km) = round(median(ride_distance, na.rm=TRUE), 2),
    距离标准差 = round(sd(ride_distance, na.rm=TRUE), 2),
    最大距离(km) = round(max(ride_distance, na.rm=TRUE), 2)
  )

print(distance_summary)
(2)统计检验

验证两类骑手的距离是否存在显著差异(推荐非参数检验,避免正态分布假设):

# 威尔科克森秩和检验
wilcox_test_result <- wilcox.test(ride_distance ~ member_casual, data = A202004.divvy.tripdata)
print(wilcox_test_result)

2. 路线特征分析

(1)基于多特征的聚类

结合起点/终点坐标、距离、时长等特征,用DBSCAN识别高频骑行模式(比K-means更适合空间数据):

install.packages("dbscan")
library(dbscan)

# 提取聚类特征
cluster_features <- A202004.divvy.tripdata %>%
  select(start_lng, start_lat, end_lng, end_lat, ride_distance) %>%
  na.omit()

# DBSCAN聚类(eps根据数据范围调整,这里是经纬度的距离阈值)
dbscan_clusters <- dbscan(cluster_features, eps = 0.01, minPts = 5)
A202004.divvy.tripdata$cluster <- dbscan_clusters$cluster

# 可视化聚类后的路线
ggplot(A202004.divvy.tripdata) +
  geom_segment(
    aes(
      x = start_lng, y = start_lat,
      xend = end_lng, yend = end_lat,
      color = factor(cluster)
    ),
    alpha = 0.3
  ) +
  facet_wrap(~member_casual) +
  theme_bw()
(2)热点区域对比

识别两类骑手的高频起点/终点区域,用核密度图展示差异:

install.packages("spatstat")
library(spatstat)

# 拆分骑手数据
casual_data <- subset(A202004.divvy.tripdata, member_casual == "casual")
member_data <- subset(A202004.divvy.tripdata, member_casual == "member")

# 绘制起点热点对比
par(mfrow = c(1,2))
# 临时骑手起点热点
casual_start_ppp <- ppp(
  x = casual_data$start_lng, y = casual_data$start_lat,
  window = owin(xrange = range(casual_data$start_lng), yrange = range(casual_data$start_lat))
)
plot(density(casual_start_ppp), main = "临时骑手起点热点")

# 会员骑手起点热点
member_start_ppp <- ppp(
  x = member_data$start_lng, y = member_data$start_lat,
  window = owin(xrange = range(member_data$start_lng), yrange = range(member_data$start_lat))
)
plot(density(member_start_ppp), main = "会员骑手起点热点")

内容的提问来源于stack exchange,提问作者Kyle Kulinski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:37:08