squirrel_census = 
  read_csv("data/clean_squirrel_2018.csv")

Squirrels are dynamic creatures with a secret language. In a bustling environment like New York City, these animals use unique signals to communicate with each other and us.



Squirrel-to-squirrel

Let’s take a look at the sounds squirrels use to communicate.

sounds_summary = data.frame(
  Sound = c("Kuks", "Quaas", "Moans"),
  Count = c(sum(squirrel_census[["kuks"]], na.rm = TRUE), 
            sum(squirrel_census[["quaas"]], na.rm = TRUE), 
            sum(squirrel_census[["moans"]], na.rm = TRUE))
)

plot_ly(data = sounds_summary, x = ~Sound, y = ~Count, color = ~Sound, type = 'bar', colors = RColorBrewer::brewer.pal(3, "Accent")) |>
  layout(
         xaxis = list(title = 'Sound Type'),
         yaxis = list(title = 'Number of Squirrels'))

Of the three identified squirrel sounds, NYC squirrels most commonly kuk is the most common sound, and moans are rarely heard. To better understand the meaning of these sounds, let’s take a look at the type of activity or interactions the squirrels who made these sounds are engaged in.

Squirrel-to-human

Next, let’s look at what sounds squirrels make when interacting with humans.

# Summarizing sounds by interaction types
interaction_sounds <- squirrel_census |>
  group_by(approaches, indifferent, runs_from) |>
  summarise(Kuks = sum(kuks, na.rm = TRUE),
            Quaas = sum(quaas, na.rm = TRUE),
            Moans = sum(moans, na.rm = TRUE)) |>
  pivot_longer(cols = c(Kuks, Quaas, Moans), names_to = "Sound", values_to = "Count")

# Creating a new column for interaction type
interaction_sounds[["interaction_type"]] <- case_when(
  interaction_sounds[["approaches"]] == TRUE ~ "Approaches",
  interaction_sounds[["indifferent"]] == TRUE ~ "Indifferent",
  interaction_sounds[["runs_from"]] == TRUE ~ "Runs From",
  TRUE ~ "Other"
)

# Creating sounds by human interaction plot
plot_ly(interaction_sounds, x = ~Sound, y = ~Count, color = ~interaction_type, type = 'bar', colors = RColorBrewer::brewer.pal(3, "Accent")) |>
  layout(title = 'Distribution of Squirrel Sounds by Human Interaction',
         xaxis = list(title = 'Sound Type'),
         yaxis = list(title = 'Number of Squirrels'))



As this plot (right) shows, squirrels who kukare frequently indifferent, run from, or exhibit other behavior when interacting with humans. Squirrels who quaa also are indifferent or exhibit other behavior when approached by a human, and run from humans less frequently.



There is only one instance of a moan, and this squirrel ran from a human. While this is an interesting data point, there is not enough information to associate a moan with fear or distress. Without more data and a better understanding of what other behavior is, we cannot accurately determine what these squirrel sounds mean.

Singing while working

Now, let’s look at the sounds squirrels make by the activity they were doing.



Squirrels who kuk and quaa were very frequently seen chasing. In general, squirrels who kuk engaged in all activity types. Similarly, squirrels who quaa also participated in all activities, but with less frequency. This is in line with our sounds distribution, as quaa is a rarer sound when compared to kuks.



Additionally, we see that squirrels who moan were only seen climbing or foraging. Overall, this distribution gives us hints about the frequency of squirrel sounds and their potential correspondence with different types of activity. However, we do not have enough information to draw conclusions about sound meanings and activity types.

# Reshaping data into a long format
long_data = squirrel_census |>
  pivot_longer(cols = c(kuks, quaas, moans), names_to = "Sound", values_to = "Sound_Value") |>
  pivot_longer(cols = c(running, chasing, climbing, eating, foraging), names_to = "Activity", values_to = "Activity_Value") |>
  filter(Activity_Value == TRUE, Sound_Value == TRUE) |>
  count(Activity, Sound) |> 
  rename(`Squirrels` = n)

# Creating a list to store plotly objects
plots_list = list()

# Looping through each activity to create individual plots
for(activity in unique(long_data[["Activity"]])) {
  activity_data = long_data[long_data[["Activity"]] == activity, ]
  p = plot_ly(activity_data, x = ~Sound, y = ~`Squirrels`, type = 'bar', name = activity) |>
    layout(title = paste('Squirrel Sounds by Activity Type'))
  plots_list[[activity]] = p
}

# Arranging the plots in a grid layout
subplot(plots_list, nrows = length(plots_list), shareX = TRUE, shareY = TRUE) 

Does age have to do with being noisy?

Finally, lets crown the noisiest squirrels.

# Grouping sounds by age
sound_summary = squirrel_census |>
  filter(age != "?") |> 
  group_by(age) |>
  summarise(
    Kuks = sum(kuks, na.rm = TRUE),
    Quaas = sum(quaas, na.rm = TRUE),
    Moans = sum(moans, na.rm = TRUE)
  ) |>
  pivot_longer(cols = c(Kuks, Quaas, Moans), names_to = "Sound", values_to = "Count") |> 
  mutate(
    perc_vocals = (Count/ sum(Count))*100
  )

# Creating a bubble plot showing sound by squirrel age
plot_ly(data = sound_summary, x = ~age, y = ~perc_vocals, size = ~Count, type = 'scatter', mode = 'markers', 
        marker = list(sizemode = 'diameter', opacity = 0.5), color = ~Sound, 
        hoverinfo = 'text', text = ~paste(Sound, ': ', Count)) |>
  layout(title = 'Squirrel Sounds by Age',
         xaxis = list(title = 'Age'),
         yaxis = list(title = 'Percent of Sound Type')) 



Our plot shows us that adults were the most frequently identified squirrel in our sample. For both adults and juveniles, kuks were the most common sound. However, adults kuked far more than their juvenile counterparts. Again, there is not enough data to conclude that adults are noisier than their juvenile counterparts, but for our purposes, we are crowning kukking adult squirrels as the chattiest in New York City!