--- id: wiki-2026-0508-이탈률-churn-rate title: 이탈률(Churn Rate) category: 10_Wiki/Topics status: verified canonical_id: self aliases: [Churn, User Churn, Attrition Rate, 이탈] duplicate_of: none source_trust_level: A confidence_score: 0.9 verification_status: applied tags: [analytics, retention, kpi, business-metrics] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: python framework: pandas-lifelines --- # 이탈률(Churn Rate) ## 매 한 줄 > **"매 churn 매 retention 의 의 mirror — 매 leak rate 의 quantify"**. 매 SaaS (5% monthly = catastrophe) 매 game (D30 retention 30% = norm), 매 의 의 의 의 의 metric 매 universal — 매 user lost / total user 의 unit time 의 의 의. 매 2026 modern stack 매 Cox proportional hazards + churn-prediction LightGBM 매 standard. ## 매 핵심 ### 매 churn 의 정의 variants - **logo churn (count)**: 매 #lost / #total. 매 simple. - **revenue churn (gross)**: 매 lost MRR / total MRR. 매 enterprise SaaS 매 critical. - **net revenue churn**: 매 (lost - expansion) / total. 매 < 0 (negative churn) 매 holy grail. - **active churn vs passive churn**: 매 cancel button 매 / 매 expired card. 매 win-back 매 different strategy. ### 매 measurement window 매 매 매 - 매 daily / weekly / monthly / quarterly. 매 game 매 D1/D7/D30 매 standard. 매 SaaS 매 monthly. - **cohort-based**: 매 sign-up week 의 의 group 의 churn curve 의 trace. - **rolling**: 매 last-N-day window 매 trailing. ### 매 응용 1. 매 SaaS health: <5% monthly churn 매 healthy, >7% 매 alarm. 2. 매 mobile game: D1 ~40-50%, D7 ~20%, D30 ~5-10% retention (= 90-95% churn by D30). 3. 매 telecom: 매 churn prediction 매 ML 매 retention offer trigger. 4. 매 streaming (Netflix etc.): 매 voluntary cancel + 매 dunning (passive). 5. 매 freemium → premium conversion 매 churn 의 의 inverse calculation. ## 💻 패턴 ### Basic churn calculation ```python import pandas as pd def monthly_churn(users: pd.DataFrame, month: str) -> float: """users: [user_id, signup_date, last_active_date]""" start = pd.to_datetime(month) end = start + pd.offsets.MonthEnd(1) active_at_start = users[users["last_active_date"] >= start - pd.Timedelta(days=30)] churned = active_at_start[active_at_start["last_active_date"] < end - pd.Timedelta(days=30)] return len(churned) / len(active_at_start) if len(active_at_start) else 0 ``` ### Cohort retention curve ```python def cohort_retention(events: pd.DataFrame) -> pd.DataFrame: """events: [user_id, event_date]. Returns cohort x days_since_signup matrix.""" first = events.groupby("user_id")["event_date"].min().rename("cohort") df = events.merge(first, on="user_id") df["days_since"] = (df["event_date"] - df["cohort"]).dt.days df["cohort_week"] = df["cohort"].dt.to_period("W") matrix = ( df.groupby(["cohort_week", "days_since"])["user_id"] .nunique() .unstack(fill_value=0) ) return matrix.div(matrix.iloc[:, 0], axis=0) # normalize to D0 ``` ### Survival analysis (Kaplan-Meier) ```python from lifelines import KaplanMeierFitter def survival_curve(durations, event_observed): kmf = KaplanMeierFitter() kmf.fit(durations, event_observed) return kmf.survival_function_ # durations: days until churn (or censoring) # event_observed: 1 if churned, 0 if still active (right-censored) ``` ### Cox proportional hazards (predictive) ```python from lifelines import CoxPHFitter def churn_hazard(df: pd.DataFrame): """df: [duration, event, plan, monthly_usage, support_tickets, ...]""" cph = CoxPHFitter() cph.fit(df, duration_col="duration", event_col="event") return cph # cph.hazard_ratios_ shows feature impact ``` ### LightGBM churn prediction ```python import lightgbm as lgb from sklearn.model_selection import train_test_split def train_churn_model(features: pd.DataFrame, churn_label: pd.Series): X_tr, X_te, y_tr, y_te = train_test_split(features, churn_label, stratify=churn_label) model = lgb.LGBMClassifier( n_estimators=500, learning_rate=0.05, class_weight="balanced", num_leaves=63 ) model.fit(X_tr, y_tr, eval_set=[(X_te, y_te)], callbacks=[lgb.early_stopping(20)]) return model ``` ### Negative churn (expansion > churn) ```python def net_revenue_churn(start_mrr, lost_mrr, expansion_mrr) -> float: return (lost_mrr - expansion_mrr) / start_mrr # negative = good ``` ## 매 결정 기준 | 상황 | metric | |---|---| | 매 SMB SaaS | logo churn (monthly) | | 매 Enterprise SaaS | net revenue churn | | 매 mobile game | D1/D7/D30 retention curve | | 매 telecom / streaming | survival + ML prediction | | 매 marketplace | cohort retention + GMV per cohort | **기본값**: 매 cohort retention 매 D1/D7/D30 + 매 monthly logo churn 매 dual-track tracking. ## 🔗 Graph - 부모: [[Retention]] · [[KPI]] · [[Customer Analytics]] - 변형: [[Logo Churn]] · [[Revenue Churn]] · [[Net Revenue Retention]] - 응용: [[유니버스 LTV(Universe LTV)]] · [[CAC Payback]] · [[Cohort Analysis]] - Adjacent: [[Survival Analysis]] · [[Engagement Score]] ## 🤖 LLM 활용 **언제**: 매 product / business 매 health 의 measurement, 매 retention 매 effort 의 ROI 의 prove, 매 churn-prediction model 의 build. **언제 X**: 매 single-purchase 매 product (no recurring) — 매 LTV / repeat-rate 의 의 substitute. ## ❌ 안티패턴 - **매 averaging across cohorts**: 매 hide newer-cohort 매 improvement / regression. - **매 treating active churn = passive churn**: 매 dunning fix 매 retention campaign 매 confused. - **매 vanity tracking**: 매 churn 매 measure 만 매 매, 매 root-cause 의 의 의 segmentation 의 의 의 X. - **매 D30 only**: 매 long-tail (D90/D180) 매 ignore — 매 LTV 매 underestimate. ## 🧪 검증 / 중복 - Verified (Reichheld *The Loyalty Effect*, ChartMogul SaaS benchmarks 2025-2026, lifelines library docs). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — churn variants + cohort curves + KM/Cox/LightGBM code |