Brown’s Class Size Paradox

University Admissions departments love to brag about their schools’ small class sizes. Brown University, for instance, boasts a 7:1 student–faculty ratio (so “you’ll have a lot of face-to-face time with some of the best researchers and teachers in academia”) and that “72 percent of our undergraduate classes have fewer than 20 students.” These claims invite prospective students to daydream of cozy, intimate classrooms, and personalized learning experiences — dreams quashed (or perhaps squished?) on one’s first day of classes.

Nobody is lying, per se — this is merely an instance of the “class size paradox”: the size of the average class is relatively small, but the experience of the average student suggests otherwise.

To see this in action, we’ll mine data from Courses@Brown, Brown’s course-enrollment portal. The portal’s internal API reports up to three potential indicators of class size:

{
  /* other fields */

  /* 30 - 14 = 16 seats taken  */
  "seats": "<strong>Maximum Enrollment:</strong> <span class=\"seats_max\">30</span> / <strong>Seats Avail:</strong> <span class=\"seats_avail\">14</span>",
  /* 10 + 5 + 1 = 16 seats taken */
  "regdemog_json": "{\"FY\":10,\"So\":5,\"Oth\":1}",
  /* 16 seats taken */
  "regdemog_html": "<p class=\"enroll_demog\">Current enrollment: 16</p><div class=\"demogchart\"></div><div class=\"demogchartlegend\"><ul><li class=\"pieitem item_fy\">62.50% - First Year</li><li class=\"pieitem item_so\">31.25% - Sophomore</li><li class=\"pieitem item_oth\">6.25% - Other</li></ul></div>"

  /* other fields */
}

Since some of these indicators may be missing or disagree for a small subset of courses, we’ll simply take the maximum of these three indicators as our authoritative class size count.

The Average Class

The average class size is merely the total enrollment (across all courses), divided by the number of offered courses. Applied to our dataset:

SemesterSize of Average Class
Fall 201623.98
Spring 201722.75
Fall 201725.52
Spring 201823.31
Fall 201823.81
Spring 201922.95
Fall 201924.50
Spring 202023.41

The average class at Brown is, indeed, small! However, “average class size” reflects the number of students the average professor can expect to teach per course — not the average number of peers a student should expect to have. Imagine a hypothetical university offering only two courses: one with an enrollment of 100, and another with an enrollment of 0. The average class size is 50, but this is nonsense: 100% of students are in a class of 100!

The Average Student

If you’re an average student and you pick a course with respect to the distribution of course popularity, how many people (including yourself) can expect to be in that course? To compute this, we square the enrollment of each course in our dataset, reflecting the fact that in a class of size N, N students will experience a class of that size. Applying this to our dataset we find:

SemesterExpected Class Size
Fall 201675.43
Spring 201773.53
Fall 201780.11
Spring 201873.25
Fall 201876.90
Spring 201972.94
Fall 201984.02
Spring 202081.08

So, while the size of the average class is relatively small (≈24 students), this “average class” is hardly representative of the experience of the average student.

In light of this, Brown’s claim that “72 percent of our undergraduate classes have fewer than 20 students” fares poorly. Brown’s ample supply of small classes services only a small minority (≈25%) of all enrollments in undergraduate courses:

Semester% of Enrollments in Small (n<20) Classes
Fall 201625.58
Spring 201727.53
Fall 201723.85
Spring 201826.49
Fall 201826.05
Spring 201927.20
Fall 201925.03
Spring 202022.81

Among undergraduate computer science courses — where demand has long outpaced the supply of educators — fewer than four percent of enrollments are into classes with less than 20 students!

Other Shenanigans

This class size paradox is not the only discrepancy between Admissions and reality. The claim that “72 percent of our undergraduate classes have fewer than 20 students” is misleading, even at face value. Such small classes are not quite as prevalent as claimed:

Semester% (size<20)
Fall 201662.09
Spring 201765.11
Fall 201759.98
Spring 201864.04
Fall 201863.11
Spring 201965.90
Fall 201963.20
Spring 202062.13

Brown misses its advertised mark of 72% by a substantial margin in all years for which data is available. I suspect they reach that figure by including graduate and independent study courses.

Similarly, the claim that Brown’s student-faculty ratio is 7:1 (and that “100 percent of our faculty teach undergraduates”, as Admissions asserts in the same sentence) gives the misleading impression that each educator needs only mind seven students. It is flatly incorrect that 100% of faculty members teach undergrads: One does not need to strain hard to find adjunct faculty with no teaching load, and Brown’s clinical faculty are entirely excused from undergraduate teaching. Among the faculty who do teach, not all teach every semester: professors may take leaves, sabbaticals, and “buy out” some of their required course load.

Technical Addendum

The Courses@Brown API produces JSON, whose fields are often either HTML or JSON-as-a-string. Whenever I am faced with this sort of hard-to-parse mixed-representation data, I reach for two composable utilities: jq and xidel. For instance, to produce the enrollment count from .seats, I pipe the API’s JSON for a course into this bash function:

function enrollment_from_seats_html() {
  jq -rc '"<parent>" + .seats + "</parent>"' \
    | xidel - -s --xpath='
        [
          //span[@class="seats_max"]/text(),
          //span[@class="seats_avail"]/text()
        ]' \
    | jq -c '
        if (. | length == 2) then
          (.[0] | tonumber) - (.[1] | tonumber)
        else
          null
        end'
}

Perhaps I’ll go into in more depth about the technical approach behind this blog post in a future entry!


Email comments and corrections to jack@wrenn.fyi.