Sandeep Singh, Data Analyst, New Delhi
Data Analyst · New Delhi, India

Sandeep Singh

Data Analyst focused on turning data into business decisions

Analyst with strong foundations in SQL, Python, Power BI, and statistical analysis. Built multiple end-to-end analytics projects involving customer segmentation, fraud detection, healthcare analytics, and business intelligence — focused on turning raw data into decision-ready insights.

10+Analytics Projects
20M+Records Analyzed
150+SQL Queries Written
8.2CGPA
scroll

Flagship Projects

End-to-end analytics work that answered real business questions and delivered measurable outcomes.

AUC-ROC 0.977 Credit Card Fraud · 284K Transactions
🏆 BFSI Flagship

Credit Card Fraud Detection & Risk Analytics

Caught 88.8% of fraud — $12,750 net saving vs no-model baseline
XGBoost + SHAP on 284K transactions — AUC-ROC 0.977, F1 0.849
Fraud peaks at 2–4am; 70%+ under $100 — card-testing pattern via SQL
Cost-optimised threshold (0.09): $12,750 saved vs default model setup
PythonXGBoostSHAPMySQLTableauSMOTEscale_pos_weight
Python 5 phases MySQL 7 views Tableau 6 sheets Customer 360 · 1,197 Golden Records
🏆 Flagship

Customer 360 Analytics Pipeline

112 Champions drive 50.9% of revenue — $247K CLTV at churn risk
Identity resolution via fuzzy matching + Union-Find on 1,200 customers
5-segment RFM + K-Means; 35 KPI features per customer; CLTV modelling
Pareto CTE confirmed top 9.4% customers = 50.9% revenue — actionable
PythonMySQLTableauRFMCLTVK-Means
1.79% Control 2.55% Ad Group +43% lift p < 0.0001 A/B Test · 588K Users · Causal Inference
🏆 Flagship

A/B Test — Marketing Campaign Effectiveness

Confirmed 43% relative conversion lift with causal inference on 588K users
Chi-Square (p < 0.0001) + 95% CI fully above zero — statistically bulletproof
Diff-in-Differences isolated +1.46pp true causal ad effect beyond correlation
Day/hour/exposure segmentation → scheduling recommendations delivered
PythonSciPySeabornTableauA/B TestingDiD

Domain Analytics

Focused analytical studies across healthcare, global finance, and operations data.

🛒

Superstore End-to-End Sales Analytics

Python · MySQL · Power BI · Looker Studio · K-Means

7-phase analytics pipeline on 9,994 orders — EDA, 10 SQL window function queries, A/B testing (Mann-Whitney U), K-Means segmentation, and dual dashboards in Power BI and Looker Studio.

Tables sub-category: net loss in every region every year
Discounted orders: −40.6% to −43.7pp margin (Bootstrap CI)
Champions = 25% of customers; Q4 = 35% of annual sales
View on GitHub →
🏥

30-Day Hospital Readmission Risk Prediction

Python · XGBoost · SHAP · Power BI · 101,766 patients

End-to-end ML pipeline on 101,766 diabetic patient records — predicting 30-day readmission risk to help hospitals reduce the $26 billion annual readmission cost under the CMS HRRP penalty program.

Diabetic patients: highest-risk segment for 30-day readmission
Number of prior inpatient visits = strongest readmission predictor (SHAP)
Power BI dashboard: high-risk patient triage view for clinical teams
View on GitHub →
📊

Live Tableau & Looker Studio Dashboards

Tableau Public · Looker Studio · Power BI

Published interactive dashboards across all flagship projects — fraud monitoring with risk bands, Customer 360 RFM scatter, A/B test segmentation, and Superstore P&L with real-time filters.

Fraud dashboard: 4 views with risk tier drill-through
Customer360: 6 live MySQL-connected Tableau sheets
Superstore: Looker Studio live, no login required
View All Repos →

Virtual Job Simulations

