图片来源。维基百科许可证:CC-BY-SA 3.0
如果你像我一样,经常通过公共交通上下班,你可能对以下情况很熟悉。
你到达公交车站,准备赶上你的公交车:一条标榜每10分钟到达的线路。你看了看表,记下了时间......当公交车终于在11分钟后到来时,你想知道为什么你似乎总是如此不走运。
天真地,你可能会想,如果公交车每10分钟来一次,你在一个随机的时间到达,你的平均等待时间会是5分钟左右。但在现实中,公交车并不完全按计划到达,因此你可能会等待更长时间。事实证明,在一些合理的假设下,你可以得到一个惊人的结论。
当等待一辆平均每10分钟到达的公交车时,你的平均等待时间将是10分钟。
这就是有时被称为等待时间悖论的东西。
我以前遇到过这个想法,一直想知道它是否真的存在......那些 "合理的假设 "与现实有多大关系?这篇文章将从模拟和概率论证的角度探讨等待时间悖论,然后看一下西雅图市的一些真实的公交车到达时间数据,(希望)能彻底解决这个悖论。
检查悖论
如果公交车正好每10分钟到达一次,那么你的平均等待时间确实是这个时间间隔的一半。5分钟。从质量上讲,我们很容易说服自己,在这些到达时间上增加一些变化,会使平均等待时间有所延长,正如我们在这里看到的。
等待时间悖论原来是一个更普遍的现象--检查悖论的一个特殊实例,艾伦-多尼(Allen Downey)在这篇有启发性的文章中详细讨论了这个现象:检查悖论无处不在。
简而言之,只要观察一个数量的概率与被观察的数量有关,就会出现检查悖论。艾伦举了一个例子:调查大学生的平均班级规模。尽管学校可能如实宣传每个班级平均有30名学生,但学生所经历的平均班级规模可能(而且一般会)大得多。原因是大班的学生(当然)更多,所以在计算学生的平均经验时,你对大班进行了过度采样。
就一条名义上10分钟的公交线路而言,有时到达的时间间隔会比10分钟长,有时会更短,如果你在一个随机的时间到达,你有更多的机会遇到更长的间隔,而不是遇到更短的间隔。因此,乘客经历的平均时间跨度会比公交车之间的平均时间跨度长是有道理的,因为较长的跨度被过度取样。
但是等待时间悖论提出了一个比这更强烈的主张:当到达的平均间隔为N分钟。这可能是真的吗?
模拟等待时间
为了说服自己,等待时间悖论提出了一个合理的主张,让我们先模拟一个平均10分钟到达的巴士流。为了数字的准确性,我们将模拟大量的公交车到达:一百万辆公交车(或大约19年的全天候10分钟的间隔)。
在[1]中。
import
为了确认我们的做法是正确的,让我们检查一下平均间隔是否接近 。
在[2]中。
intervals
输出[2]。
9.9999879601518398
有了这些公交车到达的模拟,我们现在可以模拟大量的乘客在这个时间段内到达公交车站,并计算出他们每个人的等待时间。让我们把它封装在一个函数中,以便以后使用。
在[3]中。
def
然后我们可以模拟一些等待时间并计算出平均数。
In [4]:
wait_times
输出[4]。
10.001584206227317
平均等待时间也接近10分钟,就像等待时间悖论所预测的那样。
深入挖掘。概率和泊松过程
我们怎样才能理解这里发生的事情呢?
从根本上说,这是检验悖论的一个实例,即观察到一个数值的概率与该数值本身有关。让我们用来表示公共汽车到达一个公共汽车站时之间的间隔分布。在这个符号中,到达时间的期望值是E\[T\]=\\int\_0^\\infty T~p(T)~dT 在上述模拟中,我们选择了E\[T\]=\\tau=10分钟。
当乘客在随机时间到达公交车站时,他们所经历的时间间隔的概率将受到的影响,但也受到本身的影响:时间间隔越长,乘客所经历的概率就越大。
因此,我们可以写出乘客经历的到达时间的分布: 比例常数来自于分布的归一化。 p_{exp}(T) = frac{Tp(T)}{int_0^infty Tp(T)~dT} 与上面相比,我们看到这简化为 p\_{exp}(T) = frac{T~p(T)}{E\[T\]} E[W] 将是乘客经历的预期区间的一半。所以我们可以写成 $$ E\[W\] = \\frac{1}{2}E\_{exp}\[T\] = \\frac{1}{2}\\int\_0^infty T~p\_{exp}(T)~dT $$ 可以用一种更有暗示性的方式重写。$$ E\[W\]= frac{E\[T^2\]}{2E\[T\]} $$ 现在剩下的就是让我们选择p(T)$的形式并计算积分。
选择p(T)?
有了这个形式主义,什么是用于的合理分布?我们可以通过绘制到达间隔的直方图来了解在我们模拟到达中的分布。
在[5]中。
%
这里的垂直虚线显示了大约10分钟的平均时间间隔。这看起来非常像指数分布,这不是偶然的:我们模拟的公交车到达时间是均匀的随机数,非常接近泊松过程,对于这样一个过程,可以证明到达间隔的分布是指数的。
(题外话:在我们的例子中,这只是近似指数;实际上,在的时间范围内,N遵循Beta分布:T/(Ntau) \\sim \\mathrm{Beta}\[1, N\],在的大极限中接近T \\sim \\mathrm{Exp}\[1/tau\]。更多细节请参见StackExchange的帖子,或者twitter的帖子)。
间隔的指数分布意味着到达时间遵循泊松过程。为了仔细检查这个推理,我们可以确认它与泊松过程的另一个属性相匹配:在一个固定的时间跨度内到达的数量将是泊松分布的。让我们通过把模拟的到达人数分成每小时的区块来检查这一点。
在[6]中。
from
经验值和理论值之间的密切匹配使人相信我们的解释是正确的:对于大的,我们上面模拟的到达时间是由泊松过程很好地描述的,这意味着到达间隔是指数分布的。
这意味着我们可以写出这个概率分布。 将此插入上述结果中。我们发现一个人经历的平均等待时间是 E\[W\] =\\frac{int\_0^infty T^2~e^{-T/tau}{2\\int\_0^infty T~e^{-T/tau} = \\frac{2\\tau^3}{2(\\tau^2)} = tau 对于符合泊松过程的公交车到达。乘客的预期等待时间与到达的平均时间间隔相同。
一个补充的推理方式是这样的:泊松过程是一个无记忆的过程,意味着事件的历史对下一个事件的预期时间没有影响。因此,当你到达公共汽车站时,直到下一辆公共汽车的平均等待时间总是相同的:在我们的例子中,它是10分钟,而这与上一辆公共汽车过去多久了无关。按照同样的思路,你已经等了多长时间并不重要:到下一趟车的预期时间总是正好10分钟:对于泊松过程来说,你不会因为等待的时间而得到 "积分"。
现实中的等待时间
如果现实世界中的公交车到站情况实际上是由泊松过程描述的,那么上述情况是好的,但它们是吗?
图片来源:https://seattletransitmap.com/
为了确定等待时间悖论是否描述了现实,我们可以挖掘一些数据,这里可以下载:arrival_times.csv(3MB的CSV文件)。该数据集包含了西雅图快速公交C、D、E线在西雅图市中心3号和派克公交站的预定和实际到达时间,记录于2016年第二季度(非常感谢华盛顿州交通中心的Mark Hallenbeck提供的这些数据!)。
在[7]。
import
Out[7]:
OPD_DATE | 车牌号 | RTE | 目的地 | TRIP_ID | 停靠点 | 停机名称 | 暂停 | ACT_STOP_TM | |
---|---|---|---|---|---|---|---|---|---|
0 | 2016-03-26 | 6201 | 673 | S | 30908177 | 431 | 第三大道和派克街 (431) | 01:11:57 | 01:13:19 |
1 | 2016-03-26 | 6201 | 673 | S | 30908033 | 431 | 第三大道和派克街(431) | 23:19:57 | 23:16:13 |
2 | 2016-03-26 | 6201 | 673 | S | 30908028 | 431 | 第三大道和派克街(431) | 21:19:57 | 21:18:46 |
3 | 2016-03-26 | 6201 | 673 | S | 30908019 | 431 | 第三大道和派克街(431) | 19:04:57 | 19:01:49 |
4 | 2016-03-26 | 6201 | 673 | S | 30908252 | 431 | 第三大道和派克街(431) | 16:42:57 | 16:42:39 |
我之所以特别寻找快速乘车路线的数据,是因为在一天的大部分时间里,公交车都是以10到15分钟的固定间隔安排的--更不用说我是C线的常客。
数据清理
首先,让我们做一下数据清理,把它变成一种更容易操作的形式。
In [8]:
# combine date and time into a single timestamp
Out[8]:
路线 | 方向 | 预定 | 实际 | 分钟_迟到 | |
---|---|---|---|---|---|
0 | C | 南行 | 2016-03-26 01:11:57 | 2016-03-26 01:13:19 | 1.366667 |
1 | C | 南行 | 2016-03-26 23:19:57 | 2016-03-26 23:16:13 | -3.733333 |
2 | C | 南行 | 2016-03-26 21:19:57 | 2016-03-26 21:18:46 | -1.183333 |
3 | C | 南行 | 2016-03-26 19:04:57 | 2016-03-26 19:01:49 | -3.133333 |
4 | C | 南行 | 2016-03-26 16:42:57 | 2016-03-26 16:42:39 | -0.300000 |
公交车有多晚?¶
这个表格中基本上有六个不同的数据集:C、D和E线的北行和南行方向。为了了解它们的特点,让我们为这六条线路的实际到达时间减去预定到达时间绘制柱状图。
在[9]中。
import
你可能会想到,公交车在每个单程的起点附近会更贴近时间表,而在终点附近会表现出更大的分散性,这在数据中得到了证实:南行的C线和北行的D、E线在各自线路的起点附近,而在相反的方向则在终点附近。
预定的和观察到的到达时间间隔¶。
接下来,让我们看看这六条线路的观察和预定到达间隔。我们将首先使用Pandas的groupby
功能来计算这些间隔。
在[10]中。
def
在[11]中。
g
已经很明显,这些看起来不太像我们模型的指数分布,但这还不能说明什么:分布可能受到非恒定的预定到达间隔的影响。
让我们重复上面的图表,检查预定的而不是观察到的到达时间间隔。
在[12]中。
g
这表明公交车在整个一周内都有不同的到达间隔,所以我们不能从原始到达时间的分布中评估等待时间悖论的准确性。
构建统一的时间表
尽管预定的到达间隔并不均匀,但有几个特定的间隔有大量的到达:例如,有近2000辆北行E线巴士的预定间隔为10分钟。为了探索等待时间悖论是否适用,让我们按线路、方向和预定间隔对数据进行分组,然后将这些类似的到达次数重新堆积在一起,就像它们依次发生一样。这应该能保持原始数据的所有相关特征,同时更容易与等待时间悖论的预测直接比较。
在[13]。
def
出[13]。
路线 | 方向 | 预定 | 实际 | 分钟_晚点 | 实际时间间隔 | 预定的时间间隔 | |
---|---|---|---|---|---|---|---|
0 | C | 北行 | 10.0 | 12.400000 | 2.400000 | NaN | 10.0 |
1 | C | 北行 | 20.0 | 27.150000 | 7.150000 | 0.183333 | 10.0 |
2 | C | 北行 | 30.0 | 26.966667 | -3.033333 | 14.566667 | 10.0 |
3 | C | 北行 | 40.0 | 35.516667 | -4.483333 | 8.366667 | 10.0 |
4 | C | 北行 | 50.0 | 53.583333 | 3.583333 | 18.066667 | 10.0 |
使用这些经过清理的数据,我们可以绘制出每条路线、方向和到达频率的 "实际 "到达间隔的分布。
在[14]中。
for
我们看到,对于每条线路和时间表,观察到的到达间隔的分布几乎是高斯的,在预定的到达间隔附近达到峰值,并且有一个标准差,在靠近线路的起点(C的南行,D/E的北行)较小,在靠近终点时较大。即使没有统计学测试,用眼睛看也很清楚,实际到达时间间隔绝对不是指数分布,而这正是等待时间悖论所依赖的基本假设。
我们可以利用上面使用的等待时间模拟函数,以便找到每条公交线路、方向和时间表的平均等待时间。
In[15]:
grouped
Out[15]:
route direction scheduled_interval
C northbound 10.0 7.8 +/- 12.5
12.0 7.4 +/- 5.7
15.0 8.8 +/- 6.4
southbound 10.0 6.2 +/- 6.3
12.0 6.8 +/- 5.2
15.0 8.4 +/- 7.3
D northbound 10.0 6.1 +/- 7.1
12.0 6.5 +/- 4.6
15.0 7.9 +/- 5.3
southbound 10.0 6.7 +/- 5.3
12.0 7.5 +/- 5.9
15.0 8.8 +/- 6.5
E northbound 10.0 5.5 +/- 3.7
12.0 6.5 +/- 4.3
15.0 7.9 +/- 4.9
southbound 10.0 6.8 +/- 5.6
12.0 7.3 +/- 5.2
15.0 8.7 +/- 6.0
Name: actual, dtype: object
平均等待时间也许比预定间隔的一半多一两分钟,但并不像等待时间悖论所暗示的那样与预定间隔相等。换句话说,检查悖论得到了证实,但等待时间悖论似乎与现实不符。
最后的思考¶。
等待时间悖论一直是一个有趣的讨论发起点,它涵盖了模拟、概率以及统计假设与现实的比较。尽管我们确认现实世界中的公交线路确实遵循某种版本的检查悖论,但上述分析相当明确地表明,等待时间悖论背后的核心假设--公交车的到达遵循泊松过程的统计,是没有根据的。
现在回想起来,这也许并不令人惊讶:泊松过程是一个无记忆的过程,它假定一个到达的概率完全独立于自上一次到达后的时间。在现实中,一个运行良好的公共汽车系统会刻意安排时间表,以避免这种行为:公共汽车不会在一天中的随机时间开始行驶,而是根据选择的时间表开始行驶,以最好地服务于乘坐公共汽车的公众。
这里更大的教训是,你应该对你带到任何数据分析任务中的假设保持谨慎。泊松过程是对到达时间数据的一个很好的描述--有时。但是,仅仅因为一种类型的数据听起来像另一种类型的数据,这并不意味着对一种数据有效的假设也一定对另一种数据有效。通常情况下,表面上看起来正确的假设会导致与现实不符的结论。