You’re interviewing for an ML role at TelcoOne, a prepaid + postpaid telecom operator with 18M active subscribers across the US and LATAM. Churn is a major profit lever: the business estimates an average $140 gross margin per retained subscriber over the next 6 months, and the retention team can only contact ~250K customers/week with targeted offers. Leadership wants a model that flags customers likely to churn in the next 30 days, so the retention team can intervene with minimal wasted outreach.
The product constraint is important: sending an offer to a customer who would not churn has a real cost (discount leakage + support load), but missing a true churner is even more expensive. You must design a model that is accurate, operationally feasible, and robust to changing behavior (seasonality, promotions, network incidents).
You have a historical training set built from daily event logs aggregated into a customer-week table. Each row represents a subscriber’s behavior over a trailing window ending on a given week.
| Feature Group | Count | Examples | Notes |
|---|---|---|---|
| Usage & engagement | 22 | voice_minutes_7d, data_mb_7d, intl_calls_30d, unique_cell_towers_30d, app_sessions_7d | Strong seasonality; heavy-tailed distributions |
| Billing & plan | 10 | plan_tier, autopay_enabled, days_past_due, last_topup_amount, payment_failures_90d | Some features only for postpaid |
| Network quality | 8 | dropped_call_rate_30d, avg_rsrp, outage_minutes_7d | Missing for roaming-only weeks |
| Support & complaints | 7 | tickets_30d, complaint_flag, avg_handle_time, csat_last_ticket | CSAT missing when no ticket |
| Customer profile | 6 | tenure_days, region, device_os, handset_age_days | Categorical + numeric |
churn_30d = 1 if the subscriber disconnects or ports out within 30 days after the week end