About the Data

Disclaimers

While the data is provided from the University of Washington, we are not affiliated with the UW in any way.

The aim of this site is to showcase grade distributions in an insightful and engaging manner. Various factors can influence the grade distribution of a class, and a lower distribution doesn't automatically imply poor instruction quality.

Specifically, grade distributions shouldn't be the only criterion when deciding whether to enroll in a class or choose a particular professor. It's important to also consider other available resources, such as the Course Evaluation Catalog (CEC).

Data Source

We received University of Washington grade distribution data spanning from 2010 to 2016, courtesy of a previous FOIA request by Austin Walters.
We also submitted a FOIA request for grade data covering 2018 to 2024. This file, named Grade_Dist_Update, is unfortunately less useful due to the new data suppression policy implemented by UW starting September 2023. You can find these datasets on our credits page.
Initially, our goal was to analyze grade distributions for both UW and Oregon State University (OSU). However, OSU responded to our FOIA request by stating they are not obligated to provide professor data. As a result, we decided to focus solely on UW grade distributions.

About the
Grade Columns
at UW
About the
Grade Columns at UW
About the Grade Columns at UW

The University of Washington uses a numeric grading scale ranging from 4.0 to 0.7, then 0.0, with a grade stepsize of 0.1. However, the UW Office of the Registrar provides grade data in terms of letter grades, where numeric grades are assigned to specific letter grade clusters. Hence, we utilize these letter grades accordingly.

The clustering of numeric grades to letter grades is as follows:

The datasets also include the average GPA of the course and the total student count, which includes withdrawn students. On our site, we provide an “Active Student Count” statistic that excludes withdrawn students.

Please note that only classes with at least 10 students are included to ensure FERPA compliance. Additionally, the new grade data regulation is even stricter, requiring that the count for each column must be at least 10; otherwise, the count is recorded as NULL. This results in a lot of NULL entries.

For example, say there is a class in 2020 with a student count of size 39, where there count of each grade is 3 students (so the number of A's is 3, the number of A-'s is 3, etc.). Then since 3 is less than 10, each grade column has a value of NULL, which means the entire grade distribution is completely hidden.

Our Calculated Statistics
Average GPA

The individual average GPA's are given by the datasets. They are calculated by the office registrar as follows: for a course term i, the average GPA is:

Our data of courses and professors are aggregated by groups. For example, for Math 124, say that professor X teaches 5 terms of Math 124. Hence we assign professor X a group row consisting of 5 individual Math 124 terms that they have taught.
When calculating the average GPA for a group row that includes k individual terms, we use a weighted average:

This allows us to calculate an aggregate average GPA as close to the true aggregate average GPA, with the loss in precision due to the rounding of the individual average GPA's to one decimal place.

Standard Deviation

When calculating the standard deviation, since we don't have access to the numeric grade values, we must instead use the letter grade values to which the numeric grades are assigned to. Hence we can only calculate an approximate form of the standard deviation as follows:

For standard deviations of groups and the cumulative standard deviation, we use the weighted average of the group for our average, and aggregate the other variables when using the standard deviation formula.

Pass %

For calculating the pass rate, we define the Pass % rate as the number of students earning a C or higher (numerical grade of 1.9 or higher), divided by the total number of students in the class, including withdrawn students. We define a withdrawn grade as having not passed the course.

The reason we chose a “C” grade as the minimum passing grade is because for many majors at the UW, a 2.0 or higher is needed to pass a major course. The closest letter grade corresponding to this is a “C” grade, which covers the numerical grades 1.9-2.1. Hence the actual pass rate for the percentage of students who earned a 2.0 or higher might be slightly lower than our calculated pass rate.

Color Interpolation

To highlight specific statistics in our grade table/cards, such as average GPA and pass rate, we use color interpolation. This involves assigning colors to data values by inputting them into a function that returns an RGB color for highlighting purposes. We primarily use three shades: red, yellow, and green, with various shades in between. Our function assumes that the input value is non-negative.

The color interpolation function requires three constants to serve as “checkpoints” for our primary color shades: minV, midV, and maxV. These constants act as reference points for transitioning between different shades. We choose these values based on the specific statistic we are working with. For example, when highlighting the pass rate, we set minV, midV, and maxV to 50, 75, and 100, respectively. Values at or below 50 are shaded more red, around 75 are more yellow, and near 100 are more green.

Formally, our color interpolation is defined by:

The idea is that we will get our desired colors at key points. For example,

Everything in between is linearly interpolated piecewise. We came up with this function mainly through trial and error to find the bext colors at each point. For example, after minV, we eventually decided on using 169 as a minimum value for RGB values when transitioning from one color to the next, as it helped make our key colors brighter.

For text color interpolations, we use 140 and 0 instead of 255 and 169 in our formulas, resulting in darker variations of the color interpolations for text.

Bubble Sizing

For the Bubble Chart, each bubble represents an individual row. We scaled the bubble sizes according to the student count of that row. Users can also select the bubble for the Cumulative row. The Cumulative row aggregates all the individual rows, so its student count is significantly larger than the others.

To address this issue, we designated two breakpoints for bubble sizes. For devices with a width of 1500px, our minimum bubble size is 25 pixels, and our maximum bubble size is 60 pixels. We then determine the exact bubble size based on the student count. Initially, we tried two-point linear interpolation on these endpoints, but when the cumulative bubble was included, the smaller bubbles became indistinguishable due to their size relative to the cumulative bubble, which had the maximum size.

To fix this, we switched to a two-point square root interpolation. The concept is that the square root function's derivative approaches infinity for small values of x, making the smaller bubbles very distinguishable. Meanwhile, the function increases at a decreasing rate as x increases. Thus, with our two breakpoints, we achieve more contrast with smaller bubbles but smaller contrast when compared to a maximum bubble size corresponding to a much larger student count such as the Cumulative bubble. This is actually ideal for us since users already know the cumulative bubble should be the largest.

Finally, we scale the bubbles relative to the width of the device so that smaller devices have relatively smaller bubbles. We set the scale mainly through trial and error; we initially went with a linear scale factor, but then the bubbles were too small for smaller devices, so we took the square root since it increases any radicand less than 1. 1500 is our default px for laptop devices, so if the device screen width is smaller than 1500 px, we shrink the bubble sizes, and for devices with width larger than 1500 px, we increase them.