Key takeaway

A percentile needs a method and a population. The label p90 alone is not a reproducible measurement.

Ask for the statistic’s recipe

A seller reports p90 turnaround time; a buyer recomputes it and gets a different answer. Before treating that as an extraction error, compare the calculation definitions. NIST describes several empirical percentile methods, and NumPy exposes both interpolated and discontinuous methods. Small samples can produce visibly different values under valid, different recipes.

Specify the eligible record set, measured duration, unit, reporting window, sorting rule, percentile fraction and interpolation method. Also record whether observations carry weights and how missing, cancelled or unfinished cases are handled. Those are population choices, not decimal-formatting choices. A correctly implemented formula on the wrong cases remains the wrong statistic for the decision.

Recompute a five-record fixture

This hypothetical fixture contains five completed durations in minutes: 10, 20, 30, 40 and 100. There are no missing observations, weights or tied values. For p90, NumPy’s default linear method uses the zero-based location 0.90 × (5 − 1) = 3.6. Interpolating 60% of the way from 40 to 100 gives 40 + 0.6 × 60 = 76 minutes.

The inverted empirical distribution selects the fifth observation for this fraction, giving 100 minutes. NIST’s described R6 rule uses 0.90 × (5 + 1) = 5.4 and caps at the maximum, also 100 here. Agreement between two methods in this fixture does not make them universally equivalent. Both 76 and 100 can be faithful outputs of their stated recipes; neither by itself establishes an acceptable service threshold.

MethodLocation or ruleToy p90Interpretation
Linear / R7Zero-based 3.6; interpolate 40 to 10076 minutesInterpolated finite-sample estimate
Inverted empirical distributionFirst observed value reaching fraction 0.90100 minutesObserved order statistic
R6 as described by NISTOne-based 5.4, cap at maximum100 minutesDifferent rule, same value here

Keep weights and aggregation visible

If each row represents a shipment, an unweighted percentile gives each shipment equal standing. If rows instead summarize unequal numbers of shipments, that calculation answers a different question. Ask what a weight represents and whether the chosen library method supports it. In the cited NumPy API, weighted quantiles are supported by inverted_cdf, not by every selectable interpolation method.

Do not average daily p90 values and label the result the monthly p90 of all records. Retain the underlying observations or a documented summary method that supports the intended reconstruction. A day with two cases and a day with thousands of cases cannot be combined correctly merely because their percentile labels match. Report the count and case-definition changes beside the result.

Supporting referencesQuantile methods, NumPy 2.5

Agree on a reproducible receiving value

Save the fixture, expected outputs, function/method version, rounding stage and exclusions with the export specification. Ask both parties to run the same fixture before interpreting a discrepancy in actual permitted records. If the numbers still differ, investigate parsing, units, duplicates and time boundaries in turn. Changing the method to force agreement hides rather than resolves the cause.

The acceptance note can say “p90=76 minutes under the stated linear method for this five-value fixture” and separately record the observed maximum 100. Do not call a percentile a confidence interval or infer population certainty from five examples. Use the inventory builder to retain the recipe and the readiness planner to assign a receiving test. A reproducible statistic does not establish a license value, buyer demand or authority to disclose its source records.

Tools for this decision

Data inventory builder →Readiness planner →