About Experience Skills Projects Contact

Based in India - Open to International & India Opportunities

Priyanshu Singh

Data Analyst

I work with messy sales and inventory data until it's clean enough to trust, then build the dashboards that explain what's actually going on. Lately that's meant pharmaceutical distribution records and a 1,115-store German retail dataset - SQL, Python, and a lot of double-checking before anything goes in front of a stakeholder.

SQL · Python · Power BI · PostgreSQL
Priyanshu Singh
Scroll

Projects

What I've actually built

Seven projects, each built to answer a real business question rather than to produce a chart. The Rossmann project below is the one I'd walk you through first.

Featured case study

Rossmann Performance Insights

844,338 sales records across 1,115 German drugstore locations, structured around 8 business questions a retail analytics team would actually get asked - not a Kaggle leaderboard exercise.

PostgreSQLPythonPower BIDAX
0% Avg promo-day lift
0 Stores below portfolio avg
0% Higher sales near competitors
0 Stores analyzed
Rossmann Power BI dashboard - Executive Summary page

Business problem

Regional leadership wanted to know which stores were quietly underperforming, whether promotions were worth the spend, whether nearby competitors were actually hurting revenue, and which stores deserved the next round of investment. Four separate questions, one dataset.

Dataset

1,017,209 raw daily store records, January 2013 through July 2015, across 1,115 stores. 844,338 remained after removing closed-store days. Public on Kaggle, but I treated it as a live business problem rather than a leaderboard submission.

My role

Solo, start to finish - data cleaning in Python, 15 analytical SQL queries in PostgreSQL, and a 4-page Power BI dashboard with 14 DAX measures.

Methodology

Window functions carried most of the analysis: NTILE for quartile ranking, LAG/LEAD for period-over-period comparisons, PERCENT_RANK and PERCENTILE_CONT for benchmarking, STDDEV for Z-score anomaly detection. Expansion candidates were scored on a weighted composite - 30% revenue, 35% YoY growth, 20% promo responsiveness, 15% basket size.

Two mistakes I caught before presenting anything

The Sunday problem

Raw day-of-week averages made Sunday look like the worst day in the chain, around €2,100. Only 33 of 1,115 stores actually trade on Sundays - comparing 33 stores to the full chain on every other day isn't a fair comparison. Once isolated, those 33 stores average €8,224, almost exactly matching Monday's chain-wide €8,216. Monday is the real best day.

The 2015 partial-year problem

Comparing raw annual totals, 2015 looked like a 36% collapse from 2014 - €1.39B vs €2.18B. But the 2015 data stops in July: seven months against twelve. Switched the comparison to average daily sales per store instead, and 2015 was actually up 9.7% year over year.

anomaly_detection.sql - Z-score flagging, PostgreSQL
WITH store_stats AS (
  SELECT store, AVG(sales) AS mean_sales, STDDEV(sales) AS std_sales
  FROM rossmann_sales
  WHERE open = 1
  GROUP BY store
),
daily_zscore AS (
  SELECT s.store, s.date, s.sales,
         ROUND((s.sales - st.mean_sales) / NULLIF(st.std_sales, 0), 3) AS z_score
  FROM rossmann_sales s
  JOIN store_stats st ON s.store = st.store
  WHERE s.open = 1
)
SELECT store, COUNT(*) FILTER (WHERE ABS(z_score) > 3) AS extreme_anomaly_days
FROM daily_zscore
GROUP BY store
HAVING COUNT(*) FILTER (WHERE ABS(z_score) > 3) > 5
ORDER BY extreme_anomaly_days DESC;

Key findings

  • Promotions lift daily sales 39% on average, but Type a stores respond at 43% vs. 18% for Type b - even promo budget spread across store types is leaving money on the table.
  • Stores within 500m of a competitor average €7,611/day vs. €6,677 for stores 500m–1km out. High-competition zones are usually high-footfall zones too.
  • December runs about 30% above the annual average every year - staffing and inventory planned off annual averages will miss both the peak and the trough.

Business impact / recommendations

  • Reallocate promo spend toward Type a and assortment-c stores, which respond hardest to promotions.
  • Prioritize Type b store openings - highest basket size (€11.3) and fastest YoY growth (6.48%).
  • Target high-footfall competitive zones for new sites instead of avoiding them.
  • Review the bottom 630 stores for assortment upgrades before committing CapEx.

Challenges

The promo lift figure doesn't control for seasonality - a December promo isn't the same as a July one, and the 39% figure is a portfolio average across all months. Type b's numbers rest on only 17 stores, a real signal but not a statistically confident one for a capital decision.

Lessons learned

Running a query and reporting the output isn't the job - checking whether the output makes sense is. Both corrections above came from asking "does this number make sense given what I know about the business" before it went anywhere near a dashboard.

