top of page

Project: Using KenPom to Predict CBB Game Odds and Scores

Writer's picture: Bryce HaaseBryce Haase

Now that we are less than four weeks away from Selection Sunday, I thought it would be a good time to do a project that involves college basketball. Unfortunately, I don't have access to the same data that I have available for the NBA. There is no official CBB advanced stats website like there is for the NBA. You have to pay big bucks to get a CleaningTheGlass quality of analysis, and the other publicly available data just isn't as good. Some of the best publicly available data can be found on Fox Sports and Sports Reference.


While college basketball certainly lacks in publicly accessible advanced metrics, it definitely does not lack in rankings systems. Everyone knows and follows very closely (for some reason) the AP Top 25 Poll that comes out every Monday. There is also NET Rating, KenPom, BPI, and many others. The one that I look at the most is KenPom. KenPom ranks teams by Adjusted Efficiency margin, which is simply a team's Adjusted Offense minus the team's Adjusted Defense. Offense and defense are adjusted to what an offensive or defensive rating would be expected when that team plays an average team. Using this, we can easily compare efficiency margin and offense and defense rankings.


Something else we can do with KenPom is predict the outcome of individual matchups. The first step I took to do this is to create a CSV of all the available data from the website. After this, I could work with the data to predict scores and game odds. The method I went about doing this was to first predict each team's offensive and defensive rating for the game. To do this, I first needed to find the average offensive rating of college basketball. For the data I used from 2/15, the average offensive rating was about 102.675... This number will be updated when the regular season ends. To project offensive rating, I took the individual team's offensive rating, found out how much they differed from the average offensive rating, and then did the same for the defense and added. For example, if Team A's offense is 10% better than average and Team B's defense is 5% worse than average, the expected offensive rating for team A would be 7.5% better than average. After finding this number, I multiplied it to the average offensive rating to get the expected offensive rating. Then, I just did the same for the other team in the matchup. Home court advantage is very much a thing in college basketball, so to incorporate this I added 1.4% to the home team's offensive rating and subtracted 1.4% from to away team's defensive rating.

To predict the scores of the game, I had to first predict the pace. I simply found the average pace (about 68.283...), the added each individual team's pace and divided by the overall average pace. Once I had the pace from each team, I multiplied that number by each team's predicted offensive rating and got their predicted total points.

For finding the odds of winning, I used Pythagorean Win Expectance. The formula is: offensive rating^10.25/((offensive rating^10.25)+(defensive rating^10.25)). All I had to do was plug the team ratings into the formula, adjust so that each added up to 100, and that was it.

I also added a little bit of code at the end so the user could print out a table of the matchup if they wanted more information.

Now to have some fun with this. I want to look at some interesting games to see who my model thinks will win and what the game odds are. For this, I added a neutral site feature so that we can see what would happen if the teams squared off in March.


The matchup we all want to see:

Rivalries:

Conference battles:

The full code for this project can be found here:

427 views0 comments

Recent Posts

See All

Comentarios


bottom of page