Learning Curve Modeling Approaches
Learning curves are mathematical models predicting improvements in productivity and efficiency as experience with a task increases. These curves are essential tools for:
- Estimating project costs and timelines.
- Analyzing historical data for efficiency trends.
- Forecasting and decision-making.
The following documentation covers three popular methods implemented using Julia with multiple dispatch:
Learning Curve Methods
abstract type LearningCurveMethod end
struct WrightMethod <: LearningCurveMethod end
struct CrawfordMethod <: LearningCurveMethod end
struct ExperienceMethod <: LearningCurveMethod end
Wright's Curve
MCHammer.WrightMethod
— TypeWright learning curve method.
struct WrightMethod <: LearningCurveMethod end
Introduced by T.P. Wright in 1936 in his seminal work on airplane production cost analysis (Wright, 1936). This model observes that with each doubling of cumulative production, the unit cost decreases by a fixed percentage. It is well‐suited for processes where learning is continuous and gradual.
$\text{Cost} = \text{InitialEffort} \times \text{TotalUnits}^{\frac{\log(\text{Learning})}{\log(2)} + 1}$
When to Use:
- When historical data show a smooth, predictable decline in unit costs as production doubles.
When to Avoid:
- When cost reductions occur in discrete steps or when the production process experiences structural changes.
Crawford's Curve
MCHammer.CrawfordMethod
— TypeCrawford learning curve method.
struct CrawfordMethod <: LearningCurveMethod end
Derived from discrete cumulative cost analysis methods found in operations research, the Crawford learning curve (e.g., Crawford, 1982) aggregates individual unit costs—which decrease according to a power‐law function of the unit index—to yield a total cost. Unlike the smooth curves of Wright and Experience, the Crawford method sums unit‐by‐unit costs that are reduced based on their position in the production sequence.
$\text{Cost} = \sum_{i=1}^{\text{TotalUnits}} \text{InitialEffort} \times i^{\frac{\log(\text{Learning})}{\log(2)}}$
When to Use:
- When you have detailed unit cost data and need a granular, discrete analysis of learning effects.
When to Avoid:
- When the overall cost trend is continuous and best represented by a smooth curve, in which case Wright’s or the Experience model might be preferable.
Experience Curve
MCHammer.ExperienceMethod
— TypeExperience learning curve method.
struct ExperienceMethod <: LearningCurveMethod end
Popularized by Bruce Henderson of the Boston Consulting Group in the 1970s, the experience curve expands on Wright’s observation to encompass total cost reductions (including overhead and other factors) as cumulative production increases. It suggests that as cumulative output doubles, total costs fall by a constant percentage, reflecting economies of scale and learning effects throughout an organization.
$\text{Cost} = \text{InitialEffort} \times (\text{TotalUnits}^{\text{Learning}})$
When to Use:
For strategic analysis and competitive planning when broad organizational efficiency improvements are observed.
When to Avoid:
When cost behavior is highly non-linear or when improvements are due to sudden technological breakthroughs.
Cumulative Cost Analysis
To computes cumulative cost analytically for an experience curve, here are the functions to accomplish this.
Wright Learning Curve
result = lc_analytic(WrightMethod(), 200, 500, 0.85)
println(result)
23290.84865742685
Crawford Learning Curve
result = lc_analytic(CrawfordMethod(), 150, 400, 0.75)
8362.15872812196
Experience Curve
result = lc_analytic(ExperienceMethod(), 100, 1000, 0.8)
25118.86431509581
Curve Functions
Generates detailed DataFrame including cumulative, incremental, and average costs.
MCHammer.lc_curve
— FunctionGenerate a learning curve as a DataFrame for a given method.
lc_curve(method::LearningCurveMethod, InitialEffort, TotalUnits, Learning; LotSize=1)
The DataFrame columns are:
Units
: Production unit number.CurvePoint
: Cumulative cost/effort at that unit.IncrementalCost
: Difference in cumulative cost from the previous step.AvgCost
: Average cost per unit up to that point.Method
: A string identifier for the method.
df = lc_curve(WrightMethod(), 200, 500, 0.85; LotSize=25)
println(first(df, 5))
5×5 DataFrame
Row │ Units CurvePoint IncrementalCost AvgCost Method
│ Float64 Float64 Float64 Float64 String
─────┼────────────────────────────────────────────────────────
1 │ 1.0 200.0 200.0 200.0 Wright
2 │ 26.0 2422.37 2222.37 93.1682 Wright
3 │ 51.0 4057.27 1634.9 79.5544 Wright
4 │ 76.0 5506.28 1449.0 72.451 Wright
5 │ 101.0 6845.54 1339.26 67.7776 Wright
Analysis Functions
Fitting Functions
MCHammer.lc_fit
— Functionlc_fit(::ExperienceMethod, InitialEffort, Units; EstLC=0.8)
Fit the learning rate for the Experience method by adjusting the rate until its analytic cumulative cost converges to that computed using Wright's model.
lc_fit(::CrawfordMethod, InitialEffort, Units; EstLC=0.8)
Fit the learning rate for the Crawford method by adjusting the rate until its analytic cumulative cost converges to that computed using Wright's model.
lc_fit(::WrightMethod, InitialEffort, Units; EstLC=0.8)
Wright's method is taken as the baseline model so no fitting is performed. Returns the provided estimated learning rate.
Example:
lc_fit(::ExperienceMethod, InitialEffort, Units; EstLC=0.8)
lc_fit(::CrawfordMethod, InitialEffort, Units; EstLC=0.8)
lc_fit(::WrightMethod, InitialEffort, Units; EstLC=0.8)
best_fit = lc_fit(CrawfordMethod(), 150, 400; EstLC=0.75)
0.6901000000000066
Learning Rate Estimation
Estimates learning rates using Wright's method from two data points.
MCHammer.learn_rate
— FunctionEstimate the learning rate using Wright's method from two production data points.
learn_rate(::WrightMethod, TotalUnitsA, WorkUnitA, TotalUnitsB, WorkUnitB)
This method can be used as a starting point for the Crawford and Experience curves because no closed form solutions exist for these methods
rate = learn_rate(WrightMethod(), 1, 2000, 144, 8000)
println(rate)
0.6066527883150863
Comparison Utility
Compares learning curves across a range of learning rates.
MCHammer.learn_rates
— FunctionGenerate a comparison of cumulative costs for a range of learning rates (0 to 1) across the three methods: Wright, Crawford, and Experience.
learn_rates(InitialEffort, Units; LC_Step=0.1)
Returns a DataFrame with columns:
LC
: The learning rate.Wright
: Cumulative cost from Wright's model.Crawford
: Cumulative cost from Crawford's model.Experience
: Cumulative cost from the Experience model.
Example:
rates_df = learn_rates(100, 500; LC_Step=0.05)
println(first(rates_df, 5))
5×4 DataFrame
Row │ LC Wright Crawford Experience
│ Float64 Float64 Float64 Float64
─────┼─────────────────────────────────────────
1 │ 1.0 50000.0 50000.0 50000.0
2 │ 0.95 31567.8 34064.7 36645.6
3 │ 0.9 19441.0 22878.5 26858.0
4 │ 0.85 11645.4 15145.0 19684.5
5 │ 0.8 6762.32 9884.72 14427.0
Picking the right curve
Sometimes picking the righ curve is challenging and in these cases plotting a comparison of average costs across methods using Plots.jl
can be very helpful.
using Plots
LearnRate = 0.78
InitialEffort = 50
Units = 1000
CC = lc_curve(CrawfordMethod(), InitialEffort, Units, LearnRate; LotSize=25)
WC = lc_curve(WrightMethod(), InitialEffort, Units, LearnRate; LotSize=25)
EC = lc_curve(ExperienceMethod(), InitialEffort, Units, LearnRate; LotSize=25)
GraphResults = vcat(CC, WC, EC)
plot(GraphResults.Units, GraphResults.AvgCost, group=GraphResults.Method,
xlabel="Units", ylabel="Average Cost", title="Average Cost vs Units by Method",
lw=2, legend=:topright)
Sources & References
- Eric Torkia, Decision Superhero Vol. 2, chapter 6 : SuperPower: The Laws of Nature that Predict, Technics Publishing, 2025
- Available on Amazon : https://a.co/d/4YlJFzY . Volumes 2 and 3 to be released in Spring and Fall 2025.
- Wright, T.P. (1936). Factors Affecting the Cost of Airplanes. Journal of the Aeronautical Sciences, 3(4), 122–128.
- Henderson, B.D. (1973). Industrial Experience, Technology Transfer, and Cost Behavior. Harvard Business School Working Paper.
- Crawford, D. (1982). Learning Curves: Theory and Practice. Journal of Cost Analysis.
"""