Aimify IP Material
Class 12 · Chapter 7

Project Based Learning

In CBSE syllabusProject Work (part of practicals, 5 marks)~12 periods
10 MCQs13 written Qs3 practicals

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

Period 1 (July)
Introducing the project

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.

Period 2 (July)
Finding a problem

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.

Period 3 (July)
Proposal and teams

Groups form, choose roles and write a one-page proposal with at least five analysis questions. Teacher approves or asks for narrowing.

Period 4 (August)
Data collection and data.gov.in

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.

Period 5 (August)
Approaches and design

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.

Periods 6-7 (September-October)
Implementation workshop

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.

Period 8 (October)
Data cleaning and testing

Demonstrate isnull(), duplicated(), dropna(), drop_duplicates() and hand-checks. Groups run checks on their data and record decisions.

Period 9 (November)
Charts and interpretation

Board discussion on choosing line, bar or histogram. Groups present one chart each to the class; peers suggest improvements in titles, labels and legends.

Period 10 (November)
Plagiarism, copyright and citation

Case discussion: a copied project, an uncited image, a dataset without attribution. Students write the bibliography entries for their own sources.

Period 11 (December)
Report writing

Walk through the report structure section by section. Groups submit drafts; teacher returns written feedback within a week.

Period 12 (January)
Mock viva and submission

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 componentMarks
Programs using Pandas and Matplotlib8
SQL queries7
Practical file (15 Pandas, 4 Matplotlib, 15 SQL)5
Project work5
Viva-voce5
Total30
Teacher tip

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.

Teacher tip

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.

  1. Identification of the project: find a real, useful problem. Interdisciplinary topics (IP with Economics, Geography, Biology or Physical Education) are encouraged.
  2. Defining a plan: choose a team leader, define each member's role, list the tools needed, and think about extreme or unusual cases.
  3. Fixing a time frame: divide the work into activities, estimate the time each needs, and fix milestone dates while leaving some flexibility.
  4. Guidance and monitoring: when stuck, consult books, websites and experts; the team leader and guide teacher monitor progress regularly.
  5. 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.
StageStudent outputTeacher check
IdentificationOne-page project proposal (synopsis)Topic is real, useful and of the right size
PlanRole chart and list of toolsEvery member has a clear, fair share
Time frameTimeline with milestone datesDates fit the school calendar
Guidance and monitoringProgress log, monthly demoWork is the students' own and on track
OutcomeWorking code, charts, report, presentationAssessed 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.

Teacher tip

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.

Teacher tip

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.

ColumnMeaningTypeExample
DateDate of saledate (YYYY-MM-DD)2025-07-07
ItemName of food itemtextSamosa
CategorySnacks, Meals or BeveragestextSnacks
QtyUnits sold that dayinteger40
RatePrice per unit in rupeesinteger15
Teacher tip

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:

  1. Which columns are needed.
  2. Which operation answers it: filtering, sorting, a new computed column, groupby() with sum()/mean()/count(), or an SQL query with GROUP BY.
  3. 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 questionPandas / SQL operationChart
Which item earns the most?groupby('Item')['Amount'].sum(), sortBar chart
How do daily sales change?groupby('Date')['Amount'].sum()Line plot
How are percentages spread?Percent columnHistogram
Which section scored better?groupby('Section')['Percent'].mean()Bar chart with legend
Customers per city (in MySQL)SELECT City, COUNT(*) ... GROUP BY CityBar chart

Step 4: implementing with Pandas, Matplotlib and SQL

A typical IP project program follows the same pattern:

  1. import pandas as pd and import matplotlib.pyplot as plt.
  2. Import data with pd.read_csv() (or create it and save with to_csv()).
  3. Inspect it with shape, head(), columns, dtypes.
  4. Clean it (see the next section).
  5. Process: add computed columns, filter with Boolean indexing, group and aggregate.
  6. Visualise: line, bar and histogram charts with title, axis labels and legend; save each with plt.savefig().
  7. 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.

Python
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)
Output
Genre
Fiction    3
History    2
Science    2
Comics     1
Late returns: 3 | Total fine: Rs 26
Teacher tip

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 questionChartMatplotlib function
How did it change over months?Line plotplt.plot()
Which category is largest?Bar chartplt.bar()
How are values spread across ranges?Histogramplt.hist()
How do two groups compare across categories?Grouped bar chart with legendplt.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 with drop_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.

RespIDClassHours
1XI3.5
2XII5.0
3XI(blank)
4XII2.0
5XI6.5
6XII4.0
6XII4.0
Python
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())
Output
   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.

Teacher tip

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.

ResourceHow to cite (example format)
Open datasetTitle of dataset, publisher, data.gov.in, URL, accessed on 12-08-2025
BookAuthor(s), Title, Publisher, Year
Website or articleAuthor or organisation, Page title, URL, accessed on date
Image or iconCreator, source website, licence (e.g. CC BY 4.0)
Survey dataCollected by the project team through an online form, dates of survey, number of responses
Code helpSource (book, website or tool), what was adapted, in which part of the program
Teacher tip

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.

