首页 > 解决方案 > 使用 python 预测 weibull 或 ecdf 的中年故障概率

问题描述

谢谢你看看这个。我有超过 5 年的轮胎故障数据。对于每个轮胎,我都有开始日期(day0)、结束日期(dayn)和每天行驶的里程数。我使用每辆车行驶的总里程来创建 2 个分布,一个 weibull,一个 ecdf。我希望能够使用这些分布来预测轮胎在轮胎使用寿命期间未来 50 英里失效的概率。举个例子,如果轮胎的使用寿命为 2 周,总里程目前为 100 英里,每周平均里程为 50 英里。我想预测它在一周内以 150 英里/小时失效的概率。

我的想法是,如果我可以得到所有轮胎在某一天活动的概率,我可以将每个轮胎故障的概率相加,以预测未来给定时间段内需要更换多少轮胎给定的一天。

我目前的方法是使用 scipy.weibull_min 和 statsmodel.ecdf 使用 3 年的故障数据来拟合分布。然后,如果轮胎当前为 100 英里,我们预计下周将增加 50 英里,我得到 150 的 cdf。

但是,目前,在我对预测日期的道路上的所有轮胎进行此操作并将它们各自的概率相加之后,我得到的预测比实际更换轮胎的数量高约 50%。我的第一个想法是这是我的方法的问题。这听起来有效还是我在做一些愚蠢的事情?

标签: pythonsurvival-analysisweibullecdf

解决方案


回复可能为时已晚,但也许它会帮助将来阅读本文的人。如果您要进行预测,则需要拟合参数模型(如 Weibull 分布)。ecdf(经验 CDF / 非参数模型)将告诉您参数模型的拟合程度,但它不允许您做出任何未来预测。

为了拟合参数模型,我建议您使用Python 可靠性库。这个库使得拟合参数模型变得相当简单(特别是如果你有正确的删失数据),然后使用拟合的模型来做出你想要做出的那种预测。Scipy 不会处理审查过的数据。

如果您有大量轮胎的故障数据,那么您将能够拟合模型。你问的问题(关于下周失败的可能性,因为它已经存活了 2 周)称为条件生存。本质上,您需要 CS(1|2),这意味着假设它已经存活到第 2 周,它会再存活 1 周的概率。您可以将其作为第 3 周和第 2 周的生存函数 (SF) 的比率找到:CS (1|2) = SF(2+1)/SF(2)。

让我们看一些使用 Python 可靠性库的代码。我假设我们有 10 个失败时间来适应我们的分布,从中我会找到 CS(1|2):

from reliability.Fitters import Fit_Weibull_2P

data = [113, 126, 91, 110, 146, 147, 72, 83, 57, 104] # failure times (in weeks) of some tires from our vehicle fleet
fit = Fit_Weibull_2P(failures=data, show_probability_plot=False)
CS_1_2 = fit.distribution.SF([3])[0] / fit.distribution.SF([2])[0]  # conditional survival
CF_1_2 = 1 - CS_1_2  # conditional failure
print('Probability of failure of any given tire failing in the next week give it has survived 2 weeks:', CF_1_2)

'''
Results from Fit_Weibull_2P (95% CI):
           Point Estimate  Standard Error   Lower CI    Upper CI
Parameter                                                       
Alpha          115.650803        9.168086  99.008075  135.091084
Beta             4.208001        1.059183   2.569346    6.891743
Log-Likelihood: -47.5428956288772 

Probability of failure in the next week given it has survived 2 weeks: 1.7337430857633507e-07
'''

现在假设您的车队中有 250 辆车,每辆车有 4 个轮胎(总共 1000 个轮胎)。1 个轮胎失效的概率是 CF_1_2 = 1.7337430857633507e-07 我们可以找到 X 个轮胎失效的概率(在 1000 个轮胎的车队中),如下所示:

X = [0, 1, 2, 3, 4, 5]
from scipy.stats import poisson
print('n failed     probability')
for x in X:
    PF = poisson.pmf(k=x, mu=CF_1_2 * 1000)
    print(x, '          ', PF)

'''
n failed     probability
0            0.9998266407198806
1            0.00017334425253100934
2            1.502671996412269e-08
3            8.684157279833254e-13
4            3.764024409898102e-17
5            1.305170259061071e-21
'''

这些数字是有意义的,因为我从特征寿命 (alpha) 为 100 周的 weibull 分布中生成了数据,因此我们预计第 3 周的失败概率应该非常低。

如果您还有其他问题,请随时直接给我发电子邮件。


推荐阅读