Data analyst portfolio

Five data problems,
worked end to end.

I'm a data analyst who works across the full pipeline — raw files and SQL at one end, a dashboard someone actually opens at the other. SQL, PostgreSQL, Excel, Python, Databricks, Alteryx, Power BI and Tableau, applied to payment fraud controls, drug shortages, retail revenue, lending risk, and inventory data.

Noida, India · Open to relocation · Available to join immediately

Curious by nature. Analytical by training.

I graduated with a B.Tech in Computer Science in 2023 and I'm building my career in data analytics. I like connecting the technical work — cleaning data, writing queries, building models — to the actual business question it needs to answer.

I currently hold a contract role at Innodata evaluating AI-generated dashboards, charts and reports for accuracy — which has made me considerably more careful about the details in my own work.

I'm HackerRank certified in SQL (Advanced), Python (Basic) and R (Intermediate), with 5-star Gold badges in SQL and Python — verify on HackerRank.

I'm looking for a Data Analyst, BI Analyst, Tableau or Power BI Developer, or risk and data-assurance analytics role where I can contribute with SQL, Python, Excel, Tableau, Power BI and reporting that people actually use.

Explore my GitHub
Open to full-time and contract roles · Immediate joiner
  • 01

    Start with the business question

    Define what matters, who needs the answer, and which metrics will help.

  • 02

    Make the numbers trustworthy

    Validate the data, document assumptions, and reconcile results across tools.

  • 03

    Make the insight usable

    Build clear dashboards and explain the decisions the analysis can support.

What I work with

Pulled straight from the tools actually used across the five projects below — nothing listed here that isn't demonstrated in a repo.

Languages & querying

Python Pandas & NumPy PostgreSQL SQL Server (T-SQL) MySQL Snowflake SQL Databricks SQL & PySpark DAX

BI, visualization & tools

Power BI (row-level security, star schema) Tableau (LOD expressions, data blending) Tableau Cloud (publishing & permissions) Power Query Excel (PivotTables, XLOOKUP, scoring models) Google Sheets (QUERY, FILTER, pivot tables) PowerPoint Alteryx Designer Jupyter Notebook Git & GitHub

Data engineering

Databricks medallion pipeline (Bronze/Silver/Gold) Snowflake warehousing (RAW/STAGING/ANALYTICS) SQL Server → MySQL migration Data-quality remediation Cross-tool reconciliation (SQL ↔ Alteryx, Tableau ↔ Snowflake) Pseudonymization (salted hashing) PostgreSQL design (keys, CHECK constraints) Roles, backup & restore, audit triggers

Applied methods

