UNC has big problems. They are the worst preseason AP-25 leaders since 2002.
In Chapel Hill is in big trouble. UNC, the finalist of last year's March Madness and preseason leader of the AP-25 rating, lost 4 games in a row on Sunday. Prior to that, starting with the 2001/02 season, the worst result for the seeding leader was lost 4 times in 16 games (Kentucky 2014). North Carolina has lost how many in 9 games.
It is no coincidence that UNC became the leaders of the preseason ranking. They stopped one step away from the title, and returned 4 of their 5 starting players (only Manek leave), and Armando Bacot was one of the pre-season favorites for the Naismith Trophy.
UNC started with five wins, although out of the first five rivals, only James Madison is in the top 100 of the rating Kenpom.com . And then lost 4 games to opponents from the top 40 of the same rating.
Of the problems in these games, UNC has a low percentage of accurate shots, especially because of the arc. In none of the games was the percentage of hits higher than 50, and in two the percentage from behind the arc was below 20.
We can say that UNC has a difficult schedule and all the defeats were in games with strong opponents. This is true, but, for example, last year Gonzaga had a similar calendar in the first 9 games (and the top 4 is even stronger), but the Bulldogs finished this stretch 7-2
UNC-2023 opponents (Kenpom.com rating)
UNC Wilmington 159
Charleston 103
Gardner-Webb 186
James Madison 80
Portland 110
Iowa State 40
Alabama 13
Indiana 10
Virginia Tech 35
Gonzaga-2022 opponents (Kenpom.com rating)
Utah Tech 278
Texas 15
Alcorn State 265
Bellarmine 200
Central Michigan 318
UCLA 11
Duke 8
Tarleton 212
Alabama 28
UNC should seriously look into the causes of what is happening, but so far nothing terrible has happened. The games inside the conference have not started yet and UNC has time to solve its problems. Otherwise, it is worth forgetting not only about the repetition (or improvement) of last year's result, but about the March madness in general.
R code for chart:
`%>%` <- magrittr::`%>%`
scoreboard <- data.table::rbindlist(lapply(seq(2002, 2023), hoopR::load_mbb_schedule), fill = TRUE)
ap_preseason <- data.frame(season = seq(2002, 2023),
value = c("DUKE", "ARIZ", "CONN", "KU", "DUKE", "FLA", "UNC", "UNC", "KU", "DUKE", "UNC", "IU", "UK",
"UK", "UNC", "DUKE", "DUKE", "KU", "MSU", "GONZ", "GONZ", "UNC"), stringsAsFactors = FALSE)
lose <- 4
team_games <- scoreboard %>%
dplyr::filter(home_score != 0) %>%
dplyr::select(season, date, home_abbreviation, home_winner, home_color, away_abbreviation, away_color, home_logo, away_logo) %>%
tidyr::pivot_longer(c(home_abbreviation, away_abbreviation)) %>%
dplyr::inner_join(ap_preseason, by=c("season", "value")) %>%
dplyr::arrange(date) %>%
dplyr::mutate(loser = dplyr::if_else((((name == "home_abbreviation") & (home_winner)) | ((name == "away_abbreviation") & (!home_winner))), 0, 1),
color = dplyr::if_else(name == "home_abbreviation", home_color, away_color),
logo = dplyr::if_else(name == "home_abbreviation", home_logo, away_logo)) %>%
dplyr::mutate(color = paste0("#", color)) %>%
dplyr::group_by(season, value, color, logo) %>%
dplyr::summarise(cnt_game = dplyr::row_number(),
cum_lose = cumsum(loser),
cnt_lose = sum(loser)) %>%
dplyr::ungroup()
team_lose <- team_games %>%
dplyr::filter(cnt_lose >= lose & cum_lose >= lose) %>%
dplyr::group_by(season, value, color, logo) %>%
dplyr::slice_head(n=1) %>%
dplyr::ungroup() %>%
dplyr::bind_rows(team_games %>% dplyr::filter(cnt_lose < lose) %>% dplyr::group_by(season, value) %>% dplyr::slice_tail(n=1)) %>%
dplyr::arrange(season) %>%
dplyr::mutate(label_game = dplyr::if_else(cnt_lose < lose, paste0(cnt_game, "*"), as.character(cnt_game)))
team_logos <- team_lose %>%
dplyr::select(value, logo) %>%
dplyr::distinct()
### GET Teams logo
invisible(lapply(seq(1, 10), function(x){
value <- team_logos[x, 1] %>% dplyr::pull()
link <- team_logos[x, 2] %>% dplyr::pull()
img <- magick::image_read(link)
svg <- magick::image_convert(img, format="svg")
magick::image_write(svg, paste0(value,".svg"))
}))
team_lose$image <- ifelse(team_lose$value == "DUKE", "DUKE.svg",
ifelse(team_lose$value == "ARIZ", "ARIZ.svg",
ifelse(team_lose$value == "CONN", "CONN.svg",
ifelse(team_lose$value == "KU", "KU.svg",
ifelse(team_lose$value == "FLA", "FLA.svg",
ifelse(team_lose$value == "UNC", "UNC.svg",
ifelse(team_lose$value == "IU", "IU.svg",
ifelse(team_lose$value == "UK", "UK.svg",
ifelse(team_lose$value == "MSU", "MSU.svg", "GONZ.svg")))))))))
distinct_teams <- team_lose %>%
dplyr::select(value, color) %>%
dplyr::distinct()
fill_value <- lapply(seq_len(nrow(distinct_teams)), function(x){
team_color <- distinct_teams[x, 2] %>% dplyr::pull()
team_color
})
names(fill_value) <- distinct_teams %>% dplyr::select(value) %>% dplyr::pull()
ggplot2::ggplot(team_lose, ggplot2::aes(as.factor(season), cnt_game, fill = value)) +
ggplot2::geom_col() +
ggimage::geom_image(ggplot2::aes(x=as.factor(season), y = cnt_game + 1, image = image)) +
ggplot2::scale_fill_manual(values = fill_value) +
ggplot2::ylab("GAMES") +
ggplot2::labs(title = "In which game of season AP-25 Preseason leader lose four time?",
subtitle = "* UNC-2008, Kansas-2010, Kentucky-2015 and Gonzaga-2021 lost less than 4 games",
caption = "Data: ESPN (via hoopR), twitter: @vshufinskiy, Telegram: @nbaatlantic") +
ggplot2::theme_minimal() +
ggplot2::scale_y_continuous(breaks = seq(0, 41, 2)) +
ggplot2::theme(
text=ggplot2::element_text(family="Gill Sans"),
axis.title.x= ggplot2::element_blank(),
legend.position = "none",
axis.text.x = ggplot2::element_text(angle = 45, size=10),
axis.text.y = ggplot2::element_text(size=10),
plot.title=ggplot2::element_text(family="Gill Sans Bold",size=18, hjust = 0.5),
plot.subtitle = ggplot2::element_text(size=11),
plot.caption = ggplot2::element_text(size=12)
)