Meetup Data

dir.create(file.path(params$output_folder))
dir.create(file.path(params$archive_folder))

get_meetups <- function (url, query) {
  req <- GET(url, query=query)
  print(paste(req$url))
  json <- content(req, as = "text")
  things <- fromJSON(json, flatten=TRUE)
  return(things)
}

R-Ladies Meetup Groups

get_rladies_groups <- function (folder) {
  
  groups_url <- "https://api.meetup.com/find/groups"

  groups_query_params <- list(
    key=params$meetup_api_key, 
    sign=TRUE,
    page=200,
    radius="global")
  
  # by topic
  meetup_groups_topic <- get_meetups(groups_url, append(groups_query_params, c(topic_id=1513883, order="members")))
  
  # by text + category
  meetup_groups_text <- get_meetups(groups_url, append(groups_query_params, c(text="r-ladies", category=34)))
  
  meetup_groups_aggr <- bind_rows(meetup_groups_topic, meetup_groups_text %>% anti_join(meetup_groups_topic, by="id"))
  meetup_groups <- meetup_groups_aggr %>% filter(str_detect(name, "[Rr]([ -]?)[Ll]adies"))
  
  meetup_groups <- meetup_groups %>%
    mutate(events_url = paste("https://api.meetup.com/", urlname, "/events", sep="")) %>%
    select(-meta_category.category_ids) # remove lists
  
  write_csv(meetup_groups, paste(folder, "rladies_meetup_groups.csv", sep="/"), 
            na = "")
  write_csv(meetup_groups_topic %>% select(-meta_category.category_ids), 
            paste(folder, "rladies_meetup_groups_topic.csv", sep="/"), 
            na = "")
  write_csv(meetup_groups_text %>% select(-meta_category.category_ids), 
            paste(folder, "rladies_meetup_groups_text.csv", sep="/"), 
            na = "")
  return(meetup_groups)
}

R-Ladies Meetup Events

Filter out groups with no next event.

meetup_groups <- read_csv(paste(params$output_folder, "rladies_meetup_groups.csv", sep="/"))

get_rladies_groups_no_upcoming <- function(folder, groups){
  meetup_groups_no_upcoming <- meetup_groups %>% filter(is.na(next_event.id))
  write_csv(meetup_groups_no_upcoming, 
            paste(folder, "rladies_meetup_groups_no_upcoming.csv", sep="/"), 
            na = "")
  return(meetup_groups_no_upcoming)
}

For groups that don’t have a next event, get the last event they had.

# This gets throttled, can't use function

#get_rladies_recent_past_events <- function (folder, meetup_groups) {
meetup_groups_no_upcoming <- no_upcoming
folder <- params$archive_folder

  recent_past_events_query_params <- list(
    key=params$meetup_api_key, 
    sign=TRUE,
    status="past",
    scroll="recent_past"
  )
  
  dir.create(file.path(paste(folder, "rladies_meetup_events_recent_past", sep="/")))
  
  meetup_events_past <- data_frame()

  for (n in 1:nrow(meetup_groups_no_upcoming)) {
    events_url <- meetup_groups_no_upcoming[n,]["events_url"]
    print(paste("Trying url:", events_url$events_url))
    meetups <- get_meetups(events_url$events_url, recent_past_events_query_params)
    if(length(meetups)== 0) {
      next()
    }
  
    meetups <- meetups %>% mutate(photo_album.photo_sample=NA)
    meetup_events_past <- bind_rows(meetup_events_past, meetups)
    write_csv(meetup_events_past, paste0(folder, "/rladies_meetup_events_recent_past/_meetup_events_recent_past_", n, ".csv"),
              na = "")
  }
  
  write_csv(meetup_events_past, paste(folder,"rladies_meetup_events_recent_past.csv", sep="/"), 
            na = "")
  #return(meetup_events_past)
#}

Get Latest

Create a new archive folder and get the latest data.

# Run this first when updating archives
dir.create(file.path(params$archive_folder))

meetup_groups <- get_rladies_groups(params$archive_folder)
groups_no_upcoming <- get_rladies_groups_no_upcoming(params$archive_folder, meetup_groups)

# TODO add try/catch for throttling - or just pull past events since last pull and merge with last pull
# past_events <- get_rladies_past_events(params$archive_folder, groups_no_upcoming)
# Run ^^ manually in above code block for now then run code block below to copy archive folder to output
system2("rm", args = c("-r", params$output_folder))
system2("cp", args = c("-R", paste(params$archive_folder), paste(params$output_folder)))

Meetup Group Analysis

Meetup Groups with No First Event

Groups that haven’t yet had a first event. Organizers should be contacted to see how we can help them.

no_upcoming <- read_csv(paste(params$output_folder, "rladies_meetup_groups_no_upcoming.csv", sep="/"))
past_events <- read_csv(paste(params$output_folder, "rladies_meetup_events_recent_past.csv", sep="/"))

no_first_event <- no_upcoming %>% 
  anti_join(past_events %>% select(group.id), by=c("id"="group.id"))

no_first_event <- no_first_event %>%
  mutate(created=as.POSIXct(created/1000, tz="UTC", origin="1970-01-01"),
         meetup_age=difftime(Sys.Date(), created, unit="days"),
         chapter=str_replace(name, "R[ -]?[Ll]adies( )?(- )?", "")) %>%
  separate(timezone, c("region"), extra="drop", fill="left")
ggplot(no_first_event, aes(x=reorder(chapter, meetup_age), y=meetup_age)) +
  geom_bar(aes(fill=region), stat="identity") +
  theme_few() +
  coord_flip() +
  labs(x="Chapter", y="Age (Days)", title="Meetup Groups with no First Event")

