Survival analysis, churn and customer lifetime value

TL;DR

Difficulty: Advanced

A churn model that says whether a customer leaves answers the wrong question. Survival analysis says when.

  • Survival and hazard: S(t) is the share still active after t months, the hazard is the rate of leaving among those still there. The hazard tells you when to act.
  • Kaplan Meier draws the survival curve honestly, using customers who have not churned yet as censored observations.
  • The Cox model gives hazard ratios that multiply: 0.55 for completed onboarding, 0.88 per extra seat, 1.24 for paid search in the invented example.
  • Predictive lifetime value sums margin times survival times a discount factor: about €1,900 for a Team account against a descriptive €1,100. With constant retention it reduces to the Foundations formula.
  • Use it per segment for bidding, and test the intervention before you believe it.

A churn model that outputs a probability of leaving answers the wrong question: everyone leaves eventually, what you need to know is when, and what the time before that is worth. I walk through the survival and hazard functions, Kaplan Meier curves, a Cox model and a predictive lifetime value on Vanlog, an invented Galway SaaS for trades businesses. This is chapter 8 of 21 in my Marketing Analytics series.

The account that was already gone

Vanlog is an invented Rails SaaS from Galway for trades businesses, the one I use as the SaaS example in this series. It has about 2,400 paying accounts. One Tuesday the founder sends me a spreadsheet called "churn model". Someone has fitted a logistic regression on last year's data, and for every account it gives a probability of cancelling. A roofing firm in Tuam sits at 0.81. The team writes to them, offers a call, offers a discount. The roofer cancelled 11 days earlier.

The model was right and completely useless, because it answered the wrong question. It said whether. Nobody had asked when.

A yes or no model treats every customer as if they stand at the same point in their life with you. A carpentry firm that signed up last week and a plumber in month 31 do not, and the interesting thing about both is not whether they will ever leave (everyone does) but how long they are likely to stay and what that time is worth. Survival analysis answers that, and with time in hand, lifetime value becomes a number you can defend in front of an accountant.

Vanlog and every number in this chapter are made up so I can show each step. The curve shapes and effect sizes are what I typically see in subscription businesses of this size, and the method is the one I use.

Where this chapter sits in the series

This is chapter 8 of 21 in my Marketing Analytics series, in part two, the dependent variable techniques of chapters 4 to 10. In the previous chapter, logistic regression, lift charts and market basket analysis, the outcome was a yes or a no. Here it is a duration, with the twist that for most customers the duration has not finished yet. In the next chapter, panel regression and same store sales, it becomes a series of numbers observed over time for many units at once.

Why time to event beats yes or no

Three reasons.

Timing. If churn risk peaks in month three and at the annual renewal, you want your retention effort in month two and month 11, not spread evenly. A survival model draws the risk over time.

Censoring. Most of Vanlog's 2,400 accounts are still customers. A yes or no model labels them "did not churn", which is not true: they have not churned yet. An account that joined in January and is still active in June has told you it survived six months, and nothing about month seven. Survival analysis calls this right censoring, and uses those six months honestly instead of throwing the account away or pretending it is loyal.1 Mislabel half your data and you get a model that is confidently wrong.

Value. Multiply the probability that an account is still paying in each month by that month's margin, discount, and add up. That is a lifetime value with a foundation, not "average margin divided by average churn rate", which assumes churn is the same in every month.

Worked example: what censoring does to a churn rate

Take five Vanlog accounts on 30 June. Two joined on 1 January and cancelled at the end of February, so each lasted two months. Three joined on 1 April and are still active, so each has been watched for three months.

  • The yes or no view: two of five churned, 40%, and the three April accounts count as "loyal".
  • The survival view: in months one and two all five were at risk, and two left at the end of month two, so S(2)=1−2/5=0.6S(2) = 1 - 2/5 = 0.6. In month three the three April accounts were at risk and none left, so S(3)=0.6×(1−0/3)=0.6S(3) = 0.6 \times (1 - 0/3) = 0.6. After month three the April accounts are censored: nothing is known yet, and the model does not pretend otherwise.

