✱ Data analytics project

Kafaat sales analytics

10.04MTotal sales (SAR)
3.77MTotal profit (SAR)
37.5%Profit margin
1,992Deals · Jun 2004 – Jun 2006
✱ Interactive dashboard

Explore the data

Filter by date, city, rep, store or product, or upload your own CSV / Excel file. Hover any chart for details.

🔒 Files are analyzed in your browser and never uploaded to any server.
✱ Key insights

What the Kafaat data says

Five findings, each with the evidence, why it matters and what to do.

21.4%

One deal in five earns almost nothing

Evidence
Margins sit on 10 fixed pricing tiers (6.5% to 63%). 427 deals are below 15%: 20.9% of sales but only 5.1% of profit.
Impact
The biggest profit lever in the data: the same sales effort earns 5–10× less.
Action
Require manager approval below a 25% margin. Lifting these deals to 25% adds +332K SAR (+8.8%) profit with no extra sales.
36.8%

Carrefour: biggest store, lowest margin

Evidence
26.1% of sales, but the lowest margin, and 24.8% of its deals are below 15% (Panda: 19.2%, 38.4% margin). Panda earns the same profit on 114K less sales.
Impact
Volume is hiding discount leakage at the largest account.
Action
Review Carrefour pricing terms using Panda as the benchmark: ≈ +42K SAR.
39.6%

Riyadh leads on profit, not Dammam

Evidence
Dammam sells most (1.86M) but Riyadh earns most (709K at 39.6%). Riyadh × Office is the top cell (554K). Hail sells least; Abha has the lowest margin (Toys 32.6%).
Impact
Ranking cities by sales alone rewards discounting.
Action
Rank cities by profit; replicate Riyadh's Office playbook in Hail and review Toys pricing in Abha.
24.4%

Pricing discipline differs by rep

Evidence
Yahia leads sales (2.17M) and profit (831K). 24.4% of Maliha's deals are below 15% vs 18.0% for Ghalia (best margin, 38.6%). Abdul is lowest on sales and margin.
Impact
Maliha at Ghalia's margin ≈ +43K SAR.
Action
Pay commission on profit, not revenue; coach on negotiation; track "% deals below 15%" monthly per rep.
−0.65%

Flat sales, noisy months

Evidence
Year 2 vs Year 1: 5.00M vs 5.03M. Full months swing 324K–502K. December is strong both years; November and February are weak. Best model (Random Forest): ≈13% error, R² 0.13.
Impact
No growth, and a single-number monthly plan is risky.
Action
Plan in a range (≈365K–465K / month; June 2006 forecast ≈ 414K), push campaigns before December, support November and February.
+16%

Thursday is the busiest day

Evidence
Thursday sales 1.63M vs ≈1.40M on other days. Saturday has the best margin (40.8%).
Impact
Demand is concentrated before the weekend.
Action
Schedule rep visits and promotions for Wednesday–Thursday.
01

Discount guardrail

No deal below a 25% margin without approval. Up to +332K SAR profit over two years, starting with Carrefour, Maliha and Abdul.

02

Measure profit, not sales

Rep commission and city/store targets based on profit and margin, tracked monthly on this dashboard.

03

Targeted growth plan

Sales are flat: copy Riyadh's Office success to Hail and Abha, use the December peak, and lift November and February.

✱ Method

From raw CSV to decisions

01 · Cleaning

1,998 → 1,992 rows

Excel serial dates converted; spaces and commas stripped; 2 blank costs, 1 cost of 50,000,000 and 3 dates years away from the rest removed; name typos fixed. 01_clean.py

02 · EDA

Sales, profit, margin

By city, rep, store, product, month and weekday; city × product matrix; discovery of the 10 fixed margin tiers. 02_eda.py

03 · Visualization

7 charts

Matplotlib / Seaborn charts plus this interactive dashboard. 03_visualization.py

04 · Forecast

Linear Regression vs Random Forest

City-month model with lags and seasonality, time-based split, naive baseline. RF: MAE ≈ 50K, MAPE 13.4%. 04_ml_model.py

05 · Cloud

BigQuery + Looker Studio

SAFE_CAST cleaning, DATE_ADD date conversion, window functions and a BigQuery ML ARIMA_PLUS forecast. sql/

06 · Dashboard

Your data, your browser

This page re-applies the same cleaning rules to any uploaded file, entirely client-side. site/app.js

PythonPandasMatplotlibSeabornscikit-learnBigQuery SQLBigQuery MLLooker StudioStreamlitJavaScript