Iolani Football 1945-2019

This week the local paper released a season recap of my alma mater’s football team. Included in the article was a link to game results dating back to 1945. It looked like there was an opportunity for a little data analysis on things like home and away records, records versus specific schools, etc. I downloaded the data and cleaned it for analysis in Google Sheets.

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following object is masked from 'package:base':
## 
##     date
library(ggplot2)
iolani <- tbl_df(read.csv("../datasets/iolani_football_1945_2019.csv"))
iolani$date <- ymd(iolani$date)
glimpse(iolani)
## Observations: 859
## Variables: 13
## $ rowid          <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15…
## $ date           <date> 2019-11-29, 2019-11-23, 2019-10-25, 2019-10-11, …
## $ opponent       <fct> Hilo, at Moanalua, Damien, at Castle, Leilehua, R…
## $ result         <fct> L, W, W, W, L, W, W, W, W, W, W, L, W, L, W, W, W…
## $ Iolani_score   <int> 17, 35, 21, 33, 25, 38, 38, 48, 40, 34, 31, 20, 4…
## $ opp_score      <int> 20, 9, 14, 28, 28, 0, 21, 14, 13, 24, 10, 21, 10,…
## $ stadium        <fct> Aloha Stadium, , Aloha Stadium, , Aloha Stadium, …
## $ pass_leader    <fct> Jonah Chong, Jonah Chong, Jonah Chong, Jonah Chon…
## $ pass_yds       <int> 118, 168, 183, 148, 256, 82, 85, 192, 177, 118, 1…
## $ rush_leader    <fct> Brock Hedani, Brock Hedani, Brock Hedani, Jonah C…
## $ rush_yds       <int> 26, 90, 85, 45, 17, 66, 102, 58, 71, 99, 90, 94, …
## $ receive_leader <fct> Carter Kamana, Carter Kamana, Carter Kamana, Wail…
## $ receive_yds    <int> 45, 73, 117, 67, 119, 57, 59, 121, 98, 57, 101, 4…

Overall the dataset held data for 859 games with 13 variables.

Overall Records

I looked at the game results first. Overall the Iolani football team has a record of 448-356-21. That’s a winning percentage of 54.3%. Not bad!

Single Season Winning Percentage

I looked at the single season winning percentage and sorted the top seasons.

The top season was the 1968 team, which went 11-0-1 and won the Interscholastic League of Honolulu title. That team featured current Iolani teacher Chucky Nakoa!

win_convert <- function(result) {
  ifelse(result == "W", 1, 0)
}

iolani %>% filter(result != "") %>% 
  mutate(gameyear = year(date), win = win_convert(result)) %>%
  group_by(gameyear) %>%
  summarize(win_percent = mean(win)) %>% arrange(-win_percent)
## # A tibble: 75 x 2
##    gameyear win_percent
##       <dbl>       <dbl>
##  1     1968       0.917
##  2     1950       0.889
##  3     2009       0.857
##  4     1976       0.818
##  5     2008       0.786
##  6     2001       0.778
##  7     1992       0.769
##  8     2019       0.769
##  9     1965       0.75 
## 10     1986       0.75 
## # … with 65 more rows
iolani %>% filter(result != "") %>% 
  mutate(gameyear = year(date), win = win_convert(result)) %>%
  group_by(gameyear) %>%
  summarize(win_percent = mean(win)) %>%
  ggplot(aes(x = gameyear, y = win_percent)) + geom_point() + geom_smooth(method = "loess") +
  labs(title = "Winning Percentage, Iolani Football, 1945-2019", x = "Year", y = "Winning Percentage")

Home and Away

Away games

There were a lot of games with “at” in their opponent names. To separate out the opponent name from the location, I looked for all rows that began with “at.” It turned out there were only 78 games starting with “at.” That’s less than 10% of games.

iolani %>% filter(grepl("^at", iolani$opponent)) %>%
  group_by(result) %>%
  summarize(n())
