公交车总迟到?你大概掉进了等待时间悖论

2018-11-26 17:40:47 来源:网络整理 作者:管理员

原标题:公交车总迟到?你大概掉进了等待时间悖论

公交车总迟到?你大概掉进了等待时间悖论

大数据文摘出品

编译:李雷、小蒋、钱天培

如果你经常坐公交车,相信下面这一场景对你绝不陌生。

你到了车站,准备搭乘声称每10分钟一班的公交车。你盯着你的手表留意着时间,结果公交车终于在11分钟后到来。

这时你不由得感叹:为什么今天运气这么差!

想想也是。如果公交车每10分钟一班,而你到达的时间是随机的,那么你的平均等待时间难道不是5分钟嘛?

但实际上,等待公交车的时间似乎永远要比你预估的久。

究竟是你错了?还是公交运营系统出了问题?

事实证明,在一些合理的假设下,你可以得出一个惊人的结论:

在等待平均10分钟一班的公交车时,你的平均等待时间将为10分钟。

这就叫等待时间悖论。

等待时间悖论

如果公交车精确每10分钟来一辆,那么你的平均等待时间就是这个间隔的一半:5分钟。

可是,如果我们给这个10分钟加上一点随机成分呢?

这时,等待时间悖论就出现了。

等待时间悖是检验悖论的一种。那么,什么是检验悖论呢?

简言之,只要观察量的概率与观察量有关,就会出现检验悖论。比如说,我们做了一个调查大学生班级平均人数的调查。虽然学校确实保证每班平均有30名学生,但实际调查下来的平均班级规模通常会大得多。

原因是,较大的班级中就有更多的学生,因此在计算学生的平均体验时,你会对大班进行过度地抽样。极端得讲,如果有一个班一个学生也没有,那你压根不会抽样到这个班级的学生。

对于通常10分钟一班的公交线路,有时两班车的间隔会超过10分钟,有时则短点。如果你在随机时间到达,那你会有更多机会遇到更长的等待间隔,而不是较短的。

因此,乘客所经历的平均等待时间间隔将比公交车之间的平均到达时间间隔更长,因为较长的间隔是被过度采样了的。

但等待时间悖论提出了一个比这更震撼的主张。

当两班车的平均间隔是N分钟时,搭乘者所经历的平均等待时间也是N分钟,而非N/2分钟。

这是真的吗?

模拟等待时间

为了证明等待时间悖论的合理性,让我们首先模拟平均每10分钟到达一班的公交车流。

我们将模拟大量的公交车到达的情况:100万辆(或大约19年中全天不间断的10分钟来一辆车的间隔),以保证实验的准确性。

importnumpyasnpN =1000000# number of busestau =10# average minutes between arrivalsrand = np.random.RandomState(42) # universal random seedbus_arrival_times = N * tau * np.sort(rand.rand(N))

为了确认我们做的是对的,让我们检查一下平均间隔是否接近τ= 10:

intervals = np.diff(bus_arrival_times)intervals.mean()

输出:

9.9999879601518398

通过模拟这些公交车到达,我们现在可以模拟大量乘客在此期间到达公交车站,并计算他们每个人经历的等待时间。让我们将它封装在一个函数中供以后使用:

