What the data can tell us

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.

1. Are the second scrapes adding new posts?

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.

2. Engagement: attention is uneven

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.

3. What changes between scrapes?

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.

4. Who is contributing the conversation?

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.

5. Topics that connect to the Kaggle product variables

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.

6. Relevance and sentiment checks

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

7. Add the Kaggle CSV for direct product-data charts

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.

What to say about the semester project

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.

Outputs and next steps

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.