Portfolio

Work That Speaks in Numbers

Five engagements across telecom, finance, retail, insurance, and SaaS — each one measured by the outcomes it delivered.

ML & Data ScienceTelecommunications

Predictive Churn Model Reducing Customer Attrition by 34%

Global Telecom Provider

14 weeks
4 engineers
34%
Reduction in high-value churn
$18M
Annual revenue protected
12M
Customers scored daily
91%
Model precision at top decile
The Challenge

The client had 12 million active subscribers and a 9.2% annual churn rate concentrated in their highest-revenue segment. Existing BI reports were retrospective — by the time churn was detected, customers had already left.

Our Approach

We engineered a gradient-boosted churn propensity model trained on 3 years of behavioral, billing, and network quality signals. The model runs nightly on Databricks, scores every active subscriber, and feeds a ranked intervention queue for the retention team.

predictive-churn-telecom.py
# Churn propensity pipeline
pipeline = Pipeline([
  ("features", FeatureUnion([
    ("behavioral", BehavioralTransformer()),
    ("billing", BillingTransformer()),
    ("network", NetworkQualityTransformer())
  ])),
  ("model", XGBClassifier(
    n_estimators=800,
    max_depth=6,
    learning_rate=0.02,
    scale_pos_weight=9.1
  ))
])
Stack:XGBoostDatabricksApache SparkMLflowPythonAirflow
AI Network EngineeringFinancial Services

Real-Time Network Anomaly Detection Cutting Incident Response Time by 78%

Enterprise Financial Services Firm

20 weeks
5 engineers
78%
Faster incident detection
94%→11%
False positive rate reduction
18min
Mean time to detection
40K
Network nodes monitored
The Challenge

The client's security operations team was drowning in 50,000+ daily alerts with a 94% false-positive rate. Critical incidents were buried in noise, and mean time to detection averaged 4.2 hours.

Our Approach

We built a Graph Neural Network trained on network topology and traffic patterns. The model learns normal behavior per node and edge, then flags deviations in real time. A secondary classifier filters false positives before alerts reach the SOC.

network-anomaly-detection.py
class AnomalyGNN(nn.Module):
  def forward(self, x, edge_index,
              edge_attr):
    h = self.conv1(x, edge_index,
                   edge_attr)
    h = F.relu(self.bn1(h))
    h = self.conv2(h, edge_index,
                   edge_attr)
    return torch.sigmoid(
      self.classifier(h))
Stack:PyTorch GeometricGNNsKafkaKuberneteseBPFGrafana
Data VisualizationRetail & Consumer Goods

Executive Analytics Platform Consolidating 14 Data Sources Into One Dashboard

Multinational Retail Group

16 weeks
3 engineers
14→1
Data sources consolidated
3 days→15min
Report generation time
100%
C-suite adoption in 30 days
$2.4M
Saved in annual reporting costs
The Challenge

Finance, operations, and merchandising each maintained separate reporting systems. Weekly board packs took 3 days to compile and were outdated by the time they were distributed. Leadership had no real-time visibility into performance.

Our Approach

We designed a semantic data layer in dbt that unified 14 source systems, then built a Tableau-based executive dashboard with drill-through capability from KPI to transaction level. Automated refresh runs every 15 minutes.

executive-analytics-platform.py
-- dbt semantic layer: unified KPI model
with sales as (
  select * from {{ ref('fct_sales') }}
),
inventory as (
  select * from {{ ref('fct_inventory') }}
)
select
  s.date, s.region,
  sum(s.revenue)      as revenue,
  sum(s.units_sold)   as units,
  avg(i.days_on_hand) as avg_doi
from sales s
join inventory i using (sku, date)
group by 1, 2
Stack:TableaudbtSnowflakeAirflowPythonPower BI
Statistical ComputingInsurance

Bayesian Risk Model Improving Underwriting Accuracy by 22%

Regional Insurance Carrier

18 weeks
3 engineers
22%
Improvement in loss ratio prediction
3
New markets successfully entered
8.4%
Reduction in combined ratio
6mo
Payback period on engagement
The Challenge

The carrier was expanding into three new geographic markets with limited historical claims data. Their frequentist models produced unstable estimates in low-volume segments, leading to adverse selection and underpricing.

Our Approach

We developed a hierarchical Bayesian model in Stan that pools information across markets while allowing segment-level variation. Uncertainty estimates are propagated through to pricing, enabling risk-adjusted premiums even in thin-data segments.

statistical-risk-modeling.py
# Hierarchical Bayesian risk model
model {
  mu_alpha ~ normal(0, 1);
  sigma_alpha ~ exponential(1);

  alpha ~ normal(mu_alpha,
                 sigma_alpha);

  claims ~ neg_binomial_2_log(
    alpha[market] +
    X * beta +
    log(exposure),
    phi
  );
}
Stack:StanRbrmsPythonRStanggplot2
ML & Data ScienceTechnology

MLOps Platform Reducing Model Deployment Time from 6 Weeks to 2 Days

SaaS Analytics Company

12 weeks
4 engineers
95%
Faster model deployment
0
Drift incidents post-launch
40+
Models under management
2 days
Average deployment cycle
The Challenge

Each model deployment was a manual, 6-week process involving 4 teams. There was no model registry, no automated testing, and no drift monitoring. Three production incidents in one quarter were traced to undetected model degradation.

Our Approach

We designed and implemented a full MLOps platform: MLflow for experiment tracking and model registry, Kubeflow Pipelines for CI/CD, Great Expectations for data validation, and Evidently AI for drift monitoring. All 40+ models were migrated in 8 weeks.

mlops-platform.py
@pipeline_component
def validate_and_register(
  model_uri: str,
  validation_dataset: str
) -> bool:
  model = mlflow.sklearn.load_model(
    model_uri)
  suite = ge.load_suite(
    "model_validation_suite")
  results = suite.run(
    batch=validation_dataset)
  if results.success:
    mlflow.register_model(
      model_uri, "production")
  return results.success
Stack:MLflowKubeflowGreat ExpectationsEvidently AIDockerKubernetes
Your Project Next

Ready to Add Your Results Here?

Every engagement starts with a direct conversation. Tell us the problem — we'll tell you how we'd approach it.