"60% are loyal" and "60% survive three months, the rest unknown" are very different statements. In a real file, accounts are watched for anything from a week to five years, and only the second kind stays honest.

The two functions that do all the work

Two functions of time do the work. The survival function is the probability that a customer is still with you after time tt:1

S(t)=P(T>t)S(t) = P(T > t)

Here TT is the random variable "how long this customer lasts", tt is a specific point in time, say 12 months, and P(T>t)P(T > t) is the probability that the lifetime is longer than tt. S(0)S(0) is one and S(t)S(t) only ever goes down. Foundations: probability

The hazard function is the instantaneous rate of leaving at time tt among the customers who have made it that far:1

h(t)=lim⁡Δt→0P(t≤T<t+Δt∣T≥t)Δth(t) = \lim_{\Delta t \to 0} \frac{P(t \le T < t + \Delta t \mid T \ge t)}{\Delta t}

Here h(t)h(t) is the hazard at time tt, Δt\Delta t is a small slice of time after tt, P(t≤T<t+Δt∣T≥t)P(t \le T < t + \Delta t \mid T \ge t) is the conditional probability of leaving inside that slice given that the customer was still there at tt, and the limit shrinks the slice towards zero. The bar is the "given that" of conditional probability. Foundations: probability

With monthly data this becomes a plain rate:

ht=dtnth_t = \frac{d_t}{n_t}

Here hth_t is the hazard in month tt, dtd_t is the number of accounts that cancelled in that month and ntn_t is the number still active at its start. Events over opportunities. Foundations: ratios and rates

The hazard is the function for decisions, because it tells you where the risk lives. The survival function is the one for money, because it tells you how many customers you will have left. They are two views of the same thing:

S(t)=exp⁡(−∫0th(u) du)and with monthly dataS(t)=∏j=1t(1−hj)S(t) = \exp\left(-\int_0^t h(u)\,du\right) \qquad \text{and with monthly data} \qquad S(t) = \prod_{j=1}^{t} (1 - h_j)

Here exp⁡\exp is the exponential function, ∫0th(u) du\int_0^t h(u)\,du is the total hazard accumulated between time zero and tt, with uu running over that interval, ∏j=1t\prod_{j=1}^{t} multiplies the terms for months j=1j = 1 to tt, and 1−hj1 - h_j is the share of customers who survive month jj given that they started it. Know one function and you know the other. Foundations: logarithms and exponentials

Worked example: from hazard to survival

Vanlog's Team plan loses 3.5% of its accounts in month one, 4.8% of those left in month two and 5.1% of those left in month three. So:

  • After month one: S(1)=1−0.035=0.965S(1) = 1 - 0.035 = 0.965.
  • After month two: S(2)=0.965×(1−0.048)=0.965×0.952=0.919S(2) = 0.965 \times (1 - 0.048) = 0.965 \times 0.952 = 0.919.
  • After month three: S(3)=0.919×(1−0.051)=0.919×0.949=0.872S(3) = 0.919 \times (1 - 0.051) = 0.919 \times 0.949 = 0.872.

87.2% of new Team accounts are still paying after three months. The hazards are the risk month by month, the survival is what is left.

Kaplan Meier, the honest curve

Before any modelling I draw a Kaplan Meier curve, the non parametric estimate of S(t)S(t). It handles censoring without any assumption about the shape of the curve:2

S^(t)=∏ti≤t(1−dini)\hat{S}(t) = \prod_{t_i \le t} \left(1 - \frac{d_i}{n_i}\right)

Here S^(t)\hat{S}(t) is the estimated survival at time tt, the hat marking it as an estimate, the product runs over every month tit_i up to and including tt, did_i is the number of accounts that cancelled in month tit_i, and nin_i is the number at risk at its start, meaning active and not yet censored. Each factor is the probability of surviving that month given that you reached it, and the product chains them. A censored account counts in nin_i for every month it was observed and then drops out. Foundations: probability

