<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: John Pham</title>
    <description>The latest articles on DEV Community by John Pham (@john_pham_48c9c0322c7368d).</description>
    <link>https://dev.to/john_pham_48c9c0322c7368d</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4169805%2F7f9e1dbd-49cc-4893-b009-19e6a28d8517.png</url>
      <title>DEV Community: John Pham</title>
      <link>https://dev.to/john_pham_48c9c0322c7368d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/john_pham_48c9c0322c7368d"/>
    <language>en</language>
    <item>
      <title>A Lazada Review Dataset Can Have 30,325 Rows—and Still Cover Only One Seller</title>
      <dc:creator>John Pham</dc:creator>
      <pubDate>Thu, 08 Oct 2026 11:58:58 +0000</pubDate>
      <link>https://dev.to/john_pham_48c9c0322c7368d/a-lazada-review-dataset-can-have-30325-rows-and-still-cover-only-one-seller-3mee</link>
      <guid>https://dev.to/john_pham_48c9c0322c7368d/a-lazada-review-dataset-can-have-30325-rows-and-still-cover-only-one-seller-3mee</guid>
      <description>&lt;p&gt;A review dataset can be large enough to look convincing and still be too narrow for the question you want to answer.&lt;/p&gt;

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

&lt;p&gt;This article shares aggregate audit results and a reproducible check. It does not publish reviewer identities, review text, or media links.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the export actually contains
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Review rows&lt;/td&gt;
&lt;td&gt;30,325&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unique review IDs&lt;/td&gt;
&lt;td&gt;30,325&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Products&lt;/td&gt;
&lt;td&gt;152&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sellers&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;PH on every row&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing review text, including the literal value null&lt;/td&gt;
&lt;td&gt;385&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing creation dates&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Five-star reviews&lt;/td&gt;
&lt;td&gt;29,966 (98.82%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The nonmissing review creation dates run from &lt;strong&gt;November 13, 2018 to June 6, 2025&lt;/strong&gt;. Those are review dates, not a verified collection schedule.&lt;/p&gt;

&lt;p&gt;These figures describe this supplied export. They do not describe the whole Lazada marketplace, all Philippine shoppers, or all reviews for these products.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Keep IDs as text and check the population
&lt;/h2&gt;

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

&lt;p&gt;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.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Counter&lt;/span&gt;

&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lazada_reviews.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;missing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;null&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;none&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nan&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_missing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;missing&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8-sig&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;review_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seller_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;region&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;review&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;creation_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;absent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fieldnames&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;absent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Missing columns: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;absent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;review_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;review_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;
              &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;is_missing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;review_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rows:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unique review IDs:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;review_ids&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;missing review IDs:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;review_ids&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;repeated review ID rows:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;review_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;review_ids&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;products:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;
                        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;is_missing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])}))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sellers:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seller_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;
                       &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;is_missing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seller_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])}))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regions:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;region&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;missing text:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;is_missing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;review&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;missing dates:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;is_missing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;creation_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ratings:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Separate a rating from a sentiment label
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Treat collection limits as an open question
&lt;/h2&gt;

&lt;p&gt;We also found &lt;strong&gt;43 products with exactly 300 reviews&lt;/strong&gt;. That pattern is worth investigating for a possible collection limit. It does not prove a cap by itself.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;With one seller in this sample, its average rating cannot support a claim that one marketplace has happier customers than another.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Publish a useful summary without exporting customer details
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  A dataset card should explain what readers can conclude
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Disclosure: I work with &lt;a href="https://easydata.io.vn/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=lazada_review_quality" rel="noopener noreferrer"&gt;Easy Data&lt;/a&gt;, which supplies ecommerce data. If you want a public starting point for product-data analysis, our &lt;a href="https://easydata.io.vn/data-sample/free-shopee-dataset/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=lazada_review_quality" rel="noopener noreferrer"&gt;free Shopee Thailand listing sample&lt;/a&gt; contains product listings; it is separate from the review export discussed here.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>datascience</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Before You Build a Shopee Dashboard: 5 Dataset Checks</title>
      <dc:creator>John Pham</dc:creator>
      <pubDate>Wed, 07 Oct 2026 20:33:23 +0000</pubDate>
      <link>https://dev.to/john_pham_48c9c0322c7368d/before-you-build-a-shopee-dashboard-5-dataset-checks-6d6</link>
      <guid>https://dev.to/john_pham_48c9c0322c7368d/before-you-build-a-shopee-dashboard-5-dataset-checks-6d6</guid>
      <description>&lt;p&gt;A CSV can load without errors and still produce a misleading dashboard. Marketplace data needs a few checks before the first chart—especially when listings contain multiple variants or sales counters with unclear reporting periods.&lt;/p&gt;

