LekkeSlaap Market Analysis · BigQuery · GA4 · Machine Learning · 2026
BIGQUERY + GA4

Platform KPIs

1,011 Properties Scraped
R2,002 Avg Nightly Price (ZAR)
R1,380 Median Nightly Price
30,000 GA4 Sessions
107 Confirmed Bookings
0.36% Booking Conversion Rate
41.8% Bounce Rate
80s Avg Engagement Time
78.6% POPIA Consent Rate

ML Model Performance

This grouped bar chart compares model performance metrics side by side. How to read it (regression): 1.0 = perfect, 0 = no better than guessing the mean. F1 (classification): 1.0 = perfect recall and precision. AUC (binary): 0.5 = random chance, 1.0 = perfect ranking. All models trained on synthetic data — treat metrics as directional, not production benchmarks.
Model 1: Price Regression (GBR)
R² = 0.1726
Gradient Boosting · Features: Listing Type, Region, City, Reviews
MAE = R1066.66 per night
Model 2: Tier Classifier (RF)
Acc = 0.397
Random Forest · 4 Classes: Budget / Mid-Range / Premium / Luxury
5-fold cross-validated
Model 3: Demand Scorer (GBR)
R² = 0.9606
Composite demand score (0–100) · normalised review_count × tier weight
Used for featured-listing ranking

Market Intelligence

Price Tier Distribution

Listings by Accommodation Type

Top Regions by Listing Count

GA4 Sessions by Traffic Source

Booking Conversion Funnel

Confirmed Bookings by Province

Dirty Data Audit — Issues Found & Fixed

IssueCountFix Applied
Promotional noise in property names (Flash Deal X% off!)~15Regex removed promo prefix; original name preserved
Prices formatted as 'R1 700' (space in thousands)~600+Stripped spaces after 'R'; converted to numeric float
Location with duplicated suburb ('X, X City')~500+Regex collapsed 'Suburb, Suburb City' → 'Suburb, City'
Non-standard listing types (LodgingBusiness)3Mapped to Guest House / Self Catering
Rating field 99.7% empty1,010Excluded from ML; documented as data gap in ebook
Price outliers > R20,000 per night~3Nulled + flagged price_outlier_flag=TRUE
Duplicate property_id records~50Deduplicated on property_id; kept first occurrence
Reviewer names leaked into location field2Detected '- Reviewer Name' pattern; set location to NULL

BigQuery ETL Architecture (Free Tier)

Free ETL Options in BigQuery

  • bq load — Free CSV/JSON/Parquet loading from local or GCS
  • GA4 → BigQuery Export — Free daily automatic export (enable in GA4 Admin)
  • Data Transfer Service — Free for BQ↔BQ and supported connectors
  • Scheduled Queries — Free within 1 TB/month on-demand query quota
  • Dataform — Free SQL-based ELT transformations inside BigQuery (dbt-like)
  • BigQuery Omni — Query data across AWS S3 / Azure Blob without moving it
  • Storage Write API — Free for DML; pay only for storage (R0.0165/GB/month SA)

Star Schema: accommodation_intelligence dataset

  • dim_property — 1,013 unique listings · Clustered: listing_type, price_tier
  • dim_region — 18 SA regions + Namibia
  • fact_listings — Scraped snapshot · Partitioned: scraped_date
  • fact_web_sessions — 30,000 GA4-schema sessions · Partitioned: event_date
  • fact_booking_events — Booking funnel events · Partitioned: event_date
  • ml_predictions — Price + tier + demand predictions from 3 ML models
  • Location: africa-south1 (Johannesburg) — lowest latency for SA users
Metric Glossary
Demand Score — Composite 0–100: booking-event frequency (40%) + review count (30%) + promo activity (30%). Platform average ≈ 6.
Price per Night — Nightly rate in South African Rand (ZAR / R) as listed on LekkeSlaap.co.za at time of scrape (June 2026).
Price Tier — Budget = under R800. Mid-Range = R800–R1,500. Premium = R1,500–R3,000. Luxury = above R3,000.
GA4 Sessions — Synthetic web sessions generated to mirror real LekkeSlaap traffic patterns. Not live data.
ML Cluster — K-Means group (k=4) based on price, demand, reviews, listing count. Used to segment regions for targeting.
ROAS — Return on Ad Spend. ROAS of 3× means every R1 spent on ads generates R3 in bookings. Break-even = 1×.
Price–Demand r — Pearson correlation coefficient. Global r = -0.279 means cheaper properties tend to get more bookings (weak negative relationship).
Pearson r range — r near 0 = no relationship. r = -1 = perfect inverse. r = +1 = perfect positive. Magnitude matters more than direction.