Sample dataset · CC0

Grades in long format, on purpose.

Nine columns with one row for every combination of student, subject and term. Each student has their own ability, so scores cluster by student rather than scattering, and the letter grade follows the score with fixed cut points.

9 columns · 100 or 1,000 rows as a file · up to 1,000,000 rows generated here · CSV, JSON, JSONL, Excel, Parquet

Take a file

Each student contributes twenty-four rows, eight subjects across three terms, so a 1,000-row file holds about forty-one students and the last one is incomplete.

A whole year group

Generate 10,000 rows for about 416 students, which is a realistic secondary school year group and enough for a distribution to settle down.

The first eight rows

The first eight rows of the 1,000-row file: one student's eight subjects in the fall term.

student_idstudent_namegrade_levelsubjecttermscoreletter_gradeattendance_pctteacher
STU-00001Kenneth Morgan9Mathematics2025-Fall49F66.4Jacob Collins
STU-00001Kenneth Morgan9English2025-Fall56F67.2Brenda Ortiz
STU-00001Kenneth Morgan9Biology2025-Fall54F67.7Rebecca Jackson
STU-00001Kenneth Morgan9Chemistry2025-Fall48F65.8Carlos Collins
STU-00001Kenneth Morgan9History2025-Fall51F67.4Hana Davis
STU-00001Kenneth Morgan9Computer Science2025-Fall54F70.0Lisa Walker
STU-00001Kenneth Morgan9Art2025-Fall59F67.5Cynthia Lewis
STU-00001Kenneth Morgan9Physical Education2025-Fall59F73.2Samuel Rivera

Nine columns, and what each one holds

Column Type What it holds Example
student_id text STU-00001 upward. Zero padded, which spreadsheets like to ruin. STU-00001
student_name text Full name of the student. Kenneth Morgan
grade_level integer 9 to 12. 9
subject text One of eight subjects. Each student appears once per subject per term. Mathematics
term text 2025-Fall, 2026-Spring or 2026-Summer. 2025-Fall
score integer Percentage score, 31 to 100. Each student has their own ability, so scores cluster by student. 49
letter_grade text A to F, derived from score with fixed cut points. F
attendance_pct decimal Attendance for that term, one decimal. Correlates with score. 66.4
teacher text Teacher for that subject. Jacob Collins

What it models

A gradebook export in long format: one row per student per subject per term, which is the shape a school information system produces and the shape nobody wants to read. Eight subjects across three terms means twenty-four rows per student, and the rows arrive grouped by student, then by term, then by subject.

This is the only dataset in the collection built primarily to be reshaped. Everything else here is useful as it stands; this one is useful because turning it into something readable is the exercise. Students down the side, subjects across the top, score in the middle, and twenty-four rows become one.

Ability, not noise

Each student has a hidden ability value fixed for the whole file, and every score is that ability plus per-row variation. So a strong student is strong in most subjects and a weak one is weak in most, with enough scatter that no student is flat across all eight.

That single property is what makes the file usable for anything statistical. If scores were drawn independently, the average per student would converge to the same number, the between-student variance would be noise, and any analysis of who is doing well would be meaningless. Here the between-student variance is real and larger than the within-student variance, which is the structure a teacher would recognize.

attendance_pct is correlated with the same ability value, so attendance and score move together. It is a deliberately easy correlation to find, and it is a good first exercise in noticing that correlation is not the same as the causal story somebody will immediately tell about it.

Derived letter grades

letter_grade is computed from score with the standard cut points: 90 and above is an A, 80 is a B, 70 a C, 60 a D and anything below is an F. Because it is derived, the boundaries are exact and consistent, so you can use the file to test a categorization or a CASE expression against a known answer.

It also makes a good demonstration of what happens at a boundary. A score of exactly 90 is an A and 89 is a B, and running a distribution by letter grade against a histogram of scores shows how much information a categorization throws away. That is worth ten minutes with anybody who is about to bucket a continuous variable.

What people use it for

  • Long to wide reshaping, which is the primary reason this file exists.
  • Group-level statistics where between-group variance is real rather than noise.
  • Testing a CASE expression or categorization against derived letter grades.
  • Correlation exercises, using attendance against score.
  • Multi-level grouping: student, subject and term are three natural axes.

License, and the people in it

This dataset is dedicated to the public domain under CC0 1.0. Put it in a course, a paid product, a test suite, a bug report, a screenshot, a conference talk or a book. There is nothing to ask for, nothing to sign and no attribution required. A link back is welcome and is not a condition.

No student, teacher, school or grade in this file belongs to anybody. Names are assembled from fixed pools and there are no dates of birth, addresses or identifiers of any kind beyond a sequential student number. Real education data is among the most regulated data there is, which is exactly why a safe substitute is worth having.

Questions people ask about this file

Why is it in long format?

Because that is what a school information system exports, and because reshaping it is the exercise. Eight subjects across three terms gives twenty-four rows per student, which is unreadable as it stands and becomes a report card the moment you pivot it. A file that arrived already wide would skip the only interesting step.

Do the scores cluster by student?

Yes. Each student has a hidden ability value that is fixed across the whole file, and every score is that value plus per-row variation, so between-student differences are real and larger than within-student scatter. That is the property that makes any per-student statistic meaningful, and drawing scores independently would destroy it.

How is the letter grade calculated?

With standard cut points applied to the score on the same row: 90 and above is an A, 80 to 89 a B, 70 to 79 a C, 60 to 69 a D, and below 60 an F. Because it is derived, the boundaries are exact, which makes the column a reference answer for testing a CASE expression or a bucketing feature.

Is any of this real student data?

None of it. Names come from fixed pools, there are no birth dates, addresses or identifiers beyond a sequential number, and every score is generated. Education records are among the most tightly regulated data there is, and building a gradebook demo on real records is a mistake people only make once, which is why a plausible substitute is worth keeping around.