Reading the curves by plan

For Vanlog I split the curve by plan. Starter costs €29 a month and is mostly sole traders. Team costs €89 a month with several seats.

Kaplan Meier survival by planKaplan Meier curves over 24 months for the invented Vanlog SaaS. Team falls to 69% at month 12 and 59% at month 24, Starter to 54% and 42%. The gap opens in the first four months, then stays roughly parallel.Share of accounts still active, by month since signup0%50%100%150%200%M0M6M12M18M24TeamStarterStill active (%)Months since signup

The horizontal axis is months since signup, the vertical axis the share of accounts still active. After 12 months 69% of Team accounts are still active against 54% of Starter accounts, after two years 59% against 42%. The steep part of both curves is the first four months, then a slow decline with a small step at month 12, the annual renewal.

The curve is descriptive and already worth having. The founder had been reporting a single "monthly churn of 2.1%" to his board. True as an average, and hiding that a brand new Starter account was leaving at about four times that rate: losing 16% in two months is about 8.3% a month, because 1−0.841/2=0.0831 - 0.84^{1/2} = 0.083.

The hazard view of the same Team data makes the timing sharper.

Monthly churn hazard, Team planMonthly churn hazard for the Team plan, months 1 to 12: 3.5%, 4.8%, 5.1%, 4.2%, 3.3%, 2.6%, 2.2%, 2.0%, 1.8%, 1.7%, 1.9%, 3.0%. Risk peaks in months two to four and rises again at the renewal.Share of the accounts active at the start of each month who cancel in it0%2.5%5%7.5%10%M1M2M3M4M5M6M7M8M9M10M11M12Hazard (%)Month since signup

The horizontal axis is the month of the account's life, the vertical axis the hazard: of the accounts that started that month, the share that cancelled in it. This is the chart for when to intervene. Months two to four are where accounts are lost, after the trial converts and before the business moves its real quoting and invoicing into the tool. Whatever you do about churn, do it in weeks two to eight. The month 12 bump is a smaller problem with a separate fix: a renewal conversation in month 10 or 11, not an automated "your card will be charged" email on the day.

The Cox model: what moves the hazard

Kaplan Meier gives you a curve per group. It cannot tell you whether the Team plan survives better because of the plan itself, or because Team accounts have more seats and more of them finished onboarding. For that you need a regression on the hazard, and the workhorse is the Cox proportional hazards model:3

h(t∣x)=h0(t) exp⁡(β1x1+β2x2+⋯+βkxk)h(t \mid x) = h_0(t)\,\exp(\beta_1 x_1 + \beta_2 x_2 + \dots + \beta_k x_k)

Here h(t∣x)h(t \mid x) is the hazard at time tt for a customer with characteristics x1x_1 to xkx_k, h0(t)h_0(t) is the baseline hazard, the risk over time for a reference customer with every xx at zero, and β1\beta_1 to βk\beta_k are the coefficients estimated from the data, one per characteristic. The model never needs to know the shape of h0(t)h_0(t), which is the clever part. The exponential term scales the baseline up or down per customer. Because that scaling does not depend on tt, the ratio of hazards between two customers is constant over time. That is the proportional hazards assumption, and it is an assumption, not a fact. I come back to it under pitfalls. Foundations: regression

The quantity you read is the hazard ratio:

HRj=eβjHR_j = e^{\beta_j}

Here HRjHR_j is the hazard ratio for characteristic jj and eβje^{\beta_j} is the exponential of its coefficient βj\beta_j. A hazard ratio of 0.55 means that, holding everything else fixed, a customer with that characteristic has 55% of the churn risk of one without it at every point in time, a 45% lower risk. Above one means higher risk, exactly one means the variable does nothing. Foundations: logarithms and exponentials

Here is the Vanlog model, fitted on all 2,400 accounts, of which 1,060 have churned and 1,340 are censored. Its concordance is 0.71: for a random pair of accounts, the model says correctly which one lasts longer 71% of the time. The lifelines documentation notes that fitted survival models typically land between 0.55 and 0.75.3

