← series index

# Demo Script — Session 5: Data, Code & Your AI Workflow

*AI for Researchers — presenter script · Landscape as of August 2026*

**Runtime:** ~25 minutes (Setup ~2 min · Step 1 explore ~5 min · Step 2 test ~5 min · Step 3 chart ~3 min · **Step 4 verification ~7 min** · No-code variant ~2 min · Close ~1 min)
**Slides it follows:** slide 27 ("CRIT, Applied to an Analysis You Can Defend")
**Artefacts it exercises:** The Four Reproducibility Guardrails (slide 16), No-Code Analysis Paths (slide 19), The Personal AI Workflow Canvas (slide 25), CRIT (Session 1)

---

## 0. What this demo is, and what it deliberately is not

One dataset, four steps, and a fifth thing that is the actual point.

- **Steps 1–3** are what everybody already does: upload a file, ask for an exploration, ask for a test, ask for a chart. They take about thirteen minutes and they will look impressive.
- **Step 4 is the demo.** We re-run the produced code, recompute one number by hand, and check the conclusion against the paper the data came from. It takes seven minutes and it is the only part that distinguishes an analysis from a plausible-looking answer.

**Say this before you start:**

> *"I am going to let the tool do something genuinely useful, and then I am going to spend a third of this demo checking it. That ratio is the recommendation."*

**A rule this demo obeys, out loud.** The dataset is public, CC0, and published. Nothing here is unpublished, human-subject, or confidential. Before you upload anything of your own to a general assistant, check your institution's data-governance rules and the tool's own data-retention settings — Session 5's slide 8 covers why.

---

## 1. Preparation (the day before)

| # | Item | Why |
|---|---|---|
| 1 | Download `penguins.csv` (§2) to your desktop. | Do not download it live; the link is fine but the wifi may not be. |
| 2 | Run all four prompts once, end to end, and **screenshot every output including the code**. | Primary fallback (§8). Note which branch each §4 and §4d check took in rehearsal — the live run may take the other. |
| 3 | Save the code the tool produces to a `.py` (or `.R`) file. You will re-run it in Step 4. | The re-run is the demo. |
| 4 | Open a spreadsheet with `penguins.csv` already loaded, on a second window. | The by-hand check in Step 4b happens there, in front of the room. |
| 5 | Open the Gorman et al. (2014) paper the data comes from, at the abstract. | Step 4c checks the conclusion against it. |
| 6 | Have `sources.md` open on a second screen. | Someone will ask where the benchmark numbers come from. |
| 7 | Decide your tool and be ready to say why. | Tool-neutrality note below. |

**Tool neutrality note.** Every prompt below runs unchanged in any assistant that can execute code on an uploaded file — the code-execution tools in the general chat assistants, a notebook with an AI assistant attached, or a dedicated no-code analysis product. Say on the day: *"I am using this one because I have an account. The prompts and the checks are the transferable part."* If your institution provides a privacy-reviewed instance, use that and say so.

---

## 2. The dataset

**Palmer Archipelago (Antarctica) penguin data** — 344 penguins, 8 variables, collected by Dr. Kristen Gorman at Palmer Station LTER.

| | |
|---|---|
| **Download (single CSV, 15 KB)** | `https://raw.githubusercontent.com/allisonhorst/palmerpenguins/main/inst/extdata/penguins.csv` |
| **Drift-proof pinned copy** (use this on a slide) | `https://raw.githubusercontent.com/allisonhorst/palmerpenguins/156daa4301838d9fdcc5b018b29b9149bf975552/inst/extdata/penguins.csv` — verified byte-identical (same MD5) to the file above on 2026-07-28 |
| **Archived release / DOI** | `https://doi.org/10.5281/zenodo.3960218` → https://zenodo.org/records/3960218 |
| **Licence** | **CC0 1.0 Universal** — the repository's `LICENSE.md` carries the full CC0 text and CRAN records `License: CC0`; the package docs state "Data are available by CC-0 license in accordance with the Palmer Station LTER Data Policy". **Cite CRAN or `LICENSE.md` for the licence, not Zenodo** — the Zenodo record's licence field reads only "Other (Open)". |
| **Package citation** | Horst A. M., Hill A. P., & Gorman K. B. (2020). *palmerpenguins: Palmer Archipelago (Antarctica) penguin data*. R package v0.1.0. doi:10.5281/zenodo.3960218 |
| **Original source paper** | Gorman K. B., Williams T. D., & Fraser W. R. (2014). *Ecological sexual dimorphism and environmental variability within a community of Antarctic penguins (genus Pygoscelis)*. PLOS ONE 9(3), e90081. doi:10.1371/journal.pone.0090081 (CC BY) |

