import {ms, msStyle} from "/assets/js/ms-plot.js"
{
const steps = [["π", "Python and pandas"], ["ποΈ", "SQL"], ["π", "Statistics and EDA"], ["π€", "Core ML"], ["π", "Evaluation"], ["π", "Deployment"], ["π", "Monitoring"]];
const W = 780, n = steps.length, gap = (W - 120) / (n - 1);
return htl.svg`<svg viewBox="0 0 ${W} 150" style="width:100%;max-width:${W}px;font-family:Inter,system-ui,sans-serif">
<line x1="60" y1="50" x2="${W - 60}" y2="50" stroke="${ms.indigo}" stroke-opacity="0.35" stroke-width="4"/>
${steps.map(([ic, t], i) => htl.svg`<g>
<circle cx="${60 + i * gap}" cy="50" r="26" fill="${ms.indigo}" fill-opacity="${0.35 + i * 0.09}"/>
<text x="${60 + i * gap}" y="59" text-anchor="middle" font-size="22">${ic}</text>
<foreignObject x="${60 + i * gap - 52}" y="84" width="104" height="60"><div xmlns="http://www.w3.org/1999/xhtml" style="font-size:12.5px;font-weight:650;text-align:center;line-height:1.3">${i + 1}. ${t}</div></foreignObject></g>`)}
</svg>`;
}Learning Paths: From Zero to Solving Real Industry Problems π€οΈ
Resources
Learning Paths
Use Cases
Step-by-step paths for eight industrial use cases, from churn and fraud to predictive maintenance and visual inspection, with open datasets, metrics, an animated roadmap and a worked business example.
Most courses are organised by tool: a week of pandas, a week of regression. Companies hire you to solve problems: βWhich customers will leave?β, βHow much stock do we need next week?β, βIs this machine about to fail?β. These learning paths are organised by problem. Each one tells you what to learn, in what order, on which open dataset, and how to measure success in business terms. π
Tipπ― What you will get
- The shared foundation every path builds on
- A six-stage workflow used across industry projects
- An animated roadmap for eight use cases, each with an open dataset and metric
- A skills profile per use case
- A worked example that turns a churn model into dollars saved
Noteπ The Resources hub
π§ Overview: where to find resources Β· π€οΈ Learning paths Β· π Cheat sheets Β· π Glossary Β· ποΈ 20 open data sources Β· π Paper notes (coming soon)
π The six-stage industry workflow
Industry projects follow a loop very close to CRISP-DM, the cross-industry standard process for data mining. Notice that modelling is only one of six stages.
flowchart TB A["πΌ 1. Business<br/>understanding"] --> B["π 2. Data<br/>understanding"] B --> C["π§Ή 3. Data<br/>preparation"] C --> D["π€ 4. Modelling"] D --> E["β 5. Evaluation<br/>in business terms"] E --> F["π 6. Deployment<br/>and monitoring"] E -. not good enough .-> A F -. new data, drift .-> B
Noteπ Note
In real projects, stages 1 to 3 often take more than half the time. A model that answers the wrong business question is worthless, however accurate it is.
πΊοΈ Eight industrial paths
Pick a use case. The roadmap animates through the six stages with the concrete task for each.
πΈοΈ Which skills does each path stress?
Each use case leans on a different mix of skills. Use the menu to switch use cases. Scores are an editorial judgement on a 1β5 scale.
Show the code
import plotly.graph_objects as go
from ms_charts import COLORS, PLOTLY_CONFIG
skills = ["SQL and data wrangling", "Statistics", "Classical ML", "Deep learning", "Time series", "Deployment", "Business framing"]
profiles = {
"π Customer churn": [4, 3, 4, 1, 2, 3, 5],
"π¦ Demand forecasting": [4, 4, 3, 2, 5, 3, 4],
"π³ Fraud detection": [4, 3, 5, 2, 2, 5, 4],
"βοΈ Predictive maintenance": [3, 3, 4, 4, 5, 4, 3],
"π§© Customer segmentation": [4, 4, 3, 1, 1, 2, 5],
"π« Ticket triage (NLP)": [2, 2, 3, 5, 1, 4, 3],
"π Visual inspection": [1, 2, 2, 5, 1, 5, 3],
"π Recommendations": [4, 3, 4, 3, 2, 5, 4],
}
names = list(profiles)
fig = go.Figure()
for i, (n, v) in enumerate(profiles.items()):
fig.add_trace(go.Scatterpolar(r=v + [v[0]], theta=skills + [skills[0]], fill="toself", name=n, visible=(i == 0),
line=dict(color=COLORS["indigo"], width=2.5), fillcolor="rgba(99,102,241,0.25)"))
fig.update_layout(
height=460, showlegend=False, polar=dict(radialaxis=dict(range=[0, 5], tickvals=[1, 2, 3, 4, 5])),
updatemenus=[dict(x=0, y=1.15, xanchor="left", buttons=[dict(label=n, method="update", args=[{"visible": [j == i for j in range(len(names))]}]) for i, n in enumerate(names)])])
fig.show(config=PLOTLY_CONFIG)π° Worked example: turning a churn model into dollars
Industry cares about value, not AUC. Here is the key step most tutorials skip. We simulate 10,000 subscribers, train a model, and ask: βIf we call the riskiest customers with a retention offer, how many should we call?β
Assumptions (edit them in the code): a saved customer is worth $300, each call plus offer costs $25, and an offer saves 35% of customers who would otherwise leave.
Show the code
import numpy as np, pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
rng = np.random.default_rng(10)
n = 10_000
df = pd.DataFrame({
"tenure_months": rng.integers(1, 72, n),
"monthly_charge": rng.normal(70, 25, n).clip(15, 150),
"support_calls": rng.poisson(1.5, n),
"month_to_month": rng.binomial(1, 0.55, n),
})
logit = -1.2 - 0.04 * df.tenure_months + 0.012 * df.monthly_charge + 0.35 * df.support_calls + 1.1 * df.month_to_month
df["churn"] = rng.binomial(1, 1 / (1 + np.exp(-logit)))
X, y = df.drop(columns="churn"), df.churn
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.5, random_state=0)
p = LogisticRegression(max_iter=1000).fit(Xtr, ytr).predict_proba(Xte)[:, 1]
auc = roc_auc_score(yte, p)
VALUE, COST, SAVE = 300, 25, 0.35
order = np.argsort(-p)
churners = yte.values[order]
k = np.arange(1, len(order) + 1)
profit = SAVE * VALUE * np.cumsum(churners) - COST * k
best = int(np.argmax(profit))
share = k / len(k) * 100
fig = go.Figure()
fig.add_scatter(x=share, y=profit, line=dict(color=COLORS["teal"], width=3.5), name="Profit")
fig.add_scatter(x=[share[best]], y=[profit[best]], mode="markers+text", marker=dict(size=14, color=COLORS["amber"]),
text=[f"best: contact top {share[best]:.0f}%"], textposition="top right", name="Best")
fig.add_hline(y=0, line_dash="dash", line_color=COLORS["slate"])
fig.update_layout(height=380, xaxis_title="% of customers contacted (riskiest first)", yaxis_title="Campaign profit ($)", showlegend=False)
fig.show(config=PLOTLY_CONFIG)The model has an AUC of 0.76, but the useful answer is: contact the riskiest 62% of customers for a simulated profit of about $81,015 on this group, while contacting everyone would earn $60,325. That one chart is what a manager remembers. π‘
π All eight paths at a glance
| Use case | Baseline first | Then try | Watch out for |
|---|---|---|---|
| π Churn | Logistic regression | Gradient boosting | Leakage from βcancellationβ fields |
| π¦ Forecasting | Seasonal naive (same week last year) | LightGBM with lags | Random splits on time data |
| π³ Fraud | Rules + logistic regression | Gradient boosting | Accuracy on 99.8% legit data |
| βοΈ Maintenance | Threshold on one sensor | Random forest, LSTM | Engines split across train and test |
| π§© Segmentation | RFM quantile buckets | k-means, GMM | Segments nobody can act on |
| π« Ticket triage | Keyword rules | TF-IDF + linear, transformer | Personal data in text |
| π Inspection | Pre-trained CNN features | Anomaly detection | Lighting changes on the line |
| π Recommendations | Most popular items | Matrix factorisation | Popularity bias, cold start |
Importantβ οΈ Always beat a simple baseline first
If gradient boosting cannot clearly beat βsame week last yearβ or βmost popular itemsβ, the problem is in the data or the framing, not the model.
π§© Summary
- Learn by problem, not by tool: pick one use case and follow its six stages.
- Each path has an open dataset, a model metric and a business KPI; report all three.
- Start with a simple baseline, then improve.
- Translate model output into money or time saved, as in the churn profit curve.
- Next: keep the cheat sheets π open while you work.