Predicting Merchant Churn and Segmenting Declined Businesses: A Fintech Sales Analytics Study
Author
Deborah Femi-Akinola
Published
May 18, 2026
1. Executive Summary
This study investigates merchant churn and transaction volume recovery patterns among 216 declined business customers on a Nigerian fintech platform. These merchants were flagged as “declined” because their 7-day transaction volumes fell below 60% of their established normal volumes. As Sales Manager, understanding which merchants are permanently churned versus temporarily underperforming is critical for directing retention efforts efficiently.
Five analytical techniques were applied: a classification model to predict churn status, model evaluation and explainability tools to validate and interpret predictions, K-Means clustering to segment merchants into actionable risk groups, Principal Component Analysis (PCA) to visualise the segment landscape, and time series analysis to forecast aggregate platform volume recovery.
Key findings reveal that approximately 18.5% of declined merchants (40 out of 216) are fully dormant with zero transactions across nearly all observed weeks. The classification model achieved strong predictive performance, with Zero_Weeks and Recovery_Rate emerging as the most important churn predictors. Three distinct merchant segments were identified: high-value recovering merchants, low-value dormant merchants, and mid-value at-risk merchants. Platform-wide weekly volumes show an encouraging upward trend, with forecasts projecting continued recovery over the next three weeks.
Recommendation: Prioritise retention resources on the mid-value at-risk segment — they are not yet churned but are trending toward dormancy, and early intervention has the highest expected return.
Classification Model: As Sales Manager, I manage a portfolio of business merchants whose transaction volumes directly determine platform revenue. Predicting which merchants will churn allows me to prioritise outreach before a merchant becomes fully inactive. A binary classifier distinguishing churned from active merchants maps directly to this daily sales decision.
Model Evaluation & Explainability: Any model presented to senior management or used to allocate sales team resources must be trustworthy and interpretable. Evaluation metrics (AUC, confusion matrix) confirm the model’s reliability, while feature importance explains to non-technical stakeholders why a merchant is flagged — making recommendations defensible.
Customer Segmentation (Clustering): Not all declined merchants are the same. A high-volume merchant inactive for 5 days requires a different response than a low-volume merchant inactive for 60 days. K-Means clustering creates operationally meaningful groups, enabling targeted sales strategies for each segment rather than a one-size-fits-all approach.
Dimensionality Reduction (PCA): With six predictor variables, visualising the full merchant landscape is impossible in raw data form. PCA compresses these dimensions into two principal components, producing a single chart that shows how all 216 merchants relate to each other — a tool I can present directly in a sales review meeting.
Time Series Analysis: Forecasting aggregate weekly merchant volumes helps set realistic sales targets and evaluate whether platform-wide recovery interventions are working. As Sales Manager, I use volume trends to set team KPIs and report to leadership on trajectory.
3. Data Collection & Sampling
Source: Internal CRM and transaction monitoring system of the fintech organisation. The dataset is the “Declined Top Businesses” report, automatically generated when a merchant’s 7-day transaction volume falls below 60% of their established normal volume baseline.
Collection Method: Exported directly from the platform’s merchant monitoring dashboard in CSV format. No manual data entry was involved.
Sampling Frame: All active business merchants on the platform who entered “declined” status within the observation window. This is a census of declined merchants — not a random sample — meaning all 216 qualifying observations are included.
Time Period: Ten consecutive weekly observation periods ending 6 May 2026, covering approximately January–May 2026.
Variables Collected: - Customer_ID: Anonymised merchant identifier - Normal_Vol: Merchant’s established 7-day transaction volume baseline - Min_Vol: Minimum threshold (60% of Normal_Vol) - Days_Decline: Number of days since the merchant first entered declined status - Week1–Week10: Actual 7-day transaction volumes for each of the 10 observation weeks
Derived Variables (engineered for analysis): - Avg_Weekly_Vol: Mean of Week1–Week10 - Recovery_Rate: Avg_Weekly_Vol / Normal_Vol (proportion of baseline recovered) - Zero_Weeks: Count of weeks with zero transactions - Churned: Binary label — 1 if Zero_Weeks ≥ 8, else 0
Ethical Notes: All customer identifiers are internal anonymised codes (numeric IDs). No personally identifiable information (names, phone numbers, BVN) is present in the dataset. Data is used solely for academic analysis. Written organisational consent obtained; raw financial figures have been retained as they contain no sensitive individual data.
Statistical Rationale: 216 observations exceeds the minimum requirement of 200 for classification tasks. Ten weekly time periods exceed the minimum of 24 required for time series when treating each week’s aggregate as one observation (n=10 is modest but sufficient for a short-range ARIMA forecast and decomposition illustration).
# Distribution of key outcomeggplot(df, aes(x = Churned, fill = Churned)) +geom_bar(width =0.5) +scale_fill_manual(values =c("#2ecc71", "#e74c3c")) +labs(title ="Merchant Status: Active vs Churned",subtitle ="Churned = zero transactions in 8+ of 10 observed weeks",x ="Status", y ="Number of Merchants") +theme_minimal() +theme(legend.position ="none")
Code
# Recovery rate distributionggplot(df, aes(x = Recovery_Rate, fill = Churned)) +geom_histogram(bins =30, alpha =0.8, position ="identity") +scale_fill_manual(values =c("#2ecc71", "#e74c3c")) +labs(title ="Distribution of Volume Recovery Rate by Churn Status",x ="Recovery Rate (Avg Weekly Vol / Normal Vol)",y ="Count") +theme_minimal()
axes[1].set_title("Recovery Rate Distribution by Churn Status")axes[1].set_xlabel("Recovery Rate")axes[1].legend(["Active (0)", "Churned (1)"])plt.tight_layout()plt.savefig("eda_python.png", dpi=150, bbox_inches='tight')plt.show()
Code
print("Data quality issues identified: (1) One missing Normal_Vol record dropped. (2) Recovery_Rate outlier > 1.0 exists — merchant recovered beyond baseline, retained as valid.")
Data quality issues identified: (1) One missing Normal_Vol record dropped. (2) Recovery_Rate outlier > 1.0 exists — merchant recovered beyond baseline, retained as valid.
Data Quality Issues Identified and Resolved:
Missing value: One record had a missing Normal_Vol and was removed, leaving 216 observations.
Outlier in Recovery_Rate: Three merchants show Recovery_Rate > 1.0, meaning their recent volumes exceed their historical baseline. These are genuine high-performers and were retained.
5. Technique 1 — Classification Model
Theory: A classification model predicts which category an observation belongs to. Logistic Regression estimates the probability of a binary outcome using a sigmoid function, while a Decision Tree splits data by the variable that best separates classes at each node (using Gini impurity or information gain). Both are interpretable and appropriate for binary outcomes.
Business Justification: The core sales question is: which of our 216 declined merchants have permanently churned, and which are still recoverable? Answering this allows the sales team to allocate outreach resources rationally — focusing reactivation calls on recoverable merchants rather than wasting effort on those already lost.
Outcome variable:Churned (1 = zero transactions in 8+ of 10 weeks; 0 = showing some activity) Predictors:Normal_Vol, Min_Vol, Days_Decline, Avg_Weekly_Vol, Recovery_Rate, Zero_Weeks
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
6. Technique 2 — Model Evaluation & Explainability
Theory: A confusion matrix shows how many predictions were correct or wrong across classes. The ROC curve plots the True Positive Rate against the False Positive Rate at all classification thresholds; AUC (Area Under Curve) summarises this — an AUC of 1.0 is perfect, 0.5 is random guessing. Feature importance reveals which variables drove predictions most.
Business Justification: Before presenting model-driven reactivation lists to the sales team, I must confirm the model is reliable. High precision means fewer wasted calls to already-lost merchants; high recall means fewer missed reactivation opportunities.
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
ℹ The deprecated feature was likely used in the pROC package.
Please report the issue at <https://github.com/xrobin/pROC/issues>.
Code
# Feature Importance — Decision Treevip(tree_model, num_features =6,aesthetics =list(fill ="#3498db", alpha =0.8)) +labs(title ="Feature Importance: Which Variables Best Predict Churn?",subtitle ="Based on Decision Tree node splits") +theme_minimal()
Plain-Language Interpretation:
Both models perform well. The logistic regression and decision tree both achieve AUC scores above 0.90, meaning they are highly reliable at distinguishing churned from active merchants. Zero_Weeks (the number of completely inactive weeks) and Recovery_Rate (how much of their normal volume a merchant has recovered) are the two strongest predictors. For management: “If a merchant has had zero transactions for more than 8 weeks and their recovery rate is below 5%, the model predicts them as permanently churned with over 90% confidence.”
Model Selection: The Decision Tree is recommended for deployment because it is fully interpretable — the sales team can follow a simple flowchart to classify any merchant without needing a statistician.
Theory: K-Means clustering partitions observations into k groups by minimising the within-cluster sum of squares. The algorithm iterates between assigning observations to the nearest centroid and recomputing centroids until convergence. The optimal k is chosen using the Elbow Method (where adding more clusters gives diminishing returns on variance explained) and confirmed with the Silhouette Score.
Business Justification: Segmentation answers the question: “Among all 216 declined merchants, what are the natural groups, and how should we treat each one differently?” A cluster of high-value recovering merchants warrants a different retention offer than a cluster of low-value fully dormant ones.
from sklearn.metrics import silhouette_scoreclust_features = ["Normal_Vol","Days_Decline","Avg_Weekly_Vol","Recovery_Rate","Zero_Weeks"]X_clust = df[clust_features].dropna()scaler2 = StandardScaler()X_clust_sc = scaler2.fit_transform(X_clust)# Elbow + Silhouetteinertias, sil_scores = [], []K_range =range(2, 9)for k in K_range: km = KMeans(n_clusters=k, random_state=42, n_init=10) km.fit(X_clust_sc) inertias.append(km.inertia_) sil_scores.append(silhouette_score(X_clust_sc, km.labels_))
KMeans(n_init=10, random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
Theory: Principal Component Analysis (PCA) transforms correlated variables into a smaller set of uncorrelated principal components (PCs) that capture the most variance in the data. PC1 explains the largest share of variance, PC2 the second largest. Plotting observations on PC1 vs PC2 creates a 2D map of the full multi-dimensional dataset.
Business Justification: With six predictor variables, it is impossible to visualise the full merchant landscape in a single chart. PCA compresses these six dimensions into two components I can plot, colour by cluster, and present to leadership as a single “merchant health map.”
Plain-Language Interpretation:
The two principal components together explain approximately 75–80% of the total variation in the merchant data. This means our 2D map captures most of the story. Merchants in the “Dormant Lost” cluster sit clearly separated from the “Recovering Stars” cluster — confirming the K-Means segmentation is capturing real structure and not noise. The “At-Risk” group sits between the two extremes, reflecting their transitional status.
9. Technique 5 — Time Series Analysis
Theory: Time series analysis decomposes sequential data into trend (long-run direction), seasonality (repeating cycles), and residual (random noise) components. Stationarity — a constant mean and variance over time — is a key assumption for ARIMA forecasting. The Augmented Dickey-Fuller (ADF) test checks for stationarity; differencing is applied if needed.
Business Justification: As Sales Manager, I need to track whether the platform’s aggregate merchant transaction volume is recovering or deteriorating. A 3-week forward forecast helps set realistic revenue targets and assess whether current reactivation efforts are working at the portfolio level.
fc <-forecast(fit_arima, h =3)autoplot(fc) +labs(title ="3-Week Forecast: Total Merchant Transaction Volume",subtitle ="Shaded area = 80% and 95% prediction intervals",x ="Week", y ="Total Volume") +theme_minimal()
Code
# ACF / PACFpar(mfrow =c(1,2))acf(ts_data, main ="ACF — Weekly Volumes")pacf(ts_data, main ="PACF — Weekly Volumes")
forecast_res = result.forecast(steps=3)last_week = weeks[-1]forecast_weeks = [last_week + i for i inrange(1, 4)]fig, ax = plt.subplots(figsize=(10, 5))ax.plot(weeks, weekly_total_py, 'bo-', label="Observed", linewidth=2)ax.plot(forecast_weeks, forecast_res, 'rs--', label="Forecast", linewidth=2, markersize=8)ax.axvline(x=10.5, color='grey', linestyle=':', alpha=0.7)ax.set_title("3-Week Forecast: Total Merchant Transaction Volume")ax.set_xlabel("Week"); ax.set_ylabel("Total Volume")ax.legend(); plt.tight_layout()plt.savefig("arima_python.png", dpi=150, bbox_inches='tight')plt.show()
Code
print(f"\nForecast for Weeks 11–13: {forecast_res.round(0).tolist()}")
Forecast for Weeks 11–13: [7438.0, 7640.0, 7818.0]
Plain-Language Interpretation:
Platform-wide weekly merchant volume has grown consistently from approximately 4,986 (Week 1) to 7,207 (Week 10) — a 44.5% increase over 10 weeks. The ARIMA model confirms a positive trend. The 3-week forecast projects continued growth, suggesting that current reactivation efforts are having a positive portfolio-level effect. However, since the series is short (10 periods), forecast intervals are wide — interpret the direction (growth) with confidence but treat specific volume numbers as indicative rather than precise.
10. Integrated Findings
The five analytical techniques collectively tell a coherent story about merchant churn on this fintech platform:
The EDA revealed that 18.5% of declined merchants (40 of 216) are fully dormant — they have shown zero transaction activity for 8 or more of the 10 observed weeks. The remaining 81.5% show some level of recovery activity, though with highly variable rates.
The classification model confirmed that Zero_Weeks and Recovery_Rate are the most powerful predictors of permanent churn, with both the Logistic Regression and Decision Tree achieving AUC scores above 0.90. This means we can predict with high confidence which merchants are lost before committing sales resources.
The clustering analysis revealed three natural merchant segments: a “Recovering Stars” group (high volume, bouncing back), a “Dormant Lost” group (likely permanently churned), and an “At-Risk Fence-Sitters” group whose trajectory will be determined by intervention. The PCA biplot confirmed these segments are genuinely distinct in the data.
The time series analysis provides the optimistic context: despite significant individual merchant churn, the overall platform volume is recovering strongly — growing 44.5% over 10 weeks. This means reactivation efforts are working at the aggregate level, but attention is needed to prevent the “At-Risk” segment from tipping into dormancy.
Single Integrated Recommendation: Deploy a targeted three-tier retention strategy: (1) Assign dedicated account managers to the “At-Risk Fence-Sitters” cluster with personalised reactivation incentives — this is the highest ROI group; (2) Run a low-cost automated win-back campaign for “Dormant Lost” merchants; (3) Provide loyalty rewards to “Recovering Stars” to sustain their momentum. This data-driven segmentation approach is estimated to be significantly more efficient than the current uniform outreach strategy.
11. Limitations & Further Work
Data limitations: The time series covers only 10 weekly periods, which limits ARIMA forecast accuracy. With 24+ months of weekly data, a seasonal decomposition and more robust forecasting (e.g., Prophet) would be possible.
Label definition: The Churned label (Zero_Weeks ≥ 8) is a pragmatic operational definition, not a formally validated churn definition. A business-defined churn event (e.g., contract cancellation) would strengthen the classification analysis.
Clustering stability: K-Means is sensitive to initial centroid placement and assumes spherical clusters. Future work should compare with hierarchical clustering (Ward linkage) or DBSCAN to validate segment stability.
Causality: The correlation between Days_Decline and churn does not imply that time causes churn — both may be driven by an unobserved variable (e.g., competitor onboarding). A controlled experiment (randomly assigning merchants to intervention vs. control groups) would establish causal effects.
External variables: The analysis does not include external factors such as sector (retail, hospitality, logistics), region, or macroeconomic conditions that may explain variation in recovery rates.
References
Adi, B. (2026). AI-powered business analytics: A practical textbook for data-driven decision making — from data fundamentals to machine learning in Python and R. Lagos Business School / markanalytics.online. https://markanalytics.online
Femi-Akinola, D. (2026). Declined top businesses transaction volume dataset [Dataset]. Collected from Sales Operations Dashboard, Fintech Organisation, Lagos, Nigeria. Data available on request from the author.
Pedregosa, F., Varoquaux, G., Gramfort, A., Michel, V., Thirion, B., Grisel, O., Blondel, M., Prettenhofer, P., Weiss, R., Dubourg, V., Vanderplas, J., Passos, A., Cournapeau, D., Brucher, M., Perrot, M., & Duchesnay, É. (2011). Scikit-learn: Machine learning in Python. Journal of Machine Learning Research, 12, 2825–2830.
R Core Team. (2024). R: A language and environment for statistical computing (Version 4.x). R Foundation for Statistical Computing. https://www.R-project.org/
Seabold, S., & Perktold, J. (2010). Statsmodels: Econometric and statistical modeling with Python. In Proceedings of the 9th Python in Science Conference (pp. 92–96).
Wickham, H., Averick, M., Bryan, J., Chang, W., McGowan, L., François, R., Grolemund, G., Hayes, A., Henry, L., Hester, J., Kuhn, M., Pedersen, T. L., Miller, E., Bache, S. M., Müller, K., Ooms, J., Robinson, D., Seidel, D. P., Spinu, V., … Yutani, H. (2019). Welcome to the tidyverse. Journal of Open Source Software, 4(43), 1686. https://doi.org/10.21105/joss.01686
Claude (Anthropic) was used as a coding assistant to help structure the Quarto document template, suggest appropriate R and Python package choices, and generate initial code scaffolding for the five analytical techniques. All analytical decisions — including the choice of CS 2, the definition of the Churned outcome variable (Zero_Weeks ≥ 8), the selection of predictor variables, the interpretation of all model outputs, the cluster naming and business recommendations, and the integrated conclusion — were made independently by the author based on domain knowledge as a Sales Manager in the Nigerian fintech sector. The dataset was collected directly from the author’s organisation’s merchant monitoring dashboard and is genuine primary data. All interpretations and recommendations reflect the author’s own professional judgement.