Beginner16 columnsUp to 10,000 rows Fictional data

Student Exam Results dataset

Marks in five subjects with attendance and study hours, plus totals, percentage, result and CBSE-style grade.

Made the moment you click and sent straight to you. Nothing is saved on our server.

About this dataset

A results sheet for classes 9 to 12 at a fictional school: five subject marks out of 100, the total, percentage, Pass/Fail and a grade on a CBSE-style nine-point scale. Attendance and weekly self-study hours are included too, which is what makes the file interesting.

Teachers and students know this layout already, so it is ideal for learning Excel formulas (SUM, AVERAGE, IF, COUNTIF, RANK), conditional formatting and charts, and then moving on to correlation and a first regression in Python.

Good for practising: Excel formulas, Correlation, Regression, Conditional formatting.

What's built into the data

The rows are random, but they follow rules, so there is something real to find. These are the patterns to look for:

  • Higher attendance and more study hours both go with higher marks, but not perfectly: there is real noise.
  • Maths averages a few marks lower than the other subjects, English a little higher.
  • A student fails if any subject is below 33, even when their percentage is fine. Look for those cases.
  • Grades follow the percentage: A1 for 91 and above, A2 for 81–90, down to E below 33.

Columns

ColumnTypeDescription
roll_noID (text)Student roll number.
student_nameTextFictional name.
genderCategoryMale or Female.
class_levelWhole numberClass 9, 10, 11 or 12.
sectionCategorySection A to D.
attendance_pctDecimalAttendance for the year, in percent.
study_hours_per_weekWhole numberSelf-reported hours of study outside school.
mathsWhole numberMarks out of 100.
scienceWhole numberMarks out of 100.
englishWhole numberMarks out of 100.
social_scienceWhole numberMarks out of 100.
second_languageWhole numberMarks out of 100.
totalWhole numberSum of the five subjects (out of 500).
percentageDecimaltotal ÷ 5.
resultCategoryFail if any subject is below 33, otherwise Pass.
gradeCategoryA1, A2, B1, B2, C1, C2, D or E, from the percentage.

Preview: the first 8 rows

A sample with seed 2026. Your download will have different values but the same columns and patterns.

roll_nostudent_namegenderclass_levelsectionattendance_pctstudy_hours_per_weekmathsscienceenglishsocial_sciencesecond_languagetotalpercentageresultgrade
S02401Varun FernandesMale12D88.517655455656930861.6PassB2
S02402Ravi JhaMale11C98.73546857636130360.6PassC1
S02403Mary BanerjeeFemale11A457304539464820841.6FailC2
S02404Simran BoseFemale12D93.25836476678537575.0PassB1
S02405Swati MukherjeeFemale9D90.914645568527431362.6PassB2
S02406Abhishek DeshmukhMale11D79.28716260876434468.8PassB2
S02407Aisha YadavFemale12D82.34554754586427855.6PassC1
S02408Manish MenonMale11C87.010413445424220440.8PassD

Practice exercises

  1. Recalculate total, percentage, result and grade with Excel formulas and check them against the file.
  2. Rank students within each class and section. Who are the toppers of each section?
  3. Find students who failed even though their percentage is above 40. Which subject caught them out?
  4. Draw a scatter plot of attendance against percentage and calculate the correlation. Then do the same for study hours.
  5. Fit a linear regression predicting percentage from attendance and study hours. How much does one extra hour of study add?

Stuck on one? Each exercise uses ideas from the lessons below, and trying it with the messy option on turns it into a cleaning exercise as well.

Load it straight into Python

You don't have to download first. Pandas can read the link directly, in Jupyter, Google Colab or a script. Keep the seed so you get the same data every time you run the notebook:

import pandas as pd

url = "https://beeprotonai.info/resources/datasets/student-marks/download/?rows=1000&seed=42"
df = pd.read_csv(url)
df.head()

For SQL practice, download the SQL format and run it against an empty database, for example sqlite3 practice.db < student-marks-1000-rows-seed42.sql or mysql -u root -p practice < student-marks-1000-rows-seed42.sql (use your file's name). It creates a table called student_marks and fills it.

About the data

Everything in this file is invented. Names are random pairings of common first names and surnames, email addresses use example.com (reserved for examples, so it can never reach anyone), and phone numbers start with +91 00, which no real Indian mobile number does. Any resemblance to a real person or business is coincidence. Dates run from 1 April 2024 to 31 March 2026 unless a column says otherwise. Use it freely for learning, teaching and projects, including commercial ones, with no attribution required (CC0).

Lessons that go with it

More datasets

See all 14 datasets →