From 4bbf8faaa2f7af2e90ad7b83b6078e0670da3338 Mon Sep 17 00:00:00 2001 From: Chris Salvato Date: Wed, 1 Jun 2016 14:55:59 -0400 Subject: [PATCH 1/8] Create hacky solution to generate general GDN reports --- PowerSupplyUtilities/NAMESPACE | 1 + .../R/create_google_display_event_log.r | 94 +++++++++++++++++++ .../R/search_engine_marketing_report.r | 32 +++++++ .../man/create_google_display_event_log.Rd | 23 +++++ 4 files changed, 150 insertions(+) create mode 100644 PowerSupplyUtilities/R/create_google_display_event_log.r create mode 100644 PowerSupplyUtilities/man/create_google_display_event_log.Rd diff --git a/PowerSupplyUtilities/NAMESPACE b/PowerSupplyUtilities/NAMESPACE index 1e39ac7..8fc1127 100644 --- a/PowerSupplyUtilities/NAMESPACE +++ b/PowerSupplyUtilities/NAMESPACE @@ -3,6 +3,7 @@ export(clean_transactions_data) export(create_adwords_event_log) export(create_bing_event_log) +export(create_google_display_event_log) export(customers_per_month_report) export(get_first_transaction_dates_for_users) export(get_referrals_data) diff --git a/PowerSupplyUtilities/R/create_google_display_event_log.r b/PowerSupplyUtilities/R/create_google_display_event_log.r new file mode 100644 index 0000000..5bef50d --- /dev/null +++ b/PowerSupplyUtilities/R/create_google_display_event_log.r @@ -0,0 +1,94 @@ +#' Create Google Display Event Log (elog) for AdWords +#' +#' +#' @param from Start date in either format <"yyyy-mm-dd"> or . Inclusive. +#' @param to End date in either format <"yyyy-mm-dd"> or . Inclusive. +#' @return A data frame with all events (AdWords clicks, Transactions and Referrals). +#' @export +#' @examples +#' create_google_display_event_log(from=20150101, to=20151231) + +create_google_display_event_log <- function(from=Sys.Date(), + to=Sys.Date()){ + require(AdWordsUtilities) + require(PowerSupplyUtilities) + require(SalvatoUtilities) + + ppc_events <- all_ppc_raw_completed_order_events( from = from, to = to ) + mixpanel_adwords_conversions <- ppc_events[["adwords"]] + mixpanel_adwords_conversions <- clean_completed_order_events(mixpanel_adwords_conversions) + + ##### Retrieve AdWords Spend/Click Data + adwords_campaigns_data <- AdWordsUtilities::campaign_performance_data(from=as.Date(from), to=as.Date(to)) + + # Retrieve revenue data + db_transactions <- get_transactions_data(from=from, to=to) + #db_influencer_metrics <- get_referrals_data(from=from, to=to) + db_first_transactions <- get_first_transaction_dates_for_users(from=from, to=to, users=db_transactions$app_user_id) + + # Join Mixpanel Conversion Data with transaction data + unique_users <- distinct(mixpanel_adwords_conversions, app_user_id) + db_transactions <- db_transactions %>% inner_join(unique_users, by="app_user_id") + + #Filter out people where their first order was not in the specified start date and end date + db_transactions <- db_transactions %>% filter(is.element(app_user_id, db_first_transactions$id)) + + db_transactions <- clean_transactions_data(db_transactions) + + # Add campaign names to db_transactions log + db_transactions <- campaign_lookup_table(from=from, to=to) %>% + right_join(db_transactions, by=c(campaign_id = "campaign_id")) + + + ###################################### CREATE ELOGS ################################################ + # Create keywords elog + keywords_elog <- rbind.fill(db_transactions, adwords_campaigns_data) + keywords_elog$week <- as.week(keywords_elog$date) + keywords_elog <- keywords_elog %>% arrange(week) + + # TODO: Implement referral metrics for GDN analysis. + # Create join table for user_id and the keyword and campaign_name of first purchase + # user_first_acquisition_metrics <- keywords_elog %>% + # filter(!is.na(user_id)) %>% #Remove NA user_ids (which means they are not monetary transactions) + # group_by(user_id) %>% + # summarize(keyword = first(keyword), + # campaign_name=first(campaign_name), + # campaign_id=first(campaign_id), + # device=first(device), + # match_type=first(match_type)) + + #Add influencer metrics to the event log + #db_influencer_metrics <- get_referrals_data(from=from, to=to) + #influencer_metrics_with_user_data <- db_influencer_metrics %>% + #rename(week=week_start, + # user_id=influencer_id) %>% + #mutate(week = as.Date(week, format = '%Y-%m-%d')) %>% + #inner_join(user_first_acquisition_metrics, by=c(user_id="user_id")) %>% + #filter(week >= from, week <= to) + #keywords_elog <- rbind.fill(keywords_elog, influencer_metrics_with_user_data) + + keywords_elog <- keywords_elog %>% + select( -transaction_date, + -event, + -time, + -distinct_id, + -X.created, + -X.email, + -X.first_name, + -X.last_name, + -X.lib_version, + -X.name, + -currency, + -discount, + -mp_country_code, + -mp_lib, + -products, + -tax, + -total, + -lastOrderedFrom, + -utm_content, + -mp_keyword, + -traits) + + return(keywords_elog) +} \ No newline at end of file diff --git a/PowerSupplyUtilities/R/search_engine_marketing_report.r b/PowerSupplyUtilities/R/search_engine_marketing_report.r index 34c891e..dc563d8 100644 --- a/PowerSupplyUtilities/R/search_engine_marketing_report.r +++ b/PowerSupplyUtilities/R/search_engine_marketing_report.r @@ -53,4 +53,36 @@ search_engine_marketing_report <- function(adwords_keywords_elog){ mutate(total_acquisitions=num_acquisitions.adwords+num_acquisitions.bing) write.excel.csv(total_customers_per_month_report) + #Hacky Solution to get GDN Performance Graphs + gdn_elog <- AdWordsUtilities::create_google_display_event_log(from, to) + gdn_elog <- gdn_elog %>% + filter(grepl("Rmktg",campaign_name)) %>% + mutate(quality_score=NA, + new_referred_users=NA, + referred_users_transaction_amount=NA) + + AdWordsUtilities::overall_performance_over_time(gdn_elog) + + devices_over_time <- gdn_elog %>% + group_by(device,week) %>% + summarize(cost = sum(cost, na.rm = TRUE), + contribution = sum(money_in_the_bank_paid_to_us,na.rm=TRUE) *.25) %>% + mutate(cum_contribution = cumsum(contribution), + cum_cost = cumsum(cost), + cum_ROI = cum_contribution - cum_cost) %>% + gather(type,value,cum_cost,cum_contribution,cum_ROI) + + plot(ggplot(devices_over_time %>% + filter(device == "mb"), + aes(week,value,group=type,col=type,fill=type)) + + geom_line() + + ggtitle("GDN Trends on Mobile")) + + plot(ggplot(devices_over_time %>% + filter(device == "dt"), + aes(week,value,group=type,col=type,fill=type)) + + geom_line() + + ggtitle("GDN Trends on Desktop")) + + } \ No newline at end of file diff --git a/PowerSupplyUtilities/man/create_google_display_event_log.Rd b/PowerSupplyUtilities/man/create_google_display_event_log.Rd new file mode 100644 index 0000000..750459d --- /dev/null +++ b/PowerSupplyUtilities/man/create_google_display_event_log.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/create_google_display_event_log.r +\name{create_google_display_event_log} +\alias{create_google_display_event_log} +\title{Create Google Display Event Log (elog) for AdWords} +\usage{ +create_google_display_event_log(from = Sys.Date(), to = Sys.Date()) +} +\arguments{ +\item{from}{Start date in either format <"yyyy-mm-dd"> or . Inclusive.} + +\item{to}{End date in either format <"yyyy-mm-dd"> or . Inclusive.} +} +\value{ +A data frame with all events (AdWords clicks, Transactions and Referrals). +} +\description{ +Create Google Display Event Log (elog) for AdWords +} +\examples{ +create_google_display_event_log(from=20150101, to=20151231) +} + From d2ff547fbfa9ab221da32bcf09f626296447d9d6 Mon Sep 17 00:00:00 2001 From: Chris Salvato Date: Mon, 6 Jun 2016 21:18:52 -0400 Subject: [PATCH 2/8] Create functions to calculate desktop and mobile performance of GDN data over time. --- AdWordsUtilities/NAMESPACE | 2 + .../R/desktop_gdn_performance_over_time.r | 42 +++++++++++++++++++ .../R/mobile_gdn_performance_over_time.r | 42 +++++++++++++++++++ .../man/desktop_gdn_performance_over_time.Rd | 26 ++++++++++++ .../man/mobile_gdn_performance_over_time.Rd | 26 ++++++++++++ 5 files changed, 138 insertions(+) create mode 100644 AdWordsUtilities/R/desktop_gdn_performance_over_time.r create mode 100644 AdWordsUtilities/R/mobile_gdn_performance_over_time.r create mode 100644 AdWordsUtilities/man/desktop_gdn_performance_over_time.Rd create mode 100644 AdWordsUtilities/man/mobile_gdn_performance_over_time.Rd diff --git a/AdWordsUtilities/NAMESPACE b/AdWordsUtilities/NAMESPACE index 6f0bd79..cfad257 100644 --- a/AdWordsUtilities/NAMESPACE +++ b/AdWordsUtilities/NAMESPACE @@ -9,6 +9,7 @@ export(clean_raw_campaign_data) export(clean_raw_keyword_data) export(click_through_rate_over_time) export(contribution_per_click_report) +export(desktop_gdn_performance_over_time) export(desktop_performance_over_time) export(impression_share_over_time) export(keyword_performance_data) @@ -17,6 +18,7 @@ export(keywords_campaign_performance_over_time) export(keywords_performance_over_time) export(keywords_report) export(keywords_with_earnings) +export(mobile_gdn_performance_over_time) export(mobile_performance_over_time) export(overall_performance_over_time) export(raw_campaign_performance_data) diff --git a/AdWordsUtilities/R/desktop_gdn_performance_over_time.r b/AdWordsUtilities/R/desktop_gdn_performance_over_time.r new file mode 100644 index 0000000..54dd42d --- /dev/null +++ b/AdWordsUtilities/R/desktop_gdn_performance_over_time.r @@ -0,0 +1,42 @@ +#' Create plot of Google Display Network mobile performance over time +#' +#' Takes in a AdWords event log and processes performance on desktop devices over time. +#' +#' @param gdn_elog A data frame containing keywords and transaction event log data. +#' @param campaign_filter Optional. (e.g. "Paleo Performers") If provided, generates a data frame and plot for campaigns where the string is included in the campaign name. Default to NULL. +#' @param plot logical. If TRUE, creates a plot of the data. If false, creates no plot, Defaults to \code{TRUE}. +#' @return The data frame used to create a plot of mobile performance over time. +#' @export +#' @examples +#' overall_performance_over_time(elog_data_frame) + +desktop_gdn_performance_over_time <- function( gdn_elog, + campaign_filter=NULL, + plot = TRUE){ + require(plyr) + require(dplyr) + require(SalvatoUtilities) + if( !is.null(campaign_filter) ) { + gdn_elog <- gdn_elog %>% filter(grepl(campaign_filter,campaign_name)) + } + devices_over_time <- gdn_elog %>% + group_by(device,week) %>% + summarize(cost = sum(cost, na.rm = TRUE), + contribution = sum(money_in_the_bank_paid_to_us,na.rm=TRUE) *.25) %>% + mutate(cum_contribution = cumsum(contribution), + cum_cost = cumsum(cost), + cum_ROI = cum_contribution - cum_cost) %>% + gather(type,value,cum_cost,cum_contribution,cum_ROI) + + if( plot ) { + require(ggplot2) + plot(ggplot(devices_over_time %>% + filter(device == "dt"), + aes(week,value,group=type,col=type,fill=type)) + + geom_line() + + ggtitle("GDN Trends on Desktop")) + } + + return(devices_over_time) + +} \ No newline at end of file diff --git a/AdWordsUtilities/R/mobile_gdn_performance_over_time.r b/AdWordsUtilities/R/mobile_gdn_performance_over_time.r new file mode 100644 index 0000000..3731ae3 --- /dev/null +++ b/AdWordsUtilities/R/mobile_gdn_performance_over_time.r @@ -0,0 +1,42 @@ +#' Create plot of Google Display Network mobile performance over time +#' +#' Takes in a AdWords event log and processes performance on mobile devices over time. +#' +#' @param gdn_elog A data frame containing keywords and transaction event log data. +#' @param campaign_filter Optional. (e.g. "Paleo Performers") If provided, generates a data frame and plot for campaigns where the string is included in the campaign name. Default to NULL. +#' @param plot logical. If TRUE, creates a plot of the data. If false, creates no plot, Defaults to \code{TRUE}. +#' @return The data frame used to create a plot of mobile performance over time. +#' @export +#' @examples +#' overall_performance_over_time(elog_data_frame) + +mobile_gdn_performance_over_time <- function( gdn_elog, + campaign_filter=NULL, + plot = TRUE){ + require(plyr) + require(dplyr) + require(SalvatoUtilities) + if( !is.null(campaign_filter) ) { + gdn_elog <- gdn_elog %>% filter(grepl(campaign_filter,campaign_name)) + } + devices_over_time <- gdn_elog %>% + group_by(device,week) %>% + summarize(cost = sum(cost, na.rm = TRUE), + contribution = sum(money_in_the_bank_paid_to_us,na.rm=TRUE) *.25) %>% + mutate(cum_contribution = cumsum(contribution), + cum_cost = cumsum(cost), + cum_ROI = cum_contribution - cum_cost) %>% + gather(type,value,cum_cost,cum_contribution,cum_ROI) + + if( plot ) { + require(ggplot2) + plot(ggplot(devices_over_time %>% + filter(device == "mb"), + aes(week,value,group=type,col=type,fill=type)) + + geom_line() + + ggtitle("GDN Trends on Mobile")) + } + + return(devices_over_time) + +} \ No newline at end of file diff --git a/AdWordsUtilities/man/desktop_gdn_performance_over_time.Rd b/AdWordsUtilities/man/desktop_gdn_performance_over_time.Rd new file mode 100644 index 0000000..820a503 --- /dev/null +++ b/AdWordsUtilities/man/desktop_gdn_performance_over_time.Rd @@ -0,0 +1,26 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/desktop_gdn_performance_over_time.r +\name{desktop_gdn_performance_over_time} +\alias{desktop_gdn_performance_over_time} +\title{Create plot of Google Display Network mobile performance over time} +\usage{ +desktop_gdn_performance_over_time(gdn_elog, campaign_filter = NULL, + plot = TRUE) +} +\arguments{ +\item{gdn_elog}{A data frame containing keywords and transaction event log data.} + +\item{campaign_filter}{Optional. (e.g. "Paleo Performers") If provided, generates a data frame and plot for campaigns where the string is included in the campaign name. Default to NULL.} + +\item{plot}{logical. If TRUE, creates a plot of the data. If false, creates no plot, Defaults to \code{TRUE}.} +} +\value{ +The data frame used to create a plot of mobile performance over time. +} +\description{ +Takes in a AdWords event log and processes performance on desktop devices over time. +} +\examples{ +overall_performance_over_time(elog_data_frame) +} + diff --git a/AdWordsUtilities/man/mobile_gdn_performance_over_time.Rd b/AdWordsUtilities/man/mobile_gdn_performance_over_time.Rd new file mode 100644 index 0000000..e3928b7 --- /dev/null +++ b/AdWordsUtilities/man/mobile_gdn_performance_over_time.Rd @@ -0,0 +1,26 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mobile_gdn_performance_over_time.r +\name{mobile_gdn_performance_over_time} +\alias{mobile_gdn_performance_over_time} +\title{Create plot of Google Display Network mobile performance over time} +\usage{ +mobile_gdn_performance_over_time(gdn_elog, campaign_filter = NULL, + plot = TRUE) +} +\arguments{ +\item{gdn_elog}{A data frame containing keywords and transaction event log data.} + +\item{campaign_filter}{Optional. (e.g. "Paleo Performers") If provided, generates a data frame and plot for campaigns where the string is included in the campaign name. Default to NULL.} + +\item{plot}{logical. If TRUE, creates a plot of the data. If false, creates no plot, Defaults to \code{TRUE}.} +} +\value{ +The data frame used to create a plot of mobile performance over time. +} +\description{ +Takes in a AdWords event log and processes performance on mobile devices over time. +} +\examples{ +overall_performance_over_time(elog_data_frame) +} + From 90b8f0b2a1bfdd5040a067e012dd2a69d069b80b Mon Sep 17 00:00:00 2001 From: Chris Salvato Date: Mon, 6 Jun 2016 21:22:01 -0400 Subject: [PATCH 3/8] Change contribution per click report to include match_type. --- AdWordsUtilities/R/contribution_per_click_report.r | 6 +++--- BingUtilities/R/contribution_per_click_report.r | 6 +++--- .../R/search_engine_marketing_report.r | 10 +++------- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/AdWordsUtilities/R/contribution_per_click_report.r b/AdWordsUtilities/R/contribution_per_click_report.r index f15c06e..b253702 100644 --- a/AdWordsUtilities/R/contribution_per_click_report.r +++ b/AdWordsUtilities/R/contribution_per_click_report.r @@ -29,10 +29,10 @@ contribution_per_click_report <- function(keywords_elog, } data <- keywords_elog %>% - group_by(keyword,campaign_name) %>% + group_by(campaign_name,keyword,match_type) %>% AdWordsUtilities::summarize_elog() %>% - filter(cost > 0 & earnings > 0) %>% - group_by(keyword,campaign_name) %>% + filter(cost > 0 & earnings > 0) %>% + group_by(campaign_name,keyword,match_type) %>% summarize(total_cost = sum(cost), total_contribution = sum(contribution), total_clicks = sum(clicks), diff --git a/BingUtilities/R/contribution_per_click_report.r b/BingUtilities/R/contribution_per_click_report.r index b54dfff..a5edc3b 100644 --- a/BingUtilities/R/contribution_per_click_report.r +++ b/BingUtilities/R/contribution_per_click_report.r @@ -29,10 +29,10 @@ contribution_per_click_report <- function(keywords_elog, } data <- keywords_elog %>% - group_by(keyword,campaign_name) %>% + group_by(keyword,match_type,campaign_name) %>% BingUtilities::summarize_elog() %>% - filter(cost > 0 & earnings > 0) %>% - group_by(keyword,campaign_name) %>% + filter(cost > 0 & earnings > 0) %>% + group_by(keyword,match_type,campaign_name) %>% summarize(total_cost = sum(cost), total_contribution = sum(contribution), total_clicks = sum(clicks), diff --git a/PowerSupplyUtilities/R/search_engine_marketing_report.r b/PowerSupplyUtilities/R/search_engine_marketing_report.r index 9b59b74..8ed5708 100644 --- a/PowerSupplyUtilities/R/search_engine_marketing_report.r +++ b/PowerSupplyUtilities/R/search_engine_marketing_report.r @@ -53,13 +53,9 @@ search_engine_marketing_report <- function(adwords_keywords_elog){ mutate(total_acquisitions=num_acquisitions.adwords+num_acquisitions.bing) write.excel.csv(total_customers_per_month_report) - #Hacky Solution to get GDN Performance Graphs - gdn_elog <- AdWordsUtilities::create_google_display_event_log(from, to) - gdn_elog <- gdn_elog %>% - filter(grepl("Rmktg",campaign_name)) %>% - mutate(quality_score=NA, - new_referred_users=NA, - referred_users_transaction_amount=NA) + AdWordsUtilities::overall_performance_over_time(gdn_elog) + AdWordsUtilities::desktop_gdn_performance_over_time(gdn_elog) + AdWordsUtilities::mobile_gdn_performance_over_time(gdn_elog) AdWordsUtilities::overall_performance_over_time(gdn_elog) From 0fe3284b72284afda0c92bbb7dc8aac2eb132e3a Mon Sep 17 00:00:00 2001 From: Chris Salvato Date: Mon, 6 Jun 2016 21:26:34 -0400 Subject: [PATCH 4/8] Modify summarize_elog to work if some columns do not exist in the provided data frame. --- AdWordsUtilities/R/summarize_elog.r | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/AdWordsUtilities/R/summarize_elog.r b/AdWordsUtilities/R/summarize_elog.r index 482ebdc..09b525a 100644 --- a/AdWordsUtilities/R/summarize_elog.r +++ b/AdWordsUtilities/R/summarize_elog.r @@ -17,9 +17,10 @@ summarize_elog <- function(elog_data_frame, ){ require(plyr) require(dplyr) - return (summarize(elog_data_frame, cost = sum(cost, na.rm = TRUE), + return (summarize(elog_data_frame, + cost = sum(cost, na.rm = TRUE), average_position = weighted.mean(average_position,impressions, na.rm=TRUE), - average_quality_score=mean(quality_score, na.rm=TRUE), + average_quality_score=ifelse(is.null(elog_data_frame$quality_score), NA, mean(quality_score, na.rm=TRUE)) , estimated_available_impressions = sum(impressions/est_search_impression_share, na.rm=TRUE), impressions = sum(impressions, na.rm = TRUE), # imp share is not wholly accurate because of the way the numbers are reported, but close enough. @@ -35,8 +36,8 @@ summarize_elog <- function(elog_data_frame, earnings_per_click = earnings/clicks, contribution_per_click= contribution/clicks, cpa = ifelse(num_acquisitions==0, cost, cost/num_acquisitions), - referred_users=sum(new_referred_users, na.rm=TRUE), - referred_earnings=sum(referred_users_transaction_amount,na.rm=TRUE), + referred_users=ifelse(is.null(elog_data_frame$new_referred_users), NA, sum(new_referred_users, na.rm=TRUE)), + referred_earnings=ifelse(is.null(elog_data_frame$referred_users_transaction_amount), NA, sum(referred_users_transaction_amount,na.rm=TRUE)), estimated_ltv = num_acquisitions*average_num_orders_in_lifetime*average_value_per_order*margin, estimated_lifetime_ROAS=(estimated_ltv-cost)/cost, total_earnings = earnings + referred_earnings, From d01628c22cf791d352921d9d1573b333157be2a9 Mon Sep 17 00:00:00 2001 From: Chris Salvato Date: Mon, 6 Jun 2016 21:29:48 -0400 Subject: [PATCH 5/8] Clean up the GDN event log generation script and re-incorporate referral metrics --- .../R/create_google_display_event_log.r | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/PowerSupplyUtilities/R/create_google_display_event_log.r b/PowerSupplyUtilities/R/create_google_display_event_log.r index 5bef50d..bdeeb02 100644 --- a/PowerSupplyUtilities/R/create_google_display_event_log.r +++ b/PowerSupplyUtilities/R/create_google_display_event_log.r @@ -33,7 +33,7 @@ create_google_display_event_log <- function(from=Sys.Date(), #Filter out people where their first order was not in the specified start date and end date db_transactions <- db_transactions %>% filter(is.element(app_user_id, db_first_transactions$id)) - db_transactions <- clean_transactions_data(db_transactions) + db_transactions <- clean_transactions_data_for_adwords(db_transactions) # Add campaign names to db_transactions log db_transactions <- campaign_lookup_table(from=from, to=to) %>% @@ -46,26 +46,27 @@ create_google_display_event_log <- function(from=Sys.Date(), keywords_elog$week <- as.week(keywords_elog$date) keywords_elog <- keywords_elog %>% arrange(week) - # TODO: Implement referral metrics for GDN analysis. # Create join table for user_id and the keyword and campaign_name of first purchase - # user_first_acquisition_metrics <- keywords_elog %>% - # filter(!is.na(user_id)) %>% #Remove NA user_ids (which means they are not monetary transactions) - # group_by(user_id) %>% - # summarize(keyword = first(keyword), - # campaign_name=first(campaign_name), - # campaign_id=first(campaign_id), - # device=first(device), - # match_type=first(match_type)) + user_first_acquisition_metrics <- keywords_elog %>% + filter(!is.na(user_id)) %>% #Remove NA user_ids (which means they are not monetary transactions) + group_by(user_id) %>% + summarize(keyword = first(keyword), + campaign_name=first(campaign_name), + campaign_id=first(campaign_id), + device=first(device), + match_type=first(match_type)) #Add influencer metrics to the event log - #db_influencer_metrics <- get_referrals_data(from=from, to=to) - #influencer_metrics_with_user_data <- db_influencer_metrics %>% - #rename(week=week_start, - # user_id=influencer_id) %>% - #mutate(week = as.Date(week, format = '%Y-%m-%d')) %>% - #inner_join(user_first_acquisition_metrics, by=c(user_id="user_id")) %>% - #filter(week >= from, week <= to) - #keywords_elog <- rbind.fill(keywords_elog, influencer_metrics_with_user_data) + db_influencer_metrics <- get_referrals_data(from=from, to=to) + influencer_metrics_with_user_data <- db_influencer_metrics %>% + rename(week=week_start, + user_id=influencer_id) %>% + mutate(week = as.Date(week, format = '%Y-%m-%d')) %>% + inner_join(user_first_acquisition_metrics, by=c(user_id="user_id")) %>% + filter(week >= from, week <= to) + keywords_elog <- rbind.fill(keywords_elog, influencer_metrics_with_user_data) + + keywords_elog <- keywords_elog %>% filter(grepl("Rmktg",campaign_name)) keywords_elog <- keywords_elog %>% select( -transaction_date, From 4d213dfc9a4aebf82cf5ef6f6b969f556339affb Mon Sep 17 00:00:00 2001 From: Chris Salvato Date: Mon, 6 Jun 2016 21:30:43 -0400 Subject: [PATCH 6/8] Clean up search engine marketing report to work with one or both event logs. --- .../R/search_engine_marketing_report.r | 119 ++++++++---------- .../man/search_engine_marketing_report.Rd | 7 +- 2 files changed, 59 insertions(+), 67 deletions(-) diff --git a/PowerSupplyUtilities/R/search_engine_marketing_report.r b/PowerSupplyUtilities/R/search_engine_marketing_report.r index 8ed5708..82c1d78 100644 --- a/PowerSupplyUtilities/R/search_engine_marketing_report.r +++ b/PowerSupplyUtilities/R/search_engine_marketing_report.r @@ -2,83 +2,72 @@ #' #' Convenience Function that creates a comprehensive Search Engine Marketing report (viz and CSVs) with a single call. #' -#' @param adwords_keywords_elog A data frame containing keywords and transaction event log data. +#' @param adwords_keywords_elog A data frame containing keywords and transaction event log data from AdWords. +#' @param bing_keywords_elog A data frame containing keywords and transaction event log data from Bing. #' @export #' @examples #' search_engine_marketing_report(adwords_keywords_elog) -search_engine_marketing_report <- function(adwords_keywords_elog){ - require(AdWordsUtilities) - PowerSupplyUtilities::user_overview(adwords_keywords_elog) - AdWordsUtilities::keywords_campaign_device_matchtype_report(adwords_keywords_elog) - AdWordsUtilities::impression_share_over_time(adwords_keywords_elog) - AdWordsUtilities::click_through_rate_over_time(adwords_keywords_elog) - AdWordsUtilities::overall_performance_over_time(adwords_keywords_elog, plot = TRUE) - AdWordsUtilities::contribution_per_click_report(adwords_keywords_elog) - PowerSupplyUtilities::orders_per_week(adwords_keywords_elog, - keyword_filter="paleo meals", - campaign_filter="Paleo Performers") - PowerSupplyUtilities::paleo_cohort_views(adwords_keywords_elog) - adwords_customers_per_month_report <- PowerSupplyUtilities::customers_per_month_report(adwords_keywords_elog, file="adwords_customers_per_month.csv") - AdWordsUtilities::mobile_performance_over_time(adwords_keywords_elog, keyword_filter="paleo meals") - AdWordsUtilities::desktop_performance_over_time(adwords_keywords_elog, keyword_filter="paleo meals") - AdWordsUtilities::keywords_performance_over_time(adwords_keywords_elog) - AdWordsUtilities::keywords_campaign_performance_over_time(adwords_keywords_elog) - # Should this be made into a report function too? - # adwords_keywords_elog %>% AdWordsUtilities::summarize_elog() - - require(BingUtilities) - PowerSupplyUtilities::user_overview(bing_keywords_elog) - BingUtilities::keywords_campaign_device_matchtype_report(bing_keywords_elog) - BingUtilities::click_through_rate_over_time(bing_keywords_elog) - BingUtilities::overall_performance_over_time(bing_keywords_elog, plot = TRUE) - BingUtilities::contribution_per_click_report(bing_keywords_elog) - PowerSupplyUtilities::orders_per_week(bing_keywords_elog, keyword_filter="paleo meals") - PowerSupplyUtilities::paleo_cohort_views(bing_keywords_elog) - bing_customers_per_month_report <- PowerSupplyUtilities::customers_per_month_report(bing_keywords_elog, file="bing_customers_per_month.csv") - BingUtilities::mobile_performance_over_time(bing_keywords_elog, keyword_filter="paleo meals") - BingUtilities::desktop_performance_over_time(bing_keywords_elog, keyword_filter="paleo meals") - BingUtilities::keywords_performance_over_time(bing_keywords_elog) - BingUtilities::keywords_campaign_performance_over_time(bing_keywords_elog) - # Should this be made into a report function too? - # bing_keywords_elog %>% BingUtilities::summarize_elog() +search_engine_marketing_report <- function( adwords_keywords_elog=NULL, + bing_keywords_elog=NULL){ + + if(!is.null(adwords_keywords_elog)) { + require(AdWordsUtilities) + PowerSupplyUtilities::user_overview(adwords_keywords_elog) + AdWordsUtilities::keywords_campaign_device_matchtype_report(adwords_keywords_elog) + AdWordsUtilities::impression_share_over_time(adwords_keywords_elog) + AdWordsUtilities::click_through_rate_over_time(adwords_keywords_elog) + AdWordsUtilities::overall_performance_over_time(adwords_keywords_elog, plot = TRUE) + AdWordsUtilities::contribution_per_click_report(adwords_keywords_elog) + PowerSupplyUtilities::orders_per_week(adwords_keywords_elog, + keyword_filter="paleo meals", + campaign_filter="Paleo Performers") + PowerSupplyUtilities::paleo_cohort_views(adwords_keywords_elog) + adwords_customers_per_month_report <- PowerSupplyUtilities::customers_per_month_report(adwords_keywords_elog, file="adwords_customers_per_month.csv") + AdWordsUtilities::mobile_performance_over_time(adwords_keywords_elog, keyword_filter="paleo meals") + AdWordsUtilities::desktop_performance_over_time(adwords_keywords_elog, keyword_filter="paleo meals") + AdWordsUtilities::keywords_performance_over_time(adwords_keywords_elog) + AdWordsUtilities::keywords_campaign_performance_over_time(adwords_keywords_elog) + # Should this be made into a report function too? + # adwords_keywords_elog %>% AdWordsUtilities::summarize_elog() - #TODO: Move to own function - total_customers_per_month_report <- merge(adwords_customers_per_month_report, - bing_customers_per_month_report, - by="first_transaction_month", - all=TRUE, - suffixes=c(".adwords",".bing")) %>% - mutate_each(funs(ifelse(is.na(.),0,.))) %>% - mutate(total_acquisitions=num_acquisitions.adwords+num_acquisitions.bing) - write.excel.csv(total_customers_per_month_report) + #Hacky Solution to get GDN Performance Graphs + gdn_elog <- PowerSupplyUtilities::create_google_display_event_log(from, to) AdWordsUtilities::overall_performance_over_time(gdn_elog) AdWordsUtilities::desktop_gdn_performance_over_time(gdn_elog) AdWordsUtilities::mobile_gdn_performance_over_time(gdn_elog) - AdWordsUtilities::overall_performance_over_time(gdn_elog) - - devices_over_time <- gdn_elog %>% - group_by(device,week) %>% - summarize(cost = sum(cost, na.rm = TRUE), - contribution = sum(money_in_the_bank_paid_to_us,na.rm=TRUE) *.25) %>% - mutate(cum_contribution = cumsum(contribution), - cum_cost = cumsum(cost), - cum_ROI = cum_contribution - cum_cost) %>% - gather(type,value,cum_cost,cum_contribution,cum_ROI) + } - plot(ggplot(devices_over_time %>% - filter(device == "mb"), - aes(week,value,group=type,col=type,fill=type)) + - geom_line() + - ggtitle("GDN Trends on Mobile")) + if(!is.null(bing_keywords_elog)) { + require(BingUtilities) + PowerSupplyUtilities::user_overview(bing_keywords_elog) + BingUtilities::keywords_campaign_device_matchtype_report(bing_keywords_elog) + BingUtilities::click_through_rate_over_time(bing_keywords_elog) + BingUtilities::overall_performance_over_time(bing_keywords_elog, plot = TRUE) + BingUtilities::contribution_per_click_report(bing_keywords_elog) + PowerSupplyUtilities::orders_per_week(bing_keywords_elog, keyword_filter="paleo meals") + PowerSupplyUtilities::paleo_cohort_views(bing_keywords_elog) + bing_customers_per_month_report <- PowerSupplyUtilities::customers_per_month_report(bing_keywords_elog, file="bing_customers_per_month.csv") + BingUtilities::mobile_performance_over_time(bing_keywords_elog, keyword_filter="paleo meals") + BingUtilities::desktop_performance_over_time(bing_keywords_elog, keyword_filter="paleo meals") + BingUtilities::keywords_performance_over_time(bing_keywords_elog) + BingUtilities::keywords_campaign_performance_over_time(bing_keywords_elog) + # Should this be made into a report function too? + # bing_keywords_elog %>% BingUtilities::summarize_elog() + } - plot(ggplot(devices_over_time %>% - filter(device == "dt"), - aes(week,value,group=type,col=type,fill=type)) + - geom_line() + - ggtitle("GDN Trends on Desktop")) + if( !is.null(adwords_keywords_elog) && !is.null(bing_keywords_elog)) { + total_customers_per_month_report <- merge(adwords_customers_per_month_report, + bing_customers_per_month_report, + by="first_transaction_month", + all=TRUE, + suffixes=c(".adwords",".bing")) %>% + mutate_each(funs(ifelse(is.na(.),0,.))) %>% + mutate(total_acquisitions=num_acquisitions.adwords+num_acquisitions.bing) + write.excel.csv(total_customers_per_month_report) + } } \ No newline at end of file diff --git a/PowerSupplyUtilities/man/search_engine_marketing_report.Rd b/PowerSupplyUtilities/man/search_engine_marketing_report.Rd index d2efb82..f090c9d 100644 --- a/PowerSupplyUtilities/man/search_engine_marketing_report.Rd +++ b/PowerSupplyUtilities/man/search_engine_marketing_report.Rd @@ -4,10 +4,13 @@ \alias{search_engine_marketing_report} \title{Generate Search Engine Marketing Report} \usage{ -search_engine_marketing_report(adwords_keywords_elog) +search_engine_marketing_report(adwords_keywords_elog = NULL, + bing_keywords_elog = NULL) } \arguments{ -\item{adwords_keywords_elog}{A data frame containing keywords and transaction event log data.} +\item{adwords_keywords_elog}{A data frame containing keywords and transaction event log data from AdWords.} + +\item{bing_keywords_elog}{A data frame containing keywords and transaction event log data from Bing.} } \description{ Convenience Function that creates a comprehensive Search Engine Marketing report (viz and CSVs) with a single call. From 32d43e5244759ceb946e02781c3292bdc7caf358 Mon Sep 17 00:00:00 2001 From: Chris Salvato Date: Mon, 6 Jun 2016 21:31:10 -0400 Subject: [PATCH 7/8] Call the function of the search_engine_marketing_report with the new syntax (two args) --- overview_report.r | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overview_report.r b/overview_report.r index 12e82f8..f4d1661 100644 --- a/overview_report.r +++ b/overview_report.r @@ -45,4 +45,4 @@ bing_keywords_elog <- create_bing_event_log(from=start_date, to=end_date) adwords_keywords_elog <- create_adwords_event_log(from=start_date, to=end_date) ###################################### CREATE AdWords Plots and CSVs ############################################## -PowerSupplyUtilities::search_engine_marketing_report(adwords_keywords_elog) \ No newline at end of file +PowerSupplyUtilities::search_engine_marketing_report(adwords_keywords_elog, bing_keywords_elog) \ No newline at end of file From 3d3d6c5785c3c05c43695f680459ee1cd8108d8a Mon Sep 17 00:00:00 2001 From: Chris Salvato Date: Mon, 6 Jun 2016 21:37:54 -0400 Subject: [PATCH 8/8] Implement gdn_elog generation to be consistent with existing pattern. --- .../R/search_engine_marketing_report.r | 20 ++++++++++--------- overview_report.r | 5 ++++- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/PowerSupplyUtilities/R/search_engine_marketing_report.r b/PowerSupplyUtilities/R/search_engine_marketing_report.r index 82c1d78..e535879 100644 --- a/PowerSupplyUtilities/R/search_engine_marketing_report.r +++ b/PowerSupplyUtilities/R/search_engine_marketing_report.r @@ -4,12 +4,14 @@ #' #' @param adwords_keywords_elog A data frame containing keywords and transaction event log data from AdWords. #' @param bing_keywords_elog A data frame containing keywords and transaction event log data from Bing. +#' @param gdn_elog A data frame containing keywords and transaction event log data from Google Display Network. #' @export #' @examples #' search_engine_marketing_report(adwords_keywords_elog) search_engine_marketing_report <- function( adwords_keywords_elog=NULL, - bing_keywords_elog=NULL){ + bing_keywords_elog=NULL, + gdn_elog=NULL){ if(!is.null(adwords_keywords_elog)) { require(AdWordsUtilities) @@ -30,14 +32,6 @@ search_engine_marketing_report <- function( adwords_keywords_elog=NULL, AdWordsUtilities::keywords_campaign_performance_over_time(adwords_keywords_elog) # Should this be made into a report function too? # adwords_keywords_elog %>% AdWordsUtilities::summarize_elog() - - #Hacky Solution to get GDN Performance Graphs - gdn_elog <- PowerSupplyUtilities::create_google_display_event_log(from, to) - - AdWordsUtilities::overall_performance_over_time(gdn_elog) - AdWordsUtilities::desktop_gdn_performance_over_time(gdn_elog) - AdWordsUtilities::mobile_gdn_performance_over_time(gdn_elog) - } if(!is.null(bing_keywords_elog)) { @@ -58,6 +52,14 @@ search_engine_marketing_report <- function( adwords_keywords_elog=NULL, # bing_keywords_elog %>% BingUtilities::summarize_elog() } + if(!is.null(gdn_elog)) { + require(AdWordsUtilities) + AdWordsUtilities::overall_performance_over_time(gdn_elog) + AdWordsUtilities::desktop_gdn_performance_over_time(gdn_elog) + AdWordsUtilities::mobile_gdn_performance_over_time(gdn_elog) + + } + if( !is.null(adwords_keywords_elog) && !is.null(bing_keywords_elog)) { total_customers_per_month_report <- merge(adwords_customers_per_month_report, bing_customers_per_month_report, diff --git a/overview_report.r b/overview_report.r index f4d1661..4c07030 100644 --- a/overview_report.r +++ b/overview_report.r @@ -43,6 +43,9 @@ to = end_date = paste(toString(Sys.Date() - days(0)), "03:59:59") bing_keywords_elog <- create_bing_event_log(from=start_date, to=end_date) adwords_keywords_elog <- create_adwords_event_log(from=start_date, to=end_date) +gdn_elog <- create_google_display_event_log(from, to) ###################################### CREATE AdWords Plots and CSVs ############################################## -PowerSupplyUtilities::search_engine_marketing_report(adwords_keywords_elog, bing_keywords_elog) \ No newline at end of file +PowerSupplyUtilities::search_engine_marketing_report( adwords_keywords_elog, + bing_keywords_elog, + gdn_elog) \ No newline at end of file