# Load libraries
library(tidyverse)
library(mgcv)           # GAM models
library(lubridate)      # Date formats
library(tsibble)        # Time series structure
library(feasts)         # Time series decomposition
library(zoo)            # Interpolation
library(DiagrammeR)     # DAG

# Load dataset
imdb_data <- read.csv("/Users/devynmiller/Downloads/imdb_top_1000.csv")


imdb_data <- imdb_data %>%
  mutate(Released_Year = suppressWarnings(as.numeric(Released_Year))) %>%
  filter(!is.na(Released_Year) & Released_Year > 0 & 
           !is.na(Genre) & !is.na(Meta_score)) %>%
  mutate(Primary_Genre = factor(word(Genre, 1, sep = ", ")))
  
  # Data preparation: basic cleaning and genre extraction
  imdb_data <- imdb_data %>%
  mutate(Released_Year = suppressWarnings(as.numeric(Released_Year))) %>%
  filter(!is.na(Released_Year) & Released_Year > 0 & 
           !is.na(Genre) & !is.na(Meta_score)) %>%
  mutate(Primary_Genre = factor(word(Genre, 1, sep = ", ")))

# Meta score trends by genre over time (for all genres)
df_summary_time_all <- imdb_data %>%
  group_by(Released_Year, Primary_Genre) %>%
  summarize(mean_meta_score = mean(Meta_score, na.rm = TRUE), .groups = 'drop')
genre_colors <- c(
  "Drama" = "blue",
  "Comedy" = "purple",
  "Action" = "red",
  "Biography" = "green",
  "Adventure" = "orange"
)
# FIGURE 1A: Meta Score Trends by All Main Genres
ggplot(df_summary_time_all, aes(x = Released_Year, y = mean_meta_score, color = Primary_Genre, group = Primary_Genre)) +
  geom_line(na.rm = TRUE) +  
  geom_point(na.rm = TRUE) +  
  facet_wrap(~ Primary_Genre, scales = "free_y") +  
  scale_color_manual(values = genre_colors, guide = guide_legend(override.aes = list(size = 3)))+
  labs(title = "Meta Score Trends by All Main Genres Over Time", x = "Year", y = "Average Meta Score") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "none")
# Now filter for five significant genres
significant_genres <- c("Drama", "Comedy", "Action", "Biography", "Adventure")
imdb_data <- imdb_data %>%
  
  filter(Primary_Genre %in% significant_genres)
# Exploratory Data Analysis (EDA): Summarize key aspects of the dataset

# Summarize meta score statistics by genre
df_summary <- imdb_data %>%
  group_by(Primary_Genre) %>%
  summarize(mean_meta_score = mean(Meta_score, na.rm = TRUE),
            sd_meta_score = sd(Meta_score, na.rm = TRUE),
            count = n()) 
print(df_summary)

# Summarize meta score trends by genre over time
df_summary_time <- imdb_data %>%
  group_by(Released_Year, Primary_Genre) %>%
  summarize(mean_meta_score = mean(Meta_score, na.rm = TRUE), .groups = 'drop')

# FIGURE 1B: Meta Score Trends by Main Genre Over Time
ggplot(df_summary_time, aes(x = Released_Year, y = mean_meta_score, color = Primary_Genre, group = Primary_Genre)) +
  geom_line(na.rm = TRUE) +  
  geom_point(na.rm = TRUE) +  
  facet_wrap(~ Primary_Genre, scales = "free_y") +  
  scale_color_manual(values = genre_colors, guide = guide_legend(override.aes = list(size = 3)))+
  labs(title = "Meta Score Trends by Main Genre Over Time", x = "Year", y = "Average Meta Score") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "none")

# FIGURE 2: Distribution of Meta Scores
ggplot(imdb_data, aes(x = Meta_score)) +
  geom_histogram(binwidth = 2, fill = "blue", color = "black") +
  labs(title = "Distribution of Meta Scores", x = "Meta Score", y = "Count") +
  theme_minimal()

# FIGURE 3: Distribution of Released Year
ggplot(imdb_data, aes(x = Released_Year)) +
  geom_histogram(binwidth = 5, fill = "green", color = "black") +
  labs(title = "Distribution of Released Year", x = "Year", y = "Count") +
  theme_minimal()

# FIGURE 4: Number of Movies per Genre
ggplot(imdb_data, aes(x = Primary_Genre)) +
  geom_bar(fill = "lightblue", color = "black") +
  labs(title = "Number of Movies per Genre", x = "Genre", y = "Count") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  theme_minimal()

