Data and cleaning

The supplied Steve Hilton export contains 193 rows and 23 columns. Its post field is text. Engagement fields are reply_count, repost_count, like_count, quote_count, and bookmark_count. created_at represents post creation; indexed_at represents indexing. The export has no timezone suffix, so this analysis provisionally interprets timestamps as UTC. Available creation dates span October 24–29, 2026. The same October 24–29 window must be used for both candidates. Thirty-three raw rows have missing created_at values. These are excluded from the date-matched analysis; indexed_at is not substituted for creation time.

Before cleaning, 10 rows have empty text and 183 nonempty rows contain 159 distinct texts after trimming. All 193 URIs are distinct. No text matches Paris Hilton or Hilton hotel/resort/Honors. Nevertheless, ambiguous candidate references, other Hilton meanings, spam, non-English posts, and posts discussing both candidates need private review. Forty-six raw posts mention Becerra; these are not a separately collected Becerra comparison sample.

Exact duplicate texts within each candidate are collapsed so repeated wording does not automatically count as independent support. This can collapse separate authors’ identical messages. The primary analysis conservatively excludes posts mentioning both candidates unless a private relevance review overrides that rule. Explicitly non-English posts are excluded from the English Bing analysis; unknown language posts require review. Blank creation dates and out-of-window posts are excluded. The review file records all decisions for reproducibility.

candidate stage n
Steve Hilton Imported 193
Steve Hilton In_date_window 130
Steve Hilton Nonempty 183
Steve Hilton Retained 67
Steve Hilton Unique_text 159
Steve Hilton Unique_URI 183
candidate needs_review pending_review
Steve Hilton 75 75

Pending reviews mean the results are provisional. Inspect embedded or quoted material privately when context is missing; this analysis scores only text. Engagement is summarized descriptively, with each retained text given equal weight. Likes and reposts are not assumed to be votes or endorsements.

Bing word sentiment

Each positive word contributes +1 and each negative word −1. A post is positive when its sum is above zero, negative below zero, and neutral at zero. Neutral includes ties and posts without any Bing matches; it does not establish neutral stance. Positive and negative shares use all retained posts as their denominator. Net sentiment is positive share minus negative share; mean net word score is also shown.

candidate posts positive_posts negative_posts neutral_posts
Steve Hilton 67 17 22 28
candidate positive_share negative_share net_sentiment mean_net_words zero_match_share
Steve Hilton 0.254 0.328 -0.075 -0.209 0.269
candidate total_reply_count total_repost_count total_like_count total_quote_count total_bookmark_count
Steve Hilton 25 15 118 1 3

Method reference: tidytext’s Bing lexicon documentation.

Manual stance validation

The workflow selects a reproducible simple random sample of 20 retained posts, or all retained posts if fewer than 20 exist. In the private manual file, label each post supportive, opposed, or neutral_unclear toward its assigned candidate. Do this without seeing the automatic labels. Finish relevance review before labeling; if cleaning changes the retained sample, remove the old manual file and regenerate it before doing the final validation.

Positive tone maps to supportive, negative to opposed, and neutral to neutral_unclear for this comparison only. Reported accuracy is agreement with human stance, not proof that word tone measures electoral support. Accuracy remains missing until every selected post has been hand-labeled. With only 20 posts, agreement is imprecise and a random sample may underrepresent a candidate.

selected labels_completed complete agreement_accuracy
20 0 FALSE NA
manual_stance auto_stance posts
neutral_unclear neutral_unclear 0
neutral_unclear opposed 0
neutral_unclear supportive 0
opposed neutral_unclear 0
opposed opposed 0
opposed supportive 0
supportive neutral_unclear 0
supportive opposed 0
supportive supportive 0

Prediction and bootstrap

For candidate c, let p(c) = positive posts / all retained posts. The assignment’s proxy vote share is p(c) / [p(Hilton) + p(Becerra)]. The higher normalized rate wins; equal rates produce a tie. A zero denominator is undefined. This is an uncalibrated social-media proxy, not a measured election vote share.

Unavailable: both candidate datasets are required.

The bootstrap independently resamples retained posts with replacement within each candidate 1,000 times, preserves candidate sample sizes, and recomputes the same normalized rate. The 2.5th and 97.5th percentiles form an interval conditional on this sample and method. Zero-denominator resamples are counted as undefined and omitted from interval calculation. Heavy dependence among authors or replies can make post-level intervals too narrow; they do not capture platform selection bias, collection bias, or sentiment classification error. Both datasets need comparable search queries, time windows, pagination, and language policies.

Reflection

These posts are a convenience sample of Bluesky discussion, not a random sample of California voters. The export does not establish California residency, voter eligibility, or representativeness. More discussion may reflect criticism, news attention, repeated messages, or a few prolific accounts rather than support.

Bing scores word tone, whereas stance means support for or opposition to a particular candidate. Negative words can describe a problem the candidate wants to solve; positive words can praise an opponent. Sarcasm, negation, quoted speech, slang, and mixed-candidate posts can reverse the intended meaning. Hand-labeling helps reveal these failures, but does not correct the entire sample automatically. The bootstrap measures resampling variability under the stated assumptions; it cannot turn a biased discussion sample into a representative election forecast.

Exact AI prompt used

The following is the request supplied to the AI assistant, preserved verbatim.

Continuing from Bluesky Forecast Plan: Inspect /mnt/data/Steve_Hilton_Posts(2).csv and redo the user’s Marketing Analytics R workflow using the file’s actual columns. Identify the text column and relevant engagement/date fields, recommend cleaning for false positives such as Paris Hilton/Hilton Hotel, and provide R code for Bing/tidytext post sentiment, aggregate summary, 20-post manual stance validation, positive-share prediction, 1,000 bootstrap resamples, and R Markdown-ready aggregate tables/charts. Do not expose usernames or individual posts in the published-report outputs.

This HTML report prints only aggregate results. Keep the original CSVs, private/ folder, and all post-level objects off RPubs. Publish only the knitted HTML after completing the private reviews and adding a comparable second dataset.