data-jupyter-notebooks/ab_test_guest_journey_monitoring.ipynb
2025-04-24 11:59:16 +02:00

727 lines
81 KiB
Text

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# A/B test monitoring\n",
"\n",
"## Initial setup\n",
"This first section just ensures that the connection to DWH works correctly."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pathlib\n",
"import yaml\n",
"import pandas as pd\n",
"import numpy as np\n",
"from sqlalchemy import create_engine\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"from statsmodels.stats.proportion import proportions_ztest\n",
"from scipy import stats\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/home/joaquin/.superhog-dwh/credentials.yml\n"
]
}
],
"source": [
"CREDS_FILEPATH = pathlib.Path.home() / \".superhog-dwh\" / \"credentials.yml\"\n",
"print(CREDS_FILEPATH)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Prepare connection to DWH\n",
"# Function to read credentials from the YAML file\n",
"def read_credentials(yaml_path: str, env: str = \"prd\"):\n",
" with open(yaml_path, \"r\") as file:\n",
" credentials = yaml.safe_load(file)\n",
" return credentials[\"envs\"][env]\n",
"# Function to create a PostgreSQL connection string\n",
"def create_postgres_engine(creds: dict):\n",
" user = creds[\"user\"]\n",
" password = creds[\"password\"]\n",
" host = creds[\"host\"]\n",
" port = creds[\"port\"]\n",
" database = creds[\"database\"]\n",
" # Create the connection string for SQLAlchemy\n",
" connection_string = f\"postgresql://{user}:{password}@{host}:{port}/{database}\"\n",
" engine = create_engine(connection_string)\n",
" return engine\n",
"# Function to execute a query and return the result as a pandas DataFrame\n",
"def query_to_dataframe(engine, query: str):\n",
" with engine.connect() as connection:\n",
" df = pd.read_sql(query, connection)\n",
" return df\n",
"dwh_creds = read_credentials(yaml_path=CREDS_FILEPATH, env=\"prd\")\n",
"dwh_pg_engine = create_postgres_engine(creds=dwh_creds)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" ?column?\n",
"0 1\n"
]
}
],
"source": [
"# Silly query to test things out\n",
"test_df = query_to_dataframe(engine=dwh_pg_engine, query=\"SELECT 1;\")\n",
"print(test_df.head())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## A/B test configuration\n",
"In this section we configure the parameters for the A/B test. Likely you do NOT need to change anything else than this, unless of course you want to create new metrics and so on.\n",
"\n",
"The parameters to be specified are:\n",
"* **ab_test_name**: this should be the name of the feature flag corresponding to the A/B test. If you don't know the name, ask Guest Squad\n",
"* **var_A** and **var_B**: these correspond to the name of the variants. At this moment, we can only handle univariant testing (though updating the code to include multivariant testing should not be extremely difficult). In general, choose var_A to be the Control group."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# A/B test name to measure\n",
"#ab_test_name = \"AAVariantTest\"\n",
"ab_test_name = \"WelcomePageDestinationContext\"\n",
"\n",
"# Define the variations in which we want to run the tests\n",
"var_A = 'GenericImageAndCopy' # Ideally, this should be the control group\n",
"var_B = 'ContextSpecificImageAndCopy' # Ideally, this should be the study group\n",
"\n",
"variations = [var_A, var_B]\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data Extraction\n",
"In this section we extract the data from the Guest Journey monitoring within DWH by configuring which A/B test we want to measure. Here we already handle the basic aggregations that will be needed in the future, directly in SQL."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" ab_test_name variation last_update \\\n",
"0 WelcomePageDestinationContext ContextSpecificImageAndCopy 2025-04-24 \n",
"1 WelcomePageDestinationContext GenericImageAndCopy 2025-04-24 \n",
"\n",
" guest_journeys_count guest_journey_started_count \\\n",
"0 190 188 \n",
"1 199 199 \n",
"\n",
" guest_journey_completed_count guest_journey_with_responses_count \\\n",
"0 112 34 \n",
"1 115 47 \n",
"\n",
" guest_journey_with_payment_count guest_revenue_count deposit_count ... \\\n",
"0 58 58 12 ... \n",
"1 50 50 10 ... \n",
"\n",
" guest_revenue_avg_per_guest_journey guest_revenue_sdv_per_guest_journey \\\n",
"0 6.837889 11.673403 \n",
"1 5.728471 11.115316 \n",
"\n",
" deposit_avg_per_guest_journey deposit_sdv_per_guest_journey \\\n",
"0 0.383661 1.845352 \n",
"1 0.361084 1.708223 \n",
"\n",
" waiver_avg_per_guest_journey waiver_sdv_per_guest_journey \\\n",
"0 6.172824 11.320728 \n",
"1 5.240985 10.864534 \n",
"\n",
" check_in_cover_avg_per_guest_journey check_in_cover_sdv_per_guest_journey \\\n",
"0 0.281404 1.569646 \n",
"1 0.126402 1.030621 \n",
"\n",
" csat_avg_per_guest_journey_with_response \\\n",
"0 3.882353 \n",
"1 3.723404 \n",
"\n",
" csat_sdv_per_guest_journey_with_response \n",
"0 1.066422 \n",
"1 0.993503 \n",
"\n",
"[2 rows x 26 columns]\n"
]
}
],
"source": [
"# Query to extract data\n",
"data_extraction_query = \"\"\"\n",
"select \n",
"\tgj.ab_test_name,\n",
"\tgj.variation,\n",
"\tmax(gj.first_appearance_date_utc) as last_update,\n",
" \n",
" -- SIMPLE COUNTS --\n",
"\tcount(gj.id_verification_request) as guest_journeys_count,\n",
"\tcount(gj.verification_started_date_utc) as guest_journey_started_count,\n",
"\tcount(gj.verification_completed_date_utc) as guest_journey_completed_count,\n",
"\tcount(gj.experience_rating) as guest_journey_with_responses_count,\n",
"\tcount(gj.last_payment_paid_date_utc) as guest_journey_with_payment_count,\n",
"\tcount(gj.guest_revenue_without_taxes_in_gbp) as guest_revenue_count,\n",
"\tcount(gj.deposit_fees_without_taxes_in_gbp) as deposit_count,\n",
"\tcount(gj.waiver_fees_without_taxes_in_gbp) as waiver_count,\n",
"\tcount(gj.check_in_cover_fees_without_taxes_in_gbp) as check_in_cover_count,\n",
" \n",
" -- SIMPLE SUMS --\n",
"\tsum(gj.guest_revenue_without_taxes_in_gbp) as guest_revenue_sum,\n",
"\tsum(gj.deposit_fees_without_taxes_in_gbp) as deposit_sum,\n",
"\tsum(gj.waiver_fees_without_taxes_in_gbp) as waiver_sum,\n",
"\tsum(gj.check_in_cover_fees_without_taxes_in_gbp) as check_in_cover_sum,\n",
" \n",
" -- AVGs/SDVs PER GUEST JOURNEY (ANY GJ APPEARING IN THE A/B TEST) --\n",
" -- NOTE THE COALESCE HERE. THIS IS IMPORTANT FOR THE T-TEST COMPUTATION --\n",
" avg(coalesce(gj.guest_revenue_without_taxes_in_gbp,0)) as guest_revenue_avg_per_guest_journey,\n",
" stddev(coalesce(gj.guest_revenue_without_taxes_in_gbp,0)) as guest_revenue_sdv_per_guest_journey,\n",
" avg(coalesce(gj.deposit_fees_without_taxes_in_gbp,0)) as deposit_avg_per_guest_journey,\n",
" stddev(coalesce(gj.deposit_fees_without_taxes_in_gbp,0)) as deposit_sdv_per_guest_journey,\n",
" avg(coalesce(gj.waiver_fees_without_taxes_in_gbp,0)) as waiver_avg_per_guest_journey,\n",
" stddev(coalesce(gj.waiver_fees_without_taxes_in_gbp,0)) as waiver_sdv_per_guest_journey,\n",
" avg(coalesce(gj.check_in_cover_fees_without_taxes_in_gbp,0)) as check_in_cover_avg_per_guest_journey,\n",
" stddev(coalesce(gj.check_in_cover_fees_without_taxes_in_gbp,0)) as check_in_cover_sdv_per_guest_journey,\n",
" \n",
" -- AVGs/SDVs PER GUEST JOURNEY WITH CSAT RESPONSE --\n",
" -- NOTE THAT THERE'S NO COALESCE HERE. THIS IS IMPORTANT FOR THE T-TEST COMPUTATION --\n",
" avg(gj.experience_rating) as csat_avg_per_guest_journey_with_response,\n",
" stddev(gj.experience_rating) as csat_sdv_per_guest_journey_with_response\n",
" \n",
"from\n",
"\tintermediate.int_core__ab_test_monitoring_guest_journey gj\n",
"left join\n",
"\tintermediate.int_core__bookings b on b.id_verification_request = gj.id_verification_request\n",
"left join\n",
"\tintermediate.int_core__accommodation a on a.id_accommodation = b.id_accommodation\n",
"where\n",
"\tgj.ab_test_name = '{}'\n",
" and gj.first_appearance_at_utc >= '2025-04-23 18:05:00'\n",
" and a.town in ('London', 'Greater London')\n",
"group by\n",
"\t1,2\n",
"\"\"\".format(ab_test_name)\n",
"\n",
"# Retrieve Data from Query\n",
"df = query_to_dataframe(engine=dwh_pg_engine, query=data_extraction_query)\n",
"print(df.head())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Check A/B test Allocation to Variation"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgwAAAIYCAYAAAABwbSCAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAlxJJREFUeJzs3Xd0VNXax/HvzGTSG6kkJKQACb333qSDCCoogth5FcvVq6JXsderoiLKtYtYUEBRqoD03mtCTUgCSQgJ6W3Kef8YMzAkIQGSTMnzWSsLMnPmzDMlc36z9z57qxRFURBCCCGEuAq1tQsQQgghhO2TwCCEEEKIKklgEEIIIUSVJDAIIYQQokoSGIQQQghRJQkMQgghhKiSBAYhhBBCVEkCgxBCCCGqJIFBCCGEEFWSwFCHduzYwQsvvMCIESPo0qULrVq1olu3btx66628+uqrbN26lfo28ebixYuJjY1l4MCB1i5FVGLSpEnExsby3nvvVWv7119/ndjYWB544IFarWvGjBnExsayePHiWr2fy8XGxhIbG1tn91cTxowZQ2xsLK1bt+bixYtX3bay57Ts73TGjBm1WapVDBw4kNjYWFJSUqxdis2TwFAHsrKyuO+++5gyZQq//vor+fn5dOzYkWHDhtG+fXuysrL44YcfuOeeexg3bpy1y70mO3bsIDY2lsmTJ1u7FFFLbr31VgB+//13DAbDVbctLS3lzz//tLidvZg8eTKxsbHs2LHD2qXUmIMHD3Ls2DEAdDodf/zxh5UrqlvWCJWOzMnaBTi63Nxc7rzzThISEoiOjuall16ie/fu5bY7fvw43377LcuXL7dClUJUbtiwYbz++utkZGSwceNGBgwYUOm2a9euJTs7Gz8/v1pvNXryySd54IEHCAoKqtX7uZy9/X0uXLgQgODgYNLT01m4cCF33323lauyLd9++y06nY7g4GBrl2LzpIWhlr322mskJCQQHh7Ozz//XGFYAIiJieHNN99k3rx5dVyhEFfn5ubGyJEjAar8plZ2/ZgxY9BqtbVaV1BQEE2aNMHLy6tW7+dyTZo0oUmTJnV2fzeiqKiIZcuWAfDuu+/i7u7O8ePHOXjwoJUrsy2NGzemSZMmtf5+dQQSGGpRUlISS5cuBeC5557Dx8enytu0bdu23GVV9bFV1ey2bds2pk+fTu/evWndujU9evTgkUceYd++fRVun5iYyHPPPcfAgQNp3bo1HTp0YMCAATz44IMsWrTIvN3kyZOZMmUKADt37jT379bkmIS0tDRee+01hgwZQps2bejUqRMTJ07k559/rrB5fPbs2cTGxjJ79uwK91dZF8rllxcVFfHRRx8xfPhw2rVrZ34sl/fjFhYW8v7773PTTTfRunVrevXqxbPPPkt6enqljyU9PZ233nrLvN8OHTowfvx45s+fj16vt9j2rrvuIjY21vz+qcgXX3xBbGwsjz/+eKXb1JSy7oV169aRlZVV4Tbp6els2bLFYvusrCzmzZvHAw88wMCBA2nbti0dO3Zk3LhxfP7555SUlFS4r8vHCixatIgJEybQqVMni7+Dyt73+fn5/PLLL0yfPp0hQ4bQvn172rdvz+jRo5k1axa5ubkW25e99jt37gRgypQpFu/ly/d/tTEM2dnZfPDBB4wcOdL8+o4bN44vvviC4uLicttf/p7T6XR8/vnnjBw5krZt29KtWzemT5/OqVOnKryv6li5ciX5+fnExMTQvXt3RowYAVxqdahJBw8e5PHHH7f4jJk2bZr5/VCZbdu28dhjj9G3b19at25N9+7dGT9+PB9//LHFeAudTseSJUt46qmnGDZsGB07dqRt27YMHTqU119/vdzfXUpKCrGxsfz222+A6fP38tf08s+Hq32+FhUV8fnnn3PLLbfQoUMH2rVrx8iRI5k1axY5OTnlti+734EDB6IoCgsWLGDcuHG0b9+eTp06ce+991b6uWsPpEuiFq1btw6j0YiPj89Vm3Fr0zvvvMPXX3+NWq2mdevWdOrUidTUVNauXcu6det47bXXGD9+vHn748ePc8cdd5Cfn09UVBQDBgxArVaTnp7Orl27SE9PN2/fp08fnJ2d2bx5MwEBAfTp08e8nwYNGtxw7QcPHuSBBx4gOzub0NBQBg8eTF5eHjt37mTfvn2sXr2azz77DGdn5xu+rzIlJSVMnjyZU6dO0blzZ5o3b052drbFNnl5eUycOJHU1FQ6depEs2bN2L9/P7///ju7du1iyZIl5b717tq1i0ceeYScnBwaNWpEz549KS0t5dChQ7z22musW7eOuXPnmr/lTJkyhV27djF//nxGjRpVrk6j0chPP/0EmMJFbWvbti0xMTEcP36cP/74g6lTp5bb5rfffsNgMNCuXTuaNWsGwKZNm3jjjTcIDg4mIiLCPGbnwIEDvP/++/z999/Mmzev0tfwtdde48cff6RDhw7079+f5ORkVCrVVWuNj4/nxRdfxM/Pj6ioKFq1akVubi6HDx9m7ty5rFixggULFpjfowEBAdxyyy1s2rSJCxcu0Lt3bwIDA837a9y4cZXPT3JyMnfffTdnz57Fz8+Pfv36odPp2LFjB++99x4rVqzgm2++qfBLg06n48EHH2Tfvn107tyZJk2acPDgQVavXs2OHTv47bffCAsLq7KGK5UFg7K/1/Hjx7Nw4UKWL1/O888/j6ur6zXvsyK//PILL730EkajkZYtW9KtWzfOnj3LunXrWLduHY8++ijTp08vd7vXX3+d77//HoAWLVrQuXNn8vLySEhIYM6cOXTr1o1u3boBkJmZyTPPPIOXlxdNmjQhNjaWoqIi4uLi+P7771m2bBk///wzERERALi7u3PLLbewZ88ekpKS6Nixo/m6svurSnZ2NlOnTiUuLg5PT0+6d++OVqtl586dzJ07l6VLl/Ldd99V+to899xzLF26lE6dOtG/f3/i4uLYsmWL+e+6Xbt21/xcW50ias3TTz+txMTEKHffffcN7WfAgAFKTEyMkpycXOH1zz77rBITE6MsWrTI4vIFCxYoMTExyk033aTExcVZXLdz506lQ4cOSqtWrZSEhATz5TNmzFBiYmKUTz/9tNz9FBUVKTt37rS4bPv27UpMTIxy1113XddjW7RokRITE6MMGDDA4vKSkhLz4545c6ZSWlpqvi4pKcl83QcffGBxu48//liJiYlRPv744wrvr7J6yy6PiYlRRo8erZw/f77SWmNiYpR7771XycvLM1+XnZ2t3HzzzUpMTIwyd+5ci9udP39e6dq1qxIbG6v88MMPisFgMF+XlZWlTJkyRYmJiVFmz55tvlyv15sf45EjR8rV8vfff5trrSvffvutEhMTo4waNarC64cMGaLExMQoCxYsMF928uRJZd++feW2zc7OVu69914lJiZG+eKLL8pdX/Y8d+zYscLbK0rl7/vU1FRl69atFs+zoihKYWGh8swzzygxMTHKyy+/XG5/d911lxITE6Ns3769wvu7vK4r3XbbbUpMTIwybdo0paCgwHx5ZmamcssttygxMTHKk08+aXGby99zY8eOtXjPFRcXm5+fF198sdJ6KnP6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vr6+/Pe//6VNmzbodDpWrVrFI488Qnx8vFXqulYeHh5Mnz6dtm3b4uHhwebNm3nooYfw8PDgwQcfBOCdd97hs88+47vvvqNVq1bs3r2be+65Bx8fHx577DEURWHs2LFotVqWLFmCt7c3H3zwAYMHD+bo0aN4eHhY+VEKIYSwNpVy+dfMWvbtt9/yxBNPkJ2dDYDRaOT111/n888/JyMjgxYtWvD2228zbNgwU3EqlcXt+/Xrx/r169m1axfPP/88+/btQ6fT0b59e2bNmkXHjh0vPTCVit9++42xY8dWWMuIESM4ePAgx44dK3dAzM7OxtfXF4CkpCQeffRR1q5di1qtZtiwYcyePZvg4GAApk6dSnZ2tkXrwBNPPMH+/ftZv349AP3796dt27a4urry5Zdf4uzszLRp08ytK5GRkZw5c8Z8+4iICBITE6/hmbU0btw4PDw8+P777wEYNWoUwcHBfPXVV+Ztxo8fj5ubG/Pnz+f48ePExsZy+PBhWrVqBZhem4YNG/Lmm29y//33X3ctwjGVlJTw/vvv06pVK26++eZy1//444/07duXkydPsmvXLry8vADQaDQMGzaM8PBwi+13797N7t27AcjJyUGr1eLu7g7A0KFDiYqKqnZt69evp3fv3jg5Xf37kF6v55133uHRRx/F29sbgHnz5mE0Gpk6dSoA+fn5fPjhhzz77LNotdoK95OYmMjKlSuZNm1atWusDfv372flypX4+vpiNBrx8fFh1KhR+Pj41Ph9JSYm8sMPPxAQEIDBYACgSZMm9O3bFzc3t+vaZ3Z2NidPnqRz587my3744QeGDh1KQEDAdde6f/9+wsLCzPs4duwYCQkJ5uPM9crKymLNmjWkpqbi5uaGSqWiU6dOFsehG631ehQXF7N792569+593fuojFXHMHz00Ue8//77vPfeexw8eJChQ4cyZswYc1P4zp07AcwvyuLFiwHIy8vj7rvvZvPmzWzfvp1mzZoxYsQI8vLyqnW/WVlZrFy5kkceeaTCb89lYcFoNHLzzTeTlZXFhg0bWL16NadPn2bChAnX/Fi/++47PDw82LFjB++++y6vvvoqq1evBmDXrl0AfPPNN6Smppp/L+uSKQse1bFv3z62bt1Kv379zJf17NmTtWvXcvz4cQAOHDjA5s2bGT58OGD68AdwdXU130atVuPi4sLm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",
"text/plain": [
"<Figure size 800x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Ensure Seaborn styling\n",
"sns.set_theme(style=\"whitegrid\")\n",
"\n",
"# Calculate the total guest_journeys_count per variation\n",
"grouped_data = df.groupby('variation')['guest_journeys_count'].sum()\n",
"\n",
"# Find the total count and other metadata\n",
"total_count = grouped_data.sum()\n",
"ab_test_name = df['ab_test_name'].iloc[0] # Assuming all rows are for the same A/B test\n",
"last_update = df['last_update'].max()\n",
"\n",
"# Create a pie chart using Seaborn styling\n",
"plt.figure(figsize=(8, 6))\n",
"colors = sns.color_palette(\"pastel\") # Seaborn pastel colors\n",
"\n",
"# Pie chart with labels inside each sector\n",
"plt.pie(\n",
" grouped_data, \n",
" labels=[f\"{var}\\n{count} ({count/total_count:.1%})\" for var, count in grouped_data.items()],\n",
" autopct=None, \n",
" colors=colors, \n",
" startangle=90,\n",
" wedgeprops={'edgecolor': 'none'}, # Remove edges around sectors\n",
" pctdistance=0.70, # Places the labels closer to the center (inside)\n",
" labeldistance=0.2 # Ensure labels are positioned inside the sectors\n",
")\n",
"\n",
"# Add title\n",
"plt.title(\"Guest Journey - Variation Allocation\", fontsize=16)\n",
"\n",
"# Add total count to the bottom-left\n",
"plt.text(-1.4, -1.3, f\"Total Count: {total_count}\", fontsize=10, ha='left', color='black')\n",
"\n",
"# Add A/B test name and last update to the bottom-right\n",
"plt.text(1.2, -1.3, f\"A/B Test: {ab_test_name}\", fontsize=8, ha='right', color='gray')\n",
"plt.text(1.2, -1.4, f\"Last Update: {last_update}\", fontsize=8, ha='right', color='gray')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Statistical Analysis\n",
"In this section we compute the metrics needed for monitoring as well as check if there's any statistical difference between the different variations."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Z-test for Proportion Metrics (Rates)\n",
"This section defines the functions used to compute Z-test Proportion analysis"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"# Generalized function to calculate Z-test for any metric\n",
"def calculate_z_test(df, metric_name, variation_a, variation_b, success_counts, total_counts):\n",
"\n",
" # Aggregate the success counts (numerator) and total counts (denominator) for each variation\n",
" success_a = df[df['variation'] == variation_a][success_counts].sum()\n",
" success_b = df[df['variation'] == variation_b][success_counts].sum()\n",
"\n",
" total_a = df[df['variation'] == variation_a][total_counts].sum()\n",
" total_b = df[df['variation'] == variation_b][total_counts].sum()\n",
"\n",
" # Calculate conversion rates for each variation\n",
" value_A = success_a / total_a if total_a != 0 else 0\n",
" value_B = success_b / total_b if total_b != 0 else 0\n",
"\n",
" # Absolute difference (B - A)\n",
" abs_diff = value_B - value_A\n",
"\n",
" # Relative difference (B - A) / A\n",
" rel_diff = (value_B - value_A) / value_A if value_A != 0 else 0\n",
"\n",
" # Perform the z-test for proportions\n",
" count = [success_a, success_b] # Success counts for A and B\n",
" nobs = [total_a, total_b] # Total counts for A and B\n",
" \n",
" # Calculate z-stat and p-value\n",
" z_stat, p_value = proportions_ztest(count, nobs)\n",
" \n",
" # Flag for significance at 95% level (p-value < 0.05)\n",
" is_significant = p_value < 0.05\n",
"\n",
" # Return the result as a dictionary\n",
" return {\n",
" 'metric': metric_name,\n",
" 'variation_A_name': variation_a,\n",
" 'variation_B_name': variation_b,\n",
" 'variation_A_value': value_A,\n",
" 'variation_B_value': value_B,\n",
" 'absolute_difference': abs_diff,\n",
" 'relative_difference': rel_diff,\n",
" 'statistic': z_stat,\n",
" 'p_value': p_value,\n",
" 'is_significant_95': is_significant\n",
" }\n",
"\n",
"# Function to run Z-tests for multiple metrics and aggregate results into a DataFrame\n",
"def run_z_tests(df, z_stat_metric_definition, variations):\n",
" results = []\n",
" \n",
" # Loop over all metrics in z_stat_metric_definition\n",
" for metric_name, metric_definition in z_stat_metric_definition.items():\n",
" success_counts = metric_definition['success_counts']\n",
" total_counts = metric_definition['total_counts']\n",
" \n",
" # Run the Z-test for each metric\n",
" result = calculate_z_test(df, metric_name, variation_a=variations[0], variation_b=variations[1], \n",
" success_counts=success_counts, total_counts=total_counts)\n",
" results.append(result)\n",
" \n",
" # Create a DataFrame from the results\n",
" results_df = pd.DataFrame(results)\n",
" \n",
" return results_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### T-test for non-proportion metrics\n",
"This section defines the functions used to compute T-tests for metrics outside of the proportion scope, mostly Revenue-related metrics."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"\n",
"# Generalized function to calculate T-test for revenue-related metrics\n",
"def calculate_t_test(df, metric_name, variation_a, variation_b, metric_avg_column, metric_sdv_column, total_counts):\n",
" # Aggregate the avgs and standard deviations for each variation\n",
" mean_a = df[df['variation'] == variation_a][metric_avg_column].mean() # Assuming the avg is calculated for each group\n",
" mean_b = df[df['variation'] == variation_b][metric_avg_column].mean() # Assuming the avg is calculated for each group\n",
" \n",
" sdv_a = df[df['variation'] == variation_a][metric_sdv_column].mean() # Assuming the stddev is calculated for each group\n",
" sdv_b = df[df['variation'] == variation_b][metric_sdv_column].mean() # Assuming the stddev is calculated for each group\n",
" \n",
" total_a = df[df['variation'] == variation_a][total_counts].sum()\n",
" total_b = df[df['variation'] == variation_b][total_counts].sum()\n",
"\n",
" # Absolute difference (B - A)\n",
" abs_diff = mean_b - mean_a\n",
"\n",
" # Relative difference (B - A) / A\n",
" rel_diff = (mean_b - mean_a) / mean_a if mean_a != 0 else 0\n",
"\n",
" # Calculate the T-statistic and p-value using the formula for two-sample T-test\n",
" se_a = sdv_a / (total_a ** 0.5) if total_a != 0 else 0\n",
" se_b = sdv_b / (total_b ** 0.5) if total_b != 0 else 0\n",
"\n",
" # Standard error of the difference between the means\n",
" se_diff = (se_a ** 2 + se_b ** 2) ** 0.5\n",
" \n",
" # T-statistic formula\n",
" if se_diff != 0:\n",
" t_stat = (mean_a - mean_b) / se_diff\n",
" else:\n",
" t_stat = 0\n",
" \n",
" # Degrees of freedom (for independent samples)\n",
" df_degrees = min(total_a - 1, total_b - 1) # Using the smaller of the two sample sizes minus 1\n",
" \n",
" # P-value from the T-distribution\n",
" p_value = stats.t.sf(abs(t_stat), df_degrees) * 2 # Two-tailed test\n",
" \n",
" # Flag for significance at 95% level (p-value < 0.05)\n",
" is_significant = p_value < 0.05\n",
"\n",
" # Return the result as a dictionary\n",
" return {\n",
" 'metric': metric_name,\n",
" 'variation_A_name': variation_a,\n",
" 'variation_B_name': variation_b,\n",
" 'variation_A_value': mean_a,\n",
" 'variation_B_value': mean_b,\n",
" 'absolute_difference': abs_diff,\n",
" 'relative_difference': rel_diff,\n",
" 'statistic': t_stat,\n",
" 'p_value': p_value,\n",
" 'is_significant_95': is_significant\n",
" }\n",
"\n",
"# Function to run T-tests for multiple revenue metrics and aggregate results into a DataFrame\n",
"def run_t_tests(df, t_stat_metric_definition, variations):\n",
" results = []\n",
" \n",
" # Loop over all metrics in t_stat_metric_definition\n",
" for metric_name, metric_definition in t_stat_metric_definition.items():\n",
" metric_avg_column = metric_definition['metric_avg_column']\n",
" metric_sdv_column = metric_definition['metric_sdv_column']\n",
" total_counts = metric_definition['total_counts']\n",
" \n",
" # Run the T-test for each metric\n",
" result = calculate_t_test(df, metric_name, variation_a=variations[0], variation_b=variations[1], \n",
" metric_avg_column=metric_avg_column, metric_sdv_column=metric_sdv_column, \n",
" total_counts=total_counts)\n",
" results.append(result)\n",
" \n",
" # Create a DataFrame from the results\n",
" results_df = pd.DataFrame(results)\n",
" \n",
" return results_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Specify the metric definition for Z-stat and T-stat tests"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"# Define the Z-test metric definitions (with both success_counts and total_counts)\n",
"z_stat_metric_definition = {\n",
" 'conversion_rate': {\n",
" 'success_counts': 'guest_journey_completed_count',\n",
" 'total_counts': 'guest_journeys_count'\n",
" },\n",
" 'payment_rate': {\n",
" 'success_counts': 'guest_journey_with_payment_count',\n",
" 'total_counts': 'guest_journeys_count'\n",
" },\n",
" 'waiver_payment_rate': {\n",
" 'success_counts': 'waiver_count',\n",
" 'total_counts': 'guest_journeys_count'\n",
" },\n",
" 'deposit_payment_rate': {\n",
" 'success_counts': 'deposit_count',\n",
" 'total_counts': 'guest_journeys_count'\n",
" },\n",
" 'CIH_payment_rate': {\n",
" 'success_counts': 'check_in_cover_count',\n",
" 'total_counts': 'guest_journeys_count'\n",
" }\n",
"}\n",
"\n",
"# Define the T-test metric definitions (with both metric_avg_column and metric_sdv_column)\n",
"t_stat_metric_definition = {\n",
" 'avg_guest_revenue_per_gj': {\n",
" 'metric_avg_column': 'guest_revenue_avg_per_guest_journey',\n",
" 'metric_sdv_column': 'guest_revenue_sdv_per_guest_journey',\n",
" 'total_counts': 'guest_journeys_count'\n",
" },\n",
" 'avg_waiver_revenue_per_gj': {\n",
" 'metric_avg_column': 'waiver_avg_per_guest_journey',\n",
" 'metric_sdv_column': 'waiver_sdv_per_guest_journey',\n",
" 'total_counts': 'guest_journeys_count'\n",
" },\n",
" 'avg_deposit_revenue_per_gj': {\n",
" 'metric_avg_column': 'deposit_avg_per_guest_journey',\n",
" 'metric_sdv_column': 'deposit_sdv_per_guest_journey',\n",
" 'total_counts': 'guest_journeys_count'\n",
" },\n",
" 'avg_CIH_revenue_per_gj': {\n",
" 'metric_avg_column': 'check_in_cover_avg_per_guest_journey',\n",
" 'metric_sdv_column': 'check_in_cover_sdv_per_guest_journey',\n",
" 'total_counts': 'guest_journeys_count'\n",
" },\n",
" 'avg_csat_per_gj_with_response': {\n",
" 'metric_avg_column': 'csat_avg_per_guest_journey_with_response',\n",
" 'metric_sdv_column': 'csat_sdv_per_guest_journey_with_response',\n",
" 'total_counts': 'guest_journey_with_responses_count'\n",
" }\n",
"\n",
"}\n",
"\n",
"# Define the metrics that will be the main ones for this A/B test:\n",
"main_metrics = ['avg_guest_revenue_per_gj', 'conversion_rate', 'payment_rate']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Run the computation of the metrics and statistical significance"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" metric relative_difference p_value\n",
"0 conversion_rate 0.020046 0.816792\n",
"1 payment_rate 0.214947 0.234461\n",
"2 waiver_payment_rate 0.204474 0.328839\n",
"3 deposit_payment_rate 0.256842 0.581725\n",
"4 CIH_payment_rate 1.094737 0.279124\n",
"5 avg_guest_revenue_per_gj 0.193667 0.338740\n",
"6 avg_waiver_revenue_per_gj 0.177799 0.408923\n",
"7 avg_deposit_revenue_per_gj 0.062525 0.900604\n",
"8 avg_CIH_revenue_per_gj 1.226264 0.253386\n",
"9 avg_csat_per_gj_with_response 0.042689 0.500513\n"
]
}
],
"source": [
"# Call the function to calculate the Z-test for each metric and aggregate the results\n",
"z_test_results_df = run_z_tests(df, z_stat_metric_definition=z_stat_metric_definition, variations=variations)\n",
"\n",
"# Call the function to calculate the T-test for each metric and aggregate the results\n",
"t_test_results_df = run_t_tests(df, t_stat_metric_definition=t_stat_metric_definition, variations=variations)\n",
"\n",
"# Add a new column to identify whether it's from Z-test or T-test\n",
"z_test_results_df['test_type'] = 'Z-test'\n",
"t_test_results_df['test_type'] = 'T-test'\n",
"\n",
"# Combine the dataframes after adding the 'test_type' column\n",
"combined_results_df = pd.concat([z_test_results_df, t_test_results_df], ignore_index=True)\n",
"\n",
"# Print the main aggregated DataFrame\n",
"print(combined_results_df[['metric','relative_difference','p_value']])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Results\n"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"WelcomePageDestinationContext results (last updated at 2025-04-24)\n",
"\n",
"Total Guest Journeys affected by this A/B test: 389 - Total Guest Revenue: 2439 GBP.\n",
" Variation GenericImageAndCopy: Guest Journeys 199 (51.2%) - Guest Revenue: 1139 GBP (46.7%).\n",
" Variation ContextSpecificImageAndCopy: Guest Journeys 190 (48.8%) - Guest Revenue: 1299 GBP (53.3%).\n",
"\n",
"Main Metrics - Comparing ContextSpecificImageAndCopy vs. GenericImageAndCopy.\n",
"\n",
"CONVERSION RATE (not significant): 58.9% vs. 57.8% (1.2% ppts.| 2.0%).\n",
"PAYMENT RATE (not significant): 30.5% vs. 25.1% (5.4% ppts.| 21.5%).\n",
"AVG GUEST REVENUE PER GJ (not significant): 6.84 vs. 5.73 (1.11 ppts.| 19.4%).\n",
"\n",
"Other Metrics\n",
"\n",
"WAIVER PAYMENT RATE (not significant): 24.2% vs. 20.1% (4.1% ppts.| 20.4%).\n",
"DEPOSIT PAYMENT RATE (not significant): 6.3% vs. 5.0% (1.3% ppts.| 25.7%).\n",
"CIH PAYMENT RATE (not significant): 3.2% vs. 1.5% (1.7% ppts.| 109.5%).\n",
"AVG WAIVER REVENUE PER GJ (not significant): 6.17 vs. 5.24 (0.93 ppts.| 17.8%).\n",
"AVG DEPOSIT REVENUE PER GJ (not significant): 0.38 vs. 0.36 (0.02 ppts.| 6.3%).\n",
"AVG CIH REVENUE PER GJ (not significant): 0.28 vs. 0.13 (0.16 ppts.| 122.6%).\n",
"AVG CSAT PER GJ WITH RESPONSE (not significant): 3.88 vs. 3.72 (0.16 ppts.| 4.3%).\n"
]
}
],
"source": [
"print('\\n{} results (last updated at {})\\n'.format(ab_test_name, last_update))\n",
"\n",
"# Get main volume indicators per variation\n",
"grouped_data = df.groupby('variation')[[\"guest_journeys_count\",\"guest_revenue_sum\"]].sum()\n",
"\n",
"# Find the totals over any variation\n",
"total_count = grouped_data.sum()\n",
"\n",
"# Print overall indicators for volumes\n",
"print('Total Guest Journeys affected by this A/B test: {} - Total Guest Revenue: {} GBP.'.format(int(total_count.loc[\"guest_journeys_count\"]), \n",
" int(total_count.loc[\"guest_revenue_sum\"])))\n",
"for var in variations:\n",
" print(' Variation {}: Guest Journeys {} ({}%) - Guest Revenue: {} GBP ({}%).'.format(\n",
" var, \n",
" int(grouped_data.loc[var,'guest_journeys_count']), \n",
" round(100*(grouped_data.loc[var,'guest_journeys_count']/total_count.loc[\"guest_journeys_count\"]),1),\n",
" int(grouped_data.loc[var,'guest_revenue_sum']),\n",
" round(100*(grouped_data.loc[var,'guest_revenue_sum']/total_count.loc[\"guest_revenue_sum\"]),1)\n",
" ))\n",
"\n",
"# Split results whether the metrics are main metrics or not\n",
"main_metrics_rows = combined_results_df[combined_results_df['metric'].isin(main_metrics)]\n",
"other_metrics_rows = combined_results_df[~combined_results_df['metric'].isin(main_metrics)]\n",
"\n",
"def print_metrics(df, header=None):\n",
" if header:\n",
" print(f'\\n{header}\\n')\n",
"\n",
" for row in df.iterrows():\n",
" metric = row[1]['metric'].upper().replace('_', ' ')\n",
" if row[1]['test_type'] == 'Z-test':\n",
" value_a = str(round(100 * row[1]['variation_A_value'], 1)) + '%'\n",
" value_b = str(round(100 * row[1]['variation_B_value'], 1)) + '%'\n",
" abs_diff = str(round(100 * row[1]['absolute_difference'], 1)) + '%'\n",
" else:\n",
" value_a = str(round(row[1]['variation_A_value'], 2))\n",
" value_b = str(round(row[1]['variation_B_value'], 2))\n",
" abs_diff = str(round(row[1]['absolute_difference'], 2))\n",
" rel_diff = str(round(100 * row[1]['relative_difference'], 1)) + '%'\n",
" stat_sign = row[1]['is_significant_95']\n",
"\n",
" if stat_sign:\n",
" print(f\"{metric} - SIGNIFICANT RESULT: {value_b} vs. {value_a} ({abs_diff} ppts.| {rel_diff}).\")\n",
" else:\n",
" print(f\"{metric} (not significant): {value_b} vs. {value_a} ({abs_diff} ppts.| {rel_diff}).\")\n",
"\n",
"# Print main metrics\n",
"print_metrics(main_metrics_rows, header=\"Main Metrics - Comparing {} vs. {}.\".format(var_B, var_A))\n",
"\n",
"# Print other metrics\n",
"print_metrics(other_metrics_rows, header=\"Other Metrics\")\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}