## # A tibble: 4 x 2
##   result `n()`
##   <fct>  <int>
## 1 CCL.       1
## 2 L         36
## 3 T          1
## 4 W         40

Iolani is 40-36-1 on the road, a winning percentage of 51.9%.

Stadium Location and Neutral Field Games

I then looked at games with a stadium location. I had assumed that these games were neutral field games since a lot of them were at the island’s football stadium, Aloha Stadium. I looked to see how many games were played at a stadium and where these were. There were 585 games played at stadiums and only 274 without a label in the location.

table(iolani$stadium)
## 
##                              Aiea    Aloha Stadium      Cooke Field 
##              274                1              302               17 
##      fairgrounds       Farrington             Hilo         Honolulu 
##                1                1                1                1 
## Honolulu Stadium     Hoolulu Park   Isenberg Field           Kaiser 
##              234                1                1                5 
##       Kamehameha         Mililani          Punahou          Radford 
##                1                1                1                1 
##        Roosevelt      Tacoma Dome           Waimea     War Memorial 
##                7                1                1                6 
##     Wong Stadium 
##                1

Some of the games were played at schools so I wondered if those were actually games played against their hosts, rather than true neutral field games. By inspecting the data in Google Sheets I was able to confirm that all the games that were played at schools (e.g., Kaiser) were played against opponents from other schools (i.e., neutral field games).

Interestingly enough in 2005, Iolani played in the Tacoma Dome against Capital High School (Washington), it was the first time Iolani had played an indoor football game and I assume the last since there aren’t any local places that you can play indoors here.

Here’s the neutral field record:

iolani %>% filter(grepl("[[:alpha:]]", iolani$stadium)) %>%
  group_by(result) %>%
  summarize(n())
## # A tibble: 4 x 2
##   result `n()`
##   <fct>  <int>
## 1 CCL.       1
## 2 L        261
## 3 T         18
## 4 W        305

At neutral fields, Iolani is 305-261-18, a winning percentage of 52.2%.

Home Games

That left the home record to calculate. I filtered out the “at” and neutral field games to come up with the following result.

homegames <- iolani %>% filter(!grepl("[[:alpha:]]", iolani$stadium))
homegames <- homegames %>% filter(!grepl("^at", homegames$opponent)) 
homegames %>% group_by(result) %>%
  summarize(n())
## # A tibble: 5 x 2
##   result `n()`
##   <fct>  <int>
## 1 ""        31
## 2 L         59
## 3 L (OT)     1
## 4 T          2
## 5 W        107

At home Iolani is 107-60-2, a winning percentage of 63.3%!

Record against Specific Schools

Calculating Iolani’s record against specific schools is complicated by the fact that the away games have “at” in their opponent names. To remove this I used a regular expression substitution.

iolani$opponent_school <- sub("at ", "", iolani$opponent)
glimpse(iolani)
## Observations: 859
## Variables: 14
## $ rowid           <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 1…
## $ date            <date> 2019-11-29, 2019-11-23, 2019-10-25, 2019-10-11,…
## $ opponent        <fct> Hilo, at Moanalua, Damien, at Castle, Leilehua, …
## $ result          <fct> L, W, W, W, L, W, W, W, W, W, W, L, W, L, W, W, …
## $ Iolani_score    <int> 17, 35, 21, 33, 25, 38, 38, 48, 40, 34, 31, 20, …
## $ opp_score       <int> 20, 9, 14, 28, 28, 0, 21, 14, 13, 24, 10, 21, 10…
## $ stadium         <fct> Aloha Stadium, , Aloha Stadium, , Aloha Stadium,…
## $ pass_leader     <fct> Jonah Chong, Jonah Chong, Jonah Chong, Jonah Cho…
## $ pass_yds        <int> 118, 168, 183, 148, 256, 82, 85, 192, 177, 118, …
## $ rush_leader     <fct> Brock Hedani, Brock Hedani, Brock Hedani, Jonah …
## $ rush_yds        <int> 26, 90, 85, 45, 17, 66, 102, 58, 71, 99, 90, 94,…
## $ receive_leader  <fct> Carter Kamana, Carter Kamana, Carter Kamana, Wai…
## $ receive_yds     <int> 45, 73, 117, 67, 119, 57, 59, 121, 98, 57, 101, …
## $ opponent_school <chr> "Hilo", "Moanalua", "Damien", "Castle", "Leilehu…

