Smarter school search, clearer school choices.

Illustration

Our Method

Campsul combines trusted school data into simple, comparable metrics. Explore each tab to see how every score is calculated.

Our Data

Data Sources

We use the source files stored in Frontend/resources and map them into the metrics shown across Campsul.

Download the exact source extracts used here:

Update Cycle

  • FSA: annual assessment cycle (Grades 4 and 7), released by school year.
  • Student Learning Survey: annual province-wide survey cycle.
  • Student Headcount by Grade: based on September enrolment (1701) collections each school year.
  • Class Size: collected annually in fall class organization reporting (typically Sept 30 to Oct 15 window).
  • Teacher Headcount/FTE: EDAS reporting periods are quarterly (Q1 to Q4). Campsul currently uses Q4 for ratio consistency and refreshes when updated school-level extracts are received.

BC references: FSA, SLS, K-12 Data Collections, Class Size Definitions, EDAS Guide, Teacher Statistics Definitions.

FSA Scores Methodology (Foundational Skills Assessment)

Purpose

Campsul uses BC's Foundational Skills Assessment (FSA) to represent academic performance in a consistent way across schools, years, and grades. Because government FSA results can appear on different numeric scales, Campsul standardizes them and converts them into a simple 0 to 100 score.

Data Source

We use the official FSA dataset published by the Government of British Columbia and import it as a raw source.

We focus on:

  • SUB_POPULATION: All Students
  • DATA_LEVEL: School Level

The raw dataset includes:

  • School identifiers (district, school number, school name)
  • School year and grade
  • Skill or subject (Literacy, Numeracy, Reading, Writing)
  • Writer and participation fields (expected writers, writers)
  • Performance level counts (Emerging / On Track / Extending), where provided
  • Average score (the main numeric score used in conversion)

Step 1 - Raw Ingestion

We first load the government dataset into a raw table, keeping original values for traceability. At this stage, the key numeric field is the government's AVG_SCORE per school, year, grade, and skill.

Step 2 - Standardizing Different Score Scales to a Common 200 to 800 Scale

2A) Subjects already on 200 to 800

When a subject is already reported on the 200 to 800 scale (commonly Numeracy, and often Reading or Literacy depending on year), we keep it as-is.

2B) Converting Writing to 200 to 800 (when Writing is rubric-based)

When Writing is reported on a rubric scale (for example, 0 to 4), Campsul applies a linear mapping:

writing_200_800 = 200 + (writing_raw / writing_max) * 600

Where:

  • writing_raw = government's Writing score
  • writing_max = maximum rubric score (typically 4.0 for a 0 to 4 rubric)

This mapping ensures 0 -> 200 and 4 -> 800.

Step 3 - Creating a Continuous Literacy Series (Year-to-Year Consistency)

3A) If Literacy is reported

We use the published Literacy score directly (on the 200 to 800 scale).

3B) If Literacy is not reported (backcasting)

For earlier years where Literacy is not a single published value, Campsul computes Literacy as an equal-weight average of Reading and normalized Writing:

literacy_200_800 = 0.5 * reading_200_800 + 0.5 * writing_200_800

This gives one comparable Literacy series across years.

Step 4 - Converting 200 to 800 Scores to a 0 to 100 Score

Once Literacy and Numeracy are on the 200 to 800 scale, Campsul converts them to 0 to 100 using:

score_0_100 = ((score_200_800 - 200) / 600) * 100

We clip results to the range 0 to 100:

  • Values below 0 become 0
  • Values above 100 become 100

This produces:

  • Literacy (0 to 100)
  • Numeracy (0 to 100)

Example

If literacy_200_800 = 560:

((560 - 200) / 600) * 100 = 60

So Literacy becomes 60/100.

Optional Display Scale (0 to 10)

For some UI components, Campsul may display the same score on 0 to 10:

score_0_10 = score_0_100 / 10

This is only a display transformation; the underlying value remains the 0 to 100 version.

Assumptions

  • Writing rubric maximum is known and fixed. If the government changes rubric limits, conversion constants must be updated.
  • Linear mapping for Writing. The rubric-to-200 to 800 conversion assumes equal distance between rubric steps.
  • Literacy backcasting uses equal weights. When Literacy is not directly reported, Campsul uses a 50/50 blend of Reading and normalized Writing.

Primary field shown on Campsul school cards: composite_raw_0_100