Meetup Groups with Event Lag

Groups that haven’t had an event in awhile. Organizers should be contacted to see how we can help them.

no_upcoming <- read_csv(paste(params$output_folder, "rladies_meetup_groups.csv", sep="/"))
past_events <- read_csv(paste(params$output_folder, "rladies_meetup_events_recent_past.csv", sep="/"))

latest_events <- past_events %>% 
  filter(status=="past") %>%
  rename(event.id = id, event.time = time) %>%
  group_by(group.name) %>%
  top_n(1, event.time)

groups_lagged <- no_upcoming %>%
    inner_join(latest_events %>% 
                 select(group.id, event.id, event.time), 
               by=c("id"="group.id"))

groups_lagged <- groups_lagged %>%
  rename(last_event=event.time) %>%
  mutate(created=as.POSIXct(created/1000, tz="UTC", origin="1970-01-01"),
         meetup_age=difftime(Sys.Date(), created, unit="days"),
         chapter=str_replace(name, "R[ -]?[Ll]adies( )?(- )?", ""),
         last_event=as.POSIXct(last_event/1000, tz="UTC", origin="1970-01-01"),
         last_event_days=difftime(Sys.Date(), last_event, unit="days")
         ) %>%
  separate(timezone, c("region"), extra="drop", fill="left")

# Special case chapter names
groups_lagged <- groups_lagged %>% 
  mutate(chapter=ifelse(chapter=="Spotkania Entuzjastów R-Warsaw RUG Meetup & Warsaw", "Warsaw", chapter))

groups_lagged %>% select(chapter, last_event_days, last_event) %>% arrange(-last_event_days)
## # A tibble: 60 x 3
##          chapter last_event_days          last_event
##            <chr>          <time>              <dttm>
##  1         İzmiR  333.50000 days 2017-02-22 12:00:00
##  2   Connecticut  331.04167 days 2017-02-24 23:00:00
##  3    Santa Rosa  212.97917 days 2017-06-23 00:30:00
##  4      Adelaide  150.66667 days 2017-08-24 08:00:00
##  5    Montenegro  149.29167 days 2017-08-25 17:00:00
##  6       Buffalo  148.43750 days 2017-08-26 13:30:00
##  7         Miami  130.04167 days 2017-09-13 23:00:00
##  8 San Francisco  119.12500 days 2017-09-24 21:00:00
##  9        Munich  109.29167 days 2017-10-04 17:00:00
## 10   Los Angeles   95.95833 days 2017-10-18 01:00:00
## # ... with 50 more rows
ggplot(groups_lagged, aes(x=reorder(chapter, last_event_days), y=last_event_days)) +
  geom_bar(aes(fill=region), stat="identity") +
  theme_few() +
  coord_flip() +
  labs(x="Chapter", y="Last Event (Days)", title="Meetup Groups with no Next Event")

ggplot(groups_lagged %>% filter(last_event_days > 60), aes(x=reorder(chapter, last_event_days), y=last_event_days)) +
  geom_bar(aes(fill=region), stat="identity") +
  theme_few() +
  coord_flip() +
  labs(x="Chapter", y="Last Event (Days)", title="Meetup Groups with no Next Event (> 60 days since last event)")

Meetup Groups Not Using R-Ladies Topic

Groups that aren’t showing up the R-Ladies Topic search. Organizers should add the R-Ladies topic to their group description.

meetup_groups_topic <- read_csv(paste(params$output_folder, "rladies_meetup_groups_topic.csv", sep="/"))
meetup_groups_text <- read_csv(paste(params$output_folder, "rladies_meetup_groups_text.csv", sep="/"))

# group + organizer to contact
meetups_missing_topic <- meetup_groups_text %>% anti_join(meetup_groups_topic, by="id")

# Special case chapter names
meetups_missing_topic <- meetups_missing_topic %>% 
  mutate(name=ifelse(name=="Spotkania Entuzjastów R-Warsaw RUG Meetup & R-Ladies Warsaw", "R-Ladies Warsaw", name))

meetups_missing_topic %>% filter(str_detect(name, "[Rr]([ -]?)[Ll]adies")) %>%
  arrange(-members) %>% 
  select(name, localized_location, organizer.name, members, created)
## # A tibble: 14 x 5
##                       name     localized_location         organizer.name
##                      <chr>                  <chr>                  <chr>
##  1         R-Ladies Warsaw         Warsaw, Poland      Przemyslaw Biecek
##  2         R-Ladies Taipei         Taipei, Taiwan            Ju-Yin Tang
##  3       R-Ladies Budapest      Budapest, Hungary          Ágnes Salánki
##  4         R-Ladies Lisboa       Lisbon, Portugal         Carolina Frias
##  5          R-Ladies İzmiR          Izmir, Turkey                 Göknur
##  6             RLadiesCDMX    México City, Mexico               R Ladies
##  7 R-Ladies Rio de Janeiro Rio de Janeiro, Brazil         Carolina Frias
##  8  R Ladies - Twin Cities        Minneapolis, MN                  PyRus
##  9       R-Ladies Adelaide    Adelaide, Australia            Maria Dmtrv
## 10      R-Ladies St. Louis        Saint Louis, MO             RLadiesSTL
## 11    R-Ladies Connecticut           Hartford, CT  Mine Cetinkaya-Rundel
## 12         R-Ladies Bogotá       Bogotá, Colombia          Verónica Toro
## 13        R-Ladies Buffalo            Buffalo, NY          Lori Shepherd
## 14      R-Ladies Americana      Americana, Brazil Mariana Ribeiro Mendes
## # ... with 2 more variables: members <int>, created <dbl>