defsimulate_wait_times(arrival_times, rseed=8675309, # Jenny's random seed n_passengers=1000000): rand = np.random.RandomState(rseed) arrival_times = np.asarray(arrival_times) passenger_times = arrival_times.max() * rand.rand(n_passengers) # find the index of the next bus for each simulated passenger i = np.searchsorted(arrival_times, passenger_times, side='right') return arrival_times[i] - passenger_times

然后我们可以模拟一些等待时间并计算平均值:

wait_times = simulate_wait_times(bus_arrival_times)wait_times.mean()

输出:

10.001584206227317

平均等待时间接近10分钟。正如等待时间悖论预测的那样。

深入挖掘:概率和泊松过程

我们如何理解这一现象呢?

从本质上说,这是检验悖论的一个例子,其中观察值的概率与观察值本身有关。 让我们用p(T)表示公交车到达车站时间隔T的分布。 在这种表示法中,到达时间的期望值是:

公交车总迟到?你大概掉进了等待时间悖论

在上面的模拟中,我们选择了E [T] =τ= 10分钟。

当乘客随机到达公交车站时,他们所经历的时间间隔的概率将受到p(T)的影响,但也受到T本身的影响:间隔时间越长,乘客遇到这一间隔的概率就越大。

所以我们可以得出乘客所经历的到达时间分布:

公交车总迟到?你大概掉进了等待时间悖论

比例常数来自正态化分布:

公交车总迟到?你大概掉进了等待时间悖论

与上面相比,我们可以将它简化为

公交车总迟到?你大概掉进了等待时间悖论

预计等待时间E [W]将是乘客所经历的预期间隔的一半,所以我们可以写作

公交车总迟到?你大概掉进了等待时间悖论

或者可以写得更清楚一点:

公交车总迟到?你大概掉进了等待时间悖论

现在,让我们为p(T)选择一个表格并计算积分。

选择p(T)

如果我们这种公式推导可行,那用于p(T)的合理分布是什么?

我们可以通过绘制两班车间隔的直方图来获得模拟到达中的p(T)分布的图片:

%matplotlib inlineimportmatplotlib.pyplotaspltplt.style.use('seaborn')plt.hist(intervals, bins=np.arange(80), density=True)plt.axvline(intervals.mean(), color='black', linestyle='dotted')plt.xlabel('Interval between arrivals (minutes)')plt.ylabel('Probability density');

公交车总迟到?你大概掉进了等待时间悖论

这里的垂直虚线表示平均的间隔大约为10分钟。这看起来非常像指数分布,而且并非偶然:我们将公交车的到达时间模拟为均匀随机数,这非常接近于泊松过程,对于这样的过程,可以证明到达之间的间隔分布是呈指数分布的。

注:实际上,在区间Nτ内均匀采样N个点,点之间的间隔T遵循β分布:T /(Nτ)〜Bet [1,N],当N很大的时候这个极限趋于T~Exp [1 /τ]。

区间的指数分布意味着到达时间遵循泊松过程。

通过再次检查这个推断,我们可以确认它与泊松过程的另一个属性的相匹配:在固定时间范围内到达公交的数量将是泊松分布的。让我们将模拟到达的时间按小时分桶检查一下:

fromscipy.statsimportpoisson# count the number of arrivals in 1-hour binsbinsize =60binned_arrivals = np.bincount((bus_arrival_times // binsize).astype(int))x = np.arange(20)# plot the resultsplt.hist(binned_arrivals, bins=x -0.5, density=True, alpha=0.5, label='simulation')plt.plot(x, poisson(binsize / tau).pmf(x),'ok', label='Poisson prediction')plt.xlabel('Number of arrivals per hour')plt.ylabel('frequency')plt.legend();

公交车总迟到?你大概掉进了等待时间悖论

经验值和理论值紧密匹配,这让我们相信我们的解释是正确:对于大N,柏松过程可以很好地描述我们模拟的公交到达时间,其到达间隔是指数分布的。

这意味着概率分布如下:

公交车总迟到?你大概掉进了等待时间悖论

将此概率分布代入上面的公式,我们发现一个人的平均等待时间为

公交车总迟到?你大概掉进了等待时间悖论

乘客的预期等待时间与公交到达的平均间隔相同!

一种补充的推断方式是:泊松过程是一个无记忆过程,这意味着事件发生的历史情况与下一个事件的预期时间无关。所以当你到达公交站后,等到下一班公交的平均等待时间总是一样的:在我们的案例中,它是10分钟,这与上一班车走了多久无关!

同样的原理,你已经等待了多久并不重要:下一辆公交预计的到达时间总是10分钟:对泊松过程来说,你花费在等待的时间没用。

实际的等待时间

如果通过泊松过程确实描述了真实世界的公交到达时间,上述分析是正确的,但事实真的如此吗?

公交车总迟到?你大概掉进了等待时间悖论

为了确定等待时间悖论是否描述了现实情况,我们深入研究了一些可供下载的数据:arrival_times.csv(3MB的CSV文件)

https://gist.githubusercontent.com/jakevdp/82409002fcc5142a2add0168c274a869/raw/1bbabf78333306dbc45b9f33662500957b2b6dc3/arrival_times.csv

该数据集包含2016年第二季度记录的西雅图市中心3rd & Pike公交站的西雅图Rapid Ride C、D、E线的预定和实际到达时间。

importpandasaspddf = pd.read_csv('arrival_times.csv')df = df.dropna(axis=0, how='any')df.head()

公交车总迟到?你大概掉进了等待时间悖论

我特意选择Rapid Ride路线的数据是因为,在一天的大部分时间里,公交车的间隔很规律,通常在10到15分钟之间。

数据清洗

首先,让我们进行一下数据清洗,将其转换为更易于使用的表单:

# combine date and time into a single timestampdf['scheduled'] = pd.to_datetime(df['OPD_DATE'] +' '+ df['SCH_STOP_TM'])df['actual'] = pd.to_datetime(df['OPD_DATE'] +' '+ df['ACT_STOP_TM'])# if scheduled & actual span midnight, then the actual day needs to be adjustedminute = np.timedelta64(1,'m')hour =60* minutediff_hrs = (df['actual'] - df['scheduled']) / hourdf.loc[diff_hrs >20,'actual'] -=24* hourdf.loc[diff_hrs <-20,'actual'] +=24* hourdf['minutes_late'] = (df['actual'] - df['scheduled']) / minute# map internal route codes to external route lettersdf['route'] = df['RTE'].replace({673:'C',674:'D',675:'E'}).astype('category')df['direction'] = df['DIR'].replace({'N':'northbound','S':'southbound'}).astype('category')# extract useful columnsdf = df[['route','direction','scheduled','actual','minutes_late']].copy()df.head()

公交车总迟到?你大概掉进了等待时间悖论

公交车晚了多少?

该表中主要有六个不同的数据集:C、D和E线的北行和南行。为了了解它们的特性,让我们绘制这六条线路的实际与预定到达时间差的直方图:

importseabornassnsg = sns.FacetGrid(df, row="direction", col="route")g.map(plt.hist,"minutes_late", bins=np.arange(-10,20))g.set_titles('{col_name} {row_name}')g.set_axis_labels('minutes late','number of buses');

公交车总迟到?你大概掉进了等待时间悖论

你可能会认为公交车每次在行程开始时与其时间表更接近,并且在快结束时有更多的差异,这在数据中得到了证实:南行(southbound)C线和北行(northbound) D线、E线都在各自路线的起点接近时间表,而其反方向在终点时更接近。

预定和观察到的到达时间间隔

接下来让我们来看看这六条路线观察和预计的到达时间间隔。我们首先使用Pandas 的groupby功能分别计算这些间隔:

defcompute_headway(scheduled): minute = np.timedelta64(1,'m')returnscheduled.sort_values().diff() / minutegrouped = df.groupby(['route','direction'])df['actual_interval'] = grouped['actual'].transform(compute_headway)df['scheduled_interval'] = grouped['scheduled'].transform(compute_headway)g = sns.FacetGrid(df.dropna(), row="direction", col="route")g.map(plt.hist,"actual_interval", bins=np.arange(50) +0.5)g.set_titles('{col_name} {row_name}')g.set_axis_labels('actual interval (minutes)','number of buses');

公交车总迟到?你大概掉进了等待时间悖论

可以很清楚看出,这并不像我们模型的指数分布形式,此外,分布可能受到非恒定的预定到达间隔的影响。

让我们重复上面的图表,查看预定到达间隔的分布:

这表明公交车在整个星期都有不同的到达时间间隔,所以我们无法从原始到达时间数据的分布来评估等待时间悖论的准确性。

g = sns.FacetGrid(df.dropna(), row="direction", col="route")g.map(plt.hist,"scheduled_interval", bins=np.arange(20) -0.5)g.set_titles('{col_name} {row_name}')g.set_axis_labels('scheduled interval (minutes)','frequency');

公交车总迟到?你大概掉进了等待时间悖论

构建均匀分布的时间表

即使预定的到达间隔不均匀,也有一些特定的间隔有大量到达的数据:例如,有近2000个北行E线的预定间隔为10分钟。为了探索等待时间悖论是否适用,让我们按路线、方向和预定间隔对数据进行分组,然后将这些近似的到达时间重新堆叠在一起,就像它们按顺序发生的一样。这应该保持了原始数据所有的相关特征,同时更容易直接与等待时间悖论的预测比较。

defstack_sequence(data):# first, sort by scheduled time data = data.sort_values('scheduled')# re-stack data & recompute relevant quantities data['scheduled'] = data['scheduled_interval'].cumsum() data['actual'] = data['scheduled'] + data['minutes_late'] data['actual_interval'] = data['actual'].sort_values().diff()returndatasubset = df[df.scheduled_interval.isin([10,12,15])]grouped = subset.groupby(['route','direction','scheduled_interval'])sequenced = grouped.apply(stack_sequence).reset_index(drop=True)sequenced.head()

公交车总迟到?你大概掉进了等待时间悖论

使用这些清理过的数据,我们可以绘制不同路线、方向和到达频率的“实际”到达间隔的分布:

forroutein['C','D','E']: g = sns.FacetGrid(sequenced.query(f"route == '{route}'"), row="direction", col="scheduled_interval") g.map(plt.hist,"actual_interval", bins=np.arange(40) +0.5) g.set_titles('{row_name} ({col_name:.0f} min)') g.set_axis_labels('actual interval (min)','count') g.fig.set_size_inches(8,4) g.fig.suptitle(f'{route} line', y=1.05, fontsize=14)

公交车总迟到?你大概掉进了等待时间悖论

公交车总迟到?你大概掉进了等待时间悖论

我们看到,每条路线和时间表的观测到达间隔的分布接近高斯分布,在预定的到达间隔附近达到峰值,并且在路线开始附近具有较小的标准差(C的南行(southbound),D / E的北行(northbound)),以及在路线结束附近有更大的标准差。

即使不经过统计测试,我们也可以清楚地看到,实际的到达时间间隔肯定不是指数分布的,因而等待时间悖论所依赖的基本假设并不成立。

我们可以利用上面使用的等待时间模拟功能来找到每条公交路线、方向和时间表的平均等待时间:

grouped = sequenced.groupby(['route','direction','scheduled_interval'])sims = grouped['actual'].apply(simulate_wait_times)sims.apply(lambdatimes:"{0:.1f} +/- {1:.1f}".format(times.mean(), times.std()))

输出:

公交车总迟到?你大概掉进了等待时间悖论

平均等待时间可能比预定时间间隔的一半长上一两分钟,但不等于等待时间悖论所暗示的预定时间间隔。换句话说,检验悖论得到了证实,但等待时间悖论似乎与现实不符。

结论

等待时间悖论是个非常有趣的现象。它涵盖了模拟、概率以及统计假设与现实的比较。

虽然我们确认了,现实世界的公交线路确实遵循了一些版本的检验悖论,但上面的分析非常明确地显示,等待时间悖论背后的核心假设(公交车的到达时间遵循泊松过程)并不是很有根据。

回想起来,这也并不令人惊讶:泊松过程是一个无记忆过程,它假设到达的概率完全独立于自上次到达的时间。实际上,一个运行良好的公交系统将有一个有意安排的时间表,用以避免这种行为:公交车不会在一天中的随机时间开始他们的路线,而是按照选择能够最佳服务公众的时间表开始他们的路线。

这里更大的教训是,你应该谨慎对待任何数据分析工作的假设。泊松过程可以良好地描述到达时间的数据 – 但只是在某些特定情况下。

仅仅因为一种类型的数据看起来像另一种类型的数据,并不能推导出对一种数据有效的假设必然对另一种有效。

通常那些看似正确的假设可能会导致与现实不符的结论。

最后,你可以在这里下载本文全部代码

显示全文
为您推荐
章泽天撞脸陈都灵
章泽天撞脸陈都灵

近日,章泽天罕见现身戛纳,一组相片曝光后在网上引发热议。网友发现章泽天在这组相片中的侧脸与女星陈都灵极为相似,似乎“撞脸”了陈都灵。这组相片随即成为热门话题,网友纷纷表示章泽天这组相片的侧脸与陈都灵实.........

发布时间:2023-06-07 06:03:25

寐龙图片
寐龙图片

【导读】 寐龙图片,下面是小编为你收集整理的,希望对你有帮助!寐龙在中国,辽宁省是发现恐龙化石最多的地方,而且这里出土了世界上最丰富的古鸟类化石群,包括现代鸟的祖先中华龙鸟,还有今天要介绍的寐龙,它与现代鸟长的真的很像,一起去了解看看。寐龙基本资料体型:寐龙是一......

发布时间:2023-06-07 06:01:07

蔡徐坤香港曼谷演唱会官宣
蔡徐坤香港曼谷演唱会官宣

蔡徐坤KUN 2023「迷」WORLD TOUR巡回演唱会首站中国澳门场在开票第一时间便迎来了抢票狂潮,各档价位门票一经开票便瞬间售罄。这也再度印证了蔡徐坤的火爆人气和极强的票房号召力。在票务平台想看.........

发布时间:2023-06-07 05:03:17

宋仲基说做爸爸是人生最重要的事
宋仲基说做爸爸是人生最重要的事

宋仲基近来接受媒体访问,他坦言做爸爸是人生中最重要的事,家庭永远比工作重要,但他仍会尽力工作,也高兴共享:我超级高兴我要当爸了。宋仲基近期婚姻、工作两满意,更带着怀有宝宝的老婆一起到戛纳,聊到当爸爸,.........

发布时间:2023-06-07 04:03:37

雾和霾的区别:成分不同(雾里有水,霾里有烟尘和盐粒)
雾和霾的区别:成分不同(雾里有水,霾里有烟尘和盐粒)

【导读】 雾和霾的区别:成分不同(雾里有水,霾里有烟尘和盐粒),下面是小编为你收集整理的,希望对你有帮助!我们在有山有水的地方清晨起床时经常能看到雾气弥漫,城市里也有雾,只是大部分时间经常是雾霾的出现,不过有时候,是雾还是霾大部分人真的傻傻分不清。虽然它们乍一看是一样的,但是实际上却有很大的区别。我们一起......

发布时间:2023-06-07 04:01:17

徐怀钰状态回来了
徐怀钰状态回来了

知名歌手徐怀钰即将在下个月举办一场盛大的演唱会,为了能以最佳状况示人,她最近一直在进行运动练习。近日,一组她的照片曝光,引起了广泛的重视和赞赏。徐怀钰身穿黑色露腰背心和紧身裤,展现出了她令人羡慕的好身.........

发布时间:2023-06-07 03:04:22

苏州高铁站在什么地方
苏州高铁站在什么地方

【导读】 苏州高铁站在什么地方,下面是小编为你收集整理的,希望对你有帮助!苏州高铁站在哪里苏州市西北。苏州高铁站即苏州北站,相邻城区元和街道、澄阳路以西,距既有苏州站以北10.5公里,为了方便旅客的出行,苏州市相关部门也计划安排8条公交线路直通苏州高铁站,同时准备40辆出租......

发布时间:2023-06-07 03:01:07

R1SE献唱《熊出没·狂野大陆》插曲 挥洒青春正能量
R1SE献唱《熊出没·狂野大陆》插曲 挥洒青春正能量

定档大年初一的熊出没系列第七部大电影《熊出没·狂野大陆》奏响惊喜乐章!由R1SE男团成员何洛洛、焉栩嘉、翟潇闻、赵磊、赵让倾情献声的电影插曲《奇迹无限》MV今日惊喜上线,五位翩翩少年空降狂野大陆,朝气.........

发布时间:2023-06-07 02:06:10

日本是发达国家吗:亚洲四个发达国家中就有日本
日本是发达国家吗:亚洲四个发达国家中就有日本

【导读】 日本是发达国家吗:亚洲四个发达国家中就有日本,下面是小编为你收集整理的,希望对你有帮助!日本是发达国家,其无论是GDP还是人均GDP或者是产业结构,科技发展情况都是属于世界领先的,从诺贝尔得奖当中我们就可以知道日本这个国家的国力有多强盛,日本成为发达国家已经有几十年了,虽然近些年来我国的......

发布时间:2023-06-07 02:01:12

唐嫣礼服改了领口
唐嫣礼服改了领口

在昨夜的芭莎红毯上,唐嫣再次展示了她的共同魅力和用心打造的妆容。令人冷艳的是,她所穿的礼衣竟然是经过自己改进的,领口的细微变化让整体作用更加完美。这种特性的改动不仅展示了她的时尚眼光,也凸显了她关于细.........

发布时间:2023-06-07 01:05:35

1965年黄河巨龟哪去了 1965年黄河巨龟事件下落
1965年黄河巨龟哪去了 1965年黄河巨龟事件下落

【导读】 1965年黄河巨龟哪去了 1965年黄河巨龟事件下落,下面是小编为你收集整理的,希望对你有帮助!最近小编再看这个黄河的一些故事,那还真的挺有意思的,最近小编看的一件就是这个黄河巨龟的事件了,大家估计多多少少听说过,那么有的人最后也问了,这个1965年的黄河巨龟到底去到了什么地方呢?这个黄河巨龟的......

发布时间:2023-06-07 01:01:09

墨西哥诡异事件:宝莱特失踪事件(至今没有定论)
墨西哥诡异事件:宝莱特失踪事件(至今没有定论)

【导读】 墨西哥诡异事件:宝莱特失踪事件(至今没有定论),下面是小编为你收集整理的,希望对你有帮助!我们平时都会听到许多恐怖事件,有一些是人为的案件,有一些只是意外造成的事故而已,那么,今天我们就来看看墨西哥的一个诡异的案件,它到底是怎么回事?让我们一起去了解一下吧!墨西哥诡异事件在墨西哥发生了一件......

发布时间:2023-06-07 00:01:19