The first-level of agenda-setting theory predicts that topics that are more frequently featured in media content will be more prominent in the minds of media audiences. Due to the limitations placed on media with resources while looking at time and space available to create and publish content, media must pick and choose which issues to feature over others. This choice usually leads to the media decision-makers allocating more of those time and space resources to the prioritized topic. The media having to choose between topics leads to various issues being pitted against each other as they compete with each other for coverage. There can be instances where the media’s prioritization of one topic compared to another can erase one off the agenda, or keep it out of the headlines. On the other hand, there can be times where topics jockey for position and alternate between more and less coverage. There can also be more even splits, where topics consistently share the same amount of coverage and mention in the media’s agenda.
Based on what first-level agenda-setting theory describes about this phenomenon, my project will compare the media agenda prominence between two of college athletics biggest conferences: the Southeastern Conference and the Big Ten Conference. The analysis will specifically compare the number of stories per week that MediaCloud.org’s United States- National news archive collected about each conference starting on January 4 and ending on October 24.
The results will enhance and further understand how the two rival conferences – on the field and in the news– compete for media attention on a national stage.
Average weekly coverage between the Southeastern Conference and Big Ten Conference differed during the first 10 months of 2026.
Weekly coverage volume between the two conferences served as the dependent variable for the analysis. It was measured continuously as the number of stories published per week that included terms a MediaCloud.org query specified as indicating coverage of one war or the other.
The independent variable was “conference,” measured categorically as either “SEC” or “B1G” and operationalized as containing keywords that would be in stories about one conference or the other.
Stories about the SEC were operationalized as stories matching the MediaCloud query:
SEC_query <-
"((SEC OR 'Southeastern Conference') AND
(football OR sports OR NCAA OR university) NOT
('Securities and Exchange' OR 'SEC filing' OR 'SEC charges' OR 'federal securities'))"
Stories about the BIG10 were operationalized as stories matching the MediaCloud query:
B1G_query <-
"(('Big Ten' OR 'Big 10' OR B1G) AND
('college football' OR 'college sports' OR NCAA OR athletics))"
Eventually, I will use a paired-samples t-test to interpret the statistical significance of coverage volume variation between the two story topics.
The figure and table below summarizes each conference’s weekly coverage volume across the period analyzed. Coverage of the SEC massively jumped the BIG10 during the week of March 15, but other than that the two conferences stayed consistently together outside of a couple of jumps for the BIG10. The two jumps that seem to standout are the week of April 19, along with a consistent run in favor of the BIG10 from mid-June through August. This time period was the lowest volume period for both groups. The BIG10 had a greater weekly average and had more total stories than the SEC. However both sides had a very similar weekly median amount.
| topic | Total_Stories | Weekly_Minimum | Weekly_Maximum | Weekly_Median | Weekly_Mean | Weekly_SD |
|---|---|---|---|---|---|---|
| Big 10 | 72398 | 1101 | 2712 | 1718 | 1723.76 | 380.18 |
| SEC | 70436 | 852 | 3282 | 1714 | 1677.05 | 502.18 |
An explanation for the surge on stories for the SEC would be further investigated, but after a brief period of searching I believe it is due to comments by the SEC’s commissioner surrounding counter-demands to the NCAA on Name, Image, and Likeness deals and tampering in college football and men’s and women’s basketball’s transfer portals. I would also like to examine the period over the summer where the BIG10 was more consistently in the news than the SEC. This is typically a slower part of the calendar for college sports, but there was a sizeable gap.
Another improvement I would like to add on to this would be revising queries for both leagues. I think it could be narrowed down even more, and also made more consistent to each other.
############################################################
# STEP 1: Install and Load Required Packages
############################################################
required_packages <- c(
"tidyverse",
"httr2",
"lubridate",
"plotly",
"knitr",
"kableExtra"
)
for (pkg in required_packages) {
if (!requireNamespace(pkg, quietly = TRUE)) {
install.packages(pkg)
}
}
library(tidyverse)
library(httr2)
library(lubridate)
library(plotly)
library(knitr)
library(kableExtra)
############################################################
# STEP 2: Verify Media Cloud API Key
############################################################
if (!nzchar(Sys.getenv("MEDIACLOUD_KEY"))) {
stop(
"No Media Cloud API key was found.\n",
"Run the setup section once,\n",
"then restart R and try again."
)
}
mc_key <- Sys.getenv("MEDIACLOUD_KEY")
############################################################
# STEP 3: Define the Date Range
############################################################
start_date <- "2026-01-04"
end_date <- "2026-10-24"
############################################################
# STEP 4: Define Search Queries
############################################################
SEC_query <-
"((SEC OR 'Southeastern Conference') AND
(football OR sports OR NCAA OR university) NOT
('Securities and Exchange' OR 'SEC filing' OR 'SEC charges' OR 'federal securities'))"
B1G_query <-
"(('Big Ten' OR 'Big 10' OR B1G) AND
('college football' OR 'college sports' OR NCAA OR athletics))"
############################################################
# STEP 5: Create Topic Definitions
############################################################
topics <- c(
"SEC" = SEC_query,
"Big 10" = B1G_query
)
############################################################
# STEP 6: Create a Function to Retrieve Daily
# Story Counts
############################################################
mc_counts_over_time <- function(
query,
start_date,
end_date,
collection_id = 34412234
) {
resp <-
request(
"https://search.mediacloud.org/api/search/count-over-time"
) |>
req_headers(
Authorization = paste("Token", mc_key)
) |>
req_url_query(
q = query,
start = start_date,
end = end_date,
platform = "onlinenews-mediacloud",
cs = collection_id
) |>
req_perform()
results <- resp |>
resp_body_json()
map_dfr(
results$count_over_time$counts,
as_tibble
) |>
mutate(
date = as.Date(date)
)
}
############################################################
# STEP 7: Download Daily Counts for All Topics
############################################################
topic_data <-
imap_dfr(
topics,
function(search_string, topic_name) {
message(
"Downloading: ",
topic_name
)
results <-
mc_counts_over_time(
query = search_string,
start_date = start_date,
end_date = end_date
)
Sys.sleep(35)
results |>
mutate(
topic = topic_name
)
}
)
############################################################
# STEP 8: Examine the Downloaded Daily Data
############################################################
head(topic_data)
glimpse(topic_data)
############################################################
# STEP 9: Convert Daily Counts to Weekly Counts
############################################################
weekly_counts <-
topic_data |>
mutate(
week = floor_date(
date,
unit = "week"
)
) |>
group_by(
topic,
week
) |>
summarise(
stories = sum(count),
.groups = "drop"
)
############################################################
# STEP 10: Examine Weekly Counts
############################################################
weekly_counts
############################################################
# STEP 11: Summarize Coverage by Topic
############################################################
topic_summary <-
weekly_counts |>
group_by(topic) |>
summarise(
Total_Stories = sum(stories),
Weekly_Minimum = min(stories),
Weekly_Maximum = max(stories),
Weekly_Median = median(stories),
Weekly_Mean = round(
mean(stories),
2
),
Weekly_SD = round(
sd(stories),
2
),
.groups = "drop"
) |>
arrange(
desc(Total_Stories)
)
Table <-
topic_summary |>
kbl(
caption =
"Media Cloud Topic Summary Statistics",
align = "lrrrrrr"
) |>
kable_styling(
full_width = FALSE,
bootstrap_options = c(
"striped",
"hover",
"condensed"
)
)
Table
############################################################
# STEP 12: Create an Interactive Plotly Graph
############################################################
weekly_counts <- weekly_counts |>
mutate(
stories_formatted = formatC(
stories,
format = "d",
big.mark = ","
)
)
Graph <- plot_ly(
data = weekly_counts,
x = ~week,
y = ~stories,
color = ~topic,
colors = "Set1",
type = "scatter",
mode = "lines+markers",
customdata = ~topic,
text = ~stories_formatted,
hovertemplate =
paste(
"%{customdata}
",
"Week: %{x|%Y-%m-%d}
",
"Stories: %{text}
",
""
)
) |>
layout(
title =
"Weekly U.S. Coverage Volume",
hovermode = "x unified",
xaxis = list(
title = "Week"
),
yaxis = list(
title = "Weekly Story Count",
separatethousands = TRUE
)
)
Graph