Case study

Predictive Analytics for Sales Forecasting

213,328 records from 1,623 regional insurance agencies across six US states, 2005–2015. Built and compared three forecasting models to answer one question: can historical agency performance actually predict next year's written premium?

PythonScikit-learnProphetSQLitePower BI
0% Variance explained (Random Forest)
0% R² improvement over linear baseline
0 Agencies, 6 states
0% Portfolio concentrated in Ohio

Business problem

Regional insurers mostly forecast written premium off manual year-over-year projections - no accounting for loss ratios, retention, or new business trends. Get it wrong in either direction and the cost is real: over-forecast and you buy reinsurance you didn't need; under-forecast and you're short-staffed when claims spike. The project builds and compares models that forecast premium from financial indicators instead of guesswork.

Dataset

213,328 raw records, 49 columns, 1,623 agencies across Ohio, Pennsylvania, Kentucky, Indiana, West Virginia and Michigan, 2005–2015. After removing the partial 2015 year, filtering out negative premium (policy cancellations, not sales), and cleaning sentinel values, 147,760 records remained across 16 columns.

My role

Solo, end to end - EDA and cleaning in Python, three predictive models in Scikit-learn and Prophet, a SQLite layer for aggregate queries, and a 3-page Power BI dashboard.

Methodology

Linear Regression as an interpretable baseline, Random Forest (100 trees) as the primary model, and Facebook Prophet for the portfolio-level time series. The skewed target (mean $19,632, median $1,143) was log-transformed before training; sentinel 99999 placeholders were imputed with the column median rather than the mean, since a few genuine outliers would have dragged the mean somewhere no real agency actually sits.

Two things I caught before trusting the numbers

The data leakage I almost missed

Earned premium showed a correlation of r = 1.00 with written premium in the correlation matrix - a suspiciously perfect number. It wasn't a predictive signal, it was two columns measuring nearly the same thing. Left in, it would have let the model "cheat" and made every accuracy number meaningless. Dropped from the feature set before any model was trained.

Why Prophet's R² looks broken (it isn't)

Prophet's R² came out at −8.29, which looks like a broken model. It's a math artifact: the time-series test set was only two points (2013, 2014), and R² is unstable at that sample size. Judged the right way - did it predict the correct trend, did the actual values fall inside its confidence interval - Prophet did its job on both years. The metric was misleading; the chart wasn't.

annual_premium_summary.sql - SQLite
SELECT
    STAT_PROFILE_DATE_YEAR AS Year,
    COUNT(*) AS Total_Records,
    ROUND(SUM(WRTN_PREM_AMT), 2) AS Total_Written_Premium,
    ROUND(AVG(WRTN_PREM_AMT), 2) AS Avg_Premium_Per_Record,
    ROUND(SUM(NB_WRTN_PREM_AMT), 2) AS Total_New_Business_Premium
FROM insurance_sales
GROUP BY STAT_PROFILE_DATE_YEAR
ORDER BY STAT_PROFILE_DATE_YEAR;

Key findings

  • Random Forest reached R² = 0.848 (MAE 0.505, RMSE 0.858 on log-transformed premium) - a 174% improvement over the Linear Regression baseline's R² = 0.309.
  • Feature importance ranked incurred losses first (0.35), ahead of new business premium (0.26) and YoY growth (0.15) - claims volume turned out to be a proxy for how large and active an agency's book of business is.
  • Commercial Lines grew 114% over the decade ($95.5M → $204.4M) while Personal Lines drifted down from a 2006 peak - a shift consistent enough across ten years to look deliberate rather than noise.

Business impact / recommendations

  • Use Random Forest for agency-level premium forecasts; use Prophet for portfolio-level trend and uncertainty bounds - different tools for different questions.
  • Ohio makes up 58% of total written premium ($2.45B) - flagged as a real concentration risk worth a diversification conversation at the strategic level.
  • Claims monitoring isn't just a loss-control function - given its position as the top predictor, it's an early signal for premium trajectory too.

Challenges

The dataset's own numbers pushed back on assumptions more than once - the leaked feature, the unstable time-series metric, a 17-agency Type-b-style sample-size problem elsewhere in a different project. None of these were fatal, but all of them needed catching before they reached a slide.

Lessons learned

A perfect correlation is a red flag, not a result. And an alarming-looking metric is worth investigating before it's discarded - Prophet's negative R² would have been an easy thing to quietly cut from the report; looking at why it happened turned it into a stronger project instead.

Market research

India Job Market Analysis 2024

59,669 real Naukri.com postings across 13 cities. Regex pulled salary ranges out of four inconsistent text formats before any of the SQL could run.

  • Delhi NCR pays highest at roughly ₹15 LPA average; Bangalore leads on volume with 20,000+ postings.
  • SQL and machine learning came out as the two most in-demand skills chain-wide.

