Student Exam Results dataset
Marks in five subjects with attendance and study hours, plus totals, percentage, result and CBSE-style grade.
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
| Column | Type | Description |
|---|---|---|
roll_no | ID (text) | Student roll number. |
student_name | Text | Fictional name. |
gender | Category | Male or Female. |
class_level | Whole number | Class 9, 10, 11 or 12. |
section | Category | Section A to D. |
attendance_pct | Decimal | Attendance for the year, in percent. |
study_hours_per_week | Whole number | Self-reported hours of study outside school. |
maths | Whole number | Marks out of 100. |
science | Whole number | Marks out of 100. |
english | Whole number | Marks out of 100. |
social_science | Whole number | Marks out of 100. |
second_language | Whole number | Marks out of 100. |
total | Whole number | Sum of the five subjects (out of 500). |
percentage | Decimal | total ÷ 5. |
result | Category | Fail if any subject is below 33, otherwise Pass. |
grade | Category | A1, 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_no | student_name | gender | class_level | section | attendance_pct | study_hours_per_week | maths | science | english | social_science | second_language | total | percentage | result | grade |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| S02401 | Varun Fernandes | Male | 12 | D | 88.5 | 17 | 65 | 54 | 55 | 65 | 69 | 308 | 61.6 | Pass | B2 |
| S02402 | Ravi Jha | Male | 11 | C | 98.7 | 3 | 54 | 68 | 57 | 63 | 61 | 303 | 60.6 | Pass | C1 |
| S02403 | Mary Banerjee | Female | 11 | A | 45 | 7 | 30 | 45 | 39 | 46 | 48 | 208 | 41.6 | Fail | C2 |
| S02404 | Simran Bose | Female | 12 | D | 93.2 | 5 | 83 | 64 | 76 | 67 | 85 | 375 | 75.0 | Pass | B1 |
| S02405 | Swati Mukherjee | Female | 9 | D | 90.9 | 14 | 64 | 55 | 68 | 52 | 74 | 313 | 62.6 | Pass | B2 |
| S02406 | Abhishek Deshmukh | Male | 11 | D | 79.2 | 8 | 71 | 62 | 60 | 87 | 64 | 344 | 68.8 | Pass | B2 |
| S02407 | Aisha Yadav | Female | 12 | D | 82.3 | 4 | 55 | 47 | 54 | 58 | 64 | 278 | 55.6 | Pass | C1 |
| S02408 | Manish Menon | Male | 11 | C | 87.0 | 10 | 41 | 34 | 45 | 42 | 42 | 204 | 40.8 | Pass | D |
Practice exercises
- Recalculate total, percentage, result and grade with Excel formulas and check them against the file.
- Rank students within each class and section. Who are the toppers of each section?
- Find students who failed even though their percentage is above 40. Which subject caught them out?
- Draw a scatter plot of attendance against percentage and calculate the correlation. Then do the same for study hours.
- 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
Two years of orders from a fictional chain of Indian sweet shops, with Diwali …
Employee & Attrition RecordsAn HR file of employees with salary, satisfaction, overtime and whether they left: built …
Customer List (CRM)Customer records with contact details, segment, orders and spend: ideal for cleaning, deduplication and …
Stock Register (Inventory)Monthly stock register for five warehouses: opening, received, issued, closing, reorder level and value.
Website Traffic (Analytics)Daily sessions, users, bounce rate and conversions by page, traffic source and device.
Daily City WeatherSimulated daily temperature, rain, humidity and AQI for Indian cities, with monsoon and winter …