SectionWhat it contains
Cover pageProject title, school name, session, student names, roll numbers, guide teacher
CertificateSigned by the guide teacher (and principal/external examiner) confirming the work is the students' own
AcknowledgementThanks to the teacher, principal, data providers and anyone who helped
Index (contents)Section titles with page numbers
IntroductionBackground of the problem and why it matters
ObjectivesThe specific questions the project answers
Tools and requirementsHardware, OS, Python version, Pandas, Matplotlib, MySQL, editors used
Data descriptionSource, collection method, number of records, data dictionary, cleaning steps
DesignModule diagram or flowchart; table structure if MySQL is used
Source codeComplete, commented code
OutputsScreenshots of printed results and charts with captions
Conclusion and limitationsAnswers to the objectives, what could not be done, future scope
BibliographyAll 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:

MonthMilestoneEvidence for the teacher
JulyForm teams, explore surroundings, choose topicApproved one-page proposal with 5+ questions
AugustCollect data; prepare CSV and data dictionaryRaw data file and data dictionary
SeptemberDesign: questions mapped to operations and charts; module diagramDesign sheet
OctoberImplement import, cleaning and analysis in Pandas (and SQL if used)Working code for at least half the questions
NovemberCharts, testing, remaining questions; first draft of reportAll outputs and draft report
DecemberTeacher review, corrections, bibliography, final reportFinal report and code
JanuaryPresentation and viva rehearsal; submissionSigned certificate; submitted project
Teacher tip

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.

CriterionMarksExcellentSatisfactoryNeeds improvement
Problem and data1Real, specific problem; well-organised and cited dataClear problem; data adequateVague problem or copied data
Implementation (Pandas/SQL)1.5Correct, well-commented code that answers all objectivesWorks for most objectivesErrors or answers few objectives
Visualisation and analysis1Appropriate charts with labels, legend, and sound conclusionsCharts present but some labels or reasoning missingWrong chart types or no interpretation
Documentation and ethics0.5Complete report; all sources referencedReport mostly completeMissing sections or uncited sources
Presentation and viva1Every member explains any part confidentlyMembers explain their own partsCannot explain the code
Total5

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.

#ProjectData sourceSample questions
1School result analysisAnonymised marks of a class (CSV)Subject with lowest average? Section-wise comparison? Grade distribution?
2School canteen salesCanteen daily registerBest-selling item? Busiest weekday? Revenue by category?
3Local weather and rainfallDistrict rainfall/temperature data from data.gov.inWettest month? Monsoon share of yearly rain? Year-to-year change?
4Library management with CSVLibrary issue/return registerMost borrowed genre? Overdue books and fines? Class-wise reading?
5Cricket statisticsPublished scorecards of Indian players (cited)Batting average and strike rate? Runs per season? Home vs away?
6Class attendance trackerMonthly attendance registerAttendance % by month? Students below 75%?
7Household electricity useFamily electricity bills for 12-24 monthsUnits per month? Summer vs winter? Bill trend?
8Teen screen-time surveyGoogle Forms survey of classmatesAverage hours by class? Link with sleep hours?
9State-wise literacyCensus 2011 tables on data.gov.inTop and bottom 5 states? Male-female literacy gap?
10Book donation driveCSV of donated books and their conditionBooks by condition and category? Sales of refurbished items?
11Sports day house pointsEvent results by house (MySQL tables)House totals with GROUP BY? Event-wise winners via join?
12Local market vegetable pricesWeekly prices recorded at a local mandiPrice trend of onion and tomato? Most volatile item?
Teacher tip

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.

Teacher tip

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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).

  6. 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.

  7. 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.

  8. 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.

  9. 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.

  10. 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

  1. 2 marks

    List the five steps of project-based learning.

    Answer
    1. Identification of the project
    2. Defining a plan
    3. Fixing a time frame
    4. Guidance and monitoring
    5. Outcome of the project
  2. 2 marks

    Differentiate between primary and secondary data with one example of each.

    Answer

    Primary 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.

  3. 2 marks

    What is plagiarism? Give two ways to avoid it in an IP project.

    Answer

    Plagiarism 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.
  4. 2 marks

    Name any four components of good teamwork.

    Answer

    Any four of: communicating with others, listening to others, sharing with others, respecting others, helping others, and participating actively.

  5. 2 marks

    Differentiate between the top-down and bottom-up approaches to a project.

    Answer

    Top-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.

  6. 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

  1. 5 marks

    Describe the structure of an IP project report. Explain the purpose of any five sections.

    Answer

    A 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.
  2. 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.

    Answer

    Identification: 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. 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.

    Answer

    The 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()
    Output
    Months with attendance below 85%:
    Month  AttendancePct
      Sep           84.5
      Oct           81.0
      Dec           79.5

Case-based

Case study 1

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. 1 mark

    Is Kabir's suggestion acceptable? Give a reason.

    Answer

    No. 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. 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.

    Answer

    df = pd.read_csv('survey.csv')

    print(df.isnull().sum())

    print(df.duplicated().sum())

  3. 1 mark

    Write a statement to display the average screen hours of each class.

    Answer

    print(df.groupby('Class')['Hours'].mean())

  4. 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.

    Answer

    A 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.

Solution
Python
# 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()
Output
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.

Solution
Python
# 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()
Output
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       7423
Viva 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.

Solution
Python
# 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()
Output
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() and duplicated().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.