Design-led companies (Apple, Google, Airbnb, etc.) frequently apply design thinking to design new products (Naiman 2020). A/B testing (also known as split testing or bucket testing) is “a method of comparing two versions of a webpage or app against each other to determine which one performs better.” (Optimizly, 2019).
Some people get randomly assigned to group A, some others to group B. Each group is exposed to a different treatment of some underlying variable. This variable could be the discount amount, ad copy, etc. This underlying variable is what gets “manipulated.” Marketing researchers or data scientists then observe some outcome(s) that might be affected by the manipulated variables. We then create a dummy variable for the treatment group and for the control group. ## To evaluate the effect of the 2 different treatments of (A and B), we run the following regression: Y = β0 + β1*XA + ϵ
The coefficient β1 can be interpreted as the additional effect that treatment A has on the outcome variable compared to treatment B. β0 can be interpreted as the average outcome, or the predicted value of Y, for treatment group B. Usually, if one of the treatments is considered a “control” group, the control group would be used as the baseline in the regression. i.e. the group that is left out and absorbed into the intercept β0. In the regression model above, this would be group since is an indicator for whether treatment was applied.
Dummy coding is required for performing experimental research. Since we have dummy variables (i.e., a control/placebo group and a treatment group) in our model, the intercept has more meaning. Dummy coded variables have values of 0 for the reference/control/placebo group and 1 for the comparison/treatment group. Since the intercept is the expected mean value when X=0, it is the mean value only for the reference group (when all other X=0). Dummy coding a way to make the categorical variable into a series of dichotomous variables (variables that can have a value of zero or one only). For more details, please see the UCLA statistics site for more details (available at https://stats.idre.ucla.edu/spss/faq/coding-systems-for-categorical-variables-in-regression-analysis/).
It is suggested that “the effect of advertising appears non-linear, with an optimum between two and three exposures per week (Tellis, 1987).” For our example on the relationship between advertising exposures and product purchase below, we will be testing the relationship between advertising and product purchase using regression analysis. Our null hypothesis (usually denoted as H0) is that there is no relationship between advertising exposures and product purchases using regression analysis. The alternative hypothesis (usually denoted as H1) is that there is a relationship between advertising exposures and product purchases. The hypothesis test can be represented by the following notation:
Null Hypothesis: H0: β1 = 0 Alternative Hypothesis: H1: β1 ≠ 0
First, we will be creating a new variable that has a value of one for each observation at that level and zeroes for all others. In our example using the variable (Ads), the first new variable (Ads1) will have a value of one for each observation in which the consumers are exposed to the 1st ads campaign and zero for all other observations. Likewise, we create Ads2 when the consumers are exposed to the 1st ads campaign, and 0 otherwise, and Ads3 is 1 when the consumers are exposed to the 3rd ads campaign, and 0 otherwise. The level of the categorical variable that is coded as zero in the new variables is the reference level or the level to which all of the other levels are compared. In our example, it is the reference level Ads0. Our objective is to see which ads campaign lead to more product sales.
#setwd("C:/Users/zxu3/Documents/R/abtesting")
#Please install the following package if the package "readr" is not installed.
#install.packages("readr")
library(readr)
data <- read_csv("abtesting.csv")
##
## ── Column specification ────────────────────────────────────────────────────────
## cols(
## Ads = col_double(),
## Purchase = col_double()
## )
ls(data) # list the variables in the dataset
## [1] "Ads" "Purchase"
head(data) #list the first 6 rows of the dataset
## # A tibble: 6 x 2
## Ads Purchase
## <dbl> <dbl>
## 1 1 113
## 2 0 83
## 3 0 52
## 4 1 119
## 5 1 188
## 6 0 99
# creating the factor variable
data$Ads <- factor(data$Ads)
is.factor(data$Ads)
## [1] TRUE
# showing the first 15 rows of the variable "Ads"
data$Ads[1:15]
## [1] 1 0 0 1 1 0 0 1 1 1 0 0 0 1 0
## Levels: 0 1
#now we do the regression analysis and examine the results
summary(lm(Purchase~Ads, data = data))
##
## Call:
## lm(formula = Purchase ~ Ads, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -57.000 -23.250 3.071 22.643 51.000
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 95.429 6.441 14.816 < 2e-16 ***
## Ads1 41.571 9.630 4.317 0.000118 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 29.52 on 36 degrees of freedom
## Multiple R-squared: 0.3411, Adjusted R-squared: 0.3228
## F-statistic: 18.64 on 1 and 36 DF, p-value: 0.0001184
Since the p-value for X is .00018, which is less than .05, we reject the null hypothesis in favor of the alternative hypothesis.
The coefficient for Ads1 in the regression output is 41.57, which indicates that the 1st Advertising campaign is more effective (relative to the group who did not receive any advertising exposure).
Now the estimates for β0 and β1 are 95.43 and 41.57, respectively, leading to a prediction of average sales of 95.43 for the control group (group A) and a prediction of average sales which is 95.43 + 41.57*1 = 137 for the treatment group or the group of consumers who were exposed to the advertising campaign.
You will also find exactly the same coefficients using the Regression Data Analysis Tool in Excel. However, Excel also can’t handle large datasets (hundreds of thousands of records (Gapintelligence, 2020). Additionally, if you would like to perform the analysis and document the whole process (e.g., objectives, methods, hypotheses, results, and discussions), then using Rstudio with RMarkdown is probably one of the best choices.
Reference: Understanding R programming over Excel for Data Analysis https://www.gapintelligence.com/blog/understanding-r-programming-over-excel-for-data-analysis/
note: You can also perform this analysis using Excel We would like to see which campaign lead to more product sales in 2 different ways below.
#now we do an analysis for a predictor with 4 different levels
display <- read_csv("ab_testing.csv")
##
## ── Column specification ────────────────────────────────────────────────────────
## cols(
## Ads = col_double(),
## Purchase = col_double()
## )
ls(display) # list the variables in the dataset
## [1] "Ads" "Purchase"
head(display)
## # A tibble: 6 x 2
## Ads Purchase
## <dbl> <dbl>
## 1 1 152
## 2 0 21
## 3 3 77
## 4 0 65
## 5 1 183
## 6 1 87
# creating the factor variable
display$Ads <- factor(display$Ads)
is.factor(display$Ads)
## [1] TRUE
# showing the first 15 rows of the variable "Ads"
display$Ads[1:15]
## [1] 1 0 3 0 1 1 2 2 2 0 3 3 0 2 3
## Levels: 0 1 2 3
#now we do a regression analysis for a predictor with 4 different levels
summary(lm(Purchase~Ads, data = display))
##
## Call:
## lm(formula = Purchase ~ Ads, data = display)
##
## Residuals:
## Min 1Q Median 3Q Max
## -50.095 -27.891 -0.227 24.773 65.905
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 55.381 6.472 8.557 9.41e-13 ***
## Ads1 75.714 9.152 8.273 3.31e-12 ***
## Ads2 36.557 9.842 3.715 0.000386 ***
## Ads3 -2.654 9.048 -0.293 0.770096
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 29.66 on 76 degrees of freedom
## Multiple R-squared: 0.5624, Adjusted R-squared: 0.5452
## F-statistic: 32.56 on 3 and 76 DF, p-value: 1.216e-13
#Alternatively, you can also use the factor function within the lm function, saving the step of creating the factor variable first.
summary(lm(Purchase~ factor(Ads), data = display))
##
## Call:
## lm(formula = Purchase ~ factor(Ads), data = display)
##
## Residuals:
## Min 1Q Median 3Q Max
## -50.095 -27.891 -0.227 24.773 65.905
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 55.381 6.472 8.557 9.41e-13 ***
## factor(Ads)1 75.714 9.152 8.273 3.31e-12 ***
## factor(Ads)2 36.557 9.842 3.715 0.000386 ***
## factor(Ads)3 -2.654 9.048 -0.293 0.770096
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 29.66 on 76 degrees of freedom
## Multiple R-squared: 0.5624, Adjusted R-squared: 0.5452
## F-statistic: 32.56 on 3 and 76 DF, p-value: 1.216e-13
Answer: The p-values for Example 2.1 turned out to be 3.31e-12 for Ads1, 0.00038 for Ads2 and 0.77 for Ads3. For Ads1, because 3.31e-12 is far below .05 we would reject the null hypothesis and accept the alternative hypothesis. We would also reject the null hypothesis and accept the alternative hypothesis for Ads2 because the p-value is also below the .05 threshold. However, we would fail to reject the null hypothesis and reject the alternative hypothesis for Ads3 because the p-value is above .05. In other words, there is no relationship between ad exposure and product purchases with Ads3, while Ads1 and Ads2 we can see observe that there is a relationship between the two variables. We can also see that the regression output for Ads1 is 75.71 which tells us that Ads1 is the most responsive and effective ad. Estimates for β0 and β1 are 55.38 and 75.71 leading to a prediction of average sales of 55.38 for the control group and a prediction of average sales which is 55.38 + 75.71*1 = 131.09 for the treatment group or the group of consumers who were exposed to the advertising campaign. The results speak for themselves. I would advise my company to run the Ads3 advertisement because on average they will make $131 per sale verus $55 per sale if they don’t run the ad.
Answer:
Answer: I’ll be commenting on the video: https://www.youtube.com/watch?v=VQpQ0YHSfqM&t=189s Stuart Frisby from Booking.com gave us a general overview of what A/B Testing is and the dos and don’ts of it. I was surprised to hear him say that 9 out of 10 times we are absolutely wrong in our assumptions about something, so get use to it if you want to be in the testing field! He explained that there are shallow and deep metrics, shallow metrics are things like “how many clicks” can we get and deep metrics are things like “how many bookings/conversions”. Stuart pointed out reasons for running A/B tests should be to clear up any assumptios (that you’re probably wrong about), to ultimatly help you be more profitable, to make decisions based on facts and to help you create products based on customer sentiments. He also pointed out some common test mistakes - making too many changes at the same time, only testing limited parts of something instead of the entire thing and assuming other competitor’s test results will alwasy work for yours. Stuart also mentioned that the main reason to run testing is to improve customer experience and the focus on customer “pain points”.
A/B Testing: Test Your Own Hypotheses & Prepare to be Wrong - Stuart Frisby
https://www.youtube.com/watch?v=VQpQ0YHSfqM&t=189s
Naiman 2020. Design Thinking as a Strategy for Innovation. https://www.creativityatwork.com/design-thinking-strategy-for-innovation/
Tellis 1987. Marketing Science. https://www.msi.org/reports/advertising-exposure-loyalty-and-brand-purchase-a-two-stage-model-of-choice/
https://stats.idre.ucla.edu/r/modules/coding-for-categorical-variables-in-regression-models/
Create an A/B test, https://support.google.com/optimize/answer/6211930?hl=en Experiments at Airbnb,https://medium.com/airbnb-engineering/experiments-at-airbnb-e2db3abf39e7
Your Step-by-Step Guide to A/B Testing with Google Optimize, https://www.crazyegg.com/blog/ab-testing-google-analytics/
https://firebase.google.com/products/ab-testing
https://www.sitepoint.com/perform-ab-testing-google-optimize/
https://marketingplatform.google.com/about/optimize/features/