I'm a data analyst who turns messy, real-world data into dashboards people actually trust — across fraud, telecom, retail, and healthcare. Take a look around and see what I've been building.
Data Analyst with hands-on experience using SQL, Excel, Tableau, and Power BI to clean, analyze, and visualize real-world business data. I transform raw data into actionable business insights through interactive dashboards, business intelligence reporting, and analytical problem-solving.
"A dashboard is only as honest as the cleaning behind it."
My portfolio showcases practical experience across telecom analytics, fraud and risk analytics, sales analytics, and healthcare analytics, where I have applied data cleaning, SQL querying, dashboard development, and data visualization to solve business problems and support informed decision-making.
Tools I use daily, and the kind of thinking I apply with them.
A full workflow from raw transaction data to a fraud-monitoring dashboard: SQL cleaning, KPI design, and business recommendations.
Apex Trust Bank processes thousands of transactions across mobile, internet banking, ATM, POS, USSD and branch channels. Every channel that makes banking more convenient also opens another door for fraud. Management needed a way to monitor transactions continuously and spot suspicious activity early, rather than reviewing it after the fact.
The brief wasn't just "build a dashboard." It was to turn raw, uncleaned transaction records into something reliable enough for the bank to act on.
The dataset came in with the usual real-world problems: inconsistent text formatting, missing values in fields like merchant category and channel, transaction IDs that looked duplicated, and dates in mixed formats. Rather than deleting anything by default, each issue was investigated first.
-- Flag invalid ages as NULL rather than deleting the record UPDATE apex_bank SET customer_age = NULL WHERE age_flag = 'invalid_age'; -- Sanity-check the cleaned range SELECT MIN(customer_age), MAX(customer_age) FROM apex_bank WHERE customer_age IS NOT NULL; -- Catch inconsistent spacing before standardizing text fields SELECT DISTINCT customer_gender FROM apex_bank WHERE customer_gender != TRIM(customer_gender);
KPI cards sit at the top for a five-second read on bank health, with charts arranged to guide a reviewer from "how much fraud" down to "where, how, and when."
Card cloning and mule accounts lead fraud types — 34 and 24 cases respectively, well ahead of every other category.
Mobile App and Internet Banking are the leading channels for fraudulent transactions, pointing to where digital controls matter most.
Current accounts record the highest fraud cases, followed by domiciliary accounts.
Lagos and Abuja emerged as the highest fraud hotspots, useful for targeting regional monitoring.
Fraud incidents peaked in February and September — signal for seasonal or cyclical review windows.
Transfers and POS payments contribute the largest share of fraud cases by transaction type.
The real lesson from this project wasn't Tableau's chart library — it was patience with the cleaning stage. Every shortcut I was tempted to take (deleting the "duplicate" IDs, dropping rows with missing values) would have quietly distorted the fraud numbers downstream. Effective analytics isn't about a dashboard that looks good; it's about giving decision-makers a number they can trust enough to act on.
An Excel dashboard built to track how property leads move through the sales pipeline, from first contact to closed sale, across two branches.
Emerald Properties has six sales agents splitting leads across Residential, Commercial and Industrial listings in two branches. Management could see leads coming in, but they couldn't easily answer the questions that actually matter for running the sales team: which agents are converting, which property type is worth the marketing spend, and why so many leads stall out at "too expensive."
The brief was to build something the sales manager could open every month, filter by agent or branch, and get a straight read on performance without waiting on a manual report.
The raw lead log came in as a flat list — client ID, gender, sales agent, date given, sales status, state, property type and inspection outcome — with 778 rows across several months. Before anything went near a chart, I pulled it through Power Query to standardize it: consistent date formatting, trimmed text fields, and status values that matched exactly across the sheet (so "Paid" and "paid " didn't get counted as two different things).
Once the fields were clean, I loaded the query into the data model and built the dashboard on top of PivotTables, so every card and chart updates together when a slicer changes.
The dashboard opens on total leads, then lets the manager slice by sales person, sales status or state without touching a formula. Cards sit up top for the numbers that matter first — volume and conversion — with the breakdowns underneath.
Inspection drives conversion. Leads that went through a property inspection were far more likely to close — inspection is the single biggest lever the sales team has.
Industrial properties generate leads but no sales. 36 leads came in for Industrial listings and none converted, despite being the third-largest property type by volume.
Residential is carrying the branch. Nearly half of all leads (96 of 193) are Residential, and it's the strongest-converting category.
Male leads convert at a higher rate than female leads, even though female leads made up the larger share (104 vs. 89) — a gap worth investigating on the marketing side.
"Too expensive" is the top objection, cited by 50 leads — more than "not interested" and "next time" combined.
Lagos and Rivers are close to even (102 vs. 91 leads), so branch performance isn't the differentiator — agent and property type are.
This project was less about the dashboard and more about the plumbing underneath it. Getting six months of loosely-formatted lead entries into one query that actually matched on gender, status and property type consistently took longer than building every chart combined — and it's exactly the part that doesn't show up in the final screenshot. If that step is sloppy, every slicer on top of it is just filtering bad data faster.
An end-to-end breast cancer analytics project: SQL/MySQL was used to clean and validate the raw patient records, and Power BI was used to build the final analysis and dashboard.
Healthcare data can contain useful information about patient outcomes, treatment patterns, and resource use, but raw records are difficult to interpret without proper cleaning and visualization. This project transformed breast cancer patient data into an interactive dashboard to make key outcome, demographic, treatment, and insurance patterns easier to monitor.
The raw dataset contained 1,338 patient records across 16 fields. Work in MySQL Workbench covered exploring the raw data, inspecting the table structure, checking for duplicate records, validating patient IDs, checking for missing values, standardizing categorical and date fields, and preparing the insurance-paid figures for analysis. The final analytical dataset was reduced to 334 unique patient records across 9 analysis-ready fields, validated for completeness before moving into Power BI.
The original SQL script used during this workflow is no longer available, but the screenshot above shows the structured result of that cleaning process, ready for Power BI.
The dashboard opens on six KPI cards covering patient volume, survival, average age, and insurance cost, then breaks the data down by tumour stage, patient status, surgery type, and age group, with filters for surgery type, patient status, age group, tumour stage, and date of surgery.
334 patients were analyzed, with 255 recorded as Alive and 66 recorded as Dead.
The survival rate among patients with specified outcomes was 79.4% (255 Alive out of 255 Alive + 66 Dead).
Stage II was the largest tumour-stage category, accounting for 189 of 334 patients, ahead of Stage III (81) and Stage I (64).
Patients aged 50–59 represented the largest age group in the dataset.
"Other" was the most frequent surgery category with 105 procedures, followed by Modified Radical Mastectomy (96), Simple Mastectomy (67), and Lumpectomy (66).
Approximately ₦4.7 million in insurance payments were recorded across the analyzed patient records.
The findings here point to opportunities to monitor rather than firm conclusions — the dashboard highlights where Stage II diagnoses and the 50–59 age group concentrate, but it doesn't establish why, and it doesn't predict outcomes for any individual patient. As with the other projects in this portfolio, most of the real effort went into the SQL stage: getting 1,338 raw records with duplicates, inconsistent categories, and messy dates down to 334 validated, analysis-ready rows before a single visual was built in Power BI.
An end-to-end telecom analytics project: SQL/MySQL was used to clean and model the raw customer, activity, support, and campaign data, and Power BI was used to build a four-page churn & retention dashboard with a full DAX measure layer.
NexaTel Communications is a fictional Nigerian telecom operator built for this portfolio project to reflect realistic telecom market dynamics. The project follows the full analytics workflow — from raw, messy multi-table data through SQL cleaning to a four-page Power BI dashboard — covering customer churn, revenue impact, and retention campaign performance. It is intended as the flagship project in this portfolio, demonstrating data modeling, DAX measure design, and business-focused dashboard storytelling.
NexaTel is losing a significant share of its customer base to churn, which directly erodes revenue and increases the cost of acquiring replacement customers. Leadership needed a clear, data-driven view of who is churning, why they are churning, how much revenue is at stake, and whether the retention campaigns already running are actually working — so that retention budget could be focused on the segments and interventions with the best return.
The project uses a synthetic four-table relational dataset built specifically for this case study, grounded in Nigerian geography and realistic telecom pricing and usage patterns, totaling 400,000+ rows:
These four tables were linked together to support cross-table analysis of churn drivers, revenue impact, and campaign effectiveness.
All four tables were cleaned in MySQL Workbench before any visual was built in Power BI. Cleaning work included:
As with the other projects in this portfolio, this stage took up most of the effort — validating and reshaping four linked tables before they were analysis-ready in Power BI.
With MySQL Workbench, the cleaned tables were queried to validate row counts, check referential integrity across the four tables, and confirm that churn status, billing figures, and campaign outcomes were consistent before the data was loaded into Power BI.
-- Standardize casing and trim whitespace on categorical fields UPDATE customer_master SET customer_segment = TRIM(UPPER(customer_segment)), contract_type = TRIM(UPPER(contract_type)), internet_service = TRIM(UPPER(internet_service)); -- Remove duplicate customer records, keeping the first occurrence DELETE c1 FROM customer_master c1 INNER JOIN customer_master c2 WHERE c1.customer_id = c2.customer_id AND c1.row_id > c2.row_id;
In Power BI, the four cleaned tables were connected through a star-style model, with a dedicated Dim_Date table built for consistent time-intelligence across all four dashboard pages, and a standalone _Measures table used to hold every DAX measure separately from the data tables. Measures were built to cover churn rate, retention rate, revenue lost to churn, customer lifetime value (CLV), average revenue per user (ARPU), monthly recurring revenue (MRR), campaign success rate, and retention ROI.
The final dashboard is built across four pages — Executive Overview, Customer & Churn Drivers, Revenue & Customer Value, and Retention Campaign Performance — using a dark design system for readability and a consistent visual identity across the portfolio.
NexaTel has 15K customers, with 11K currently active and approximately 4K churned — a 25.41% churn rate and a 74.59% retention rate overall.
Churn is heavily concentrated among newer customers, reaching 82.77% within the first 6 months, compared with just 4.95% among customers with 25–36 months of tenure.
Month-to-month contracts churn the most at 46.8%, versus 30.04% for one-year and 23.16% for two-year contracts.
Unexpected billing charges and high monthly charges are the top two reported reasons for churn, ahead of switching to a cheaper competitor.
NexaTel has lost approximately $222.73K in revenue to churn, with the Consumer segment responsible for the largest share at about $162K.
Retention campaigns show a 42.92x return on the $198K spent, saving an estimated $8.72M in revenue and retaining roughly 7K customers, though success rates vary sharply by campaign type — from 47% for High Value Customer campaigns down to 29% for Win Back campaigns.
The result is a four-page, business-ready Power BI dashboard that gives NexaTel leadership a clear, at-a-glance view of churn, revenue impact, and retention campaign performance — grounded in a fully cleaned and modeled four-table dataset. It stands as the most complete end-to-end project in this portfolio, spanning raw multi-table data through SQL cleaning, Power BI data modeling, DAX measure design, and final dashboard delivery.
The full project write-up, cleaning documentation, SQL scripts, and Power BI file for this case study will be published to GitHub shortly.
GitHub repository — coming soonA capstone supply chain and e-commerce analytics project: SQL/MySQL was used to design, clean, and validate a nine-table relational dataset, and Tableau was used to build a three-page dashboard connecting profitability, inventory, supplier, and fulfilment performance for a modelled Nigerian e-commerce retailer.
VertaMart is a modelled Nigerian e-commerce retailer built for this portfolio project as its capstone case study. The project follows the full analytics workflow — from a nine-table relational schema through SQL cleaning to a three-page Tableau dashboard — connecting profitability, inventory, supplier, and fulfilment data that most retail dashboards report separately. It is intended as the most operationally complete project in this portfolio, demonstrating schema design, multi-table SQL cleaning, and cross-functional business analysis.
Is VertaMart actually capturing the profit its revenue suggests, or are operational issues across fulfilment, delivery, inventory, suppliers, and returns quietly working against reported performance? Most retail dashboards stop at revenue and order counts. This project connects the full operational chain back to profitability to answer that question for leadership.
The project uses a synthetic nine-table relational dataset designed specifically for this case study, modelling five distribution centres, nine departments, and 40 suppliers across three years, totaling 396,000+ rows:
These nine tables were linked together to support cross-table analysis of profitability, inventory health, supplier reliability, and fulfilment performance.
All nine tables were cleaned and validated in MySQL using an Identify → Investigate → Validate → Fix → Document workflow before any visual was built in Tableau. Cleaning work included:
The cleaned tables were joined and exported into a flat file for Tableau, with a separate pre-aggregated export built to support accurate inventory turnover calculations without row-level duplication from the join.
With MySQL, the cleaned tables were queried to validate stockout logic, standardize categorical fields, backfill missing dates from source data, and confirm the profit formula held across the order table before the data was exported for Tableau.
-- IDENTIFY: rows where closing_stock = 0 but stockout_flag was still 0 SELECT SUM(CASE WHEN closing_stock = 0 AND stockout_flag != 1 THEN 1 ELSE 0 END) AS stock_zero_flag_not_set FROM inventory_snapshots; -- FIX: set stockout_flag = 1 wherever closing_stock is 0 UPDATE inventory_snapshots SET stockout_flag = 1 WHERE closing_stock = 0 AND stockout_flag != 1;
In Tableau, the pre-joined dataset was used to build calculated fields, LOD expressions, and an interactive Year Selector parameter across three connected pages. The build includes custom 3D polygon bar charts, lollipop charts for lead time by supplier, and KPI tiles styled to a consistent navy-and-amber brand identity built for VertaMart.
The final dashboard is built across three pages — Operations & Profitability Overview, Inventory & Supply Performance, and Fulfilment & Returns — using a dark navy-and-amber design system for readability and a consistent visual identity across the portfolio.
Gross margin sits at 31.7%, with Port Harcourt DC leading all warehouses at 32.5% margin — but no single warehouse leads on both margin and delivery performance at once.
Delivery on-time performance is weak network-wide, ranging only from 75% (Ibadan) to 77% (Lagos, Abuja) — a narrow, consistently low band pointing to a shared process issue rather than one underperforming site.
Fulfilment Rate sits at 81.5%, meaning close to 1 in 5 orders were not successfully fulfilled — the biggest gap between what the business is capable of and what customers experience.
Inventory and supplier performance are current strengths: stockouts are rare network-wide (0.9%) and supplier on-time delivery is solid (83.4%) against a 12-day average lead time.
Ibadan DC is the one compounding risk site, carrying both the highest stockout rate in the network (1.7%) and the weakest delivery on-time rate (75%) at the same time.
High-profit categories carry above-average return rates — TVs & Audio (6.1%) and Laptops (7.0%) sit well above the 3.4% network average, meaning reported category profit may overstate what the business actually retains.
The result is a three-page, business-ready Tableau dashboard that gives VertaMart leadership a connected view of profitability, inventory, supplier, and fulfilment performance — grounded in a fully designed and cleaned nine-table dataset. As the capstone project in this portfolio, it spans schema design, multi-table SQL cleaning, Tableau dashboard development, and business analysis that ties operational execution back to the profit figures leadership cares about most.
The full project write-up, cleaning documentation, and SQL scripts for this case study are available on GitHub.
GitHub repository →A growing set of dashboard and analytics projects across telecom, fraud, sales, and healthcare data.
A three-page Tableau dashboard built on a nine-table, 396K+ row e-commerce and supply chain dataset — connecting profitability, inventory, supplier, and fulfilment performance.
View project →A four-page Power BI dashboard built on a four-table, 400K+ row telecom dataset — covering churn drivers, revenue impact, and retention campaign ROI.
View project →A full SQL-to-dashboard workflow analyzing 1,986 bank transactions to flag fraud patterns, risk scores, and regional hotspots.
View project →A lead-distribution dashboard tracking sales performance, client demographics, and inspection status for a property leads team.
View project →An end-to-end healthcare analytics project using SQL and Power BI to clean, validate, analyze, and visualize breast cancer patient outcomes, treatment patterns, and insurance expenditure.
View project →Formal training backing up the hands-on project work.
Excel, SQL, Tableau & Power BI
Skill Ahead AcademyOpen to remote data analyst, BI analyst, and freelance dashboard work. If you've got messy data and a decision to make, I'd like to hear about it.