SLS Scores Methodology (Student Learning Survey)

Purpose

Campsul uses BC's Student Learning Survey (SLS) to quantify students' perceptions of school experience, including learning environment, relationships, safety, and resources. These perception scores complement academic outcomes by capturing important beyond-test-score dimensions of school quality.

Data Source

We use the official SLS datasets published by the Government of British Columbia.

The data is typically provided at:

  • School: SCHOOL_NUMBER
  • School year: SCHOOL_YEAR
  • Grade group: GRADE_CODE (for example, Grade 4, Grade 7, All Grades)
  • Survey question: question ID and question text
  • Response counts: POSITIVE_COUNT, NEUTRAL_COUNT, NEGATIVE_COUNT
  • Total respondents / student count: STUDENT_COUNT

Core Scoring Formula (Question Level)

For each SLS question, Campsul converts counts into a normalized score between 0 and 1.

Response weights:

  • Positive = 1.0
  • Neutral = 0.5
  • Negative = 0.0

Question Score (0 to 1)

score_0_1 = (Positive + 0.5 * Neutral) / N

Where:

  • Positive = positive response count
  • Neutral = neutral response count
  • N = total respondents (STUDENT_COUNT)

Optional 0 to 100 Scale

score_0_100 = 100 * score_0_1

Primary field shown on Campsul school cards: sls_main_raw_0_100

Handling Suppressed (Masked) Cells

Why suppression happens

In public SLS releases, response counts in small cells can be suppressed to protect privacy. When a count falls under disclosure thresholds, one or more of POSITIVE_COUNT, NEUTRAL_COUNT, or NEGATIVE_COUNT may be missing.

The challenge

The score formula requires Positive and Neutral counts. If those values are missing, direct calculation is not possible. The dataset often still includes total respondent count N, which Campsul uses in a transparent rule-based reconstruction.

Imputing Suppressed Counts (Rule-Based Reconstruction)

When one or more response categories are missing, Campsul imputes counts so:

Positive + Neutral + Negative = N

Imputation Rule

  1. Let N be STUDENT_COUNT.
  2. Sum all non-missing counts: S = sum(known counts).
  3. Let k be the number of missing categories.
  4. Compute remaining responses: R = N - S.
  5. Distribute equally across missing categories: imputed_value = R / k.

This assumes suppressed values are evenly distributed among missing categories when no additional information is available.

Examples

Example 1: Neutral and Negative suppressed

Given: Positive = 11, Neutral = missing, Negative = missing, N = 21.

S = 11, k = 2, R = 21 - 11 = 10, so each missing category gets 10 / 2 = 5.

Imputed: Neutral = 5, Negative = 5.

Score: (11 + 0.5 * 5) / 21 = 13.5 / 21 = 0.643 (or 64.3 on a 0 to 100 scale).

Example 2: All categories suppressed

Given: Positive = missing, Neutral = missing, Negative = missing, N = 21.

S = 0, k = 3, R = 21, so each missing category gets 21 / 3 = 7.

Imputed: Positive = 7, Neutral = 7, Negative = 7.

Score: (7 + 0.5 * 7) / 21 = 10.5 / 21 = 0.500 (or 50.0 on a 0 to 100 scale).

Key Assumptions

  • Total student count equals total respondents. We treat STUDENT_COUNT as students who answered the question.
  • Suppressed categories are evenly distributed. Missing responses are split equally when detailed counts are not available.
  • Neutral responses are half-weighted. Neutral is treated as partially positive (0.5), not negative.

Student Headcount by Grade Methodology (2017/2018-2024/2025)

Purpose

Campsul uses the Student Headcount by Grade dataset to show school size and grade distribution (for example, total enrolment, enrolment by grade, and selected student groups). This gives context for interpreting other school indicators, since small cohorts usually produce noisier results than large cohorts.

Data Source

We use the Government of British Columbia's Student Headcount by Grade open data extract. The extract contains provincial, district, and school-level headcount based on September enrolment collections.

For Campsul, we use the portion of the dataset covering 2017/2018 through 2024/2025, which are the years used in the current platform.

What "Headcount" Means (Technical Note)

A student may be registered at more than one school. To avoid double-counting, the government assigns each student to one authority school. From 2006/2007 onward, authority school is mainly based on the September enrolment record where the student's Full-Time Equivalent (FTE) is highest (where they take most of their classes).

