The rising age of Congress members

The United States Congress represents the citizens of the United States. As such, they are expected to be representative of the average American citizen. However, due to obvious factors like the need to gain the skills, knowledge, temperament and name recognition necessary to run for and win an election, the average age of Congress members has always been older than the average American. The high population growth during the Boomer generation has led to the current congress being the oldest one in history. More information can be found in the following article:

https://fivethirtyeight.com/features/aging-congress-boomers/:

#Let's shorten this table by averaging the age of the entire Congress per session
aging_congress <- read_csv("https://raw.githubusercontent.com/fivethirtyeight/data/master/congress-demographics/data_aging_congress.csv")
## Rows: 29120 Columns: 13
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (5): chamber, state_abbrev, bioname, bioguide_id, generation
## dbl  (6): congress, party_code, cmltv_cong, cmltv_chamber, age_days, age_years
## date (2): start_date, birthday
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
aging_congress_subset <- aging_congress[c(1,3,11,12)]
glimpse(aging_congress_subset)
## Rows: 29,120
## Columns: 4
## $ congress  <dbl> 82, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, …
## $ chamber   <chr> "House", "House", "House", "House", "House", "House", "House…
## $ age_days  <dbl> 19626, 14106, 14837, 15567, 16298, 17028, 17759, 18489, 1922…
## $ age_years <dbl> 53.73306, 38.62012, 40.62149, 42.62012, 44.62149, 46.62012, …

The code above gives us the dimensions of the large dataset. That dataset is extremely large and is not easily read. However, using the dplyr :: glimpse function we can see it’s dimensions. We can see it has 4 columns and 29,120 rows. Those columns represent the number Congress they served in, the specific chamber of Congress they were part of, their age in days and, finally, their age in years. The rows detail the different congressmen collected.

Since the above dataset is too large to print and not easily read, we can try making a smaller table to help us be able to take a look at this data.

average_age_congress <- aggregate(age_years ~ congress, aging_congress_subset, mean)
kable(average_age_congress,
      row.names = TRUE,
      col.names = c("# Congress", "Average Age"),
      table.attr = "style='width:30%;'")
# Congress Average Age
1 66 51.73002
2 67 52.60360
3 68 52.56625
4 69 53.22577
5 70 53.95525
6 71 54.61430
7 72 54.39717
8 73 53.45225
9 74 52.60445
10 75 52.50597
11 76 52.34120
12 77 52.40562
13 78 53.15972
14 79 53.51016
15 80 52.59263
16 81 52.69689
17 82 53.24015
18 83 53.19028
19 84 53.39559
20 85 54.19333
21 86 53.16789
22 87 53.60106
23 88 52.95704
24 89 52.20452
25 90 52.43809
26 91 52.71952
27 92 53.07843
28 93 52.40800
29 94 51.28931
30 95 50.60187
31 96 50.00601
32 97 49.51691
33 98 50.02744
34 99 51.04766
35 100 51.84557
36 101 52.66166
37 102 53.81787
38 103 52.92735
39 104 52.68546
40 105 53.07348
41 106 54.13965
42 107 54.71521
43 108 55.43003
44 109 56.51792
45 110 57.29550
46 111 57.79102
47 112 57.63021
48 113 57.52962
49 114 57.89433
50 115 58.77052
51 116 58.43788
52 117 58.83102
53 118 58.55512

This table is still a little long to scan quickly so we can shorten that into a table showing only every third Congress. Hopefully, the overall trend will remain the same.

subset_average <- average_age_congress %>% slice(which(row_number() %% 3 == 1))

kable(subset_average,
      row.names = TRUE,
      col.names = c("# Congress", "Average Age"),
      table.attr = "style='width:30%;'")
# Congress Average Age
1 66 51.73002
2 69 53.22577
3 72 54.39717
4 75 52.50597
5 78 53.15972
6 81 52.69689
7 84 53.39559
8 87 53.60106
9 90 52.43809
10 93 52.40800
11 96 50.00601
12 99 51.04766
13 102 53.81787
14 105 53.07348
15 108 55.43003
16 111 57.79102
17 114 57.89433
18 117 58.83102

We can now plot both those tables to see if their trend is the same or if we lost too much by trimming this data.

#we can plot these tables to see their trend
ggplot(data = average_age_congress, mapping = aes(x = congress, y = age_years)) +
  geom_point()

ggplot(data = subset_average, mapping = aes(x = congress, y = age_years)) +
  geom_point()

Conclusions

Using the above tables and plots we can easily see that while at the beginning of the collected data the average age of Congress stayed within a certain range, recently that number has been rising fast. This can be due to a variety of reasons but is likely due to the huge population jump during the Boomer generation. Assuming this is indeed a major contributing factor, we can expect this number to come down as the Boomer generation loses their impact on the vote.

The ramifications of an older Congress can be quite large. We live in a world evolving at a very rapid pace. Older people typically have a lower understanding of new technology. As those new technologies become a bigger part of our lives, we would prefer the people representing us in government to understand them.

Additional research

For additional research, we can next import the average age of US citizens during the same time period as these Congressmen and check their correlation. We can also use that correlation to try to predict the age of future Congressmen based on current population data.

Sources:

data/congress-demographics at master · fivethirtyeight/data (github.com)