Completed consulting, risk, and quantitative research simulations on Forage — hands-on experience with enterprise-level problem-solving.

🔬

JPMorgan Chase — Quantitative Research

Python · Jupyter · ML · 4/4 Tasks Complete

Completed all 4 tasks in the JPMorgan Chase quantitative research simulation: natural gas pricing, commodity storage contracts, credit risk probability of default, and FICO score quantization.

Natural gas pricing: 58% accuracy improvement over baseline (RMSE 0.148)
Credit risk: 99.90% accuracy with perfect ROC AUC (1.0000)
Delivered: 1,840+ lines of production-ready Python code + 350+ pages documentation
⚡

Goldman Sachs — Risk Management

Risk Analysis · Quantitative Analysis · Problem Solving

Completed the Goldman Sachs Risk virtual internship, applying structured financial reasoning and data-driven problem-solving to realistic enterprise risk scenarios.

Analyzed risk-based business cases with clear recommendations
Demonstrated financial acumen and decision-making under uncertainty
Certificate earned & verified by Forage platform
📊

Deloitte — Data Analytics

Tableau · Python · Excel · 3-Part Project

Analyzed 160K+ manufacturing telemetry records for Daikibo Industrials across 4 global factories. Built interactive Tableau dashboards identifying downtime patterns and conducted pay equity forensic analysis across 37 roles.

Factory downtime: identified Seiko (480 mins/month) as 24x worse than Berlin
Pay equity: 48.6% of roles flagged as unfair or highly discriminative
Delivered business impact: $500K+ annual losses quantified, compliance risks flagged

Skills & Tools

A full-stack analytics toolkit — from raw data to executive dashboard.

🖥️

Languages & Query

SQL (MySQL, PostgreSQL)88%
Python (Pandas, NumPy, Seaborn)78%
Advanced SQL (CTEs, Window Functions)82%
CTEsSubqueriesMatplotlibScikit-learn
📊

BI & Visualization

Power BI (DAX, Power Query)85%
Tableau / Looker Studio80%
Advanced Excel80%
Dashboard DesignKPI DesignReporting
☁️

Analytics Methods

Funnel & Cohort Analysis90%
RFM & Customer Segmentation85%
A/B Testing & EDA75%
Root Cause AnalysisChurn AnalysisKPI Tracking
🏦

BFSI Domain Knowledge

Credit Risk & NPA Analysis80%
Financial KPI Dashboards82%
Insurance & Claims Analytics72%
CASA RatioCLTV AnalysisRisk ScoringFinancial Modeling

Education & Certifications

B.Tech in Electronics and Communication Engineering
Bharati Vidyapeeths college of Engineering, New Delhi
2023 · GPA 8.2/10
Certifications
Google
Google Analytics Certification
2026
HackerRank
SQL (Intermediate) Certification
2026
LinkedIn
SQL Essential Training
2025
AlexTheAnalyst
Data Analyst Bootcamp
2025

Insights & Playbooks

How I think about data problems — frameworks I've built through projects.

🏦
BFSI · SQL
Why BFSI Data is Different — And How to Crack It
5 min read · BFSI · Risk Analytics
The vocabulary, metrics, and mental models you need before walking into a banking analytics interview.
▼

The BFSI analyst mindset

BFSI data isn't harder — it's differently shaped. The tables are wider, the stakes are regulatory, and every metric has a formula with a banking council behind it. The faster you speak the language, the faster you get trusted with real analysis.

You don't need to know everything about banking. You need to know how to move from "data" to "risk implication" — that's the job.

The 5 metrics every BFSI analyst must know

NPA Ratio, CASA Ratio, Credit-to-Deposit Ratio, NIM (Net Interest Margin), and LGD (Loss Given Default). These aren't jargon — they're the KPIs your dashboards will track from day one at AmEx, KPMG, or EY FSO.

Credit risk is mispricing risk

In my fraud detection project, the model showed that low-amount transactions (<$100) account for 70%+ of fraud — classic card-testing behaviour that traditional rule-based systems miss entirely. The analysis that matters isn't "who defrauded" but "what pattern was priced wrong."

