Catalog Evolution

Recently I’ve posted about the College of Idaho’s 2017-2018 and 2018-2019 course distribution. The second post showed how easy it was to reproduce everything, which was good because a colleague recently asked about the total number of courses in 2016-2017 for a funded grant related to curriculum review. These total numbers of courses of courses made me wonder about how the catalog has evolved over the last few years? Which subjects have seen the most change?

Getting the Classes

I’m not going to reproduce all the scrapping code, refer to the previous posts linked above. The array indices changed for the second post, as well as the extension on the base url need slight adjustments. I’ve done that (R scripts are actually here) and saved the class lists, so we just need to load the csv’s and tack on a catalog year for latter.

cl15 <- read.csv("../../static/files/class-list-2015-2016.csv", 
                 header=TRUE) %>% 
  mutate(catYear = 2015) %>% select(-url)
cl16 <- read.csv("../../static/files/class-list-2016-2017.csv",
                 header=TRUE) %>% 
  mutate(catYear = 2016) %>% select(-url)
cl17 <- read.csv("../../static/files/class-list-2017-2018.csv", 
                 header=TRUE) %>% 
  mutate(catYear = 2017) %>% select(-url)
cl18 <- read.csv("../../static/files/class-list-2018-2019.csv", 
                 header=TRUE) %>% 
  mutate(catYear = 2018) %>% select(-url)

Let’s glue these together and do some basic counting:

cl <- rbind.data.frame(cl15,cl16,cl17,cl18) 
cl %>% group_by(catYear) %>% summarise(classes = n(), subjects = n_distinct(sub)) %>% kable()
catYear classes subjects
2015 976 42
2016 1013 43
2017 1034 43
2018 1026 44

So the number of subjects has barely changed, but there was significant growth in the course count for two consecutive years, and then recent increase was lost - possibly due to a perception of a growing, unwieldy curriculum. Let’s look into some of the changes that took place.

The First Rise

From 2015 to 2016 the number of subjects increased by one. The difference is: ECN. So did economics courses account for the additional 37? To check, we’ll have some fun with dplyr anti-joins.

Deletions

First, let’s look into courses in the 2015-2016 catalog that are not in the 2016-2017 catalog. I’m going to join along the subject and number, so a change in the name won’t show up (before writing this, I did include name, and there were over 200 courses in the following table!).

dropped15 <-anti_join(cl15, cl16, by=c("sub","number")) 
dropped15 %>% 
  datatable(rownames = FALSE, filter = "top", 
            options = list(pageLength=5)) %>%
  frameWidget(height = 550, width = "100%")

Considering the increase in courses, that’s a lot that got dropped. Let’s group things on the subject level:

dropped15 %>% group_by(sub) %>% 
  summarise(course.count = n()) %>%
  arrange(desc(course.count)) %>% 
  kable()
sub course.count
POE 10
MUS 9
HIS 8
ATH 4
ART 3
PSY 3
CSC 2
MAT 2
BIO 1
HHP 1
IND 1
SPE 1
THE 1

With the addition of economics, it’s not surprising that POE (POlitics and Economics) dropped a lot of courses.

Additions

Now we’ll look at what was added.

added16 <- anti_join(cl16, cl15, by=c("sub","number")) 
added16 %>% datatable(rownames = FALSE, filter = "top", 
                      options = list(pageLength=5)) %>%
  frameWidget(height = 550, width = "100%")
added16 %>% group_by(sub) %>% 
  summarise(course.count = n()) %>%
  arrange(desc(course.count)) %>% 
  kable()
sub course.count
HIS 13
MUS 10
POE 8
PSY 5
SPE 5
ENV 4
THE 4
BIO 3
GEO 3
HHPA 3
IND 3
ART 2
BUS 2
CHE 2
ECN 2
HHP 2
HSC 2
JOURN 2
PHY 2
CSC 1
ENG 1
FRE 1
SOC 1
SPA 1

So the increase is from (a) almost twice as many subjects adding courses as removing them and (b) additions being greater than deletions on a subject level. History, Music, and POE had the most additions AND deletions, and additions outnumber deletions.

Recall that we had a new subject: Economics. Notice that this only accounted for 2 new courses so POE dropped 10 and POE+ECN added 10. I find it fitting that “economics” has a zero-sum in this instance.

