Show code
latest_bigcaf_followers <- nrow(bigcaf_followers_df)
latest_howbazaar_followers <- nrow(howbazaar_followers_df)
latest_bigcaf_followers[1] 7877
Show code
latest_howbazaar_followers[1] 20942
This project explores follower overlap between two local Gainesville Instagram accounts : @the.how.bazar, a retail store with an established audience, and @bigcaaf, an annual live music event account. I wanted to understand how the two accounts relate to each other, how Bigcaf has grown over time, and whether the 2026 festival translated into measurable audience growth.
What interested me the most was not just how many followers each account had, but how these audiences are connected. If a meaningful number of people follow both accounts, that overlap could point to a shared local scene rather than two separate audiences. This is the first step in understanding a network of followers within a digital ecosystem.
Working with Instagram data required building the dataset from scratch.
The followers data came from JSON exports, which are structured as nested lists rather than clean tables. I had to learn how to import multiple files, combine them, and extract key fields like usernames and timestamps into usable data frames.
One of the biggest challenges was making sure the data was complete. Making sure my file paths were correct and I was grabbing all the followers available from both accounts. I also had to wait till after the 2026 festival to use all the data available for comparison. I had folders that needed to be consolidated and I cleaned up and processed the data frames in “BIGConnection.R” and “HowbazaarConnections.R”.
Once the data was cleaned, I focused on structuring it in a way that allowed for analysis over time to show how both accounts are impacted around each festival. This meant converting timestamps into dates, grouping followers by day, and calculating cumulative growth.
From there, the project shifted from data preparation to analysis — using visualizations to understand not just how much each account was growing, but have insightful touchpoints to highlight key events in the past couple years impacting @bigcaaf account growth.
latest_bigcaf_followers <- nrow(bigcaf_followers_df)
latest_howbazaar_followers <- nrow(howbazaar_followers_df)
latest_bigcaf_followers[1] 7877
latest_howbazaar_followers[1] 20942
After the 2026 Big: Culture & Arts Festival the Instagram account has 7877 followers, while Howbazaar has 20942.
size_snapshot <- data.frame(
account = c("Bigcaf", "Howbazaar"),
followers = c(nrow(bigcaf_followers_df), nrow(howbazaar_followers_df)),
x = c(1, 3),
y = c(1, 1)
)
ring_values <- c(2500, 5000, 7500, 10000, 15000, 20000, 25000)
max_followers <- 25000
max_radius <- 0.85
circle_grid <- data.frame(
account = rep(c("Bigcaf", "Howbazaar"), each = length(ring_values)),
ring = rep(ring_values, times = 2),
x0 = rep(c(1, 3), each = length(ring_values)),
y0 = 1
)
circle_grid$r <- sqrt(circle_grid$ring / max_followers) * max_radius
size_snapshot$r <- sqrt(size_snapshot$followers / max_followers) * max_radius
ggplot() +
geom_circle(
data = circle_grid,
aes(x0 = x0, y0 = y0, r = r),
color = "#555555",
linetype = "dotted",
linewidth = 0.35,
alpha = 0.7
) +
geom_circle(
data = size_snapshot,
aes(x0 = x, y0 = y, r = r, fill = account),
color = "black",
linewidth = 0.6,
alpha = 0.85
) +
geom_text(
data = size_snapshot,
aes(x = x, y = y + 1.08, label = paste0(account, "\n", followers)),
size = 5,
fontface = "bold"
) +
geom_text(
data = circle_grid,
aes(x = x0, y = y0 + r, label = ring),
size = 2.7,
vjust = -0.25,
color = "#333333"
) +
scale_fill_manual(values = c(
"Bigcaf" = "#D71920",
"Howbazaar" = "#FF661F"
)) +
coord_fixed(xlim = c(0, 4), ylim = c(0, 2.25)) +
labs(title = "Instagram Audience Size") +
theme_void() +
theme(
plot.background = element_rect(fill = "tan", color = NA),
panel.background = element_rect(fill = "tan", color = NA),
legend.position = "none",
plot.title = element_text(face = "bold", size = 16, hjust = 0.5)
)This shows a scale difference clear that Howbazaar operates with a much larger audience, while Bigcaf starts from a smaller base.
# find earliest date across both datasets
start_date <- min(
min(bigcaf_followers_df$date, na.rm = TRUE),
min(howbazaar_followers_df$date, na.rm = TRUE)
)
# Bigcaf cumulative (full timeline)
bigcaf_daily_combined <- bigcaf_followers_df %>%
filter(date >= start_date) %>%
count(date) %>%
arrange(date) %>%
mutate(
cumulative = cumsum(n),
account = "Bigcaf"
)
# Howbazaar cumulative (full timeline)
howbazaar_daily_combined <- howbazaar_followers_df %>%
filter(date >= start_date) %>%
count(date) %>%
arrange(date) %>%
mutate(
cumulative = cumsum(n),
account = "Howbazaar"
)
combined_growth <- rbind(bigcaf_daily_combined, howbazaar_daily_combined)
festival_markers <- data.frame(
label = c("2024 Festival", "2025 Festival", "2026 Festival"),
date = as.Date(c("2024-04-13", "2025-04-11", "2026-04-10"))
)
ggplot(combined_growth, aes(x = date, y = cumulative, color = account)) +
geom_line(linewidth = 1.5) +
geom_vline(
data = festival_markers,
aes(xintercept = date),
linetype = "dotted",
color = "#333333",
linewidth = 0.7,
inherit.aes = FALSE
) +
geom_text(
data = festival_markers,
aes(
x = date,
y = max(combined_growth$cumulative) * 0.5,
label = label
),
angle = 90,
vjust = -0.4,
size = 3.3,
inherit.aes = FALSE
) +
scale_color_manual(values = c(
"Bigcaf" = "#D71920",
"Howbazaar" = "#FF661F"
)) +
scale_x_date(
date_breaks = "6 months",
date_labels = "%b %Y",
limits = c(start_date, max(combined_growth$date))
) +
scale_y_continuous(
limits = c(0, 22000),
breaks = seq(0, 22000, by = 2000)
) +
labs(
title = "Howbazaar and Bigcaf Growth throughout the Years",
x = "Date",
y = "Followers",
color = NULL
) +
theme_minimal(base_size = 13) +
theme(
plot.background = element_rect(fill = "tan", color = NA),
panel.background = element_rect(fill = "tan", color = NA),
plot.title = element_text(face = "bold", size = 16),
axis.text.x = element_text(angle = 45, hjust = 1),
axis.title = element_text(face = "bold"),
panel.grid.major.y = element_line(color = "#cfcfcf", linewidth = 0.6),
panel.grid.minor.y = element_line(color = "#eeeeee", linewidth = 0.3),
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank()
)Howbazaar shows earlier and more sustained growth, beginning several years before Bigcaf was created. Its follower count rises steadily from 2020 onward, suggesting an already established audience and a consistent presence.
Bigcaf Instagram account began in 2024, but its growth pattern is more concentrated. Rather than gradual increases, the account grows in noticeable jumps that align closely with annual festival dates. This suggests that Bigcaf’s audience growth is tied more directly to its annual festival event.
The graph also shows that Bigcaf’s strongest increase occurs leading into 2026, when follower growth accelerates more sharply than in previous years. This indicates increasing momentum and can suggest that the account may be gaining recognition beyond its initial audience base.
bigcaf_daily <- bigcaf_followers_df %>%
filter(date >= as.Date("2024-02-01")) %>%
count(date) %>%
arrange(date) %>%
mutate(cumulative = cumsum(n))
festival_markers <- data.frame(
label = c("2024 Festival", "2025 Festival", "2026 Festival"),
date = as.Date(c("2024-04-13", "2025-04-11", "2026-04-10"))
)
ggplot(bigcaf_daily, aes(x = date, y = cumulative)) +
geom_line(color = "#D71920", linewidth = 1.5) +
geom_vline(
data = festival_markers,
aes(xintercept = date),
linetype = "dotted",
color = "#333333",
linewidth = 0.7
) +
geom_text(
data = festival_markers,
aes(
x = date,
y = max(bigcaf_daily$cumulative) * 0.5,
label = label
),
angle = 90,
vjust = -0.4,
size = 3.3,
inherit.aes = FALSE
) +
scale_x_date(
date_breaks = "2 months",
date_labels = "%b %Y",
limits = c(as.Date("2024-02-01"), max(bigcaf_daily$date))
) +
scale_y_continuous(
breaks = seq(0, max(bigcaf_daily$cumulative), by = 500)
) +
labs(
title = "Bigcaf Growth Since 2024",
x = "Date",
y = "Followers"
) +
theme_minimal(base_size = 13) +
theme(
plot.background = element_rect(fill = "tan", color = NA),
panel.background = element_rect(fill = "tan", color = NA),
plot.title = element_text(face = "bold", size = 16),
axis.text.x = element_text(angle = 45, hjust = 1),
axis.title = element_text(face = "bold"),
panel.grid.major.y = element_line(color = "#cfcfcf", linewidth = 0.6),
panel.grid.minor.y = element_line(color = "#eeeeee", linewidth = 0.3),
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank()
)Bigcaf shows that its growth has been strongly tied to annual festival cycles.
Rather than increasing at a steady rate, the account experiences noticeable jumps around each festival date. Growth follows a repeating pattern: a rise leading into the event, followed by a slower period afterward. This suggests that audience attention is concentrated around moments when the festival becomes active and visible.
The 2024 festival appears to mark the account’s initial audience base, establishing its first major group of followers. Growth continues more gradually until the 2025 festival, where another clear increase occurs and the account reaches a larger scale.
The most significant change happens in 2026. Compared with previous years, follower growth accelerates sharply and reaches its highest level by far. The account is gaining momentum over time, with each annual cycle producing stronger results than the last.
Overall, this suggests that Bigcaf functions as an event-driven account whose audience expands in recurring waves, with growth becoming bigger each year.
bigcaf_zoom_2025 <- bigcaf_followers_df %>%
mutate(
follower_type = ifelse(
username %in% howbazaar_followers_df$username,
"Shared",
"Unique"
)
) %>%
filter(date >= as.Date("2025-03-01") & date <= as.Date("2025-05-15")) %>%
count(date, follower_type) %>%
arrange(date) %>%
group_by(follower_type) %>%
mutate(cumulative = cumsum(n))
ggplot(bigcaf_zoom_2025, aes(x = date, y = cumulative, color = follower_type)) +
geom_line(linewidth = 1.5) +
geom_vline(
xintercept = as.Date("2025-04-11"),
linetype = "dashed",
color = "#333333"
) +
annotate(
"text",
x = as.Date("2025-04-11"),
y = 600,
label = "Big: Culture & Arts",
angle = 90,
vjust = -.8
) +
scale_color_manual(values = c(
"Shared" = "#1F5E3B",
"Unique" = "#D71920"
)) +
scale_x_date(date_labels = "%b %d") +
scale_y_continuous(
limits = c(0, 800),
breaks = seq(0, 800, by = 250)
) +
labs(
title = "Festival Growth Spike",
subtitle = "growth surrounding the 2025 Big: Culture & Arts Festival",
x = "Date",
y = "New Followers",
color = NULL
) +
theme_minimal() +
theme(
plot.background = element_rect(fill = "tan", color = NA),
panel.background = element_rect(fill = "tan", color = NA),
plot.title = element_text(face = "bold", size = 16),
panel.grid.major.y = element_line(color = "#cfcfcf"),
panel.grid.major.x = element_blank()
)During this period, shared and unique followers rise together in a relatively balanced way. Shared followers remain ahead, but both groups respond at the same time and continue increasing after the event.
This suggests that the festival functions as a community-driven growth moment. It activates the audience already connected to Bigcaf and Howbazaar, while also attracting new followers beyond that network.
In early February 2026, before the festival took place, FADER published a feature that included Bigcaf. I noticed the post in real time and became curious whether that kind of media attention would produce a measurable change in follower growth for the Bigcaf account.
This graph shows a very different pattern from the 2025 festival period. Instead of shared and unique followers rising together, unique followers increase much faster and eventually overtakes shared followers during the spike.
bigcaf_zoom_2026 <- bigcaf_followers_df %>%
mutate(
follower_type = ifelse(
username %in% howbazaar_followers_df$username,
"Shared",
"Unique"
)
) %>%
filter(date >= as.Date("2026-01-28") & date <= as.Date("2026-02-28")) %>%
count(date, follower_type) %>%
arrange(date) %>%
group_by(follower_type) %>%
mutate(cumulative = cumsum(n))
max_y <- max(bigcaf_zoom_2026$cumulative, na.rm = TRUE)
ggplot(bigcaf_zoom_2026, aes(x = date, y = cumulative, color = follower_type)) +
geom_line(linewidth = 1.5) +
geom_vline(
xintercept = as.Date("2026-02-08"),
linetype = "dashed",
color = "#333333"
) +
annotate(
"text",
x = as.Date("2026-02-08"),
y = max_y * 0.6,
label = "FADER Feature",
angle = 90,
vjust = -0.4
) +
scale_color_manual(values = c(
"Shared" = "#1F5E3B",
"Unique" = "#D71920"
)) +
scale_x_date(date_labels = "%b %d") +
scale_y_continuous(
limits = c(0, max_y + 100),
breaks = seq(0, max_y + 100, by = 200)
) +
labs(
title = "FADER Feature Growth Spike",
subtitle = "Follower surge following media coverage (Feb 8, 2026)",
x = "Date",
y = "New Followers",
color = NULL
) +
theme_minimal() +
theme(
plot.background = element_rect(fill = "tan", color = NA),
panel.background = element_rect(fill = "tan", color = NA),
plot.title = element_text(face = "bold", size = 16),
panel.grid.major.y = element_line(color = "#cfcfcf"),
panel.grid.major.x = element_blank()
)This cross of unique followers is visually significant because it suggests that outside media exposure reaches a different audience than festival promotion alone. While annual events appear to strengthen the existing community, external press seems more effective at introducing Bigcaf to entirely new followers.
Bigcaf seems to grow through two complementary channels: community events that reinforce an existing network, and outside visibility from Instagram media publications that expands it beyond it Howbazaar audience base.
bigcaf_zoom_2026 <- bigcaf_followers_df %>%
mutate(
follower_type = ifelse(
username %in% howbazaar_followers_df$username,
"Shared",
"Unique"
)
) %>%
filter(date >= as.Date("2026-01-15") & date <= as.Date("2026-04-20")) %>%
count(date, follower_type) %>%
arrange(date) %>%
group_by(follower_type) %>%
mutate(cumulative = cumsum(n))
# dynamic max so nothing gets cut off
max_y <- max(bigcaf_zoom_2026$cumulative, na.rm = TRUE)
ggplot(bigcaf_zoom_2026, aes(x = date, y = cumulative, color = follower_type)) +
geom_line(linewidth = 1.5) +
# FADER spike
geom_vline(
xintercept = as.Date("2026-02-08"),
linetype = "dashed",
color = "#333333"
) +
# 2026 Festival
geom_vline(
xintercept = as.Date("2026-04-10"),
linetype = "dashed",
color = "#333333"
) +
# FADER label
annotate(
"text",
x = as.Date("2026-02-08"),
y = max_y * 0.6,
label = "FADER Feature",
angle = 90,
vjust = -0.4
) +
# Festival label
annotate(
"text",
x = as.Date("2026-04-10"),
y = max_y * 0.6,
label = "2026 Festival",
angle = 90,
vjust = -0.4
) +
scale_color_manual(values = c(
"Shared" = "#1F5E3B",
"Unique" = "#D71920"
)) +
scale_x_date(date_labels = "%b %d") +
scale_y_continuous(
limits = c(0, max_y + 200),
breaks = seq(0, max_y + 200, by = 250)
) +
labs(
title = "FADER Feature and 2026 Festival Growth Spike",
subtitle = "Follower growth from media coverage into the 2026 festival",
x = "Date",
y = "New Followers",
color = NULL
) +
theme_minimal() +
theme(
plot.background = element_rect(fill = "tan", color = NA),
panel.background = element_rect(fill = "tan", color = NA),
plot.title = element_text(face = "bold", size = 16),
panel.grid.major.y = element_line(color = "#cfcfcf"),
panel.grid.major.x = element_blank()
)Looking at these events on the same timeline suggests that growth did not happen as two separate spikes. Instead, the momentum created by the FADER feature appears to continue into the festival period, where follower counts rise again and reach their highest point to date.
What stands out most is that unique followers remain a major driver of this increase. This suggests that the outside attention generated by the FADER feature did more than create a short-term bump. It likely introduced Bigcaf to new audiences who remained engaged through the festival itself.
At the same time, shared followers also continue to grow, showing that the existing community was still responding during this period. In that sense, the strongest growth seems to occur when both audiences move together: new people discovering the account, while the local network remains active and engaged.
Taken together, this project suggests that Bigcaf grows through two connected forces. Annual festivals strengthen and reactivate an existing community. The outside media exposure expands it reach beyond its exisitng community.
From a practical standpoint, this has clear implications for future promotion. Continuing to build visibility through press coverage, collaborations, and external features could help bring in new audiences before the next festival cycle begins. Then, once the festival season begins the festival itself becomes the moment that converts that interest into deeper and more sustained engagement.