Mapping the Evolution of Croatian Catholic Digital Communication
Author
DigiKat Project
Published
January 27, 2026
1 Introduction
This document presents Map 4 of the DigiKat project, analyzing the temporal dynamics of Croatian Catholic digital media. The core question driving this analysis is How does Croatian Catholic digital communication evolve over time, and how does it respond to events?
Understanding temporal patterns reveals the rhythms of religious communication online, from daily posting cycles to annual liturgical seasons. This analysis examines over 600,000 posts from 2021 to 2024 to uncover when Croatian Catholics communicate, how patterns shift across platforms, and how the digital sphere responds to significant religious and secular events.
1.1 Methodological Overview
Temporal analysis examines how communication patterns change across multiple time scales. This includes macro trends (yearly, monthly), meso patterns (weekly, liturgical seasons), and micro rhythms (daily, hourly).
Key metrics in this analysis:
Metric
Definition
Interpretation
Rolling average
Smoothed trend over N days
Removes noise to reveal underlying patterns
Year over Year (YoY)
Current vs same period last year
Shows growth or decline trajectory
CAGR
Compound Annual Growth Rate
Standardized multi year growth measure
Effect size
(Event period - Baseline) / Baseline
Quantifies impact of events or seasons
Sunday Index
Sunday activity / Weekday average
Measures distinctive Sunday patterns
Interpretation guidance:
Rising rolling averages indicate growth; declining suggests contraction
Effect sizes above 0% show increased activity during events/seasons
Sunday Index above 1.0 indicates higher Sunday activity than weekday average
Platform correlations reveal synchronized vs independent communication patterns
Liturgical calendar mapping:
The Catholic liturgical year structures religious communication. Key seasons include Advent (preparation for Christmas), Christmas (Dec 25 to Epiphany), Lent (40 days before Easter), Easter (50 days to Pentecost), and Ordinary Time (remainder). Feast days create additional activity spikes.
Show code
dta <-readRDS("C:/Users/lsikic/Luka C/HKS/Projekti/Digitalni Kat/SHKM/DigiKat/data/merged_comprehensive.rds") %>%filter(SOURCE_TYPE !="tiktok", !is.na(SOURCE_TYPE)) %>%filter(DATE >=as.Date("2021-01-01") & DATE <=as.Date("2025-12-31")) %>%filter(year >=2021& year <=2025)setDT(dta)cat("Data loaded:", nrow(dta), "rows\n")
Data loaded: 608879 rows
Show code
if (nrow(dta) ==0) stop("No data after filtering! Check your date filters.")dta[, DATE :=as.Date(DATE)]dta[, Year :=year(DATE)]dta[, Month :=month(DATE)]dta[, Week :=isoweek(DATE)]dta[, DOW := lubridate::wday(DATE, label =TRUE, abbr =FALSE)]dta[, DOW_num := lubridate::wday(DATE)]dta[, Hour :=as.integer(substr(TIME, 1, 2))]n_posts <-nrow(dta)n_sources <-uniqueN(dta$FROM)date_range <-paste(min(dta$DATE, na.rm =TRUE), "to", max(dta$DATE, na.rm =TRUE))
The first analysis examines macro level trends in posting volume and engagement over the corpus period. This reveals overall growth or decline patterns and identifies major activity peaks.
Reading the charts:
Daily volume shows raw activity with smoothing to reveal trends
7 day rolling average captures weekly patterns while reducing noise
30 day rolling average shows monthly trend direction
YoY change indicates whether activity is growing or declining relative to prior year
Croatian Catholic digital communication is expected to follow liturgical rhythms. This analysis maps posting patterns to the Catholic liturgical calendar to identify seasonal effects.
Key seasons:
Advent: Four weeks before Christmas (preparation)
Christmas: December 25 through Epiphany (celebration)
Lent: Ash Wednesday to Holy Thursday (penitence)
Easter: Easter Sunday through Pentecost (celebration)
Ordinary Time: All other periods
Show code
calculate_easter <-function(year) { a <- year %%19 b <- year %/%100 c <- year %%100 d <- b %/%4 e <- b %%4 f <- (b +8) %/%25 g <- (b - f +1) %/%3 h <- (19* a + b - d - g +15) %%30 i <- c %/%4 k <- c %%4 l <- (32+2* e +2* i - h - k) %%7 m <- (a +11* h +22* l) %/%451 month <- (h + l -7* m +114) %/%31 day <- ((h + l -7* m +114) %%31) +1as.Date(paste(year, month, day, sep ="-"))}assign_liturgical_season <-function(date) { year <-year(date) easter <-calculate_easter(year) ash_wednesday <- easter -46 palm_sunday <- easter -7 pentecost <- easter +49 advent_start <-as.Date(paste(year, "11", "27", sep ="-")) advent_start <- advent_start + (7- lubridate::wday(advent_start) +1) %%7if (advent_start >as.Date(paste(year, "12", "03", sep ="-"))) { advent_start <- advent_start -7 } christmas <-as.Date(paste(year, "12", "25", sep ="-")) epiphany <-as.Date(paste(year +1, "01", "06", sep ="-")) baptism_of_lord <- epiphany + (7- lubridate::wday(epiphany)) %%7+1if (lubridate::wday(epiphany) ==1) baptism_of_lord <- epiphany +7 prev_year_christmas <-as.Date(paste(year -1, "12", "25", sep ="-")) prev_epiphany <-as.Date(paste(year, "01", "06", sep ="-"))if (date >= advent_start) {if (date < christmas) return("Advent")elsereturn("Christmas") }if (date < prev_epiphany +8&&month(date) ==1&&day(date) <=13) {return("Christmas") }if (date >= ash_wednesday && date < easter) {return("Lent") }if (date >= easter && date < pentecost) {return("Easter") }return("Ordinary Time")}dta[, Liturgical_Season :=sapply(DATE, assign_liturgical_season)]
3.1 Volume by Liturgical Season
Show code
season_stats <- dta[, .(Posts = .N,Total_Interactions =sum(INTERACTIONS, na.rm =TRUE),Mean_Interactions =mean(INTERACTIONS, na.rm =TRUE),Days =uniqueN(DATE)), by = Liturgical_Season]season_stats[, Posts_Per_Day := Posts / Days]season_stats[, Interactions_Per_Day := Total_Interactions / Days]season_order <-c("Advent", "Christmas", "Ordinary Time", "Lent", "Easter")season_stats[, Liturgical_Season :=factor(Liturgical_Season, levels = season_order)]ggplot(season_stats[!is.na(Liturgical_Season)], aes(x = Liturgical_Season, y = Posts_Per_Day, fill = Liturgical_Season)) +geom_col(width =0.7) +geom_text(aes(label =sprintf("%.0f", Posts_Per_Day)), vjust =-0.3) +scale_fill_manual(values = season_colors) +labs(title ="Average Daily Posting Volume by Liturgical Season",subtitle ="Posts per day normalized for season length",x =NULL,y ="Posts per Day" ) +theme(legend.position ="none")
3.2 Engagement by Liturgical Season
Show code
ggplot(season_stats[!is.na(Liturgical_Season)], aes(x = Liturgical_Season, y = Mean_Interactions, fill = Liturgical_Season)) +geom_col(width =0.7) +geom_text(aes(label =sprintf("%.1f", Mean_Interactions)), vjust =-0.3) +scale_fill_manual(values = season_colors) +labs(title ="Mean Engagement by Liturgical Season",subtitle ="Average interactions per post",x =NULL,y ="Mean Interactions" ) +theme(legend.position ="none")
This analysis examines how Croatian Catholic digital media responds to specific known events during the corpus period.
Event types:
Youth Event: SHKM and similar gatherings
Vatican: Papal and Holy See announcements
Political: Elections and policy events
Media: Infrastructure changes in Catholic media
Show code
known_events <-data.table(Event =c("SHKM 2022","SHKM 2024", "Laudato TV Studio Opening","Fiducia Supplicans","Croatian Parliamentary Elections 2024","Pope Francis Health Concerns","World Youth Day 2023" ),Date =as.Date(c("2022-04-30","2024-04-27","2021-05-15","2023-12-18","2024-04-17","2023-03-29","2023-08-01" )),Type =c("Youth Event","Youth Event","Media","Vatican","Political","Vatican","Youth Event" ),Description =c("Susret hrvatske katoličke mladeži","Susret hrvatske katoličke mladeži","Cardinal Bozanić blessed new studio","Vatican declaration on same sex blessings","Croatian parliamentary elections","Pope Francis hospitalization","WYD Lisbon" ))
4.1 Event Response Profiles
Show code
event_response <-data.table()for (i in1:nrow(known_events)) { event_date <- known_events$Date[i] event_name <- known_events$Event[i] window_start <- event_date -7 window_end <- event_date +14 daily_response <- dta[DATE >= window_start & DATE <= window_end, .(Posts = .N,Interactions =sum(INTERACTIONS, na.rm =TRUE) ), by = DATE] daily_response[, `:=`(Event = event_name,Days_From_Event =as.integer(DATE - event_date) )] event_response <-rbind(event_response, daily_response)}event_response <-merge(event_response, known_events[, .(Event, Type)], by ="Event")ggplot(event_response, aes(x = Days_From_Event, y = Posts, color = Event)) +geom_line(linewidth =1) +geom_vline(xintercept =0, linetype ="dashed", color ="red") +facet_wrap(~Event, scales ="free_y", ncol =2) +scale_x_continuous(breaks =seq(-7, 14, 7)) +labs(title ="Event Response Profiles",subtitle ="Daily posting volume around major events (red line = event day)",x ="Days from Event",y ="Posts" ) +theme(legend.position ="none")
same_day_spread <- dta[, .(Platforms =uniqueN(SOURCE_TYPE),Sources =uniqueN(FROM),Total_Posts = .N), by = DATE][Platforms >1]ggplot(same_day_spread, aes(x = Platforms)) +geom_histogram(binwidth =1, fill ="#2c5f7c", color ="white") +scale_x_continuous(breaks =1:8) +scale_y_continuous(labels = comma) +labs(title ="Daily Cross Platform Activity",subtitle ="Number of platforms active per day",x ="Number of Active Platforms",y ="Number of Days" )
7.2 Platform Interaction Patterns
Platform correlations reveal which platforms have synchronized activity patterns. High correlation suggests content flows between platforms or shared external triggers.
Show code
platform_daily <- dta[, .(Posts = .N), by = .(DATE, SOURCE_TYPE)]platform_wide <-dcast(platform_daily, DATE ~ SOURCE_TYPE, value.var ="Posts", fill =0)platform_cor <-cor(platform_wide[, -1, with =FALSE], use ="complete.obs")platform_cor_long <-as.data.table(as.table(platform_cor))names(platform_cor_long) <-c("Platform1", "Platform2", "Correlation")ggplot(platform_cor_long, aes(x = Platform1, y = Platform2, fill = Correlation)) +geom_tile(color ="white") +geom_text(aes(label =sprintf("%.2f", Correlation)), size =3) +scale_fill_gradient2(low ="#ef4444", mid ="white", high ="#22c55e", midpoint =0, limits =c(-1, 1)) +labs(title ="Platform Activity Correlation Matrix",subtitle ="Daily posting volume correlation between platforms",x =NULL,y =NULL,fill ="Correlation" ) +theme(axis.text.x =element_text(angle =45, hjust =1),panel.grid =element_blank() )
7.3 Content Origin Analysis
Show code
first_post_by_source <- dta[, .(First_Post_Date =min(DATE),First_Post_Platform = SOURCE_TYPE[which.min(DATE)]), by = FROM]origin_platform <- first_post_by_source[, .(New_Sources = .N), by = First_Post_Platform][order(-New_Sources)]ggplot(origin_platform, aes(x =reorder(First_Post_Platform, New_Sources), y = New_Sources, fill = First_Post_Platform)) +geom_col(width =0.7) +geom_text(aes(label =format(New_Sources, big.mark =",")), hjust =-0.1, size =3.5) +coord_flip() +scale_fill_manual(values = platform_colors) +scale_y_continuous(expand =expansion(mult =c(0, 0.15))) +labs(title ="Platform of Origin for Sources",subtitle ="Where sources first appeared in the corpus",x =NULL,y ="Number of Sources" ) +theme(legend.position ="none")
7.4 Platform Peak Hours Table
Show code
hourly_platform <- dta[!is.na(Hour), .(Posts = .N), by = .(Hour, SOURCE_TYPE)]hourly_platform[, Total :=sum(Posts), by = SOURCE_TYPE]hourly_platform[, Share := Posts / Total *100]peak_hours <- hourly_platform[, .(Peak_Hour = Hour[which.max(Posts)],Peak_Share =max(Share)), by = SOURCE_TYPE][order(Peak_Hour)]peak_hours %>%mutate(Peak_Hour =sprintf("%02d:00", Peak_Hour),Peak_Share =sprintf("%.1f%%", Peak_Share) ) %>%kable(col.names =c("Platform", "Peak Hour", "Share at Peak")) %>%kable_styling(bootstrap_options =c("striped", "hover"), full_width =FALSE)
The liturgical season assignment uses the Computus algorithm to calculate Easter dates. Seasons are assigned as follows:
Advent begins four Sundays before Christmas and runs until December 24. Christmas begins December 25 and extends through Epiphany and the Baptism of the Lord. Lent begins on Ash Wednesday (46 days before Easter) and ends on Holy Thursday. Easter begins on Easter Sunday and extends through Pentecost (50 days). Ordinary Time fills the remaining periods.
10.2 Feast Day Effect Calculation
Feast day effects are calculated by comparing a three day window (day before, feast day, day after) against a yearly baseline excluding the feast window. The effect size represents the percentage difference from baseline daily volume.
10.3 Platform Growth Calculations
Compound Annual Growth Rate (CAGR) is calculated using the standard formula assuming geometric growth between first and last observed years in the corpus.