Project Based Learning
Overview
This chapter is a teacher's guide to running the Class XII IP project. It covers the steps and approaches of project-based learning, teamwork, data collection and design, implementation with Pandas, Matplotlib and SQL, testing, and the plagiarism and data-citation rules in the syllabus. It also gives a report structure, a six-month timeline, a suggested rubric, twelve Indian project ideas and three runnable starter templates.
The CBSE 2025-26 syllabus assesses this chapter through Project Work (5 of the 30 practical marks): a real-world IT application using CSV or database data, Python libraries and charts, done individually or in groups of 2 to 3, started at least six months before submission, with all resources referenced. There is no separate theory question on this chapter in the board theory paper.
Learning outcomes
- Students will be able to identify a real-world problem from their surroundings and frame it as specific analysis questions.
- Students will be able to explain the steps of project-based learning and the modular, top-down and bottom-up approaches.
- Students will be able to collect primary or secondary data, organise it in a CSV file and describe it with a data dictionary.
- Students will be able to implement a project with Pandas (import, clean, process, export), Matplotlib (line, bar, histogram) and, where useful, SQL.
- Students will be able to work in a team with clear roles and communicate progress.
- Students will be able to avoid plagiarism, respect copyright and privacy, and cite every data source and resource.
- Students will be able to document the project in a standard report format and explain any part of it in the viva.
Lesson plan
Explain the syllabus requirements: 5 marks, groups of 2 to 3, start six months early, referencing. Show a sample project from a previous batch. Share the rubric and timeline.
Brainstorm on the board: list data around the school and neighbourhood (canteen, library, attendance, shops, open data). Students visit one place as homework and note how data is recorded there.
Groups form, choose roles and write a one-page proposal with at least five analysis questions. Teacher approves or asks for narrowing.
Lab demonstration: search data.gov.in, download a CSV, and record title, publisher, URL and date of access. Groups design survey forms or plan register copying. Discuss permission and anonymisation.
Teach modular, top-down and bottom-up approaches. Each group draws a module diagram and fills a design sheet mapping questions to Pandas/SQL operations and chart types.
Lab: run starter template 1 together, then groups adapt the pattern (import, inspect, clean, process, visualise, export) to their own data. Teacher circulates and checks progress logs.
Demonstrate isnull(), duplicated(), dropna(), drop_duplicates() and hand-checks. Groups run checks on their data and record decisions.
Board discussion on choosing line, bar or histogram. Groups present one chart each to the class; peers suggest improvements in titles, labels and legends.
Case discussion: a copied project, an uncited image, a dataset without attribution. Students write the bibliography entries for their own sources.
Walk through the report structure section by section. Groups submit drafts; teacher returns written feedback within a week.
Each member explains a part of the code they did not write and makes a small live change. Final submission with signed certificate.
Notes
Project work in the CBSE IP syllabus
The CBSE 2025-26 syllabus makes the project part of the Class XII practical examination. Key facts a teacher must share with students at the start of the session:
- Weightage: Project Work carries 5 marks out of the 30 practical marks (the others are Pandas/Matplotlib programs 8, SQL queries 7, practical file 5 and viva-voce 5).
- Aim: to create a tangible and useful IT application by identifying a real-world problem from the student's surroundings, such as a shop, a business, a community group or the school itself.
- Content: students take data stored in a CSV file or a database, analyse it with Python libraries (Pandas), and present findings with suitable charts (Matplotlib). Concepts from both Class XI and Class XII may be used.
- Group size: individually or in groups of 2 to 3 students.
- Start date: at least 6 months before the submission deadline.
- Ethics: students must avoid plagiarism and copyright violation, and every resource used (data, images, code) must be properly referenced.
| Practical component | Marks |
|---|---|
| Programs using Pandas and Matplotlib | 8 |
| SQL queries | 7 |
| Practical file (15 Pandas, 4 Matplotlib, 15 SQL) | 5 |
| Project work | 5 |
| Viva-voce | 5 |
| Total | 30 |
Announce project groups and topics in the first month of Class XII. Projects started in December rarely meet the standard expected in the February practical examination.
What is project-based learning?
In project-based learning, students learn by working on a real problem over an extended period instead of solving short textbook exercises. They must break the problem into parts, gather data, choose methods, build a solution and report the result.
For IP students the benefits are concrete:
- Pandas, Matplotlib and SQL are used together on one meaningful dataset, so students see why each tool exists.
- Students practise skills that board exams cannot test easily: planning, teamwork, decision-making, communication and time management.
- The finished project gives students something to discuss confidently in the viva and, later, in college or job interviews.
The teacher acts as a guide: approving topics, setting milestones, reviewing progress and checking originality, but not writing the code.
Show students one good project from a previous batch (with permission and with personal data removed). A concrete example clarifies expectations faster than any instruction sheet.
Steps in project-based learning
A project moves through five broad stages. Students should be able to name and explain them.
- Identification of the project: find a real, useful problem. Interdisciplinary topics (IP with Economics, Geography, Biology or Physical Education) are encouraged.
- Defining a plan: choose a team leader, define each member's role, list the tools needed, and think about extreme or unusual cases.
- Fixing a time frame: divide the work into activities, estimate the time each needs, and fix milestone dates while leaving some flexibility.
- Guidance and monitoring: when stuck, consult books, websites and experts; the team leader and guide teacher monitor progress regularly.
- Outcome of the project: produce and present the result. The outcome may be single or multiple, and it should be reviewed by peers and the teacher and improved on the basis of feedback.
| Stage | Student output | Teacher check |
|---|---|---|
| Identification | One-page project proposal (synopsis) | Topic is real, useful and of the right size |
| Plan | Role chart and list of tools | Every member has a clear, fair share |
| Time frame | Timeline with milestone dates | Dates fit the school calendar |
| Guidance and monitoring | Progress log, monthly demo | Work is the students' own and on track |
| Outcome | Working code, charts, report, presentation | Assessed with the rubric |
Approaches to solving a project
Large problems are easier to solve when divided into smaller parts. Three common approaches:
- Modular approach: the project is divided into independent modules, each with a well-defined task, inputs and outputs. The outputs are integrated at the end. In a canteen project, the modules could be data entry, sales analysis, stock report and charts.
- Top-down approach: start with the overall goal and keep breaking it into smaller sub-tasks until each is simple enough to code. Example: "Analyse results" breaks into "compute totals", "compute grades", "compare sections", "plot charts".
- Bottom-up approach: first build small, working pieces (a function to compute a grade, a function to draw a chart) and then combine them into the complete system.
In practice, teams plan top-down and build module by module, testing each piece before integration.
Ask each group to draw a module diagram on chart paper before writing any code. It doubles as a figure for the project report.
Step 1: identifying a real problem
The syllabus suggests that students explore their surroundings: visit shops, businesses, offices or community groups, and ask how data is generated, stored and used there. Good sources of ideas:
- The school: results, attendance, library, canteen, transport, sports day, fee collection.
- The neighbourhood: a kirana store, a pharmacy, a tuition centre, a resident welfare association.
- Public open data: weather, rainfall, census, crop production, tourism, from data.gov.in.
- Interests: cricket, films, music charts, fitness tracking.
A good project problem is specific, has data that can actually be collected, and leads to questions that Pandas and charts can answer. "Study pollution" is too vague; "Compare monthly PM2.5 levels of Delhi and Bengaluru for 2023 using CPCB data" is a workable project.
Insist that every proposal lists at least five analysis questions. If students cannot write five questions, the topic is not ready.
Step 2: collecting and organising data
Data can be primary (collected by the students themselves) or secondary (collected by someone else and reused).
- Primary: a survey made with an online form tool such as Google Forms, a register copied from the school canteen or library, readings taken by students.
- Secondary: open government datasets from data.gov.in, published sports statistics, reports from government departments.
Whatever the source, store the data as a CSV file with one row per record and one column per attribute. Keep a short data dictionary: column name, meaning, data type and units. Keep the raw file unchanged and save cleaned data in a separate file, so that the original can always be checked.
| Column | Meaning | Type | Example |
|---|---|---|---|
| Date | Date of sale | date (YYYY-MM-DD) | 2025-07-07 |
| Item | Name of food item | text | Samosa |
| Category | Snacks, Meals or Beverages | text | Snacks |
| Qty | Units sold that day | integer | 40 |
| Rate | Price per unit in rupees | integer | 15 |
Before a survey goes out, have the class answer it themselves. Problems such as free-text answers that are hard to analyse show up immediately.
Step 3: designing the solution
Design means deciding, on paper, how each question will be answered before any code is written. For every question, students should note:
- Which columns are needed.
- Which operation answers it: filtering, sorting, a new computed column,
groupby()withsum()/mean()/count(), or an SQL query withGROUP BY. - Which chart best shows the answer, with its title and axis labels.
If the project uses MySQL, the design also includes the table structure (columns, data types and primary key) and, where two tables are used, the common column for the equi-join.
| Analysis question | Pandas / SQL operation | Chart |
|---|---|---|
| Which item earns the most? | groupby('Item')['Amount'].sum(), sort | Bar chart |
| How do daily sales change? | groupby('Date')['Amount'].sum() | Line plot |
| How are percentages spread? | Percent column | Histogram |
| Which section scored better? | groupby('Section')['Percent'].mean() | Bar chart with legend |
| Customers per city (in MySQL) | SELECT City, COUNT(*) ... GROUP BY City | Bar chart |
Step 4: implementing with Pandas, Matplotlib and SQL
A typical IP project program follows the same pattern:
import pandas as pdandimport matplotlib.pyplot as plt.- Import data with
pd.read_csv()(or create it and save withto_csv()). - Inspect it with
shape,head(),columns,dtypes. - Clean it (see the next section).
- Process: add computed columns, filter with Boolean indexing, group and aggregate.
- Visualise: line, bar and histogram charts with title, axis labels and legend; save each with
plt.savefig(). - Export the processed data with
to_csv().
SQL can be used for storage and querying (for example, keeping records in MySQL tables and summarising them with GROUP BY). Moving data between MySQL and Pandas needs an extra connector library and is optional for the project.
The short program below answers two questions for a school library project.
import pandas as pd
# Question: Which genres are borrowed most, and how much late fine is due?
log = pd.DataFrame({
"BookID": ["B101", "B205", "B118", "B330", "B205", "B412", "B101", "B330"],
"Genre": ["Fiction", "Science", "Fiction", "History",
"Science", "Comics", "Fiction", "History"],
"Class": ["IX", "XII", "X", "XI", "XI", "IX", "XII", "X"],
"Days": [10, 18, 7, 21, 12, 3, 16, 9],
})
log.to_csv("library_issues.csv", index=False) # export
df = pd.read_csv("library_issues.csv") # import
print(df.groupby("Genre")["BookID"].count().sort_values(ascending=False).to_string())
late = df[df["Days"] > 14] # Boolean indexing
fine = ((late["Days"] - 14) * 2).sum() # Rs 2 per extra day
print("Late returns:", len(late), "| Total fine: Rs", fine)Genre Fiction 3 History 2 Science 2 Comics 1 Late returns: 3 | Total fine: Rs 26
Insist on comments that link each block of code to a question in the proposal. Examiners and viva questions often ask "which part of your code answers question 3?"
Choosing the right chart
The syllabus covers three chart types. Students must justify their choice in the report.
- Line plot (
plt.plot()): change over time or an ordered sequence, such as daily sales or monthly temperature. - Bar chart (
plt.bar()): comparison of categories, such as revenue by item or average marks by subject. Side-by-side bars with a legend compare two groups. - Histogram (
plt.hist()): the distribution of one numeric variable, such as how many students fall in each percentage band.
Every chart needs a title, axis labels with units, and a legend whenever more than one series is drawn. Save charts with plt.savefig('name.png') so that they can be pasted into the report.
| Data question | Chart | Matplotlib function |
|---|---|---|
| How did it change over months? | Line plot | plt.plot() |
| Which category is largest? | Bar chart | plt.bar() |
| How are values spread across ranges? | Histogram | plt.hist() |
| How do two groups compare across categories? | Grouped bar chart with legend | plt.bar() twice + plt.legend() |
Testing and validating results
Wrong conclusions from dirty data are the most common weakness in student projects. Build these checks into every project:
- Missing values:
df.isnull().sum()shows how many blanks each column has. Decide whether to drop them (dropna()) or fill them (fillna()), and record the decision in the report. - Duplicates:
df.duplicated().sum(); remove withdrop_duplicates()(common when a survey form is submitted twice). - Range checks: marks between 0 and 100, quantities not negative, dates within the study period.
- Hand check: compute one total or average by hand or in a spreadsheet and match it with the program's answer.
The example reads a small survey file screen_time.csv that has one blank answer and one duplicate response.
| RespID | Class | Hours |
|---|---|---|
| 1 | XI | 3.5 |
| 2 | XII | 5.0 |
| 3 | XI | (blank) |
| 4 | XII | 2.0 |
| 5 | XI | 6.5 |
| 6 | XII | 4.0 |
| 6 | XII | 4.0 |
import pandas as pd
survey = pd.read_csv("screen_time.csv")
print(survey)
print("Missing values:", survey["Hours"].isnull().sum())
print("Duplicate rows:", survey.duplicated().sum())
clean = survey.drop_duplicates().dropna()
print("Rows after cleaning:", len(clean))
print("Mean hours:", round(clean["Hours"].mean(), 2),
"| Median hours:", clean["Hours"].median())RespID Class Hours 0 1 XI 3.5 1 2 XII 5.0 2 3 XI NaN 3 4 XII 2.0 4 5 XI 6.5 5 6 XII 4.0 6 6 XII 4.0 Missing values: 1 Duplicate rows: 1 Rows after cleaning: 5 Mean hours: 4.2 | Median hours: 4.0
Teamwork in a project
Most IP projects are done in groups of 2 or 3. Teamwork is the combined effort of members working towards one goal; just as a cricket wicket needs both a good ball and a safe catch, a project needs every member's contribution.
Components of good teamwork:
- Communicate: meet regularly and use a shared group or document to record decisions.
- Listen: hear every member's ideas before deciding.
- Share: share data, code and knowledge; a member who is strong in Matplotlib helps others learn it.
- Respect: value every opinion; ignoring a member reduces their effort.
- Help: support a member who is stuck; take expert help when needed.
- Participate: every member must take part in coding, documentation and the viva.
Suggested roles for a team of three: Data lead (collection and cleaning), Analysis lead (Pandas/SQL), Visualisation and report lead (charts and documentation). Roles guide the work but do not limit it; every member must understand the whole project.
In the viva, ask each member to explain a part of the code they did not write. This quickly shows whether the group truly worked as a team.
Plagiarism, copyright and citing data
The syllabus requires teachers to sensitise students about plagiarism and copyright, and to ensure that every resource is suitably referenced.
- Plagiarism is presenting someone else's work (code, text, charts, images, ideas) as your own. Copying a project from the internet or a senior and changing the names is plagiarism.
- Copyright protects creative work. Images, logos and datasets may be used only if their licence allows it, and the source must be credited.
- Open data from data.gov.in is published under the Government Open Data License - India, which allows reuse with attribution.
- Code adapted from a book, website or AI assistant must be acknowledged in the report, and the student must be able to explain every line.
- Data about real people (students, customers) must be used with permission and made anonymous: replace names with codes such as S01, S02.
A citation should let a reader find the same source again.
| Resource | How to cite (example format) |
|---|---|
| Open dataset | Title of dataset, publisher, data.gov.in, URL, accessed on 12-08-2025 |
| Book | Author(s), Title, Publisher, Year |
| Website or article | Author or organisation, Page title, URL, accessed on date |
| Image or icon | Creator, source website, licence (e.g. CC BY 4.0) |
| Survey data | Collected by the project team through an online form, dates of survey, number of responses |
| Code help | Source (book, website or tool), what was adapted, in which part of the program |
Ask for the raw data file and a progress log at every monthly review. A project built step by step in front of you is very hard to plagiarise.
Documentation: structure of the project report
The project report (often submitted as a file) shows what was done and how. A standard structure for an IP project:
Keep the report concise and readable. Every chart should have a figure number and one or two lines explaining what it shows. Source code should be printed with comments, and outputs should be screenshots or copied text from actual runs.
| Section | What it contains |
|---|---|
| Cover page | Project title, school name, session, student names, roll numbers, guide teacher |
| Certificate | Signed by the guide teacher (and principal/external examiner) confirming the work is the students' own |
| Acknowledgement | Thanks to the teacher, principal, data providers and anyone who helped |
| Index (contents) | Section titles with page numbers |
| Introduction | Background of the problem and why it matters |
| Objectives | The specific questions the project answers |
| Tools and requirements | Hardware, OS, Python version, Pandas, Matplotlib, MySQL, editors used |
| Data description | Source, collection method, number of records, data dictionary, cleaning steps |
| Design | Module diagram or flowchart; table structure if MySQL is used |
| Source code | Complete, commented code |
| Outputs | Screenshots of printed results and charts with captions |
| Conclusion and limitations | Answers to the objectives, what could not be done, future scope |
| Bibliography | All books, websites, datasets and tools used, in a consistent citation format |
Timeline: starting six months early
The syllabus asks students to start the project at least six months before the submission deadline. If practical exams are in late January or February, the project should begin in July. A month-wise plan keeps groups on track:
| Month | Milestone | Evidence for the teacher |
|---|---|---|
| July | Form teams, explore surroundings, choose topic | Approved one-page proposal with 5+ questions |
| August | Collect data; prepare CSV and data dictionary | Raw data file and data dictionary |
| September | Design: questions mapped to operations and charts; module diagram | Design sheet |
| October | Implement import, cleaning and analysis in Pandas (and SQL if used) | Working code for at least half the questions |
| November | Charts, testing, remaining questions; first draft of report | All outputs and draft report |
| December | Teacher review, corrections, bibliography, final report | Final report and code |
| January | Presentation and viva rehearsal; submission | Signed certificate; submitted project |
Hold a 10-minute progress review with every group once a month and record it in a register. It keeps groups honest and gives evidence if the originality of a project is questioned.
Assessing the project: a suggested rubric
CBSE allots 5 marks to project work but does not prescribe a detailed marking scheme. The rubric below is a suggested school-level scheme that spreads the 5 marks over the qualities the syllabus values. Share it with students at the start so that they know how they will be judged.
| Criterion | Marks | Excellent | Satisfactory | Needs improvement |
|---|---|---|---|---|
| Problem and data | 1 | Real, specific problem; well-organised and cited data | Clear problem; data adequate | Vague problem or copied data |
| Implementation (Pandas/SQL) | 1.5 | Correct, well-commented code that answers all objectives | Works for most objectives | Errors or answers few objectives |
| Visualisation and analysis | 1 | Appropriate charts with labels, legend, and sound conclusions | Charts present but some labels or reasoning missing | Wrong chart types or no interpretation |
| Documentation and ethics | 0.5 | Complete report; all sources referenced | Report mostly complete | Missing sections or uncited sources |
| Presentation and viva | 1 | Every member explains any part confidently | Members explain their own parts | Cannot explain the code |
| Total | 5 |
Twelve project ideas with an Indian context
These ideas can be adapted to any school. Each can be done with Pandas and Matplotlib; several can also use MySQL tables and SQL queries.
| # | Project | Data source | Sample questions |
|---|---|---|---|
| 1 | School result analysis | Anonymised marks of a class (CSV) | Subject with lowest average? Section-wise comparison? Grade distribution? |
| 2 | School canteen sales | Canteen daily register | Best-selling item? Busiest weekday? Revenue by category? |
| 3 | Local weather and rainfall | District rainfall/temperature data from data.gov.in | Wettest month? Monsoon share of yearly rain? Year-to-year change? |
| 4 | Library management with CSV | Library issue/return register | Most borrowed genre? Overdue books and fines? Class-wise reading? |
| 5 | Cricket statistics | Published scorecards of Indian players (cited) | Batting average and strike rate? Runs per season? Home vs away? |
| 6 | Class attendance tracker | Monthly attendance register | Attendance % by month? Students below 75%? |
| 7 | Household electricity use | Family electricity bills for 12-24 months | Units per month? Summer vs winter? Bill trend? |
| 8 | Teen screen-time survey | Google Forms survey of classmates | Average hours by class? Link with sleep hours? |
| 9 | State-wise literacy | Census 2011 tables on data.gov.in | Top and bottom 5 states? Male-female literacy gap? |
| 10 | Book donation drive | CSV of donated books and their condition | Books by condition and category? Sales of refurbished items? |
| 11 | Sports day house points | Event results by house (MySQL tables) | House totals with GROUP BY? Event-wise winners via join? |
| 12 | Local market vegetable prices | Weekly prices recorded at a local mandi | Price trend of onion and tomato? Most volatile item? |
Steer weaker groups to ideas 1, 2, 4 or 6, where the data is easy to collect and the analysis is familiar. Stronger groups can take open-data projects such as 3 or 9, which need more cleaning.
Preparing for the project viva
The project viva checks understanding and originality. Students should be ready to answer questions such as:
- What problem does your project solve, and who benefits?
- Where did your data come from? How many records and columns does it have? How did you cite it?
- How did you handle missing values and duplicate rows?
- Show the line of code that computes a particular result. Why did you use
groupby()there? - Why is a line plot (or bar chart, or histogram) suitable for this chart?
- Which part of the project did you do, and how did your team divide the work?
- What are the limitations of your project, and how would you improve it?
Each member should be able to run the program on the lab computer and change a small thing (a chart title, a filter value) when asked.
Conduct a mock viva in December. Students who freeze in a mock viva usually perform far better in the real one.
Key terms
- Project-based learning
- Learning by working over time on a real problem and producing a complete solution.
- Modular approach
- Dividing a project into separate modules with defined tasks, then integrating their outputs.
- Top-down approach
- Starting from the overall goal and breaking it repeatedly into smaller sub-tasks.
- Bottom-up approach
- Building small working components first and combining them into the full system.
- Project proposal (synopsis)
- A short document stating the problem, objectives, data source and plan, submitted for approval.
- Primary data
- Data collected first-hand by the project team, for example through a survey.
- Secondary data
- Data collected by others and reused, for example open government datasets.
- Open data
- Data published publicly for anyone to use, usually with conditions such as attribution.
- data.gov.in
- The Open Government Data Platform India, which publishes government datasets.
- CSV file
- A plain-text file in which each line is a record and values are separated by commas.
- Data dictionary
- A table describing each column of a dataset: name, meaning, type and units.
- Data cleaning
- Fixing or removing missing, duplicate or invalid values before analysis.
- Anonymisation
- Removing or replacing personal identifiers, such as names, to protect privacy.
- Plagiarism
- Presenting another person's work or ideas as one's own without credit.
- Citation
- A reference that credits a source and lets readers find it.
- Bibliography
- The list of all sources used, placed at the end of the project report.
- Rubric
- A marking scheme that lists criteria and describes performance levels for each.
- Milestone
- A checkpoint in the timeline by which a defined part of the work must be complete.
MCQs
Tap an option to check it, or use Show answers above to reveal them all.
-
According to the CBSE 2025-26 syllabus, how many marks does Project Work carry in the Class XII IP practical examination?
Answer(a) 5
Project Work carries 5 of the 30 practical marks.
-
As per the syllabus, a project may be done individually or in a group of:
Answer(b) 2 to 3 students
The syllabus allows individual projects or groups of 2 to 3 students.
-
The syllabus states that students should start the project at least:
Answer(c) six months before the deadline
Students should start at least six months before the submission deadline.
-
Dividing a project into separate parts, each with a well-defined task, inputs and outputs, is called the:
Answer(d) modular approach
In the modular approach, each module performs one well-defined task, and the outputs are integrated at the end.
-
Which chart is most suitable for showing how many students fall in each percentage band?
Answer(b) Histogram
A histogram shows the distribution of a numeric variable across ranges (bins).
-
A team downloads a rainfall dataset from data.gov.in. What must they do?
Answer(c) Cite the dataset, publisher, URL and date of access
Open data may be reused, but every resource used in a project must be suitably referenced.
-
Which Pandas statement counts the number of missing values in each column of DataFrame df?
Answer(a) df.isnull().sum()
isnull() marks each missing value as True, and sum() counts the True values column-wise.
-
Which section of the project report lists all books, websites and datasets used?
Answer(d) Bibliography
The bibliography lists every source used, in a consistent citation format.
-
Collecting responses from classmates using an online survey form gives:
Answer(b) primary data
Data collected first-hand by the project team is primary data.
-
Replacing students' real names with codes such as S01 and S02 before analysis is called:
Answer(a) anonymisation
Anonymisation removes personal identifiers to protect privacy.
Short answer
- 2 marks
List the five steps of project-based learning.
Answer- Identification of the project
- Defining a plan
- Fixing a time frame
- Guidance and monitoring
- Outcome of the project
- 2 marks
Differentiate between primary and secondary data with one example of each.
AnswerPrimary data is collected first-hand by the project team, for example a Google Forms survey on screen time.
Secondary data was collected by someone else and is reused, for example a rainfall dataset from data.gov.in.
- 2 marks
What is plagiarism? Give two ways to avoid it in an IP project.
AnswerPlagiarism is presenting someone else's work or ideas as one's own.
- Write your own code and report, and acknowledge any code or text adapted from a source.
- Cite every dataset, image and reference in the bibliography.
- 2 marks
Name any four components of good teamwork.
AnswerAny four of: communicating with others, listening to others, sharing with others, respecting others, helping others, and participating actively.
- 2 marks
Differentiate between the top-down and bottom-up approaches to a project.
AnswerTop-down: start from the overall goal and break it into smaller sub-tasks until each is simple to implement.
Bottom-up: build and test small components first, then combine them into the complete system.
- 2 marks
Which chart would you use for (a) monthly electricity units of a household over a year, and (b) total sales of each canteen item? Justify.
Answer(a) A line plot, because it shows change over time (months).
(b) A bar chart, because it compares separate categories (items).
Long answer
- 5 marks
Describe the structure of an IP project report. Explain the purpose of any five sections.
AnswerA typical report has: cover page, certificate, acknowledgement, index, introduction, objectives, tools and requirements, data description, design, source code, outputs, conclusion and limitations, and bibliography.
- Certificate: signed by the guide teacher to confirm the work is the students' own.
- Objectives: list the specific questions the project answers; they guide the whole work.
- Tools and requirements: state the hardware, Python version and libraries (Pandas, Matplotlib, MySQL) so that the project can be run again.
- Source code: the complete, commented program, so the examiner can see how each result was produced.
- Bibliography: credits every dataset, book, website and tool used, which avoids plagiarism.
- 5 marks
Your school wants to analyse the sale of items in its canteen. Explain how you would carry out this project using the steps of project-based learning and the modular approach.
AnswerIdentification: the problem is to find best-selling items, busy days and revenue by category so the canteen can plan stock.
Plan: a team of three: data lead (copies the register into a CSV), analysis lead (Pandas), report lead (charts and documentation). Tools: Python, Pandas, Matplotlib.
Time frame: July proposal, August data, September design, October-November coding and charts, December report, January viva.
Modules: (1) data entry into canteen_sales.csv; (2) cleaning and computing Amount = Qty x Rate; (3) analysis with
groupby()by item, category and weekday; (4) charts: line plot of daily revenue, bar chart of item revenue; (5) report.Guidance and monitoring: monthly reviews with the guide teacher.
Outcome: a report with charts and recommendations, reviewed by the canteen owner and teacher, and improved on the basis of their feedback.
- 3 marks
Write a Python program that stores the monthly attendance percentage of a class (July to December) in a DataFrame, saves it to a CSV file, reads it back, prints the months with attendance below 85%, and draws a line plot with title, axis labels and legend.
AnswerThe program exports and imports a CSV, uses Boolean indexing, and draws a labelled line plot.
Python import pandas as pd import matplotlib.pyplot as plt att = pd.DataFrame({ "Month": ["Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], "AttendancePct": [92.5, 88.0, 84.5, 81.0, 86.5, 79.5], }) att.to_csv("attendance.csv", index=False) df = pd.read_csv("attendance.csv") low = df[df["AttendancePct"] < 85] print("Months with attendance below 85%:") print(low.to_string(index=False)) plt.plot(df["Month"], df["AttendancePct"], marker="o", label="Class XII-A") plt.title("Monthly Attendance, July-December") plt.xlabel("Month") plt.ylabel("Attendance (%)") plt.legend() plt.savefig("attendance.png") plt.show()OutputMonths with attendance below 85%: Month AttendancePct Sep 84.5 Oct 81.0 Dec 79.5
Case-based
Three Class XII students of a school in Lucknow, Ananya, Kabir and Zoya, are doing their IP project on screen-time habits. They collected 120 responses through an online form and exported them to survey.csv with columns RespID, Class, Gender, Hours and SleepHours. Kabir found a ready-made project on a similar topic on a website and suggested submitting it after changing the title. The guide teacher asked them to start by checking the data quality.
- 1 mark
Is Kabir's suggestion acceptable? Give a reason.
AnswerNo. Submitting someone else's project as their own is plagiarism. They may only use ideas with proper credit and must do the work themselves.
- 2 marks
Write Pandas statements to read the file and display the number of missing values in each column and the number of duplicate rows.
Answerdf = pd.read_csv('survey.csv')print(df.isnull().sum())print(df.duplicated().sum()) - 1 mark
Write a statement to display the average screen hours of each class.
Answerprint(df.groupby('Class')['Hours'].mean()) - 1 mark
Which chart should they use to show how many students fall in each band of screen hours (0-2, 2-4, 4-6, 6-8)? Write the Matplotlib statement.
AnswerA histogram:
plt.hist(df['Hours'], bins=[0, 2, 4, 6, 8], edgecolor='black')
Practicals
1Starter template 1: School result analysis
Build a result-analysis project for a Class XII section pair. Store anonymised marks of 12 students in five subjects in results.csv. Read the file, compute Total, Percent and Grade, find subject-wise and section-wise averages, the grade distribution, the topper and students needing remedial classes. Export the processed data and draw (1) a grouped bar chart comparing the two sections subject-wise, with a legend, and (2) a histogram of percentages.
Charts produced: a grouped bar chart in which Section B is slightly ahead in every subject and IP has the highest average, and a histogram in which the 60-75 band is the tallest (4 students) and the 45-60 and 90-100 bands have 3 students each.
# Mini-project 1: School Result Analysis
# Tools: Pandas (CSV import/export, new columns, groupby) and Matplotlib (bar, histogram)
import pandas as pd
import matplotlib.pyplot as plt
# ---------- Step 1: create the data file ----------
# In the real project, replace this block with your school's (anonymised) result
# data saved as results.csv. Use roll numbers or codes instead of real names.
data = {
"RollNo": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
"Name": ["S01", "S02", "S03", "S04", "S05", "S06",
"S07", "S08", "S09", "S10", "S11", "S12"],
"Section": ["A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B"],
"English": [78, 85, 62, 91, 55, 70, 88, 67, 74, 95, 49, 81],
"Maths": [65, 92, 48, 88, 40, 72, 95, 58, 69, 90, 38, 77],
"Economics": [72, 80, 60, 85, 52, 68, 84, 63, 71, 89, 45, 79],
"Accounts": [70, 88, 55, 93, 47, 75, 91, 60, 66, 94, 42, 83],
"IP": [85, 95, 70, 97, 61, 80, 96, 72, 78, 99, 58, 88],
}
pd.DataFrame(data).to_csv("results.csv", index=False)
# ---------- Step 2: import the CSV into a DataFrame ----------
df = pd.read_csv("results.csv")
print("Rows and columns:", df.shape)
# ---------- Step 3: add computed columns ----------
subjects = ["English", "Maths", "Economics", "Accounts", "IP"]
df["Total"] = df[subjects].sum(axis=1)
df["Percent"] = (df["Total"] / len(subjects)).round(1)
def grade(p):
if p >= 90:
return "A"
elif p >= 75:
return "B"
elif p >= 60:
return "C"
elif p >= 33:
return "D"
return "E"
df["Grade"] = df["Percent"].apply(grade)
print(df[["RollNo", "Section", "Total", "Percent", "Grade"]].to_string(index=False))
# ---------- Step 4: answer the analysis questions ----------
print("\nSubject-wise average:")
print(df[subjects].mean().round(2).to_string())
print("\nSection-wise average percentage:")
print(df.groupby("Section")["Percent"].mean().round(2).to_string())
print("\nNumber of students per grade:")
print(df.groupby("Grade")["RollNo"].count().to_string())
top = df.loc[df["Percent"].idxmax()]
print("\nTopper:", top["Name"], "of Section", top["Section"], "with", top["Percent"], "%")
weak = df[df["Percent"] < 60]
print("Students needing remedial classes:", list(weak["Name"]))
# ---------- Step 5: export the processed data ----------
df.to_csv("results_with_grades.csv", index=False)
# ---------- Step 6: visualise ----------
# Chart 1: section-wise subject averages (grouped bar chart with legend)
sec_avg = df.groupby("Section")[subjects].mean()
x = range(len(subjects))
plt.figure(figsize=(8, 4))
plt.bar([i - 0.2 for i in x], sec_avg.loc["A"], width=0.4, label="Section A")
plt.bar([i + 0.2 for i in x], sec_avg.loc["B"], width=0.4, label="Section B")
plt.xticks(list(x), subjects)
plt.xlabel("Subject")
plt.ylabel("Average marks")
plt.title("Class XII: Subject-wise Average by Section")
plt.ylim(0, 100)
plt.legend(loc="upper left")
plt.tight_layout()
plt.savefig("subject_average.png")
plt.show()
# Chart 2: distribution of percentages (histogram)
plt.figure(figsize=(7, 4))
plt.hist(df["Percent"], bins=[30, 45, 60, 75, 90, 100], edgecolor="black")
plt.xlabel("Percentage")
plt.ylabel("Number of students")
plt.title("Distribution of Percentages")
plt.tight_layout()
plt.savefig("percent_histogram.png")
plt.show()Rows and columns: (12, 8)
RollNo Section Total Percent Grade
1 A 370 74.0 C
2 A 440 88.0 B
3 A 295 59.0 D
4 A 454 90.8 A
5 A 255 51.0 D
6 A 365 73.0 C
7 B 454 90.8 A
8 B 320 64.0 C
9 B 358 71.6 C
10 B 467 93.4 A
11 B 232 46.4 D
12 B 408 81.6 B
Subject-wise average:
English 74.58
Maths 69.33
Economics 70.67
Accounts 72.00
IP 81.58
Section-wise average percentage:
Section
A 72.63
B 74.63
Number of students per grade:
Grade
A 3
B 2
C 4
D 3
Topper: S10 of Section B with 93.4 %
Students needing remedial classes: ['S03', 'S05', 'S11']Viva questions (4)
- Why are codes like S01 used instead of names? To protect students' privacy (anonymisation).
- What does axis=1 do in df[subjects].sum(axis=1)? It adds across columns, giving a total for each row.
- What does idxmax() return? The index label of the row with the maximum value.
- Why is index=False used in to_csv()? So that the row index is not written as an extra column.
2Starter template 2: School canteen sales
Create a canteen sales register for two school weeks in canteen_sales.csv (Date, Item, Category, Qty, Rate). Read it, convert Date to a date type, compute Amount, and find revenue by item, by category and by weekday, the total revenue and the best day. Draw a line plot of daily revenue and a bar chart of revenue by item.
Charts produced: a line plot that peaks on both Fridays (11 and 18 July), and a bar chart in which Veg Sandwich earns the most and Masala Chai the least.
# Mini-project 2: School Canteen Sales Analysis
# Tools: Pandas (CSV, dates, groupby, sorting) and Matplotlib (line and bar charts)
import pandas as pd
import matplotlib.pyplot as plt
# ---------- Step 1: create the sales register as a CSV file ----------
# In the real project, copy the canteen's daily register into canteen_sales.csv
# (columns: Date, Item, Category, Qty, Rate). Ask the canteen owner's permission.
dates = ["2025-07-07", "2025-07-08", "2025-07-09", "2025-07-10", "2025-07-11",
"2025-07-14", "2025-07-15", "2025-07-16", "2025-07-17", "2025-07-18"]
menu = { # item: (category, rate in rupees, quantity sold on each of the 10 days)
"Samosa": ("Snacks", 15, [40, 35, 42, 38, 55, 41, 37, 44, 39, 60]),
"Veg Sandwich": ("Snacks", 30, [20, 18, 25, 22, 30, 21, 19, 24, 23, 33]),
"Idli Plate": ("Meals", 40, [15, 17, 14, 16, 12, 18, 15, 13, 17, 11]),
"Chhole Kulche": ("Meals", 50, [12, 10, 14, 11, 18, 13, 12, 15, 10, 20]),
"Lemon Water": ("Beverages", 10, [30, 34, 28, 36, 25, 33, 35, 29, 31, 27]),
"Masala Chai": ("Beverages", 12, [22, 20, 24, 19, 21, 23, 20, 22, 25, 18]),
}
rows = []
for item, (category, rate, qtys) in menu.items():
for day, qty in zip(dates, qtys):
rows.append({"Date": day, "Item": item, "Category": category,
"Qty": qty, "Rate": rate})
pd.DataFrame(rows).to_csv("canteen_sales.csv", index=False)
# ---------- Step 2: import and prepare ----------
sales = pd.read_csv("canteen_sales.csv")
sales["Date"] = pd.to_datetime(sales["Date"])
sales["Amount"] = sales["Qty"] * sales["Rate"]
print("Records:", len(sales))
print(sales.head(3).to_string(index=False))
# ---------- Step 3: analysis ----------
item_rev = sales.groupby("Item")["Amount"].sum().sort_values(ascending=False)
print("\nRevenue by item (Rs):")
print(item_rev.to_string())
cat_rev = sales.groupby("Category")["Amount"].sum()
print("\nRevenue by category (Rs):")
print(cat_rev.to_string())
daily = sales.groupby("Date")["Amount"].sum()
print("\nTotal revenue: Rs", daily.sum())
print("Best day:", daily.idxmax().strftime("%d-%m-%Y"), "Rs", daily.max())
sales["Weekday"] = sales["Date"].dt.day_name()
order = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
weekday = sales.groupby("Weekday")["Amount"].sum().reindex(order)
print("\nRevenue by weekday (Rs):")
print(weekday.to_string())
# ---------- Step 4: visualise ----------
# Chart 1: daily revenue trend (line plot)
plt.figure(figsize=(8, 4))
plt.plot(daily.index.strftime("%d-%b"), daily.values, marker="o", label="Daily revenue")
plt.xlabel("Date")
plt.ylabel("Revenue (Rs)")
plt.title("Canteen: Daily Revenue, 7-18 July 2025")
plt.legend()
plt.tight_layout()
plt.savefig("daily_revenue.png")
plt.show()
# Chart 2: revenue by item (bar chart)
plt.figure(figsize=(9, 4))
plt.bar(item_rev.index, item_rev.values, color="orange")
plt.xlabel("Item")
plt.ylabel("Revenue (Rs)")
plt.title("Canteen: Revenue by Item")
plt.xticks(rotation=20)
plt.tight_layout()
plt.savefig("item_revenue.png")
plt.show()Records: 60
Date Item Category Qty Rate Amount
2025-07-07 Samosa Snacks 40 15 600
2025-07-08 Samosa Snacks 35 15 525
2025-07-09 Samosa Snacks 42 15 630
Revenue by item (Rs):
Item
Veg Sandwich 7050
Chhole Kulche 6750
Samosa 6465
Idli Plate 5920
Lemon Water 3080
Masala Chai 2568
Revenue by category (Rs):
Category
Beverages 5648
Meals 12670
Snacks 13515
Total revenue: Rs 31833
Best day: 18-07-2025 Rs 3816
Revenue by weekday (Rs):
Weekday
Monday 6185
Tuesday 5740
Wednesday 6412
Thursday 6073
Friday 7423Viva questions (4)
- Why is pd.to_datetime() used? To convert text dates into date values so that weekday and date formatting work.
- What does dt.day_name() return? The weekday name, such as Monday, for each date.
- Why is reindex(order) used? To show weekdays in calendar order instead of alphabetical order.
- Which chart shows the trend over days? The line plot.
3Starter template 3: Local weather and rainfall (open data)
Prepare a monthly weather file for two years (rainfall, maximum and minimum temperature). For the real project, replace the practice values with a dataset downloaded from data.gov.in and cite it. Check for missing values, find yearly rainfall, the monsoon (June to September) share, the wettest month and the month with the largest day-night temperature gap. Draw a grouped bar chart of monthly rainfall for both years and a line plot of maximum and minimum temperature, each with a legend.
Charts produced: a bar chart in which rainfall is very low from October to May and rises sharply in June, peaking in July and August, and a line plot in which maximum temperature peaks in May and both lines dip during the monsoon.
# Mini-project 3: Local Weather and Rainfall Study (open data)
# Tools: Pandas (CSV, filtering, groupby, percentages) and Matplotlib (line, bar)
import pandas as pd
import matplotlib.pyplot as plt
# ---------- Step 1: get the data ----------
# For the real project, download a rainfall/temperature dataset for your
# state or district from data.gov.in (Open Government Data Platform India)
# and save it as weather.csv. Record the dataset title, publisher, URL and
# date of access for the bibliography.
# The numbers below are ILLUSTRATIVE practice values for one city, not official data.
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
rain_2023 = [12, 8, 5, 3, 10, 140, 380, 420, 210, 35, 10, 6]
rain_2024 = [18, 4, 2, 6, 15, 95, 450, 360, 260, 20, 4, 9]
tmax = [25, 28, 34, 38, 41, 36, 30, 29, 31, 32, 29, 26]
tmin = [10, 12, 17, 22, 26, 25, 23, 23, 22, 19, 14, 11]
weather = pd.DataFrame({
"Year": [2023] * 12 + [2024] * 12,
"Month": months * 2,
"RainfallMM": rain_2023 + rain_2024,
"MaxTemp": tmax * 2,
"MinTemp": tmin * 2,
})
weather.to_csv("weather.csv", index=False)
# ---------- Step 2: import and check the data ----------
w = pd.read_csv("weather.csv")
print("Shape:", w.shape)
print("Missing values in each column:")
print(w.isnull().sum().to_string())
# ---------- Step 3: analysis ----------
yearly = w.groupby("Year")["RainfallMM"].sum()
print("\nTotal rainfall per year (mm):")
print(yearly.to_string())
monsoon = w[w["Month"].isin(["Jun", "Jul", "Aug", "Sep"])]
monsoon_total = monsoon.groupby("Year")["RainfallMM"].sum()
share = (monsoon_total / yearly * 100).round(1)
print("\nMonsoon (Jun-Sep) share of yearly rain (%):")
print(share.to_string())
wettest = w.loc[w["RainfallMM"].idxmax()]
print("\nWettest month:", wettest["Month"], wettest["Year"], "-", wettest["RainfallMM"], "mm")
w["Range"] = w["MaxTemp"] - w["MinTemp"]
one_year = w[w["Year"] == 2024]
print("Month with largest day-night temperature gap:",
one_year.loc[one_year["Range"].idxmax(), "Month"])
# ---------- Step 4: visualise ----------
# Chart 1: monthly rainfall, two years side by side (bar chart with legend)
x = range(12)
plt.figure(figsize=(9, 4))
plt.bar([i - 0.2 for i in x], rain_2023, width=0.4, label="2023")
plt.bar([i + 0.2 for i in x], rain_2024, width=0.4, label="2024")
plt.xticks(list(x), months)
plt.xlabel("Month")
plt.ylabel("Rainfall (mm)")
plt.title("Monthly Rainfall: 2023 vs 2024 (practice data)")
plt.legend(loc="upper left")
plt.tight_layout()
plt.savefig("rainfall_bar.png")
plt.show()
# Chart 2: temperature through the year (line plot with legend)
plt.figure(figsize=(9, 4))
plt.plot(months, tmax, marker="o", color="red", label="Max temp")
plt.plot(months, tmin, marker="s", color="blue", label="Min temp")
plt.xlabel("Month")
plt.ylabel("Temperature (deg C)")
plt.title("Average Monthly Temperature (practice data)")
plt.legend()
plt.tight_layout()
plt.savefig("temperature_line.png")
plt.show()Shape: (24, 5) Missing values in each column: Year 0 Month 0 RainfallMM 0 MaxTemp 0 MinTemp 0 Total rainfall per year (mm): Year 2023 1239 2024 1243 Monsoon (Jun-Sep) share of yearly rain (%): Year 2023 92.8 2024 93.7 Wettest month: Jul 2024 - 450 mm Month with largest day-night temperature gap: Mar
Viva questions (4)
- What does isin() do? It checks whether each value belongs to a given list, here the monsoon months.
- Why must the data source be cited? The syllabus requires all resources to be referenced, and the open-data licence requires attribution.
- Why is a line plot used for temperature? Temperature changes over an ordered sequence of months.
- Why are the bars shifted by -0.2 and +0.2? So that the two years' bars stand side by side instead of overlapping.
Common mistakes
Choosing a vague topic such as "Study of pollution". Narrow it to a specific question, place, period and dataset, and list at least five analysis questions.
Starting the project a few weeks before the practical exam. The syllabus asks for a start at least six months earlier; fix monthly milestones from July.
Copying a project from the internet or a senior and changing names. This is plagiarism; teachers should ask for raw data, a progress log and live code changes in the viva.
Using data without citing it. Every dataset, image and borrowed code idea must appear in the bibliography with enough detail to find it again.
Using real student or customer names without permission. Replace names with codes (S01, S02) and take permission from the data owner.
Analysing data without cleaning it, so missing values and duplicate survey responses distort averages. Always run
isnull().sum()andduplicated().sum()first.Drawing charts without titles, axis labels or legends, or using the wrong type (a line plot for unrelated categories). Match the chart to the question.
One member doing all the coding. Every member must understand and be able to explain every part of the project in the viva.