A review dataset can be large enough to look convincing and still be too narrow for the question you want to answer.

While auditing a Lazada Philippines review export at Easy Data, we found 30,325 unique review IDs across 152 products—but only one seller. That makes it a useful example of why coverage needs to come before a sentiment dashboard.

This article shares aggregate audit results and a reproducible check. It does not publish reviewer identities, review text, or media links.

What the export actually contains

Check Result
Review rows 30,325
Unique review IDs 30,325
Products 152
Sellers 1
Region PH on every row
Missing review text, including the literal value null 385
Missing creation dates 60
Five-star reviews 29,966 (98.82%)

The nonmissing review creation dates run from November 13, 2018 to June 6, 2025. Those are review dates, not a verified collection schedule.

These figures describe this supplied export. They do not describe the whole Lazada marketplace, all Philippine shoppers, or all reviews for these products.

1. Keep IDs as text and check the population

Python's built-in CSV reader preserves identifiers as strings. This avoids accidentally rounding long IDs when importing them as floating-point numbers.

Run this against a local review export with the columns shown below. The script reads the file without changing it and prints counts rather than customer text.

import csv from collections import Counter path = "lazada_reviews.csv" missing = {"", "null", "none", "nan"} def is_missing(value): return (value or "").strip().lower() in missing with open(path, encoding="utf-8-sig", newline="") as source: reader = csv.DictReader(source) required = { "review_id", "product_id", "seller_id", "region", "review", "creation_time", "rating" } absent = required - set(reader.fieldnames or []) if absent: raise ValueError(f"Missing columns: {sorted(absent)}") rows = list(reader) review_ids = [r["review_id"] for r in rows if not is_missing(r["review_id"])] print("rows:", len(rows)) print("unique review IDs:", len(set(review_ids))) print("missing review IDs:", len(rows) - len(review_ids)) print("repeated review ID rows:", len(review_ids) - len(set(review_ids))) print("products:", len({r["product_id"] for r in rows if not is_missing(r["product_id"])})) print("sellers:", len({r["seller_id"] for r in rows if not is_missing(r["seller_id"])})) print("regions:", dict(Counter(r["region"] for r in rows))) print("missing text:", sum(is_missing(r["review"]) for r in rows)) print("missing dates:", sum(is_missing(r["creation_time"]) for r in rows)) print("ratings:", dict(Counter(r["rating"] for r in rows))) 

For combined exports, keep the platform and region alongside every identifier. Do not assume an ID from Shopee identifies the same entity on Lazada. Repeated review IDs should be investigated before removal: they may be repeated captures with changed fields.

2. Separate a rating from a sentiment label

In this export, 98.82% of reviews have five stars. A model that always predicts five stars would therefore achieve 98.82% accuracy on this same distribution without reading any text.

That is a baseline warning, not evidence of a useful model. For rating prediction, inspect class counts and per-class precision and recall. For text sentiment, define an annotation method; stars are only a possible proxy and can disagree with the wording.

The 385 missing-text rows may still contribute to a rating distribution. They cannot contribute text evidence to a sentiment model. Keep those two denominators explicit.

3. Treat collection limits as an open question

We also found 43 products with exactly 300 reviews. That pattern is worth investigating for a possible collection limit. It does not prove a cap by itself.

Ask how pagination, sorting, date filters, and retry behavior worked before interpreting review counts as complete product coverage. A file that ends at a particular date also does not prove that all earlier reviews were collected.

With one seller in this sample, its average rating cannot support a claim that one marketplace has happier customers than another.

4. Publish a useful summary without exporting customer details

A public demonstration can use product-level review counts, star distributions, and clearly documented date coverage. Reviewer IDs, usernames, free text, and media URLs are unnecessary for that demonstration.

Inspect free text separately before any public release, and exclude signed media URLs or links carrying authorization parameters. Removing a username column alone is not a complete privacy review.

A dataset card should explain what readers can conclude

Document the platform, country, unit of observation, product and seller coverage, review-date range, collection method when known, missing values, and permitted uses. State unknowns explicitly.

For this export, the defensible description is a Lazada Philippines review sample covering 152 products from one seller, suitable for demonstrating review-data validation. Calling it a representative Philippine ecommerce sentiment dataset would overstate the evidence.

Disclosure: I work with Easy Data, which supplies ecommerce data. If you want a public starting point for product-data analysis, our free Shopee Thailand listing sample contains product listings; it is separate from the review export discussed here.