# Aggregate meta_score by year and genre for time series analysis
yearly_meta <- imdb_data %>%
  group_by(Released_Year, Primary_Genre) %>%
  summarize(Average_Meta = mean(Meta_score, na.rm = TRUE), .groups = "drop")

# Convert to tsibble for time series analysis
ts_data <- yearly_meta %>%
  as_tsibble(index = Released_Year, key = Primary_Genre) %>%
  fill_gaps()

# Interpolate missing values for time series decomposition
ts_data <- ts_data %>%
  group_by(Primary_Genre) %>%
  mutate(Average_Meta = ifelse(is.na(Average_Meta), zoo::na.approx(Average_Meta, na.rm = FALSE), Average_Meta)) %>%
  ungroup()

# GAM: Smooth function of Released_Year by genre & using basis function
gam_model <- gam(Average_Meta ~ s(Released_Year, by = Primary_Genre, bs = "tp", k = 10), 
                 data = ts_data, method = "REML")

# Summary including coefficients, significance, and smoothing parameters for each genre
print(summary(gam_model))

# Prediction with GAM using predict() and adding to the data
ts_data <- ts_data %>%
  mutate(pred = predict(gam_model, newdata = ts_data))

# FIGURE 5: GAM Smoothing of Meta Score Over Time by Genre
ggplot(ts_data, aes(x = Released_Year, y = Average_Meta, color = Primary_Genre)) +
  geom_point(color = "black", size = .75) +  # actual data points in black
  geom_line(aes(y = pred), size = 1) +       # colored GAM-smoothed predictions
  facet_wrap(~ Primary_Genre, scales = "free_y") +
  labs(title = "GAM Smoothing of Meta Score Over Time by Genre", x = "Year", y = "Meta Score") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# FIGURES 6-10: Time series decomposition for each genre
for (genre in significant_genres) {
  genre_data <- ts_data %>%
    filter(Primary_Genre == genre) %>%
    as_tsibble(index = Released_Year)
  
  # STL decomposition on genre's time series data
  genre_decomp <- genre_data %>%
    model(stl_decomp = STL(Average_Meta ~ season(window = "periodic")))
  
  # Extract decomposition components
  genre_components <- components(genre_decomp)
  
  # Plot decomposition components
  print(
    autoplot(genre_components) +
      labs(title = paste("Time Series Decomposition for", genre), x = "Year", y = "Meta Score") +
      theme_minimal() +
      theme(axis.text.x = element_text(angle = 45, hjust = 1))
  )
}



# FIGURES 11-15: ACF for each genre
for (genre in significant_genres) {
  # Filter time series data for each genre
  genre_data <- ts_data %>%
    filter(Primary_Genre == genre) %>%
    as_tsibble(index = Released_Year)
  
  # STL decomposition on genre's time series data
  genre_decomp <- genre_data %>%
    model(stl_decomp = STL(Average_Meta ~ season(window = "periodic"))) %>%
    components()
  
  # Plot ACF of remainder component to check for cyclic patterns
  print(paste("ACF Plot for Genre:", genre))
  acf(genre_decomp$remainder, main = paste("ACF of Remainder for", genre, "(Cyclic Pattern Check)"))
}

# Autocorrelation function for cyclic patterns
# ACF on decomposition remainder to check seasonality or cyclic trends
combined_decomp <- ts_data %>%
  model(stl_decomp = STL(Average_Meta ~ season(window = "periodic"))) %>%
  components()

# FIGURE 16: ACF of Remainder (Cyclic Pattern Check)
acf_res <- acf(combined_decomp$remainder, main = "ACF of Remainder (Cyclic Pattern Check)")


# Generate DAG for overall analysis

dag_code <- "
digraph causal_dag {
  # Nodes
  Genre [label='Genre', shape=ellipse]
  MetaScore [label='Meta Score', shape=ellipse]
  Year [label='Year', shape=ellipse]
  IndustryTrends [label='Industry Trends', shape=ellipse]
  CulturalFactors [label='Cultural Factors', shape=ellipse]

  # Edges
  Genre -> MetaScore
  Year -> MetaScore
  Year -> Genre
  IndustryTrends -> Genre
  IndustryTrends -> MetaScore
  CulturalFactors -> Genre
  CulturalFactors -> MetaScore

  label = 'DAG showing non-causal relationships due to confounding factors';
}
"

# FIGURE 17: DAG
DiagrammeR::grViz(dag_code)