Rationale

Second-level agenda-setting theory focuses on how the media influences the attributes and characteristics audiences associate with particular issues, rather than simply determining which issues receive the most attention. Because media outlets have limited time and resources, they must make decisions not only about which stories receive attention but also about which characteristics and aspects of those stories are highlighted.

In college athletics, financial issues have become increasingly important as conferences negotiate television contracts, generate revenue, and navigate name, image, and likeness (NIL) opportunities for student-athletes. The Southeastern Conference (SEC) and the Big Ten are two of the most prominent conferences in college athletics, and their financial power has become an important part of discussions about the future of college sports. However, media coverage may emphasize different financial attributes when discussing each conference, potentially shaping how audiences perceive their respective financial strength, influence, and importance within college athletics.

Drawing on second-level agenda-setting theory, my project will compare how financial attributes of the SEC and the Big Ten are emphasized in media coverage. Specifically, the analysis will examine stories collected by Media Cloud’s United States National news archive during the selected study period. The analysis will identify and compare the attributes emphasized in financial coverage, including conference revenue, television contracts, NIL opportunities, and other financial matters. I hypothesize that media coverage will emphasize different financial attributes when discussing the SEC and the Big Ten, with the SEC receiving greater emphasis on its overall financial power and revenue.

The results will contribute to an understanding of how media outlets shape the characteristics and attributes associated with major college athletic conferences. Comparing the SEC and the Big Ten will help reveal whether news coverage emphasizes different aspects of their financial power and how those portrayals change over time. This analysis may also provide insight into how media emphasis influences the public conversation surrounding the financial influence, reputation, and future of college athletics.

Hypothesis

Average weekly coverage volume of money talks between the SEC and Big Ten differed between December 19th 2025, and October 24th 2026.

Variables & method

Weekly coverage volume of 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 was conference measured categorically as either “SEC Conference” or “Big Ten Conference” and operationalized as containing keywords likely to be unique to stories about one conference or the other.

Stories about the Big Ten and money were operationalized as stories matching the MediaCloud query:

BigTen_query <-
  '(("Big Ten" OR "Big Ten Conference" OR B1G) AND
     (revenue OR budget* OR finance* OR
      "media rights" OR broadcast* OR television OR streaming OR
      realignment OR donor* OR fundraising OR
      "revenue sharing" OR NIL OR collective*))'

Meanwhile, stories about the SEC and money were operationalized as stories matching this MediaCloud query:

SEC_query <-
  '(("SEC" OR "Southeastern Conference") AND
     (revenue OR budget* OR finance* OR
      "media rights" OR broadcast* OR television OR streaming OR
      realignment OR donor* OR fundraising OR
      "revenue sharing" OR NIL OR collective*))'

Eventually, I will use a paired-samples t-test to assess the statistical significance of coverage volume variation between the two story topics.

Results & discussion

Media Cloud Topic Summary Statistics
topic Total_Stories Weekly_Minimum Weekly_Maximum Weekly_Median Weekly_Mean Weekly_SD
SEC and Money 13170 83 629 273 292.67 127.2
B1G and Money 7665 46 366 175 170.33 76.0

One notable finding from the graph is that the SEC received more money-related media coverage than the Big Ten during most of the study period. The SEC’s weekly story count fluctuated considerably, with noticeable increases in late August, mid-September, and late September. The largest increase occurred around May 10 2026, when coverage of the SEC reached approximately 629 stories in one week. In comparison, the Big Ten generally received little money-related coverage, recording zero stories in most weeks and reaching a maximum of approximately three stories in early September.

While the graph illustrates differences in the volume of financial coverage, second-level agenda-setting theory places greater emphasis on the attributes highlighted within that coverage. One possible explanation for the SEC’s higher coverage volume is that financial developments involving the conference attracted greater media attention. Discussions surrounding conference revenue, television contracts, NIL, and the financial implications of college football may have contributed to the SEC’s increased visibility. Examining the specific stories published during the largest spikes could provide further insight into which financial attributes received the most emphasis and how those attributes were used to portray the SEC compared to the Big Ten.

Overall, the graph provides preliminary evidence that financial issues involving the SEC received greater media attention than those involving the Big Ten. However, from the perspective of second-level agenda-setting theory, the volume of coverage alone does not explain how audiences may perceive the financial characteristics of each conference. Understanding which attributes receive the most emphasis is important because media coverage can influence the characteristics and qualities audiences associate with an issue or organization. Further analysis of the specific financial attributes emphasized in coverage would help determine whether the SEC and Big Ten are portrayed differently in discussions about the financial power and future of college athletics. Because this analysis measures media coverage rather than audience perceptions, it cannot establish whether these media portrayals actually influence how audiences view either conference.