Homeschooled children are excluded from this dataset because they are registered but not enrolled in a school. The dataset includes both school-age students and adult students (over age 19).

Key Fields Used by Campsul

  • SCHOOL_YEAR (July 1 to June 30)
  • DATA_LEVEL (Province Level / District Level / School Level)
  • PUBLIC_OR_INDEPENDENT (BC Public School / BC Independent School / Province-Total)
  • DISTRICT_NUMBER / DISTRICT_NAME
  • SCHOOL_NUMBER (MINCODE) / SCHOOL_NAME
  • FACILITY_TYPE (for example, Standard, Online Learning, Continuing Education, Alternate)
  • GRADE, including Grades 1-12, KF (Kindergarten full-time), KH (Kindergarten half-time), ungraded categories, and rollups such as All K, All Elementary, All Secondary, and All Grades

The dataset also provides optional student-group headcounts such as:

  • INDIGENOUS_STUDENTS / NON_INDIGENOUS_STUDENTS (self-identified ancestry)
  • ELL_STUDENTS / NON_ELL_STUDENTS
  • FRENCH_IMMERSION_STUDENTS / NON_FRENCH_IMMERSION_STUDENTS
  • DISABILITIES_OR_DIVERSE_ABILITIES_STUDENTS and related fields
  • RESIDENT_STUDENTS / NON_RESIDENT_STUDENTS, ADULT_STUDENTS

Campsul Processing Steps (No Scoring / No Normalization)

1) Raw ingestion

We import the government CSV extract into a raw table and preserve original values.

2) Filtering for school pages

For school-level displays, Campsul primarily uses rows where DATA_LEVEL = 'School Level', then filters by selected school, year, grade group, and facility type.

3) Handling masked ("Msk") values

The government may suppress some values and mark them as Msk. Official guidance references filtering out masked values when working with the file. In Campsul, masked values are treated as suppressed or unavailable in the public UI.

4) Completing grade/year coverage for consistent APIs (optional)

To support consistent dashboards (for example, time-series charts), Campsul can generate a complete shell of expected (school, year, grade) rows. If a value is not included in the government file for a combination, it remains missing rather than being treated as a confirmed count.

Limitations

  • Counts represent headcount, not program intensity; students are assigned to one authority school to avoid duplication.
  • Some values may be suppressed (Msk) under disclosure rules and will appear unavailable.
  • Homeschooled children are not included in these headcount statistics.

Primary field shown on Campsul school cards: FINAL_TOTAL_STUDENTS

Student-Teacher Ratio Methodology (Student Headcount + Teacher FTE)

Purpose

Campsul displays a Student-Teacher Ratio to provide a simple, high-level view of staffing resources at a school. This is not class size. It is an enrollment-to-staffing indicator based on total students and total teacher capacity measured in FTE (Full-Time Equivalent).

On the website, this appears as a 1 / X display (for example, 1 / 17), meaning:

  • 1.0 teacher FTE per approximately 17 students

Data Sources

1) Student counts

We use BC's Student Headcount by Grade dataset and select:

  • Grade group: ALL GRADES
  • Student total: FINAL_TOTAL_STUDENTS (all grades combined)

2) Teacher capacity (FTE)

Teacher staffing is sourced from a BC Ministry of Education FOI (Freedom of Information) response, reported as Teacher FTE.

For consistency, we use:

  • Quarter: Q4 (end-of-year snapshot)
  • Teacher total: sum of teacher FTE per school-year

What FTE means:

  • 1.0 FTE = one full-time teacher equivalent
  • 0.5 FTE = half-time equivalent

FTE is a capacity measure and is more informative than simply counting staff members.

Step-by-Step Processing

Step 1 - Normalize school-year format

Different sources may represent years differently (for example, 2024-2025 vs 2024/2025). Campsul standardizes year strings (trim and replace - with /) to ensure reliable joins.

Step 2 - Prepare student totals (All Grades)

From the student dataset, Campsul filters to GRADE_CODE = 'ALL GRADES' and aggregates to one record per school year, school number, facility type, and district.

If multiple rows exist for the same school-year group, Campsul keeps the maximum FINAL_TOTAL_STUDENTS for that group to avoid duplicate inflation.

Step 3 - Prepare teacher totals (Q4 FTE)

