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 itR² (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
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
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
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
| Issue | Count | Fix Applied |
|---|---|---|
| Promotional noise in property names (Flash Deal X% off!) | ~15 | Regex 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) | 3 | Mapped to Guest House / Self Catering |
| Rating field 99.7% empty | 1,010 | Excluded from ML; documented as data gap in ebook |
| Price outliers > R20,000 per night | ~3 | Nulled + flagged price_outlier_flag=TRUE |
| Duplicate property_id records | ~50 | Deduplicated on property_id; kept first occurrence |
| Reviewer names leaked into location field | 2 | Detected '- 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