Paired-Sample T-Test

The analysis used a paired-samples t-test to assess whether, on average, the difference between each week’s coverage volume measures fell nonrandomly above or below zero. This box plot summarizes the distributions of B1G and Money (V1) and SEC and Money (V2):

The Pair Differences

According to the results, stories mentioning the SEC and Money outnumbered stories mentioning the Big Ten and Money by an average of 122 stories per week, with a standard deviation of 119 stories.

The paired differences showed a normal distribution (p > 0.05), according to a Shapiro-Wilk normality test.

Paired t-test results

The paired-samples t-test found the average of the pair differences to be statistically significant. The t value was roughly 6.9, with an associated p of 0.0000. Thus, the hypothesis was supported. The results suggest that the SEC does receive more stories about money talks than the Big Ten does.

Paired-Samples t-Test
statistic parameter p.value conf.low conf.high method
6.8957 44 0.0000 86.5797 158.0870 Paired t-test

Discussion

One possible explanation for the significant difference in financial coverage between the SEC and Big Ten is the SEC’s prominence in national discussions surrounding the financial landscape of college athletics. The conference’s financial developments, including television contracts, conference revenue, NIL opportunities, and the economic implications of college football, may have contributed to increased media attention throughout the study period. The noticeable increases in SEC coverage suggest that certain financial developments may have generated periods of heightened media interest. In comparison, the Big Ten received considerably less consistent financial coverage, suggesting that financial discussions involving the two conferences did not receive equal attention from national news outlets.

Code:

Here is the code that produced the analysis.

############################################################
# RUN ONCE TO SAVE YOUR MEDIACLOUD API KEY
############################################################

key <- "7854dea1fba0c604fb12cbf1977e01e4c42b8ff1"

write(
  paste0("MEDIACLOUD_KEY=", key),
  file = "~/.Renviron",
  append = TRUE
)

readRenviron("~/.Renviron")
nzchar(Sys.getenv("MEDIACLOUD_KEY"))

############################################################

############################################################
# 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 <- "2025-12-19"
end_date   <- "2026-10-24"

############################################################
# STEP 4: Define Search Queries
############################################################

BigTen_query <-
  '(("Big Ten" OR "Big Ten Conference" OR B1G) AND
     (revenue OR budget* OR finance* OR
      "media rights" OR broadcast* OR television OR streaming OR
      realignment OR donor* OR fundraising OR
      "revenue sharing" OR NIL OR collective*))'

SEC_query <-
  '(("SEC" OR "Southeastern Conference") AND
     (revenue OR budget* OR finance* OR
      "media rights" OR broadcast* OR television OR streaming OR
      realignment OR donor* OR fundraising OR
      "revenue sharing" OR NIL OR collective*))'

############################################################
# STEP 5: Create Topic Definitions
############################################################

topics <- c(
  "B1G and Money" = BigTen_query,
  "SEC and Money" = SEC_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

weekly_counts_wide <-
  weekly_counts %>%
  mutate(
    topic = make.names(topic)
  ) %>%
  select(week, topic, stories) %>%
  pivot_wider(
    names_from  = topic,
    values_from = stories
  )

############################################################
# 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
    )
  )

# ============================================================
#  Setup: Install and Load Required Packages
# ============================================================
if (!require("tidyverse")) install.packages("tidyverse")
if (!require("plotly")) install.packages("plotly")
if (!require("gt")) install.packages("gt")
if (!require("gtExtras")) install.packages("gtExtras")
if (!require("broom")) install.packages("broom")

library(tidyverse)
library(plotly)
library(gt)
library(gtExtras)
library(broom)

options(scipen = 999)

# ============================================================
#  Data Import
# ============================================================
mydata <- weekly_counts_wide

# Specify the two variables involved
mydata$V1 <- mydata$B1G.and.Money
mydata$V2 <- mydata$SEC.and.Money

# ============================================================
#  Compute Pair Differences
# ============================================================
mydata$PairDifferences <- mydata$V2 - mydata$V1

# ============================================================
#  Interactive Histogram of Pair Differences
# ============================================================
hist_plot <- plot_ly(
  data = mydata,
  x = ~PairDifferences,
  type = "histogram",
  marker = list(color = "#1f78b4", line = list(color = "black", width = 1))
) %>%
  layout(
    title = "Distribution of Pair Differences",
    xaxis = list(title = "Pair Differences"),
    yaxis = list(title = "Count"),
    shapes = list(
      list(
        type = "line",
        x0 = mean(mydata$PairDifferences, na.rm = TRUE),
        x1 = mean(mydata$PairDifferences, na.rm = TRUE),
        y0 = 0,
        y1 = max(table(mydata$PairDifferences)),
        line = list(color = "red", dash = "dash")
      )
    )
  )

