From Apify to Tableau: Analysing Takealot Marketplace Data to Find Product Research Signals

If you wanted to start selling toys on Takealot, where would you begin?

You could browse the marketplace manually, look at what appears popular, and make an educated guess about what might sell. Marketplace data gives you another starting point.

Which price ranges contain the most products? Which listings have accumulated the most reviews? Are highly rated products concentrated within particular price ranges? Which brands appear frequently, and where might there be gaps worth investigating?

These are some of the questions I explored while completing a data analytics project using product data collected from Takealot.

As part of the Google Data Analytics Professional Course’s Capstone project, I analysed a sample of 108 Toys listings and followed the data through the full analytical process, from web scraping and cleaning to SQL analysis, Python exploration and Tableau visualisation.

The workflow ran like this:

  1. Apify for data
  2. Google Sheets for cleaning, sorting and validation
  3. BigQuery SQL for validation and analysis
  4. Python via Google Colab for further validation and analysis
  5. Tableau for sorting, visualisation and storytelling

The goal was never to identify a guaranteed winning product.

The dataset contains no sales, profit or conversion data, so it cannot answer that question.

What I wanted to see was how publicly visible marketplace information could be used to spot patterns and support better product research.

Step 1: Collecting marketplace data with Apify

I started by collecting product listing data from Takealot using Apify. The dataset included product titles, brands, current prices, ratings, review counts, delivery information and stock indicators.

My first Toys export taught me something useful about web-scraped data: collecting data does not automatically mean collecting good data.

An earlier export appeared to contain hundreds of records. When I looked closer, the scrape had crawled the same result pages more than once. After correcting the pagination configuration and running the scrape again, I was left with 108 unique product listings.

That changed how I thought about the cleaning process.

Removing the duplicates would have made the spreadsheet look clean, but it would not have addressed why they existed in the first place.

The better fix was to understand the collection error and correct the scrape itself. I then checked the pagination structure again to confirm the corrected run had captured the intended products.

Step 2: Cleaning the data in Google Sheets

The raw export contained far more information than the analysis needed.

The Toys file, for example, carried a long list of image gallery URL columns. Those might matter for a different type of project, but they said nothing about pricing, ratings, reviews or availability.

I reduced the dataset to the fields relevant to my questions and standardised them before moving anything into BigQuery.

The more interesting cleaning problem involved brand information.

A large share of products had no usable brand data. Rather than deleting those records, I labelled them Unknown so the products could stay in the analysis. In the final sample, 65 of 108 products (60.2%) had an unknown brand.

It looked like a data-cleaning problem at first. It turned into a finding of its own.

I also found repeated product titles.

At first glance, they looked like duplicates, but checking their product IDs and prices showed they were separate marketplace listings.

Duplicate-looking text does not mean duplicate observations. Dropping records on title alone would have removed legitimate listings.

Before exporting the cleaned CSV, I checked for spreadsheet errors and validated the final structure.

Step 3: Validating the data in BigQuery

I imported the cleaned Toys dataset into BigQuery and checked how it had interpreted each field before analysing anything.

Prices and ratings needed to be numeric. Review counts needed to be integers.

Stock and lead-time indicators needed to be Boolean fields.

I then used SQL to confirm the table held 108 records, 108 populated product IDs and 108 unique product IDs, and I checked the analytical fields for missing values.

This is the point where I stopped assuming the cleaned spreadsheet was correct and validated it again inside the environment where the analysis would happen.
 

Step 4: Using SQL to understand the Toys category

With the data validated, I started asking business questions.

What does the pricing landscape look like?

I calculated the minimum, average, median and maximum product prices, then divided the products into five price bands:

Under R100

  • R100–R249
  • R250–R499
  • R500–R999
  • R1,000+

The largest segment was R100–R249, containing 51 of the 108 sampled products.

That means approximately 47% of the sampled listings were concentrated within a relatively narrow price range.

Product count told only part of the story.

The R100 – R249 segment also generated the highest total review volume, with 16 314 reviews across the sampled listings, but it did not have the highest average rating.

That belonged to the R250 – R499 segment, at approximately 4.68.

For someone researching products to sell, that distinction matters. The most crowded price segment was not the segment with the strongest average customer rating. It does not make R250 – R499 the obvious place to enter, but it does give a prospective seller a reason to look at that range more closely.

Step 5: Looking at brands and visible customer interest

Brand representation raised another question.