From the FOI teacher dataset, Campsul filters to QUARTER = 'Q4' and aggregates to one record per school year and school number.

If multiple rows exist for the same school-year, Teacher FTE is summed.

Step 4 - Join student and teacher datasets

Campsul joins prepared student totals to teacher totals using:

  • Normalized school year
  • School number

Step 5 - Calculate the Student-Teacher Ratio

The core ratio is:

Students per 1.0 Teacher FTE

students_per_teacher = total_students_all_grades / teacher_fte_q4

Interpretation:

  • Lower value means more teacher capacity per student
  • Higher value means less teacher capacity per student
  • If teacher FTE is missing or zero, ratio is shown as unavailable

Website Display Format (1 / X)

Campsul converts the numeric ratio into a simple display:

  • Display: 1 / X
  • X: calculated students per 1.0 teacher FTE

X may be shown as a whole number (rounded) or with one decimal, depending on UI context.

Example

If a school has 510 students and 30.0 teacher FTE:

510 / 30 = 17

Displayed as 1 / 17.

Notes and Limitations

  • Not class size: This is a staffing ratio, not the number of students in a classroom.
  • Timing: Student headcount follows government enrolment reporting, and teacher FTE uses the FOI Q4 snapshot.
  • School types differ: Ratios can vary systematically by facility type (for example, standard vs online or continuing education).

Primary field shown on Campsul school cards: student_teacher_ratio

Class Size Methodology (BC Class Size Open Data Extract)

Purpose

Campsul displays class size information to help families understand the typical learning environment at a school, including whether classes tend to be smaller or larger and how this differs by grade grouping.

This dataset is separate from student-teacher ratio. It reflects reported class organization rather than staffing capacity.

Data Source

Campsul uses the Government of British Columbia's Class Size open data extract (from 2006/2007 onward).

The extract includes:

  • Average class size for selected grade groupings
  • Counts of reported classes, including classes with assigned Education Assistants (EA)
  • Counts of reported classes with more than 30 students
  • Availability at school, district, and province levels for standard BC public schools

This data begins in school year 2006/2007.

How the Government Collects This Data (Context)

The dataset is built from annual Class Organization reporting collected by the Ministry of Education from public schools to monitor compliance with class size legislation (Class Size Regulation under the School Act).

Reported counts reflect class organization at the reporting window specified in each year's instructions, typically between September 30 and October 15.

Key Fields Used by Campsul

For each school year and data level (province, district, school), the extract provides:

  • TOTAL_CLASSES: total number of reported classes
  • TOTAL_WITH_EA: number of reported classes with an Education Assistant
  • TOTAL_CLASSES_GREATER_30: number of reported classes with more than 30 students
  • AVG_CLASS_SIZE_ALL_GRADES
  • AVG_CLASS_SIZE_K
  • AVG_CLASS_SIZE_1_TO_3
  • AVG_CLASS_SIZE_4_TO_7
  • AVG_CLASS_SIZE_8_TO_12

The dataset also includes identifiers such as:

  • SCHOOL_YEAR
  • DATA_LEVEL
  • DISTRICT_NUMBER and DISTRICT_NAME
  • SCHOOL_NUMBER and SCHOOL_NAME

Campsul Processing Steps (Minimal Transformation)

Campsul does not convert this dataset into a score. We display government-reported values with light standardization for consistency.

1) Raw ingestion

We import the extract into our database and preserve original numeric values for traceability.

2) Filtering for school pages

For school profiles, we primarily use rows where DATA_LEVEL = 'School Level'. District and province rows may be used for broader context.

3) School year and identifier cleanup

We standardize school-year formatting and treat district and school identifiers carefully (including leading zeros where applicable) to ensure reliable joins across datasets.

4) Display

Campsul shows average class size values (All Grades, K, 1-3, 4-7, 8-12) and, when needed in the UI, supporting class counts (total classes, classes with EA, and classes greater than 30) directly from this extract.

5) Missing data

If a value is not present for a school-year record, Campsul displays it as Not Available. No estimation or imputation is applied.

Notes and Limitations

  • These are reported class organization metrics from a fall reporting window (typically late September to mid-October), not a full-year average.
  • This extract covers public standard schools only, not independent schools.
  • Average class size is a summary measure and does not show the distribution of class sizes within a school.

Primary field shown on Campsul school cards: class_size_value