Rationale

According to the media priming theory, media content can influence behaviors and attitudes in humans for a short period of time. Especially in younger audiences, we see that phenomenons like violent media can influence youth to act more aggressive for a short time after consumption.

In this case, we will look at how violent games can shape the way a group of fifth-graders may act in comparison to nonviolent games or an art project.

Hypothesis

The mean time students spend engaging in aggressive acts (“Value”) differs across the types of lessons that students complete (“Group”).

Variables & Method

135 fifth-graders at a suburban elementary school were randomly divided into three groups of 45 students each. For about 30 minutes before recess, teachers assigned each of the groups to complete different assignments (“Group”). One group completed a math lesson by playing a game called “Exponent Fighter”, and each time the player gave the correct answer to an exponent math problem, the player’s character would punch a computer-controlled opponent. Each time the player gave an incorrect answer, the computer-controlled opponent would punch the player’s character. The player would win if they landed more punches than the computer-controlled opponent.

A second group of 45 students played a similar game called “Exponent Builder.” Each time the player gave the correct answer to an exponent math problem, the player’s character would add a block to a structure to allow the character to reach an otherwise-unreachable platform. The player would win by acquiring enough blocks to build the structure needed.

A third group of 45 students completed an art lesson involving using the color wheel to select a color scheme for an abstract design produced using paint and pre-cut stencils.

Following the 30-minute lesson, students were sent to the playground for a 30-minute recess. There, a team or researchers watched the students play and recorded the amount of time, in minutes, each student engaged in any sort of aggressive act (“Value”). This could be verbal (taunting, teasing, etc.) or physical (pushing, grabbing, etc).

Results & Discussion

The box-plot below shows the distribution of the dependent variable (“Value”) and the independent variable (“Group”). The descriptive statistics are also shown. A Shapiro-Wilk Normality Test, ANOVA test, and Tukey HSD test were conducted to determine statistical significance.

Descriptive Statistics by Group
IV count mean sd min max
Art project 45 4.96 1.04 2.3 7.3
Nonviolent game 45 5.86 1.06 3.6 8.4
Violent game 45 10.75 1.00 8.5 12.8
Shapiro-Wilk Normality Test by Group
IV W_statistic p_value
Art project 0.99 0.923
Nonviolent game 0.98 0.594
Violent game 0.98 0.699
Note. If any p-value figures are 0.05 or less, if one or more group distributions appear non-normal, and any group sizes are less than 40, consider using the Kruskal-Wallis and Post-hoc Dunn’s Test results instead of the ANOVA and Tukey HSD Post-hoc results.
ANOVA Test Results
Statistic df df_resid p_value
420.86 2 87.94717 < .001
Tukey HSD Post-hoc Results
Comparison diff lwr upr p adj
Nonviolent game-Art project 0.90 0.38 1.42 < .001
Violent game-Art project 5.79 5.27 6.30 < .001
Violent game-Nonviolent game 4.89 4.37 5.40 < .001
Kruskal-Wallis Test Results
Statistic df p_value
95.23 2 < .001
Post-hoc Dunn’s Test Results
Comparison Z P.unadj P.adj
Art project - Nonviolent game -2.42 0.016 0.047
Art project - Violent game -9.40 < .001 < .001
Nonviolent game - Violent game -6.98 < .001 < .001

The results supported the hypothesis. The students who played the violent game were much more likely to engage in aggressive acts at recess than either of the other two groups. The violent game group had a mean of 10.75, which is much higher than the nonviolent game group with a mean of 5.86, or the art project group with a mean of 4.96. By looking at the Tukey HSD test, we see that the difference between all three groups proved to be statistically significant.

Code

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

library(tidyverse)
library(gt)
library(gtExtras)
library(FSA)
library(plotly)

options(scipen = 999) # suppress scientific notation

# ============================================================
#  Step 1: Load Data
# ============================================================
mydata <- read.csv("Priming.csv") # <-- Edit YOURFILENAME.csv

# Specify DV and IV (edit column names here)
mydata$DV <- mydata$Value
mydata$IV <- mydata$Group

# ============================================================
#  Step 2: Visualize Group Distributions (Interactive)
# ============================================================
# Compute group means
group_means <- mydata %>%
  group_by(IV) %>%
  summarise(mean_value = mean(DV), .groups = "drop")