Now I could calculate records against specific schools, such as our rival Punahou. It turns out we’re not that great against Punahou: 38-70-1 (34.2%).

iolani %>% filter(opponent_school == "Punahou") %>%
  group_by(result) %>%
  summarize(n())
## # A tibble: 3 x 2
##   result `n()`
##   <fct>  <int>
## 1 L         70
## 2 T          3
## 3 W         38

How about perennial state champ Saint Louis? Even worse! 23-79-4 (21.7%).

iolani %>% filter(opponent_school == "Saint Louis") %>%
  group_by(result) %>%
  summarize(n())
## # A tibble: 3 x 2
##   result `n()`
##   <fct>  <int>
## 1 L         79
## 2 T          4
## 3 W         23

Kamehameha? Just as bad. 33-72-4, (30.3%).

iolani %>% filter(opponent_school == "Kamehameha") %>%
  group_by(result) %>%
  summarize(n())
## # A tibble: 3 x 2
##   result `n()`
##   <fct>  <int>
## 1 L         72
## 2 T          4
## 3 W         33

Recent rival Damien? Actually pretty good! 77-3-21 (76.2%).

iolani %>% filter(opponent_school == "Damien") %>%
  group_by(result) %>%
  summarize(n())
## # A tibble: 4 x 2
##   result `n()`
##   <fct>  <int>
## 1 L         20
## 2 L (OT)     1
## 3 T          3
## 4 W         77

Scoring Averages

I calculated the points scored per game and the points allowed per game by Iolani. It looks like the offense has improved dramatically over time, probably in line with changes in the game of football overall.

iolani %>% filter(!is.na(Iolani_score)) %>%
  mutate(gameyear = year(date)) %>%
  group_by(gameyear) %>%
  summarize(off_scoring = mean(Iolani_score), def_scoring = mean(opp_score)) %>%
  ggplot(aes(x = gameyear, y = off_scoring)) + geom_point() + geom_smooth(method = "loess") +
  labs(title = "Mean Points Scored, Iolani Football, 1945-2019", x = "Year", y = "Points per Game")

I also looked at average points allowed per season.

iolani %>% filter(!is.na(Iolani_score)) %>%
  mutate(gameyear = year(date)) %>%
  group_by(gameyear) %>%
  summarize(off_scoring = mean(Iolani_score), def_scoring = mean(opp_score)) %>%
  ggplot(aes(x = gameyear, y = def_scoring)) + geom_point() + geom_smooth(method = "loess") +
  labs(title = "Mean Points Allowed, Iolani Football, 1945-2019", x = "Year", y = "Points per Game")

Offensive Category Leaders

There are only so many things that can be done with single game offensive yards leaders, but we can at least calculate the top 10 historical performances for each type (passing, rushing, receiving).

Top Passing Yard Games

Tai-John Mizutani had the top 4 passing yard games in Iolani history, 3 of which came during the 2017 season. He is currently on the football team at Central Washington University.

iolani %>% select(pass_leader, pass_yds, date, opponent, result, Iolani_score, opp_score) %>%
  arrange(-pass_yds)