Once Unknown products were excluded, I compared identifiable brands by product count, average price, average rating and total reviews.

Brand information in this category turned out to be highly fragmented, and 60.2% of the full sample carried no usable brand attribution at all.

That is worth further research for a prospective seller.

Are shoppers strongly brand-driven within toy segments? Are generic products competing successfully?

Do recognisable brands command higher prices? Could better branding create differentiation on its own?

My dataset cannot answer all those questions. It can show where deeper research might be worthwhile.

I then looked at the products with the highest review counts.

Review count works as a visible engagement signal, and I was careful not to treat it as sales data.

Only a fraction of buyers leaves reviews, so a product with 2 000 reviews has probably sold considerably more than 2 000 units.

The dataset still tells me nothing about its revenue or profit.

What review volume did give me was a way to identify products that had accumulated substantial visible customer activity.

Step 6: Exploring availability

I also analysed whether products in the sample were currently in stock, followed by an analysis of lead-time products.

Availability adds another dimension to product research.

A category with strong customer activity but frequent stock shortages could justify a closer look at supply conditions.

The limitation is timing: a single scrape captures availability at one moment.

To make a real claim about recurring stock gaps, I would need to collect the same data repeatedly over several weeks or months.

Step 7: Moving into Python for exploratory analysis

After SQL, I loaded the same cleaned dataset into Google Colab using pandas.

The point was not to repeat every SQL query.

I used Python to inspect the dataset, validate it programmatically and explore its distributions visually.

The dataframe held the same 108 observations that had survived the cleaning and SQL validation stages.


I inspected the data types and descriptive statistics, then checked again for duplicate product IDs and missing values.

One pattern from SQL was worth seeing visually: product pricing.

I created a histogram of current prices, which showed products clustered towards the lower end of the range, with a smaller number of higher-priced products stretching the distribution to the right.

I compared the mean and median and calculated skewness to quantify that pattern, then explored rating against review volume to explore the same relationship I wanted to present more clearly in Tableau.

Step 8: Turning the analysis into a Tableau dashboard

The final stage was visual communication.

Rather than putting every calculation onto a dashboard, I selected the measures that best answered the original marketplace questions:

– Products by price band
– Average rating by price band
– Top products by review count
– Rating versus review count
– Stock availability

Finally, I combined the key views into a single dashboard.

The dashboard turned the project from a collection of separate queries into something a person interested in the category could read in a couple of minutes.

What this could tell someone considering selling on Takealot

The analysis points a prospective seller towards five things:

Price positioning. Nearly half of the sampled listings fell between R100 and R249, showing where much of the visible assortment was concentrated.

  • Customer engagement signals. Review counts highlighted products and price segments that had accumulated substantial customer activity.
  • Quality perceptions. Comparing ratings across price ranges showed that the most populated segment was not automatically the highest-rated segment.
  • Brand structure. The high proportion of products with unknown brand information raised questions about the role of branded versus generic products within the category.
  • Availability signals. Stock and lead-time information provided another variable that could eventually be monitored to identify recurring supply gaps.

A seller would still need to investigate supplier costs, Takealot fees, fulfilment costs, competition, product restrictions, search demand, seasonality, margins and actual sales potential.

What the data does is sharpen the question. What should I sell? becomes Where does the marketplace show enough interesting signals for me to investigate further?

What the project taught me

The biggest lesson arrived before the first SQL query.

For instance, I had to question the original scrape when the record count no longer made sense and decide which columns were relevant, then had to separate repeated listings from duplicates and decide how to handle missing brand information without discarding useful products. Only after all of that did SQL, Python and Tableau become useful.

The project also changed how I approach marketplace research and used to look for an answer in the data. Now I look for the question the data is good enough to support.


Data collected from Takealot on 27 July 2026 using Apify. Sample: 108 unique Toys listings. Prices in South African Rand.

Skills Acquired From the Google Data Analytics Professional Course

Case Studies | Communication Skills | Data Analysis | Data Cleansing | Data Ethics | Data Presentation | Data Storytelling | Data Structures | Data Validation | Data Visualization | Discussion Facilitation | File Management | Giving Presentations | Interactive Data Visualization | Interviewing Skills | Introduction To Data Analytics | Introduction To Databases | Object Oriented Programming (OOP) | Spreadsheet Software | Stakeholders Communications | Web Presence

Shopping Cart
Scroll to Top