# ============================================================
#  Descriptive Statistics
# ============================================================
desc_stats <- mydata %>%
  summarise(
    count = n(),
    mean = mean(PairDifferences, na.rm = TRUE),
    sd = sd(PairDifferences, na.rm = TRUE),
    min = min(PairDifferences, na.rm = TRUE),
    max = max(PairDifferences, na.rm = TRUE)
  )

desc_table <- desc_stats %>%
  gt() %>%
  gt_theme_538() %>%
  tab_header(title = "Descriptive Statistics: Pair Differences") %>%
  fmt_number(columns = where(is.numeric), decimals = 3)

# ============================================================
#  Normality Test (Shapiro-Wilk)
# ============================================================
shapiro_res <- shapiro.test(mydata$PairDifferences)
shapiro_table <- tidy(shapiro_res) %>%
  select(statistic, p.value, method) %>%
  gt() %>%
  gt_theme_538() %>%
  tab_header(title = "Normality Test (Shapiro-Wilk)") %>%
  fmt_number(columns = c(statistic, p.value), decimals = 4) %>%
  tab_source_note(
    source_note = "If the P.VALUE is 0.05 or less, the number of pairs is fewer than 40, and the distribution of pair differences shows obvious non-normality or outliers, consider using the Wilcoxon Signed Rank Test results instead of the Paired-Samples t-Test results."
  )

# ============================================================
#  Reshape Data for Repeated-Measures Plot
# ============================================================
df_long <- mydata %>%
  pivot_longer(cols = c(V1, V2),
               names_to = "Measure",
               values_to = "Value")

# ============================================================
#  Repeated-Measures Boxplot (Interactive, with Means)
# ============================================================
group_means <- df_long %>%
  group_by(Measure) %>%
  summarise(mean_value = mean(Value), .groups = "drop")

boxplot_measures <- plot_ly() %>%
  add_trace(
    data = df_long,
    x = ~Measure, y = ~Value,
    type = "box",
    boxpoints = "outliers",   
    marker = list(color = "red", size = 4),
    line = list(color = "black"),
    fillcolor = "royalblue",
    name = ""
  ) %>%
  add_trace(
    data = group_means,
    x = ~Measure, y = ~mean_value,
    type = "scatter", mode = "markers",
    marker = list(
      symbol = "diamond", size = 9,
      color = "black", line = list(color = "white", width = 1)
    ),
    text = ~paste0("Mean = ", round(mean_value, 2)),
    hoverinfo = "text",
    name = "Group Mean"
  ) %>%
  layout(
    title = "Boxplot of Repeated Measures (V1 vs V2) with Means",
    xaxis = list(title = "Measure"),
    yaxis = list(title = "Value"),
    showlegend = FALSE
  )

# ============================================================
#  Parametric Test (Paired-Samples t-Test)
# ============================================================
t_res <- t.test(mydata$V2, mydata$V1, paired = TRUE)
t_table <- tidy(t_res) %>%
  select(statistic, parameter, p.value, conf.low, conf.high, method) %>%
  gt() %>%
  gt_theme_538() %>%
  tab_header(title = "Paired-Samples t-Test") %>%
  fmt_number(columns = c(statistic, p.value, conf.low, conf.high), decimals = 4)

t_summary <- mydata %>%
  select(V1, V2) %>%
  summarise_all(list(Mean = mean, SD = sd)) %>%
  gt() %>%
  gt_theme_538() %>%
  tab_header(title = "Group Means and SDs (t-Test)") %>%
  fmt_number(columns = everything(), decimals = 3)

# ============================================================
#  Nonparametric Test (Wilcoxon Signed Rank)
# ============================================================
wilcox_res <- wilcox.test(mydata$V1, mydata$V2, paired = TRUE,
                          exact = FALSE)
wilcox_table <- tidy(wilcox_res) %>%
  select(statistic, p.value, method) %>%
  gt() %>%
  gt_theme_538() %>%
  tab_header(title = "Wilcoxon Signed Rank Test") %>%
  fmt_number(columns = c(statistic, p.value), decimals = 4)

wilcox_summary <- mydata %>%
  select(V1, V2) %>%
  summarise_all(list(Mean = mean, SD = sd)) %>%
  gt() %>%
  gt_theme_538() %>%
  tab_header(title = "Group Means and SDs (Wilcoxon)") %>%
  fmt_number(columns = everything(), decimals = 3)

# ============================================================
#  Results Summary (in specified order)
# ============================================================
hist_plot
desc_table
shapiro_table
boxplot_measures
t_table
t_summary
wilcox_table
wilcox_summary