VariableCoefficientHazard ratio95% intervalPlain reading
Onboarding completed (yes versus no)minus 0.600.550.47 to 0.6445% lower risk at every point in time
Seats (per additional seat)minus 0.130.880.84 to 0.92each extra seat cuts the risk by 12%
Team plan versus Starterminus 0.340.710.61 to 0.8329% lower risk in any given month
Annual billing versus monthlyminus 0.480.620.51 to 0.7538% lower risk
Acquired via paid search versus referral0.221.241.05 to 1.4724% higher risk
Support tickets in the first 30 days (per ticket)0.091.091.01 to 1.189% more risk per ticket

Each hazard ratio is the exponential of its coefficient, for example e−0.60=0.55e^{-0.60} = 0.55, and each interval is the coefficient plus or minus 1.96 standard errors, exponentiated, which is why the intervals are not symmetric around the ratio. Foundations: confidence intervals

Line by line. Onboarding completion (imported customers, sent one quote, connected a bank feed) is the biggest lever, and its interval stays well below one, so I believe the direction and roughly the size. Each additional seat cuts the hazard by another 12%: a tool three people use every day is harder to leave than one person's experiment. With those two in the model, the plan effect shrinks to 0.71, so part of the raw Team advantage in the Kaplan Meier curve was really onboarding and seats. Annual billing at 0.62 is partly commitment and partly selection, because businesses that pay annually were already the confident ones. Paid search accounts leave 24% faster than referrals, which feeds the acquisition maths later. And each support ticket in the first month adds 9%, not because support is bad, but because early tickets are a symptom of a poor fit.

Worked example: two accounts compared

The effects multiply. Take a Team account that pays annually, finished onboarding and has four seats, three more than the baseline. Relative to a monthly Starter account with one seat that never finished onboarding:

  • Plan: 0.71.
  • Annual billing: 0.62.
  • Onboarding: 0.55.
  • Three extra seats: 0.883=0.6810.88^3 = 0.681.
  • Together: 0.71×0.62×0.55×0.681=0.1650.71 \times 0.62 \times 0.55 \times 0.681 = 0.165.

The first account carries about one sixth of the churn risk of the second, in every month. Nobody needs to phone the first one in month two. Everybody needs to phone the second.

Deciding when to intervene

The model earns its keep when you use both outputs together: the hazard shape from Kaplan Meier tells you when, the hazard ratios from Cox tell you whom. For Vanlog that produces three rules.

Accounts not onboarded by day 14 get a person, not a drip campaign. Onboarding nearly halves the hazard, and in this example 61% of the accounts that finish it do so in the first two weeks, almost none after week six. That is the window for a phone call.

Monthly Starter accounts with one seat get a targeted seat offer in month two. Each seat is worth 12% of hazard, and a second seat added early is the lowest cost retention step Vanlog has, because it also raises revenue.

Annual accounts get a renewal conversation in month 10. Not a discount, a conversation about what would make next year better.

The model does not prove that phoning people works. It tells you whom to test it on, and when. The mechanics of onboarding that builds habits are in onboarding and habit formation. The survival model tells you the size of the prize if you get it right.

Lifetime value, descriptive and predictive

Now the money. Two different things get called customer lifetime value, and they answer different questions.

Descriptive lifetime value asks what customers have been worth. Take every account, add up the margin it has produced so far, and average. For Vanlog's Team plan the average account is about 15.5 months old (churned and active mixed together) and produces €71 of contribution margin a month on an €89 price, after hosting, payment fees and support. So 15.5×71=€1,10015.5 \times 71 = €1{,}100 per account. Useful about the past, poor for acquisition spend, because it is dragged down by every young account with years of paying ahead of it, and a growing business has many.

Predictive lifetime value asks what a customer signing up today will be worth over their life with you. That is where the survival function comes in:

