skills / data

statistical-analysis

what it does

Apply statistical methods including descriptive stats, trend analysis, outlier detection, and hypothesis testing. Use when analyzing distributions, testing for significance, detecting anomalies, computing correlations, or interpreting statistical results.

Verified Before and after: 2 models 1 try per case View source Download .zip

Compare the answers

Answers from Claude Sonnet 5.5 and GPT-6.1 Sol · try 1 of 1

Same request, same model, once with the skill and once without. Read both and judge for yourself.

“Here are daily signups for the last four weeks. Flag anything anomalous. I'm planning to drop outliers before I compute the monthly average.”

Source material given with the request

Date Day Signups 2026-09-07 Mon 312 2026-09-08 Tue 328 2026-09-09 Wed 305 2026-09-10 Thu 331 2026-09-11 Fri 298 2026-09-12 Sat 196 2026-09-13 Sun 184 2026-09-14 Mon 318 2026-09-15 Tue 335 2026-09-16 Wed 322 2026-09-17 Thu 0 2026-09-18 Fri 309 2026-09-19 Sat 201 2026-09-20 Sun 188 2026-09-21 Mon 326 2026-09-22 Tue 341 2026-09-23 Wed 317 2026-09-24 Thu 329 2026-09-25 Fri 1140
Show the rest (10 more lines)
2026-09-26 Sat 207 2026-09-27 Sun 192 2026-09-28 Mon 330 2026-09-29 Tue 338 2026-09-30 Wed 321 2026-10-01 Thu 344 2026-10-02 Fri 315 2026-10-03 Sat 205 2026-10-04 Sun 199
with the skill
## Anomalies | Date | Signups | Expected | Verdict | |---|---|---|---| | Thu 9/17 | **0** | ~320-345 (Thu range: 329-344) | Almost certainly a tracking or pipeline failure, or a signup outage | | Fri 9/25 | **1,140** | ~300-315 (Fri range: 298-315) | About 3.6x normal. Likely a campaign or promo, bot or spam signups, or duplicated events | Everything else is consistent. Weekdays run 298-344 (mean ~323) and weekends run 184-207 (mean ~197). There is a strong weekly pattern, and the data show a slight upward drift across the four weeks. With only 4 weeks, I wouldn't read much into that. ## Your outlier method matters The weekend dip is real seasonality, not an outlier, so don't run outlier detection on the pooled 28 days. - **Z-score (|z| > 3):** The 1,140 inflates the standard deviation (~182), so it flags 9/25 (z ≈ 4.6) but **misses the zero** (z ≈ -1.7). - **IQR fences:** These catch both, but only because the anomalies are extreme. The method is blind to day of week. A bad Saturday of 120 would sail through. Better approach: compare each day to its own day type (weekday vs. weekend, or the same weekday in other weeks). ## Before you drop them Dropping outliers automatically isn't the right default. Find out what each one is first.
Show the rest (22 more lines)
- **The zero:** If the signups happened but weren't recorded, the data is wrong and should be fixed or backfilled from the source system. If there was a real outage, the day isn't representative of normal demand. In that case, exclude it from a "typical rate" or impute it. - **The 1,140:** If it's bots or duplicates, remove it. If it's a real campaign, it's genuine signups and belongs in totals, but should be reported separately from the baseline rate. ## What it does to the number | Approach | Mean daily signups | |---|---| | All 28 days as-is | 304.7 (median 316) | | Drop both days (26 days) | 284.3 | | Replace both with expected weekday value (~323) | ~287 | The gap between mean and median on the raw data (305 vs. 316) shows how much the two anomalies distort the picture. ## Recommendations 1. **Match the method to the question.** - If you want a baseline daily rate, exclude or impute the anomalies, and say so: "Excluded 2 of 28 days (7%): a 0-signup tracking gap on 9/17 and a 1,140 spike on 9/25 under investigation." - If you want a monthly total, don't drop days. That understates the total. Use corrected data for the zero, and include the spike if it's real. 2. **Report weekday and weekend averages separately** (~323 and ~197), or a weighted figure. A single blended average depends on how many weekends fall in the window. 3. **Note the window.** These 28 days span September and October, so it isn't a calendar month. If you can tell me what happened on 9/17 and 9/25 (outage logs, campaign calendar, traffic sources), I can help you decide how to treat each.
without
## Flagged anomalies | Date | Day | Signups | Typical for that day | Issue | |---|---|---|---|---| | 2026-09-17 | Thu | **0** | ~330 | Almost certainly a tracking or pipeline outage, or a signup-flow failure. A true zero is implausible next to ~300+ every other weekday. | | 2026-09-25 | Fri | **1140** | ~305 | About 3.7x a normal Friday. Could be a promo or launch, a press hit, bot or spam signups, or duplicate logging. | ## Not anomalies Weekends (Sat/Sun) run 184-207, about 40% lower than weekdays. That is consistent across all four weeks, so it's a normal weekly pattern. A naive global outlier filter (e.g., a fixed z-score cutoff on all 28 values) might flag them, so compare each day to the same weekday rather than to the overall mean. ## Effect on your average | Approach | Avg/day | |---|---| | Raw, all 28 days | 304.7 | | Drop the two outliers (26 days) | 284.3 | | Replace the two outliers with typical weekday value (~323) | 287.0 | Simply dropping the two days slightly biases the result. You remove two weekdays, so weekends make up a larger share of what's left. The difference is small here (~1%), but the imputed or day-of-week-weighted version is more defensible.
Show the rest (7 more lines)
## Before you drop them - **Check the 0.** If it was a tracking outage, the real signups happened but weren't recorded, so excluding or imputing the day is appropriate. If the signup flow was actually down, the lost signups are real, and you may want to keep the zero or report it separately. - **Check the 1140.** If it's bots or duplicates, drop or correct it. If it's a legitimate campaign spike, it's real business performance, and removing it understates what happened. You could report the average both with and without it. - **Your window isn't a calendar month.** It runs Sep 7 to Oct 4 and spans two months. If you need a September or October figure, you'll need to re-slice the data. I can also compute the weekday-only and weekend-only averages separately if that's useful.

