Web scraping and SQL analysis of 315 phone listings from Jumia Nigeria ; covering pricing trends, brand market share, discount patterns, and value-for-money insights.
# 📱 Jumia Nigeria Phones - Web Scraping & SQL Analysis
---
## 📂 Project Overview
This project scrapes phone listings from Jumia Nigeria, cleans the data with Python/Pandas, and performs structured SQL analysis to uncover pricing trends, brand dominance, discount patterns, and value-for-money insights in the Nigerian mobile phone market.
---
## Data Source
- **Website**: Jumia Nigeria — Electronics > Phones
- **Scrape Date**: 23rd February, 2026
- **Pages Scraped**: 9 pages in a single function
- **Raw Records**: 360 rows
- **Clean Records**: 315 rows
- **Unique Brands**: 31
---
## 📃 Data Collection
Scraped 9 pages of phone listings from Jumia Nigeria using Python. All 9 pages were scraped in a single function call.
The raw dataset contained the following columns:
| Column | Description |
| --------------| ------------- |
| Today | Date of scrape |
| Title | Full product listing title |
| Brand |Phone brand name |
| Price | Current selling price (₦) |
| Old Price | Original price before discount (₦) |
| Rating | Average customer rating (out of 5) |
| Reviews | Number of verified customer reviews |
---
## 🧹 Data Cleaning
All cleaning was done in Python using Pandas. Key steps:
**Brand Column**
- Rows where the brand field contained review text (e.g. "98 verified ratings") instead of a brand name were identified and replaced with NaN
- Brands that could be identified from the product title were filled in using a keyword mapping dictionary
- Non-phone products (phone holders, washing machine pads, screen magnifiers, car mounts) that were scraped by mistake were dropped
- Final null brand rows were dropped.
**Price & Old Price**
- Removed the ₦ symbol and commas
- For listings with price ranges (e.g. 3500 - ₦ 12500), extracted only the price after the ₦ symbol
- Converted string 'nan' values to proper NaN using pd.to_numeric(errors='coerce')
- 74 missing Old Price values were filled with the current Price (indicating no discount)
- Converted both columns to i …