As mentioned on the home page of my website, I took a class in the Fall of 2020 focused on sports data and analytics. The overall goal of the class was to use skills we had learned throughout the semester (scraping, visualizations, R Shiny, XGBoost, ensemble modeling, etc.) to create a comprehensive project that dealt with scraped sports data. Because I had spent so much time on Counter-Strike in the early months of 2020 (the early days of the pandemic), I knew that I wanted to use this data for this class project.

I have included screenshots of the application below, but the full project (model + app) writeup is available upon request.

The main purpose of the Shiny app is to create a user-friendly, website-like interface to the scraped data stored on my PostgreSQL server. I have scrapers running late each night to pull the past day’s worth of data from HLTV.org, the “Home of Competitive Counter-Strike”, and store it in the PostgreSQL server. This way, the Shiny application is providing up-to-date analysis. One table of the Postgres database holds all of the upcoming matches. A full query of this table acts as the main back end of the application, as explained in each section.

Home Page

Screenshot of the Home Page

The home page displays a welcome message, and then displays the number of matches that are currently on the upcoming games table. Because scrapers are being run late each night, the matches on that table are all matches that are taking place on the day the user is using the app. We can see that there were 16 matches that took place on the day the screenshot was taken. Finally, a summary/description of what is contained on each match page as well as contact information is included.

Match Analysis Page

The Match Analysis page is the main page of the application. The objective of this page is to display information pertaining to a single match, which is selected using a dropdown menu (the dropdown selection options are each entry in the upcoming matches table). This can be seen below.

Match Analysis Dropdown Menu

When a match is selected, the link to the corresponding HLTV page is displayed. This is useful if the app user desires information not otherwise contained in this application.

The Map Pool Comparison table is an analytical summary of a team’s strengths/weaknesses on particular maps. This metric is meant to represent how each team in the match has drafted and performed in the last 3 months on each possible map. The objective of this information is to inform the user which maps are more or less likely to be played and in what order. This table is also meant to go hand-in-hand with the model results.

The model/simulation results for each map are displayed in the Map Win Probability Table.

Match Win Probability Estimates

So, after determining which maps are more likely to be played, this table provides the model results for the given match on each map. Because the map draft process takes place shortly before a match, there cannot be a one-number match probability estimate until the maps are set. Therefore, providing an estimate of each map, regardless of selection probability, allows the user to create their own probability estimate for the match winner.

Finally, a table displays the results of previous matchups between the two teams.

Previous Matchups Table

The winner of each map is highlighted in green and the loser is highlighted in red. In this case, for example, we see that these teams have played 17 maps against one another in the last 6 months. The six most recent maps are included in the screenshot above.

Meta Analysis Page

The meta analysis page is the site of future work on the application. As of right now, a graph for each map is included that details how performance has changed on each map over time (by month). These graphs are mate with Plotly, an R wrapper to a JavaScript library that creates interactive graphs.

Meta Analysis Page

This screenshot, for example, shows the results over time for the map “Inferno”. This information can be important to see how the changes to each map have affected gameplay and balance.