mathwaterfall

Calculating the Contribution to the Change of an Average Value - Waterfall Chart


I'm trying to create a waterfall chart that shows how different operational interruptions affect how much product we can make per batch.

The key metric is product per batch. We have the end of the month grand total of heats per batch. I'm able to separate that data into different categories which looks like this:

Production Category Batches Product Made Product Per Batch
Steady Production 40 351 8.8
Poor Material 5 30 6.0
Operation Error 3 10 3.3
Equipment Failure 2 10 5.0
Other 1 4 4.0
Total 51 405 7.9

We have our steady production which comes out at 8.8, how can I calculate each other category's contribution to decreasing the product per batch to 7.9? I'm trying to make a waterfall chart that looks like this:

Waterfall Chart Example

On reading how other people make waterfall charts with averages, I tried to do the math of:

Product per batch = PPB

PPB(category)*Batches(category)/Batches(Total) - PPB(category)*Batches(category)/Batches(SteadyProduction)

This gives a number relatively close but not exact because this total also includes the steady production data or something. It's not a type of waterfall math I'm used to.


Solution

  • I think the formula you can use for the negative contributions of categories is

    - Batches(category) * (PPB(SteadyProduction) - PPB(category))/Batches(Total)
    

    You can infer this formula considering the difference from the case when all production were of SteadyProduction.

    Here category doesn't include SteadyProduction and Sum is the sum by all categories (excluding SteadyProduction)

    PPB(SteadyProduction) * Batches(SteadyProduction) + Sum(PPB(category) * Batches(category)) = PPB(average) * Batches(Total)
    
    => PPB(SteadyProduction) * Batches(Total) - 
    PPB(SteadyProduction) * (Batches(Total) - Batches(SteadyProduction)) + Sum(PPB(category) * Batches(category)) = PPB(average) * Batches(Total)
    

    But Batches(Total) - Batches(SteadyProduction) == Sum(Batches(category))

    => PPB(SteadyProduction) * Batches(Total) - 
    PPB(SteadyProduction) * Sum(Batches(category)) + Sum(PPB(category) * Batches(category)) = PPB(average) * Batches(Total)
    
    => PPB(SteadyProduction) * Batches(Total) - 
    Sum(PPB(SteadyProduction) - PPB(category)) * Batches(category)) = PPB(average) * Batches(Total)
    
    => PPB(SteadyProduction) - Sum(PPB(SteadyProduction) - PPB(category)) * Batches(category)/Batches(Total)) = PPB(average)
    

    Numerically, if it's easier to follow:

    40 * 8.775 + 5 * 6.0 + 3 * 3.333 + 2 * 5 + 1 * 4 = 51 * 7.941
    => 51 * 8.775 - 11 * 8.775 + 5 * 6.0 + 3 * 3.333 + 2 * 5 + 1*4 = 51 * 7.941
    => 51 * 8.775 - 5 * (8.775-6.0) - 3 * (8.775 - 3.333) - 2 * (8.775 - 5) -  1 * (8.775-4) = 51 * 7.941
    => 8.775 - 5 * (8.775-6.0)/51 - 3 * (8.775 -3.333)/51 - 2 * (8.775 - 5) / 51  - 1 * (8.775-4)/51 = 7.941
    

    So the results would be

    -0.272 Poor Material
    -0.32  Operation Error
    -0.148 Equipment Failure
    -0.094 Other
    

    While you do these computations, you'll have to use more precise values than those you put in the table; the final results you may round up, but trying to have the sums match.