The Second Rise

We’re going to get a bit repetitive in terms of code, but I expect the results to be a bit different.

dropped16 <-anti_join(cl16, cl17, by=c("sub","number")) 
dropped16 %>% 
  datatable(rownames = FALSE, filter = "top", 
            options = list(pageLength=5)) %>%
  frameWidget(height = 550, width = "100%")

Only 18 courses dropped. This means there wasn’t as much movement in the curriculum, but which subjects were most active?

dropped16 %>% group_by(sub) %>% 
  summarise(course.count = n()) %>%
  arrange(desc(course.count)) %>% 
  kable()
sub course.count
HHPA 7
MUS 7
SPA 2
ECN 1
POE 1

Notice Music is joint top of the list, is this related to faculty turn-over (a major driver of curricula change at small colleges) or do they just like tinkering with the catalog? Did they add as many as the previous year though?

added17 <- anti_join(cl17, cl16, by=c("sub","number")) 
added17 %>% datatable(rownames = FALSE, filter = "top", 
                      options = list(pageLength=5)) %>%
  frameWidget(height = 550, width = "100%")
added17 %>% group_by(sub) %>% 
  summarise(course.count = n()) %>%
  arrange(desc(course.count)) %>% 
  kable()
sub course.count
SPA 9
BUS 4
CHE 4
MUS 4
SOC 4
HHP 2
HIS 2
IND 2
LAS 2
POE 2
ART 1
ENV 1
PSY 1

So again, more subjects added courses than removed but the addition counts by subject are generally much lower.

The Decline

Now we can look into the recent decline.

dropped17 <-anti_join(cl17, cl18, by=c("sub","number")) 
dropped17 %>% 
  datatable(rownames = FALSE, filter = "top", 
            options = list(pageLength=5)) %>%
  frameWidget(height = 550, width = "100%")

For a net decline, the dropped number had to be big, and it’s basically the last two drops combined.

dropped17 %>% group_by(sub) %>% 
  summarise(course.count = n()) %>%
  arrange(desc(course.count)) %>% 
  kable()
sub course.count
ART 33
PSY 16
HIS 3
MAT 3
CHE 2
MUS 2
SPA 2
BUS 1
CSC 1
HHP 1
THE 1

Music almost held steady for once. The two subjects in double digits all underwent major curricular changes: PSY restructured things based in part on new medical school requirements, and ART overhauled their program to both shift what types of faculty taught intro courses and to provide course offerings that will help majors go to graduate school. The point is that there’s no surprise (to anyone who was at faculty meetings that last year) that these programs would be at the top of this list.

But we didn’t lose 65 courses, so what was added?

added18 <- anti_join(cl18, cl17, by=c("sub","number")) 
added18 %>% datatable(rownames = FALSE, filter = "top", 
                      options = list(pageLength=5)) %>%
  frameWidget(height = 550, width = "100%")
added18 %>% group_by(sub) %>% 
  summarise(course.count = n()) %>%
  arrange(desc(course.count)) %>% 
  kable()
sub course.count
ART 22
ARH 8
CHE 3
HIS 3
MUS 3
PSY 3
ACC 2
BUS 2
THE 2
CSC 1
ECN 1
ENG 1
IND 1
MAT 1

Art’s curriculum revision meant adding courses and a new subject (Art History), but with a small net lose. Other programs were very small additions, and I’ll admit I accounted for 2 (CSC and MAT).

I’ll also note that MFL changed their department code to WLC, but not the prefix of courses so they aren’t showing up.

Conclusion

The counts and lists of courses added and deleted are one thing, but there’s a deeper story here which I don’t know and this data alone can’t really tell. A college’s curriculum is driven by the faculty, sometimes encouraged or discouraged by the administration (deans and presidents especially). Over this time, the College of Idaho has had 2 deans and at least 4 presidents (that I’ve been around for). Some have encouraged growth and expansion, but more recently contraction, of the curriculum. Combining this with the natural turn-over in faculty, shifting specialties, and evolving priorities of what current students need is the real story here. While I would love to tell this story (like Hans Gosling’s Gap Minder talk), it would require a depth of institutional knowledge I don’t yet possess and would make this post far too long!

Related