data-jupyter-notebooks/ab_testing/ab_test_guest_journey_monitoring.ipynb
2025-07-08 12:26:29 +02:00

679 lines
78 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": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"🔌 Testing connection using credentials at: /home/joaquin/.superhog-dwh/credentials.yml\n",
"✅ Connection successful.\n"
]
}
],
"source": [
"# This script connects to a Data Warehouse (DWH) using PostgreSQL. \n",
"# This should be common for all Notebooks, but you might need to adjust the path to the `dwh_utils` module.\n",
"\n",
"import sys\n",
"import os\n",
"sys.path.append(os.path.abspath(\"../utils\")) # Adjust path if needed\n",
"\n",
"from dwh_utils import read_credentials, create_postgres_engine, query_to_dataframe, test_connection\n",
"\n",
"# --- Connect to DWH ---\n",
"creds = read_credentials()\n",
"dwh_pg_engine = create_postgres_engine(creds)\n",
"\n",
"# --- Test Query ---\n",
"test_connection()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"from statsmodels.stats.proportion import proportions_ztest\n",
"from scipy import stats"
]
},
{
"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": 13,
"metadata": {},
"outputs": [],
"source": [
"# A/B test name to measure\n",
"ab_test_name = 'YourTripQuestionaire'\n",
"\n",
"# Define the variations in which we want to run the tests\n",
"var_A = 'DontShowYourTripQuestions' # Ideally, this should be the control group\n",
"var_B = 'ShowYourTripQuestions' # 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 YourTripQuestionaire DontShowYourTripQuestions 2025-07-01 \n",
"1 YourTripQuestionaire ShowYourTripQuestions 2025-07-01 \n",
"\n",
" guest_journeys_count guest_journey_started_count \\\n",
"0 24169 24137 \n",
"1 2726 2724 \n",
"\n",
" guest_journey_completed_count guest_journey_with_responses_count \\\n",
"0 18454 6760 \n",
"1 2153 786 \n",
"\n",
" guest_journey_with_payment_count guest_revenue_count deposit_count ... \\\n",
"0 10159 10159 1916 ... \n",
"1 1190 1190 223 ... \n",
"\n",
" guest_revenue_avg_per_guest_journey guest_revenue_sdv_per_guest_journey \\\n",
"0 10.207814 15.711112 \n",
"1 10.247566 14.609434 \n",
"\n",
" deposit_avg_per_guest_journey deposit_sdv_per_guest_journey \\\n",
"0 0.53246 2.020852 \n",
"1 0.53625 2.000870 \n",
"\n",
" waiver_avg_per_guest_journey waiver_sdv_per_guest_journey \\\n",
"0 9.524052 15.745335 \n",
"1 9.518755 14.646680 \n",
"\n",
" check_in_cover_avg_per_guest_journey check_in_cover_sdv_per_guest_journey \\\n",
"0 0.151303 1.127958 \n",
"1 0.192561 1.268302 \n",
"\n",
" csat_avg_per_guest_journey_with_response \\\n",
"0 3.757249 \n",
"1 3.764631 \n",
"\n",
" csat_sdv_per_guest_journey_with_response \n",
"0 1.051046 \n",
"1 1.041469 \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",
"\treporting.core__ab_test_monitoring_guest_journey gj\n",
"where\n",
"\tgj.ab_test_name = '{}'\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": 15,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAf0AAAIYCAYAAABnrTUkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAk2tJREFUeJzs3XV4U2cfxvFvkiZ1N6hCgRZ3HS7DYcyZMWH2bsDc3R22wTamMJwJTGEMd3crFChQaKm7pJHz/pE1ENpCC23TNr/PdfWCnhx5Is19HjnPUSmKoiCEEEKIek9t7wIIIYQQomZI6AshhBAOQkJfCCGEcBAS+kIIIYSDkNAXQgghHISEvhBCCOEgJPSFEEIIByGhL4QQQjgICX0hhBDCQUjoV9LWrVt5+eWXGT58OF26dKFVq1Z069aNm266iTfffJNNmzbhaJMcLlq0iJiYGAYMGGDvoohy3HHHHcTExPDxxx9XaP23336bmJgYHnjggWot1/PPP09MTAyLFi2q1uNcKCYmhpiYmBo7XlUYPXo0MTExtG7dmszMzEuuW95rWvJ3+vzzz1dnUe1iwIABxMTEcObMGXsXpdaT0K+gjIwMxo8fz7hx4/j555/Jy8ujY8eODB06lPbt25ORkcHcuXO59957ueGGG+xd3ErZunUrMTEx3HXXXfYuiqgmN910EwC//fYbJpPpkusWFxfz559/2mxXV9x1113ExMSwdetWexelyuzbt48jR44AYDAY+OOPP+xcoppljxPD+szJ3gWoC3Jycrj99tuJj48nKiqK1157je7du5da7+jRo8ycOZMlS5bYoZRClG/o0KG8/fbbpKamsm7dOvr371/uuitXriQrKws/P79qb7158skneeCBBwgKCqrW41yorv19/vLLLwAEBweTnJzML7/8wt13323nUtUuM2fOxGAwEBwcbO+i1HpS06+At956i/j4eMLDw1mwYEGZgQ8QHR3Nu+++y6xZs2q4hEJcmqurKyNGjAC4bI2p5PHRo0ej1WqrtVxBQUE0adIET0/Paj3OhZo0aUKTJk1q7HhXo7CwkL///huADz/8EDc3N44ePcq+ffvsXLLaJSIigiZNmlT757U+kNC/jNOnT/PXX38B8MILL+Dt7X3Zbdq2bVtq2eX6nC7XhLV582YmTJhAr169aN26NT169ODRRx9l9+7dZa5/8uRJXnjhBQYMGEDr1q3p0KED/fv358EHH+TXX3+1rnfXXXcxbtw4ALZt22bt76zKPvpz587x1ltvMXjwYNq0aUOnTp0YO3YsCxYsKLOpeerUqcTExDB16tQy91ded8SFywsLC/nss88YNmwY7dq1sz6XC/s1CwoK+OSTT7j22mtp3bo1PXv25LnnniM5Obnc55KcnMx7771n3W+HDh248cYbmTNnDkaj0WbdO++8k5iYGOvnpyzffvstMTExPPbYY+WuU1VKmupXr15NRkZGmeskJyezceNGm/UzMjKYNWsWDzzwAAMGDKBt27Z07NiRG264gW+++Qa9Xl/mvi7sO//111+59dZb6dSpk83fQXmf+7y8PH766ScmTJjA4MGDad++Pe3bt2fUqFFMmTKFnJwcm/VL3vtt27YBMG7cOJvP8oX7v1SfflZWFpMnT2bEiBHW9/eGG27g22+/paioqNT6F37mDAYD33zzDSNGjKBt27Z069aNCRMmcPz48TKPVRH//PMPeXl5REdH0717d4YPHw6cr/1XpX379vHYY4/ZfMc8/PDD1s9DeTZv3sykSZPo06cPrVu3pnv37tx44418/vnnNuMPDAYDv//+O0899RRDhw6lY8eOtG3bliFDhvD222+X+rs7c+YMMTExLF68GLB8/174nl74/XCp79fCwkK++eYbrr/+ejp06EC7du0YMWIEU6ZMITs7u9T6JccdMGAAiqKwcOFCbrjhBtq3b0+nTp247777yv3erQukef8yVq9ejdlsxtvb+5JNotXpgw8+4IcffkCtVtO6dWs6depEUlISK1euZPXq1bz11lvceOON1vWPHj3KbbfdRl5eHo0bN6Z///6o1WqSk5PZvn07ycnJ1vV79+6NTqdjw4YNBAQE0Lt3b+t+fH19r7rs+/bt44EHHiArK4uQkBAGDRpEbm4u27ZtY/fu3SxfvpyvvvoKnU531ccqodfrueuuuzh+/DidO3emefPmZGVl2ayTm5vL2LFjSUpKolOnTjRr1ow9e/bw22+/sX37dn7//fdStc/t27fz6KOPkp2dTWhoKNdccw3FxcXs37+ft956i9WrVzN9+nRrbWPcuHFs376dOXPmMHLkyFLlNJvNzJ8/H7CcIFS3tm3bEh0dzdGjR/njjz+45557Sq2zePFiTCYT7dq1o1mzZgCsX7+ed955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du3asWrVKgBeeeUVRo0axZYtW1Crz58HvvnmmzzwwAPW3z09PWvo1RBCCFEtlCswY8YMxdvb2/q7yWRS3njjDSU0NFTR6XRKu3btlKVLl1ofB2x++vbtqyiKomzbtk0ZNGiQ4u/vr3h5eSl9+vRRdu7caXMsQFm8eHG5ZRk2bJgSGhqq5OXllXosMzPT+v9Tp04po0ePVtzd3RVPT0/l5ptvVs6dO2d9/O6771auu+46m+0fe+wxa1kVRVH69u2rTJw4UXnmmWcUX19fJTg4WHnttdesj0dGRto8z8jIyHLLXREtW7ZU3njjDevvzz33nNKrV69LbtOqVSvlzTfftFnWsWNH5aWXXlIURVGWLVumqNVqJTs72/p4VlaWolKplOXLl9s8lylTplxV+YWoq4qKipR33nlH+e2338p8fO7cuUpCQoKyevVq5cMPP1S++uor5auvvlK++eYb5fTp06XW3759u3Wd999/X/nkk0+sv584caJSZVu9erViMBguu15ycrLy8ccfK7m5udZlp0+fVqZMmaIUFhZW6phl+f33363P4c0331SmTp1q/b2oqMhm3bKWlcVsNisbNmxQpk6dqkybNk35/PPPlfXr1ytms/mqy1uWpKQkZf/+/VdU1iuRk5Oj/PDDD9Wy74qqktCfPHmy4uXlpcyfP1+JjY1Vnn32WUWr1SpHjx5VFMUS7oCyYsUKJSkpSUlPT1cURVFWrlypzJ49Wzl8+LBy6NAhZfz48UpwcLCSk5NzvoCXCP309HRFpVIp77777iXLazKZlPbt2yu9evVSduzYoWzZskXp1KmTTaBXNPS9vLyU119/XTl69Kjy448/KiqVSvn3338VRVGUlJQUBVBmzJihJCUlKSkpKYqiKEp8fLwCKKtXr75kOS8uc3h4uDJ16lTrshYtWiiPP/64ctNNNymBgYFK+/btlW+++cZmuwceeEDp3LmzcubMGcVsNiurVq1SPDw8lLVr1yqKoih//PGHotFobD7URUVFikajKXUCExwcrPj5+Snt27dXPvzwwwp90QhRH+zcuVOZMWOG8v777yt6vd7mMb1er3z22WeK2WxWVq9ebVPB2b9/f6m/yYstXrxY2bx58xWX7fXXX69waG/YsEGZP3++oiiKUlxcrEydOlU5duzYFR/7QiaTyfr/KVOmKElJSZdcpyJWrFihfP/990p+fr6iKIqSn5+vfP/999bv2Kq2e/du6+tjb5V9ra5UhZv3L+Xjjz/mueeeY+zYsQB88MEHrF69mk8//ZQvvviCwMBAAPz9/WnQoIF1uwEDBtjs55tvvsHHx4e1a9cycuTIyx732LFjKIpC8+bNL7neypUr2b9/P/Hx8YSHhwMwa9YsWrVqxfbt2+nSpUuFn2vbtm157bXXAGjWrBnTpk1j5cqV1v54AB8fH5vnqdVqiYmJwc3NrcLH+fjjj8nLy+OWW26xLjtx4gRfffUVTz75JC+++CLbt29n0qRJ6HQ67r77bgCmTp3Kgw8+SFhYGE5OTqjVar799lv69OkDQPfu3XF3d+e5557j3XffRVEUnn/+eUwmk00XzqRJk+jYsSN+fn5s2rSJF154gaSkJCZPnlzh5yBEXbV792769OnDzp07OXDgAB07drQ+FhcXR5MmTVCpVKW2KyoqwsXFpcLH0ev1LFu2jOTkZIxGI2FhYQwfPhyNRsO6devYv38/Go0GgLFjx7JhwwYAZsyYgUql4q677sLd3b3c/V9zzTXMmDGDvXv3kpSUROPGjWnSpAkbN25k7969qFQqgoODGT58OC4uLqxZs4aioiKGDh0KwLZt20hMTGTMmDHs2bOHvXv34urqSnp6OiNHjrR+n17ot99+Q6VSkZGRQX5+PhMmTOCNN97gueeew8XFhU8//ZSWLVty8uRJioqK6NSpEz179qS4uJjNmzfz0EMPWb8r3dzcGDVqFF9//TV9+vShsLCQ6dOn8/zzzwNQXFzMe++9Z/1OPnv2LCtWrECv16MoCr169aJVq1bk5+ezaNEi8vLyAAgJCWHQoEGsXr0avV7P9OnTCQsLY+TIkTZlTUxMZOnSpRQXF+Pk5MSQIUOIiIggKyuL6dOn061bN+Li4igqKmLYsGE0a9YMsIzRSktLw2Qy4e3tzejRo/Hw8LBuV1L+N954gz59+nDs2DEiIyPp27dvuZ+HqnLVoZ+Tk0NiYiI9e/a0Wd6zZ0/27t17yW2Tk5N5+eWXWbNmDSkpKZhMJgoKCjh9+nSFjq0oSoXWO3z4MOHh4TYf0JYtW+Lj48Phw4crHfoXatiwISkpKZfcJjQ0tFJjC+bNm8cbb7zB77//TlBQkHW52Wymc+fOvPvuuwB06NCBAwcOMH36dJvQ37JlC3/88QeRkZGsW7eORx991PohDwwM5Oeff+Z///sfn3/+OWq1mttuu42OHTva9Oc/+eSTNs9Zp9Px0EMP8d577+Hs7Fzh5yJEXZOamkp2djZNmjTBbDazYcMGm9CPjY2lffv21t/379/PyZMn0ev16PV67rzzzgof699//yUyMpLRo0ejKAp//vknW7ZsoWPHjmzatImnnnoKrVaLwWBApVIxcuRIdu7cyb333ms9uThy5AhHjhxh9OjRpfavUqkYM2YMM2bMsP4Nx8XFsWfPHsaPH4+Liwt//vknK1asqFBF68yZMzz00EMEBARccr2kpCTuvffecr8r8vPzeeCBBygsLOTrr78mIiICtVqNk5OTtfJUIjAwECcnJ1JTUy85dqyoqIi//vqL22+/HU9PTwoKCvj6668JDw/n4MGD+Pj4cNdddwFQWFiIq6sr/fv3JzY21lphvZDJZGLhwoWMGjWKpk2bcvr0aX766ScmTZoEWE7YgoOD6d+/P8eOHeOff/6xhv6QIUOsJ2MbNmxgzZo15b6+arXaOnbqzz//LPPzcHG+Xo0qqelfqbvvvpv09HQ+++wzIiMjcXZ2pkePHhQXF1do+2bNmqFSqapksJ5arS51EmEwGEqtp9VqbX5XqVSYzearPn6JBQsWcP/99/Pzzz8zaNAgm8caNmxIy5YtbZa1aNGCX3/9FbB8kF988UUWL17MiBEjAEtg79mzh48//ti6v8GDB3P8+HHS0tJwcnKytkxERUWVW65u3bphNBo5efIkMTExVfZ8hahtdu3aRbt27VCr1TRr1oy//vqL1NRUAgMDMZlMJCQkMGbMGOv6bdq0sdaMT5w4wcKFC5kwYUKp74qyxMbGcubMGTZv3gyA0WhEpVLh7OyMv78/ixcvJioqiujoaLy8vMrcR0xMzCX/Jv38/IiKiiI4OBidTseJEydo1aqV9aShc+fO/PzzzxV6bcLDwy8b+GCpVF2qctChQwdUKhVubm60aNGCEydO0LRp00vu83KvZ0JCApmZmcydO9dmeXp6OmFhYWzZsoVly5YRGRl52WMBpKWloVKprOtGRETg4eHBuXPn8PLywsnJiRYtWgAQFhZGRkaGddv9+/ezb98+jEYjRqPxkq28JQO1ofzPQ1W66tD38vIiJCSEjRs30rdvX+vyjRs30rVrVwB0Oh1gOXO60MaNG/nyyy8ZPnw4YHnT0tLSKnxsPz8/hgwZwhdffMGkSZNKNXNlZWXh4+NDixYtSEhIICEhwVrbP3ToEFlZWdYQDQwM5MCBAzbb79mzp0J/uBfSarWlnmdFzZ8/n/vuu48FCxZYQ/tCPXv2tLliAuDo0aNERkYClpMUg8FgU2MH0Gg0ZZ6YlPzxrlq1ipSUlDJrCiX27NmDWq22aXkQor4xmUzs27cPjUbD/v37Acvf1e7duxk8eDDx8fFERESU29waFRWF0WgkJSWF0NDQCh3zlltuwd/fv9Ty8ePHk5CQwMmTJ/nuu++48cYbrX/rlaVSqUp9L1z4WAm1Wm3zXWE0Gm3WLfkuv5yKrnehwMBAjEaj9QSrRGpqKmq1Gn9/fwoKCmwqZxeWT1EUAgMDGT9+fJn7f/jhhzlx4gSxsbGsXr2ahx56qNJlvJBGo7G+dhdWGk+fPs22bdsYP3487u7uHDlyhNWrV5e7n4tfq/I+D1WlSibneeaZZ/jggw9YuHAhR44c4fnnn2fPnj089thjAAQFBeHq6so///xDcnIy2dnZgKWmPnv2bA4fPszWrVu54447cHV1rdSxv/jiC0wmE127duXXX38lLi6Ow4cP8/nnn9OjRw8ABg0aRJs2bbjjjjvYtWsX27ZtY9y4cfTt25fOnTsDlvEFO3bsYNasWcTFxfHaa6+VOgmoiEaNGrFy5UrOnTtHZmYmYOlnat68Odu2bSt3u3nz5jFu3Dg++eQTunXrxrlz5zh37pz1tQJ44okn2LJlC++++y7Hjh1j3rx5fPPNNzz66KOA5QSsb9++PPPMM6xZs4b4+HhmzpzJrFmzuP766637mTFjBlu2bOH48ePMmTOHm2++mSeeeMJaW9i8eTOffvope/fu5cSJE8ydO5cnnniCO++80+byQCHqmyNHjuDr68uTTz7J448/zuOPP8748ePZt28fJpOJ2NjYS44hOnfuHMXFxfj4+FToeDExMWzYsMEatIWFhWRkZKDX68nPz7f280ZERHDu3DnAEhJFRUVX/ByjoqI4ePAger0egB07dtCkSRPAUpFKSkrCbDZjMBg4fPjwFR/nUkq6fgsLC4mNjSUq6v/t3X1MVfUfwPE3914u3AsIGiQNLt6riI1blCREy9hCFCjm5uaMdOpCZlTmprYaaz3MzdY/NRY10YZzs5T8I8DYMCaJCqnF0wCpO+VxZDeRRxEucB9+fzDPuHZ9oOiXv9/9vP5y55zv+X45987P/Z7P95zPYrRaLU8//TTl5eWMjY0BMDY2Rnl5OampqWg0GgIDA3G5XPT19bmdB6bvQgwNDdHR0aFss1qtOBwOBgcH0Wq1mM1mMjIy6O/vZ3JyEj8/P+U63C40NBSXy0V7ezswPSkdHR11W6/lyfj4OFqtFp1Oh8PhoL6+/r6vy52+D3NpTm7v79y5k+HhYfbs2cO1a9eIjY3lxIkTSn5Do9Hw2WefsXfvXt5//32ee+45qqurKSoqYvv27cTHx2MwGPjoo4946623ZtX34sWLaWhoYN++fezZs4fff/+dsLAwnnrqKfbv3w9M/5ItKyvjzTffJDk5GZVKRXp6OgUFBcp50tLSeO+993j77bex2WxkZ2ezZcsW5df+/frkk0/YvXs3X375JREREXR1dTE1NYXFYlG+yJ4cPHgQu93OG2+8oQRxmE6BHD58GICEhARKSkrIy8tj7969mEwm8vPz2bRpk3J8cXExeXl5bNq0iYGBARYtWsS+ffvIzc1VjrFYLOTl5TEwMIDRaOTdd99l165dyn4/Pz+Ki4v58MMPmZiYwGQysWvXLrc8vxD/jxobG3n88cfdtoWFhREUFITFYqG9vZ01a9a47b+V079l3bp1d11cN1N6ejqnTp2isLBQmY2vXr0ajUbD8ePHlRTjQw89xBNPPAHAM888w5EjR/D19WXz5s309vbeMafvydKlS7l27RpFRUVuC/lgOl3Y1tbGF198wbx58wgPD/eY5vy79Ho9Bw8exGazkZCQoNyBTU1Npba2lkOHDgHT7ybJyMhQ1lSoVCoyMjI4evSokhq4RafTsXHjRiorK6msrFQW0WVlZdHV1cWFCxeUdOzq1avx9/fHZDLx448/sn//fgwGg1veXa1W89JLL1FRUUFlZSUajYYNGzag1Wrv+n95dHQ0LS0tfP755+j1ekwmEyMjI/d1Xe70fViwYMGsr/Gd+LjudzWcEEJ4sd7eXs6ePcvGjRv/7aH8T8vPzycrK+ueM2aACxcucPHiRbZu3Xrfd0/E3UnQF0II8V8zm6Av5p4EfSGEEMJLPPBV9oQQQggxNyToCyGEEF5Cgr4QQgjhJSToCyGEEF5Cgr4QQgjhJSToCyGEEF5Cgr4QQgjhJf7VKntCCOHt5uplNTabjbq6OlauXOlxf1dXFydPnnR7Jfft9d3v1+117P/qmGajqqqKX375BY1Gg0qlIiUlRamA53K5qKio4MqVKwAkJSUpBd8uXrxIfX29Uhzn2WefVUqkNzU1cfLkSeVtfzqdTilT7snZs2dpamoCwGw2s2rVKmV7W1ubctzg4CDx8fGkpaV5PE9DQwO1tbW4XC6MRiMvvvgiarWaoaEhSktLsVqthISEuH1Wc0WCvhBC/B+w2WzU1NTMSYCdK3M5pqioKJKTk/H19cVqtXL48GF2796NVqulubmZ69evs2PHDiYmJjhw4ABGo5GHH36YsLAwsrOz8ff3Z3h4mAMHDhAZGam8z95oNJKVlXXP/ru7u2ltbSU3NxeVSsWhQ4cwGAzExMSQnJxMcnIyMF3579NPP/1TDYdbBgcHlSp/AQEBFBcXU19fT2JiIn5+fqSkpGCz2fjhhx/+9jXzRIK+EEI8gM6fP09raysOhwO1Wk16ejoGg0GZ1XZ2dqJWq1GpVGRnZ1NeXs7k5CSFhYWoVCq2b98+q/5uzfrj4+Npb2/H5XKRnp7O4sWLgelqfOfPn0er1f6p0uC3337L9evXlSI3a9euJTAw0OOYRkdHqaioYGhoCLvdzrJly0hJSbnn+G4VcANYuHAhLpeLsbExtFotly5dIj4+HpVKhU6nw2w209raSkpKijJ+gODgYAIDAxkZGZl1EZvW1lbi4uKUUrjLly+ntbWVmJgYt+N+/fVXpeS8J21tbSxbtozAwEAAVqxYwblz50hMTESn0xEVFeVWwGmuSdAXQogHUFxcnFIevLe3l9LSUnbs2IHVaqWzs5PXX38dHx8fbDYbarWazMxMCgsL/9Yt4YmJCUJDQ1mzZg29vb0cO3ZMqaJaXV3Nq6++SlBQEFVVVW7t0tLSlMqCNTU1VFdXk5mZ6XFMpaWlrFy5EqPRiNPp5OjRo1y6dAmz2czp06cJCgpSSp7fSWNjI/Pnzyc4OBiA4eFh5d8AISEh9Pb2/qldR0cHNpvNLSD39PRQWFiIr68vSUlJmM1mj32OjIwQFRXl1oen8uuNjY0sX778jmP3NNaZJdT/aRL0hRDiAWS1Wjl37hxjY2OoVCr6+/uZmppi/vz5OJ1OysrKMBqNxMTEKPnqv2JmW5VKxZNPPglAZGQkQUFBWK1WrFYrS5cuJSgoCJiendbU1CjtWlpaaG5uxm63Y7fb0ev1HvuanJyko6OD0dFRt239/f0APP/88/ccb0dHB2fOnGHz5s2z+rv/+OMPysrKWL9+vTJbj4mJwWw24+vrS19fH1999RXBwcFERkbe93lnGhoaoqenh/Xr1/+l9v8NEvSFEOIB43A4+Oabb9i6dSsRERFMTEzw8ccf43A48Pf357XXXqO7u5vOzk6qqqp45ZVXUKnu/jBWQEAA4+PjbtvGxsaUGfpszAy2PT09/PTTT2zbto2AgAAsFgunT5++a/ucnBw0mtmHn66uLsrKynj55ZcJDQ1VtgcHBzM8PIzBYACmg+/M2XRfXx/Hjh1j7dq1brP1mT9OwsLCiI6Opqenh8jISIqKipiamkKj0ZCTk8O8efPcZuS39wHTCwMfffRRdDqdsu348eMMDAwAsGXLFoKDgxkcHLzref5J8sieEEI8YOx2u5Ifh+kV6LfcvHmTqakplixZwqpVqwgJCaGvrw8/Pz+lnScLFixApVJx+fJlYHrFe11dnVvO2+l00tzcDMBvv/3GjRs3CA8Px2QyceXKFWWGXldXp7QZHx9Hq9Wi0+lwOBzU19cr+24fk1arxWQyud0luHHjBiMjI/e8Jt3d3ZSUlHh80iE2NpaGhgacTifj4+NKugCmA/7XX39NZmYmS5YscWs3s9/R0VG6urp45JFHANi2bRu5ubnk5OQA06v1m5ubmZycxG6309jYyGOPPaa0d7lcNDU1/enW/oYNG8jNzSU3Nxe9Xk9sbCwWi4XR0VHlM5h5nn+alNYVQoh/UX5+Pna73W2mnpOTQ0tLCz///DN6vR6z2cypU6d45513GBwc5LvvvsPhcOByuTAYDLzwwguo1WpOnDhBT08PWq3W40I+q9VKZWUlY2NjuFwuIiIiSEtLw8/Pz20hX0dHB06n864L+aqrq/nggw9wOByUlJRw9epV9Ho9JpOJy5cvK3n828d08+ZNvv/+e6xWKz4+Pvj6+pKZmUl4ePhdc/oFBQVMTEwoC+AA1q1bx8KFC3E6ncojez4+PiQmJpKUlATAkSNHuHr1qttsOjU1lejoaKqqqrBYLKhUKlwuFytWrCAhIeGOn9WZM2fcHtlLTU1V9rW3t1NeXs7OnTvvmXaor6+ntrYWgEWLFpGZmYlarWZqaoqCggIcDgc2m42AgADi4uLc+vm7JOgLIYT4y8/si/8tcntfCCGE8BIy0xdCCCG8hMz0hRBCCC8hQV8IIYTwEhL0hRBCCC8hQV8IIYTwEhL0hRBCCC8hQV8IIYTwEhL0hRBCCC8hQV8IIYTwEhL0hRBCCC/xHy/3+rxEU7RnAAAAAElFTkSuQmCC",
"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": 16,
"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": 17,
"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": 18,
"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": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" metric relative_difference p_value\n",
"0 conversion_rate 0.034395 0.002133\n",
"1 payment_rate 0.038553 0.104369\n",
"2 waiver_payment_rate 0.033479 0.235023\n",
"3 deposit_payment_rate 0.031911 0.643535\n",
"4 CIH_payment_rate 0.272450 0.072652\n",
"5 avg_guest_revenue_per_gj 0.003894 0.893715\n",
"6 avg_waiver_revenue_per_gj -0.000556 0.985831\n",
"7 avg_deposit_revenue_per_gj 0.007118 0.925383\n",
"8 avg_CIH_revenue_per_gj 0.272689 0.103764\n",
"9 avg_csat_per_gj_with_response 0.001965 0.850990\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": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"YourTripQuestionaire results (last updated at 2025-07-01)\n",
"\n",
"Total Guest Journeys affected by this A/B test: 26895 - Total Guest Revenue: 274647 GBP.\n",
" Variation DontShowYourTripQuestions: Guest Journeys 24169 (89.9%) - Guest Revenue: 246712 GBP (89.8%).\n",
" Variation ShowYourTripQuestions: Guest Journeys 2726 (10.1%) - Guest Revenue: 27934 GBP (10.2%).\n",
"\n",
"Main Metrics - Comparing ShowYourTripQuestions vs. DontShowYourTripQuestions.\n",
"\n",
"CONVERSION RATE - SIGNIFICANT RESULT: 79.0% vs. 76.4% (2.6% ppts.| 3.4%).\n",
"PAYMENT RATE (not significant): 43.7% vs. 42.0% (1.6% ppts.| 3.9%).\n",
"AVG GUEST REVENUE PER GJ (not significant): 10.25 vs. 10.21 (0.04 ppts.| 0.4%).\n",
"\n",
"Other Metrics\n",
"\n",
"WAIVER PAYMENT RATE (not significant): 35.1% vs. 34.0% (1.1% ppts.| 3.3%).\n",
"DEPOSIT PAYMENT RATE (not significant): 8.2% vs. 7.9% (0.3% ppts.| 3.2%).\n",
"CIH PAYMENT RATE (not significant): 2.3% vs. 1.8% (0.5% ppts.| 27.2%).\n",
"AVG WAIVER REVENUE PER GJ (not significant): 9.52 vs. 9.52 (-0.01 ppts.| -0.1%).\n",
"AVG DEPOSIT REVENUE PER GJ (not significant): 0.54 vs. 0.53 (0.0 ppts.| 0.7%).\n",
"AVG CIH REVENUE PER GJ (not significant): 0.19 vs. 0.15 (0.04 ppts.| 27.3%).\n",
"AVG CSAT PER GJ WITH RESPONSE (not significant): 3.76 vs. 3.76 (0.01 ppts.| 0.2%).\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
}