## # A tibble: 859 x 7
##    pass_leader  pass_yds date       opponent  result Iolani_score opp_score
##    <fct>           <int> <date>     <fct>     <fct>         <int>     <int>
##  1 Tai-John Mi…      503 2017-08-26 Kaimuki   W                57        34
##  2 Tai-John Mi…      485 2015-10-16 Kamehame… L                24        39
##  3 Tai-John Mi…      430 2017-09-29 St. Fran… W                45        29
##  4 Tai-John Mi…      426 2017-09-16 Pac-Five  W                55        20
##  5 Reece Foy         391 2011-09-09 Punahou   L                18        38
##  6 Kiran Kepoo       386 2004-08-21 Farringt… W                24         7
##  7 Kiran Kepoo       381 2004-10-01 Pac-Five  W                38        13
##  8 Ryan Dung         369 2006-11-24 King Kek… L                37        38
##  9 Austin Jim …      367 2013-10-04 Pac-Five  W                31        19
## 10 Reece Foy         364 2012-08-18 at Waipa… W                35        34
## # … with 849 more rows

Top Rushing Yard Games

Joe Igber has 6 of the top 10 on this list. He went on to play college football at California and rushed for over 3000 yards in college.

iolani %>% select(rush_leader, rush_yds, date, opponent, result, Iolani_score, opp_score) %>%
  arrange(-rush_yds)
## # A tibble: 859 x 7
##    rush_leader   rush_yds date       opponent result Iolani_score opp_score
##    <fct>            <int> <date>     <fct>    <fct>         <int>     <int>
##  1 Joe Igber          352 1998-10-23 Pac-Five W                45        35
##  2 Joe Igber          312 1998-09-19 Pac-Five W                40        29
##  3 Joe Igber          278 1998-11-13 Damien   W                31         7
##  4 Joe Igber          262 1997-10-04 Pac-Five W                45         7
##  5 Raynold Stow…      261 2002-09-20 Pac-Five W                35        27
##  6 Joe Igber          251 1998-10-09 Damien   W                49        32
##  7 Joe Igber          240 1997-11-15 Damien   W                17        12
##  8 Raynold Stow…      237 2002-11-01 Damien   W                23        12
##  9 Kyle Chang         228 1992-10-23 Damien   W                14         0
## 10 Willie Keola       228 1972-11-24 Punahou  W                34        25
## # … with 849 more rows

Top Receiving Yard Games

Unlike the passing and rushing yard leaders, there are a lot of different names on this list. Carter Kamana finished his high school senior season this year. Keoni-Kordell Makekau plays Division 1 football at Navy. Raul Pacheco won the national championship at Montana and had the most receptions in Montana history until 2019.

iolani %>% select(receive_leader, receive_yds, date, opponent, result, Iolani_score, opp_score) %>%
  arrange(-receive_yds)
## # A tibble: 859 x 7
##    receive_leader receive_yds date       opponent result Iolani_score
##    <fct>                <int> <date>     <fct>    <fct>         <int>
##  1 Carter Kamana          222 2017-09-16 Pac-Five W                55
##  2 Keoni-Kordell…         220 2013-10-04 Pac-Five W                31
##  3 Raul Pacheco           219 1992-11-14 Saint L… L                14
##  4 Jonah Miyazawa         193 2017-11-03 Lahaina… L                27
##  5 Micah Kalama           189 2004-10-01 Pac-Five W                38
##  6 Raul Pacheco           179 1993-09-11 Saint L… L                 7
##  7 Tanner Nishio…         175 2012-09-20 at Kame… L                34
##  8 Keoni-Kordell…         169 2015-10-16 Kameham… L                24
##  9 Nicholas Kenn…         169 2015-10-02 at Puna… L                23
## 10 Lionel Fujioka         166 2006-08-25 at Mili… L                23
## # … with 849 more rows, and 1 more variable: opp_score <int>

Discussion

It was an interesting look back at Iolani football over the years. As a casual fan, I found some interesting stories and tidbits that I never knew, like that Tacoma game, or the fact that Raul Pacheco was the career leader in receptions at Montana for 20 years. I never knew about how successful Joe Igber was in college and I found out (again?) about the 1968 ILH champion team. It was also a pretty good way to brush off my dplyr skills. Iolani no ka oi!