RFM segmentation Cohort retention analysis Fraud control testing (precision / recall) Classification models (scikit-learn) Time-series forecasting Local GenAI classification (Ollama / Qwen3:4B) LLM extraction accuracy check Hypothesis testing (Fisher's exact test)

Risk & data assurance · Databricks, SQL, Alteryx, Python, Power BI

Payment Transaction Controls & Fraud Risk Analytics

Can this payment data be trusted, how well do simple rule-based controls catch fraud, and does a model add anything the rules miss? Using the public PaySim synthetic mobile-money dataset (6,362,620 transactions, 8,213 of them fraud), I built the full trail: a reconciled cloud pipeline, data-assurance checks, five tested controls, and a leakage-aware model comparison.

6.36M
Transactions reconciled from source file through Bronze, Silver and Gold with zero difference
70.46%
Precision of the best control, against a 0.13% baseline fraud rate
1.57%
Fraud share in receiver-balance exceptions — about 12× the baseline
100%
Random-forest precision, treated as data leakage rather than a result
Power BI Control Effectiveness page comparing transactions flagged with frauds caught for controls C1 to C5, plus the C1 threshold trade-off
Control Effectiveness — flagged vs. caught, precision and recall per control
Power BI Data Assurance page showing exception volume by check and each check's fraud share against the 0.13% baseline
Data Assurance — exception volume vs. fraud share by check
Power BI Model and Forecast page with a confusion matrix, model versus control comparison, and forecast back-test
Model & Forecast — rules vs. models, and the hourly fraud-count forecast back-test
Alteryx Designer workflow rebuilding controls C1 and C2 for reconciliation with the SQL results
Alteryx — two controls rebuilt independently and matched to SQL exactly

What this shows

  • Built a Databricks Bronze → Silver → Gold pipeline, hashed account IDs with a salted SHA-256 in Silver, and reconciled row count, total amount and fraud count across every layer.
  • Ran six data-assurance checks and logged exceptions instead of deleting rows. Two checks failed on 56.6% of transactions with almost no fraud (a simulator artifact), while receiver-balance mismatches carried a 1.57% fraud share — about 12× the baseline.
  • Tested five rule-based controls for precision and recall: two caught about half of all fraud at 65–70% precision, while one caught 97.55% of fraud at only 0.67% precision. Rebuilt two controls in Alteryx and matched the SQL counts exactly.
  • Trained logistic regression and a random forest on a time-based split and flagged the forest's perfect score as leakage from PaySim's balance logic. Re-testing the controls on the same test window changed the story: the two best rules reached 100% and 98.65% precision against 52.16% for logistic regression, but caught only about half the fraud the models did (97%+). The real trade-off is recall, not precision.
  • Hand-reviewed a stratified sample of 25 flagged transactions in an Excel control-testing workpaper (7 were fraud, all from the two strongest rules), and back-tested an hourly fraud-count forecast: regression beat a seasonal baseline, MAE 4.38 vs 5.92.
  • Wrote a one-page research memo on rules vs. machine learning, drawing on RBI's FAQ on the fraud risk management directions and its FREE-AI report (August 2025).

What I'd recommend: Keep the two strongest rules as primary controls, retire or redesign the rule that flagged 2.49M transactions for 45 frauds, and use logistic regression to prioritize alerts instead of the leaky random forest.

Healthcare data · PostgreSQL, Google Sheets, Excel, Python, local GenAI

FDA Drug Shortage Analysis

Which US drugs are in shortage, for how long, and can the data behind the answer be trusted? Using the FDA Drug Shortages list (1,605 records, public domain), I analysed it in Google Sheets, rebuilt it as a PostgreSQL database run like a small production system, tested how accurately a local AI model reads the list's free-text notes, and wrote an oncology brief that adds FDA's NDC Directory.

69
Drugs in current shortage, across 1,141 product records
4.9 yrs
Median time a current shortage has been on the FDA list
23
Database data-quality checks; all 15 headline totals match the Sheets analysis
57 / 60
Recovery dates the local LLM extracted correctly, checked against rule-based labels
Chart of drugs in current shortage by therapeutic area, with Pediatric the most widely affected
Therapeutic areas — Pediatric medicines are the most widely affected (17 of 69 drugs)
Google Sheets comparison of Qwen3 extractions against rule-based reference labels
AI extraction check — Qwen3 4B against rule-based labels, every disagreement reviewed
psql output of the post-refresh checks, all passing
PostgreSQL — checks after applying a newer FDA download, every change logged by an audit trigger
Excel model output ranking oncology drugs in shortage under the market entry view
Oncology brief — Excel scoring model with adjustable weights and two views

What this shows

  • Cleaned the FDA list with formulas in a separate tab so the raw import was never edited, counted distinct drugs as well as product records, and logged every check. Counting records alone would have hidden that Pediatric medicines are the most widely affected area.
  • Built a normalised PostgreSQL database: 6 tables with primary and foreign keys, CHECK rules and a natural-key UNIQUE constraint. PostgreSQL refused the raw file over blank lines and 4 unescaped inch marks that Google Sheets had accepted, so a script writes a corrected copy for loading.
  • Ran 23 logged data-quality checks, set up a read-only analyst role limited to four reporting views, tested indexes with EXPLAIN ANALYZE, and verified a pg_dump backup by restoring it and comparing a checksum of every record.
  • Applied a newer FDA download in one transaction with an audit trigger: 39 records updated, 2 deleted, and the database matched the new file exactly afterwards.
  • Tested a local LLM (Qwen3 4B via Ollama) on 60 sampled notes: 57 of 60 recovery dates matched. A format check caught two broken dates, but only the comparison with a reference caught the date it missed.
  • Ran Fisher's exact test at the drug level: pediatric drugs are not significantly more likely to have a fully unavailable product (p = 0.27).
  • Built an oncology brief combining the shortage list with 216 marketed products from FDA's NDC Directory, in an Excel model with adjustable weights. Flurazepam, a sleep medicine tagged Oncology by FDA, was kept in the data but excluded from scoring.

What I'd recommend: Shortlist streptozocin and pentostatin, which have no generic supplier, for a feasibility study; in crowded markets such as carboplatin, compete on reliable supply rather than entry; and re-run the screen monthly as the list changes.

Retail analytics · Python, Snowflake, Tableau (LOD, data blending, Cloud), local GenAI

Customer Revenue & Retention Analytics

Using the public UCI Online Retail II dataset from a UK-based online retailer, I asked which customers actually drive revenue, how much cancellations cost, and whether first-time buyers come back. The project analyzes 1,033,036 cleaned transactions from December 2009 through December 2011 to answer it.

1.03M
Cleaned transactions analyzed
£19.6M
Gross merchandise sales
72.35%
Of known customers are repeat buyers
96.74%
Of identified-customer sales came from repeat customers
Tableau Revenue Overview dashboard showing gross sales, net revenue, invoice count, and monthly revenue trend
Revenue Overview — Tableau, built on the Snowflake ANALYTICS views
Tableau Retention Overview dashboard showing cohort retention heatmap and segment revenue contribution
Retention Overview — cohort heatmap and segment contribution
Tableau dashboard of customer segments using FIXED, INCLUDE and EXCLUDE LOD expressions and a data blend that reconciles segment revenue shares with the Snowflake mart
Customer Segments — FIXED, INCLUDE & EXCLUDE LOD + a data blend reconciled against Snowflake

What this shows

  • Built a 3-layer Snowflake warehouse — RAW, STAGING, ANALYTICS — and reconciled row counts and revenue totals across every layer before building a single dashboard.
  • Combined two overlapping source files (1,067,371 rows), removed 34,335 duplicates, and flagged a suspected £38,970 entry error instead of deleting it.
  • Ran RFM segmentation on 5,852 identified customers; the "Champions" segment is 24.74% of them but generates 74.04% of identified-customer net revenue.
  • Added a segment dashboard using all three LOD types: FIXED for revenue share and a country benchmark, INCLUDE for revenue per country, and EXCLUDE for UK share. High-Value Active is the only segment that earns most of its revenue outside the UK (54.30%).
  • Blended the Python RFM table with the Snowflake segment mart in Tableau to reconcile revenue shares; every segment matched within 0.05 percentage points, the rounding in the export.
  • Published the workbook to a Tableau Cloud developer site with Analyst and Viewer groups and locked project permissions, denied data downloads for viewers, and tested it by signing in as the viewer.
  • Built monthly cohort retention curves — retention drops sharply after month 1, then stabilizes near 20–23% through month 12.
  • Classified 4,725 products into 12 categories using a locally-hosted LLM (Qwen3:4B via Ollama), so no transaction data left the machine and no paid API was needed.
  • Summarised the findings and recommendations in a 7-slide PowerPoint deck with native charts and speaker notes.

What I'd recommend: Weight retention effort toward Champions, test a follow-up within 30 days of the first order, and start capturing cancellation reason codes.

Credit risk analytics · Power BI, Power Query, DAX, row-level security

Loan Default Risk Analysis

A single blended default rate hides where the risk is. Using a public Kaggle loan-default dataset (via a Udemy course, with an added loan-date column), this dashboard asks which borrower segments carry the most risk and how much loan value that risk represents, breaking down 255,347 loans by credit score, income, employment, interest rate, and dependent status.

255,347
Loans in the portfolio
11.61%
Overall default rate
19.71%
Default rate, Young Adult borrowers — the highest segment
13.15%
Share of loan value in default, vs. 11.61% by loan count
Executive Overview page showing portfolio size, default performance, and annual default-rate trend
Executive Overview — portfolio size and default trend
Default Risk Drivers page analyzing default rate by credit score, income, and interest rate segments
Default Risk Drivers — with a field-parameter toggle
Financial Exposure page comparing total loan exposure with defaulted amount share by loan purpose
Financial Exposure — exposure by loan purpose, with a decomposition tree
Portfolio Trends page tracking monthly loan amount, monthly default rate, and year-over-year change
Portfolio Trends — YTD and YoY time-intelligence measures (the source dates are synthetic, so this shows the measures, not real lending trends)
Loan Purpose Comparison page with a table of share, default rate, gap to portfolio and risk rank, and a bar chart of each purpose's gap to the portfolio
Loan Purpose Comparison — gap to the portfolio and risk rank, with a takeaway sentence written by a DAX measure
The comparison page viewed as a test user under the Purpose Managers role, showing only Auto and Education loans
Dynamic row-level security, tested with View as — a manager assigned Auto and Education sees only those, and the totals and sentence recalculate

What this shows

  • Modeled a star schema (date and loan-purpose dimensions), a centralized measures table, and time-intelligence DAX (YTD, YoY) rather than relying on flat aggregates.
  • Added static and dynamic row-level security (USERPRINCIPALNAME with a security table) and tested both roles in Power BI Desktop with View as. The report is not published to the Power BI Service, which needs a work account.
  • Compared loan purposes with ALLSELECTED, REMOVEFILTERS and RANKX measures, plus a measure that writes the page's takeaway sentence, so it stays correct when slicers or security change what a user sees.
  • Built a field-parameter so one visual pivots between co-signer, mortgage, and dependent status without duplicating pages.
  • Used a decomposition tree so a viewer can investigate defaulted exposure by any borrower characteristic themselves.
  • Separated default rate (by loan count) from defaulted amount share (by loan value): 11.61% vs 13.15%, so counting loans alone understates the value at risk.
  • Caught a wrong denominator in my own first version (each group's defaults divided by all loans), rebuilt it as one reusable default-rate measure, and checked every KPI against the source data.

What I'd recommend: Size exposure by loan value, not only by count, and test tighter approval criteria or risk-based pricing for the highest-risk segments.

Inventory analytics · SQL Server, MySQL, Power BI

Inventory Demand & Supply Analysis

Before this could be a Power BI story, it was a data-trust problem: could the inventory data even be relied on? The project validates the data first, simulates a reporting migration from SQL Server to MySQL, then quantifies exactly where shortages are costing revenue.

79.97%
Demand fulfillment rate
$97.37K
Revenue at risk from unfulfilled demand
81.82%
Of inventory records show some shortage (81 of 99)
2
Mismatched product IDs caught, escalated, and corrected pre-report
Inventory Overview page showing total demand, available inventory, unfulfilled demand, and fulfillment rate
Inventory Overview — demand vs. availability over time
Financial Impact page showing potential demand value, fulfilled demand value, and revenue at risk
Financial Impact — potential vs. fulfilled demand value
Product Analysis page with a conditional-formatted matrix of demand, inventory, fulfillment rate, and revenue at risk by product
Product Analysis — conditional-formatted, product-level detail

What this shows

  • In a simulated production environment, caught a referential data-quality issue — two product IDs that didn't exist in the product master — and followed a documented detect → investigate → escalate → confirm → correct → validate workflow before touching the report.
  • Simulated a migration of the reporting pipeline from SQL Server to MySQL, reapplied every data-quality correction, and re-validated that the numbers still matched.
  • Modeled fulfillment rate, revenue at risk, and value fulfillment rate as DAX measures, not simple row counts.
  • Showed that the products with the highest unfulfilled demand aren't always the ones with the highest revenue at risk — shortage quantity and financial exposure need to be prioritized separately.

What I'd recommend: Set reorder points for the top 10 products by revenue at risk, and track demand and value fulfillment together as paired KPIs.

Compare the work

The same skill set applied five different ways — a cloud risk-and-controls pipeline, a PostgreSQL database built around public health data, cloud warehousing plus Tableau, the Microsoft BI stack, and a migration bridging both.

Click a project name to isolate what it actually used.

Skill / technique Fraud Controls Drug Shortages Revenue & Retention Loan Default Risk Inventory
Python & Pandas✓✓✓——
SQL (Databricks / Snowflake / SQL Server / MySQL / PostgreSQL)✓✓✓—✓
Power BI & DAX✓——✓✓
Power BI row-level security & star schema———✓—
Tableau✓—✓——
Tableau LOD expressions & data blending——✓——
Tableau Cloud publishing & permissions——✓——
Cloud data warehousing (layered / medallion)✓—✓——
Database migration————✓
Local GenAI / LLM classification & extraction—✓✓——
RFM & cohort retention analysis——✓——
Data-quality remediation (simulated production)————✓
Excel workpaper✓————
Databricks & PySpark✓————
Alteryx✓————
Control testing & data assurance✓————
Machine learning (scikit-learn)✓————
Time-series forecasting✓————
PostgreSQL design, roles, backup & audit trail—✓———
Google Sheets analysis & Excel scoring model—✓———
Hypothesis testing—✓———

At a glance

ProjectBusiness questionDatasetPrimary toolHeadline result
Payment Fraud Controls Can the data be trusted, and do the fraud controls work? PaySim (public, synthetic) · 6,362,620 transactions, 8,213 frauds Databricks + SQL + Alteryx Best control reached 70.46% precision against a 0.13% baseline; a perfect-scoring model was flagged as leakage, not reported as a win
FDA Drug Shortages Which drugs are short, for how long, and can the data and an AI model be trusted? FDA Drug Shortages list (public) · 1,605 records; FDA NDC Directory for the oncology brief PostgreSQL + Google Sheets + Excel 69 drugs in current shortage, median 4.9 years on the list; the local LLM matched 57 of 60 recovery dates
Revenue & Retention Who drives revenue, and who comes back? UCI Online Retail II (public) · 1,033,036 transactions, 5,852 customers Snowflake + Tableau 72.35% of identified customers are repeat buyers, driving 96.74% of identified-customer sales
Loan Default Risk Which borrower segments actually carry default risk? Public loan dataset · 255,347 loans Power BI + DAX 11.61% default rate overall, up to 19.71% in the riskiest segment
Inventory Demand & Supply Where does unmet demand become a business risk? 99 product-level inventory records SQL Server → MySQL + Power BI $97.37K in revenue at risk identified down to the SKU
Back to top