Reliability — Weibull life data with suspensions
Weibull life data analysis on a small population with censoring — seven failures and five units still running. Typed FlowScript for reliability engineering. Keywords: FMEA, failure mode, RPN, reliability.
Make it your own.
// Weibull life data analysis on a small population with censoring —
// seven failures and five units still running.
//
// Twelve spherical roller bearings on the dryer section of a paper
// machine. The five suspensions are the reason this is a life data
// analysis and not an average: throwing them away would drag the mean life
// down by a third, and treating them as failures would be worse.
//
// Beta is 2.4, comfortably above 1, so these bearings wear out rather than
// fail randomly — which is what licenses a planned replacement interval at
// all. B10 is the number the maintenance plan is built on: the age by
// which one bearing in ten has failed.
weibull_fit dryer_bearings {
title: "Dryer section 3 — bearing life"
population: "12 x SKF 23132 CCK/W33 spherical roller bearings, felt roll positions"
duty: "Continuous, 8400 operating hours per year, 96 C bearing housing temperature"
method: "Maximum likelihood with right-censored suspensions; rank regression cross-check agrees to 4%"
units: 12
failures: 7
suspensions: 5
failure_mode: "Grease carbonisation followed by raceway spalling; no evidence of misalignment"
beta: 2.4 [1.5, 3.8] @ 95%
eta: 38500 h [31200, 47500] @ 95%
// Gamma(1 + 1/beta) is a tabulated function of beta alone, so it is an
// input to the mean life rather than something these data produce.
gamma_factor: 0.88673 source "Gamma(1 + 1/2.4), tabulated"
b5: = eta * (0 - ln(0.95)) ^ (1 / beta)
b10: = eta * (0 - ln(0.90)) ^ (1 / beta)
b50: = eta * ln(2) ^ (1 / beta)
mean_life: = eta * gamma_factor
// Reliability and hazard at the current planned interval.
planned_interval: 20000 h
reliability_at_interval: = exp(0 - (planned_interval / eta) ^ beta)
hazard_at_interval: = (beta / eta) * (planned_interval / eta) ^ (beta - 1)
// Twelve positions, all assumed new at the start of the year — which is
// the assumption behind every "expected failures" figure and the one
// that is almost never stated. Bearings already halfway to eta fail at
// several times this rate, because beta is 2.4 and hazard rises with age.
failures_in_first_year: = 12 * (1 - exp(0 - (8400[h] / eta) ^ beta))
}
// The same twelve units as a life table, so the empirical curve can be
// read against the fit rather than taken on trust. Suspensions enter at
// 45000 and 52000 hours and remove units from the risk set without
// stepping the curve down.
survival dryer_bearing_life {
title: "Kaplan-Meier estimate — dryer bearing life"
time_unit: "operating hours"
group: "Felt roll bearings"
times: [0, 12400, 18100, 22700, 26500, 31200, 35800, 42100, 45000, 52000]
at_risk: [12, 12, 11, 10, 9, 8, 7, 6, 5, 2]
events: [0, 1, 1, 1, 1, 1, 1, 1, 0, 0]
censored: [0, 0, 0, 0, 0, 0, 0, 0, 3, 2]
survival: [1, 0.9167, 0.8333, 0.75, 0.6667, 0.5833, 0.5, 0.4167, 0.4167, 0.4167]
estimator: "kaplan_meier"
risk_table: true
censor_marks: true
}
maintenance_policy bearing_replacement {
of: dryer_bearings
current: "Run to failure, replace at the next unplanned stop"
proposed: "Planned replacement at 11000 operating hours, aligned with the annual shutdown"
proposed_interval: 11000 h
reliability_at_proposed: = exp(0 - (proposed_interval / dryer_bearings.eta) ^ dryer_bearings.beta)
// A planned change costs a shutdown slot; an unplanned one costs the
// machine. The ratio is what decides the interval.
planned_cost: 4200
unplanned_cost: 68000
currency: "GBP"
cost_ratio: = unplanned_cost / planned_cost
unplanned_first_year: = dryer_bearings.failures_in_first_year
expected_first_year_cost: = unplanned_first_year * unplanned_cost
}
cite oconnor {
key: "oconnor2012"
title: "Practical Reliability Engineering, 5th edition"
authors: "Patrick D. T. O'Connor and Andre Kleyner"
publisher: "Wiley"
year: 2012
type: "book"
of: dryer_bearings
}
note small_sample {
text: "Seven failures is a small dataset and the interval on beta (1.5 to 3.8) says so. The lower bound still exceeds 1, which is the only conclusion the replacement policy actually needs: these bearings wear out, so replacing them on age is worth doing."
anchor: dryer_bearings
}
view life: km(dryer_bearing_life)
caption life_caption {
of: life
title: "Bearing survival with censoring"
text: "Kaplan-Meier estimate of dryer bearing survival against operating hours. Ticks mark the five units still running at the end of the observation window; the risk table beneath the axis gives the population behind each step."
statistics: "Steps are the product-limit estimator; censored units leave the risk set without stepping the curve."
n_statement: "n = 12 bearings, 7 failures, 5 suspensions."
style: journal
}