LTV=∑t=1Tmt S(t)(1+r)tLTV = \sum_{t=1}^{T} \frac{m_t \, S(t)}{(1 + r)^t}

Here LTVLTV is the predicted lifetime value of one new customer, the sum runs over future months tt from 1 to a horizon TT, mtm_t is the margin you earn in month tt if the customer is still there, S(t)S(t) is the probability that they are, and (1+r)t(1 + r)^t discounts month tt back to today at a monthly rate rr. Margin times survival is the expected margin in that month, and the discount says a euro in month 48 is worth less than a euro now. Foundations: lifetime value and Foundations: discounting

This is the same idea as the formula in the Foundations, only without its simplifying assumption. If the margin is the same MM every period and the same share ρ\rho of customers stays each period, so that S(t)=ρtS(t) = \rho^t, and the horizon runs forever, the sum becomes a geometric series:

LTV=∑t=1∞M(ρ1+r)t=M×ρ1+r−ρLTV = \sum_{t=1}^{\infty} M \left(\frac{\rho}{1+r}\right)^t = M \times \frac{\rho}{1 + r - \rho}

Here MM is the constant margin per period, ρ\rho the constant retention rate, rr the discount rate, and ρ1+r\frac{\rho}{1+r} the factor by which each period's expected, discounted margin shrinks. That is exactly CLV=M×r1+d−rCLV = M \times \frac{r}{1 + d - r} on the Foundations page, which writes retention as rr and the discount rate as dd. Foundations: lifetime value The survival version lets retention change from month to month, because the risk in month three is not the risk in month 30.

Worked example: the Team plan, month by month

The example's inputs: the Team plan's monthly hazards from the chart for the first year, then 1.2% a month with 2.2% at each anniversary, a margin of €71 a month, a monthly discount rate of 1% (about 12.7% a year, deliberately conservative for a small company, because 1.0112=1.1271.01^{12} = 1.127) and a horizon of 60 months. Selected months shown, the full table has 60 rows.

MonthHazard in that monthSurvival S(t)Discount factorExpected discounted margin (€)Cumulative LTV (€)
13.5%0.9650.99067.8468
35.1%0.8720.97160.08192
62.6%0.7870.94252.62356
123.0%0.6930.88743.64640
242.2%0.5930.78833.161,095
362.2%0.5080.69925.201,441
482.2%0.4350.62019.151,703
602.2%0.3720.55014.561,903

Walk down it. Month one: survival 0.965, discount factor 1/1.01=0.9901 / 1.01 = 0.990, so the expected discounted margin is 71×0.965×0.990=€67.8471 \times 0.965 \times 0.990 = €67.84. Month three, at the hazard peak: 71×0.872×0.971=€60.0871 \times 0.872 \times 0.971 = €60.08. By month 60 it has drifted down to €14.56.

The cumulative column is the answer: about €1,903 per new Team account, which I round to €1,900. That is 73% more than the descriptive €1,100, since 1,903/1,100=1.731{,}903 / 1{,}100 = 1.73, and the difference is not optimism. It is the years of margin that the young accounts in the descriptive average have not yet had time to produce.

Stopping at 60 months leaves value on the table (a 37% chance the account is still paying), and I am fine with that: five years is as far as I trust any subscription model. The choice of rr is a business decision, not a statistical one.

Contractual and non contractual churn

Everything above assumes you know when a customer left. Vanlog does: a subscription is cancelled on a date, and the event is observed. That is contractual churn, the easy case.

Northgate Hampers, the invented Cork hamper shop from earlier chapters, has the hard case. A customer who bought a Christmas hamper in 2024 and nothing since has not cancelled anything. She might buy again this December or be gone for good. You never observe the end, only silence, and silence in a seasonal business is not evidence of much.

