绘制用户出行次数ECDF图表遇异常,求正确实现方案
解决用户出行次数ECDF绘制问题
问题分析
你遇到两个问题:
- 图表显示1次出行的用户占比约70%,但你认为应为50%
- ECDF曲线未从0开始
先明确数据统计结果:你的数据集里共有3个唯一user_id(10、84、179):
user_id=10的trip_id有2个唯一值(101、102),对应2次出行user_id=84和user_id=179各有1个唯一trip_id,对应1次出行
因此1次出行的用户占比为2/3≈66.7%,图表显示的约70%是正确的,你的50%预期是对数据的误解。如果确实需要50%的占比,需检查user_id或trip_id的定义是否符合你的业务逻辑。
解决曲线未从0开始的问题
使用seaborn.ecdfplot时,默认不会包含x轴起始点(0),只需添加include_lowest=True参数,即可让曲线从(0,0)开始绘制。
修正后的完整代码
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt sns.set(style="whitegrid") # 数据集 df = pd.DataFrame( {'id': [54, 54, 54, 54, 54, 16, 16, 16, 50, 50, 28, 28, 28, 19, 19, 32, 32, 32, 81, 81, 81, 81, 81], 'user_id': [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 84, 84, 84, 84, 84, 179, 179, 179, 179, 179], 'trip_id': [101, 101, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 841, 841, 841, 841, 841, 1796, 1796, 1796, 1796, 1796], 'travel_mode': ['train', 'train', 'train', 'train', 'train', 'walk', 'walk', 'walk', 'train', 'train', 'train', 'train', 'train', 'taxi', 'taxi', 'bus', 'bus', 'bus', 'train', 'train', 'train', 'train', 'train']} ) # 计算每个用户的唯一出行次数 trips_per_user = df.groupby('user_id')['trip_id'].nunique() plot_data = trips_per_user.reset_index(name='num_trips') # 绘制修正后的ECDF plt.figure(figsize=(5, 4)) # 添加include_lowest=True参数让曲线从0开始 sns.ecdfplot(data=plot_data, x='num_trips', stat='proportion', complementary=False, include_lowest=True) plt.xlabel('Number of Trips') plt.ylabel('Cumulative Proportion') plt.show()
额外说明
如果你的业务逻辑中user_id=10的出行次数应该被统计为1次(比如认为同一用户的不同出行方式属于同一次出行),则需要调整统计逻辑,例如按user_id和travel_mode分组,或者重新定义trip_id的唯一性规则。
内容的提问来源于stack exchange,提问作者Amina Umar
相关产品推荐
相关产品推荐