**Columns:** `species`, `island`, `bill_length_mm`, `bill_depth_mm`, `flipper_length_mm`, `body_mass_g`, `sex`, `year`.

**Every link above was fetched and confirmed to resolve on 2026-07-28.** Say the licence out loud — *"CC-0, so I may upload it, and you may reuse everything you see today"* — because "may I legally put this in a chatbot?" is the first question in every Q&A.

**Why this dataset.** It is small, it is genuinely open, it needs real cleaning decisions (11 rows have no recorded sex), and — critically for Step 4c — **it has a published paper attached**, so the tool's conclusion can be checked against a peer-reviewed finding rather than against your intuition.

---

## 3. Step 1 — Upload and explore (~5 min)

### Prompt 1 (paste verbatim)

```
Context: I have uploaded penguins.csv, a public dataset of body measurements
for 344 penguins of three species, collected at Palmer Station, Antarctica.
I am a researcher, not a programmer.

Role and register: Act as a careful research statistician doing a first pass
on someone else's dataset. Plain language, no jargon without a gloss.

Instructions and constraints:
- Show me the code you run, every time, before the result.
- Report the exact number of rows and columns, and the data type of each
  column.
- Report missing values PER COLUMN as counts, not percentages.
- Do not drop, impute or clean anything yet. Tell me what you would drop and
  why, and wait for me.
- State any assumption you had to make in a line beginning "ASSUMPTION:".
- Do not suggest a statistical test yet.

Task: Describe this dataset and its data-quality problems.
```

### Expected outcome

Reliably present, and all four numbers are checkable on screen:

| It should report | Correct value |
|---|---|
| Rows × columns | **344 × 8** |
| Missing `sex` | **11** |
| Missing each of the four measurement columns | **2** each |
| Species counts | Adelie **152**, Gentoo **124**, Chinstrap **68** |
| Islands | Biscoe **168**, Dream **124**, Torgersen **52** |
| Years | 2007 (110), 2008 (114), 2009 (120) |

### What to point at on screen

1. **The code appeared.** If it did not, stop and re-ask: *"Show me the code you ran."* A tool that will not show you its code cannot be part of a reproducible workflow — that is guardrail 1 on slide 16, and it is not negotiable.
2. **"ASSUMPTION:" lines.** Most runs produce at least one — e.g. that `NA` is the missing-value marker. Read one aloud. This is the habit: make the model surface its choices instead of burying them.
3. **The 11 and the 2 are different problems.** Two rows are missing every measurement (they are effectively empty records); nine more are missing only `sex`. If the tool reports "11 missing values" as one number, it has flattened two different data-quality stories — say so.

---

## 4. Step 2 — One statistical test (~5 min)

**Frame it first, in one sentence:** *"The question is whether male and female Adélie penguins differ in body mass. I am asking for one test, on one species, and I am going to check it."*

### Prompt 2 (paste verbatim)

```
Instructions and constraints:
- Restrict to species == "Adelie" only.
- Compare body_mass_g between sex == "male" and sex == "female".
- Exclude rows where sex is missing. Report exactly how many rows you
  excluded and from which group.
- Use Welch's t-test (do not assume equal variances). Name the test you ran
  in the output.
- Report, in a table: n, mean and standard deviation for each group; the
  difference in means; the t statistic; the degrees of freedom; the p-value;
  the 95% confidence interval for the difference; and Cohen's d.
- Set random_state / seed = 42 anywhere a random choice is made, and say
  where you did.
- Print the exact version of every library you used.
- Show the full code. Do not summarise it.

Task: Run that test and report the numbers. Do not interpret them yet.
```

### Expected outcome — these are the correct values

Computed independently by the author of this script from the CSV above, 2026-07-28:

| Quantity | Correct value |
|---|---|
| n (male / female) | **73 / 73** |
| Rows excluded (Adélie with no recorded sex) | **6** |
| Mean body mass, male | **4043.49 g** |
| Mean body mass, female | **3368.84 g** |
| Difference in means | **674.66 g** |
| SD (male / female) | **346.81 / 269.38 g** |
| Welch's *t* | **13.13** |
| Welch's df | **135.69** |
| *p* | **6.4 × 10⁻²⁶** |
| 95% CI for the difference | **≈ 573 to 776 g** |
| Cohen's *d* | **2.17** |

**Print this table on your presenter notes.** If the tool's numbers differ from these, you have a live example of exactly the failure this session is about — do not hide it, use it.

### The two checks, and what each branch teaches

Current-generation assistants pass both of these more often than not. Run the checks anyway — the point is that you cannot know in advance which branch you are in.