&lt;p&gt;Here is a review process you can use for a Shopee dataset or adapt to another marketplace.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I work with &lt;a href="https://easydata.io.vn/" rel="noopener noreferrer"&gt;Easy Data&lt;/a&gt;. The linked sample is published by our team.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Write down what one row means
&lt;/h2&gt;

&lt;p&gt;Start with a short data contract: marketplace, country, collection date, currency, row identity and coverage limits. Keep it beside your analysis.&lt;/p&gt;

&lt;p&gt;For a concrete practice source, our &lt;a href="https://easydata.io.vn/data-sample/free-shopee-dataset/" rel="noopener noreferrer"&gt;free Shopee Thailand dataset&lt;/a&gt; includes a public worksheet and CSV download. The documented sample contains 540 diaper listings from 151 shops, recorded on January 31, 2025, with 23 fields and prices in THB. It is a historical snapshot.&lt;/p&gt;

&lt;p&gt;That scope belongs in a chart subtitle. Otherwise, a reader may mistake a small dated sample for a current view of an entire marketplace.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Check identity before removing duplicates
&lt;/h2&gt;

&lt;p&gt;Preserve identifiers as text. For this sample, use &lt;code&gt;shopId&lt;/code&gt; and &lt;code&gt;itemId&lt;/code&gt; together as the listing key.&lt;/p&gt;

&lt;p&gt;Count missing keys first. Then inspect repeated pairs. Do not automatically keep the first record: a repeated key might represent a conflicting value, a later observation, or an export problem. Each requires a different decision.&lt;/p&gt;

&lt;p&gt;Keep an audit log with the original row count, rows excluded, exclusion reasons and final row count. Your cleaning process should be explainable after the dashboard is finished.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Compare equivalent offers
&lt;/h2&gt;

&lt;p&gt;A listing may combine different sizes and pack quantities. Check &lt;code&gt;price_min&lt;/code&gt; and &lt;code&gt;price_max&lt;/code&gt; before interpreting its displayed price.&lt;/p&gt;

&lt;p&gt;Consider this &lt;strong&gt;hypothetical example&lt;/strong&gt;, not a finding from the sample:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Offer&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Pack quantity&lt;/th&gt;
&lt;th&gt;Price per unit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;180&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Offer A has the lower pack price. Offer B has the lower unit price. Neither comparison is reliable if the pack quantity belongs to a different variant. Shipping and buyer-specific discounts can change the final comparison too.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Keep missing values visible
&lt;/h2&gt;

&lt;p&gt;A blank brand is an unknown label, not proof that a product is unbranded. A zero reference price is not a valid denominator for a discount calculation.&lt;/p&gt;

&lt;p&gt;For every field used in a chart, count blanks and invalid values. Put missing categories in a clearly named group rather than dropping them silently. State how many rows remain when you filter to valid prices.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Separate listing counters from transactions
&lt;/h2&gt;

&lt;p&gt;A field named &lt;code&gt;sold&lt;/code&gt; does not by itself establish a monthly sales measure. You need a documented reporting window and definition.&lt;/p&gt;

&lt;p&gt;In this sample, the reporting windows for &lt;code&gt;sold&lt;/code&gt; and &lt;code&gt;historySold&lt;/code&gt; are not documented. Treat them as source counters. Multiplying a counter by the current listing price does not establish verified revenue.&lt;/p&gt;

&lt;h2&gt;
  
  
  A useful first deliverable
&lt;/h2&gt;

&lt;p&gt;Before a sales dashboard, make a one-page quality report containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The sample scope and collection date.&lt;/li&gt;
&lt;li&gt;Counts of rows, distinct listing keys and distinct shops.&lt;/li&gt;
&lt;li&gt;Missing-value rates for the fields you plan to use.&lt;/li&gt;
&lt;li&gt;Price and variant checks.&lt;/li&gt;
&lt;li&gt;Every exclusion and its reason.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article describes a workflow; it does not claim newly computed results. The linked sample documentation explains the source-specific checks and limitations.&lt;/p&gt;

&lt;p&gt;What marketplace field has caused the most confusion in your own analysis?&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>datascience</category>
    </item>
  </channel>
</rss>