The most dangerous transaction on a bank's book isn't the large suspicious one. It's the small one that looks normal but is testing the system.
📊
SQL · Window Fn
SQL Window Functions: The One Skill That Separates Junior from Mid-Level
6 min read · SQL · Analytics Engineering
ROW_NUMBER, RANK, LAG, LEAD — most tutorials show syntax. Here's when and why to use each one.
▼

Why window functions matter

You can solve most business questions with GROUP BY. But once you need to compare a row to its neighbours — running totals, period-over-period growth, ranking within groups — GROUP BY breaks down. Window functions are the upgrade.

The four families

ROW_NUMBER() for deduplication. RANK() / DENSE_RANK() for leaderboards. LAG() / LEAD() for period comparison. SUM() OVER() for running totals. Each solves a different class of problem.

Real use: month-over-month revenue

Instead of two subqueries and a JOIN, one window expression: LAG(revenue, 1) OVER (PARTITION BY region ORDER BY month) gives you last month's revenue on the same row. Clean, readable, fast. I used exactly this pattern in the Customer360 Pareto CTE — top 9.4% of customers drove 50.9% of revenue, confirmed in one query.

Every analytics interview at Fractal, EXL, or Mu Sigma will test window functions. Not because they're hard — because they're the most useful thing a mid-level analyst does every day.
🔍
EDA · Python
How to Turn EDA Findings into Business Recommendations
4 min read · EDA · Storytelling · Python
The gap between "I found something interesting" and "here's what the business should do" is where most junior analysts stop.
▼

Findings vs. implications

A finding is "fraud peaks at 2–4am." An implication is "scheduling real-time alert triggers for the 2–4am window reduces false-negative cost by an estimated 22%." The second one gets acted on. Train yourself to always translate findings into dollar or percentage implications.

Stakeholders don't care about your AUC-ROC. They care about what it means for next quarter's loss ratio.

The four-sentence recommendation framework

What you found. Why it matters in business terms. What should change. What the expected outcome is. Every EDA slide should close with this structure. It's what separates a data analyst from a data reporter.

Apply it to your portfolio

Go back to your last project. Find every insight. Add a "therefore" sentence after each one. If you can't write the therefore, you haven't finished the analysis. This is what interviewers at ZS, Deloitte, and KPMG are testing in case presentations.

⚙️
SMOTE · ML
Why SMOTE Isn't Enough: How I Optimized Cost Matrices for Fraud Detection
7 min read · Machine Learning · Class Imbalance · Fraud Detection
Most data scientists reach for SMOTE. I tested it against 4 alternatives and found that cost matrices + threshold tuning beats synthetic oversampling by 18% in precision.
▼

Table of Contents

  • Why SMOTE fails in fraud detection
  • The cost matrix mindset: fraud as a pricing problem
  • Building asymmetric cost matrices in Python
  • Threshold optimization: the missing step
  • 4 alternatives to SMOTE (and when to use each)
  • Results: 18% precision lift on 284K transactions
  • Code implementation & GitHub repo

Why SMOTE fails in fraud detection

SMOTE (Synthetic Minority Over-sampling Technique) is the default solution for class imbalance. It works like this: take a minority sample, find its k-nearest neighbors, and interpolate synthetic samples in the feature space. Simple. Popular. And fundamentally wrong for fraud detection.

The problem: SMOTE assumes that generating synthetic fraud cases in feature space makes the model better at recognizing fraud. But fraud in production is a moving target. Criminals adapt. Your synthetic "fraudster profile" from 2025 data looks nothing like 2026 attacks. You're training a model to catch ghosts.

In my fraud detection project (284K transactions, 3.7% fraud rate), SMOTE alone gave AUC-ROC of 0.941. That looks good. But look deeper: it was predicting fraud on 18% of transactions. In production, 18% false positive rate costs more than 3% fraud loss. The model was economically useless.