# Interactive plot (boxplot + group means)
box_plot <- plot_ly() %>%
  # Boxplot trace
  add_trace(
    data = mydata,
    x = ~IV, y = ~DV,
    type = "box",
    boxpoints = "outliers",   # only applies here
    marker = list(color = "red", size = 4),  # outlier style
    line = list(color = "black"),
    fillcolor = "royalblue",
    name = ""
  ) %>%
  # Group means (diamonds)
  add_trace(
    data = group_means,
    x = ~IV, 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 = "Interactive Group Distributions with Means",
    xaxis = list(title = "Independent Variable (IV)"),
    yaxis = list(title = "Dependent Variable (DV)"),
    showlegend = FALSE
  )

# ============================================================
#  Step 3: Descriptive Statistics by Group
# ============================================================
desc_stats <- mydata %>%
  group_by(IV) %>%
  summarise(
    count = n(),
    mean = mean(DV, na.rm = TRUE),
    sd   = sd(DV, na.rm = TRUE),
    min  = min(DV, na.rm = TRUE),
    max  = max(DV, na.rm = TRUE)
  )

desc_table <- desc_stats %>%
  mutate(across(where(is.numeric), ~round(.x, 2))) %>%
  gt() %>%
  gt_theme_538() %>%
  tab_header(title = "Descriptive Statistics by Group")

# ============================================================
#  Step 4: Test Normality (Shapiro-Wilk)
# ============================================================
shapiro_results <- mydata %>%
  group_by(IV) %>%
  summarise(
    W_statistic = shapiro.test(DV)$statistic,
    p_value = shapiro.test(DV)$p.value
  )

shapiro_table <- shapiro_results %>%
  mutate(
    W_statistic = round(W_statistic, 2),
    p_value = ifelse(p_value < .001, "< .001", sprintf("%.3f", p_value))
  ) %>%
  gt() %>%
  gt_theme_538() %>%
  tab_header(title = "Shapiro-Wilk Normality Test by Group") %>%
  tab_source_note(
    source_note = "Note. If any p-value figures are 0.05 or less, if one or more group distributions appear non-normal, and any group sizes are less than 40, consider using the Kruskal-Wallis and Post-hoc Dunn’s Test results instead of the ANOVA and Tukey HSD Post-hoc results."
  )

# ============================================================
#  Step 5a: Non-Parametric Test (Kruskal-Wallis + Dunn)
# ============================================================
kruskal_res <- kruskal.test(DV ~ IV, data = mydata)

kruskal_table <- data.frame(
  Statistic = round(kruskal_res$statistic, 2),
  df = kruskal_res$parameter,
  p_value = ifelse(kruskal_res$p.value < .001, "< .001",
                   sprintf("%.3f", kruskal_res$p.value))
) %>%
  gt() %>%
  gt_theme_538() %>%
  tab_header(title = "Kruskal-Wallis Test Results")

dunn_res <- dunnTest(DV ~ IV, data = mydata, method = "bonferroni")$res

dunn_table <- dunn_res %>%
  mutate(
    Z = round(Z, 2),
    P.unadj = ifelse(P.unadj < .001, "< .001", sprintf("%.3f", P.unadj)),
    P.adj   = ifelse(P.adj < .001, "< .001", sprintf("%.3f", P.adj))
  ) %>%
  gt() %>%
  gt_theme_538() %>%
  tab_header(title = "Post-hoc Dunn’s Test Results")

# ============================================================
#  Step 5b: Parametric Test (ANOVA + Tukey)
# ============================================================
anova_res <- oneway.test(DV ~ IV, data = mydata, var.equal = FALSE)

anova_table <- data.frame(
  Statistic = round(anova_res$statistic, 2),
  df = anova_res$parameter[1],
  df_resid = anova_res$parameter[2],
  p_value = ifelse(anova_res$p.value < .001, "< .001",
                   sprintf("%.3f", anova_res$p.value))
) %>%
  gt() %>%
  gt_theme_538() %>%
  tab_header(title = "ANOVA Test Results")

anova_model <- aov(DV ~ IV, data = mydata)
tukey_res <- TukeyHSD(anova_model)$IV %>% as.data.frame()

tukey_table <- tukey_res %>%
  rownames_to_column("Comparison") %>%
  mutate(
    diff = round(diff, 2),
    lwr = round(lwr, 2),
    upr = round(upr, 2),
    `p adj` = ifelse(`p adj` < .001, "< .001", sprintf("%.3f", `p adj`))
  ) %>%
  gt() %>%
  gt_theme_538() %>%
  tab_header(title = "Tukey HSD Post-hoc Results")

# ============================================================
#  Step 6: Display Key Results
# ============================================================
# Interactive box plot
box_plot

# Tables
desc_table
shapiro_table
anova_table
tukey_table
kruskal_table
dunn_table