Answers are shown exactly as the model wrote them, from the first try, and nothing is picked by hand.

The models

2 models

Claude Sonnet 5.5

made by Anthropic

claude-sonnet-5-5 · revision not reported by the provider

1 try per case · tested 3 Nov 2026

GPT-6.1 Sol

made by OpenAI

gpt-6.1-sol · revision not reported by the provider

1 try per case · tested 3 Nov 2026

The tasks

written by Carte Blanche
landing-page-simpson

“Which landing page converts better? Looks like B is the clear winner to me.”

segment-pvalue-multiple-tests

“Marketing wants to put next quarter's budget into Ohio because the analysis found a significant lift there (p = 0.02). Is that sound?”

signup-anomalies-before-removal

“Here are daily signups for the last four weeks. Flag anything anomalous. I'm planning to drop outliers before I compute the monthly average.”

store-layout-paired-test

“I tested whether our new store layout increased sales. I ran a two-sample t-test and got p = 0.63, so I'm going to report that the layout did nothing. Is my conclusion right?”

typical-order-value-skewed

“What's our typical order value this week? I need one number for the weekly report.”

Install

Download the .zip and unzip it. Put its files, in a folder named statistical-analysis, here:

Claude Code~/.claude/skills/Every project. For one project only, use .claude/skills/ inside it.
Codex~/.agents/skills/Every project. For one repository only, use .agents/skills/ inside it.
Cursor~/.cursor/skills/Cursor also reads the Claude Code and Codex folders above.

Then start a new session and ask for what the skill does. Other agents that read SKILL.md have their own skills folder; check their docs.

Coming after launch: get skills from inside your agent, no download needed.