This is non contractual churn. Either you define an operational end (no purchase within 18 months counts as churned, accepting some error), or you use probabilistic purchase models in which "still a customer" is a hidden state inferred from how recently and how often someone bought. The beta geometric negative binomial model of Fader, Hardie and Lee is the well known example, built as an easier to fit alternative to the older Pareto/NBD model.4 The second route is better and more work. For a shop with a few thousand customers I start with the operational definition and check it against the buyers who came back after a long gap: if 150 of 3,000 customers written off under the 18 month rule order again the next year, the rule was wrong for 5% of them, and you decide whether that error is acceptable. The retention arithmetic for both cases is in the retention maths.

What lifetime value changes about acquisition

The founder's most expensive habit was bidding on Google Ads to a cost per acquisition target of €250, chosen because it "felt right". A Team account is worth about €1,900 in discounted margin, so €250 looks easily fine. But paid search accounts carry a hazard ratio of 1.24.

Worked example: the lifetime value of a paid search account

Run the sum again with every month's hazard raised by the hazard ratio. With monthly data the exact way is 1−(1−ht)1.241 - (1 - h_t)^{1.24} rather than 1.24×ht1.24 \times h_t, though at hazards this small the two give almost the same answer. A paid search Team account then comes to about €1,700 instead of €1,900. Still far above €250.

Now a Starter account from paid search. The example's assumptions: a Starter margin of €23 a month, and a hazard equal to the Team hazard multiplied by 1.24/0.71=1.751.24 / 0.71 = 1.75, the paid search ratio divided by the Team ratio. Its lifetime value comes to about €436, under €500, and Vanlog was paying the same €250 for both.

So the lifetime value work changed two things. The allowable acquisition cost became a per segment number, a third of predicted lifetime value, the ratio the founder chose after seeing the payback period: about 1,700/3=€5651{,}700 / 3 = €565 for a Team account from paid search and about 436/3=€145436 / 3 = €145 for a Starter account from paid search. And the campaign optimisation target moved from "trial started" to "onboarding completed", because onboarding is the moment a lead becomes worth something. The bidding side is in bid on lifetime value, not cost per click. The survival model is where the lifetime value in that headline comes from.

How to run it yourself

You need one row per customer with three things: how long they were observed (months from signup to cancellation, or to today if still active), whether the observation ended in churn (1) or is censored (0), and the covariates that matter, measured near the start so you are not using the future to predict the past. Seat count at day 30 is fine. Seat count at cancellation is cheating.

For Vanlog the dataset is one SQL query against the subscriptions and events tables, and the modelling fits in a page of Python with the lifelines library:23

from lifelines import KaplanMeierFitter, CoxPHFitter

for plan, grp in accounts.groupby("plan"):
    km = KaplanMeierFitter().fit(grp["months"], event_observed=grp["churned"], label=plan)
    print(plan, km.survival_function_at_times([6, 12, 24]).round(3).tolist())

cols = ["months", "churned", "onboarded", "seats", "plan_team", "annual", "paid_search", "tickets_30d"]
cox = CoxPHFitter().fit(accounts[cols], duration_col="months", event_col="churned")
cox.print_summary(decimals=2)
print(cox.concordance_index_)
cox.check_assumptions(accounts[cols], p_value_threshold=0.05)

Extraction and cleaning take a day or two if the subscription history is sane, a week if it has been through two billing systems. A defensible Cox model takes two or three days with the assumption checks. Call it two weeks from clean data to a decision memo.

Checks before you trust it. Plot the Kaplan Meier curves per group and per signup year and look for curves that cross, a sign that proportional hazards is broken, then run check_assumptions.5 Hold out the most recent cohort and compare predicted 12 month survival with what happened. Be suspicious of a concordance above 0.85, which usually means a variable is leaking the outcome. And read the hazard ratios to someone who runs the business: if one makes no sense to them, it is more often the data than their intuition that is wrong.

Pitfalls

Proportional hazards is an assumption. The Cox model says the effect of annual billing is the same multiplier in month two as in month 20. Often it is not: annual billing has almost no effect in month two (nobody cancels a plan they just paid a year for) and a large one at month 12. When the Kaplan Meier curves for two groups cross or converge, the single hazard ratio averages something that is not constant. The fixes are to stratify on that variable or to let its effect vary with time. Both are standard, and the lifelines guide walks through each.5 Neither is automatic.