- **Check 1 — count the penguins.** 152 Adélies minus 73 minus 73 = **6** rows removed. **If the tool reported the exclusion count** (the usual outcome now — the prompt demands it): point at it. *"That number is the difference between a sample I agreed to and one I did not. It reported it because I asked; I verify it because I cannot assume."* **If it did not:** ask *"How many rows did you drop, and from which group?"* — then say: *"It gave me a correct p-value on a sample I had not agreed to."*
- **Check 2 — the df, not the t.** Because the groups are the same size, Welch's *t* and Student's *t* are **numerically identical here (13.13)** — but the degrees of freedom are not (**135.69** vs 144). **If df = 135.69:** it obeyed — and the df is the only line that proves it, so read it aloud. **If df = 144:** it ran the equal-variance test after being told not to; a live silent-instruction failure. Either way, point at the df, not the t: *"The statistic that tells me whether it obeyed is the one nobody reads."*

---

## 5. Step 3 — One chart (~3 min)

### Prompt 3 (paste verbatim)

```
Instructions and constraints:
- One figure only. Adélie penguins, body_mass_g, split by sex.
- Show the distribution, not just the mean: a box plot with the individual
  points overlaid.
- Label the y-axis with units. Title it with the species and the sample size
  per group.
- Do not add a trend line, a regression, a p-value annotation, or any
  statistical claim to the figure.
- Use the default colour cycle. Do not restyle it.
- Give me the code and the figure, and tell me which rows are not shown.

Task: Produce that figure.
```

### Expected outcome and what to check

A box plot, two boxes, visibly separated, with ~73 points over each. Check three things out loud, in five seconds each:

1. **Does the y-axis say grams?** Unlabelled axes are the most common defect in generated figures.
2. **Does the title's n match Step 2's n?** 73 and 73. If the chart silently used a different subset than the test, you have two analyses on two samples in the same slide deck.
3. **Are the 6 sex-missing penguins accounted for?** They are not in the figure. The figure should say so, or you should.

> **The line to land:** *"The chart is the part your reader will believe fastest and check least. That is a reason to check it more, not less."*

---

## 6. Step 4 — THE VERIFICATION SEGMENT (~7 min)

This is the segment that justifies the session. Do not cut it. If you are running long, cut Step 3 instead.

### 4a — Re-run the code yourself, outside the chat (~3 min)

Copy the code the tool produced in Step 2. Paste it into a plain notebook or script — **not** back into the chat — and run it.

**Say while it runs:** *"The tool ran this in a sandbox that will be deleted. If I cannot re-run it here, on my machine, then whatever it told me is not a result. It is an anecdote."*

**Three outcomes, and all three are worth having:**

| What happens | What to say |
|---|---|
| It runs and reproduces the numbers | *"Good. Now the numbers exist somewhere other than a chat transcript. Save this file next to your data."* |
| It fails on a missing import or an undefined variable | Perfect. Fix it live in ten seconds. *"The chat had state I do not have. This is the single most common way an AI analysis fails to be reproducible — and you only find out by doing what I just did."* |
| It runs but gives different numbers | Stop everything and dwell on it. This is the whole session in one screen. |

### 4b — Recompute one number by hand (~2 min)

Switch to the spreadsheet. Compute the female Adélie mean body mass with one formula, in front of the room:

```
=AVERAGEIFS(F:F, A:A, "Adelie", G:G, "female")
```

*(column F = `body_mass_g`, A = `species`, G = `sex` in the CSV as downloaded)*

**Expected: 3368.835616…, i.e. 3368.84 g.** Then subtract it from the male mean the tool reported and check you get **674.66 g**.

**Say:** *"One number, thirty seconds, and no statistics. Do this for one number in every AI-assisted analysis you ever publish. Not all of them — one. It catches the class of error where the tool analysed a different subset than the one you asked for, and that is the error you cannot see in the output."*

Also check the count: `=COUNTIFS(A:A,"Adelie",G:G,"female")` → **73**.

### 4c — Check the conclusion against the literature (~2 min)

Open Gorman et al. (2014), the paper this dataset came from, and read the abstract line aloud:

> *"Adélies and gentoos were more sexually dimorphic in body mass than chinstraps."*

Then show the three differences (from the same test, run per species):

| Species | Male − female body mass |
|---|---|
| Gentoo | **805 g** |
| Adélie | **675 g** |
| Chinstrap | **412 g** |

**Say:** *"Our result agrees with the published finding. That is the last check, and it is the one no tool can do for you: does this result sit in the literature, or does it contradict it? If it contradicts it, you have either a discovery or a bug — and the base rate is not in your favour."*

### 4d — The optional 60-second finale: the question with two right answers

If you have time, ask this and let it answer:

```
Is bill length associated with bill depth in these penguins? Give me the
correlation and one sentence of interpretation.
```

