This report uses the three supplied workbooks: the five-brand workbook, the Sephora workbook, and the general skincare workbook. The normalized input preserves source filename, worksheet, and row number for tracing each record.
The files contain 1400 scrape observations, representing 766 distinct post identifiers across all sources. A post can appear in both collections or match several brands. Counting every row as a separate consumer opinion would inflate the evidence.
| Search group | Scrape | Posts | Collection time (UTC; date only where time unavailable) |
|---|---|---|---|
| CeraVe | 1 | 100 | 2026-11-10 23:25:01 UTC |
| CeraVe | 2 | 100 | 2026-11-10 23:25:06 UTC |
| Cetaphil | 1 | 100 | 2026-11-10 23:25:03 UTC |
| Cetaphil | 2 | 100 | 2026-11-10 23:25:07 UTC |
| La Roche-Posay | 1 | 100 | 2026-11-10 23:25:05 UTC |
| La Roche-Posay | 2 | 100 | 2026-11-10 23:25:09 UTC |
| Rhode | 1 | 100 | 2026-11-10 23:25:06 UTC |
| Rhode | 2 | 100 | 2026-11-10 23:25:10 UTC |
| Sephora | 1 | 100 | 2026-10-22 |
| Sephora | 2 | 100 | 2026-10-26 21:34:29 UTC |
| Skincare keyword | 1 | 100 | 2026-11-03 23:18:39 UTC |
| Skincare keyword | 2 | 100 | 2026-11-03 23:24:47 UTC |
| The Ordinary | 1 | 100 | 2026-11-10 23:25:04 UTC |
| The Ordinary | 2 | 100 | 2026-11-10 23:25:08 UTC |
Sephora is a retailer, the five named skincare companies are product brands, and “skincare” is a general topic. Their searches use different terms and collection dates. Results describe these samples, rather than a controlled market-share comparison. Search language filters can still return mixed-language or irrelevant content.
| group | scrape1 | scrape2 | shared | new_in_second | overlap_pct |
|---|---|---|---|---|---|
| Sephora | 100 | 100 | 31 | 69 | 31 |
| Skincare keyword | 100 | 100 | 100 | 0 | 100 |
| CeraVe | 100 | 100 | 100 | 0 | 100 |
| Cetaphil | 100 | 100 | 100 | 0 | 100 |
| The Ordinary | 100 | 100 | 100 | 0 | 100 |
| La Roche-Posay | 100 | 100 | 100 | 0 | 100 |
| Rhode | 100 | 100 | 100 | 0 | 100 |
The same post identifiers occur in both batches for Skincare keyword, CeraVe, Cetaphil, The Ordinary, La Roche-Posay, Rhode. These second scrapes provide another engagement snapshot, but no additional unique text. Sephora’s collections cover a longer gap and add 69 post identifiers absent from its first scrape. Those posts are not necessarily newly published.
For text analysis, retain one observation per post within each search group. This report uses the second scrape when a post occurs twice. For engagement-change analysis, compare shared identifiers separately from changes caused by newly sampled posts.
| group | source_type | posts | total_engagement | mean_engagement | median_engagement | zero_pct |
|---|---|---|---|---|---|---|
| CeraVe | Product brand | 100 | 215 | 2.15 | 0.0 | 72.00 |
| Cetaphil | Product brand | 100 | 242 | 2.42 | 0.0 | 55.00 |
| La Roche-Posay | Product brand | 100 | 224 | 2.24 | 0.0 | 71.00 |
| Rhode | Product brand | 100 | 299 | 2.99 | 0.0 | 58.00 |
| Sephora | Retailer | 169 | 2787 | 16.49 | 1.0 | 31.36 |
| Skincare keyword | General topic | 100 | 242 | 2.42 | 0.0 | 53.00 |
| The Ordinary | Product brand | 100 | 378 | 3.78 | 0.5 | 50.00 |
Among the five product-brand samples, The Ordinary has the highest mean engagement (3.78 likes + reposts per post). This is a result for these search samples, not evidence of the largest customer base or best products. Median engagement is lower than the mean, indicating that a minority of posts attract much of the attention.
Likes and reposts measure observable interaction. They do not directly measure sales, satisfaction, product effectiveness, or positive sentiment. The Sephora sample also contains off-topic posts and was collected on different dates; its larger engagement total should not be interpreted as a direct brand-performance ranking.
| group | shared_posts | scrape1 | scrape2 | change |
|---|---|---|---|---|
| CeraVe | 100 | 215 | 215 | 0 |
| Cetaphil | 100 | 242 | 242 | 0 |
| La Roche-Posay | 100 | 224 | 224 | 0 |
| Rhode | 100 | 299 | 299 | 0 |
| Sephora | 31 | 272 | 284 | 12 |
| Skincare keyword | 100 | 240 | 242 | 2 |
| The Ordinary | 100 | 378 | 378 | 0 |
This comparison holds post identifiers constant. It tracks engagement changes on the same posts, rather than attributing changes in sample composition to increased interest. Seconds between the newer brand collections give little opportunity to observe meaningful change. Counts can also decrease if interactions are removed.
| group | author | posts | total_posts | share_pct |
|---|---|---|---|---|
| CeraVe | kagank.bsky.social | 16 | 100 | 16.0 |
| Cetaphil | promobit-promo.bsky.social | 22 | 100 | 22.0 |
| La Roche-Posay | promobit-promo.bsky.social | 26 | 100 | 26.0 |
| Rhode | designtaxi.com | 5 | 100 | 5.0 |
| Sephora | cuntolicismo.bsky.social | 2 | 169 | 1.2 |
| Skincare keyword | travelingadvisor.bsky.social | 12 | 100 | 12.0 |
| The Ordinary | itsyourglowlab.bsky.social | 11 | 100 | 11.0 |
High account concentration means the sample may reflect a few prolific posters. Product listings, affiliate promotions, and repeated wording can increase mention counts without representing independent customer experiences. Account identity alone does not establish whether someone is a bot or a customer.
Topics below use transparent keyword rules. Each post can match multiple topics. A match means that words occurred, not that a customer endorsed a claim.
| Topic | Kaggle_variable | Interpretation |
|---|---|---|
| Price and promotions | Price_USD | Compare price discussion with product price distributions. |
| Ingredients | Main_Ingredient | Compare ingredient mentions with ingredient frequencies in product records. |
| Skin needs and results | Skin_Type; Rating | Explore needs and reported experiences; these do not validate effectiveness or ratings. |
| Product categories | Category | Compare categories discussed with the categories represented in the product dataset. |
| Ethics and cruelty-free | Cruelty_Free | Compare ethical discussion with the recorded cruelty-free attribute. |
| Service and shopping | No direct equivalent confirmed | Treat retailer/service discussion as context rather than product attributes. |
The Kaggle product data describe attributes and ratings of product records. Bluesky describes what appears in these selected conversations. Together they can suggest marketing questions, such as whether frequently discussed skin needs correspond to available categories or ingredients. They cannot establish that a particular Kaggle product generated a post, caused engagement, or changed purchase behavior without a validated record-level link.
| group | posts | text_mentions | no_explicit_text_mention | possible_place_matches | existing_labels |
|---|---|---|---|---|---|
| CeraVe | 100 | 98 | 2 | 0 | 0 |
| Cetaphil | 100 | 98 | 2 | 0 | 0 |
| La Roche-Posay | 100 | 92 | 8 | 0 | 0 |
| Rhode | 100 | 75 | 25 | 3 | 0 |
| Sephora | 169 | 159 | 10 | 0 | 34 |
| Skincare keyword | 100 | 81 | 19 | 0 | 0 |
| The Ordinary | 100 | 67 | 33 | 0 | 0 |
| group | direct_mention_posts | mean_engagement |
|---|---|---|
| CeraVe | 98 | 1.95 |
| Cetaphil | 98 | 2.41 |
| La Roche-Posay | 92 | 2.20 |
| Rhode | 73 | 2.14 |
| Sephora | 159 | 6.84 |
| Skincare keyword | 81 | 2.70 |
| The Ordinary | 67 | 4.63 |
The Rhode sample includes location-related matches, and some other posts match through links or image descriptions rather than their visible text. Review these records before interpreting them as brand opinions. The direct-mention sensitivity table is a narrower view, not a replacement for manual relevance review.
Most sentiment cells are blank. The Sephora workbook contains existing labels, and its instructions describe draft labels that need confirmation. The following chart is a description of those saved labels only. Blank cells are not neutral, and these percentages do not describe all posts or all consumers.
| group | batch | sentiment | labeled_posts |
|---|---|---|---|
| Sephora | 1 | negative | 5 |
| Sephora | 1 | neutral | 14 |
| Sephora | 1 | positive | 1 |
| Sephora | 2 | negative | 6 |
| Sephora | 2 | neutral | 11 |
| Sephora | 2 | positive | 3 |
The Kaggle CSV was not supplied with these workbooks. This section loads it if present and reports the observed records and available variables. It does not invent product statistics or assume the scraped brands appear in that file.
Kaggle CSV not found. Place
most_used_beauty_cosmetics_products_extended.csv beside
this Rmd and Knit again to activate product-data charts. The Bluesky
findings above remain available.
These samples show how skincare products and retailers are discussed online, including product features, promotional language, and uneven engagement. The newer second scrapes repeat the first batch’s text, so they should be treated as repeated observations rather than additional independent opinions. Most posts have little engagement, and a small number of posts or accounts can shape the results. The topic analysis can be connected to Kaggle variables such as price, category, ingredients, skin type, and cruelty-free status, while sentiment conclusions require completed labels and relevant posts. The two sources complement one another, but they do not support causal claims about product quality, sales, or purchase intent.
The Analysis_Results folder contains chart PNGs,
engagement and topic summaries, overlap calculations, and a
relevance-review CSV. To update labels or relevance, edit
Analysis_Input.csv, save it beside this Rmd, and Knit
again. Mark only reviewed irrelevant posts as irrelevant in
brand_relevance. Record label confirmations separately
before using saved draft sentiment as final results.