Market research

Malaysia Job Market Analysis 2024

69,024 JobStreet postings across 26 industries, with salary data regex-extracted from 31,594 records.

  • Penang pays 32% more than Kuala Lumpur - RM 7,216 vs. RM 5,468 per month.
  • Interactive Power BI dashboard ranks industries by salary and demand using CTEs and RANK().

Global benchmarking

Global Data Salary Insights

Salary trends across data roles internationally, built on BigQuery to handle the scale.

  • Window functions in BigQuery to surface hiring hotspots by region and experience level.
  • Dashboard tracks how remote work shifts compensation benchmarks.

Research workflow

High-Energy Physics Data Analysis

Synthetic particle collision data built to mimic real detector output, analyzed with a research-style, reproducible workflow.

  • Cleaned unphysical values, missing measurements, and detector noise before any analysis ran.
  • Computed momentum magnitude and modeled detector resolution effects on energy readings.

Data engineering

Large-Scale Data Validation Pipeline

A cleaning and validation pipeline built for a dataset north of a million records - the unglamorous work behind every analysis on this page.

  • Automated checks for duplicates, missing values, referential integrity, and format inconsistencies.
  • Fully reproducible Jupyter workflow, fixed seeds throughout.
Priyanshu Singh
  • Based inGurugram, India
  • EducationMSc Data Science, 2026
  • GermanB1, actively learning
  • Looking forAnalyst roles in India & Germany

About

A bit about how I got here

I got into data analysis a little sideways. My undergrad was in computer applications, and it took some trial and error before I landed on data specifically. What made it stick was a fairly ordinary moment - watching a messy spreadsheet resolve into something a manager could actually act on. That part hasn't gotten old.

Most of the last year and a half has been the unglamorous side of the job: figuring out why two systems disagree on a number, catching duplicate records before they skew a KPI, deciding whether a spike is real or just a broken sensor. I've ended up liking that work more than I expected to - it's closer to detective work than people assume.

Germany is the specific target, not just "abroad." German companies have a reputation for methodical, rigorous analytics work, and that's the kind of environment I want to build a career in. I've been working on the language alongside the technical skills - B1 so far - because I'd rather not have that be the reason an application gets passed over.

The work I enjoy most has a real question attached to it, not just "explore this dataset." Something closer to "why does store 425 keep missing its targets." The Rossmann project above was built in that spirit, and it's the kind of problem I'd like to keep solving.

Experience

Where the work happened

Two roles, two training programs, one degree in progress. Laid out in order.

Aug 2025 - Feb 2026

Data Analyst · Contract

Ikvans Healthcare Pvt. Ltd.

  • Cleaned and analyzed 30,000+ pharmaceutical sales records in SQL and Excel to track demand across distribution cycles, flagging slow-moving inventory early enough for the team to act before it hit stock levels.
  • Built monthly sales and distributor performance reports, presented to management, covering territory performance and procurement trends.
  • Segmented products by sales velocity into fast- and slow-moving categories, feeding into pricing and inventory decisions.

Jan 2025 - Jul 2025

Data Analyst Intern

AAM Infotech Pvt. Ltd., Gurugram

  • Cleaned and validated datasets in Python (Pandas, Regex) and SQL across multiple sources - duplicate records, format mismatches, referential integrity issues.
  • Built Power BI dashboards for KPI tracking that cut roughly 4 hours of manual reporting per day.
  • Presented findings to the team and revised visuals based on manager feedback.

Aug 2024 - Jul 2026 (expected)

MSc, Data Science

Chandigarh University

Jul 2024 - Jul 2025

Data Analytics Training

Ducat IT Training School - Python, SQL, Power BI, Excel

2020 - 2023

Bachelor of Computer Applications

L.N. Mishra College of Business Management

Skills

What I actually work with

Grouped by what they're for, not alphabetized for show.

Programming

  • SQL - CTEs, Window Functions, Joins
  • Python - Pandas, NumPy, Regex
  • Scikit-learn, XGBoost

Databases

  • PostgreSQL
  • MySQL
  • Google BigQuery

Business Intelligence

  • Power BI - DAX, KPI Cards, Slicers, Drill-through
  • MS Excel - Advanced (pivots, lookups)

Analytics

  • Data Cleaning & Validation
  • Exploratory Data Analysis
  • Feature Engineering
  • Statistical Analysis

Machine Learning

  • Predictive Modeling
  • Regression Analysis
  • Random Forest
  • Model Evaluation

Tools

  • Git & GitHub
  • VS Code
  • Jupyter Notebook

Contact

Get in touch

Based in India, open to relocating for the right role - including visa sponsorship. Email is the most reliable way to reach me.