在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")
当前需求
- 绘制起点(
start_lng/start_lat)到终点(end_lng/end_lat)的连线,并支持按骑行长度等参数调整线条颜色 - 明确两类骑手的骑行距离差异、路线特征,寻求技术方向建议
解决方案
一、绘制按骑行距离着色的起点-终点连线
推荐使用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
相关产品推荐
相关产品推荐