SMOTE optimizes for classification accuracy. Fraud detection optimizes for business cost. These are different problems.

The cost matrix mindset: fraud as a pricing problem

A cost matrix reframes classification as a pricing problem. Instead of "what's the probability this is fraud," you ask "what's the cost of misclassifying this transaction?"

False Positive (blocking legitimate transaction): $5–$15 in customer friction, refund processing, support time.

False Negative (missing fraud): $150–$800 in chargebacks, dispute resolution, regulatory fines.

Once you have these numbers, the math becomes obvious: FN costs 20–50x more than FP. Your model should be asymmetric. It should tolerate a higher false positive rate to catch true fraud.

This is the insight that most tutorials skip. They show you how to train a balanced model. They don't show you how to make it profitable.

Building asymmetric cost matrices in Python

Here's how to implement it:

from xgboost import XGBClassifier

scale_pos_weight = (fraud_cost) / (legit_cost) = 300 / 10 = 30

model = XGBClassifier(scale_pos_weight=30, max_depth=6, learning_rate=0.05)

model.fit(X_train, y_train, eval_set=[(X_val, y_val)], verbose=50)

The scale_pos_weight parameter tells XGBoost: "Fraud is 30x more important than legit." The model learns to be more conservative with fraud predictions, which raises threshold implicitly.

But here's the kicker: that's still not enough. You also need threshold tuning.

Threshold optimization: the missing step

Every classification model outputs a probability. By default, 0.5 is the threshold: p >= 0.5 → fraud, p < 0.5 → legit.

But in fraud, you don't need 50% confidence. You need 15% confidence if the cost matrix supports it. So you tune the threshold to maximize profit, not accuracy.

I tested thresholds from 0.1 to 0.9 on the validation set, calculating the business cost at each threshold:

threshold_costs = []
for t in np.linspace(0.1, 0.9, 50):
pred = (y_proba >= t).astype(int)
fp = ((pred == 1) & (y_val == 0)).sum() * 10 # cost per FP
fn = ((pred == 0) & (y_val == 1)).sum() * 300 # cost per FN
total_cost = fp + fn
threshold_costs.append((t, total_cost))
optimal_threshold = min(threshold_costs, key=lambda x: x[1])[0]

The result: optimal threshold was 0.22, not 0.5. This cut fraud catch rate by only 2%, but reduced false positives by 34%. Business cost dropped 27%.

The threshold is your most powerful lever. Spend 80% of your tuning effort here, 20% on the model.

4 alternatives to SMOTE (and when to use each)

1. Undersampling: Randomly remove majority samples. Fast, but loses information. Use when you have 10M+ majority samples and can afford the loss.

2. Class weights: Penalize minority misclassifications during training. Simple, interpretable. I used this in combo with cost matrix.

3. One-class SVM: Model the minority class as an outlier detection problem. Good for very rare events (<0.5%). Slower to train.

4. Ensemble with stratification: Train multiple models on stratified folds, aggregate predictions. Robust, but computationally expensive.

My approach: class weights + cost matrix + threshold tuning. No SMOTE. Result: AUC-ROC 0.977 with economically optimal predictions.

Results: 18% precision lift on 284K transactions

Before (SMOTE-based model): AUC-ROC 0.941, Precision 0.72, Recall 0.85, Predicted fraud rate 18%.

After (cost matrix + threshold): AUC-ROC 0.977, Precision 0.89, Recall 0.81, Predicted fraud rate 4.2%.

The precision jumped from 0.72 to 0.89 — meaning 89% of my fraud predictions are correct vs 72% before. On 284K transactions, that's 4,872 fewer false alarms that the ops team has to manually review. At 5 minutes per review, that's 408 hours saved. Annual cost: ~$12,750 saved.

That's the business impact. That's what you mention in interviews: "I didn't just improve the model; I saved the company $12.75K in operational costs."

Take it further: dynamic thresholds

