Work

What I have actually built

The open-source projects, then the live dashboards. Employer case studies are temporarily offline — see the note below.

On the employer case studies. The write-ups for my current role are down for now while I get sign-off to publish project detail publicly. They will be back once that is sorted, and I am glad to walk through any of it directly in the meantime. The open-source and personal work below is unaffected.

Personal project · open data

Context
Personal project
Role
Sole author
Stack
Python, pandas, scikit-learn, Power BI
Data
Västtrafik open data

Where a tram network actually jams

The question

Public transport operators know when a service is late. It is harder to say where a network is structurally congested — which stops and time bands consistently absorb delay, as opposed to being unlucky on a particular Tuesday.

The approach

  • Västtrafik open data for the Gothenburg region, cleaned and reshaped into stop-level observations across time bands
  • Unsupervised clustering with k-means and DBSCAN, used together deliberately: k-means for structured groupings, DBSCAN because the interesting cases are often the ones that refuse to join a cluster
  • A composite congestion score, so results are comparable across stops rather than only interpretable within one
  • A published Power BI dashboard, because analysis that ends as a PDF gets read once

See it

Open the live dashboard

DBSCAN earns its place here precisely because it is allowed to say “this one belongs nowhere”.

Open projects

Code and reports you can read

Personal and academic projects, every one of them open on GitHub with the written report where there is one. They are studies rather than products, and they are here because reading someone's code and their write-up tells you more than a skills list does.

Customer churn & retention in banking

Logistic regression on complaint and retention behaviour, with the statistical work to check whether the regional differences were real. Written up as a full analysis report.

PythonLogistic regressionStatistics

New York yellow-taxi demand

Descriptive and predictive analysis of demand, peak periods and fare revenue — including what a record blizzard does to a demand model. Linear, polynomial and random-forest regression compared.

PythonRegressionRandom forest

Garment factory productivity

Production performance across departments and seasons, working through outliers, missing values and input errors to something a plant manager could act on.

PythonEDAData quality

Fake-news detection with BERT

Group project on classifying article legitimacy. BERT performed best, but generalised poorly to unseen datasets — which turned out to be the more interesting finding.

NLPBERTTransformers

Modular imputer — strategy & factory patterns

A custom imputer where the imputation strategy (mean, mode, median) is swappable at runtime. An exercise in design patterns applied to something genuinely useful.

PythonOOPDesign patterns

CPU scheduling simulator

FIFO, shortest-job-first, priority and round-robin scheduling implemented side by side, so the trade-offs between average wait and context-switch overhead are visible rather than asserted.

PythonOperating systemsAlgorithms

Bank prototype — object-oriented design

A teaching prototype demonstrating encapsulation, inheritance, polymorphism and abstraction on a domain where getting the abstractions wrong is expensive.

PythonOOPUML

Live

Dashboards you can click

Four published Power BI reports — the congestion model, plus a retail analysis and two visualisation studies from 2024. They are embedded and public, so you can filter and drill rather than take my word for it.

Open the dashboards

A long pier stretching out to sea at sunset

Next step

Want the version with the numbers in it?

Most of what is generalised above has a concrete story behind it. I am glad to walk through any of it — what worked, what did not, and what I would do differently.