**Ground truth from the CSV** (computed independently, 2026-07-28) — the pooled correlation is negative, and it flips sign inside every species:

| Group | r (bill length vs. bill depth) |
|---|---|
| All penguins pooled | **−0.235** |
| Adélie | **+0.392** |
| Chinstrap | **+0.654** |
| Gentoo | **+0.643** |

**Two branches, and both carry the lesson. You cannot know in advance which one you will get.**

- **Branch A — it stratifies or flags the confound unprompted.** Current-generation models frequently notice the species structure on this dataset and either report per-species correlations or warn that the pooled figure is confounded. If so, say: *"It answered the question I meant, not the question I asked — today, on a famous dataset where this trap is textbook. On your data, with a confounder no textbook names, you cannot count on that. The split-by-groups check stays in the workflow precisely because you cannot predict this."*
- **Branch B — it reports only the pooled correlation** (r ≈ −0.24, "deeper bills are shorter", often with a confident biological interpretation). Ask it to split by species; the sign flips in every group. Say: *"That is Simpson's paradox, and the first answer was the exact opposite of the truth in all three species. It was not a hallucination — every number was correct. It answered the question I asked instead of the question I meant. No amount of checking the arithmetic would have caught this. Only knowing your data would."*

**The line to land, whichever branch fires:** *"The check is the same in both worlds — because you cannot know in advance which world you are in."*

---

## 7. The no-code variant (~2 min — say this even if you do not run it)

Everything above was done by a tool writing and running Python. **If you do not code, you can run this identical demo without ever reading a line of it** — and you must still do Step 4.

- **The spreadsheet path.** Steps 1, 2 and 4b are three formulas in Excel or Google Sheets. Steps 2 and 3 are a built-in *Analyze Data* / t-test function. The check in 4b *is* the spreadsheet.
- **The point-and-click statistics path.** JASP and jamovi are free, open-source, and menu-driven: choose Independent Samples T-Test, tick Welch, tick descriptives, tick effect size. The output is publication-formatted and the whole analysis is saved in one reopenable file — a better reproducibility story than a chat transcript. (jamovi's Syntax mode will also hand you the equivalent R code, which is guardrail 1 satisfied without writing a line.)
- **The chat path with no code shown.** Ask the assistant the same questions in plain English and it will still run code underneath. **Ask to see it anyway**, and save it. If a tool cannot show you its code, you cannot do Step 4a — and slide 19 says what to do about that.

> **The line to land:** *"Not coding is not the problem. Not being able to re-run it is the problem — and that is a choice you make when you pick the tool, not a consequence of not being a programmer."*

---

## 8. Fallbacks

| If this fails | Do this |
|---|---|
| The tool is down, rate-limited, or will not accept the upload | Use the prep screenshots (prep item 2). Every step above works as a walk-through of captured output; Step 4a works even better, because you re-run the captured code live. |
| The upload works but code execution is disabled on your plan | Say so — it is a real and common constraint. Switch to the spreadsheet path in §7 and run the same four steps there. The verification segment is unchanged. |
| The numbers come out right first time, with both checks on their passing branch | Expect this, and say so: *"This is what it looks like when it works. Run it three times and you will get three variants — which is why 'it was right last time' is not a method."* Then run §4d — either branch of it is the lesson. |
| The tool refuses to show its code | Do not fight it. Point at it: *"That is a disqualifying property for research use, and it is the reason slide 19 has a column headed 'Can you get the code out?'"* |
| Step 4a's re-run fails and you cannot fix it in 20 seconds | Stop and keep the failure. *"I cannot reproduce it in front of you after two minutes. Imagine finding that out at revision, eight months from now."* |
| You are running long | Cut §5 (the chart) and §4d. **Never cut §6 Steps 4a and 4b.** |
| Someone asks you to upload their own data live | Decline. Explain in one sentence: you have not read their institution's data-governance policy, their consent forms, or that tool's current retention settings — and none of those are things to guess at on a webinar. |

---

## 9. Close (1 min)

Three sentences, then hand back to the slides:

1. *"The tool did in four minutes what would have taken me forty. Every number it produced was checkable — and the pooled correlation showed why checkable is not the same as safe: perfectly correct, and the opposite of the within-species truth unless someone splits by species. Whether the tool or you did the splitting today was luck; that it got done was method."*
2. *"The guardrails are boring on purpose: keep the code, pin the versions, set the seed, verify one number by hand. Four habits, and they survive whichever tool you use next year."*
3. *"Now open the canvas on the last handout page and fill in row 4 for your own project, before you leave."*

---

*AI for Researchers · Session 5: Data, Code & Your AI Workflow · Landscape as of August 2026 · Citations `[n]` resolve in this session's `sources.md`.*