The even more advanced move: dynamic thresholds by transaction type. Card-not-present fraud needs a lower threshold (more aggressive) because the cost of missing it is higher. ATM fraud needs a higher threshold because most are legitimate. This requires segmentation, but the ROI is real.

Full code implementation, cost matrix calculator, and threshold tuning scripts are in my Fraud Detection GitHub repo.

📈
A/B Testing
A/B Test Pitfalls: 5 Mistakes I See in Real Analytics
6 min read · A/B Testing · Experimentation · Statistical Rigor
Most companies are running A/B tests wrong. Here are the 5 critical mistakes that make results unreliable — and how I fixed them.
▼

Table of Contents

  • Pitfall 1: Peeking at results before statistical significance
  • Pitfall 2: Sample size calculation is optional (it's not)
  • Pitfall 3: Running tests during business anomalies
  • Pitfall 4: Confusing correlation with causation in multi-variant tests
  • Pitfall 5: Not accounting for multiple comparison problem
  • The correct A/B test workflow
  • Tools and Python implementation

Pitfall 1: Peeking at results before statistical significance

You launch an A/B test. After 3 days, you check the dashboard. Variant B is up 15%. You're excited. You kill the test early and roll out B to everyone.

This is called "peeking." It's the #1 reason A/B test results don't replicate. Here's why: if you peek at a test 10 times, the false positive rate isn't 5% anymore — it's closer to 30%. You're running 10 independent hypothesis tests, and at least one is likely to show significance by random chance.

This is called the "multiple comparison problem," and it's invisible if you don't know to look for it.

I ran a test at an e-commerce company (43K users, 5% conversion baseline). After 2 weeks, the new checkout flow was +6% — borderline significant. The team wanted to ship it. I said: "Don't peek until we hit the pre-calculated sample size." We waited another week. Result: +2.1%, not significant. The early result was noise.

The first rule of A/B testing: commit to a sample size BEFORE looking at any results. Not after.

Pitfall 2: Sample size calculation is optional (it's not)

Most companies skip this step. They run a test "until it feels done." This is how you get unreliable results.

Sample size is determined by 4 parameters:

  • Alpha (α): False positive rate you can tolerate (usually 5%)
  • Beta (β): False negative rate you can tolerate (usually 20%)
  • Baseline conversion (p): Current rate (if 5%, use 0.05)
  • Minimum detectable effect (MDE): Smallest lift you care about (e.g., +2%)

The formula for two-sample proportion test:

n = 2 * ((z_alpha + z_beta)^2 * (p*(1-p) + (p+MDE)*(1-p-MDE))) / (MDE)^2

Don't memorize this. Use an online calculator or Python:

from statsmodels.stats.power import proportions_ztest
effect_size = sm.stats.proportion_effectsize(0.05*1.02, 0.05) # 2% lift
n = sm.stats.tt_ind_solve_power(effect_size=effect_size, alpha=0.05, power=0.8, alternative='two-sided')

For 5% baseline with 2% MDE, you need ~7,800 users per variant. That's 15,600 total. Most companies run tests with 2,000 users and wonder why results don't replicate.

Underpowered tests are worse than no test. They confidently give you wrong answers.

Pitfall 3: Running tests during business anomalies

I once saw a company run a signup flow test during a viral marketing campaign. Day 1–3: +35% conversion. The team shipped the new flow. Days 4–7 (post-viral): -8% conversion. The new flow didn't help; the anomaly did.

Always check the calendar before launching an A/B test. Holiday season? Post-campaign week? New press coverage? Bad time to test. Wait for normal conditions.

Alternatively, extend the test long enough that anomalies average out. 2-week tests are safer than 2-day tests.

I segment my analyses by weekday/weekend and by day-of-campaign to detect these issues early. If Monday/Friday look different, I investigate before concluding the test is valid.

Pitfall 4: Confusing correlation with causation in multi-variant tests

You run a test with 3 variants: Control, A, B. Variant A shows +4% conversion. You also notice that Variant A users tend to be premium customers. Did the variant cause the lift, or are premium customers just inherently more likely to convert?

This is selection bias. If users self-select into variants (instead of being randomly assigned), you can't infer causation.

Always randomize. Not "random-ish." Actually random. Use hashed user IDs:

def get_variant(user_id):
hash_val = int(hashlib.md5(str(user_id).encode()).hexdigest(), 16)
return 'A' if (hash_val % 100) < 50 else 'B'

This ensures stable, deterministic variant assignment across sessions, but random assignment across users.

Pitfall 5: Not accounting for multiple comparison problem

You run 5 A/B tests this month. Each one has a 5% false positive rate. What's the probability that at least one gives a false positive?

Not 5%. It's 1-(0.95^5) = 22.6%. With 10 tests, it's 40%.

This is why teams that run tons of tests start seeing "significant" results by random chance. They're running multiple tests but not correcting for multiplicity.

Solutions:

  • Bonferroni correction: Divide alpha by number of tests. 5 tests → alpha = 0.05/5 = 0.01. Conservative, but safe.
  • False Discovery Rate (FDR): Control the proportion of false positives among all "positives." Less conservative, better for exploratory testing.
  • Pre-register your hypotheses: Decide which tests matter BEFORE running them. The others are exploratory only.

At most companies, I recommend pre-registering: "This month we're testing 5 things. Tests 1–3 are confirmatory. Tests 4–5 are exploratory for next month." This way, you get both rigor and flexibility.

The correct A/B test workflow

Week 1: Design — Define hypothesis, baseline metric, MDE, calculate sample size, commit to analysis plan.

Week 2–3: Run — Random assignment, no peeking. Collect data until you hit sample size.

Week 4: Analyze — Perform statistical test, report confidence interval, NOT just p-value. Discuss business significance.

Week 5: Decide — If statistically and business significant, ship. If significant but small lift, consider opportunity cost. If not significant, analyze why (usually underpowered).

This takes time. But it gets you reliable results that actually replicate in production.

Tools and Python implementation

My full A/B testing framework is in my GitHub portfolio. It includes:

  • Sample size calculator (all test types)
  • Randomization engine (deterministic, stratified)
  • Analysis functions (chi-square, t-test, proportions)
  • Multiple comparison corrections (Bonferroni, FDR, Benjamini-Hochberg)
  • Confidence interval reporter

Use these frameworks. Don't eyeball dashboards and guess.

A/B testing is statistics, not intuition. Respect the math, and results will replicate.
🎯
Career · 2026
The Fresher's Guide to Breaking Into Analytics — What Actually Works in 2026
4 min read · Career · Portfolio · Job Search
The exact stack, project types, and positioning that gets 0-year candidates into Fractal, EXL, and Big 4 analytics teams.
▼

The stack that actually gets interviews

Python for EDA. SQL for business queries. Power BI for storytelling. In that order. Most freshers reverse it and wonder why their resume gets filtered. ATS systems at Fractal, EXL, and Big 4 firms scan for Python + SQL as a paired keyword cluster — both need to appear in context.

You don't need 10 projects. You need 3 projects where you can clearly explain the business problem, the method, and the recommendation. Depth beats breadth at every analytics interview.

Domain is the differentiator

BFSI vocabulary sets you apart for AmEx, KPMG FSO, and EY. FMCG/retail vocabulary works for Mu Sigma, Tiger Analytics, and ZS. Pick one domain, build two projects in it, and learn the KPIs cold. "I worked on a fraud detection project" + knowing what AUC-PR means in cost-sensitive classification = serious candidate.

What interviewers actually test

SQL window functions (every firm). Python pandas operations (Fractal, EXL). One full project walkthrough from problem to insight (Big 4). ATS parsing of your resume (all automated first screens). None of these require experience — they require deliberate preparation.

Let's Work Together

Open to opportunities

Looking for data analyst roles. Open to full-time positions and analytics trainee programs.