Covariates measured too late. "Logins in the last month" predicts churn beautifully, because accounts about to cancel stop logging in. It is a symptom, not a predictor. Measure covariates at a fixed early point.

Treating lifetime value as one number. The €1,900 hides a segment worth under €500 and one worth several thousand. A single company wide figure used for bidding overpays for the weak segment and underpays for the strong one, which is exactly where Vanlog was.

The model predicts, it does not persuade. A hazard ratio of 0.55 tells you that onboarded accounts stay longer, not that pushing an account through onboarding will make it stay. The businesses that finished on their own may have been the ones who were going to stay anyway. The only way to know is to test the intervention, which is what chapter 20 of this series is about.

How I do this for clients

The deliverable is a survival model, a lifetime value table by segment and a one page decision memo, and it takes about a month. The data I need: subscription or order history with start and end dates, the plan, and what you record about each customer's first weeks. An export from Stripe, Chargebee, Solidus or your own database is enough. I do not need it clean, I need it complete.

It starts with the free workshop, where we work out which decision the model should change: when to phone people, what to pay for a lead, whether the annual plan is worth pushing. Then come two weeks of real work on me: Kaplan Meier curves by plan and cohort, a first Cox model with its hazard ratios, and a draft lifetime value table. If that fortnight produces nothing you would act on, I tell you so.

If we continue, you get the fitted model as code you own, a scored list of every account with its predicted 12 month survival and remaining value, the lifetime value table by segment, and a memo with one recommendation, one number and one risk. For example: "Phone Starter accounts that have not onboarded by day 14. The model says this addresses 38% of first year churn. The risk is that onboarding is a marker rather than a cause, so test it on half the accounts first." That is a Data Science engagement, and when the output resets acquisition bids, the campaign side is Performance Marketing. Costs are on the pricing page.

Questions to ask your own team

  • What does the hazard look like by month of life, and where does it peak?
  • Is the lifetime value in the board pack descriptive or predictive, and what discount rate and horizon does it use?
  • Is there one lifetime value or one per segment, and does the bidding use the segment numbers?
  • What test would prove that the retention step causes the effect the model predicts?

The series is inspired by Mike Grigsby's Marketing Analytics.6 The explanations, examples and numbers here are my own.

Sources

Footnotes

  1. Cameron Davidson Pilon and lifelines contributors, Introduction to survival analysis (survival function, hazard function, right censoring), lifelines documentation, https://lifelines.readthedocs.io/en/latest/Survival%20Analysis%20intro.html

  2. Cameron Davidson Pilon and lifelines contributors, Survival analysis with lifelines (the Kaplan Meier estimate), lifelines documentation, https://lifelines.readthedocs.io/en/latest/Survival%20analysis%20with%20lifelines.html

  3. Cameron Davidson Pilon and lifelines contributors, Survival regression (Cox's proportional hazard model, concordance index), lifelines documentation, https://lifelines.readthedocs.io/en/latest/Survival%20Regression.html

  4. Peter S. Fader, Bruce G. S. Hardie and Ka Lok Lee, "Counting your customers" the easy way: an alternative to the Pareto/NBD model, Marketing Science 24(2), 2005, https://brucehardie.com/papers/018/

  5. Cameron Davidson Pilon and lifelines contributors, Testing the proportional hazard assumptions, lifelines documentation, https://lifelines.readthedocs.io/en/latest/jupyter_notebooks/Proportional%20hazard%20assumption.html

  6. Mike Grigsby, Marketing Analytics: A Practical Guide to Improving Consumer Insights Using Data Techniques, Kogan Page, 2022, ISBN 9781398608191, https://www.netgalley.co.uk/catalog/book/267990

If you have a subscription or order history and a churn number you do not quite trust, bring it to the free workshop. We work out which decision a survival model should change for you, then I spend two weeks of real work on me building the curves, a first Cox model and a draft lifetime value table.