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.WrightMethodType

Wright 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.
source

Crawford's Curve

MCHammer.CrawfordMethodType

Crawford 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.
source

Experience Curve

MCHammer.ExperienceMethodType

Experience 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.

source

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_curveFunction

Generate 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.
source
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_fitFunction
lc_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.

source
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.

source
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.

source

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_rateFunction

Estimate 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

source
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_ratesFunction

Generate 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.
source

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.

"""