From ec7204a158709ed6916016a5691401d5238bf7ab Mon Sep 17 00:00:00 2001 From: wakura-mbuya Date: Fri, 20 May 2022 19:51:24 +0300 Subject: [PATCH 01/11] initialize dvc on the repo --- .dvc/.gitignore | 3 + .dvc/config | 0 .dvc/plots/confusion.json | 107 ++++++++++++++++++++++++ .dvc/plots/confusion_normalized.json | 112 ++++++++++++++++++++++++++ .dvc/plots/default.json | 31 +++++++ .dvc/plots/linear.json | 116 +++++++++++++++++++++++++++ .dvc/plots/scatter.json | 104 ++++++++++++++++++++++++ .dvc/plots/smooth.json | 39 +++++++++ .dvcignore | 3 + 9 files changed, 515 insertions(+) create mode 100644 .dvc/.gitignore create mode 100644 .dvc/config create mode 100644 .dvc/plots/confusion.json create mode 100644 .dvc/plots/confusion_normalized.json create mode 100644 .dvc/plots/default.json create mode 100644 .dvc/plots/linear.json create mode 100644 .dvc/plots/scatter.json create mode 100644 .dvc/plots/smooth.json create mode 100644 .dvcignore diff --git a/.dvc/.gitignore b/.dvc/.gitignore new file mode 100644 index 0000000..528f30c --- /dev/null +++ b/.dvc/.gitignore @@ -0,0 +1,3 @@ +/config.local +/tmp +/cache diff --git a/.dvc/config b/.dvc/config new file mode 100644 index 0000000..e69de29 diff --git a/.dvc/plots/confusion.json b/.dvc/plots/confusion.json new file mode 100644 index 0000000..af1b48d --- /dev/null +++ b/.dvc/plots/confusion.json @@ -0,0 +1,107 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v4.json", + "data": { + "values": "" + }, + "title": "", + "facet": { + "field": "rev", + "type": "nominal" + }, + "spec": { + "transform": [ + { + "aggregate": [ + { + "op": "count", + "as": "xy_count" + } + ], + "groupby": [ + "", + "" + ] + }, + { + "impute": "xy_count", + "groupby": [ + "rev", + "" + ], + "key": "", + "value": 0 + }, + { + "impute": "xy_count", + "groupby": [ + "rev", + "" + ], + "key": "", + "value": 0 + }, + { + "joinaggregate": [ + { + "op": "max", + "field": "xy_count", + "as": "max_count" + } + ], + "groupby": [] + }, + { + "calculate": "datum.xy_count / datum.max_count", + "as": "percent_of_max" + } + ], + "encoding": { + "x": { + "field": "", + "type": "nominal", + "sort": "ascending", + "title": "" + }, + "y": { + "field": "", + "type": "nominal", + "sort": "ascending", + "title": "" + } + }, + "layer": [ + { + "mark": "rect", + "width": 300, + "height": 300, + "encoding": { + "color": { + "field": "xy_count", + "type": "quantitative", + "title": "", + "scale": { + "domainMin": 0, + "nice": true + } + } + } + }, + { + "mark": "text", + "encoding": { + "text": { + "field": "xy_count", + "type": "quantitative" + }, + "color": { + "condition": { + "test": "datum.percent_of_max > 0.5", + "value": "white" + }, + "value": "black" + } + } + } + ] + } +} diff --git a/.dvc/plots/confusion_normalized.json b/.dvc/plots/confusion_normalized.json new file mode 100644 index 0000000..1d38849 --- /dev/null +++ b/.dvc/plots/confusion_normalized.json @@ -0,0 +1,112 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v4.json", + "data": { + "values": "" + }, + "title": "", + "facet": { + "field": "rev", + "type": "nominal" + }, + "spec": { + "transform": [ + { + "aggregate": [ + { + "op": "count", + "as": "xy_count" + } + ], + "groupby": [ + "", + "" + ] + }, + { + "impute": "xy_count", + "groupby": [ + "rev", + "" + ], + "key": "", + "value": 0 + }, + { + "impute": "xy_count", + "groupby": [ + "rev", + "" + ], + "key": "", + "value": 0 + }, + { + "joinaggregate": [ + { + "op": "sum", + "field": "xy_count", + "as": "sum_y" + } + ], + "groupby": [ + "" + ] + }, + { + "calculate": "datum.xy_count / datum.sum_y", + "as": "percent_of_y" + } + ], + "encoding": { + "x": { + "field": "", + "type": "nominal", + "sort": "ascending", + "title": "" + }, + "y": { + "field": "", + "type": "nominal", + "sort": "ascending", + "title": "" + } + }, + "layer": [ + { + "mark": "rect", + "width": 300, + "height": 300, + "encoding": { + "color": { + "field": "percent_of_y", + "type": "quantitative", + "title": "", + "scale": { + "domain": [ + 0, + 1 + ] + } + } + } + }, + { + "mark": "text", + "encoding": { + "text": { + "field": "percent_of_y", + "type": "quantitative", + "format": ".2f" + }, + "color": { + "condition": { + "test": "datum.percent_of_y > 0.5", + "value": "white" + }, + "value": "black" + } + } + } + ] + } +} diff --git a/.dvc/plots/default.json b/.dvc/plots/default.json new file mode 100644 index 0000000..9cf71ce --- /dev/null +++ b/.dvc/plots/default.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v4.json", + "data": { + "values": "" + }, + "title": "", + "width": 300, + "height": 300, + "mark": { + "type": "line" + }, + "encoding": { + "x": { + "field": "", + "type": "quantitative", + "title": "" + }, + "y": { + "field": "", + "type": "quantitative", + "title": "", + "scale": { + "zero": false + } + }, + "color": { + "field": "rev", + "type": "nominal" + } + } +} diff --git a/.dvc/plots/linear.json b/.dvc/plots/linear.json new file mode 100644 index 0000000..65549f9 --- /dev/null +++ b/.dvc/plots/linear.json @@ -0,0 +1,116 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v4.json", + "data": { + "values": "" + }, + "title": "", + "width": 300, + "height": 300, + "layer": [ + { + "encoding": { + "x": { + "field": "", + "type": "quantitative", + "title": "" + }, + "y": { + "field": "", + "type": "quantitative", + "title": "", + "scale": { + "zero": false + } + }, + "color": { + "field": "rev", + "type": "nominal" + } + }, + "layer": [ + { + "mark": "line" + }, + { + "selection": { + "label": { + "type": "single", + "nearest": true, + "on": "mouseover", + "encodings": [ + "x" + ], + "empty": "none", + "clear": "mouseout" + } + }, + "mark": "point", + "encoding": { + "opacity": { + "condition": { + "selection": "label", + "value": 1 + }, + "value": 0 + } + } + } + ] + }, + { + "transform": [ + { + "filter": { + "selection": "label" + } + } + ], + "layer": [ + { + "mark": { + "type": "rule", + "color": "gray" + }, + "encoding": { + "x": { + "field": "", + "type": "quantitative" + } + } + }, + { + "encoding": { + "text": { + "type": "quantitative", + "field": "" + }, + "x": { + "field": "", + "type": "quantitative" + }, + "y": { + "field": "", + "type": "quantitative" + } + }, + "layer": [ + { + "mark": { + "type": "text", + "align": "left", + "dx": 5, + "dy": -5 + }, + "encoding": { + "color": { + "type": "nominal", + "field": "rev" + } + } + } + ] + } + ] + } + ] +} diff --git a/.dvc/plots/scatter.json b/.dvc/plots/scatter.json new file mode 100644 index 0000000..9af9304 --- /dev/null +++ b/.dvc/plots/scatter.json @@ -0,0 +1,104 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v4.json", + "data": { + "values": "" + }, + "title": "", + "width": 300, + "height": 300, + "layer": [ + { + "encoding": { + "x": { + "field": "", + "type": "quantitative", + "title": "" + }, + "y": { + "field": "", + "type": "quantitative", + "title": "", + "scale": { + "zero": false + } + }, + "color": { + "field": "rev", + "type": "nominal" + } + }, + "layer": [ + { + "mark": "point" + }, + { + "selection": { + "label": { + "type": "single", + "nearest": true, + "on": "mouseover", + "encodings": [ + "x" + ], + "empty": "none", + "clear": "mouseout" + } + }, + "mark": "point", + "encoding": { + "opacity": { + "condition": { + "selection": "label", + "value": 1 + }, + "value": 0 + } + } + } + ] + }, + { + "transform": [ + { + "filter": { + "selection": "label" + } + } + ], + "layer": [ + { + "encoding": { + "text": { + "type": "quantitative", + "field": "" + }, + "x": { + "field": "", + "type": "quantitative" + }, + "y": { + "field": "", + "type": "quantitative" + } + }, + "layer": [ + { + "mark": { + "type": "text", + "align": "left", + "dx": 5, + "dy": -5 + }, + "encoding": { + "color": { + "type": "nominal", + "field": "rev" + } + } + } + ] + } + ] + } + ] +} diff --git a/.dvc/plots/smooth.json b/.dvc/plots/smooth.json new file mode 100644 index 0000000..d497ce7 --- /dev/null +++ b/.dvc/plots/smooth.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v4.json", + "data": { + "values": "" + }, + "title": "", + "mark": { + "type": "line" + }, + "encoding": { + "x": { + "field": "", + "type": "quantitative", + "title": "" + }, + "y": { + "field": "", + "type": "quantitative", + "title": "", + "scale": { + "zero": false + } + }, + "color": { + "field": "rev", + "type": "nominal" + } + }, + "transform": [ + { + "loess": "", + "on": "", + "groupby": [ + "rev" + ], + "bandwidth": 0.3 + } + ] +} diff --git a/.dvcignore b/.dvcignore new file mode 100644 index 0000000..5197305 --- /dev/null +++ b/.dvcignore @@ -0,0 +1,3 @@ +# Add patterns of files dvc should ignore, which could improve +# the performance. Learn more at +# https://dvc.org/doc/user-guide/dvcignore From 75d93c8a1f56472a7430e63a9720c18ff5884ea3 Mon Sep 17 00:00:00 2001 From: wakura-mbuya Date: Fri, 20 May 2022 20:39:14 +0300 Subject: [PATCH 02/11] added remote storage to dvc --- .gitignore | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++++ data.dvc | 5 +++ 2 files changed, 135 insertions(+) create mode 100644 .gitignore create mode 100644 data.dvc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8b8dda0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,130 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ +/data diff --git a/data.dvc b/data.dvc new file mode 100644 index 0000000..6a158eb --- /dev/null +++ b/data.dvc @@ -0,0 +1,5 @@ +outs: +- md5: a6c492b2df37afda6ece5788bbb1bdc1.dir + size: 784224 + nfiles: 1 + path: data From da464e95a0ae09482f291588cfe1a76a08438e7b Mon Sep 17 00:00:00 2001 From: wakura-mbuya Date: Fri, 20 May 2022 21:20:25 +0300 Subject: [PATCH 03/11] updated the dvc setting --- .dvc/config | 6 + notebooks/overview.ipynb | 1111 -------------------------------------- 2 files changed, 6 insertions(+), 1111 deletions(-) delete mode 100644 notebooks/overview.ipynb diff --git a/.dvc/config b/.dvc/config index e69de29..7299d1f 100644 --- a/.dvc/config +++ b/.dvc/config @@ -0,0 +1,6 @@ +[core] + remote = dvc-remote +['remote "myremote"'] + url = / +['remote "dvc-remote"'] + url = gdrive://10DQe4e2I6aGuSbFsEq029nHzL4zOdC8x diff --git a/notebooks/overview.ipynb b/notebooks/overview.ipynb deleted file mode 100644 index 987fba6..0000000 --- a/notebooks/overview.ipynb +++ /dev/null @@ -1,1111 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - ">> Import required Libraries" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "import os, sys\n", - "\n", - "import seaborn as sns" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - ">> Importing required modules" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "sys.path.append(os.path.abspath(os.path.join('../scripts')))\n", - "from plot import Plot" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - ">> Initialize plot class" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "pl = Plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - ">> Ignore warnings" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "import warnings\n", - "warnings.filterwarnings('ignore')\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - ">> Loading the Data" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.read_csv('../data/AdSmartABdata.csv')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - ">> #### Explore the data and identify the features" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
auction_idexperimentdatehourdevice_makeplatform_osbrowseryesno
00008ef63-77a7-448b-bd1e-075f42c55e39exposed2020-07-108Generic Smartphone6Chrome Mobile00
1000eabc5-17ce-4137-8efe-44734d914446exposed2020-07-0710Generic Smartphone6Chrome Mobile00
20016d14a-ae18-4a02-a204-6ba53b52f2edexposed2020-07-052E58236Chrome Mobile WebView01
300187412-2932-4542-a8ef-3633901c98d9control2020-07-0315Samsung SM-A705FN6Facebook00
4001a7785-d3fe-4e11-a344-c8735acacc2ccontrol2020-07-0315Generic Smartphone6Chrome Mobile00
\n", - "
" - ], - "text/plain": [ - " auction_id experiment date hour \\\n", - "0 0008ef63-77a7-448b-bd1e-075f42c55e39 exposed 2020-07-10 8 \n", - "1 000eabc5-17ce-4137-8efe-44734d914446 exposed 2020-07-07 10 \n", - "2 0016d14a-ae18-4a02-a204-6ba53b52f2ed exposed 2020-07-05 2 \n", - "3 00187412-2932-4542-a8ef-3633901c98d9 control 2020-07-03 15 \n", - "4 001a7785-d3fe-4e11-a344-c8735acacc2c control 2020-07-03 15 \n", - "\n", - " device_make platform_os browser yes no \n", - "0 Generic Smartphone 6 Chrome Mobile 0 0 \n", - "1 Generic Smartphone 6 Chrome Mobile 0 0 \n", - "2 E5823 6 Chrome Mobile WebView 0 1 \n", - "3 Samsung SM-A705FN 6 Facebook 0 0 \n", - "4 Generic Smartphone 6 Chrome Mobile 0 0 " - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Data overview\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "308" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df[(df['experiment'] == 'exposed') & (df['yes'] == 1)].shape[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "349" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df[(df['experiment'] == 'exposed') & (df['no'] == 1)].shape[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "264" - ] - }, - "execution_count": 63, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df[(df['experiment'] == 'control') & (df['yes'] == 1)].shape[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "322" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df[(df['experiment'] == 'control') & (df['no'] == 1)].shape[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plt.figure(figsize=(8, 4))\n", - "sns.countplot(df.yes, hue=df.experiment)" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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6Fvfl98/rkG315hOP/30IxMdnohGuXU2Ij4BFgPDI+LjiDgYEYeAXwH9k9VqgC5Zw0qALUm9JEfdzMwaST7vhuqYHFEgqTXwT8DbyTWIw64G1iTLLwKjJbWS1A3oDiyLiK3AbkkDkrugxgEv5KtvM7N/RENMfT5nzhx69+5Nr169uP3224HM92JMmDCBXr160bt3bx566CEA3n33XYYPH07fvn255JJLePvttwHYtGkTAwcOpF+/ftx5550N9v7yeRqqEzBTUhGZUJoXEb+T9J+SysicStoM3AQQEWslzQPWAQeASclpLICJQCXQmsxdUL4TysyajOypz1u2bMktt9zyuanP9+7de2Tq88WLF7Ns2TLWrVvHueeey/Dhw3n22WcZNGgQt99+O8uXL6ddu3YMHTqU559/ni5duvDRRx+xZk3m/9WffPIJABUVFTz++ON0796dt956i1tuuYVFixbxgx/8gIkTJzJu3DgeffTRBnuPeQuLiFgF9MlRH1vHmGnAtBz1KqBXgzZoZtZAGmLq85YtWzJ48GA6duwIwJgxY3jttde48847ee+997j11lv5xje+wdChQ9mzZw9vvPEGo0aNOrLNw/NUvf766zzzzDMAjB079sgRyonyJ7jNzE5QQ019nku7du1YuXIlf/jDH3j00UeZN28ev/jFLzjjjDOorq7OOSYfn1v23FBmZidoyJAhzJ8/n23btgGwa9cu3n//fSoqKpgyZQpjxoz53P/wD099fujQIZ566ikuvvhivva1r/Hqq6+yY8cODh48yJw5c7jsssvYsWMHhw4d4pprrmHKlCmsWLGCtm3b0q1bN55++mkgE1YrV64E4KKLLmLu3LkAzJ49u8Heo48szOyU09i3ujbU1Of33XcfX//614kIrrzySkaMGMHKlSu54YYbjlwEP3z0Mnv2bCZOnMjUqVP59NNPGT16NBdeeCEPP/ww119/PQ8//DDXXHNNg71HT1FeC09R/hlPUf4ZT1HeNOVjivJ8aUpTn3uKcjMza1A+DWVm1ohO1qnPfWRhZmapHBZmZpbKYWFmZqkcFmZmlsoXuM3slPPBvb0bdHuNccv05s2beeONN7j++uuPa1xlZSVVVVU88sgjeeosw0cWZmZNwObNm/ntb3+b87UDBw40cjfHcliYmTWAWbNmUVpayoUXXsjYsWN5//33GTJkCKWlpQwZMoQPPvgAgAkTJnDbbbcxaNAgzjvvPObPnw/A5MmT+eMf/0hZWRkPPfQQlZWVjBo1im9+85sMHTqUXbt2MXLkSEpLSxkwYACrVq1q1Pfn01BmZido7dq1TJs2jddff50OHTqwa9cuxo8fz7hx4xg/fjxPPPEEt912G88//zwAW7duZcmSJbz99ttcddVVXHvttfzsZz/73Ce7KysrWbp0KatWraJ9+/bceuut9OnTh+eff55FixYxbty4WicSzAcfWZiZnaBFixZx7bXX0qFDBwDat2/P0qVLj1x/GDt2LEuWLDmy/siRI2nRogU9evTg448/rnW7V1xxBe3btwdgyZIljB2b+YaHyy+/nJ07d/LnP/85X2/pGA4LM7MTFBGp04Jnv96qVavPja3N4SnNa1svH1OR18ZhYWZ2goYMGcK8efPYuXMnkJmifNCgQZ+bKvziiy+ucxtt2rRh9+7dtb5+6aWXHplyfPHixXTo0IG2bds20DtI52sWZnbKaezZgXv27MlPf/pTLrvsMoqKiujTpw/Tp0/nu9/9Lvfffz8dO3bkN7/5TZ3bKC0t5bTTTuPCCy9kwoQJtGvX7nOv33PPPdxwww2UlpbyhS98gZkzZ+bzLR3DU5TXwlOUf8ZTlH/GU5Q3TSfTFOVNSZOYolxSsaRlklZKWivp35N6e0kvS9qQ/GyXNeYOSRslvSNpWFa9r6TVyWvT1Zgn6szMLK/XLPYDl0fEhUAZMFzSAGAysDAiugMLk+dI6gGMBnoCw4FfSipKtvUYUAF0Tx7D89i3mZkdJW9hERl7kqctk0cAI4DDJ9tmAiOT5RHA3IjYHxGbgI1Af0mdgLYRsTQy58xmZY0xMwPqvqvIjnW8v6+83g0lqUhSNbANeDki3gK+FBFbAZKfZyWrdwY+zBpek9Q6J8tH13Ptr0JSlaSq7du3N+h7MbOmq7i4mJ07dzow6iki2LlzJ8XFxfUek9e7oSLiIFAm6QzgOUm96lg913WIqKOea38zgBmQucB9fN2a2cmqpKSEmpoa/J/E+isuLqakpKTe6zfKrbMR8YmkxWSuNXwsqVNEbE1OMW1LVqsBumQNKwG2JPWSHHUzMwBatmxJt27dCt3GKS2fd0N1TI4okNQa+CfgbeBFYHyy2njghWT5RWC0pFaSupG5kL0sOVW1W9KA5C6ocVljzMysEeTzyKITMDO5o6kFMC8ifidpKTBP0o3AB8AogIhYK2kesA44AExKTmMBTAQqgdbAS8nDzMwaSd7CIiJWAX1y1HcCQ2oZMw2YlqNeBdR1vcPMzPLIc0OZmVkqh4WZmaVyWJiZWSqHhZmZpXJYmJlZKoeFmZmlcliYmVkqh4WZmaVyWJiZWSqHhZmZpXJYmJlZKoeFmZmlcliYmVkqh4WZmaVyWJiZWSqHhZmZpXJYmJlZKoeFmZmlcliYmVmqvIWFpC6S/p+k9ZLWSvpBUr9H0keSqpPHlVlj7pC0UdI7koZl1ftKWp28Nl2S8tW3mZkd67Q8bvsA8C8RsUJSG2C5pJeT1x6KiAeyV5bUAxgN9ATOBl6R9JWIOAg8BlQAbwK/B4YDL+WxdzMzy5K3I4uI2BoRK5Ll3cB6oHMdQ0YAcyNif0RsAjYC/SV1AtpGxNKICGAWMDJffZuZ2bEa5ZqFpK5AH+CtpPR9SaskPSGpXVLrDHyYNawmqXVOlo+u59pPhaQqSVXbt29vyLdgZtas5T0sJJ0OPAP8MCL+QuaU0vlAGbAVePDwqjmGRx31Y4sRMyKiPCLKO3bseKKtm5lZIq9hIaklmaCYHRHPAkTExxFxMCIOAb8C+ier1wBdsoaXAFuSekmOupmZNZJ83g0l4NfA+oj4eVa9U9ZqVwNrkuUXgdGSWknqBnQHlkXEVmC3pAHJNscBL+SrbzMzO1Y+74a6CBgLrJZUndR+AlwnqYzMqaTNwE0AEbFW0jxgHZk7qSYld0IBTAQqgdZk7oLynVBmZo0ob2EREUvIfb3h93WMmQZMy1GvAno1XHdmZnY8/AluMzNL5bAwM7NUDgszM0vlsDAzs1QOCzMzS+WwMDOzVA4LMzNL5bAwM7NUDgszM0vlsDAzs1QOCzMzS+WwMDOzVPUKC0kL61MzM7NTU52zzkoqBr4AdEi+/vTwLLJtgbPz3JuZmTURaVOU3wT8kEwwLOezsPgL8Gj+2jIzs6akzrCIiIeBhyXdGhH/0Ug9mZlZE1OvLz+KiP+QNAjomj0mImblqS8zM2tC6hUWkv4TOB+oBg5/1WkADgszs2agvl+rWg70iIio74YldSETJv8TOATMiIiHJbUHniJzlLIZ+FZE/Hcy5g7gRjKBdFtE/CGp9+Wz7+D+PfCD4+nFzMxOTH0/Z7GGzD/6x+MA8C8RcQEwAJgkqQcwGVgYEd2BhclzktdGAz2B4cAvJRUl23oMqAC6J4/hx9mLmZmdgPoeWXQA1klaBuw/XIyIq2obEBFbga3J8m5J64HOwAhgcLLaTGAxcHtSnxsR+4FNkjYC/SVtBtpGxFIASbOAkcBL9ezdzMxOUH3D4p4T2YmkrkAf4C3gS0mQEBFbJZ2VrNYZeDNrWE1S+zRZPrqeaz8VZI5AOOecc06kZTMzy1Lfu6Fe/Ud3IOl04BnghxHxF0m1rppr13XUjy1GzABmAJSXl/uahplZA6nvdB+7Jf0leeyTdFDSX+oxriWZoJgdEc8m5Y8ldUpe7wRsS+o1QJes4SXAlqRekqNuZmaNpF5hERFtIqJt8igGrgEeqWuMMocQvwbWR8TPs156ERifLI8HXsiqj5bUSlI3MheylyWnrHZLGpBsc1zWGDMzawT1vWbxORHxvKTJKatdBIwFVkuqTmo/AX4GzJN0I/ABMCrZ5lpJ84B1ZO6kmhQRhz/TMZHPbp19CV/cNjNrVPX9UN4/Zz1tQeZzF3VeE4iIJeS+3gAwpJYx04BpOepVQK/69GpmZg2vvkcW38xaPkDmw3QjGrwbMzNrkup7N9QN+W7EzMyarvreDVUi6TlJ2yR9LOkZSSXpI83M7FRQ3+k+fkPmbqWzyXwg7v8kNTMzawbqGxYdI+I3EXEgeVQCHfPYl5mZNSH1DYsdkr4jqSh5fAfYmc/GzMys6ahvWHwX+BbwJzKTA14L+KK3mVkzUd9bZ6cA47O+d6I98ACZEDEzs1NcfY8sSg8HBUBE7CIzi6yZmTUD9Q2LFpLaHX6SHFn8Q1OFmJnZyae+/+A/CLwhaT6ZaT6+RY5pOczM7NRU309wz5JUBVxOZr6nf46IdXntzMzMmox6n0pKwsEBYWbWDNX3moWZmTVjDgszM0vlsDAzs1QOCzMzS+WwMDOzVA4LMzNLlbewkPRE8mVJa7Jq90j6SFJ18rgy67U7JG2U9I6kYVn1vpJWJ69Nl1Tb93qbmVme5PPIohIYnqP+UESUJY/fA0jqAYwGeiZjfimpKFn/MaAC6J48cm3TzMzyKG9hERGvAbvqufoIYG5E7I+ITcBGoL+kTkDbiFgaEQHMAkbmpWEzM6tVIa5ZfF/SquQ01eHJCTsDH2atU5PUOifLR9dzklQhqUpS1fbt2xu6bzOzZquxw+Ix4HygjMyXKD2Y1HNdh4g66jlFxIyIKI+I8o4d/a2vZmYNpVHDIiI+joiDEXEI+BXQP3mpBuiStWoJsCWpl+Som5lZI2rUsEiuQRx2NXD4TqkXgdGSWknqRuZC9rKI2ArsljQguQtqHPBCY/ZsZmZ5/AIjSXOAwUAHSTXA3cBgSWVkTiVtBm4CiIi1kuaRmdX2ADApIg4mm5pI5s6q1sBLycPMzBpR3sIiIq7LUf51HetPI8cXKkVEFdCrAVszM7Pj5E9wm5lZKoeFmZmlcliYmVkqh4WZmaVyWJiZWSqHhZmZpXJYmJlZKoeFmZmlcliYmVkqh4WZmaVyWJiZWSqHhZmZpXJYmJlZKoeFmZmlcliYmVkqh4WZmaVyWJiZWSqHhZmZpcpbWEh6QtI2SWuyau0lvSxpQ/KzXdZrd0jaKOkdScOy6n0lrU5emy5J+erZzMxyy+eRRSUw/KjaZGBhRHQHFibPkdQDGA30TMb8UlJRMuYxoALonjyO3qaZmeVZ3sIiIl4Ddh1VHgHMTJZnAiOz6nMjYn9EbAI2Av0ldQLaRsTSiAhgVtYYMzNrJI19zeJLEbEVIPl5VlLvDHyYtV5NUuucLB9dNzOzRtRULnDnug4RddRzb0SqkFQlqWr79u0N1pyZWXPX2GHxcXJqieTntqReA3TJWq8E2JLUS3LUc4qIGRFRHhHlHTt2bNDGzcyas8YOixeB8cnyeOCFrPpoSa0kdSNzIXtZcqpqt6QByV1Q47LGmJlZIzktXxuWNAcYDHSQVAPcDfwMmCfpRuADYBRARKyVNA9YBxwAJkXEwWRTE8ncWdUaeCl5mJlZI8pbWETEdbW8NKSW9acB03LUq4BeDdiamZkdp6ZygdvMzJowh4WZmaVyWJiZWSqHhZmZpXJYmJlZKoeFmZmlcliYmVkqh4WZmaVyWJiZWSqHhZmZpXJYmJlZKoeFmZmlcliYmVkqh4WZmaVyWJiZWSqHhZmZpXJYmJlZKoeFmZmlcliYmVmqgoSFpM2SVkuqllSV1NpLelnShuRnu6z175C0UdI7koYVomczs+askEcWX4+IsogoT55PBhZGRHdgYfIcST2A0UBPYDjwS0lFhWjYzKy5akqnoUYAM5PlmcDIrPrciNgfEZuAjUD/xm/PzKz5KlRYBLBA0nJJFUntSxGxFSD5eVZS7wx8mDW2JqkdQ1KFpCpJVdu3b89T62Zmzc9pBdrvRRGxRdJZwMuS3q5jXeWoRa4VI2IGMAOgvLw85zpmZnb8CnJkERFbkp/bgOfInFb6WFIngOTntmT1GqBL1vASYEvjdWtmZo0eFpK+KKnN4WVgKLAGeBEYn6w2HnghWX4RGC2plaRuQHdgWeN2bWbWvBXiNNSXgOckHd7/byPi/0r6L2CepBuBD4BRABGxVtI8YB1wAJgUEQcL0LeZWbPV6GEREe8BF+ao7wSG1DJmGjAtz62ZmVktmtKts2Zm1kQ5LMzMLJXDwszMUhXqcxZmdgL6/uusQrfQZCy/f1yhW2gWHBZmdlL74N7ehW6hyTjnrtV527ZPQ5mZWSqHhZmZpXJYmJlZKoeFmZmlcliYmVkqh4WZmaVyWJiZWSqHhZmZpXJYmJlZKoeFmZmlcliYmVkqh4WZmaVyWJiZWSqHhZmZpTppwkLScEnvSNooaXKh+zEza05OirCQVAQ8CvxvoAdwnaQehe3KzKz5OCnCAugPbIyI9yLi78BcYESBezIzazZOlm/K6wx8mPW8Bvja0StJqgAqkqd7JL3TCL2d8s6FDsCOQvfRJNytQndgR/HfZ5aG+fs8N1fxZAmLXL+BOKYQMQOYkf92mhdJVRFRXug+zHLx32fjOFlOQ9UAXbKelwBbCtSLmVmzc7KExX8B3SV1k/Q/gNHAiwXuycys2TgpTkNFxAFJ3wf+ABQBT0TE2gK31Zz41J41Zf77bASKOObUv5mZ2eecLKehzMysgBwWZmaWymFhdfI0K9ZUSXpC0jZJawrdS3PgsLBaeZoVa+IqgeGFbqK5cFhYXTzNijVZEfEasKvQfTQXDgurS65pVjoXqBczKyCHhdWlXtOsmNmpz2FhdfE0K2YGOCysbp5mxcwAh4XVISIOAIenWVkPzPM0K9ZUSJoDLAX+l6QaSTcWuqdTmaf7MDOzVD6yMDOzVA4LMzNL5bAwM7NUDgszM0vlsDAzs1QOCzMzS+WwMDOzVA4LszyS1FXSekm/krRW0gJJrSWVSXpT0ipJz0lqV+hezerisDDLv+7AoxHRE/gEuAaYBdweEaXAauDuwrVnls5hYZZ/myKiOlleDpwPnBERrya1mcClhWjMrL4cFmb5tz9r+SBwRoH6MPuHOSzMGt+fgf+WdEnyfCzwah3rmxXcaYVuwKyZGg88LukLwHvADQXux6xOnnXWzMxS+TSUmZmlcliYmVkqh4WZmaVyWJiZWSqHhZmZpXJYmJlZKoeFmZml+v+yBrzpqo5WDQAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plt.figure(figsize=(6, 4))\n", - "sns.countplot(df.no, hue=df.experiment)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['auction_id', 'experiment', 'date', 'hour', 'device_make',\n", - " 'platform_os', 'browser', 'yes', 'no'],\n", - " dtype='object')" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Explore the attributes of the data\n", - "df.columns" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 8077 entries, 0 to 8076\n", - "Data columns (total 9 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 auction_id 8077 non-null object\n", - " 1 experiment 8077 non-null object\n", - " 2 date 8077 non-null object\n", - " 3 hour 8077 non-null int64 \n", - " 4 device_make 8077 non-null object\n", - " 5 platform_os 8077 non-null int64 \n", - " 6 browser 8077 non-null object\n", - " 7 yes 8077 non-null int64 \n", - " 8 no 8077 non-null int64 \n", - "dtypes: int64(4), object(5)\n", - "memory usage: 568.0+ KB\n" - ] - } - ], - "source": [ - "# concise summary about dataset\n", - "df.info()\n", - "# No missing values" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
hourplatform_osyesno
count8077.0000008077.0000008077.0000008077.000000
mean11.6150805.9471340.0708180.083075
std5.7348790.2243330.2565370.276013
min0.0000005.0000000.0000000.000000
25%7.0000006.0000000.0000000.000000
50%13.0000006.0000000.0000000.000000
75%15.0000006.0000000.0000000.000000
max23.0000007.0000001.0000001.000000
\n", - "
" - ], - "text/plain": [ - " hour platform_os yes no\n", - "count 8077.000000 8077.000000 8077.000000 8077.000000\n", - "mean 11.615080 5.947134 0.070818 0.083075\n", - "std 5.734879 0.224333 0.256537 0.276013\n", - "min 0.000000 5.000000 0.000000 0.000000\n", - "25% 7.000000 6.000000 0.000000 0.000000\n", - "50% 13.000000 6.000000 0.000000 0.000000\n", - "75% 15.000000 6.000000 0.000000 0.000000\n", - "max 23.000000 7.000000 1.000000 1.000000" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Basic Statistical details\n", - "df.describe()" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Visualize the data\n", - "df.hist(bins=10, figsize=(28,12))\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(270,)" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df['device_make'].value_counts().shape\n", - "# 270 different devices" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6 7648\n", - "5 428\n", - "7 1\n", - "Name: platform_os, dtype: int64" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df['platform_os'].value_counts()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Chrome Mobile 4554\n", - "Chrome Mobile WebView 1489\n", - "Samsung Internet 824\n", - "Facebook 764\n", - "Mobile Safari 337\n", - "Chrome Mobile iOS 51\n", - "Mobile Safari UI/WKWebView 44\n", - "Chrome 3\n", - "Pinterest 3\n", - "Opera Mobile 3\n", - "Opera Mini 1\n", - "Edge Mobile 1\n", - "Android 1\n", - "Firefox Mobile 1\n", - "Puffin 1\n", - "Name: browser, dtype: int64" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df['browser'].value_counts()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(6834, 9)" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df[(df['yes'] == 0) & (df['no'] == 0)].shape\n", - "# df['yes'].value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "df.hour.value_counts().plot(kind='bar')" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "control 4071\n", - "exposed 4006\n", - "Name: experiment, dtype: int64" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.experiment.value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEpCAYAAAB/ZvKwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAaNUlEQVR4nO3df5Bd9X3e8fdjgYldmxjQ8iP6YRFGuAYSy0FlSCkODklQTMaCtLbFpIAaUtkUN/Y0kxjcP+y4o5Q4/lWmAY8wDDBxILKJgSlggxnbNDUYLyAQAmQEyLBIIBloUGKbInj6xz0Lh9XV7mr36N577vd5zdzZcz/nx3202v3cs99zzj2yTURElOEN/Q4QERG9k6YfEVGQNP2IiIKk6UdEFCRNPyKiIGn6EREF2affAaYyd+5cL1q0qN8xIiJa5e677/6J7ZGJ9YFv+osWLWJ0dLTfMSIiWkXSj7vVM7wTEVGQNP2IiIKk6UdEFCRNPyKiIGn6EREFSdOPiCjIlE1f0gJJ35H0kKQNkj5W1Q+UdKukR6qvB9TWuUDSJkkbJZ1Sqx8raX017yJJ2jv/rIiI6GY6e/o7gT+x/U7geOA8SUcB5wO32V4M3FY9p5q3AjgaWAZcLGlOta1LgFXA4uqxrMF/S0RETGHKi7NsbwW2VtM7JD0EzAOWAydVi10JfBf4RFW/xvaLwOOSNgHHSdoM7G/7DgBJVwGnATc38Q9ZdP6NTWzmdTZfeGrj24yI6Kc9GtOXtAh4N/AD4JDqDWH8jeHgarF5wJO11caq2rxqemI9IiJ6ZNpNX9JbgGuBj9t+YbJFu9Q8Sb3ba62SNCppdPv27dONGBERU5hW05e0L52G/1Xbf1+Vn5F0WDX/MGBbVR8DFtRWnw9sqerzu9R3YXuN7aW2l46M7PJ5QRERMUPTOXtHwGXAQ7a/UJt1A3B2NX02cH2tvkLSfpIOp3PA9q5qCGiHpOOrbZ5VWyciInpgOp+yeQJwJrBe0rqq9kngQmCtpHOAJ4APANjeIGkt8CCdM3/Os/1ytd65wBXAm+gcwG3kIG5EREzPdM7e+Qe6j8cDnLybdVYDq7vUR4Fj9iRgREQ0J1fkRkQUJE0/IqIgafoREQVJ04+IKEiafkREQdL0IyIKkqYfEVGQNP2IiIKk6UdEFCRNPyKiIGn6EREFSdOPiChImn5EREHS9CMiCpKmHxFRkDT9iIiCpOlHRBRkOvfIvVzSNkkP1Gp/J2ld9dg8fhtFSYsk/aw278u1dY6VtF7SJkkXVffJjYiIHprOPXKvAP4ncNV4wfaHxqclfR74x9ryj9pe0mU7lwCrgDuBm4Bl5B65ERE9NeWevu3bgee6zav21j8IXD3ZNiQdBuxv+w7bpvMGctoep42IiFmZ7Zj+icAzth+p1Q6XdK+k70k6sarNA8Zqy4xVtYiI6KHpDO9M5gxev5e/FVho+1lJxwLXSToa6DZ+791tVNIqOkNBLFy4cJYRIyJi3Iz39CXtA/w+8HfjNdsv2n62mr4beBQ4ks6e/fza6vOBLbvbtu01tpfaXjoyMjLTiBERMcFshnd+C3jY9qvDNpJGJM2ppn8ZWAw8ZnsrsEPS8dVxgLOA62fx2hERMQPTOWXzauAO4B2SxiSdU81awa4HcN8D3C/pPuDrwEdsjx8EPhf4CrCJzl8AOXMnIqLHphzTt33Gbuoru9SuBa7dzfKjwDF7mC8iIhqUK3IjIgqSph8RUZA0/YiIgqTpR0QUJE0/IqIgafoREQVJ04+IKEiafkREQdL0IyIKkqYfEVGQNP2IiIKk6UdEFCRNPyKiIGn6EREFSdOPiChImn5EREGmc+esyyVtk/RArfZpSU9JWlc93lebd4GkTZI2SjqlVj9W0vpq3kXVbRMjIqKHprOnfwWwrEv9i7aXVI+bACQdRec2ikdX61w8fs9c4BJgFZ375i7ezTYjImIvmrLp274deG6q5SrLgWtsv2j7cTr3wz1O0mHA/rbvsG3gKuC0GWaOiIgZms2Y/kcl3V8N/xxQ1eYBT9aWGatq86rpifWIiOihmTb9S4AjgCXAVuDzVb3bOL0nqXclaZWkUUmj27dvn2HEiIiYaEZN3/Yztl+2/QpwKXBcNWsMWFBbdD6wparP71Lf3fbX2F5qe+nIyMhMIkZERBczavrVGP2404HxM3tuAFZI2k/S4XQO2N5leyuwQ9Lx1Vk7ZwHXzyJ3RETMwD5TLSDpauAkYK6kMeBTwEmSltAZotkMfBjA9gZJa4EHgZ3AebZfrjZ1Lp0zgd4E3Fw9IiKih6Zs+rbP6FK+bJLlVwOru9RHgWP2KF1ERDQqV+RGRBQkTT8ioiBp+hERBUnTj4goSJp+RERB0vQjIgqSph8RUZA0/YiIgqTpR0QUJE0/IqIgafoREQVJ04+IKEiafkREQdL0IyIKkqYfEVGQNP2IiIKk6UdEFGTKpi/pcknbJD1Qq/2VpIcl3S/pG5LeVtUXSfqZpHXV48u1dY6VtF7SJkkXVffKjYiIHprOnv4VwLIJtVuBY2z/KvAj4ILavEdtL6keH6nVLwFW0blZ+uIu24yIiL1syqZv+3bguQm1W2zvrJ7eCcyfbBuSDgP2t32HbQNXAafNKHFERMxYE2P6fwjcXHt+uKR7JX1P0olVbR4wVltmrKpFREQP7TOblSX9V2An8NWqtBVYaPtZSccC10k6Gug2fu9JtruKzlAQCxcunE3EiIiomfGevqSzgd8D/qAassH2i7afrabvBh4FjqSzZ18fApoPbNndtm2vsb3U9tKRkZGZRoyIiAlm1PQlLQM+Abzf9k9r9RFJc6rpX6ZzwPYx21uBHZKOr87aOQu4ftbpIyJij0w5vCPpauAkYK6kMeBTdM7W2Q+4tTrz8s7qTJ33AJ+RtBN4GfiI7fGDwOfSORPoTXSOAdSPA0RERA9M2fRtn9GlfNlulr0WuHY380aBY/Yo3RBadP6NjW9z84WnNr7NiBhOszqQG8Mrb04RwykfwxARUZA0/YiIgqTpR0QUJE0/IqIgafoREQVJ04+IKEiafkREQdL0IyIKkqYfEVGQNP2IiIKk6UdEFCRNPyKiIGn6EREFSdOPiChImn5EREHS9CMiCjJl05d0uaRtkh6o1Q6UdKukR6qvB9TmXSBpk6SNkk6p1Y+VtL6ad1F1r9yIiOih6ezpXwEsm1A7H7jN9mLgtuo5ko4CVgBHV+tcPH6jdOASYBWdm6Uv7rLNiIjYy6Zs+rZvB56bUF4OXFlNXwmcVqtfY/tF248Dm4DjJB0G7G/7DtsGrqqtExERPTLTMf1DbG8FqL4eXNXnAU/WlhuravOq6Yn1iIjooaYP5HYbp/ck9e4bkVZJGpU0un379sbCRUSUbqZN/5lqyIbq67aqPgYsqC03H9hS1ed3qXdle43tpbaXjoyMzDBiRERMNNOmfwNwdjV9NnB9rb5C0n6SDqdzwPauaghoh6Tjq7N2zqqtExERPbLPVAtIuho4CZgraQz4FHAhsFbSOcATwAcAbG+QtBZ4ENgJnGf75WpT59I5E+hNwM3VIyIiemjKpm/7jN3MOnk3y68GVnepjwLH7FG6iIhoVK7IjYgoSJp+RERB0vQjIgqSph8RUZA0/YiIgkx59k7EIFt0/o2Nb3Pzhac2vs2IQZGmH9EDTb857Y03pryBliHDOxERBUnTj4goSJp+RERB0vQjIgqSph8RUZA0/YiIgqTpR0QUJE0/IqIgafoREQVJ04+IKMiMm76kd0haV3u8IOnjkj4t6ala/X21dS6QtEnSRkmnNPNPiIiI6ZrxZ+/Y3ggsAZA0B3gK+AbwH4Av2v5cfXlJRwErgKOBXwK+LenI2j10IyJiL2tqeOdk4FHbP55kmeXANbZftP04sAk4rqHXj4iIaWiq6a8Arq49/6ik+yVdLumAqjYPeLK2zFhV24WkVZJGJY1u3769oYgRETHrpi/pjcD7ga9VpUuAI+gM/WwFPj++aJfV3W2bttfYXmp76cjIyGwjRkREpYk9/d8F7rH9DIDtZ2y/bPsV4FJeG8IZAxbU1psPbGng9SMiYpqaaPpnUBvakXRYbd7pwAPV9A3ACkn7STocWAzc1cDrR0TENM3qzlmS3gz8NvDhWvmzkpbQGbrZPD7P9gZJa4EHgZ3AeTlzJyKit2bV9G3/FDhoQu3MSZZfDayezWtGRMTM5YrciIiCpOlHRBQkTT8ioiBp+hERBUnTj4goSJp+RERB0vQjIgqSph8RUZA0/YiIgqTpR0QUJE0/IqIgafoREQVJ04+IKEiafkREQdL0IyIKkqYfEVGQWTV9SZslrZe0TtJoVTtQ0q2SHqm+HlBb/gJJmyRtlHTKbMNHRMSeaWJP/722l9heWj0/H7jN9mLgtuo5ko4CVgBHA8uAiyXNaeD1IyJimvbG8M5y4Mpq+krgtFr9Gtsv2n4c2AQctxdePyIidmO2Td/ALZLulrSqqh1ieytA9fXgqj4PeLK27lhVi4iIHpnVjdGBE2xvkXQwcKukhydZVl1q7rpg5w1kFcDChQtnGTEiIsbNqunb3lJ93SbpG3SGa56RdJjtrZIOA7ZVi48BC2qrzwe27Ga7a4A1AEuXLu36xhARZVp0/o2Nb3Pzhac2vs1BNeOmL+lfAG+wvaOa/h3gM8ANwNnAhdXX66tVbgD+VtIXgF8CFgN3zSJ7RMTAGtQ3p9ns6R8CfEPS+Hb+1vY3Jf0QWCvpHOAJ4AMAtjdIWgs8COwEzrP98qzSR0TEHplx07f9GPCuLvVngZN3s85qYPVMXzMiImYnV+RGRBQkTT8ioiBp+hERBUnTj4goSJp+RERB0vQjIgqSph8RUZA0/YiIgqTpR0QUJE0/IqIgafoREQVJ04+IKEiafkREQdL0IyIKkqYfEVGQNP2IiIKk6UdEFGTGTV/SAknfkfSQpA2SPlbVPy3pKUnrqsf7autcIGmTpI2STmniHxAREdM3m3vk7gT+xPY9kt4K3C3p1mreF21/rr6wpKOAFcDRdG6M/m1JR+Y+uRERvTPjPX3bW23fU03vAB4C5k2yynLgGtsv2n4c2AQcN9PXj4iIPdfImL6kRcC7gR9UpY9Kul/S5ZIOqGrzgCdrq40x+ZtEREQ0bNZNX9JbgGuBj9t+AbgEOAJYAmwFPj++aJfVvZttrpI0Kml0+/bts40YERGVWTV9SfvSafhftf33ALafsf2y7VeAS3ltCGcMWFBbfT6wpdt2ba+xvdT20pGRkdlEjIiImtmcvSPgMuAh21+o1Q+rLXY68EA1fQOwQtJ+kg4HFgN3zfT1IyJiz83m7J0TgDOB9ZLWVbVPAmdIWkJn6GYz8GEA2xskrQUepHPmz3k5cyciordm3PRt/wPdx+lvmmSd1cDqmb5mRETMTq7IjYgoSJp+RERB0vQjIgqSph8RUZA0/YiIgqTpR0QUJE0/IqIgafoREQVJ04+IKEiafkREQdL0IyIKkqYfEVGQNP2IiIKk6UdEFCRNPyKiIGn6EREFSdOPiChIz5u+pGWSNkraJOn8Xr9+RETJetr0Jc0B/hr4XeAoOvfTPaqXGSIiStbrPf3jgE22H7P9/4BrgOU9zhARUaxeN/15wJO152NVLSIiekC2e/di0geAU2z/UfX8TOA42/95wnKrgFXV03cAGxuOMhf4ScPbbFobMkJyNi05m1VyzrfbHplY3KfhF5nKGLCg9nw+sGXiQrbXAGv2VghJo7aX7q3tN6ENGSE5m5aczUrOXfV6eOeHwGJJh0t6I7ACuKHHGSIiitXTPX3bOyV9FPgWMAe43PaGXmaIiChZr4d3sH0TcFOvX3eCvTZ01KA2ZITkbFpyNis5J+jpgdyIiOivfAxDRERB0vQjIgqSph8RUZCeH8jtNUmHAth+WtIIcCKwcdDOGpL0FmAZnesYdgKPALfYfqWvwSaQ9B7gGdsbJf0b4HjgIds39jnapCT9he1P9jvHRJJ+kc7/+zzAdK5b+Zbt/9vPXJORdDjwbuBB2w/3Ow+ApIXANts/lyRgJfBrwIPApbZ39jPfOEnvp/N7/fO+ZRjmA7mSPgycDwj4Szo/CBuAE4DP2r6sf+leI+mDwJ8C9wHvBb5P56+wXwH+wPb6PsZ7laQv0fn8pH3onHZ7MnAz8BvAvbb/tH/pXiPpookl4EzgKgDbf9zzUF1IOgv4FHAL8FRVng/8NvDntq/qV7Y6SdfZPq2aXg58Cfgu8K+B/277in5lGyfpATpX9/9U0l8CRwDXAb8JYPsP+xjvVZJ+Bvwznd+bq+m8wb/c0xC2h/YBrAfeDBwE/BNwaFU/AFjX73y1nPcDb66m51Y/CAC/Cny/3/lqOTfQaaBvBp6vZd4XeKDf+Wo5x4C/Ac4Czq4e28en+52vlnMj8LYu9QOAH/U7Xy3PvbXp7wOHV9Nzgfv6na/K8mBt+m7gDbXnA5Fx/HtZ/f/+R+A24Bngy8Bv9CrDsI/pv2T7p7afBR61/TSA7efp/Ck9KAT8rJr+Z+BgANv3A/v3K1QXducnd3zIafx7+AqDdXzonXQ+x2QZ8G3bVwI7bF9ZTQ8K0f3n8JVq3qCoZ9zH9uMAtn/Caz8L/fakpN+spjdTfdyLpIP6lqg7237e9qW2TwbeRWcI6kJJT06xbiOGfUz/FUn72n4JOHW8KOkXGKwmdRPwTUnfo3Ovga8BSDqQwfrlv1HS/wZ+AfgKsFbSnXSGd27va7Ia2zuAj0s6FvgbSTcyWP/f41YD90i6hdc+fXYhneGd/9a3VLt6l6QX6Pws7ifpUHeOkb2RzpX1g+CPgKskfRr4R2CdpPG96v/Sz2ATvO73udoRvQi4SNLbexKg+pNjKFUHd7ZWTb9enwe80/a3+5NsV5LeR+fGMvfZvrWqvQHY1/aLfQ1XI+nX6eyt3CnpCOB04Ang6x6wg84A1UG9/wT8uu1/3+88E0k6ADiFzoFc0Rma+lb11+hAk/Q2Or9Hd/Q7yzhJ7wSOpLNDOwb8cJB+LiWdZPu7fc0wzE2/rtpr9qD/MiVns9qSsy3a8P1sQ0boX85B/JO3MZIWSrpG0nbgB8APJW2raov6HO9VtZzbSM5Za8v/+2QkDcQZW9CO72cbMsKA5Oz30ey9+QDuAD4EzKnV5tD5SOc7+50vOYvP+fu7efxbYHu/87Xp+9mGjIOSc6iHdyQ9Ynvxns7rteRsVotyvgR8le5n8Pw722/tcaSu2vD9bENGGIycw372zt2SLgau5LWzIxbQOV/73r6l2lVyNqstOe8HPmf7gYkzJP1WH/LsThu+n23ICAOQc9j39N8InAMs5/VnR9wAXOYBOSsmOZvVopwnAj+2/USXeUttj/Yh1i7a8P1sQ0YYjJxD3fQjIuL1hvrsnW4k3dPvDNORnM1Kzma1IWcbMkLvcxbX9BmsK1wnk5zNSs5mtSFnGzJCj3OW2PQH+iOAa5KzWcnZrDbkbENG6HHOjOlHRBRkqPf0JT0n6SuSTq4+g2UgJWezkrNZbcjZhowwGDmHuunT+Qz1dcBngDFJ/0PS8f2N1FVyNis5m9WGnG3ICIOQs9+XJe/lS57vqU0vBP4MuAd4DPiLfudLzuRMznIyDkrOYd/Tf/XPJ9tP2P6s7V+j85n1A3GxRiU5m5WczWpDzjZkhAHIOewfw/CdbkXbG4E/73GWySRns5KzWW3I2YaMMAA5c/ZORERBhn1PH0mnAKfR+ZwLA1uA621/s5+5JkrOZiVns9qQsw0Zof85h3pPX9KX6Nw67So6H2oEMB84C3jE9sf6FO11krNZydmsNuRsQ0YYjJzD3vR/ZPvILnUBP/LgfMZ2cjYoOZvVhpxtyAiDkXPYz975uaTjutT/FfDzXoeZRHI2Kzmb1YacbcgIA5Bz2Mf0VwKXSHorr/0ptQB4oZo3KFaSnE1aSXI2aSWDn3Mlg58RBiDnUA/vjJN0KLUbFth+us+RukrOZiVns9qQsw0Zob85h314BwDbT9u+2507EX2k33l2JzmblZzNakPONmSE/uYsoulP8P5+B5im5GxWcjarDTnbkBF6nLPEpj+wn8A3QXI2Kzmb1YacbcgIPc5ZxJh+naQ32H6l3zmmkpzNSs5mtSFnGzJC73MOfdPv99Vv05WczUrOZrUhZxsyQv9zDnXTH4Sr36YjOZuVnM1qQ842ZITByDnsTb/vV79NR3I2Kzmb1YacbcgIg5Fz2A/k9v3qt2lKzmYlZ7PakLMNGWEAcuaK3MGwkuRs0kqSs0krGfycKxn8jDAAOYd6eGdcrtJrVnI2Kzmb04aM0N+cpTT9fW2/NKE21/ZP+pWpm+RsVnI2qw0525AR+ptzqMf0Jb1X0hiwRdItkhbVZt/Sp1i7SM5mJWez2pCzDRlhMHIOddMHPgucYnsEWAPcKun4at4gXa2XnM1Kzma1IWcbMsIg5LQ9tA/gvgnPjwY2AqcD9/Q7X3ImZ3KWk3FQcg772TsvSTrU1UES2xsknQz8L+CI/kZ7neRsVnI2qw0525ARBiDnsA/vnA8cUi/YHgNOAi7sR6DdSM5mJWez2pCzDRlhAHIWcfZORER0DPWevqRflHShpIclPVs9Hqpqb+t3vnHJ2azkbFYbcrYhIwxGzqFu+sBa4HngJNsH2T4IeG9V+1pfk71ecjYrOZvVhpxtyAgDkHOoh3ckbbT9jj2d12vJ2azkbFYbcrYhIwxGzmHf0/+xpD+T9OqBE0mHSPoE8GQfc02UnM1Kzma1IWcbMsIA5Bz2pv8h4CDge5Kel/Qc8F3gQOCD/Qw2QXI2Kzmb1YacbcgIA5BzqId3ACT9Szo3KbjT9j/V6ss8QHfUSc5mJWez2pCzDRlhAHL24gqwfj2AP6Zztdt1wGZgeW3eIF2ll5zJmZxDnnFQcvb9m7CXv8HrgbdU04uAUeBj1fN7+50vOZMzOcvJOCg5h/1jGOa4+vPJ9mZJJwFfl/R2ButDmJKzWcnZrDbkbENGGICcw34g92lJS8afVN/s3wPmAr/Sr1BdJGezkrNZbcjZhowwADmH+kCupPnATne5K42kE2z/nz7E2kVyNis5m9WGnG3ICIORc6ibfkREvN6wD+9ERERNmn5EREHS9CMiCpKmHxFRkDT9iIiC/H9URQ1RTpHSFgAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "df.date.value_counts().plot(kind='bar')" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(8077, 9)" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
experimentdatehourdevice_makeplatform_osbrowseryesno
auction_id
0008ef63-77a7-448b-bd1e-075f42c55e3911111111
000eabc5-17ce-4137-8efe-44734d91444611111111
0016d14a-ae18-4a02-a204-6ba53b52f2ed11111111
00187412-2932-4542-a8ef-3633901c98d911111111
001a7785-d3fe-4e11-a344-c8735acacc2c11111111
...........................
ffea24ec-cec1-43fb-b1d1-8f93828c2be211111111
ffea3210-2c3e-426f-a77d-0aa72e73b20f11111111
ffeaa0f1-1d72-4ba9-afb4-314b3b00a7c711111111
ffeeed62-3f7c-4a6e-8ba7-95d303d4096911111111
fffbb9ff-568a-41a5-a0c3-6866592f80d811111111
\n", - "

8077 rows × 8 columns

\n", - "
" - ], - "text/plain": [ - " experiment date hour device_make \\\n", - "auction_id \n", - "0008ef63-77a7-448b-bd1e-075f42c55e39 1 1 1 1 \n", - "000eabc5-17ce-4137-8efe-44734d914446 1 1 1 1 \n", - "0016d14a-ae18-4a02-a204-6ba53b52f2ed 1 1 1 1 \n", - "00187412-2932-4542-a8ef-3633901c98d9 1 1 1 1 \n", - "001a7785-d3fe-4e11-a344-c8735acacc2c 1 1 1 1 \n", - "... ... ... ... ... \n", - "ffea24ec-cec1-43fb-b1d1-8f93828c2be2 1 1 1 1 \n", - "ffea3210-2c3e-426f-a77d-0aa72e73b20f 1 1 1 1 \n", - "ffeaa0f1-1d72-4ba9-afb4-314b3b00a7c7 1 1 1 1 \n", - "ffeeed62-3f7c-4a6e-8ba7-95d303d40969 1 1 1 1 \n", - "fffbb9ff-568a-41a5-a0c3-6866592f80d8 1 1 1 1 \n", - "\n", - " platform_os browser yes no \n", - "auction_id \n", - "0008ef63-77a7-448b-bd1e-075f42c55e39 1 1 1 1 \n", - "000eabc5-17ce-4137-8efe-44734d914446 1 1 1 1 \n", - "0016d14a-ae18-4a02-a204-6ba53b52f2ed 1 1 1 1 \n", - "00187412-2932-4542-a8ef-3633901c98d9 1 1 1 1 \n", - "001a7785-d3fe-4e11-a344-c8735acacc2c 1 1 1 1 \n", - "... ... ... ... .. \n", - "ffea24ec-cec1-43fb-b1d1-8f93828c2be2 1 1 1 1 \n", - "ffea3210-2c3e-426f-a77d-0aa72e73b20f 1 1 1 1 \n", - "ffeaa0f1-1d72-4ba9-afb4-314b3b00a7c7 1 1 1 1 \n", - "ffeeed62-3f7c-4a6e-8ba7-95d303d40969 1 1 1 1 \n", - "fffbb9ff-568a-41a5-a0c3-6866592f80d8 1 1 1 1 \n", - "\n", - "[8077 rows x 8 columns]" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.groupby('auction_id').count()" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(7505, 9)" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df[df['yes'] == 0].shape" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(572, 9)" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df[df['yes'] == 1].shape" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(671, 9)" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df[df['no'] == 1].shape" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(7406, 9)" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df[df['no'] == 0].shape" - ] - } - ], - "metadata": { - "interpreter": { - "hash": "75f376effe886d8b51843b632a4b92665fc33b9300797299f553ce70034dd324" - }, - "kernelspec": { - "display_name": "Python 3.9.7 ('base')", - "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.9.7" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} From d4cf941ecc9dd45b6b6cfaacee576430b591e6b8 Mon Sep 17 00:00:00 2001 From: wakura-mbuya Date: Fri, 20 May 2022 21:21:12 +0300 Subject: [PATCH 04/11] moved files from personal repo to the organization repo --- ...ampaign-Classical-Hypothesis-Testing.ipynb | 693 ++++++++++++++++ notebooks/AD-campaign-data-EDA.ipynb | 785 ++++++++++++++++++ notebooks/AD-campaign-modellingj.ipynb | 43 + ...mpaign-sequential-Hypothesis-Testing.ipynb | 469 +++++++++++ scripts/ABTestingFunctions.py | 83 ++ scripts/DistributionPlots.py | 47 ++ scripts/HypothesisPlot.py | 81 ++ scripts/PlottingFunctions.py | 130 +++ ...atsApp Image 2022-05-18 at 7.51.21 PM.jpeg | Bin 0 -> 68119 bytes scripts/app.py | 35 + scripts/clean_data.py | 46 + scripts/load_data.py | 68 ++ scripts/multiapp.py | 51 ++ 13 files changed, 2531 insertions(+) create mode 100644 notebooks/AD-campaign-Classical-Hypothesis-Testing.ipynb create mode 100644 notebooks/AD-campaign-data-EDA.ipynb create mode 100644 notebooks/AD-campaign-modellingj.ipynb create mode 100644 notebooks/AD-campaign-sequential-Hypothesis-Testing.ipynb create mode 100644 scripts/ABTestingFunctions.py create mode 100644 scripts/DistributionPlots.py create mode 100644 scripts/HypothesisPlot.py create mode 100644 scripts/PlottingFunctions.py create mode 100644 scripts/WhatsApp Image 2022-05-18 at 7.51.21 PM.jpeg create mode 100644 scripts/app.py create mode 100644 scripts/clean_data.py create mode 100644 scripts/load_data.py create mode 100644 scripts/multiapp.py diff --git a/notebooks/AD-campaign-Classical-Hypothesis-Testing.ipynb b/notebooks/AD-campaign-Classical-Hypothesis-Testing.ipynb new file mode 100644 index 0000000..5f70b97 --- /dev/null +++ b/notebooks/AD-campaign-Classical-Hypothesis-Testing.ipynb @@ -0,0 +1,693 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "5952cd47-7038-4b5c-8766-334761eb5c7e", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import sys, os\n", + "import warnings\n", + "import scipy\n", + "import scipy.stats as scs\n", + "sys.path.append(os.path.abspath(os.path.join('../scripts')))\n", + "import ABTestingFunctions\n", + "import PlottingFunctions\n", + "from load_data import LoadData" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5cc3e37e-7e2c-4db5-9553-fedaf5095b44", + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "warnings.filterwarnings(\"ignore\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b219e648-efb9-4e5c-ae7e-80e6e79fbb63", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
auction_idexperimentdatehourdevice_makeplatform_osbrowseryesno
00008ef63-77a7-448b-bd1e-075f42c55e39exposed2020-07-108Generic Smartphone6Chrome Mobile00
1000eabc5-17ce-4137-8efe-44734d914446exposed2020-07-0710Generic Smartphone6Chrome Mobile00
20016d14a-ae18-4a02-a204-6ba53b52f2edexposed2020-07-052E58236Chrome Mobile WebView01
300187412-2932-4542-a8ef-3633901c98d9control2020-07-0315Samsung SM-A705FN6Facebook00
4001a7785-d3fe-4e11-a344-c8735acacc2ccontrol2020-07-0315Generic Smartphone6Chrome Mobile00
\n", + "
" + ], + "text/plain": [ + " auction_id experiment date hour \\\n", + "0 0008ef63-77a7-448b-bd1e-075f42c55e39 exposed 2020-07-10 8 \n", + "1 000eabc5-17ce-4137-8efe-44734d914446 exposed 2020-07-07 10 \n", + "2 0016d14a-ae18-4a02-a204-6ba53b52f2ed exposed 2020-07-05 2 \n", + "3 00187412-2932-4542-a8ef-3633901c98d9 control 2020-07-03 15 \n", + "4 001a7785-d3fe-4e11-a344-c8735acacc2c control 2020-07-03 15 \n", + "\n", + " device_make platform_os browser yes no \n", + "0 Generic Smartphone 6 Chrome Mobile 0 0 \n", + "1 Generic Smartphone 6 Chrome Mobile 0 0 \n", + "2 E5823 6 Chrome Mobile WebView 0 1 \n", + "3 Samsung SM-A705FN 6 Facebook 0 0 \n", + "4 Generic Smartphone 6 Chrome Mobile 0 0 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loader = LoadData()\n", + "ad_df = loader.read_csv('../data/AdSmartABdata.csv')\n", + "ad_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "df8b4fa0-a5f9-4c49-9cd2-5047be3185cb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1243, 9)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "respond_df = ad_df.query(\"not (yes == 0 & no == 0)\")\n", + "respond_df.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7f3f9168-b881-4a20-8b24-a78f33b94749", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
experimentawareness
auction_id
0016d14a-ae18-4a02-a204-6ba53b52f2edexposed0
008aafdf-deef-4482-8fec-d98e3da054daexposed1
00a1384a-5118-4d1b-925b-6cdada50318dexposed0
00b6fadb-10bd-49e3-a778-290da82f7a8dcontrol1
00ebf4a8-060f-4b99-93ac-c62724399483control0
.........
ffa08ff9-a132-4051-aef5-01a9c79367bcexposed1
ffb176df-ecd2-45d3-b05f-05b173a093a7exposed1
ffb79718-6f25-4896-b6b3-e58b80a6e147control0
ffca1153-c182-4f32-9e90-2a6008417497control0
ffdfdc09-48c7-4bfb-80f8-ec1eb633602bexposed0
\n", + "

1243 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " experiment awareness\n", + "auction_id \n", + "0016d14a-ae18-4a02-a204-6ba53b52f2ed exposed 0\n", + "008aafdf-deef-4482-8fec-d98e3da054da exposed 1\n", + "00a1384a-5118-4d1b-925b-6cdada50318d exposed 0\n", + "00b6fadb-10bd-49e3-a778-290da82f7a8d control 1\n", + "00ebf4a8-060f-4b99-93ac-c62724399483 control 0\n", + "... ... ...\n", + "ffa08ff9-a132-4051-aef5-01a9c79367bc exposed 1\n", + "ffb176df-ecd2-45d3-b05f-05b173a093a7 exposed 1\n", + "ffb79718-6f25-4896-b6b3-e58b80a6e147 control 0\n", + "ffca1153-c182-4f32-9e90-2a6008417497 control 0\n", + "ffdfdc09-48c7-4bfb-80f8-ec1eb633602b exposed 0\n", + "\n", + "[1243 rows x 2 columns]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "clean_df = respond_df[['auction_id', 'experiment', 'yes', 'no']]\n", + "clean_df['awareness'] = 0\n", + "clean_df.loc[clean_df['yes'] == 1, 'awareness'] = 1\n", + "clean_df.loc[clean_df['yes'] == 0, 'awareness'] = 0\n", + "clean_df.drop(columns=['yes', 'no'], inplace=True)\n", + "clean_df = clean_df.set_index('auction_id')\n", + "clean_df" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "67de33c3-fa02-44d0-b448-962b72d1e8d4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
awarenessnot awaretotalrate
experiment
control2643225860.450512
exposed3083496570.468798
\n", + "
" + ], + "text/plain": [ + " awareness not aware total rate\n", + "experiment \n", + "control 264 322 586 0.450512\n", + "exposed 308 349 657 0.468798" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "summary_df = clean_df.pivot_table( index='experiment', aggfunc='sum')\n", + "summary_df['total'] = clean_df.pivot_table( index='experiment', aggfunc='count')\n", + "summary_df['rate'] = clean_df.pivot_table( index='experiment')\n", + "summary_df['not aware'] = summary_df['total'] - summary_df['awareness']\n", + "summary_df = summary_df.reindex(['awareness', 'not aware', 'total', 'rate'], axis=1)\n", + "summary_df" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "03a7ac98-f6d5-46d1-97a9-8fde1c44e6dd", + "metadata": {}, + "outputs": [], + "source": [ + "exp_rate = summary_df['rate']['exposed']\n", + "cont_rate = summary_df['rate']['control']" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "eb9785a6-7dff-4e65-ab49-8b3acdd1626c", + "metadata": {}, + "outputs": [], + "source": [ + "exp_aware = summary_df['awareness']['exposed']\n", + "cont_aware = summary_df['awareness']['control']" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "4ae54fa9-8838-4999-90f8-c96b7dec6479", + "metadata": {}, + "outputs": [], + "source": [ + "exp_total = summary_df['total']['exposed']\n", + "cont_total = summary_df['total']['control']" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "3494fb5b-41fd-4175-aa7d-f175bffdd7ee", + "metadata": {}, + "outputs": [], + "source": [ + "diff = exp_rate - cont_rate" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "d6f88fc0-d75b-4aac-80fa-bac79ef3f0c3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The difference between conversion rates of the test and control groups is 0.018285619295484168.\n" + ] + } + ], + "source": [ + "print(f'The difference between conversion rates of the test and control groups is {diff}.')" + ] + }, + { + "cell_type": "markdown", + "id": "62075bb6-9781-4504-959c-d9b0b885a0b4", + "metadata": {}, + "source": [ + "### Binomial Distributions" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "653ecbe3-fb81-4040-bfed-4238d923c3b2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(12, 6))\n", + "\n", + "xC = np.linspace(cont_aware - 49, cont_aware + 50, 100)\n", + "yC = scs.binom(cont_total, cont_rate).pmf(xC)\n", + "ax.bar(xC, yC, alpha=0.5, linestyle='--')\n", + "xE = np.linspace(exp_aware - 49, exp_aware + 50, 100)\n", + "yE = scs.binom(exp_total , exp_rate).pmf(xE)\n", + "ax.bar(xE, yE, alpha=0.5, linestyle='--')\n", + "plt.xlabel('awareness')\n", + "plt.ylabel('probability')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "7850ef75-b61e-4c30-bea9-84252257b415", + "metadata": { + "tags": [] + }, + "source": [ + "The distribution in blue is the probability of conversions for the control group while the distribution in orange is the probability of conversions for the exposed group. As we can see there is a difference the mean of the two distributions." + ] + }, + { + "cell_type": "markdown", + "id": "2795a364-5f34-403c-9bf5-ba4c10972707", + "metadata": {}, + "source": [ + "### Distribution of the sample means" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "35add995-0aa1-4380-8976-7a46e1e2368c", + "metadata": {}, + "outputs": [], + "source": [ + "# standard error of the mean\n", + "SE_C = np.sqrt(cont_rate * (1-cont_rate)) / np.sqrt(cont_total)\n", + "SE_E = np.sqrt(exp_rate * (1-exp_rate)) / np.sqrt(exp_total)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "44042f39-2879-4823-841e-9415da1c4357", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(10, 5))\n", + "x = np.linspace(.35, .6, 1000)\n", + "\n", + "yC = scs.norm(cont_rate, SE_C).pdf(x)\n", + "ax.plot(x, yC, label='Control')\n", + "ax.axvline(x=cont_rate, c='red', alpha=0.5, linestyle='--')\n", + "\n", + "yE = scs.norm(exp_rate, SE_E).pdf(x)\n", + "ax.plot(x, yE, label='Exposed')\n", + "ax.axvline(x=exp_rate, c='blue', alpha=0.5, linestyle='--')\n", + "\n", + "plt.legend()\n", + "plt.xlabel('Awareness Proportion')\n", + "plt.ylabel('PDF')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "574560d5-e1ed-42c3-a623-5bcd65cec3f3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.02055339057798332, 0.019468837373132736)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "std_cont = np.sqrt(cont_rate * (1 - cont_rate) / cont_total)\n", + "std_exp = np.sqrt(exp_rate * (1 - exp_rate) / exp_total)\n", + "std_cont, std_exp" + ] + }, + { + "cell_type": "markdown", + "id": "ea488649-a5eb-4a2a-82fd-9ecaac604c2c", + "metadata": {}, + "source": [ + "### Null and Alternate hypothesis" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "b513155f-fa25-4bb8-bdb3-8982b8f6d342", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.6458981015684259, 0.2591726745827285)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "z_score = (diff) / np.sqrt(std_cont**2 + std_exp**2)\n", + "p_value = scs.norm().sf(z_score)\n", + "z_score, p_value" + ] + }, + { + "cell_type": "markdown", + "id": "d6b7bfd9-5c6a-4784-bdda-785a16e57d29", + "metadata": {}, + "source": [ + "The p-value is much greater than the significance level, We can't be confident about the significance of the lift" + ] + }, + { + "cell_type": "markdown", + "id": "6b2029a1-a314-4f5a-8ca7-99bddbd788d8", + "metadata": { + "tags": [] + }, + "source": [ + "### Optimal sample size" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "7557dab7-8353-4dde-a1ac-ca359b7a74ef", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "module 'ABTestingFunctions' has no attribute 'min_sample_size'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mpower\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m0.8\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0msig_level\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m0.05\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mmin_sample\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mround\u001b[0m\u001b[1;33m(\u001b[0m \u001b[0mABTestingFunctions\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmin_sample_size\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcont_rate\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdiff\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpower\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msig_level\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m: module 'ABTestingFunctions' has no attribute 'min_sample_size'" + ] + } + ], + "source": [ + "power = 0.8\n", + "sig_level = 0.05\n", + "min_sample = round( ABTestingFunctions.min_sample_size(cont_rate, diff, power, sig_level))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bfd755eb-3ecd-4186-8d00-74257c7a8f8d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/AD-campaign-data-EDA.ipynb b/notebooks/AD-campaign-data-EDA.ipynb new file mode 100644 index 0000000..884a809 --- /dev/null +++ b/notebooks/AD-campaign-data-EDA.ipynb @@ -0,0 +1,785 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fb5904ef-d21e-4a3e-ae40-61a5cb22312b", + "metadata": {}, + "source": [ + "# Ad Campaign Performance: Exploratory Data Analysis\n", + "The Ad Campaign Performance project conducts an A/B hypothesis testing on an Ad campaign. During the Ad campaign, SmartAd, a mobile first advertising company is running an online Ad for brand Lux. SmartAd company runs two versions of an Ad, a creative Ad which was presented to the exposed group and a dummy Ad which was presented to the control group. The main objective of the project is to determine through A/B hypothesis testing whether the creative Ad results to a significant lift in the brand awareness. This notebook conducts an exploratory data analysis on the data generated during the campaign. The data used in this notebook can be found here" + ] + }, + { + "cell_type": "markdown", + "id": "847c9fe6-18b8-41d9-a12c-a7a288b51078", + "metadata": {}, + "source": [ + "## Import the required packages" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "1e50f259-c9cc-49ba-8a41-c6e146bc608a", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import copy" + ] + }, + { + "cell_type": "markdown", + "id": "77446579-f395-4f7e-8d07-56da88083025", + "metadata": {}, + "source": [ + "## Load the data \n", + "We load the data from the csv file into a pandas DataFrame. We will use the LoadData class defined in the load_data module\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "6e75c35b-cb03-442d-892b-aba6ae6893c5", + "metadata": {}, + "outputs": [], + "source": [ + "#import LoadData class for loading the data\n", + "import sys\n", + "sys.path.append('../scripts')\n", + "from load_data import LoadData\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "bde5fc24-36bc-41d4-b212-36cb53bc0dba", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
auction_idexperimentdatehourdevice_makeplatform_osbrowseryesno
00008ef63-77a7-448b-bd1e-075f42c55e39exposed2020-07-108Generic Smartphone6Chrome Mobile00
1000eabc5-17ce-4137-8efe-44734d914446exposed2020-07-0710Generic Smartphone6Chrome Mobile00
20016d14a-ae18-4a02-a204-6ba53b52f2edexposed2020-07-052E58236Chrome Mobile WebView01
300187412-2932-4542-a8ef-3633901c98d9control2020-07-0315Samsung SM-A705FN6Facebook00
4001a7785-d3fe-4e11-a344-c8735acacc2ccontrol2020-07-0315Generic Smartphone6Chrome Mobile00
\n", + "
" + ], + "text/plain": [ + " auction_id experiment date hour \\\n", + "0 0008ef63-77a7-448b-bd1e-075f42c55e39 exposed 2020-07-10 8 \n", + "1 000eabc5-17ce-4137-8efe-44734d914446 exposed 2020-07-07 10 \n", + "2 0016d14a-ae18-4a02-a204-6ba53b52f2ed exposed 2020-07-05 2 \n", + "3 00187412-2932-4542-a8ef-3633901c98d9 control 2020-07-03 15 \n", + "4 001a7785-d3fe-4e11-a344-c8735acacc2c control 2020-07-03 15 \n", + "\n", + " device_make platform_os browser yes no \n", + "0 Generic Smartphone 6 Chrome Mobile 0 0 \n", + "1 Generic Smartphone 6 Chrome Mobile 0 0 \n", + "2 E5823 6 Chrome Mobile WebView 0 1 \n", + "3 Samsung SM-A705FN 6 Facebook 0 0 \n", + "4 Generic Smartphone 6 Chrome Mobile 0 0 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loader = LoadData()\n", + "ad_df = loader.read_csv('../data/AdSmartABdata.csv')\n", + "ad_df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "55cc6a4c-05bd-42f5-bacd-0aa6029eb9f0", + "metadata": {}, + "source": [ + "## Exploratory Data Analysis" + ] + }, + { + "cell_type": "markdown", + "id": "0202b8f9-5eb8-4293-9614-e5895a368de9", + "metadata": {}, + "source": [ + "##### Check the shape of the DataFrame" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "323bffa8-d56a-41b3-bb47-2b6b0e276f6b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(8077, 9)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ad_df.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ab13dbab-feca-43ba-9e26-be788238d479", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 8077 entries, 0 to 8076\n", + "Data columns (total 9 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 auction_id 8077 non-null object\n", + " 1 experiment 8077 non-null object\n", + " 2 date 8077 non-null object\n", + " 3 hour 8077 non-null int64 \n", + " 4 device_make 8077 non-null object\n", + " 5 platform_os 8077 non-null int64 \n", + " 6 browser 8077 non-null object\n", + " 7 yes 8077 non-null int64 \n", + " 8 no 8077 non-null int64 \n", + "dtypes: int64(4), object(5)\n", + "memory usage: 568.0+ KB\n" + ] + } + ], + "source": [ + "ad_df.info()" + ] + }, + { + "cell_type": "markdown", + "id": "d574da16-078f-4c92-863d-4bb47bc731a5", + "metadata": {}, + "source": [ + "The data loaded has 8077 rows and 9 columns" + ] + }, + { + "cell_type": "markdown", + "id": "71796978-ca0f-4bb4-a967-d1724ccb1d97", + "metadata": {}, + "source": [ + "#### Check the columns available in the data" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "1c55de4a-db64-4f0e-a233-298bf02bcd9f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['auction_id',\n", + " 'experiment',\n", + " 'date',\n", + " 'hour',\n", + " 'device_make',\n", + " 'platform_os',\n", + " 'browser',\n", + " 'yes',\n", + " 'no']" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ad_df.columns.tolist()" + ] + }, + { + "cell_type": "markdown", + "id": "b96d502c-c44b-4700-aafb-1b1392e87268", + "metadata": {}, + "source": [ + "The 9 columns in the dataset are:\n", + " \n", + "
    \n", + "
  1. auction-id
  2. \n", + "
  3. experiment
  4. \n", + "
  5. date
  6. \n", + "
  7. hour
  8. \n", + "
  9. device_make
  10. \n", + "
  11. platform_os
  12. \n", + "
  13. browser
  14. \n", + "
  15. yes
  16. \n", + "
  17. no
  18. \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "588b7610-77b3-4720-9873-88f0f57b7238", + "metadata": {}, + "source": [ + "#### Check the column types" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "0f227f22-dca0-4464-a75e-08b616cc9067", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "auction_id object\n", + "experiment object\n", + "date object\n", + "hour int64\n", + "device_make object\n", + "platform_os int64\n", + "browser object\n", + "yes int64\n", + "no int64\n", + "dtype: object" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ad_df.dtypes" + ] + }, + { + "cell_type": "markdown", + "id": "8943b3e0-0cf2-4959-98cf-75e64b96af44", + "metadata": {}, + "source": [ + "#### Check if the data has missing values" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "164ffa5b-826f-43b6-ab93-1ac30ec42e7f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "auction_id 0\n", + "experiment 0\n", + "date 0\n", + "hour 0\n", + "device_make 0\n", + "platform_os 0\n", + "browser 0\n", + "yes 0\n", + "no 0\n", + "dtype: int64" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ad_df.isna().sum()" + ] + }, + { + "cell_type": "markdown", + "id": "b16060a1-82d5-48f8-b29d-15ba9050e385", + "metadata": {}, + "source": [ + "The data has no missing values" + ] + }, + { + "cell_type": "markdown", + "id": "cd30e755-6fbc-4d1b-be13-2837e534309f", + "metadata": {}, + "source": [ + "### Univariete analysis and visualization\n", + "We conduct a univariate analysis on categorical columns and visualize the data in them" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "d52e59de-77f6-47fe-a3ce-521bb87174f9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Numerical Columns: ['hour', 'platform_os', 'yes', 'no']\n", + "****************\n", + "Categorical Columns: ['auction_id', 'experiment', 'date', 'device_make', 'browser']\n" + ] + } + ], + "source": [ + "#Determine the numerical and categorical data\n", + "numerical_column = ad_df.select_dtypes(exclude=\"object\").columns.tolist()\n", + "categorical_column = ad_df.select_dtypes(include=\"object\").columns.tolist()\n", + "print(\"Numerical Columns:\", numerical_column)\n", + "print(\"****************\")\n", + "print(\"Categorical Columns:\", categorical_column)" + ] + }, + { + "cell_type": "markdown", + "id": "b5f22744-44c5-46ce-9aa4-1a2697ee5b51", + "metadata": {}, + "source": [ + "##### browser column" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "fe8f77f0-b3a5-4750-8a8a-961e2e97fc15", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Chrome Mobile 4554\n", + "Chrome Mobile WebView 1489\n", + "Samsung Internet 824\n", + "Facebook 764\n", + "Mobile Safari 337\n", + "Chrome Mobile iOS 51\n", + "Mobile Safari UI/WKWebView 44\n", + "Pinterest 3\n", + "Chrome 3\n", + "Opera Mobile 3\n", + "Android 1\n", + "Edge Mobile 1\n", + "Firefox Mobile 1\n", + "Puffin 1\n", + "Opera Mini 1\n", + "Name: browser, dtype: int64" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plot_df= copy.deepcopy(ad_df)\n", + "ad_df['browser'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "0014a15c-8673-4702-98f0-9f5f2d544048", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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N6p9ExMTpQ4dOkiWlpbS33//LUlSwed9ixYtpPbt20uZmZmqbcr/Lsrzlog0G7uvEFGJ+O2337By5UqsXLkSq1atwqZNm3Djxg2UK1cOL1++RHZ2dq7XNG3aFNWqVVM9zsjIwIEDB1CrVi2MHTtWbd/WrVujY8eOePDgAaKioqCrqws7OztER0erui9cuHABkiShT58+SE9Px7Vr1wAAf/75J548eYI2bdoAAHJycgAAt2/fRnp6uuoz+vfvj+PHj6N///4AgKtXr+LOnTvo1asXLCws1Or5/vvvoaurm+dUex07dlR7rPy86Ohote0LFizAuXPnUL9+/Xy+1f+mqJ8bGhqKjIwMjB07FpUrV1btV6ZMGYwdOxY5OTkICgoCAERERCArKwseHh6oWLGiat+2bdvCwcHhvepzd3dH7dq1VY8bNGgAFxcXxMbGqu50dOrUCWXLlsX+/fvVXhsaGooqVarA3t7+vT6zqPL67nR1dbF+/XpcuHBB1TofGBgISZIwefJklC1bVrVv5cqVMXToUKSmpubqgvLP8x54e1cpMTERjx49Um2rXr06Dh48iO3bt3/w4yOiksfuK0RUIhYsWKA2+8qbN2/w559/Yvny5Vi8eDEePHiABQsWqL3m3UAGvO1ukZaWhqZNm0JLK3ebQrNmzXDo0CHcunULNjY2aN26NX799VdERkaibdu2OH/+PAwMDNC7d29s2rQJkZGRsLa2xqlTpwBAFcrt7OxgYmKCI0eOwM7ODnZ2dnB0dESbNm1Qo0YN1eddv34dAPDw4cM85wgvX748bt++DUmSoFAoALwNbsbGxmr79ejRAzt27IC/vz+2bt0KR0dHODo6wt7eHuXKlSv0u83ru8iPso73+dyYmBgAb/uU3717V+393rx5AwC4deuW2v//8yIFAJo0aaL6rouiadOmubY1btwYu3btUv03rlChAtq3b4+wsDDcu3cP9erVw507d3D79m24u7tDR6fgP3Pvfh+FeXff3r1748iRI/D09MSyZcvQqlUrODo6wtbWVm18hPIcOXz4MI4fP672fs+ePQMA3Lx5U237P897AOjbty/WrVuHLl26oFGjRnB0dETr1q3RqFGjItdPRPLGUE5EQpQrVw4WFhZYuXIl2rdvj3379mHo0KGoU6eOah99fX211yhbvD/55JM839PIyAjA2wGCAODo6AjgbZhUhvLmzZujXr16qFKliqq19dSpU6hataoqSJYtWxa7d+9GQEAADh48iMOHD+Pw4cPQ0tJChw4dMGfOHBgYGODly5eq1xcUNl+/fq1qOS1Tpkyu583NzbF7926sWbMGJ06cwO7du7F7926UK1cO7u7uGDduXIHhUfneWVlZ+e6j/E7e7V9d1M999eoVABQ4WDM5ORkAVN9J+fLlc+2j7IdfVFWqVMm1Tfm+yosBAOjevTvCwsIQFhYGT09PhIaGAkCuvtp5Kcp3p7xb8u5317p1a2zevBkbNmzA2bNnsWXLFmzZsgUGBgYYPXq0aqEh5Xe3bt26fN9f+d0p/fO8B4Dx48fjs88+w86dO3Ht2jVcvXoVK1aswBdffIFZs2ZxOlGiUoChnIiE0tPTQ5MmTRAREYHbt2+rhfJ/UgayuLi4PJ9XBkJl+DM2NoaZmRnOnTuH58+f488//1TN1NG8eXOcPHkSr1+/RmRkJLp06aIWfA0NDTF9+nRMmzYNt2/fxqlTpxASEoJDhw5BS0sLS5cuVbUm+/j4oFevXv/pezA3N8fSpUuRkZGBy5cv4+TJk9i3bx/WrFkDY2NjVZeZvCiP9/nz5/nuo/zO3u1+UtTPVR7nkSNHYGJiUuBxKLuspKSk5Pqs169fF/jaf1IG2nfFx8cDACpVqqTaZmdnB2NjY0RERMDT0xMHDx5EvXr18myt/ydljf/mu2vRogVatGiBN2/eICoqCsePH0dQUBDmzZuHTz/9FK1bt0a5cuWgra2Nq1evQldXt/CDzodCoUCvXr3Qq1cv/P333zh79ix+/fVXHD58GCNGjMDRo0ffeyAtEckL+5QTkXDKMJ1fC7hSnTp1oK+vj+jo6DynnVPOdV6vXj3VttatW+Pu3bv49ddfAbwNUgBgY2ODN2/e4JdffkFaWpqq64ryfebNm4eHDx9CoVDA3NwcQ4cOxZ49e1CuXDlVC7uZmRmA/+/e8a7MzEz4+vpiy5YthR5/cHAw5s6dC0mSoKenBxsbG0yaNEnVJUY5JV5+GjZsCF1dXVy6dEnV1/mflO9haWn53p+rPM5/9j0HgAcPHmDhwoU4evSoqpb8as7reypIXp935coVAOrdY7S0tODs7IwHDx7g8OHDePz4cZFayQHAysoKQO7ZeN6V13f3yy+/qKbVLFeuHBwdHTFz5kzMmjVL7TVmZmbIzs7O1UVFeSz+/v4FfjYAJCUlYcWKFap++1WqVIGzszOWL18ONzc3pKam4saNG0U6XiKSL4ZyIhLq6tWruHjxIipVqgRra+sC99XT00PXrl0RHx+P5cuXqz138uRJHDx4EJ999plaX+TWrVtDkiSsX78eBgYGqoBpY2MDANi4cSN0dXXVBgQmJCRgy5Yt2Lhxo9pnPH/+HOnp6aqp95o3b47atWsjMDAQly9fVtt33bp1+Pnnn1V9igty5coVbN26NdeAv8ePHwMAatasWeDry5Yti44dO+L+/ftYtWpVrufj4+MREBAAXV1duLi4vPfnuri4QFtbG0uXLkVCQoJqv6ysLMydOxcbN27EixcvAEA1PWBAQIDavlFRUargXlRbtmxBYmKi2ntERESgfv36aNy4sdq+yikBfX19oVAo4OzsXKTP+Oyzz2BlZYUzZ85g7969uZ7/448/sHXrVlSsWFFt2s7Tp09jzZo1qosEpSdPngD4/++uR48eAID58+erzZeekpKCH374AevXr89zkPO7ypcvj82bN2PJkiWq71kpNjZW7fOISHOx+woRlYgjR46oAgsAZGdn4969ezh+/Diys7Mxbdq0PPtb/9OkSZPw+++/Y/369YiMjESTJk3w6NEjHD16FOXLl4efn59aN5QmTZqgYsWKePLkCdq3b696rm7duqhatSqeP3+Oli1bqvUXbt++PZo0aYIdO3bgzp07sLKyQkpKCg4dOgQAqplftLW1sXDhQgwdOhQDBw7EV199BRMTE8TExOD8+fOoXbs2xo8fX+gx/e9//8PBgwcxceJERERE4LPPPsOTJ09w+PBhVKtWDQMHDiz0Pby8vHDjxg2sXLkSv/76K1q0aIFy5crh8ePHOHbsGNLS0jBjxgzUrVv3vT/3888/x6RJk+Dr64tu3bqhXbt2qFSpEk6ePIk//vgDbdu2VYX9WrVqYcqUKZgzZw569OiB9u3bIyUlBREREahRowYePnxY6LEo6ejowNXVFV26dMHff/+NiIgIlClTJteAYACoX78+GjZsiOvXr8PGxkZtQG5h5s2bh8GDB2PatGnYs2cPLC0toauri/v37+PEiRPQ0tLC4sWL1bqHjBkzBhcuXIC7uzucnJxgbGyMe/fu4dixY6hbt67q+7C1tcWgQYOwZcsWdO3aFa1bt4aenh6OHDmCp0+f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CcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCVasoXzZsmXo0qULunbtip9//hkAcPbsWTg7O6Njx45YsmSJat+bN2+iZ8+e6NSpE6ZPn46srCwAQGxsLAYMGAAnJyeMGDECr1+/Ls6SiYiIiIhKXLGF8osXL+L8+fMIDQ3F3r17sWXLFty6dQvTpk3D6tWrER4ejpiYGJw4cQIAMGnSJMyYMQOHDh2CJEnYvXs3AGD27Nno378/IiIiYGFhgdWrVxdXyUREREREQhRbKG/RogU2b94MHR0d/P3338jOzsbLly/x2WefwcTEBDo6OnB2dkZERASePHmCtLQ0WFlZAQDc3NwQERGBzMxMREZGolOnTmrbiYiIiIhKk2LtvqKrq4vly5eja9euaNmyJeLj41GtWjXV80ZGRoiLi8u1vVq1aoiLi0NSUhIqVKgAHR0dte1ERERERKWJTnF/wNixYzF06FB4eHjgwYMHuZ5XKBSQJOm9tr+PmJgYtcfNmjV7r9eXhEuXLokugYiIiIgEKrZQ/scffyAjIwNffvklypYti44dOyIiIgLa2tqqfeLj42FkZARjY2M8f/5ctT0hIQFGRkYwNDRESkoKsrOzoa2trdr+PiwsLKCvr//Bjqs4yPFCgYiIiIiKJj09PVdD8Psqtu4rjx8/hre3NzIyMpCRkYHffvsN/fr1w/379/HXX38hOzsb+/fvh6OjI2rVqgV9fX1Vi3FwcDAcHR2hq6sLa2trhIeHq20nIiIiIipNiq2lvHXr1rh69Sq6d+8ObW1tdOzYEV27doWhoSHGjBmD9PR0tG7dGk5OTgAAf39/eHt74/Xr12jQoAHc3d0BALNmzYKXlxcCAgJQo0YNLF68uLhKJiIiIiISQiHl1XG7FFDeRsir+0pCwFZBVeVWbcRA0SUQERER0X9QUO4sKq7oSUREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkWJFCeVxcXK5t9+7d++DFEBERERF9jAoM5S9evMCLFy8wdOhQJCcnqx4/f/4cI0eOLKkaiYiIiIhKNZ2CnpwwYQLOnDkDALCxsfn/F+nooH379sVbGRERERHRR6LAUL5hwwYAwNSpU7FgwYISKYiIiIiI6GNTYChXWrBgAZ48eYLk5GRIkqTa3rBhw2IrjIiIiIjoY1GkUO7v748tW7agSpUqqm0KhQK//fZbsRVGRERERPSxKFIoDw8Px+HDh2FsbFzc9RARERERfXSKNCVijRo1GMiJiIiIiIpJkVrKW7ZsiUWLFuGrr75CmTJlVNvZp5yIiIiI6L8rUijft28fACAiIkK1jX3KiYiIiIg+jCKF8qNHjxZ3HUREREREH60ihfKff/45z+2DBw/+oMUQEREREX2MihTK79y5o/p3RkYGLl26pLbCJxERERER/XtFXjzoXYmJiZg8eXKxFERERERE9LEp0pSI/2RoaIgnT5586FqIiIiIiD5K792nXJIkxMTEqK3uSURERERE/9579ykH3i4mxO4rREREREQfxnv1KX/y5AmysrLw2WefFWtRREREREQfkyKF8r/++gsjR45EfHw8cnJyULlyZaxduxZ169Yt7vqIiIiIiEq9Ig30nDNnDv73v/8hMjISly5dwogRIzB79uziro2IiIiI6KNQpFD+999/o0ePHqrHPXv2RFJSUrEVRURERET0MSlSKM/OzsaLFy9UjxMTE4urHiIiIiKij06R+pQPHDgQffv2RefOnQEABw8exDfffFOshRERERERfSyK1FLeunVrAEBmZib+/PNPxMXFoUOHDsVaGBERERHRx6JILeVeXl4YMGAA3N3dkZ6ejh07dmDatGlYv359cddHRERERFTqFamlPCkpCe7u7gAAfX19fPvtt0hISCjWwoiIiIiIPhZFHugZFxenevz8+XNIklRsRRERERERfUyK1H3l22+/Rffu3dGqVSsoFAqcPXsWkydPLu7aiIiIiIg+CkUK5b169YKFhQXOnz8PbW1tfPfddzA1NS3u2oiIiIiIPgpFCuUAYG5uDnNz8+KshYiIiIjoo1SkPuVERERERFR8GMqJiIiIiARjKCciIiIiEoyhnIiIiIhIMIZyIiIiIiLBGMqJiIiIiARjKCciIiIiEoyhnIiIiIhIMIZyIiIiIiLBGMqJiIiIiARjKCciIiIiEoyhnIiIiIhIMIZyIiIiIiLBGMqJiIiIiARjKCciIiIiEqxYQ/nKlSvRtWtXdO3aFYsWLQIAnD17Fs7OzujYsSOWLFmi2vfmzZvo2bMnOnXqhOnTpyMrKwsAEBsbiwEDBsDJyQkjRozA69evi7NkIiIiIqISV2yh/OzZszh9+jSCgoIQHByM69evY//+/Zg2bRpWr16N8PBwxMTE4MSJEwCASZMmYcaMGTh06BAkScLu3bsBALNnz0b//v0REREBCwsLrF69urhKJiIiIiISothCebVq1eDl5QU9PT3o6uqibt26ePDgAT777DOYmJhAR0cHzs7OiIiIwJMnT5CWlgYrKysAgJubGyIiIpCZmYnIyEh06tRJbTsRERERUWlSbKG8fv36qpD94MEDhIeHQ6FQoFq1aqp9jIyMEBcXh/j4eLXt1apVQ1xcHJKSklChQgXo6OiobSciIiIiKk10ivsD7t69i+HDh2PKlCnQ0dHB/fv31Z5XKBSQJCnX6wra/j5iYmLUHjdr1uy9Xl8SLl26JLoEIiIiIhKoWEP5pUuXMHbsWEybNg1du3bFxYsX8fz5c9Xz8fHxMDIygrGxsdr2hIQEGBkZwdDQECkpKcjOzoa2trZq+/uwsLCAvr7+Bzum4iDHCwUiIiIiKpr09PRcDcHvq9i6rzx9+hSjRo2Cv78/unbtCgCwtLTE/fv38ddffyE7Oxv79++Ho6MjatWqBX19fVWLcXBwMBwdHaGrqwtra2uEh4erbSciIiIiKk2KraV8w4YNSE9Ph6+vr2pbv3794OvrizFjxiA9PR2tW7eGk5MTAMDf3x/e3t54/fo1GjRoAHd3dwDArFmz4OXlhYCAANSoUQOLFy8urpKJiIiIiIRQSHl13C4FlLcR8uq+khCwVVBVuVUbMVB0CURERET0HxSUO4uKK3oSEREREQnGUE5EREREJBhDORERERGRYAzlRERERESCMZQTEREREQnGUE5EREREJBhDORERERGRYAzlRERERESCMZQTEREREQnGUE5EREREJBhDORERERGRYAzlRERERESCMZQTEREREQnGUE5EREREJBhDORERERGRYAzlRERERESCMZQTEREREQnGUE5EREREJBhDORERERGRYAzlRERERESCMZQTEREREQnGUE5EREREJBhDORERERGRYAzlRERERESCMZQTEREREQnGUE5EREREJBhDORERERGRYAzlRERERESCMZQTEREREQnGUE5EREREJBhDORERERGRYAzlRERERESCMZQTEREREQnGUE5EREREJBhD+UdIkiR4eXlhw4YNAIDs7GzMmjULXbp0QZcuXbBw4UJIklTge4wePRpz5sxRPT569Ci6du2KHj16IDo6WrXd29sbZ8+eLZ4DISIiIiolGMo/Mn/88Qe++eYbHDx4ULUtJCQE9+/fR1hYGEJCQnDx4kVERETk+x7r169HVFSU2rYVK1Zg06ZNmDVrFtavXw8AuHbtGl69egU7O7viORgiIiKiUkJHdAFUsrZt2wY3NzfUrFlTtS07OxupqanIyMhATk4OMjMzoa+vn+frz58/j1OnTqFfv354+fKlaruenh7S0tKQmpoKXV1dSJIEPz8/+Pr6FvsxEREREWk6hvKPzMyZMwG8DddKbm5uiIiIgKOjI7KysuDg4IB27drlem1cXBx8fHywYcMG7Nq1S+25SZMmwdPTE2XKlMHs2bMRGBgIW1tb1KpVq3gPiIiIiKgUYPcVwsqVK2FoaIgzZ87g5MmTePHiBTZu3Ki2T2ZmJsaPH49p06bByMgo13tYW1sjMDAQW7duRdWqVbFnzx7873//w5o1a+Dh4QF/f/+SOhwiIiIijcNQTvj111/Rs2dP6Onp4ZNPPkGPHj1w4cIFtX1iYmLw+PFj+Pr6wtXVFTt37kR4eDimT5+e6/2WLVuG4cOHIzY2FufOncOaNWvw4sULnDt3rqQOiYiIiEijsPsKoUGDBjh48CBsbW2RmZmJo0ePwtLSUm2fJk2a4MSJE6rHK1asQFJSkqo7jNKtW7cQGxuLr776Crdv34aOzttTTEtLC6mpqcV/MEREREQaiC3lMidlZRb7Z0ydOhUpKSlwcnJC9+7dUb16dQwdOhTA21bvZcuWFbkeX19fTJkyBQBgZmaGKlWqwNnZGc+fP0erVq2K7yCIiIiINJhCKmxCag2Vnp6OmJgYWFhY5JpJJCFgq6Cqcqs2YmCh+8SuGl8ClRRNzVGLRZdAREREJCsF5c6iYks5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIxlBMRERERCcZQTkREREQkGEM5EREREZFgDOVERERERIIx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/BgmJiZYsWKF6jlvb2+MHj0aN27cwOrVq1GmTBlMnDgRJiYmJXpcRERE9HHjQE/SKCkpKWjRogWCgoKwb98+dOrUCQBgYGCg2ufWrVsIDg5We50kSWrBHXi7SuPLly/h4OCABQsW4IcffoC7u3uu/ulERERExY2hnDRKfHw8Bg0ahJSUFADA6tWr0bVrVygUCtU+Wlpa8PHxwaNHjwAA27dvh5mZmdrUeMpVGidPngwAqtk1tLS0kJaWVoJHRERERMTuK1QMcrIyoKXz4Qf0AUCdOnUwbNgw9O7dGzk5OWjWrBlmzpyJ6OhoeHt7IyQkBKampvD29saIESOQnZ0NY2MjLF68WO19AgMDYWNjg9q1awMARowYgW+//RZ6enqYM2dOsdRORERElB+GcvrgtHT0cG5dt2J7/7oAZvbQBqAN4Boub+4FAPDqCtXnGgGY7gIA2mg57Jdc79G7d2+1xx06dECHDh2KrWYiIiKigrD7ChERERGRYAzlRERERESCMZQTEREREQnGUE5EREREJBhDORERERGRYAzlRERERESCMZQTEREREQnGUE5EREREJBhDORERERGRYAzlRERERESCMZQTEREREQnGUE5EREREJBhDORERERGRYAzlRERERESCMZQTEREREQnGUE5EREREJBhDORERERGRYAzlRERERESCMZQTEREREQnGUE5EREREJBhDORERERGRYAzlRERERESCMZQTEREREQnGUE5EREREJBhDORERERGRYAzlRERERESCMZQTEREREQnGUE5EREREJBhDORERERGRYAzlRCXkyJEjaNq0aZ7PnTp1Cm5ubnB1dUWPHj1w6tQpAEBGRgaGDx8OFxcXzJw5U7X/w4cPMXjw4BKpm4iIiIofQzlRCXjw4AEWLlwISZJyPffq1StMnDgRCxcuREhICBYsWABPT0+kpKTg1KlTMDY2RmhoKJ48eYI7d+4AAHx9fTFlypSSPgwiIiIqJgzlRMUsNTUVkyZNgpeXV57PZ2ZmYtasWahfvz4AoF69epAkCUlJSdDT00NaWhokSUJ6ejp0dXVx7NgxGBsbw9zcvCQPg4iIiIoRQzlRMZs5cyb69u0LMzOzPJ83NDREly5dVI+XL1+Ozz//HCYmJrC3t4euri66d++OFi1aoFatWggICMC4ceNKqHoiIiIqCTqiCyAqzbZt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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.set(style=\"whitegrid\")\n", + "plt.figure(figsize=(12,8))\n", + "total = float(len(ad_df))\n", + "ax = sns.countplot(x=\"browser\", data=ad_df)\n", + "ax.set_xticklabels(ax.get_xticklabels(), rotation=90)\n", + "plt.title('Browsers Used by Users', fontsize=20)\n", + "for p in ax.patches:\n", + " percentage = '{:.1f}%'.format(100 * p.get_height()/total)\n", + " x = p.get_x() + p.get_width()\n", + " y = p.get_height()\n", + " ax.annotate(percentage, (x, y),ha='center')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "abcbd456-5071-4627-bed8-402c040330fb", + "metadata": {}, + "source": [ + "- 56.4% of the users used Chrome Mobile browser to view the BIO questionnaire, 18.4% used Chrome Mobile WebView, 10.2% used Samsung Internet, 9.5% used Facebook, 4.2% used Mobile Safari , 0.6% used Chrome Mobile OS, and 0.5% used Mobile Safari UI/WKWebView. \n", + "\n", + "- The Chrome, Opera Mini, Edge Mobile, Android, Pinterest, Opera Mobile, Firefox Mobile and Puffin all had 0.0% users" + ] + }, + { + "cell_type": "markdown", + "id": "503f2b28-3ce2-4917-b6c8-06895159b993", + "metadata": {}, + "source": [ + "##### Top 10 Devices Used by Users" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "1886060b-9bf8-4b2a-a41f-de1c996cce2d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Generic Smartphone 4743\n", + "iPhone 433\n", + "Samsung SM-G960F 203\n", + "Samsung SM-G973F 154\n", + "Samsung SM-G950F 148\n", + "Samsung SM-G930F 100\n", + "Samsung SM-G975F 97\n", + "Samsung SM-A202F 88\n", + "Samsung SM-A405FN 87\n", + "Samsung SM-J330FN 69\n", + "Name: device_make, dtype: int64" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plot_df['device_make'].value_counts().head(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "4fba6fbc-9b0e-44df-b83f-50a6a4e9b4b7", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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0oOAWzCQYQ0aNDD+/vtvu8vIFjp37mz06tXLeO+994xp06Y5//MkTZo0SfXn4e+//zYCAwNtqMgewcHBxvnz5439+/cb5cqVMy5evGgYhmFcuXLFaN68uc3VuVbTpk2NY8eOpdh+/Phxo1mzZq4vyEb8fphatmxpGIZhhISEGKdOnXJuP3v2rPHUU0/ZVZYt2rZta2zbts04f/68MWLECCMkJMS4evWqYRiG0aJFC3uLc7FBgwY5v07t3w1P0q1bN+fX27dvt7GS2+N5k38zUbFixVSgQAG7y8gWzp07p48++sjuMmzlcDiUL1++FNvz5MnjUavCGIahQoUKqVChQmrRooXzdyRPnjyKj4+3uTrXio+PT/VmFiVLlvS45cP4/Ugpd+7cyaZ7FClSxONWwLh+/brzAv8333xTEyZMUI8ePTxy/e59+/Y5v+7Tp49Hj9KfO3fO+fW4cePcpheEagvuuecePfPMM6pevXqy+ZGeNOUhyUMPPaQDBw6obNmydpdimzZt2qht27Zq1KiR88/b586d07p169S6dWubq3OdChUqqG/fvpo0aZJGjx4tSTpx4oQmTZqU7ZdDymx169bVSy+9pKCgoGQ/EytXrlTt2rVtrs61+P0wXb58WUFBQUpISNC4ceM0ZMgQ7d27V9OnT1flypXtLs+l8uTJo02bNql27dpyOBwaMGCA+vbtq169eunatWt2l2cbTzvpvhV36gWh2oKAgADnxSae7vDhwwoJCVGRIkWUI0cOj5xf3rVrV1WpUkXfffedfv31V0mSv7+/3nzzTT322GM2V+c6b775plauXJlsScWrV6/q8ccfV7t27WyszPUGDBigtWvXauPGjYqMjJSU+O9Gq1atPGrerMTvx82+/fZbXbx4UXv27FFMTIykxBOMJ5980uN+R0aOHKlhw4bpwoULzttwT5w4UePHj9fmzZvtLc7FWLPb5K694EJFi86fP6/du3crPj5eFSpU8MgVL6S0l8vypGWypMTw6OfnJz8/P504cUL79+/XQw89pLvvvtvu0lxm3bp1aty4sd1lZAtJJ5eSdOHCBe3atUu+vr6qUqWKcufObXN19vr999915MgRPfroox634gW/I+lz/vx5FS5c2O4yXKZWrVrOk6ovvvgixQmWJ/0VvHr16s7VUMLDw5OtjCKlvPtkdkGotmDz5s0aPHiwKlSooISEBP38888aM2aM6tWrZ3dpLmcYhj7//HP98MMPiouLU40aNdShQwePugHMihUrNGnSJH322Wfat2+fJkyYoPLly+vXX39Vz549FRoaaneJLvHwww+rVq1aGjlypO688067y7FV0uoFP/74o/r06aPy5csrISFBBw4c0MSJE7PtWqtZYdu2berfv78KFiyoLl266J133lHFihW1d+9eDRkyJMVB87/s4Ycf1hNPPKFRo0Z5/O/ItWvXNHPmTK1Zs0YRERHy8vKSv7+/ateurd69e6c6D/+/ijW7Tf82hzokJMRFldwmmy6Q/E8ICQkxTp486Xx88uRJj1vdIMn48eONHj16GOvXrze++eYbo0ePHsaYMWPsLsulAgMDjbNnzxqGkfizcebMGcMwDOP8+fMedUV/ixYtjCVLlhi1a9c2JkyYYERERNhdkm2SVnlo27atsW/fPuf2o0ePGsHBwXaVZYuQkBDj6NGjxsaNG41HHnnEOH36tGEYhhEREWGEhITYXJ1r8Ttievnll40ZM2YYZ86cMeLi4oy4uDjjzJkzxsyZM43u3bvbXZ5tYmNjjQMHDhhHjhyxuxRbnTlzxvj555+N3bt3O4+p2Rlzqi2Ii4tTyZIlnY9LliyphIQEGyuyz/fff6/ly5c7R6br1q3rUevOSlLOnDlVqFAhSZKfn5/zYqxChQp51Ii9w+FQaGio6tevr08++UShoaG65557VKVKFd15551q27at3SW6nGEYeuihh5yP77vvPre6+CYzxMXF6b777tN9992n6tWrO2+S5e/vr9jYWJurcy1+R0zHjh3TjBkzkm2788471aNHDzVr1symquzRvXt3ffDBBzp06JB69uypPHnyKCEhQYZhaMqUKSpTpozdJbrMsWPHNGDAAF28eDHZGv85c+bUpEmTsu2iCIRqC+666y59/PHHzivXlyxZ4nFziJPEx8crLi7OuQpKfHy8xy2T1bBhQ3Xu3Fldu3ZVgwYNNHDgQDVp0kRr1qzRE088YXd5LpMUFgsVKqTevXvrtdde088//6xffvlFBw8etLk61zp58qS6d++u2NhYzZw5Uy+//LL++OMPffjhh7r33nvtLs+l7rnnHk2ZMkW9e/d2Lpd29uxZzZ07V6VLl7a5Otfid8RUuHBhrVmzRk2aNHEOPhiGodWrVzsHKTzF33//LUka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og8memGiFyZ6Yapfv74WLFjA8VMstXizbt26qV69errvvvs0adIkPffcc/ryyy+z7cW8DKlaMHv2bM2dO1cFCxaUw+GQYRhyOBz69ttv7S4NNvrkk0+0fPlyjz840AcTvTDRCxO9MJUuXVp33HGH3WVkC3ny5HGr0dms5G6rwhCqLViyZInWr1+vwoUL210KshEODonog4lemOiFiV6YOnbsqODgYJUvXz7ZBf/jxo2zsSp7sNSiyd0u5iVUW1CsWDEVKFDA7jKQzXBwSEQfTPTCRC9M9MI0ZswYBQcHq3jx4naXYjt3G53NSu52MS+h2oJ77rlHzzzzjKpXr55saT1PXKAdJg4OieiDiV6Y6IWJXpj8/Pw4dv4/dxudzUrutioModqCgIAABQQE2F0GshkODonog4lemOiFiV6YHn/8cY0fP161a9eWr6+vc3vVqlVtrMoe7jY6m5Xc7WJeVv+wKDo6WidPntQDDzyg69evK3fu3HaXBJuNGzdODofD4w8O9MFEL0z0wkQvTB07dkyxzeFweOy0ByRyt1VhGKm2YNu2bRo+fLji4+P1xRdfqHnz5po8ebJq1apld2mw0b59+yRJv/32m3ObJx4c6IOJXpjohYlemG6+yYenc7fR2azkbhfzMlJtQZs2bTRz5kw9//zzWr58uY4cOaLXX39dX331ld2lAQDgNn766SfNmzdP0dHRMgxDCQkJ+vPPPxUeHm53aS7nbqOzWem7777TmDFj3OZiXkaqLUhISFDRokWdjz1xDUmkxMEhEX0w0QsTvTDRC9PQoUP1/PPPa9myZerYsaO+++47Pfzww3aXZQt3G53NSu52MS+h2oI777xTGzZskMPh0OXLl7Vw4ULOLMHB4f/RBxO9MNELE70w5cyZU6GhoTp9+rTy58+v0aNHq1WrVnaXZQuWWjS528W8hGoLRo4cqTFjxujMmTNq2LChatSooZEjR9pdFmzGwSERfTDRCxO9MNELU44cOXTx4kXde++92r17t2rWrKno6Gi7y7KFu43OZiV3WxWGUG1BkSJFNGXKFLvLQDbDwSERfTDRCxO9MNELU+fOndWnTx9NmzZNrVu31sqVK1WuXDm7y7KFu43OZiV3u5iXCxUz6LPPPlPRokXVqFEjtWnTRufPn5e3t7fef/993X333XaXBxutWbNGixcvdh4cvL29VbZs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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#create a df for top 10 devices and their value counts\n", + "device_make_df = pd.DataFrame(plot_df['device_make'].value_counts().head(10).rename_axis('device_make').reset_index(name='counts'))\n", + "\n", + "#calculate the percentage of each device\n", + "device_make_df['percent'] = (device_make_df['counts']/device_make_df['counts'].sum())*100\n", + "device_make_df.sort_values(by='percent', ascending=False, inplace = True)\n", + "\n", + "# Plot the figure\n", + "sns.set_theme(style='whitegrid')\n", + "plt.figure(figsize=(12,8))\n", + "ax = sns.barplot(x='device_make', y='percent', data=device_make_df)\n", + "sns.set(font_scale=1.5)\n", + "ax.set_ylim(0,100)\n", + "\n", + "#Add percentages on each bar\n", + "for p in ax.patches:\n", + " txt = str(p.get_height().round(1)) + '%'\n", + " txt_x = p.get_x()\n", + " txt_y = p.get_height()\n", + " ax.text(txt_x,txt_y,txt)\n", + " \n", + "#rotate the x-labels to 90 degrees for clear visualization\n", + "g = ax.set_xticklabels(ax.get_xticklabels(), rotation=90)" + ] + }, + { + "cell_type": "markdown", + "id": "f8dd2d8f-bee6-4af4-955a-bf9b4690293e", + "metadata": {}, + "source": [ + "Generic Smartphones were the most used devices at 77.5% and Iphone aw 7.1%" + ] + }, + { + "cell_type": "markdown", + "id": "687f7a5c-6e34-4f41-bca7-7813e8a0a680", + "metadata": {}, + "source": [ + "##### Distribution by Date" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "0ef843bc-ae08-4b29-bbc5-e6b0b38dff99", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuQAAAImCAYAAAAbhJ/aAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABhsElEQVR4nO3deXgNd9/H8U8iC6EoT4KiuiaoPVrLrUnVHoldLUGpauwtta9tUCmp2sutltveUEKVWKrc2tCitUQtXSwlmlA72TPPH56cR5qIbZKR5P26rl5Xz+/MnPnON3Pkk5nfmWNnGIYhAAAAAJawt7oAAAAAIDcjkAMAAAAWIpADAAAAFiKQAwAAABYikAMAAAAWIpADAAAAFiKQA49oxowZ8vDwSPVf2bJlVaVKFTVs2FCjR4/W77//nma9s2fPysPDQ717936o7R46dEjffffdA9W4bds2U7Z9L999950OHTpke/zDDz/Iw8NDEyZMyJTtmS0xMVEff/yx/vWvf6lixYry8/O767LDhg1L8/MvV66cqlatKh8fH02cOFFRUVGPXFNcXJwWLFjwyK+Dh5Pycz569KjVpTyU6tWr6/XXX7+vZR+n9+/YsWPl4eGhpk2bPtT6vXv3loeHh86ePWtyZYC5HKwuAMgp6tWrp3LlykmSkpOTdePGDR07dkwhISFav369pk2bptdee822fMGCBdW3b18999xzD7ytHTt2qFevXho6dKjq1Klzz+VfeeUV9e3bV88+++wDb+tBLV++XB9++KFmzZplGytZsqT69u2rypUrZ/r2zbB69WotWLBAzz77rFq2bKmiRYvec52WLVuqZMmSkm4H+hs3bujgwYNatGiR1q5dq/nz56tixYoPXVOnTp108uRJvfXWWw/9Gnh49evXV8mSJfU///M/VpeSqdJ7/1olPj5emzZtUr58+fTbb7/pp59+UrVq1awuC8gUBHLAJPXr11erVq3SjO/cuVN9+vTRgAEDFBoaqjJlyki6Hcj79ev3UNu6dOmSkpOT73v5GjVqqEaNGg+1rQf1999/pxkrVarUQ++rFX755RdJ0pgxY1S7du37Wqdly5bp9jgkJESjR49Wz549tXHjRhUqVOihakqvr8g69evXV/369a0uI9M9TsfZt99+q6tXr6pfv36aMWOGVq1aRSBHjsWUFSCTeXt7691339WtW7c0e/Zsq8vBfYiPj5ckPfnkk4/8Wm+88YY6dOigixcv6j//+c8jvx6QW4SGhsre3l7+/v567rnnFBYWphs3blhdFpApCORAFujUqZOcnZ21ZcsWJSYmSkp/HndiYqJmzpwpPz8/ValSRa+88oq6d++u3bt325YZNmyYhg8fLkmaOHGibX5kyjzP5cuXa+DAgapUqZLq1Kmj/fv3p5lDfqctW7bIz89PFStWVKNGjTR37lwlJCSkWsbDw0PNmzdPs+6aNWvk4eGhRYsWSZI6d+6smTNnSpL69OkjDw8PSXefg3ry5EkNGjRItWvXVoUKFVS/fn1NmjRJ169fT7Vcyvzdq1evauzYsba53a1atdLmzZvv62cgSd9//726deumatWqqVKlSmrZsqWWLVtmu9qQ8jNZu3atJKlFixby8PDQDz/8cN/bSE/37t0lSV9//XWq8Zs3b2rWrFlq3ry5qlatqooVK6phw4aaNGmSbt26laqmc+fO6fr16/Lw8NCwYcNsr3Hjxg0FBwerfv36qlChgl599VWNHTs23TOdS5YsUatWrVS1alVVq1ZNHTt21KZNm+5Zf0afOUjv2Lp48aJGjBihBg0aqGLFiqpTp44GDx6s06dPp1n/9OnTqY6BJk2apHsMvv766+rcubO+/PJL1a5dW1WrVlVQUJAk6fDhwwoICFCdOnVsx3FwcPA9w9v48ePl4eGhXbt2pXnuwIED8vDw0AcffCDp7nPId+/erW7dusnT01NVqlRRu3btFBYWZnv+119/lYeHh4YOHZpqvePHj8vDwyPVNDbp9nS3GjVqyN/f3zYWHx+vuXPnysfHRxUrVlStWrX0/vvv688//0xT96VLl/Thhx/q1VdfVeXKldW1a1cdP348wz6kuNv7905r165Vs2bNVLFiRb366qsKCgpSTExMmuWOHDmi3r17q0aNGqpUqZKaN2+uFStWyDCM+6rl0qVL2rVrl1566SU9+eST8vHx0a1bt9K8h1IkJSXp888/V6NGjVSpUiX5+flpy5Yt97Ut4HFAIAeyQL58+VS+fHndunUrww+FjRs3TjNmzFDhwoXl7++vxo0b6+DBg+revbstFNavX1/16tWTJNWpU0d9+/ZVwYIFba8xa9YsHT58WJ06dVL58uX10ksv3XV7Bw4c0LvvvqvSpUurQ4cOsrOz05QpUzRkyJCH2s+WLVvqlVdekST5+Piob9++d1324MGDatWqlb7++mtVqVJF/v7+Klq0qObPn6833nhDV65cSbNOt27dtGvXLjVp0kR+fn769ddf9e67797Xh1uXLFmit956S4cPH1aDBg3UunVrXb9+XYGBgXr//fdlGIZtXn/ZsmUlSe3atVPfvn1tc8MfVunSpeXm5qZTp07p0qVLkm7/8dWtWzfNmDFDrq6u6tixo1q3bq3Y2FjNnz/fFrpTanriiSfk5OSkvn372qZOXL9+XR06dNC8efNUqlQpdenSRVWrVlVISIjatm2r6OhoWw3//ve/NX78eElS+/bt1apVK505c0bvvfeeQkNDH2n/7hQXF6cePXpo3bp1eumll9S1a1d5enrq66+/Vvv27VP9XI8cOaLWrVsrLCxMNWvWVNeuXVWoUCFNmTJFvXr1UlJSUqrX/vXXXxUYGKj69eurcePGqlKlik6ePKlu3brp559/1uuvv64333xT//M//6N58+apT58+GdbarFkzSUr3j5KU4JeyTHpWrVqlbt266fjx4/Lx8VG7du30999/691339WcOXMkSS+++KKeeuop7dmzJ9W6KY/Pnz+fKlgfOnRIV65csQX1hIQE9ejRQ1OmTFH+/PnVqVMnvfrqq9qyZYvatGmjEydO2Na9efOmOnXqpOXLl+v5559Xu3btdOXKFXXu3FmxsbEZ9kK69/v366+/1ujRo/Xiiy/K399f+fPn18KFCzV48OBUy+3cuVPt27fXnj17VLduXXXq1EnJycn64IMPNGbMmHvWkbKthIQE+fj42OqRbvc8PcOGDdPkyZPl4OCgdu3aqXjx4urfv78OHjx4X9sDLGcAeCTTp0833N3djS+//DLD5fr372+4u7sb33zzjWEYhvHnn38a7u7uRq9evQzDMIzr168bZcuWNfz9/VOtd+jQIcPd3d3o16+fbezLL7803N3djYULF9rG9uzZY7i7uxuVK1c2oqOj061x69atqbbt7u5u/Oc//7EtFxMTY3Tp0sVwd3c3vvvuO9u4u7u70axZszT7lF4d/9zWnbWNHz/eMAzDSExMNBo2bGiUL1/e2LlzZ6rXnDx5suHu7m4MHz7cNjZ06FDD3d3daNOmjXHz5k3b+Pr16w13d3fjvffeS1Pbnc6cOWOUL1/eeO2114wzZ87Yxm/evGnb37Vr16bZ3i+//JLh69657J49ezJcrnXr1oa7u7tx7NgxwzAMY8OGDYa7u7sxZcqUVMtdv37dqF27tlGuXDnj1q1btvG6desanp6eqZb94IMPDHd3d2Pp0qWpxrdt22a4u7sb/fv3t4298sorRv369Y2EhATb2Pnz540KFSoYrVq1yrD2fx6rd/rnz3v79u2Gu7u7MW3atFTLff7556lqTU5ONnx9fY2KFSsahw8fTrXsRx99lGa/6tata7i7uxuLFy9OtWxQUJDh7u5u7N69O9X4O++8Y7i7uxsnTpzIcN8aNmxovPzyy0Z8fLxtLCkpyahTp47x+uuv28b+eUyk9K5JkybGpUuXbMvFxMQY7dq1M8qWLWscP37cMAzDGD16tOHu7m788ccftuV69uxpVKlSxXB3dzfWrFmTpp8pdc+bN89wd3c3Jk2alKruQ4cOGS+99JLRunVr29i0adMMd3d3Y8aMGbaxhIQEY+DAgYa7u7tRt27dDHtx5/bTe/+WK1fO2Lt3r2381q1bRp06dYyyZcvaenDr1i2jZs2aRq1atYw///wzVU/79etnuLu7Gzt27LhnHa1atTI8PDyM8+fP28ZatGiR6j2UYvfu3Ya7u7vx1ltvGXFxcbbxpUuX2v6du7MW4HHEGXIgizg5OUnSXS+jJycnyzAMnT9/XhcuXLCNV6xYUdu2bdMnn3xyX9upVq2aXF1d72vZp59+OtWl8bx582rAgAGSpK+++uq+XuNh/Pzzzzp16pSaNm0qLy+vVM/1799fxYoV01dffWWby53C399fLi4utsfe3t6SpHPnzmW4vfXr1ysxMVF9+vRR6dKlbeMuLi4aNWqUJOnLL798pH26l3/+/MuXL6/x48frzTffTLVcgQIFVL58eSUlJenq1at3fb3ExESFhobazlbeqV69eqpWrZq2bt1q255hGLp06VKqs7HFixfXpk2btHz5clP2UZJt+s/x48cVFxdnG+/YsaN27Nihjh07Srp9heTEiRNq06aNKlSokOo13n33XTk6OmrNmjVpXr9hw4bpbu/w4cOpxidOnKjdu3frxRdfzLBePz8/Xb16Vd9//71tbN++fYqOjpavr+9d11u/fr3i4+PVv3//VJ81yJs3r/r376/k5GTb1KeU4zRl6llSUpL27dunli1bytHRUXv37rWt/91336lkyZK2ulevXq2CBQva3pcpKlasqMaNG+vw4cP69ddfJd0+q1ywYEEFBATYlnNwcNDQoUNlZ2eXYR/ux8svv6zq1avbHufLl081a9ZUcnKy7T24fft2Xbp0Sd27d1epUqVsy9rb2+v999+XdO/32u+//66IiAhVr15dxYsXt42n/Dz+eZY85WrGe++9Z3ufSbLNPQeyA+6yAmSRmzdvSlKqQHmnggULysfHR19//bXq1q2rqlWrysvLS3Xr1tULL7xw39u585fgvVSuXFl58uRJNfbSSy/J3t5ex44du+/XeVAp03ZefvnlNM85OTnZ/gj5448/bNNHJKW5beMTTzwhSWmC+z+l7Et623vxxRdVsGDBTN1f6f9//vnz55d0e1+effZZxcXF6eDBgzp58qTOnDmjI0eO6Mcff5SkNFM27nTy5EndunVLSUlJmjFjRprn4+LilJSUpOPHj8vT01Pt2rXTv//9b9s8ZC8vL3l7ez/SrRjTU7t2bZUuXVrbtm1T7dq1Vbt2bXl5eem1115TiRIlbMsdOXJEknTmzJl068+fP7+OHz8uwzBsYdLR0VHFihVLtVzLli21YsUKBQcHa+nSpfLy8pKXl5f+9a9/3fW9dqfmzZtrxowZ2rhxo22ayP1MV4mIiJB0O2SnBOIUKfP/U46pWrVqycnJSXv27FHHjh115MgRXbt2Tf/61790+PBh7du3T5J05coVHT58WO3bt5d0+5g5efKkXF1d9dlnn6Wp4eLFi5Juv59Kly6tU6dO6ZVXXpGjo2Oq5dzc3FSqVKkHujNTelLuEHWnwoULp9rnlL4cOXIk3Z9rnjx57vleW7dunSSlufe4r6+vgoOD9dVXX2nIkCG28H3s2DHlyZPHdtvZO1WtWlV//PHHPfYMsB6BHMgiKWeQ7jxD+08ff/yxKlSooDVr1ujHH3/Ujz/+qODgYFWoUEHjx49P9xfOPzk7O993TendU9nR0VHOzs62X7CZIeWsbYECBdJ93s3NTZLSfFjszrNfkmxBzbjHB8VStpcS4NPbXnofODSLYRiKjIyUnZ2dbT56cnKy5s6dq4ULF9rOhBctWlRVq1ZVyZIl9fvvv2e4X9euXZMk/fHHH7YP4qUn5bUHDhyoMmXKaOXKlTp06JAOHjyoGTNm6Nlnn9XYsWNVq1YtU/Y1X758CgkJ0WeffaZNmzZpy5Yt2rJli+zt7dWgQQMFBgaqcOHCtvp37dqV7ocqU9y8edN2nOTNmzfN82XLllVISIjmzJmjnTt3KiQkRCEhIXJxcVGXLl303nvvZXh2uHTp0qpataq++eYbxcfHy97eXlu2bNFLL72k559//q7rpXzweOXKlXddJqX3Li4uevnll/XDDz8oOTlZe/bskb29vV5++WXt379f8+fPV3R0tPbt26ekpCTbGfWU4/bChQv3/BmnbCvlD75/KlSokC5fvnzX17gfGf3bknKspvTlbh++lJThlR/DMGxX5z744APbh2rvdOXKFW3evNn2hV3Xrl2Ts7OzHBzSRpqHvc0okNUI5EAWuHLlin777TcVLFgww7Pdjo6Oeuutt/TWW28pMjJS33//vcLCwvTdd98pICBA33zzTZqzX48iJRTd6fr164qJiUnziyy9s2vp3V3hfqSEhrt9g2VKXSln3x7VndsrUqRImuevXr1q2rbSc+LECV27dk3u7u62PwoWLFigqVOn6pVXXlGPHj1Urlw521Sjt99+O91vd71Tyj41b95ckyZNumcNdnZ2atOmjdq0aaO///5b4eHh2rp1q7Zs2aJevXpp+/bt6fYmZV3p/o+BIkWKaOTIkRoxYoSOHz+uXbt2ad26ddq8ebPs7e01depU29nrCRMmqE2bNvesPyNly5bV1KlTFR8fr59//ln//e9/tWbNGs2ZM0fFihWzTZO5Gz8/PwUGBuq///2v8ubNq0uXLumdd97JcJ2U+rdt25bhH9kpvLy89P333+vo0aP68ccfVbZsWRUsWFA1atTQ/PnztW/fPu3atcs2DeTObVSvXl3Lli3L8PVTPrT5zzsUpcjMP7DvlFLzokWLHuqPvD179igyMlLPPfdcule0oqOj9e2332rVqlW2QF6wYEGdOXNGCQkJaf59zKr9Bh4Vc8iBLBASEqLExEQ1adIkzRSRFH/++aemTJmib7/9VpL01FNPqW3btpo/f75q1qypqKgo29c/mzEfVEo771a6Pb9bUqq7szg6OqYbvNK77dr91JZypv+nn35K81xycrL2798vFxeXR767SYqUaS/79+9P89zp06d14cKFe841fhQpYerOOckbNmxQnjx59Nlnn8nLy8sWxg3DsF1iz+gM+bPPPisnJycdOXIk3eUWLVqk2bNn6/Lly7p8+bJmzJhhm9NctGhR+fn5afr06WrVqpVi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ZtU3EMEwmjRpctfnmjZtmoWV5Az001z00zz00lz001z001z00zy5uZd8qDMLFSlSRJs2bVJycrJtzDAMff3113ryySctrCx7op/mop/moZfmop/mop/mop/myc29ZMpKFjp//rw+/PBD7d271zYP6saNG6pevbrGjBmTK258byb6aS76aR56aS76aS76aS76aZ7c3EsCuQUSExN1+fJlGYahIkWKyMGBz9Y+CvppLvppHnppLvppLvppLvppntzYS6asZKHr16/ro48+0oABAxQeHi43NzfbQTZ69GiLq8t+6Ke56Kd56KW56Ke56Ke56Kd5cnMvCeRZaPjw4SpQoIB8fX21ePHiVAdXRESEhZVlT/TTXPTTPPTSXPTTXPTTXPTTPLm5lwTyLHT27Fn1799fjRo10rJly3T69GkFBQVJyj3fRGUm+mku+mkeemku+mku+mku+mme3NxLAnkWu3DhgiQpb968mjVrlsLDwzVnzhzZ2dlZXFn2RD/NRT/NQy/NRT/NRT/NRT/Nk2t7mTV3V4RhGMbWrVuNOnXqGNu2bbONRUVFGS1btjTKlStnYWXZE/00F/00D700F/00F/00F/00T27uJXdZyWI3btxQUlKSChUqZBtLTk7W9u3bVb9+fQsry57op7nop3nopbnop7nop7nop3lyay9z/n1kHjM///yzwsLC9Ndff8ne3l5ubm7y9vZWw4YNrS4tW6Kf5qKf5qGX5qKf5qKf5qKf5smtveQMeRaaNm2aDh06pGbNmsnNzU2SFB0drQ0bNuiFF17Q0KFDLa4we6Gf5qKf5qGX5qKf5qKf5qKf5snVvbR2xkzu0rBhQyMpKSnNeGJiotG4cWMLKsre6Ke56Kd56KW56Ke56Ke56Kd5cnMvuctKFnJ2dtZff/2VZjwyMlJOTk4WVJS90U9z0U/z0Etz0U9z0U9z0U/z5OZeMoc8Cw0bNkz+/v565pln5OrqKun27X1OnTqliRMnWlxd9kM/zUU/zUMvzUU/zUU/zUU/zZObe8kc8iz29ddf6+TJk8qTJ49Kly6tYsWKqXLlylq7dq3atWtndXnZDv00F/00D700F/00F/00F/00T27tJVNWslBwcLBWr16ty5cva/HixUpKStLLL78sJycnrVy50urysh36aS76aR56aS76aS76aS76aZ7c3EumrGShnTt3au3atXJwcFDnzp311ltvycnJSU2aNMnxXwmbGeinueineeilueinueinueineXJzLwnkWcgwDNtXvz7zzDOaO3euunXrpiJFiuT8r4TNBPTTXPTTPPTSXPTTXPTTXPTTPLm5l0xZyUKNGzdW586ddejQIUnSiy++qGnTpum9997TmTNnLK4u+6Gf5qKf5qGX5qKf5qKf5qKf5snNveRDnVls9+7dcnNz0/PPP28bO3/+vBYsWKCRI0daWFn2RD/NRT/NQy/NRT/NRT/NRT/Nk1t7SSAHAAAALMSUFQAAAMBCBHIAAADAQgRyAMiFwsLC1Llz5wyXmTlzprZt25ZFFQFA7kUgBwCk64cfflBiYqLVZQBAjsd9yAEgl5g2bZq++uorFS5cWGXKlJEknTx5UoGBgbp165aio6NVtmxZTZ06VatXr1ZERIQmTZqkPHnyyNvbW8HBwdq7d6+SkpJUvnx5jRo1SgUKFLB4rwAg++MMOQDkAtu2bdOWLVsUGhqqlStX6saNG5KkkJAQtWjRQl988YW2bNmis2fPaseOHfL391eFChU0ZMgQNWjQQP/+97+VJ08erVmzRuvXr5ebm5uCg4Mt3isAyBk4Qw4AucDu3bvVoEED2xnt1q1ba8mSJRo8eLC+//57zZs3T6dOnVJ0dLRu3bqVZv0dO3bo+vXrCg8PlyQlJCSoaNGiWboPAJBTEcgBIBews7PTnV87kSdPHknSwIEDlZSUpCZNmui1117T+fPnld7XUyQnJ2vEiBHy9vaWJN28eVNxcXFZUzwA5HBMWQGAXODVV19VWFiYrl27puTkZK1bt06S9N1336lPnz7y8fGRnZ2dDh48qKSkJEm3Q3vKhzrr1KmjZcuWKT4+XsnJyRo9erSmTJli2f4AQE7CGXIAyAW8vb11/PhxtW7dWgULFlTZsmV1+fJlDRgwQH369FGhQoWUL18+vfzyyzpz5owkqW7duvr444+VkJCg3r176+OPP1bLli2VlJSkcuXKadiwYRbvFQDkDHZGetcmAQAAAGQJpqwAAAAAFiKQAwAAABYikAMAAAAWIpADAAAAFiKQAwAAABYikAMAAAAWIpADAAAAFiKQAwAAABb6XxlnWKCix4nLAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.set(style=\"whitegrid\")\n", + "plt.figure(figsize=(12,8))\n", + "total = float(len(ad_df))\n", + "ax = sns.countplot(x=\"date\", data=ad_df)\n", + "ax.set_xticklabels(ax.get_xticklabels(), rotation=90)\n", + "plt.title('Distribution of Dates users viewed the Ad', fontsize=20)\n", + "for p in ax.patches:\n", + " percentage = '{:.1f}%'.format(100 * p.get_height()/total)\n", + " x = p.get_x() + p.get_width()\n", + " y = p.get_height()\n", + " ax.annotate(percentage, (x, y),ha='center')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "07555dcc-a514-4437-aa7e-89533ec38795", + "metadata": {}, + "source": [ + "03/07/2020 was the most engaged day during the campaign. This was the first day of the campaign. It has 24.9% of the engagements." + ] + }, + { + "cell_type": "markdown", + "id": "73e3609c-66b4-4b6d-8f35-3471229a991e", + "metadata": {}, + "source": [ + "##### Distribution of Users in each group" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "89dc88fa-bb88-4fd7-858d-d953807ad24f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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ItS0aVMtW7ZMDzzwgFJTUwstOyoqSrfeeqt69eqlli1bKjs7W5GRkVq1apUaNmyohx9+WH5+fvrwww/Vq1evIvdvcRw7dky9evVSWlqaevbsqZYtW+rTTz9V//79iwzBF5o9e7ZGjBih1NRUdevWTd26ddPPP/+sAQMGaNWqVU7Tjho1StOnT5fdblfPnj314IMPys3NTe+++64iIyOdpl21apUeeughbdu2Tf7+/urevbuOHTumIUOG6P3333ea9siRI47g2LdvX9WvX1/r1q1Tv379nC5YLEp+fr5GjhypyZMnKz09Xd27d1f79u31/fffa+DAgVqyZImk//WBv/766+Xm5qahQ4de8vPw5/dZZGSkunXr5vT8tGnT9M4778jf318PPPCA0tLSNHnyZC1atOiK929RDhw4oAcffFBr1651fGk5dOiQ+vTpc9H3zIXvPZvNpo0bN6p379767LPP1KZNG/Xq1UsuLi6aNWuWBgwYUCh0l1RkZKS++uorde/eXa1bt9Ynn3yi3r17O33xe+211zR16lRJUq9evRQeHq6DBw9qxIgRio+P/0vrB66YBeCKzJkzx/L29rbef//9S043fPhwy9vb29q0aZNlWZZ16NAhy9vb24qKirIsy7LOnj1r1a9f3+rbt6/TfDt37rS8vb2tYcOGOdref/99y9vb21q4cKGj7auvvrK8vb2tJk2aWKmpqUXWuGHDBqd1e3t7W2+++aZjuvPnz1sRERGWt7e39fnnnzvavb29rc6dOxfapqLquHBdf65t6tSplmVZVm5urhUYGGg1aNDA2rx5s9Myn3/+ecvb29saO3aso2306NGWt7e31aNHDysjI8PRvnr1asvb29saMWJEodr+7ODBg1aDBg2se++91zp48KCjPSMjw7G9K1euLLS+H3744ZLLtSzLateuneXn51eo/cJtLsnr+/TTT1ve3t7WW2+95TTtxo0bLW9vb2v48OGFah06dKjTtB999JHl7e1tzZ4926n9P//5T5HLvlBRr227du0sb29va/LkyVZ+fr6jPSYmxvL29raWLl16yWXu2LHDqlevntWvXz/r3LlzjvaTJ09aHTp0sJo0aWKlpaVZlmVZ3333neXt7W2NGjXKaRk5OTlWaGio5e3tbf3666+WZVnW6dOnLT8/P6t169aONsuyrLS0NKtt27ZWixYtrOzsbMuyLMf7fv78+U7LjYqKsry9va3169dfchtWrlxpeXt7W4888ojTe/HgwYPWPffcYzVo0MDpPXax90dR+vXrZ3l7e1tnzpxxtBV8ngICAqzjx4872nft2mXVq1fPCgsLc7SVZP9ezKBBgyxvb29r7dq1jrasrCyrd+/elre3t9WvXz9H+8Xee2fPnrXuvvtuq1mzZlZycrKjPScnxxo1apTl7e1tvfzyy4724n6G/rzOdu3aOW1LYmJiofpatGhhtW/f3srJyXG0HTt2zPLx8bHCw8MvuR8AUzjDDRhW0IczPT29yOfz8/NlWZaOHTum48ePO9obNWqkjRs36oUXXijWepo1ayYPD49iTXvrrbeqb9++jscVK1bUyJEjJUkffPBBsZZxJb777jvt379fISEh8vf3d3pu+PDh8vLy0gcffFDoLFjfvn1VqVIlx+OAgABJf5yxvJTVq1crNzdXQ4YMUe3atR3tlSpVUkxMjCQVOgta2or7+ubm5io+Pl533XWX02sj/TESTrNmzbRhw4ZC76PAwMBC65OkH3/8UVlZWY72Pn366JNPPlGfPn2ueFsiIyNls9kcj4v7OixfvlyWZempp57Sdddd52ivVq2aIiMjdf78ecfP/TVq1NCMGTP0xBNPOC3DbrfLz89P0v8uMty8ebPOnj2riIgIp5F4qlevrrFjx+rRRx91OnNdsWJFPfLII07LbdeunSTp0KFDl9yGgu5GTz/9tNN7sXbt2oqKinK8fqXtgQce0D/+8Q/H4wYNGsjLy8up3pLs36KcPHlSmzdvVvPmzRUcHOxod3Nz07///e+Lznfhe2/jxo06c+aMIiIinH5hs9vtGjdunCpWrPiXP29RUVGqXr2643FQUJD8/Py0detWpaSkSJIsy9LJkyed9lGNGjW0du3ai3bHAUxjlBLAsIyMDEly+iP9ZzfccIM6deqkDz/8UO3atVPTpk3l7++vdu3a6c477yz2em655ZZiT9ukSRO5uLg4tTVs2FAVKlQoUZ/ckiroVnP33XcXes7Nzc0RQn/99VdH9w5JhYY1vP766yXpsj9PF2xLUeu76667dMMNNxjdXqn4r+++fft07tw55eXlae7cuYWWk5WVpby8PP3444+O4CkVft3btGmj2rVra+PGjWrTpo3atGkjf39/3XvvvapZs+YVb4e7u3uh+atUqSLp8q/Drl27JP1x3cAnn3zi9Nxvv/0m6X/vjRo1aqhbt27Kzc3Vrl27tG/fPh08eFC7d+/Wli1bJP3vS0XBa1fUEIadOnUq1FazZs1CFzEWXCB7uS4le/bskZeXl9MXtwIFr4eJ99Jtt91WqK1q1aqO/SaVbP8WZdeuXcrPzy9y6MImTZrIbi86Klz43rvU56169eq6/fbbtXv3bp09e9bxGS6popbduHFjJSUlOV6jBx98UK+99pqjf7m/v78CAgLUqFGjK1onUBoI3IBhBWf/ivpDXeC5556Tj4+PVqxYoa1bt2rr1q2KjY2Vj4+Ppk6dWqxh2tzd3Ytd05/PmBVwdXWVu7v7ZYPHX1FwdrYgqF3I09NTknT+/Hmn9gtDUsFZVuv/X6R1ufVd7I+7p6dnsS4k/KuK8/r+/vvvkqRff/3VcQFqUc6cOeP0uGLFik6Pr7vuOi1btkzz58/X2rVrtX79eq1fv14VKlRQhw4dNGXKFFWtWrXE21DUaBvFfR0KLoZ97bXXLjrNn7frnXfe0bx58xx91m+44QY1adJEdevW1Y4dOxzrK9hnF3s/XehSn5HivJeK+txI/3vfZmZmFquOkijO57qk+/dCp06dklT0ccHFxcXpjPKfXfjeK87ne/fu3Tp//vwVB24vL69CbQV1F+yHJ598UnXq1NE777yjnTt3aseOHZo7d65uv/12TZo0Sa1bt76idQN/BYEbMOj06dP6+eefdcMNN1zybLWrq6seeeQRPfLIIzp69Ki++OILJSYm6vPPP9egQYO0adMmubq6llpdBUHlz86ePavz58/rxhtvdGovatzvCwNxcVWuXFmSHD/9XqyuKwmEl1tfUaHhzJkzf2ldRe2bokJXcV7fglq7dOmimTNnXnFN0h9nE8ePH69x48bpxx9/1GeffaZVq1Zp3bp1qlChgl566aW/tPySqlSpklxcXLRjx47Lvo/Xrl2rSZMmqV69epo0aZIaNmzoOLM+adIk7dixw2m50v9+Rfqz7OxsVahQ4aJnZ0uqcuXKF33fFoTZ0nrfllRJ9m9RCgLyxbq9FbV/i1LwHi7q4l6p6M93cT9Df37uz91mpP8F7YJfK2w2m3r06KEePXooLS1NW7Zs0YYNG7R+/XpFRUXpo48+uuiXCMAU+nADBi1btky5ubnq2LFjoS4cBQ4dOqQXX3xRH3/8sSTp5ptv1gMPPKAFCxaoVatWSklJcQxb9uf+s3/F999/X6jtu+++kySnvpeurq5Fhuui+rsWp7aCM/Xffvttoefy8/OVlJSkSpUqldroIAXdUpKSkgo9d+DAAR0/flx33XXXFS3b1dVVWVlZhc6MHjx40OlxcV/f22+/XW5ubtq1a1eRZ1v/+9//Ki4uznE28mK2bdumqVOn6uDBg7LZbKpfv74iIyP13nvvqVKlSvrmm2+uaHv/inr16ikvL6/Ibg3bt29XbGyso641a9ZIkl544QW1b9/eqRvLr7/+Kul/Z6O9vb0l/TEM3YUWLFigJk2aOIbc+6vq16+vs2fPau/evYWeK6i9JF3ASlNJ9m9RGjZsKJvNVuR+/Pnnn4sduAs+30V93tLT07V7927VqVPH8WtJcT9Df3axY5fdblfDhg116tQpzZ0719Hn/qabblJYWJjmzJmj8PBwnT9/3nGDK+BqInADhnz55ZeaN2+eKlWqpEGDBl10uooVK+r111/X7NmznfrCZmdn6/jx43Jzc3NcDFlwtu7C8bJLau/evU4XUaWnp+ull16SzWZzumvmHXfcocOHDzuNc3vkyJEiLw4rqO1S/Xn9/PxUp04drV+/Xps3b3Z6bs6cOTp27Jg6duxYajcL6dKli+x2u1555RWnLwnnzp3TlClTHNNciTvuuEO5ubn69NNPHW2nT592DA9XoLivr7u7uzp16qSff/5ZCxcudFrG119/rZkzZ+r9998v9AvEhY4fP67FixfrjTfecGo/ceKEsrKySu3LTEkUDHU3ffp0p7Oo6enpevrpp/X6668rLy9P0v+6UJw4ccJpGfHx8Y7wXDCmffv27VWpUiUtWrTI6cLN06dP691331XlypVL7Rb1BZ+LadOmOXW7OnTokObNmydXV1eFhIRc0bILzkpf6ee6JPu3KF5eXrrnnnu0ZcsWp89ldna2nn/++WLX0b59e11//fVaunSpo1+59MfrNW3aNGVmZjp93or7GfqzuXPnOm1jYmKivv76a91///2qWrWqKleurEWLFmnWrFmFhjM8evSopD++9AJXG11KgL9o48aNjj/2+fn5Sk9P1w8//KBvvvlGFStW1KxZsy4Zcjw8PPTQQw9p4cKFCg0NVUBAgCpUqKDPPvtMv/zyix5//HHHT74F/RfffvttnTlzptBNMorr1ltv1b///W9t3LhR1apV08cff6zDhw/rsccec7pwqmfPnnrmmWfUv39/hYaGKjs7W2vXrpW3t3ehM2YFtc2fP1+7d+8ucuzhChUqaMaMGRo4cKAGDx6sdu3a6dZbb9V3332n7du3q27dulc8FnhRateurdGjR2vatGnq1q2bI6B9+umnOnTokEJCQtS1a9crWnbPnj310UcfacSIEQoLC5Obm5sSExNVp04d7du3zzFdSV7f0aNH67vvvtNzzz2nTZs2qXHjxkpJSdH69etlt9s1ffp0Vahw6fMk7du3V9OmTfX2229r79698vX1VXp6uuNGQcOHD7+i7f0rWrVqpf79+2vx4sUKCQlRQECA3NzctHHjRsf43i1btpQkde7cWR9++KGGDh2qkJAQValSRd9//722bt2qm266SWlpaY4gVbVqVU2cOFFjx45Vt27ddP/996ty5cpKTEzU8ePH9fLLL5fql7ePPvpI69atU+fOneXv769z585p06ZNSk9PV0xMjG699dYrWnbBZ2fcuHG65557FBERUaL5S7J/L2b8+PF68MEHFRUVpfbt28vLy0tffPGFY4z1y73vpD+6pkyfPl0jR45Ur1691KFDB91000366quvtHfvXjVv3txpHPXifob+bN++feratavuvfdepaSkaOPGjfLy8tKYMWMk/XGtwfDhwzV16lSFhoaqQ4cOqlixorZt26bvv/9eXbp00R133FHcXQuUGgI38Bdt2rRJmzZtcjy+7rrrVKtWLfXr108PPfRQsf4IR0dHq06dOnrvvfe0cuVK5eXl6c4779SMGTOcboRx9913q2/fvlq1apWWLFmiNm3aXLSryqXce++9atCggV555RUdOXJEt912m6ZOnaoHHnjAabp+/fopLy9PS5cu1TvvvKOaNWtq0KBBat26tdOZcOmPUSE2b96sTz75REuXLi10A48CzZo10/LlyxUXF6ctW7bos88+080336yoqChFRkY6+oGWloiICN12221asGCB1q9fL8uyVLduXQ0aNEg9evS44uW2a9dOsbGx+s9//qOVK1eqevXq6tatmyIiItS2bVunaYv7+lavXl3Lli3Tq6++qg0bNmjx4sWqXr267rvvPj3++ONOI7dcjJubm1599VW9/vrr2rhxo5YsWSJ3d3f5+vpq0KBBTiOcXE0xMTFq1KiR3n77ba1e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GzdulIuLix588EH5+/tr4sSJOn36tCpVqqTx48ercePGGjNmjKpUqaJdu3YpJSVFQ4YMUYcOHTRnzhydO3dO8+fPl5eXl1auXKnTp0+rXbt2ioiI0Pjx43X06FHZ7XaNHDmSu1OjXCBwA8Xw6aefKjk5WcuXL5fNZlN0dLQyMjLUtGlTzZ8/X1u3btXo0aNVo0YNSVJKSoreeecdpaWlKTw8XPfcc48WLlyoatWqac2aNTp58qQeeOAB1a9fX2+++aYGDBigjh07KiEhQdu3b9cNN9ygF154QYsWLdKNN96od955R7GxsZo0aZLGjBmjN998U3Xr1tX48ePLeM8AQPElJibq22+/1QcffKCcnBz16dNHS5cu1ahRoxQYGKjt27friSee0Lp16yRJv/32m5YuXaq9e/cqIiJC3bt31/Dhw7V161ZFRUVpxYoVSklJUUJCgux2u5544gm1atVKAwYM0KFDh9S7d2/Fx8eX7UYDInADxfLll19q586dCg8PlyRlZmbq5ptv1vjx49WpUyc1a9ZMISEhjunDw8Pl6uqqGjVqqFmzZkpKStJXX32l6dOnS5KqV6+u+++/X1u3blVAQICmTJmizz77TO3atVNQUJA+/fRTHTt2TBEREZKk/Px83Xjjjfrxxx/l6empunXrSpK6deum2bNnX+W9AQBXZtu2berYsaPc3Nzk5uampUuXql27dgoMDJQk+fr66sYbb9Svv/4qSbrnnntks9nk7e2t06dPF7nMBg0ayG7/I8589dVXmjp1qiSpdu3aatKkiXbs2GF+w4DLIHADxZCXl6eHHnpIAwYMkCT9/vvvcnFxUUpKilxcXLRv3z5lZ2fLzc1NkuTi4uKYNz8/X3a7XZZlOS3Tsizl5eUpODhYTZs21ccff6w333xTmzdv1r333qtmzZrplVdekSRlZWUpIyNDR48eVX5+vmMZf14PAJR3BcG4wKFDhy56bJQkd3d3SZLNZrvoMitWrOg078WWBZQlLpoEiqFVq1ZatWqVMjIylJubqyFDhighIUFjx47V+PHjdffdd+ull15yTL927VpZlqUjR45o586d8vPzU6tWrbR8+XJJ0smTJ7Vp0ya1aNFCI0aM0M6dO9WrVy898cQT+uGHH9SkSRNt375d+/btkyTFxcVp5syZqlevntLS0rRnzx5J0ocffnjV9wUAXKm7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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.set(style=\"whitegrid\")\n", + "plt.figure(figsize=(12,8))\n", + "total = float(len(ad_df))\n", + "ax = sns.countplot(x=\"experiment\", data=ad_df)\n", + "ax.set_xticklabels(ax.get_xticklabels(), rotation=0)\n", + "plt.title('Distribution of users in each of the groups', fontsize=20)\n", + "for p in ax.patches:\n", + " percentage = '{:.1f}%'.format(100 * p.get_height()/total)\n", + " x = p.get_x() + p.get_width()\n", + " y = p.get_height()\n", + " ax.annotate(percentage, (x, y),ha='center')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "e8e39af7-af46-4efc-8d54-88c2cac499e2", + "metadata": {}, + "source": [ + "50.4% of the users were place in the control group while 49.6% of the users were placed i the exposed group" + ] + }, + { + "cell_type": "markdown", + "id": "96d90298-8189-417c-86f1-60dc0370663d", + "metadata": {}, + "source": [ + "##### Number of yes and no (conversion rate)in both the control and the exposed groups" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "e40db21f-b5ba-48fe-8665-6882243d3bc9", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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6fbbb1eNGjV05swZbdmy5Yr3kYcffth7HZs2bVriPgeUJwILt4yLIXIxMIwx8ng86tatm4YPHy5J8ng8ys3NVa1atUqtf/GptIvbMP//x3h++2vpwh+Pb/Pz8/N+7evre9n5qlT5v/ecGGPkdDpVXFyskJAQvf76697zjh49qqCgIK1evVrVq1e/5LbMJT5i1BijoqKiK87Qvn17nT9/Xhs3btRnn32mV199VdKF22XatGnep06/+eYbORwOValSRe+99562b9+ujRs3atKkSWrbtm2J18RJ0rBhw1RcXKwuXbroZz/7mY4ePVpiRn9/f0klfzbf5ePjc9m5L/Wz8Xg8pbbj8XhUVFRUav3Y2Fg1btxYjzzyiLp06aJt27Z51/X19fX+bL4dp+Hh4Vq1apXS09O1ceNGvfHGG5o3b546deqk2NhY3XffferQoYNuu+02ffLJJ9q+fbvGjx/vnWvevHmqVq2aJOnkyZPy9/fXqVOn5Ofn5/1dve222/TBBx9o69at2rRpk4YMGeJ9CvW7vh3axhhVqVJFxcXFatCggd5//33veTk5Obr99tu1bNmyy/7+FBcXey/7ouPHj3ufoj1x4oRcLpfcbrdyc3O9If/dn5ExRj4+PvJ4PBo9erQ3VPPy8uRyubzLXW6Ob993vnsdL/J4PFe8j1zufguUN95FiFtahw4dtGLFCuXm5kqS/vGPf+iXv/xlmbZRp04dZWVlSbrwh/Kzzz67rlku7hE7cuSI0tPTFRISonbt2mnDhg3au3evJGndunV6/PHHS/xxupSL6x06dEiStHHjRh09elQtWrS44noOh0NPP/20EhMTFR0d7Q2fjh076q9//auMMXK73XrhhRf03nvvaefOnYqOjlaDBg2UkJCgfv36XXIv0yeffKKBAweqa9eucjgc2rZtm4qLi684yyOPPKIlS5bI5XLJ5XJp5cqVV1z+uwICAtSiRQvv65/Onj2rJUuWqH379iWWO3PmjLKysvTb3/5WERERysnJ0cGDB+XxeK64/d/85jdauXKloqKiNG7cOAUEBOjo0aO66667VKdOHc2bN08dOnRQx44d9dFHH+n06dNq0qSJAgIC1LJlS73zzjuSLsRq3759tWbNmlKX8e9//1v9+vXTQw89pEGDBql79+7auXPnJedZunSpPB6Pzpw5ow8//FCPPvqoWrZsqQMHDmjLli2SLrzBITIy0vv7fjn333+//P39vYF19OhRRUdHKysrS4WFhRo2bJheeuklvfjiixo2bJj3PxU7d+70zjd//ny1atVKt912mzp27Ki///3vcrvd8ng8GjNmjP7whz9ccYZrdb33ER8fn0vGNmALe7BwS3vkkUfUv39//epXv5LD4VBAQIBmzpx5xafRvisuLk6//e1vFRkZqXvuuUcPP/zwdc3icrnUo0cPFRYWKikpSffff78kKTk5WcOGDfPu1Zo9e/Zl/8d/0U9+8hONGzdOL774ooqLi1W1alW9+eabl3yR+Hf16NFDr776qp566invaYmJiZo4caJiYmJUWFio9u3b67nnnpOvr6+6dOmiXr16qXr16qpatWqpvVeSNHToUA0cOFC1atVStWrV1KZNG+9TOJfTp08fHTx4UNHR0apdu7bq169/1dm/KzU1VcnJyVq0aJHcbrdiYmLUs2fPEsvUqlVLzz//vHr06KHatWurTp06atWqlQ4cOODdM3Mpv/71r5WYmKj58+fLx8dHP//5z70/+06dOuntt99W06ZNVaVKFVWtWlU///nPS8w1YcIExcTEyO12Kzo6Wo8//riys7NLXEZoaKjWr1+v6OhoVa9eXbVq1dKECRMuOU9BQYF69+6tvLw8Pf30096naqdPn64pU6bI5XLJGKMpU6aobt26V7zd/Pz8NGvWLE2cOFF/+ctfVFRUpJdeekmtW7fWq6++qsDAQD3xxBOSLryZYurUqQoLC9Odd96p119/3fuC8ilTpnhvq1dffVU9evRQcXGxmjRpYu2QGw0bNryu+0hoaKj3tkxISLAyC/BtDsP+UgDfsmLFCi1evFh/+ctfKnoUXKO4uDjFxsaqc+fOFTbDp59+qgkTJmj58uUVNgNQmbAHC4BXXFycjh8/rhkzZlT0KABwQ2MPFgAAgGW8yB0AAMAyAgsAAMCySvMaLI/Ho7y8PPn6+pbpHVwAAAA/NGOMCgsLVaNGjRLHMbyo0gRWXl6edu/eXdFjAAAAXLNGjRpd8hA4lSawLh5dulGjRqWO3gtcSlZWlpo1a1bRYwC4yfDYgmvhdru1e/fuy346RqUJrItPC/r5+XmPHg1cDb8rAMoDjy24Vpd7WRMvcgcAALCMwAIAALCs0jxFCAAAbkyFhYXKzs5WQUFBRY9inY+Pj2rXrq0777zzku8WvBwCCwAAfC/Z2dmqWbOm7rvvvpvqUEsXD8WQk5Oj7Oxs3Xvvvde8Lk8RAgCA76WgoEB33HHHTRVX0oUXsPv5+alu3brKy8sr07oEFgAA+N5utrj6trI8NehdpxzmAAAAuKURWAAAwCp3YfENtd3ywIvcAQCAVX6+Por5zQfWt7vs992sb7O8sAcLAADcNIYPH6758+d7v4+Li9O2bdv0zDPPqEePHurbt6++/PJLSdKyZcvUrVs39ezZU4MHD5bL5bI2xzUF1rRp09S1a1dFRUXpnXfekSSNGjVKERER6tatm7p166bVq1dLktLT0xUTE6OIiAhNnTrV2qAAAABX06tXLy1dulSSdPjwYZ08eVKTJ0/W8OHDtXjxYk2YMEFDhw6VJL3++ut6++23tWjRIt1///366quvrM1x1acIN2/erE2bNmnp0qUqKipS165dFRYWpqysLL333nsKCgryLltQUKDRo0drzpw5uvvuu5WQkKB169YpLCzM2sAAAACX07ZtW40ZM0bZ2dn64IMP1KVLF7355psaNWqUd5n8/HydOnVK4eHh6tu3rx577DFFRkaqSZMm1ua46h6shx9+WO+++66cTqdOnDih4uJi+fv768iRIxozZoxiYmI0ffp0eTweZWZmqn79+qpXr56cTqdiYmKUlpZmbVgAAIArcTgc6t69u1asWKG0tDT16NFDfn5++uCDD7z/3n//fdWuXVtJSUmaPn26ateureHDh+uDD+y9buyaniL09fXV9OnTFRUVpZCQEBUXF6tdu3aaNGmSFixYoM8++0wLFy5Ubm6uAgMDvesFBQUpJyfH2rAAAABX07NnT82bN0933XWX6tatq/vuu88bTxs2bFBsbKyKiooUERGhOnXqKCEhQd26ddOOHTuszXDN7yIcPHiw+vfvrwEDBmjjxo164403vOfFxcVpyZIl6ty5c6n1ynrgsaysrDItj1tbRkZGRY8A4CbEY0vZOJ3OEkc6r1GjRrld1rUcUf22225TUFCQunbtqry8PCUnJ2vSpEn605/+JF9fX02ePFlut1sJCQn65S9/qapVq6pmzZpKTk6+7PbdbneZfi+uGlh79+6V2+1WkyZNVK1aNUVERGjlypWqXbu2IiMjJV34rB6n06ng4GAdP37cu25ubm6J12hdi2bNmsnf379M6+DWlJGRodatW1f0GABuMu7zefKrVn6BcCPyFLlVxel32fN37NhRIqrchcXlckgFd2HxVePNGKPc3FydOnVKUVFR8vPzU7NmzTR37txSy/bq1Uu9evW6psv28/NTixYtvN+7XK4r7hS6amBlZ2dr+vTp+sc//iFJWrNmjdq0aaNJkyapXbt2ql69uubPn68ePXqoRYsW2rdvnw4cOKB77rlHy5cvv+bBAQCoDPyq1dBXE/nb9W0/TvxnmZb38/UplzmuZburVq3S+PHjNX78ePn5XT4Ky9tVAyssLEzbtm1T9+7d5ePjo4iICL344ouqU6eO+vbt630OMzo6WpKUkpKiQYMGyeVyKSws7JJPGwIAAJSHzp07V4r2uKbXYA0ePFiDBw8ucVpsbKxiY2NLLRsSEuI9/gQAAMCtiCO5AwAAWEZgAQAAWEZgAQAAWEZgAQAAqzxF7htqu+Xhmg80CgAAcC2qOP3K5VAXZT1cREViDxYAAIBl7MECAAA3lU8//VR//OMfVbVqVe3du1cPPPCAUlNTtWzZMr3zzjtyOBx68MEHNWbMmHL7WB/2YAEAgJvOf//7X40dO1Yffvihjhw5ovnz5+vNN9/UnDlztGzZMlWrVk0zZ84st8snsAAAwE2nYcOGuuuuu1SlShU1aNBAZ86cUXh4uOrUqSNJeuqpp7Rp06Zyu3wCCwAA3HT8/f29XzscDt12220lzjfGqKioqNwun8ACAAC3hLVr1+r06dOSpAULFqht27bldlm8yB0AAFjlKXKXyyEVPEVuVXH6Xde6AQEBSkhIUFxcnAoLC/Xggw/qd7/7neUJ/w+BBQAArLreCLK13bZt25bYO5WSkuL9+oknnrA+16XwFCEAAIBlBBYAAIBlBBYAAPjejDEVPUK5uZ7rRmABAIDvxcfHR4WFhRU9Rrk5f/68fH19y7QOgQUAAL6X2rVrKycnRx6Pp6JHscoYo/z8fB0+fFhBQUFlWpd3EQIAgO/lzjvvVHZ2tnbt2lXRo1jn6+ur4ODgUgcqvRoCCwAAfC9VqlTRvffeW9FjVCo8RQgAAGAZgQUAAGAZgQUAAGAZgQUAAGAZgYUb1k+bNq7oESodT5G7okcAAIh3EeIG5lethr6a2Kuix6hUyuPT6wEAZcceLAAAAMsILAAAAMsILAAAAMsILAAAAMsILAAAAMsILAAAAMsILAAAAMsILAAAAMsILAAAAMsILAAAAMsILAAAAMsILAAAAMsILAC4RbkLiyt6BOCm5azoAQAAFcPP10cxv/mgoseodJb9vltFj4CbAHuwAAAALCOwAAAALCOwAAAALLumwJo2bZq6du2qqKgovfPOO5Kk9PR0xcTEKCIiQlOnTvUuu2PHDvXq1UuRkZFKTExUUVFR+UwOAABQSV01sDZv3qxNmzZp6dKl+uc//6k5c+Zo586dGj16tGbNmqWVK1cqKytL69atkyQNHz5cY8aM0apVq2SM0YIFC8r9SgAAAFQmVw2shx9+WO+++66cTqdOnDih4uJiffPNN6pfv77q1asnp9OpmJgYpaWl6fDhwyooKFDLli0lST179lRaWlp5XwcAAIBK5ZqeIvT19dX06dMVFRWlkJAQ5ebmKjAw0Ht+UFCQcnJySp0eGBionJwc+1MDAABUYtd8HKzBgwerf//+GjBggPbv31/qfIfDIWPMJU8vi6ysrDItj1tX69atK3qESikjI6OiR8ANgvsQyoLHlrK5amDt3btXbrdbTZo0UbVq1RQREaG0tDT5+Ph4l8nNzVVQUJCCg4N1/Phx7+nHjh1TUFBQmQZq1qyZ/P39y7QOgP/DH00A5YHHlpJcLtcVdwpd9SnC7OxsJSUlye12y+12a82aNerTp4/27dunAwcOqLi4WMuXL1doaKjq1q0rf39/b+UuWbJEoaGh9q4NAADADeCqe7DCwsK0bds2de/eXT4+PoqIiFBUVJRuv/12DRo0SC6XS2FhYercubMkKTU1VUlJScrLy1PTpk0VHx9f7lcCAACgMrmm12ANHjxYgwcPLnFaSEiIli5dWmrZxo0ba+HChXamAwAAuAFxJHcAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCCwAAADLCKwbgLuwuKJHAAAAZeCs6AFwdX6+Por5zQcVPUals+z33Sp6BAAALok9WAAAAJYRWAAAAJYRWAAAAJYR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rFkz+fv7l3k9ABfwRxNAeeCxpSSXy3XFnUJlfhdhcHCwjh8/7v0+NzdXQUFBpU4/duyY92lFAACAW0mZA6tFixbat2+fDhw4oOLiYi1fvlyhoaGqW7eu/P39vbsQlyxZotDQUOsDAwAAVHZlforQ399fKSkpGjRokFwul8LCwtS5c2dJUmpqqpKSkpSXl6emTZsqPj7e+sAAAACV3TUH1tq1a71fh4SEaOnSpaWWady4sRYuXGhnMgAAgBsUR3IHAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwjMACAACwzPl9Vo6Pj9eJEyfkdF7YTHJysg4ePKjZs2ersLBQ/fr1U2xsrJVBAQAAbhTXHVjGGH311Vf6+OOPvYGVk5OjoUOHatGiRfLz81OfPn3Utm1b/eQnP7E2MAAAQGV33YH11VdfyeFwqH///jpx4oSefPJJ1ahRQ+3atVPt2rUlSZGRkUpLS9OLL75oa14AAIBK77oD65tvvlFISIjGjx+vgoICxcfHq0uXLgoMDPQuExQUpMzMzDJtNysr63pHumm1bt26okfADSQjI6OiR8ANgscWlAWPLWVz3YH10EMP6aGHHpIkVa9eXb1799bkyZM1YMCAEss5HI4ybbdZs2by9/e/3rGAWx5/NAGUBx5bSnK5XFfcKXTd7yL87LPPtHHjRu/3xhjVrVtXx48f956Wm5uroKCg670IAACAG9J1B9bZs2c1ZcoUuVwunTt3TosXL9Zrr72mjRs36uTJkzp//rw++ugjhYaG2pwXAACg0rvupwjDw8O1bds2de/eXR6PR08//bRat26toUOHKj4+XoWFherdu7eaN29uc14AAIBK73sdB2vIkCEaMmRIidNiYmIUExPzfTYLAABwQ+NI7gAAAJYR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+vRpSdK///1vbd++Xb169ZJ04YOBz58/791GeHi4qlSpooCAANWvX19nzpyxcvsAuDkQWAB+UB6PRyEhISU+gPfo0aMKCgpSWlqaateurR07dsjtdns/i9LHx6fE+lWqVJHH45ExRvPmzVO1atUkXfigXn9/f506dUp+fn5yOi/9EPfdz7i81HIej0fPPfecnn76aUmS2+0uEVFVq1b1fu1wOHjdFYASeJE7gB9Uu3bttGHDBu3du1eStG7dOj3++OP66quvNHHiRL399tv68Y9/rNTUVO86a9as0dmzZ+XxeLRgwQKFh4crICBALVu21DvvvCNJ+uabb9S3b1+tWbPGypwdO3bUwoULde7cOUnStGnT9PLLL191PR8fHxUVFVmZAcCNiz1YAH5QDRs2VHJysoYNGyZjjJxOp2bPnq2kpCQ9++yzatSokcaOHauYmBi1b99eknTnnXeqf//+OnXqlNq0aaMBAwZIklJTUzVhwgTFxMTI7XYrOjpajz/+uLKzs7/3nE888YRycnL05JNPyuFw6O6771ZKSspV1/v5z3+uoUOH6pVXXlHHjh2/9xwAbky8ixBApTZjxgydOnVKY8eOrehRAOCa8RQhAACAZezBAgAAsIw9WAAAAJYRWAAAAJYRWAAAAJYRWAAAAJYRWAAAAJYRWAAAAJb9fyLIp7Na8VvBAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "yes_no_agg = plot_df.groupby('experiment').agg({'yes': 'sum', 'no': 'sum'})\n", + "ax = yes_no_agg.plot.bar( y=['yes', 'no'], title=\"The number of yes and no answers per experiment\",\n", + " rot=0, figsize=(10,7))" + ] + }, + { + "cell_type": "markdown", + "id": "a259c62c-e962-4f37-b804-0de332ca7be2", + "metadata": {}, + "source": [ + "The number of yes in the exposed group is slighlty higher than the number of yes in the control group.\n", + "We cannot conclude that the creative Ad has resulted in increaded awareness of the brand Lux. To conclude whether the creative Ad has brought about an \n", + "increase in brand awareness, we have to consider other metrics such as the Base Conversion rate (BCR), the minimum detectable effect (MDE)\n", + "and the statistical significance level" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0a792579-f8d3-4406-8a5d-a81233927248", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/AD-campaign-modellingj.ipynb b/notebooks/AD-campaign-modellingj.ipynb new file mode 100644 index 0000000..89b6bb4 --- /dev/null +++ b/notebooks/AD-campaign-modellingj.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "602cf0cc-024c-4933-b393-d986bd5e8066", + "metadata": {}, + "outputs": [], + "source": [ + "import dvc.api" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "98443cac-7478-4b51-ba61-936ffdf42f67", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/AD-campaign-sequential-Hypothesis-Testing.ipynb b/notebooks/AD-campaign-sequential-Hypothesis-Testing.ipynb new file mode 100644 index 0000000..18c7366 --- /dev/null +++ b/notebooks/AD-campaign-sequential-Hypothesis-Testing.ipynb @@ -0,0 +1,469 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "5ac05fa8", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt \n", + "import scipy.stats as scs\n", + "import random\n", + "import math" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e68b86fd", + "metadata": {}, + "outputs": [], + "source": [ + "import warnings\n", + "warnings.filterwarnings('ignore')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "74d74227", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv('../data/AdSmartABdata.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3ab1dd84", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Numerical Columns: ['hour', 'platform_os', 'yes', 'no']\n", + "****************\n", + "Categorical Columns: ['auction_id', 'experiment', 'date', 'device_make', 'browser']\n" + ] + } + ], + "source": [ + "#seeing the numerical and categorical data\n", + "numerical_column = df.select_dtypes(exclude=\"object\").columns.tolist()\n", + "categorical_column = df.select_dtypes(include=\"object\").columns.tolist()\n", + "print(\"Numerical Columns:\", numerical_column)\n", + "print(\"****************\")\n", + "print(\"Categorical Columns:\", categorical_column)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c8554b61", + "metadata": {}, + "outputs": [], + "source": [ + "user_grp = df.groupby(['experiment']) " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e8c65089", + "metadata": {}, + "outputs": [], + "source": [ + "control = user_grp.get_group('control')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "72fb56c3", + "metadata": {}, + "outputs": [], + "source": [ + "exposed = user_grp.get_group('exposed')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "71a36e6e", + "metadata": {}, + "outputs": [], + "source": [ + "# df['date+hour'] = pd.to_datetime(df['date'] + ':'+ df['hour'], format='%Y-%m-%d:%H', errors='raise')\n", + "# df" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "27aca9f1", + "metadata": {}, + "outputs": [], + "source": [ + "def transform_data(df):\n", + " '''\n", + " segment data into exposed and control groups\n", + " consider that SmartAd runs the experment hourly, group data into hours. \n", + " Hint: create new column to hold date+hour and use df.column.map(lambda x: pd.Timestamp(x,tz=None).strftime('%Y-%m-%d:%H'))\n", + " create two dataframes with bernouli series 1 for posetive(yes) and 0 for negative(no)\n", + " Hint: Given engagement(sum of yes and no until current observation as an array) and success (yes countas an array), the method generates random binomial distribution\n", + " #Example\n", + " engagement = np.array([5, 3, 3])\n", + " yes = np.array([2, 0, 3]) \n", + " Output is \"[1] 1 0 1 0 0 0 0 0 1 1 1\", showing a binary array of 5+3+3 values\n", + " of which 2 of the first 5 are ones, 0 of the next 3 are ones, and all 3 of\n", + " the last 3 are ones where position the ones is randomly distributed within each group.\n", + "\n", + " '''\n", + " relevant_rows = df.query('yes == 1 | no == 1')\n", + "\n", + " grouped = relevant_rows.groupby('experiment')\n", + " exposed_df = grouped.get_group('exposed')\n", + " control_df = control = grouped.get_group('control')\n", + "\n", + " exposed_df['engagement'] = exposed_df['yes'] + exposed_df['no']\n", + " control_df['engagement'] = control_df['yes'] + control_df['no']\n", + "\n", + " exposed_df['success'] = exposed_df['yes'] \n", + " control_df['success'] = control_df['yes'] \n", + "\n", + " expo_p = sum(exposed_df['success']) / sum(exposed_df['engagement'])\n", + " cont_p = sum(control_df['success']) / sum(control_df['engagement'])\n", + "\n", + " exposed_engagement = exposed_df['engagement'].to_numpy()\n", + " control_engagement = control_df['engagement'].to_numpy()\n", + "\n", + " exposed = np.random.choice([0, 1], size=((np.sum(exposed_engagement)),), p=[expo_p, 1-expo_p])\n", + " control = np.random.choice([0, 1], size=((np.sum(control_engagement)),), p=[cont_p , 1-cont_p ])\n", + "\n", + "\n", + " \n", + " return exposed, control" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "98c45420", + "metadata": {}, + "outputs": [], + "source": [ + "def conditionalSPRT(x,y,t1,alpha=0.05,beta=0.10,stop=None):\n", + " \"\"\"\n", + " #\n", + " # Meeker's SPRT for matched `x` (treatment) and `y` (control), \n", + " # both indicator responses, likelihood ratio t1, error rates alpha and beta,\n", + " # and (optionally) truncation after trial stop.\n", + " #\n", + " # The return variable contains these elements:\n", + " #(outcome,n, k,l,u,truncated,truncate_decision,x1,r,stats,limits)\n", + " # * outcome: \"continue,\" \"reject null,\" or \"accept null\".\n", + " # * n: number observation used for the decsion\n", + " # * k: Index at which the outcome decision was made (or NA)\n", + " # * l: lower critical point\n", + " # * u: upper critical point\n", + " # * truncate_decision: The approximate decision made after truncate point\n", + " # * truncated: If the test was truncated, the value of `n.0`; NA otherwise\n", + " # * x1: Original data `x`, cumulative\n", + " # * r: Cumulative sum of x+y\n", + " # * stats: Series of cumulative sums of log probability ratios\n", + " # * limits: Two rows giving lower and upper critical limits, respectively\n", + " #\n", + " \"\"\"\n", + " \n", + " if t1<=1:\n", + " print('warning',\"Odd ratio should exceed 1.\")\n", + " if (alpha >0.5) | (beta >0.5):\n", + " print('warning',\"Unrealistic values of alpha or beta were passed.\"\n", + " +\" You should have good reason to use large alpha & beta values\")\n", + " if stop!=None:\n", + " stop=math.floor(n0)\n", + "\n", + " def comb(n, k):\n", + " return math.factorial(n) // math.factorial(k) // math.factorial(n - k)\n", + "\n", + " def lchoose(b, j):\n", + " a=[]\n", + " if (type(j) is list) | (isinstance(j,np.ndarray)==True):\n", + " if len(j)<2:\n", + " j=j[0]\n", + " if (type(j) is list) | (isinstance(j,np.ndarray)==True):\n", + " for k in j:\n", + " n=b\n", + " if (0 <= k) & (k<= n):\n", + " a.append(math.log(comb(n,k)))\n", + " else:\n", + " a.append(0)\n", + " else:\n", + " n=b\n", + " k=j\n", + " if (0 <= k) & (k<= n):\n", + " a.append(math.log(comb(n,k)))\n", + " else:\n", + " a.append(0)\n", + "\n", + " return np.array(a)\n", + "\n", + " def g(x,r,n,t1,t0=1):\n", + " return -math.log(h(x,r,n,t1))+math.log(h(x,r,n,t0))\n", + "\n", + " def h(x,r,n,t=1):\n", + " \n", + " return f(r,n,t,offset=ftermlog(x,r,n,t))\n", + "\n", + " def f(r,n,t,offset=0):\n", + " upper=max(0,r-n)\n", + " lower=min(n,r)\n", + " rng=list(range(upper,lower+1))\n", + " return np.sum(fterm(rng,r,n,t,offset))\n", + "\n", + " def fterm(j,r,n,t,offset=0):\n", + " ftlog=ftermlog(j,r,n,t,offset)\n", + " return np.array([math.exp(ex) for ex in ftlog])\n", + "\n", + " def ftermlog(j,r,n,t,offset=0):\n", + " \n", + " xx=r-j\n", + " lch=lchoose(n,j)\n", + " lchdiff=lchoose(n,xx)\n", + " lg=np.array(j)*math.log(t)\n", + " lgsum=lch+lchdiff\n", + " lgsum2=lgsum+lg\n", + " lgdiff=lgsum2-offset\n", + "\n", + " return lgdiff\n", + "\n", + " def logf(r,n,t,offset=0):\n", + " \n", + " z=f(r,n,t,offset)\n", + " if z>0:\n", + " return math.log(z)\n", + " else:\n", + " return np.nan\n", + "\n", + " def clowerUpper(r,n,t1c,t0=1,alpha=0.05,beta=0.10):\n", + " \n", + " offset=ftermlog(math.ceil(r/2),r,n,t1c)\n", + " z=logf(r,n,t1c,logf(r,n,t0,offset)+offset)\n", + " a=-math.log(alpha/(1-beta))\n", + " b=math.log(beta/(1-alpha))\n", + " lower=b\n", + " upper=1+a\n", + " return (np.array([lower,upper])+z)/math.log(t1c/t0)\n", + "\n", + " l=math.log(beta/(1-alpha))\n", + " u=-math.log(alpha/(1-beta))\n", + " sample_size=min(len(x),len(y))\n", + " n=np.array(range(1,sample_size+1))\n", + "\n", + " if stop!=None:\n", + " n=np.array([z for z in n if z<=stop])\n", + " x1=np.cumsum(x[n-1])\n", + " r=x1+np.cumsum(y[n-1])\n", + " stats=np.array(list(map(g,x1, r, n, [t1]*len(x1)))) #recurcively calls g\n", + " #\n", + " # Perform the test by finding the first index, if any, at which `stats`\n", + " # falls outside the open interval (l, u).\n", + " #\n", + " clu=list(map(clowerUpper,r,n,[t1]*len(r),[1]*len(r),[alpha]*len(r), [beta]*len(r)))\n", + " limits=[]\n", + " for v in clu:\n", + " inArray=[]\n", + " for vin in v:\n", + " inArray.append(math.floor(vin))\n", + " limits.append(np.array(inArray))\n", + " limits=np.array(limits)\n", + "\n", + " k=np.where((stats>=u) | (stats<=l))\n", + " cvalues=stats[k]\n", + " if cvalues.shape[0]<1:\n", + " k= np.nan\n", + " outcome='Unable to conclude.Needs more sample.'\n", + " else:\n", + " k=np.min(k)\n", + " if stats[k]>=u:\n", + " outcome=f'Exposed group produced a statistically significant increase.'\n", + " else:\n", + " outcome='Their is no statistically significant difference between two test groups'\n", + " if (stop!=None) & (k==np.nan):\n", + " #\n", + " # Truncate at trial stop, using Meeker's H0-conservative formula (2.2).\n", + " # Leave k=NA to indicate the decision was made due to truncation.\n", + " #\n", + " c1=clowerUpper(r,stop,t1,alpha,beta)\n", + " c1=math.floor(np.mean(c1)-0.5)\n", + " if x1[n0]<=c1:\n", + " truncate_decision='h0'\n", + " outcome='Maximum Limit Decision. The aproximate decision point shows their is no statistically significant difference between two test groups'\n", + " else:\n", + " truncate_decision='h1'\n", + " outcome=f'Maximum Limit Decision. The aproximate decision point shows exposed group produced a statistically significant increase.'\n", + " truncated=stop\n", + " else:\n", + " truncate_decision='Non'\n", + " truncated=np.nan\n", + " return (outcome,n, k,l,u,truncated,truncate_decision,x1,r,stats,limits)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "0e9c4e2e", + "metadata": {}, + "outputs": [], + "source": [ + "class ConditionalSPRT:\n", + " \n", + " def __init__(self, x, y, odd_ratio, alpha=0.05, beta=0.10, stop=None):\n", + " self.x = x\n", + " self.y = y\n", + " self.odd_ratio = odd_ratio\n", + " self.alpha = alpha\n", + " self.beta = beta\n", + " self.stop = stop\n", + " \n", + " def run(self):\n", + " res = conditionalSPRT(self.x, self.y, self.odd_ratio,\n", + " self.alpha, self.beta,\n", + " self.stop)\n", + " return res\n", + " def resJson(self, res):\n", + " outcome,n, k,l,u,truncated,truncate_decision,x1,r,stats,limits = res\n", + " jsonRes = {\n", + " \"name\": \"Sequential AB testing\",\n", + " \"outcome\": outcome,\n", + " \"decsionMadeIndex\": k,\n", + " \"numberOfObservation\": len(n),\n", + " \"truncated\": truncated,\n", + " \"truncateDecision\": truncate_decision, \n", + " \n", + " }\n", + " return jsonRes\n", + " \n", + " def plotExperiment(self, res):\n", + " outcome,n, k,l,u,truncated,truncate_decision,x1,r,stats,limits = res\n", + " lower = limits[:, 0]\n", + " upper = limits[:,1]\n", + "\n", + " fig, ax = plt.subplots(figsize=(12,7))\n", + "\n", + " ax.plot(n, x1, label='Cumlative value of yes+no')\n", + "\n", + " ax.plot(n, lower, label='Lower Bound', linestyle='--')\n", + " ax.plot(n, upper, label='Upper Bound', linestyle='--')\n", + "\n", + " plt.legend()\n", + "\n", + "\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "54721502", + "metadata": {}, + "outputs": [], + "source": [ + "##data processing here\n", + "exposed_group,control_group=transform_data(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "4fb02dd9", + "metadata": {}, + "outputs": [], + "source": [ + "# odd ratio\n", + "#odd_ratio=(expo_p/(1-expo_p))/(cont_p /(1-cont_p ))\n", + "odd_ratio = 1.01\n", + "alpha = 0.05\n", + "beta = 0.1" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "f6d117fb", + "metadata": {}, + "outputs": [], + "source": [ + "conditionalSPRTObj = ConditionalSPRT(exposed_group,control_group, odd_ratio, alpha, beta)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "2029cae9", + "metadata": {}, + "outputs": [], + "source": [ + "res = conditionalSPRTObj.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "836cb513", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAs4AAAGbCAYAAADURxb1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABm7klEQVR4nO3dd5xU1f3/8deZ2V7Z3mFZ6lIXWJDeVFBA0MTeW6yJJsbEaJqm+v3Gb6LJNyYxxfhNNGr0p1iwKwpKEXDpvW9vbK8zc35/3GWBgLoK7Gx5Px+PfTBz7rkzn/Hi7puz555jrLWIiIiIiMhnc/m7ABERERGR7kDBWURERESkAxScRUREREQ6QMFZRERERKQDFJxFRERERDogwN8FdFR8fLzNzMz0dxkiIiIi0oOtXbu23FqbcKJj3SY4Z2ZmsmbNGn+XISIiIiI9mDFm/6cd01QNEREREZEOUHAWEREREekABWcRERERkQ7oNnOcT6S1tZX8/Hyampr8XYrIpwoJCSE9PZ3AwEB/lyIiIiInoVsH5/z8fCIjI8nMzMQY4+9yRI5jraWiooL8/Hz69+/v73JERETkJHTrqRpNTU3ExcUpNEuXZYwhLi5OvxURERHpAbp1cAYUmqXL099RERGRnqHbB2cRERERkc6g4HySiouLufTSSxkwYADDhg1j3rx57Nix46Rfd9++fYwYMeJz+zz11FPtz9esWcMdd9xx0u/9RS1dupQFCxac1vdYtmwZw4cPJycnh8bGxtP6XiIiIiInouB8Eqy1XHDBBcycOZPdu3ezZcsWfvGLX1BSUtIp7/+fwTk3N5ff/va3nfLene3JJ5/k7rvvJi8vj9DQ0NP6XtraXURERE5EwfkkvPfeewQGBnLLLbe0t+Xk5DBt2rTjRmG//vWv8/e//x1wgtl9993HpEmTyM3NZd26dcydO5cBAwbwxz/+8bj32bdvH9OmTWPs2LGMHTuWjz76CIDvfe97LFu2jJycHH7zm9+0v6fP5yMzM5Oqqqr21xg4cCAlJSWUlZXx1a9+lfHjxzN+/Hg+/PDD497vjDPOYPPmze3PZ86cydq1a1m9ejWTJ09mzJgxTJ48me3btx937v33389DDz3U/nzEiBHs27cPgH/+859MmDCBnJwcbr75Zrxe73Hnv/POO4wZM4aRI0dy/fXX09zczF/+8heeffZZfvKTn3DFFVcc0/+HP/whjzzySPvz73//++3/ePjVr37F+PHjGTVqFD/+8Y8BqK+vZ/78+YwePZoRI0bwzDPPHFfDidx///1cf/31zJw5k6ysrGP+gfLrX/+aESNGMGLECB5++OEOvZ6IiIh0P916ObqjPfDyZrYU1pzS1xyWGsWPzxv+qcc3bdrEuHHjvtRrZ2RksGLFCr71rW9x7bXX8uGHH9LU1MTw4cOPCeIAiYmJvPXWW4SEhLBz504uu+wy1qxZw4MPPshDDz3EK6+8AjhTJgBcLheLFi3ihRde4LrrrmPVqlVkZmaSlJTE5Zdfzre+9S2mTp3KgQMHmDt3Llu3bj3m/S699FKeffZZHnjgAYqKiigsLGTcuHHU1NTwwQcfEBAQwNtvv819993H888/36HPu3XrVp555hk+/PBDAgMDue2223jyySe5+uqr2/s0NTVx7bXX8s477zB48GCuvvpq/vCHP/DNb36T5cuXs2DBAi688MJjXveGG27gK1/5CnfeeSc+n4+nn36a1atX8+abb7Jz505Wr16NtZaFCxfywQcfUFZWRmpqKq+++ioA1dXVHb5m27Zt47333qO2tpYhQ4Zw6623smHDBh5//HFWrVqFtZYzzjiDGTNmMGbMmA6/roiIiHQPPSY4dzcLFy4EYOTIkdTV1REZGUlkZCQhISHHjBSDs9HL17/+dfLy8nC73R2aQ33JJZfwk5/8hOuuu46nn36aSy65BIC3336bLVu2tPerqamhtraWyMjI9raLL76Ys88+mwceeIBnn32Wiy66CHBC5jXXXMPOnTsxxtDa2trhz/vOO++wdu1axo8fD0BjYyOJiYnH9Nm+fTv9+/dn8ODBAFxzzTX8/ve/55vf/Oanvm5mZiZxcXF88sknlJSUMGbMGOLi4njzzTd588032wNsXV0dO3fuZNq0adx9993cc889LFiwgGnTpgFw++23t4++FxYWkpOTA8BFF13E97//fQDmz59PcHAwwcHBJCYmUlJSwvLly7ngggsIDw8H4Ctf+QrLli1TcBYREemBekxw/qyR4dNl+PDhPPfccyc8FhAQgM/na3/+n+v4BgcHA87o8OHHh597PJ5j+v7mN78hKSmJ9evX4/P5CAkJ+dzaJk2axK5duygrK+PFF1/kBz/4AQA+n48VK1Z85jzhtLQ04uLi2LBhA888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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "conditionalSPRTObj.plotExperiment(res)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8e215744", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/scripts/ABTestingFunctions.py b/scripts/ABTestingFunctions.py new file mode 100644 index 0000000..08b6fa6 --- /dev/null +++ b/scripts/ABTestingFunctions.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- +""" +Created on Mon May 16 14:13:15 2022 + +@author: kiiru +""" + +import numpy as np +import scipy.stats as scs + +class ABTesting: + def _init_(self): + """ + Initializing ABTesting class with functions used on ABTesting + """ + + def pooled_prob(self, Control, Exposed, X_A, X_B): + """Returns pooled probability for two samples + """ + return (X_A + X_B) / (Control + Exposed) + + def pooled_SE(self, Control, Exposed, X_A, X_B): + """Returns the pooled standard error for two samples""" + p_hat = self.pooled_prob(Control, Exposed, X_A, X_B) + SE = np.sqrt(p_hat * (1 - p_hat) * (1/Control + 1/Exposed)) + return SE + + def z_val(self, sig_level=0.05, two_tailed=True): + """ + Returns the z value for a given significance level + """ + z_dist = scs.norm() + if two_tailed: + sig_level = sig_level/2 + area = 1 - sig_level + else: + area = 1 - sig_level + + z = z_dist.ppf(area) + + return z + + def confidence_interval(self, sample_mean=0, sample_std=1, sample_size=1, + sig_level=0.05): + """ + Returns the confidence interval as a tuple + """ + z = self.z_val(sig_level) + + left = sample_mean - z * sample_std/np.sqrt(sample_size) + right = sample_mean + z * sample_std/np.sqrt(sample_size) + + return (left,right) + + def ab_dist(self, stderr, mde=0, group_type='control'): + """ + Returns a distribution object depending on group type + Examples: + Parameters: + stderr (float): pooled standard error of two independent samples + mde (float): the mean difference between two independent samples + group_type (string): 'control' and 'exposed' are supported + Returns: + dist (scipy.stats distribution object) + """ + if group_type == 'control': + sample_mean = 0 + + elif group_type == 'exposed': + sample_mean = mde + + # create a normal distribution which is dependent on mean and std dev + dist = scs.norm(sample_mean, stderr) + + return dist + + def p_val(self, Control, Exposed, p_A, p_B): + """ + Returns the p_value for an A/B test + """ + return scs.binom(Control, p_A).pmf(p_B * Exposed) + + \ No newline at end of file diff --git a/scripts/DistributionPlots.py b/scripts/DistributionPlots.py new file mode 100644 index 0000000..c0a2420 --- /dev/null +++ b/scripts/DistributionPlots.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +""" +Created on Mon May 16 13:33:18 2022 + +@author: kiiru +""" + +import matplotlib.pyplot as plt +import numpy as np + +import scipy.stats as scs +from HypothesisPlot import HypothesisPlot +HPP = HypothesisPlot() +#hypo_plot + +class DistributionPlots: + def _init_(self): + """ + Initializing DistributionPlots class + """ + + def cont_distribution(self, C_aware, C_total, C_cr, E_cr) -> None: + fig, ax = plt.subplots(figsize=(12,6)) + x = np.linspace(C_aware-49, C_aware+50, 100) + y = scs.binom(C_total, C_cr).pmf(x) + ax.bar(x, y, alpha=0.5) + ax.axvline(x=E_cr * C_total, c='blue', alpha=0.75, linestyle='--') + plt.xlabel('Aware') + plt.ylabel('probability') + plt.show() + + def cont_exp_distribution(self, C_aware, E_aware, C_total, E_total, C_cr, E_cr) -> None: + fig, ax = plt.subplots(figsize=(12,6)) + xC = np.linspace(C_aware-49, C_aware+50, 100) + yC = scs.binom(C_total, C_cr).pmf(xC) + ax.bar(xC, yC, alpha=0.5) + xE = np.linspace(E_aware-49, E_aware+50, 100) + yE = scs.binom(E_total, E_cr).pmf(xE) + ax.bar(xE, yE, alpha=0.5) + plt.xlabel('Aware') + plt.ylabel('probability') + #plt.show() + + def null_alt_distribution(self, C_total, E_total, C_cr, E_cr) -> None: + bcr = C_cr + mde = E_cr - C_cr + HPP.hypo_plot(C_total, E_total, bcr, mde, show_power=True, show_beta=True, show_alpha=True, show_p_value=True) \ No newline at end of file diff --git a/scripts/HypothesisPlot.py b/scripts/HypothesisPlot.py new file mode 100644 index 0000000..022a6a9 --- /dev/null +++ b/scripts/HypothesisPlot.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +""" +Created on Mon May 16 14:02:24 2022 + +@author: kiiru +""" + + +import matplotlib.pyplot as plt +from ABTestingFunctions import ABTesting +ABT = ABTesting() +#pooled_SE, ab_dist, p_val + +from PlottingFunctions import PlottingFunctions +PLTF = PlottingFunctions() +#plot_null, plot_alt, show_area + +class HypothesisPlot: + def _init_(self): + """ + Initializing HypothesisPlot class + """ + + def hypo_plot(self, Control, Exposed, bcr, mde, sig_level=0.05, show_power=False, show_beta=False, + show_alpha=False, show_p_value=False, show_legend=True): + """ + Example plot of AB test + Example: + abplot(n=4000, bcr=0.11, mde=0.03) + Parameters: + n (int): total sample size for both control and test groups (N_A + N_B) + bcr (float): base conversion rate; conversion rate of control + mde: difference in conversion rate between the control and test + groups. It is the **minimal detectable effect** when + calculating minimum sample size or **lift** when discussing + positive improvement desired from launching a change. + Returns: + None: the function plots an AB test as two distributions for + visualization purposes + """ + #create a plot object + fig, ax = plt.subplots(figsize=(12, 6)) + + # define parameters to find pooled standard error + X_C = bcr * Control + X_E = (bcr + mde) * Exposed + stderr = ABT.pooled_SE(Control, Exposed, X_C, X_E) + + # plot the distribution of the null and alternative hypothesis + PLTF.plot_null(ax, stderr) + PLTF.plot_alt(ax, stderr, mde) + + # set extent of plot area + ax.set_xlim(-8 * stderr, 8 * stderr) + + # shade areas according to user input + if show_power: + PLTF.show_area(ax, mde, stderr, sig_level, area_type='power') + if show_alpha: + PLTF.show_area(ax, mde, stderr, sig_level, area_type='alpha') + if show_beta: + PLTF.show_area(ax, mde, stderr, sig_level, area_type='beta') + + # show p_value based on the binomial distributions for the two groups + if show_p_value: + null = ABT.ab_dist(stderr, 'control') + p_value = ABT.p_val(Control, Exposed, bcr, bcr+mde) + ax.text(3 * stderr, null.pdf(0), + 'p-value = {0:.3f}'.format(p_value), + fontsize=12, ha='left') + + # option to show legend + if show_legend: + plt.legend() + + plt.xlabel('d') + plt.ylabel('PDF') + plt.show() + + + \ No newline at end of file diff --git a/scripts/PlottingFunctions.py b/scripts/PlottingFunctions.py new file mode 100644 index 0000000..0356c22 --- /dev/null +++ b/scripts/PlottingFunctions.py @@ -0,0 +1,130 @@ +# -*- coding: utf-8 -*- +""" +Created on Mon May 16 14:45:27 2022 + +@author: kiiru +""" + + +import numpy as np +import scipy.stats as scs + +from ABTestingFunctions import ABTesting +ABT = ABTesting() + +class PlottingFunctions: + def _init_(self): + """ + Initializing PlottingFunctions class + """ + + def plot_norm_dist(self, ax, mu, std, with_CI=False, sig_level=0.05, label=None): + """ + Adds a normal distribution to the axes provided + Example: + plot_norm_dist(ax, 0, 1) # plots a standard normal distribution + Parameters: + ax (matplotlib axes) + mu (float): mean of the normal distribution + std (float): standard deviation of the normal distribution + Returns: + None: the function adds a plot to the axes object provided + """ + x = np.linspace(mu - 12 * std, mu + 12 * std, 1000) + y = scs.norm(mu, std).pdf(x) + ax.plot(x, y, label=label) + + if with_CI: + self.plot_CI(ax, mu, std, sig_level=sig_level) + + def plot_CI(self, ax, mu, s, sig_level=0.05, color='grey'): + """ + Calculates the two-tailed confidence interval and adds the plot to + an axes object. + Example: + plot_CI(ax, mu=0, s=stderr, sig_level=0.05) + Parameters: + ax (matplotlib axes) + mu (float): mean + s (float): standard deviation + Returns: + None: the function adds a plot to the axes object provided + """ + left, right = ABT.confidence_interval(sample_mean=mu, sample_std=s, + sig_level=sig_level) + ax.axvline(left, c=color, linestyle='--', alpha=0.5) + ax.axvline(right, c=color, linestyle='--', alpha=0.5) + + def plot_null(self, ax, stderr): + """ + Plots the null hypothesis distribution where if there is no real change, + the distribution of the differences between the test and the control groups + will be normally distributed. + The confidence band is also plotted. + Example: + plot_null(ax, stderr) + Parameters: + ax (matplotlib axes) + stderr (float): the pooled standard error of the control and test group + Returns: + None: the function adds a plot to the axes object provided + """ + self.plot_norm_dist(ax, 0, stderr, label="Null") + self.plot_CI(ax, mu=0, s=stderr, sig_level=0.05) + + def plot_alt(self, ax, stderr, mde): + """ + Plots the alternative hypothesis distribution where if there is a real + change, the distribution of the differences between the test and the + control groups will be normally distributed and centered around d_hat + The confidence band is also plotted. + Example: + plot_alt(ax, stderr, mde=0.025) + Parameters: + ax (matplotlib axes) + stderr (float): the pooled standard error of the control and test group + Returns: + None: the function adds a plot to the axes object provided + """ + self.plot_norm_dist(ax, mde, stderr, label="Alternative") + + def show_area(ax, mde, stderr, sig_level, area_type=None): + """ + Fill between upper significance boundary and distribution for + alternative hypothesis + """ + left, right = ABT.confidence_interval(sample_mean=0, sample_std=stderr, + sig_level=sig_level) + x = np.linspace(-12 * stderr, 12 * stderr, 1000) + null = ABT.ab_dist(stderr, 'control') + alternative = ABT.ab_dist(stderr, mde, 'exposed') + + # if area_type is power + # Fill between upper significance boundary and distribution for alternative + # hypothesis + if area_type == 'power': + ax.fill_between(x, 0, alternative.pdf(x), color='green', alpha='0.25', + where=(x > right)) + ax.text(-5 * stderr, null.pdf(0), + 'power = {0:.3f}'.format(1 - alternative.cdf(right)), + fontsize=12, ha='right', color='k') + + # if area_type is alpha + # Fill between upper significance boundary and distribution for null + # hypothesis + if area_type == 'alpha': + ax.fill_between(x, 0, null.pdf(x), color='blue', alpha='0.25', + where=(x > right)) + ax.text(-3 * stderr, null.pdf(0), + 'alpha = {0:.3f}'.format(1 - null.cdf(right)), + fontsize=12, ha='right', color='k') + + # if area_type is beta + # Fill between distribution for alternative hypothesis and upper + # significance boundary + if area_type == 'beta': + ax.fill_between(x, 0, alternative.pdf(x), color='red', alpha='0.25', + where=(x < right)) + ax.text(-1 * stderr, null.pdf(0), + 'beta = {0:.3f}'.format(alternative.cdf(right)), + fontsize=12, ha='right', color='k') \ No newline at end of file diff --git a/scripts/WhatsApp Image 2022-05-18 at 7.51.21 PM.jpeg b/scripts/WhatsApp Image 2022-05-18 at 7.51.21 PM.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..d1cf0522fc83d64f51abd75a0757f6229b5f0dda GIT binary patch literal 68119 zcmeFa2_Ti-w?BT&lrmRjo~J^{?3g*`StKH}O2&|x3Yq75p69tp6v{kLQ4z^3amdX7 zIXI|S@B4k<`@Q#f@BQEBobx<;Sf91mUVH7e*WTx(z4v>cLDHio=1;Wo7(eTMmHfrO z?cuk{GmVjSs<6bXEjCDgbSYoby$Z#a%kGov=C;Y5=hZDt6gs3Q!<&Zn*A3C_u;9dF zs=%>`=0yHDiO{K?Dbzl;8)k1`tHQp#TbO!hS$&6ldtwhH&#%k3>XZO3PZTX8?6C90zm~7DS9WtpUa*jAsBwDrGfDO9 z6D(j!>CzN{3-M~FI&#u4RR>v~xv*)_K~;=(KXM$tM^D$-yN01YB|CA-TD?aRa zWa%L3@UcXm;U%XB0XDaKTl%QMlL@4RN_n?~9-V+8+QcXx_330rKJ;H6;FGWutU;g? zng25JkR5Jn`ZoF2F`?&C7WvjsJ*e_Zg4-gtKkoolKckW9)%(}+*df*&ejn#TBqjM{ zBWDWG25xwrP>85ndhXHKN<^xK-h^I1J`V&qhn;E(~Q38v2#SS zOSSa?C22NBz4UT`o)LKEy-%Hah!;DpZzlm1G&g92>FMF7f_lGl?uNQr7(OtUN+boW zje_IdK!o;-{?GyTA`l2w&f%(UOG(7I2?&J5Ip%Dn7JeHb1!1VGNtw2%?YlBMNH<{O z=N+eV5#jR!pa3qz-pkP?AA6Q^91A;l1ajxAwDWtZqfb zeC)D@7AM4+Lb4)&=}t$Y-DfJyiL>u26lgaF9HIR!C3)35P?y5AB}ak41Sf@Cld`K{ zH7V65Te3Pb0QcacTa*{K_O3XykWSEck>4VBo_~n+WrzEm?fA!)WrGdtxrsrV1&O=+ zJ_yV{s4k%RD#4b;WP5j1G8C_CvxZLRdBgJV=AGun9#XzxpQnRw%bvsy3&Hw`XcLbO z=>3mg{y|W8r#fQwqL>5A4g2RSuaU;C;AY{v!DkslY=PqdLAYV_K*+?G2VNEE4mC}` zjC0vaX?3NuuzR)s#tVm?`-JR{(f@eJv1`m@9|PhdB#JTjuqVO%K&B81P|!XoV1A~h z#KR4+9I2^-yFGw$A+eAw)i}NbY#!8HNYhcNuKW>Z!A8|Ad4Q^64h4a+CHovtnL7ti z{JWWpbTv!6pF;JqGJ%vD@VN8iGr;7?x}`R+7FgSGN>b^Tn5fV==- z$Pd@^Qy&4JlrvIJEZ#O^MF&m_y;^X;)h+-n1hve|J=?pk_g~ag6Rul6QGn&J&q!scoJL`^>bINZ9 zg{}=PDXVj%uxnkX_Cowf*t#SAn@rxKPNARFd1#6tAjar%hgI!+nj4Vj7Y&vSK|@P(kj!b$TiOG$YzDR_cCp=C;{86(+CBGuvmYuDNcR#7 zPTuaEd-(uod5byxwnQEc#Uo^z7suvtu;>7Dl~;})wjdoWKNR*lufu>G>OGzU<3ie( zm<;*1HugYrqt|Ti>JJ!|-OKAthdL-R11?y9@UofyhfpoatUB{s*S0ygq2JV_-bFe` z^G?0G6OYp$FVT>c1lm~R)$AJU8UsvitbkzBg=!5P<}YZxGTO%CUX@q|j&v2>Zp_nN z-UDTASMGquz$}|AZM(IDV}|`-9d>kFXPk6Z3dz8QH3`Pisk&1OJ7{0`K$2r-j(Z@( ziD*~JiN%>#jj6Itp3#x)%=Wn$zq!C#mqfwsXvHL;8^CoC|G<3CL4b4+>WX}SwI2dv z4qIz?>PQbYUdGeW7N~BXdRR4yC8izWUmojcf)Aq5RG*@)j+uWOJ0NG+IEQsnBZ+@4 z3Di7FGDq};7vO#v89BIy?if#WPLoCNa81f47H>bCS9s@`pqmBn7}AANs!TGzRnm(u zYb-i%8 z+?ybTvv01#h6%VZ;FcgCDh*p2fTe2obr`zN#r^#YLae-b^wQ`D{yEdM8o~GrJa3^qLij~WrZ(wPFyzIo%tv$fD?0ut0OZ#)@Ia4C(Rm%*xFiLOd} z_nxMGLjIA2Q84G($at@(YV5$9=gsh_`5#T{giA?14tct|GUr`@;#lj)jz@OHsHk_VAIx2C{`{nJ?`Vp%KDn%h&o^|@rR3?^Rd%z z`X_$vf;~`;;kiEO-MbE(=QpQv8G$hJ;QDzLKElAo89V;q&q z(Ed7vh?Qsy+qDRRFl;+NT;Wx?zQ1xF6T(vmn~=lY&+ZOR0+`Y8^@9b{xJ!27EPEMd z$tZ8E2=Ls*5H|ebbwas6okje7GVxRHI_P*ic5p=TceLb<~+%o&|(f4 zeT-7Deu-v&@YMZBIvp*(9nnVS(`g18L(Z zAK|3m~N3s{f56~2bct`{5{F#S>aip#Sc(E1;dS6v6T@Pv~no)a-i*$BjbT6KQB^n z@hBXIdZLqFQ#F?>S9{hkKew}g$%StExNCol42K*)H{K%i76v2) zwh=wk5Tuf};Vd!X`Ii2r=z!uk;{}JasYp-34kg%~`hczYZ!8KeaoQ?@j4YY-YM_*T z)hmS0_g36s?hbbC9~!!!t^4tt6TJhfQ|`do^tusQ9(Cf5z`eM1|5fI zbcq)=|1IJEzh~26nJ5fOI;A6jqlgSRLq~+4iGz>;B*ouA|1~L6C-I{_P@H8W@n5{X zPUnS)8A8!_?1qE@DopazNlz<9#3X^V<3kRskn{3Dvr(+|m_NOnPXiv5A!7bi$8*~- zOX#N(AOq9cZ!S2Td%r~v0Z}BtL4Mt(AGdb?v2AX1l)@9s%ehv=xy1Q24*ucLG4| zTi;$E!jV~9nM+_Z1bG=qG{P(gx1PDAmAS|bNFLh{Ec5dPx4NH8f6kpUaBzbEw{V1C z9Mfr8B%sh6F797He{ysH^!vX5X*>WTRR4ufuJikaz_dut34Fb_t z14F(Gk^v0-;4J_xVF$`jUI&^#)c*lor}0VCY&{5c;hhF+Z;Q~raRLxb5DLNbX<hZ@^6qqAX)wtbcEZYD5!TSl#y>hy2Dc7JWqqi3(&Lx zy5{nOwB_iVa=a{LcKpPS)uWNajqdN*uD z3~~_w`X_LCkOw;RA@_sFp{U5mYw(}Ie?kHo1VC%QUjI5A0c7buN*v5JD~GG)&`-o3W3gDHRTllOL&_;)=4;pII*P!zTP|RdVdRkmA9gptcTyG z{?a;P5^Rnla%O2LT=Y9=_vib$0%lQI>xb8`@S^>4w&=Bw__A=ClTUPNOJw}lMeC$E3aS_fM)PIkFOI?kO; zp;$KJA6NYbeiHCY+BKp2^-&SRX_j%Sxtvl6ay#Pl&k}#wpJ2lmn4^{EKayZp*#oVA zaoq#`$6pqQ3*Rr|fK_zP7VaJuRs-U1?SYQ+$BEqE;FUHruFcjS_PPbVwH>$h*Ad|Y zYJUe;`H3wbJMXuLKa~IiT>ne>a_D}Ot=028iEux0_E4lw{J(|=9(0qJ*%@K$uyy*s z59fzQI>Ax@41T2Te*#}V>;=H&zb|}K6sBKjCs+mc+}>QPSzhFaHVOg(_P*)_po@iD zi`9d$+EWH@5mwH(2Rg)q0Su6VaoSJq8?L}XiJ;1Fcof~Z*GF&%E&_N-%jS?pDTxzo zngQGd7TbXPZ#lR&GM6^evDTjts>ft2to;(eu?PBs$+l?wMV@=47cj-RMD=rCQ4fD3 z0ryrbvvmjHh;-Gz2&AF^F z?U!=^_k*$db14sNmpy;sa($l*@j-`|7U7EhXU}nkKgUfTS8u|To7>REec@oYYG@~5 z$C#{*)x<}u<7-UJf^GPK>{ITm{LrhkR3E^LN9$doz))QLM$Fx-u&r`9;H>pRgn^9w zA4YfPEDo^19X4XWz}MEfLlvx8>pA!_kh>IsZU7VtUr1(~f`tU|%IRuTZ{+H4!I_?h zFDIbsR0W#fspnwdpZ%}}riEVFP0;0uU(=`L+T$hXGqWuMQK!QanB1qp*Xuj^*MO?y_u=x^T76UqU+_+WAJH5p{P{yqusSIG8}Ryo z@4Ioo@Pxzhfb*b5f%#5X=Rx?${Xz+3;l#goXHotm5Pp0r1x9D5_X_lP3|x0T7hnFu z^?;?uEJJS#z;%B;`VD+Zx4IYWXu$%AIiPLarE=W8a{L;l4y%6+&r^DO5>Do_2O6yg zVi;E_W-s8)*<0FJ>-T&12LYC?VUyF+V*RlKgXAAZ0O*m1Ge^BITq}QoFDbyPmUP-t zqUcjkgWrER`fB~J;G@;h&a0=wp`90wwfdXZm!X&w^<*VSllP~@{wi@G*l*wf|7WL3 ze%$WqaPWrfVaTWOPvFe;=a>$f*aLNJ|Jv9eIsPg=xTtYotu2rWwZ9MVn5!V$1MRn( zqDl* z0loo3M?geC00Ys9brMRSmKaA8rckJyrPkG6^!$saUg~Gd>KOJw@1n#FMu_wXQWjW! zyX~UHOveh{NI~^)kWw_GdpbNnwtSB6OE-4&dD^4t&F2a zSJ*pWzKnNouyMj^9G%#uv_yB#7c9L!NarRu17Gc$ zKQ|@$hS+&mVVn;8>F~X&V!84WJ_b`Acjjb68f-V?K@QT$t}2dbTynhIJ8d?mN<9WK zCHls5ffiD9vS(?yG2``W@y=2#==k$Op2jY(djGI_DzB*#9-)tPzDRcBhiTyoSpM`@ z?06p@4bShVcOcR9X^A>O|ncAJ5*@u=K#Sy5Zw}0es-1_Hfu==&=q+`n>`m^pNQP&|_#t1}?v96OXIzO>mI-@X>Z5o;(Tz5C z4!YL7EjEt5C09Ljh2WaGu($&4%OYzMLbQ!*ul8pz;)*9jwp@dd z6pbj#6ItE9h&M}O{9w)lLLF~B3fElv+QdU<>3g*}-Ju`kDbUPxEjOnFXKm618DFm} z$G!{Q=|I5Bdk~lr{a%L(_vJNhvLC$02gCEtr=NDJO=zbhYBn^C?+GvN;pF1gb&<4c z$oQ~CLMTu+j%}B|Mpodxn<*_io`?0Aq1qJu@iX>jBl@Ok{Nr&prc#EXeK7v?ZHeKJABpLdI0a6w4Qs1WN3tsxuOYzLy z4Ku(obkk~&dVfD#Ag;`D+c;}qpOfV&lM2t_KMitxOEE!ORN#JtkQ~xy%nHu#30luZ z8k4qF7@!PV#=4Ql?>WGLMZW4Q+9aSyf(&g&>NoXKsC-Sa8i2FX%XhXxU&BbobGK3U za89+WmNNPqxStp0!^v^UAGT^-xTM+tRNd>)VRl5027fGOsMwa2P`JnKMUw5@IG1wN zs0ES28aJ|Fah+g{v7Wu3^nCLJ*Y`8=?$y)lRDqREb4JVAt@1M2GY-PsCP%jByg|~6 z8*9;EWALNbTX;C~qe~UlW;_FyZ;>E=#!?!vEV+r!5mU`%*j@B)C}@jB+X;w%f4L*j zgL^A3mRwz(T3#YqFl&p9Z`tq5ywhR}dtfoNmcB!IeYuo-gkbMD z5i--~@iY;k_-CnbOU+EnU7ld3xl{MoYC`=|;vRoE?Vcnpg?R4fDj9bRsk&@$ir-nS z-rZp)7TQZZq52DFJ~nW$+I^Ecip(U1AI(Sl^@*x@R!g)4OrWWk5z(0y_l+a39X zd)cWz9Q18mbV|&W5IN<|Dg1#MXKP<`o0`hEoK?Eo<1wFD3M}RBM-FmlJeQe^Q@NSG z+QE?D^S^^o3u%5(^ZBVgd*aXsNtd_EGJEupdCAloUzX*ei z5`HbcuWpz)OABS>R~(sT@AM5Z!#I7QRLacFBI6Z^(G915SQ<#^q_l%goPz|u*((b@vF5U z2%yG3ybJim_vbvTO@Z}klqsJZH7?NSwcaj%scO{9Qdp(=);uPf~eO`9}kM z86K(;y?3M95gS)XS@V*@&5uOWq~i51k<99gCTVP$r}dB-(=pzvRpG{2 z@PP=1&&SLNmgBm4z6keWcojYGXq=;d6Gu=4Gl!n>@pLd7s>v1~kzglO7}0Os*%??% ze;G(YI)ta|%DM&K{oU(<1F(e>={v9t--uk#PaEwc8Lf!?$S+#@LpI!^%#pP?+iJCO z(^oxGPIVdLr=abcF_CSPt*JmMw^?RW5Oi}Gw`6=J_yuW}y!USZ49!G@S5y?R0dU4} z4kJrn$<$Jn5u$j&)O1LJ+7O2mh2>EfRsRg4? zdex6e;CV0Dd*(6z9*8<@mTSAi?frdhS{&T=my2T*B~t|&CwH|!iFj0x8=5 zLcy|!v1uU{dd)hAVNlF`L89LBd>gRn7hOiP?**cR z8V#)n=l4L|Ne=_QpC-V=p>g{S1r7zgHNB#bqNU{ho?Iimcw!?nsS}dplqOMIlWX<| zGY8Fe>#6rccYvx0LQNsVgCD3`=lW4NGzi(ZaaK?`PBEz3ML5nm{MMPqn6ND*?qmx4 zZO_BI1GQqGc1YC}p39VoeN>yQ!eZj+p<5wYqSk!Po)xz$f4d3W=xWqk;c8j^%nhkL zIlKL2(g-cbkfeZ0c%1-++Egy&c$Khp}Ini1V*O@EVr*74RB%XLfoUmZWwsp=aE^gs#FJG`h9F zIk>=1XaSwVZ}&tv`9bl)v(4X)qGR1z>U+m?f2~BAj_`P z*!4mC#obHe0=0)G`cQI!3oG+>NQpPChT%t}z;Rx2DD=`URhllCEpVJ>nykY4&f-yi zztU7w1CPDbf_*DHvHmA5oz&QWW*Wt3VH>A$F?=8nsY8gg{`>RbF8*~|1P zkK+LQMJ1}#B(}Ukr(&2FXj9U%^{T-pv27$xc%{&P@ z^{uWdY5$<3{Q7^%|3P}doPUkPrRIi}xpfmbeinfpKO>@`VW6TQBO>kp;h=-#XO&=N zawXvKxf_LomF=2{vR*Q_kg#a+8&oQGeRtULGk(hLJ7Waa`{&O95O)6D{JtyC23?gJ z(Fm-n8Qb`dx&6x*0xbU}-^5o-ZeiO81s9B#mY%WOufL71cG7Pf5o9y6AiGq`73c>? z{I@005)IFj%2fc@w#^GRd(9Ul<8Se#xD(f>8;j*?x}|k7^jL>$zGw7+aDd1?Fpw36 z*J|VJ1a^(}e#p`p+M-j^yHVz;`I6f>xJX^A4*#km%t645?gQSf&OFQ7#$l~8j7t5o z1c=j;wwMaNCFDXU&fs^(c_q3(Ko-2&%!AENjUmUIe^#{z`J%EZGn?bJ-UiAldoK+I?7ve5^6ayAv3$R_5&v|EH9ovgpfj}cx+{H$gH=2d;{Z+b z782GTXnq-g$S^}a!l_k8P$|?84hL=KTl}Wv9 z9*sfYgMvwuH8~(_^-is6L(Izo7l=|4-Et)cU#@i|$3g=dkF?lToD5m^O@%bPRhshg zP3^=ZkW8Ru4CI$pBejpp;a_4?br`?hg5s%u_s;jgHRv8_7j2emNv4H3LhYp-o0)lF z-SkxOoBO#&xjA4=6hi#&k@B?9RLns$5nnGno*Oh1raQ?=KMVS&4f)cOClvQQ{8h$U zy>ilL)XhAPD5E+aCi=k`B|8LrR3iKG&|9TG8aAd$>`N zf8}br7V}zNgx>aPOC{3P+-ue{d1x--CSUUkLlVR)2|0>1vDoR8SV;Y=YJ*p2_@)%w zHyZDZPTG+f)Y)k$PU{v82TIXm*c8utmC)ZE?9{E6D{;KWnQD%UCF_;#duM! zDUv|f==aW{7(=&2lU?e~1gK!>UM`Jg!B=!nvxK$W^N+SW>gS{6TV_el{7>QVbH05G*< zr(i&FV;IcZi=lbf-;SeOiYH&E=~b%Ak$XtoJ$5KQzAaupfqwK%Y~n`bo`dnCJo>jD zV~T_7lBrh7^0trt%pU0d&z>jC9LHow^b4-fZV`lo6A5I!bubE_=Pv*nOGOE>Ey+jht`_6Rt1MkBb z4yV38>(JT?Jzikf-APi>N2y_UfAqca;q<9u;p21Ye&UE|#Di?DSZklW;z#+kht-!% zs*bc=a*9N9?5tJ}G$0>Gbmo#cR+=8ZV6d0srUZ7K1*f{sE1Zw9$8COV9-z!#x|HK2 z!I+5S5g;AR>c+d_MYi7~;T^H5^}{OP%m#gc&cIq64}HqVc_$U4&o;5ZexV{6_oa&6 zZauih7IPHvc~ECBJ%RCK5Np2mWPfc^RD^C+6V1U@B56-Hmqe z2V?mi+Q68Y0IP>T+US%9Tq?g*40}m0$bHzt+}-G7hq))7SJE}K#MYD6`J|MnJf(bC zC3<{JS;i0P%uVF$%m@qLJ4>J$$rs1CR&>N~%8_w$5>G5HM9HV-?N~S7D@P9>j(z@v za0i-YwEd;{n>9fzgW@^RY7C{%2=WO3pWn%uB9-3=5uH13lp~YVqsq-DU%<5u!`cn8 zn@izRw%`&M)+zUEQ`q7u_Y+u4;#BiyMW(d`H}Way5%bjtBp$qLp&7+Fepp|9VKU%RR%HZ^k4z3XTlj+9^$t!ZBre_u_3@Ezy??A=~DD zS~5!oZ2LtvOPJPjSJ-CgVtna2#F8};nBPa`a8xY$rpj1c`YG}Fib4L3Uin1uZRE8; zP2buVZ*@QF7k*>YSi6+F<)^muj&b)3fve@|6=XhiZLtv(L%52s`#H$)h>#6F`Ue@f z>u4vNcs^gs@Q!TZA#TeqF^HG_nh~C~EihPPd)~8#6ZlCjuvnD5+%gt?fJ`pPhVEm^ zzA0J9Nav+@NgGQ}PhTZtiYhbqgN;t^9Wt4mtvml<4FIqS$3)Y{r&$J)@< znGFs4ubQ+{O;(oIg3Lo$*S(*ACC&_Q8>6|&ATh7hcE(zg&X73&`p2(5%F2w^iu7Ai z+pHNbw;~Pi^6nOx`V7e{kRx5UqV;V+4-Jz_C{LG@BrEI1Gj0w+h~>m4&1pbaS66Hi zMpj0jrNnje@yd~t;6*~hql1Ktr!`1B=3d z5W$5lVD=x4lcqOzUoo9C*VvTqJ*(xeZX>^6B9exWJ9#PEgK+mWQv2<8CbGe=pcoSlTN`I+mJP{L))cVXE`*PM z;DJ7h)yG>k+5-`07Pus@z&1}&U}fW_6(4X~W$PxA?kHakCuv|L-Hl~+^BPpMzVUuwG z$8H-XRBlntz`|?Ro>Jm|Y9ihgB}O;=yOg!_PQQLAL^X3%%}l$e;zx-B#lCr`$9rVW zQFl=-aWPCl4O*KGbjOtP8p;x>w}A*7Y$*?gPZ}82J=xj z8wVLnMY0B@v=I4OE8Mds4g7WT33RchgmB;>3M0oFr_FzVcA>^~^OSqw`u40_A;E`1Fak+ zRqGxT_iL7*p^T+5f~ij#8)Ia#I#7Ro)m^xp|K@ab^cZ#)|Kmw{n`tI{7^f*h1 z^f;0wfv|lH%!@7t@~8%j67f!B(|Pb=dELZ98oN;2cTRG)`$GNeb@8I_g4m&IO_O>G zYE++KU31@@n%xqy!&7XR&jv5nbNm=o>IC*~ADC(@oR@yC`=nq(M%4w@-q8g@)p@_Z z+0fl>c7VsR{~IMMa4FmmiuWr8>bz6veJPJ_hg;%HN*1{b81LmoImIazw!Z(mQ$B-` z2?n-(cMEoh)`V{K3X@p=9Qnfo1x#9;w$~(zrWg8RkE4C|v$m zhvHv6>{=SUTiw7$1l|oZ!t8#!opn)Q=eXAFhu@w#&Qs(S%S`Fvf_Np}K4n_bv*yicMjrRwoOKm#m^ZF1nyv#*stcNB=|h__W|J_W1w4Y7j#2 zp@$Qkj+fM&-uj}k!E(5$ee?k-%OPG#8_A%&U=xEiNvFB)T@mUS<*ga=zN;WpY1;IH zmjl+a?xA8T!Tb$G3}C(JK~7XRg%1Kzj1gc2g30xZz#riV-iQdFy~3e1%uiW8invIM zZPca+5l=F)*mVtpk5040rw<)|>@?Pq7QCp*iCizLZq9T@ef)Y+#+hdi)C8YB<81^G z0U;H1bRjI=M$I1~u$)*qBW$O(3H(_0Q~2g23xAIjlZ4=|th%p$R0f0ZZ5z0ZFWQll zK`Q<21PL?6I&7NXVhO(NCt1y3oi!3lQ-+Y;>7wH{T4Lh~c|=n!mO%FT93oFjFmZP~ z{`o+-ZFW<;fnrw9X;U^A>h^kRa?Wi&ct+*88%GZOd4Mde@2HG`-Qx(&2p%k=iQC9; zQR&&l6de@+y=ExmDy*KdVZ$+~(sfR0wyD_?51DcP@rqpbB5;@t`?KvJWZ)-KsgG#^|nlk2D_h9LQ z+jpD&lVyMj7;z7@`bio?I?NG;_2Tui$28~MBq40Ij?s(%cl-ad4p=j3V@vvTq$E-*ecoL zneVnN*{z26hqD%!j8eb5fA+5zYAc8cmoaj$+!;A$C?LSrKGLV&WE^6lYM-G~q}OPY zk(J?n-_E%qS@g|TILNe|2$Rw17XE+(qCZE%3zhj~2CaA@NEf6{uQ^QfirkBChE(ZN z<2jEl`Y%;(X1$pySB6T<%Ec94$(x9_<)fHb(ojKAaaila`fSgn%ArPC-OJ^?Fk%qH z&`~{X;+LG3reRxT_LyW)>}IL4saZ^-V_etM=vxTqDKxX&9Qj9v5IzXTFpQDdo+Hmz ze2hZFNJ5z?^Bd*p;7qa;J)zMJ61l|q-Rms_Mml~>%>ohS+eq4KW_7n5+{Aio%$R(8 zhCyZ3o_h%Ga)eNkocH$nIgDr86%*ev$3CpPhmu5(!D_;@soylgnA>pQrZ=V>(Vvy* zX2~wL%GK=QF`oHZBuP~%xA_))TKp=1#biT8gf&^z7*ddmJ7Q%|K?48v-us=cj{!FL zal7m2DT*dn#Fl=A~1b+uN0;@R(#L zje47+5WS?jVYZ>nx;U@M!ZqXw);gx%M9r7Rs`svMrSVNpVQKixKS*i-lkbysh$ zUDZJO878LO_P(%e8b*9iEPGB-KBGiEKM(W%ZLzEBdc0cd@4wr;wb6`c=>E2Z3!;ue zHnfU-QjE?X;-(VD7Os#s5NbY+A!GA*>1oHN7_{ z2I$0;7QlXbOOn7qta=!K{GKwC^BySC*O(_#LHHr~Gscn}chAjD**#GG;Mo`lP4^t$ z(Ab8Ly$jQ~1nY637|wK@$fl(JaiA9PP!4JU>YdnES@}Vo)FW9dD~()_lx|WaKwc?L z13xKxNYj;0#gmybb5_$>f$Cmc746Q#Ge+#?>=#$ zU6qW^*F#tC@bZ0>%%kPT`9V&A0FwHJz-Y((2G*=^sY`ht+N!u_t=0h2W=h^@zB$5< zlDfq}x!Z15F4vsaYgbjZ*wy^o;2g&G&4D7a{=W|-6&o{bAra@4_rkVoh}9ubpkFqb zRi9o@bI5fK7`^Bfg7kScgC?Qa`OI{e^EfYa<^(#hfs=FXHR2VPY z)t^r~Q$?RN^`jxyx>=9nJ~b2glDfdk+y6}2|8b{(26|n2y$~BN$B<5ahJVB&M%GSx z2ubL((dq8On5&(ZkLIp>l0#e|r^V8T@kAT$U5g=nkreScO`FwBHlODUM$%OXNsp?P z?>{a|D4P_tDzFM8%_+5YuQO|+)t0qYiTG7{5t zZ748AOr(+=N-96x3i*-QKDm+BXpkSoasD@RZ_?VS=T3=w6A@Z$C%eIBRd}3O>UCxs z0bYgLj{c6}`N(oX3%K?lupdvM%oCoS9o|L$5$AzeE9DnGi}jrZe;@1!c|LMGTe`z+ zat#lOm2i7Od!eBDk;)_#E+W!#Ea2#P>`S0L@Ih`L`AYLhWdkdLDZYG&#mwn%Sk}vr zX@zF46wtTU6)$NP6k_3{LX3Irs7{7bZE($EaXktPUr?A3wEz1iw`djeDtr6sKTy`E zZ^|0w;Gm81zdz2eTBLtuE|c+V@R^tB^lenbC&25r(?hxr`1FK6tc2+F?TSwM{)uUK zGe&=6xKg2^p&<0^;kQQY|H$o0!g+N9DP@~L*U00Me-OyOkaRC8rr%sSA3KvSB%J>J zB>qaBc7n2U@|`%9UV=>EWMIh`_=nt0>u*i>Kod^-WqY7yLDtU+mgPzBzlBID$RdFy z`wolQv|KmHF6D!_1O3z!cO~E9Pb@2^UnZ_gh>{6ykyd54_I1>Y)MivB#>hkAsggw0 ziPDNRz!6c?uvHM_-kxPtxl^U6pdh=CWdi;x0o9j33ZSR&AYQt{7p~IVFZSnzjZ;d> zu_Qenj*f>yw?=qp_@1N2Ss=dL$!BuegtlC(FZX~6QfNb#^Z7fHf8O>XAF zc6ruKWyc!X?+=))VUB1Y&!9R|`$sqxWD_KPtc~OYNuNjIDKG2#Ay*ev-MN>B4TF7l z&11ARsTB&oD!z+m1(?wK_x?4s>x<@lpjmF?7oNAsVjF6#uPmx}5W#KpI(5}^| zFl!;SPR?2KZX$jr!AQS0;ndUO%T97jBZEL3@}ScawF=DT<1~45BtMShv?=6mZOh@l zhOIDe{h;GpoF0jJ=687)#AB~DhQ%-7{Q+zF{OqMWLFS4NEZ`{-p0WAbS|pa$PbK5# zvwQ~MLv@ut(7k1N`>^`iRZ1La<48}xYG(t_a4|{dzABTIhe>8iLey2+R)(P2`Yf$kWjtZz z>Bk+(G@Ypr(or90Vb)zMjd+4&@Qk+)_>rm&twXum_4}&IvyZ!D5-DMdUQg#P_>uFu z6E-g676CtMcT=A{^5*Q`sFsd_c(8_wt26nUGe_DoB8`zSdjey@HRyL^>? z;gopnR%$u&!Q0M+=~ps*RWS5|sc4JbbxI|k%Ue-uU#B&u&((Ud)}_p^>=f==lTz?| z6Li20%#OYue0#~tm$8p(T<;v;mC*8+7&4M}UW1%I-AVOkS~rbK<$HX>3GSQn%o(@i zA*^z7`xdA(si8}wDD%#wAfzGffpoYw&}=c;nmDs4h`;~P9d(b~{5E9Cxk^&vMRLWM$-pD4T3MmBk2g zD9tYkG!RX1kI+D)EgUNz^qv-ZkeUmGIy^V;{6@GfbMHCISrJu%lqlSgB#%pXakeR$ zV@gX)EuyfpE;S{e@g5R4t+>=9{+nO8V`fuzFM%BI(4Dr)~!X!jw^9hFGm97Zt~bZ zd_~4xVKuwxC}>GH#uHgesGPTL;QCR<ez5oW%wbl!O38r$8k{Ua+*S#eQvp~T@o#>`X4Q^BqzG`i(#8i6msHJjv zG3M&Y4y3Zm-Kk2U^_1mey`%)m2}#Qo!tYk7!EKM}SAQFPJIAab(W;6=RPBa}iK2+~ zuo@QmOsW8FR0Kk#VNV))ww~H8krz9B$+!y?gNBH2si?ZwUti8vCusUm9dq8l6JL}7 zsnneasonMNpUwv2m|o*`oF$Er0mY^0QARlpX%!*4%M{t^n91jTTaA3p&a?8eix@#P zMWVFSRI@OLrk~JVs8s)?!pNwU;}F+OqnWEa?GlHO|s*;S}$Zdzl77qxjslEqdA6 zkJB@mxTV7w#3LrNe>Al9`aHjBLEoqD=Kt=#hko=^+Kihr{kUN%e)W*Gcj`-~Oc|cR z`L2Bw;cbhY*~4$TtK^Wr4YXs}nY5Pd6q1;xbDTj`EeOPeTP}8h{Uese*R4Ab@4nc# zx>xrm^KTT~L+cOUZTcZ1+gA2c4>3KhA6>e%>#>a}l!c?LC_Ct!^xIZm)6NukMBA?= z-Este?eQE&R0ZBLofXi${D!Re!!!nJNTaw=g^STBAB4Vgd^;nQq*5us`l0lUXa_+O z@-Pkgbel~mrrgW>EoUp-yYf~UyCpTWIi3gAOEcx`nE8{KbG%LaQ1OkzRO+6Yw30Yy z&T3Q(txnXvb9v-fZ}6m)R>j{gAEPTib1f()&P~VJa z`IejczS3F07ZID$UY3!NEQaqXP9@<@jw9^x!I0n#p2oNC7~Ecnu*gj*1vSFta~$s} z&ZU#Do}sAFydQhLC&s3W-ix)~D2&4^@pcM!{ka&$9$aS+?{gI~=tB5sQ11t1x#(0e zW+Z)578bvKo6TS-%|mq-BT13NU1*6VuJuuW=@aEIfq_qI-CIC z5sWfvRRpT{rasrT&Gf$9Q9Fx~D!`#MI8j{X{B^Qj1a0j^G#P*mi$06?K;++&pYWiT zqxmSC7Nk=QUe14)V@-D7UN%*#Bv*b+TxZ#F4A)ecK>GnXW00@4$OMt1Esc3r2}F)3 z8yGu`d*-(cag%~fcP}+*W#LFy;*Ng4Et5p!4%xiQVtWI(;666t4JpS8TVEegZ)|46 zQG3W#38bxC->>a~Zhg243yNj0_lxu9*w1E;iOI@*xbZD3YgXgadDfEe4$m2L@>QhL zaPZ`=b|}&G6WsLwM8a`N)jz%1wneo}HSG*NwxOCEs%50j?F zos~BzHo{x4OP@FSq@rV0>-x`vby3-Z)bltQzGz?2<-}+NL;~=Gf*@U#ii&lRp8W1@ z`x8fa|0QAjlc-PJbztA(-2@`z&}@0zpoHBs|HVOj@{?K9e&;US>)$_`W;A|+X#Dtm zeA@B{dqn-csVHFVM_tNs8jsW-7{eUr5?A9RU0?@T|JPv-(G6z;Gxof2vc@M7pBSci z`-Rr%JdO|1xFsWqq6?~s`!leVPv|? zv=?P6&*aGXQgI3U_+(tXBeKGa(f$wGIUy7+ZPYFQvt8449Q)GfD_-U#t1f5qbkNI= znQIIAgui8aAS|WT4Teu6;kKk%C(wW0r9UI);bB&$*Il4XS~*Zt-7T43%m}F0K%VRQ zQ@6LG2Fjz><98?{{y+BK0xZgI-5(x8N@9Qk=^mJ&B!=#xyHioR1f*3&=^DDb1{hjG zFaV`HWGDpzDM>{T5G3>)bie)X|Jmo9Z-3YSI^W@fXNEQFS@W#5?sezyUh6cHJQi_n zhe1UMdi$9tO@HajrSAVqaS*mLKu;X{o27Q-|958f?*cf?Eq|*S|IR0OzVLU<`}a=x zorAx#ntvB~kh}A@_SWwL2d6Lo&KL1}*W~=>FRsDg=@T;2%eS619+pJG*C@hDhH^V& z2gzLyXUxJZUig`?QrB9hMJZRkwzv7;!vA>#qAj_j_3cRSM8qe)ob-kK!r-TWeU^b+ zDC%$)O|+T5y55KuhaO<-J78(%7XmxlbAR%V(OI_@{XZ~D_^$*+wY4>A9oru?Xu6yi zO<}v61i$?Eg;1GaG&`n!u+u+I*?9iT1Pp_PVXE?;R`)|%M_#9v%qgM_mjSBbE{3P1!BPp0`B&XqKm4J_zvXTbyPhWAJ8 z+C*i8r_LBZ^ZcDP3oG~dhrvXUqgqPnqDp+ub-`l z|E3;F7d*-Dc01tcs&s=^UgFkMLy7fOt1zENE9dPD%Dz%o2ej~LdKZ0$alMkHpwKPLIupZ^!d zY@g6w+p?-4clYscG1-(a6K~>LCDT(8MujqashTINHst?}E0D=vC1{KAXjeE;|1BA) z_Vt&+CGf+xCq{C;86Q>S@(pe^F(=+zU482nJNpcz40DLSNvfgsGD0tsho_p1IV{7( zETL6C+Q&k6*8dga=Yx|S%L^37NP3fIrezHRjSXTC{5k*QE=fgetZnF(;59M_Xf{W-4v&2R;D884@j_O#_3Pai0)~95dykqV&P3Lbx^*4*^~L z>j14EN1lssqofJHRa`y4CVg|wtF33Aa$md6fn3MMMtyqLzxky2Z1mc3OVME@#|;A? z>a+$bEEs-C;!3-Nn8Y{Y<>hW)+I__VIuyMs|_3$RO6-Q97cG_+H{Zz z`|#=L|8xbG(Yy1H+@ z*ERy=7R_@e%tVq4XHprVv}bL_l@vVWM#d8qUlQ8*oJ#eR!}ZM&YLeF4<_>j!6d2qVq5=C(?M5*r4ER*jPc*ubC zlZZ%pm6G1c_dU6vOUOXrj|2;~jFI zB?)M;qWjLv&EbHX%ghHWk1}_;PDDAvq~ml$f3U*%ZYw^{p6+L#pn}Qm?V~DtH$vC z{vV9>jO5dQKGBTvvMpaRsX!&E?f*{Ic`oAj=%IJ#??U#vZ*^@%ch@hh{2#H)6^y4Y ztZ`f$>c&3D7OV|(L{yv>YsY3QqQvpBkGH9#=l*yr&7~XjTJ7W~e^yo_kDE*+8eETPN>ahzKUEno@Cp z=4BbF#^cN_i>4yCXwugP8Gb-SArVM~^O;X)4!ok2WgH^ALD4W!r3e8zjZnLd1?%bM zUu}pQDE-LCn}pf7OKAN45PbZWFPft5=38z~VQMLTvbzS_wbj*uk4M zx7x)!IBtYBEU6WE{3(pv@WAJM*1I!#n?F%OV>}RO+hOS7u6@~*#@+Z6`8U?@03FHA z1nj^{&F=t{SM-&SmZzqRnaF;u{Nq-(=7!2IYtbC0Sx)zzclKnz`ra6g(kf27#W2=g znUQCnLX?+b@9gwY_7!N{Wmr-!sxMSqsNxGH_I6{2%}l`g`6KgifF`4uciCHW4! zoR+{KjWZuI`;zSSH=vA@(Tl3ETnhC3x8IJU+2svO*osZ{93r;vGK!Qr!cKY zGukyFc|CUPsHFXfwOoGD3>rw|GF>3Uxjws)1}%KERKX6CCt{4m9h?m3<3ki_fYS7{ zWCXY>+>+@;=21xJ4MqXS$|B=zk@3b-HN1Q=BT_%f#W7u)&55bAL*#tZaEtwx5 z!>_^Ykuud@g?NC5Oqlb~hpoGDsW$LtA3E>EaK5m(kL)PGNVYo13+ZI>YvDkxN&ZH8 zK{Ffj;YQ?Y={pFIE_LoKtS`dCx%N^kFsw|{=l)6ufyNn_mkQY=(^+ukIF|^l(-;^r zMkU=4X#ZF>=1e7#Yh3jsj4)yMweX#$Z|FahAgFUoV5=>%J8TMWI4OOD`X)z0uQUi@ zY0;eWgmX%f>uom27-;8Vux>&pAKseq!!Z=cq$w|2<{En^A=3HbEPIFJeV*&xZ{Ht9 zZ;WN;q}M4j+R@o|aL-BRBV`3;&#P8R2#49=#T*zHq7w{gI8T_)N-N?w1j2mCcbp#l7m0Sr)G~j8(^KV5i1PVr1NJh zGn-YXMhGY>%Co7Sd&t?sE9gC6@R{nW^^7U+8)qycX9lZcWfwVuhvt1lJlEW&UGq9% zC85VEYAz0L=_8d?aLMEVuM76byrTJ~IP@mfjg8c`U3FOe@c>UE|~muG7`=suR#;ICRZLl^hR?)uq^20@~Y%!i(& zOfgaEPLv#?=rbYdp7p0H(sVs{ZsifY#T1Vf9&&?Gyow8x4oBTpqOZU*jIuj;s#*2r z($oL3Quv$7(}}VltE{|N=Z^?;-g^q=9UmMUgf}l4cn$hUTBzT=4s}*n*gRE$pVsX`jTl>-K7 zQ#n&5a7Cg1OLZ#kfG%ANZzV)}v^wL=e63t_D51agjL1l2)Cv?*s1Nri2H%!FY4<6j zb~3So&fj0+7hi2G@<2=V(lKTZ3Is!iB_^|lSx*{UR9hI6N z<=A0BESW*?5Ke+uzo)IPsXg_?y~&cce}-a#G$qa4kk6Pyza;M^v;bdygqLrv3J4ij z=}%A1NK;URR1%h{OWD|%XQh9b*S4D|R_XskYj>4>QE4AWm*3zf}EQDe+*!=`J0LSgy`}c7+d_LjaP1%UNu!_g9zCV9 zzV3-88l2NevZ7Q&CRbV!0T^$D{Kii2m4%sQ-g7QT7~m2TK0egvSzJUvS}MIsCYiM6 z`Y%bSvWyd%3UdUL=n5Sz0$VVQ?K89BVK| zh1=ZP!|&&^lpN1XHln>g#;il;@vb=K&BM?Wx?0lIS>|LV#@Q2^mHPUir0i@-R#uIh zp}?~Al1Hy)xV70aV3ti{wYTCeM5E!^x~kOKtcSJtO?m6gzY- zao5*Lob2DX?m^#}xrNt3D}uXOg;vFg^?B;&8hJzm%4wj@s^;ZW8?6*5uWqHzE9L%u zQ4##?UqIeW);t4D=vSk6&3_Am4g7F{=`wWEn|U_!I_crJ_516W#qrc4L*Y>+_pPCX zYHA>?Vzk%KC10gs&s<#yg$Es>NyNjEsk}UM&YyG0>~&a%pTP}6i)3J@GKpNqDWZE$ zY%dYp0H^KPR_f$kb!1PEaoG-#)%zCJIBF1d+0JppqC8j<`AB~92_Kc=gf?()&)g~E zVO&pYsn6kk)|qhdBrIaPJft`uLBT4#<*sAdGX+*FNrP~;yd})BNNoV}c0oNQ_IE0x z&FfC`bkM{_9t}{cMp4(t z66VyaonX;6d5vooW)nvzMTT3-P(%6_CC-}LZAdCIEh~_p>+5Sl7_bsWW zWnO#Q_{C!JzXjJnKb*yY_a=sxtL7@3Pz?#<KP z)TvoZ9cbG_IYJ^+%+A3#kJrA9t!6X$jn}V;dMH?(vudVN@jpSRAnN8GJ7v_5=S|5? z?L@2&LcoW~^bnm`OrMtU6u2KDA78KFtOMxjBdPeCaL)xFrA-qR`s%ATgWq>yji8Nv zr#TJ_82)U3{e`cPGP!5hpmGO2aCRc?-X~9lv5Tv33QXoUWV@z1LK!hBR5wlc1QQ2O z+M*-Db~*6$5??7R8^0*HbH~dG#=kE?9fQI7Vak9;s;f7V zzcs%u6slK03f=shya27QxDUvB=_yB^gk5GFl;7O=Yn`7-0>4WL0M%7?hI5QPpkg0> zGsz&0ag}xc3Tof0fEs8RLGh8?Y%lyVU@OB3C2k8#1*oAKtK=m*)+gCcdb1P-9-lA3 zkN;6$1phED;+z-&60Trh;B{9f#06(2WxBm3W&JBQT4~V(wjF)XxpD?Z1Q|JoGhGw< zAl>wA$%Dmsq|{Q+f%6WF21R9K-t=u>8IS1nd839Di|``5hm0Q4%dQ}lhTe`9(qFeh zs50G|q{4X4!}%0*P%rRSqhc^-R~1wmBkfW}ICKhz+Nyx!w^emtAowH1KW)c_hNP?p zewO%}aQU}1jeBx#7#Q_tG{$)v_AAnUIpg8IO*`2fc5NvH0s12fcOQ&O=b=}4t_I4T zwdJ)znwpInn<}858UsJP;jMn6W?>SfK-D^lD00XB}8I$5#WKjb3-Rmk685~kRK65hkDk|&~Fy4p~h3ZA4Qf#ORO_NJcD z!IPWe6|6>RC4SGGE4gk?UPxyaZt4{`gh^w`eQokoL4)xbD%nGcVrT{-(Gz9E!fB9l z3wTJ%$n>;vJ+{(RZsKXC!5ui2Kqt0FzC6*G`UHs#@95DJZN5Th!8A?xhk30hVv5py zPH>I%A5i)hDxO(nt))caumF(ZDqGQ5rMDt~r2ft0RDo=a%LSQRRDIDJ_p~qe6NFCY zpjqQJzv$|0=&RR+nXVZmep?(k7Efl%fVlP2AA?keK>tCzUZR(0~8)_g{K@XBmwRDKkMFM`OdQft82pt5^Mx0iZi=k24x z8k;dSnBg;Hj-Heeq-Wt^hD&J$_lU}d&$x|s_|p_vxT9ywrTdW|^*;n*j)u#;``dHf zJL^*J(R6nv^shg|3LAU|m~$MuTo8F3*7e0}#N4O>l{OApPReb%x>E}gJ971TETpl76Ax;*RJ_YvV^D8E%R zK_al{Vd}b{qoIBCxhh7dN#~@`Y--@fT2})goXlvK&70V6R45yoJJh~V>cXJ%RLvRG zz0&UQt7rA%8kQsY zTaVNlp&>V;+7tulS4Y7k`E*KeoL@|+&5?{~Gxq*5d-ESjvWiPvW{(=lU0|FEJJ#P6 z<`s#(NLv58_*cpDhZPap@4*(-^ssjev<#%ycveyUV1Z@GdP>UFPZ{_4&99W~4=m+G z$iwIYrvJcA@2+j}TR*8DM*>Y-U|dyu5iZT$4bZvhG~zyFXwEzlA$)z7KD~yf#0kKo z1&c^pGDvU7;Tpw5IRB2d-)sG|d`2?(lAyIEP5>Nd?9kggE#GFp>8CzDviuHk3xo__ zJAL#W@T4u(p6~p1;M<#nLh0YO+dkI5r_~JfefQ<{=h)J==1-@$zN#2tqO<2sXT|^d zCZcNzi$dO^t3$P6A$fHbs5MG{y(@!pY`+Pxmn+e}Uuq;YrDW@`c~wePgiCJCNR?tw zR#rI{-zh#-tT@pnqBG74o|q}$Tyy#_rsMrG9{T1}(i7Ercuk>c&rHH?=G_$zi1Kh6#Io@y*jADN_O4x_RdflX+` zlymOC=)7~?b@st-goP@3W7!p;{sgSY1NC5EPZzxyV6`;zKvmP?GBT=#NL zBFFcC<+@L@F5hy^?$rQwk+{u;ZGE1G_VNhNuVXl4@HRg;~5Lg`=ayR$$HF%m+)%>aq#mO~v$v6>#g}&*hY6g5B>Bf~@f{1I<$tDe@ zRYdr@HO^|w^B7dZ4xGYtueiEqqtKVkM?m^H(wcIv;SPnR_S|&dQ5QL6iVSxSdpp+l z{}d8_8O5+S+C#6KseP{M%KFPXB@ia%J4$p&?$9XLAfP>ezBnu!X`g)!o)&6Wrs7^{ zr7Na?tNgvu8Y({9sSxg{2QQ(DzDLd(dnyWi3;Xr^2eMF8KYG#R;s zs$yJO5}NK)MDVdE9e4?|apTeSO1{iux8OqSuUhb zDr{=_blR;^yd}KsYR;XA?Q^=QL9dc_4Y7jg!`87W=Bt=Ac6NpqI*Rx&d68C7lDwAJ zL~x_xrUQ1Ln@&EBv(wu*HvNQ*9W%Q}#@A~U_l7E@Vq-JdGU$PU4Qd^a|IAuG(&zH@H^3V_a`7SKO+l1 znLem2VnPC3d9Pg~AvH6uN=+Y7+Q>2VB8$b-7AkgUx7Wb^(^727{JSnZ_aJraMf~0N zoDyuByP;=-sW~mjf2u?B(qNXteqlIKyq^Ec0m8tky3*;(-|()B1*S5w_Qz!v@*C|f z|MblJ`~CFa5-gX^um2gL@b~0MN_ZhDD85d9Yx}aN{Uaq_M(QWLGtAR)XMg6;mbnt? z-F2I|vSCnaxn7alg{$sN%Z?(ycG;FC^)Qf<7PqYGII|xtbF;f6F}3iVxx2eHwc-7Y zLC&aNvUh&@k576Ppcm#0q3(qNq~YHd{j(V`p?ncr@Uj7XyrfD2L_;ioiPo@f@2hf5 zM%n$O&oNi7>Kw7Zr{=$rx1&19d;NvfTtceZbN@TfnIZLF2cNuT^=;m7F02M1dxj=n z^#AW||K1^?;x*xZWZjuk;_iJ!Ci@ozlKgtSA7nP*&4%DlU-J3Nf1}FG`$^{>UyjTS zbwv`60~WFciGMIlOJrkCMdKy|b3EFe;4z?^+l$7M-KXWT6p7yE7EBgA(qX4% zXZBhC`?mtyP&bw)4HF}5@BFs;uYVqBxb`}n{&X8~+IWl#=5qj@vj=9XhGqJIr(hvf zMq`Z$4xyy=O55A!0pRxR(n^0}J*P0twfmI63t?oXFKJHkic?qm-%AFG)fL zN=vcRAXpzG79MT)7e}df8xmSv>Cuzj$ncv0kAGW9zEZdHyJzX?^se7|`0Bd_t*6x&Ej7i594vNOQTl{fg*I(uL>9ZN1NtcMyi+p2KgOvSqr& zh?{UrHDs_eGjN3vKDq0Auc!F9adAqvj7c$@-`&Ah?@zG z*{TW<6oyd7hlvjHO*qUN>gplI_(YvRV0QUvqtv>2Nwt!166aEaLcXFM(8^vWt@`9+i@*92C4FxYQueBP%u*@LCb zaRO)c?){e>uOIq9*h{K$xp$jSBpvN)4ANs2n!xKsujYV#NF>T%QG5^|%rCVn)#Ral zjIchOw0HTUsP@>6V2c5^<`*KoGf7GIGQxnU0#?p}HLhhJMctIxSkY(-g&C?gPzi*U zrYM{!1LSCKcQUIAt<t=xujkyQvQn8@Sfz&!YN~>b2O4R(_+nm zo^K4OjK}F+1bNk>r(4#_ometZ3Qu%MB&LG)YBlVy*0kI#Ps$P);eWx|nP;J&RB8k^ zb{2489!Oo#YkuyQS0k}?y723(|S7H9EiKV$cV}0l6;+i_ASXWfCj!u!o@~sqA`He`u zEpS<4iN1wRv(ep_Qi7tsb?|GuM!c#Ci`c{F@-UPmyCSV*1w2K4qmTzlOUmizl0ITQ z1vOQ%R`Nul&j`5oBwk3b@U<8`LsfQ0wko7qWyI+i>9x5^utT<;;Ip_adIffN$vY%^P!1bew2C3jY44z>6blZavnn;7es8a@YU0kAH@@Kgi9ex3qBW9U zu^eJn63`m0uYT`UYg>r-!^L9_FPj_Al`$s*iKPe_!YO*-^@I%ngvOkyy!Xjy)SXUk zSn2pglb*c6*4isF-NuP03YR^7Zvlg~v6*)hYgtz8P25dOVU92#_!-CGdlc2dNP2%w zrU~eD=?1xT!z{OC6Lm-rVM!(vC|#&y_e!2GH@dlIielgCfeu?`awFroF=k7oKa&h> z8k3qDo1?l%P%G>w9%h==!T{$Po{wjxT66CMBKE~>qm=LE)OWKrqKCm7U(yKd>n7CX zH<+IZ3q6t&PchvXB7!Fv3rvQMIb5%iQ%@5u-53sYh|VJHi|yw#DOGy1PIQN(K@E4Qdf6=Nkl*U+bXLZ#=53>7|K5J%#+Lm!!bp?c zBu%O~4w~xI;tsW^7H+`iZbpeB-Ql{vu(xDv!lj!pj!kO!z#*LO>j>;gY+q z#BCnVS^{#v#!@_Es>E*|UUSPpxS~1I1hYL{HueR}qLGtkmr!_0!Ayb^-eacanJjU~4ixktk`=<-=WIdy8)Dh68B z-$89?niRr|s%6JD*S?`b@W0jmcR>DsK_NgCvsqhCIap!WnY+Zxwj>~9>LWVPfG^y@Ch7y#`0JuRAMT#0NJ={Pg4 zXUDppyZI|iGJT!*6T*&|33p^E=K}t>_)lX3LXK zX%Pfbh3AZSy+4nrD@MsX^=N+eb7hzj69zbmTC+|d4MHW!7?`P+-VMP5qOM^H3wPlk zuM(zi9T0GL4<& z{81sfJB|zmai1h1yVed${Xhhv16I)SiaaiySCKT>YSPH4{KJ zl?_RvAy<-3Y=?v>e)%wQKYMjRg-yZvILXw+WoyLJysApX*Wpq1)Kqr!<9|yL%&WZ) zo3iU4(_3D75FEM36qZUX;ZI|soo2TqL)Sqbu8^FbuNN#)DFKuWX24IBZCV1<RF@tJ`|#nESrirsa8%@Q>db7n@XkAXpYMeuMU5aj0zC|f%c$I2eU;)Dt2 zOSGQc^!6vVF+3#P70l6KGbf`BN)Z**Ug{3ih1-ZpzZYK34PzjaOi232-G6wI!3Mq| z0J4N=6|5S+^(gsCI?Kjy1Eh9t!>>jVHupKE?u-!|fpZLob) za8-IUyBCv&<@=m7_g;N%abcli1&JUh$dTk(n3bFg6o}bitdSTZaI&1{HwWc2I{nIL zbe!h*j){(Tn(#9@2IyblVDRW|_|KJAK=J79$`hzCDNRB`Bh=Kb^B*%AZR)nyQ^l{4 zEmjQ_;4sq~KF`u{&Y^cNBUTRuH*1#|y8se9ZX+j^G%@kkZy5u5_@Bn&IPpI)B+{Qa=> zCZPvK&Opd#w2UPgnkZ!z*`;L(34kfQ{zy*lw85s#sQ_q~sV67jow%aGOak;R5+lG} z)M=%@m4)CclJ6(4KMi4HTUTm2e|$eoNd-?nE@6!8VNdr5m8IZ|_N+J9$MPR4yjoym zV^jKAn@`q?c_Xekti2&}b$jH>%G3`c*y0edIn%96RLR+^z7a*5(}%5TES`awnnrBv zFk&vsGsjY-0fDD4?%qM1OI@LProVgZ=P*oO5%g%+`oiG!q?_JXfXG4-So^QvtKO3v zc*VLmSL+ilW<)9WESk}l&Rv*`Q;QtF^(#z*)ty?>y_;n=D_4kQNqm1$!b!9y;D!gm zZG{FRN)>jL9nP_726{l`)C{n(h1hl)-3X(#YUj#9>oAIPDwpawrS@Y1NU?edK&z?* zge)C4^4E^@yRsO#fi0b+5MsHPsZn4iF}z>9t7|oD+h=4G^{rg`4uDWFC00;pCUK*m zG9>CbU?f-wxBotWqp1b|tByC`UrsjzKrE{p3PnVyUfzK`n^>3S-JYcE@yj;ylTZX@lC$S<_YwZt6ai`gj7M9>9I12vM>F6i|Uy;>0Wj+FWN=I+s|1h__3S>oLn7-*UDA)ZoqM)Ku$v-gtP1G_q5 zZ?3Qra;FW=At49iLh+3*4>0TewS)tsS*OQ?7r{Czet#X@QgJdLRMV zQv1uV>*QWKHp$6drZ{G>_q@f~!{#M~^oBa%T8;^e ziV-j@$%e~8*|p5&I&GOWVhPI3t|j8u<9cYT4iySW9UlBjSrhHWz(FJ2qBqiMYF0s; zO1%z*te0fdkn^eDO z>50te3)Ce;gX)T!U1j(Wmlk*qn4%bLX+p{5*{_U#4DKPlm6bb@gXFO0$c;)$B?n;P z3SN@hEEH#<2!UYlun>NQHn9+p?fFpVWLL*0DCF9`i~88?NGrB1py3Cgi{$8jMciCZ zw$-_bBLFDGS$zFdkd%oB^WHx8W14$#24o2mRHu?Yv!Nf%Qth3+LO|0)nxq9bB!~gx za#I!$&hh;M zRQQUXSeJf`g9G3WvKAC&W;ldj0ImwIlz`o8lXC#|p!Bca^aq)x1Nx~fVLpXn)BXXE3pe$BrRSO?ig#gYi(kSouPc(M&0#{lX?$#I6K#vVq~ z-4i`RF!6W*Ckr>r*kJ7v^Io!P*#(+^<>(W%Qz6=m1T3-mXP!ESfRr(|$84Dm#E)OlqxhErL-l%#Xte3l3^)guRmvm+@E9-x zeE9~CDW)6ZcYf*1-gm&xk2(Bs-DXL(o3sQ7q=YVR$tI>2Mio-BjhDhfGUL zNrT@!pXxb1H1>NZ#gSflU%4mXe$T^KFD7$LVTno{fTY;oen~8-pfDhlMuGmm?6$H? z8TRX>1D53LuycS3oxcE=@a3X@xbUc}E)A$a}5^7j#{pxDzXaELNRC6P8Ncj7yPIIW zi?9|HlxAHg4k{-~N#@1A{q@*6xEkwRdG4$JsEwW+{G}v&61FIZI$58C=%BpRhEcOI$-5cTQv>ZFVdkS zVyv4GTDze)7Ula#t|ntfEaU(?keg^iZYYjrHq*AVgeVhwj#_PnTF3)w^sxYfZb_>f zZM<#-$ZtJHFRTy*w;EX)^P+xT?9Aa;QREymc-u z5^%@!s|{Oo2;Oar-uAd+IT=|t?}YSxUs8_fAk6o?`YB`$z+e_y_IP2MKsfX`h_i{f zqk1a_QJ*=EtC)rBif7d>FP_1Bw1cr!h@tusxgI*%c!mLAFXWguMcew!rf6=0CfPrDf`#Wh0C2`$2TipFUB() z@v?QDcp7R%c08Q>5RTr(#U8@RIEUj%&Zvm9@g3*m=k{2I3fv&n)+NGTk4d`5HWQT| z*!@J~wo3I8lbVyQ zeKBs!nlkZaFTg#5d_M>Ic*~P#p%6k6k)%=CHeY0uVeqZ~Q)%5^5yfEzG_E*}LiNEk zF8k*FZWc0o?of)WKyHvOqb=!9>uzSIG)@gqy&^?CB_;bu3P*+1Bm$TqFT<(qx?rzM3 zp)_BRW~m%d0wFym%yQ_}$Mtxp(WKIY?;aC=caW6syCX>^3_Qqq{`j@``-2x_JUY79 zE!VroEMH|zl&T(ttZ6SWp=#gzqz2X>@H0_{=0|P#^ucVbTv@ehqBIpJnt-!j0t|yh zoTJ8Iv{fMfIKbBK>sr;5uQMD?hO_)UD;OJWH|BC-q<${`GTyZzC~xx{26#ee=95sM z0Dv5v4zhXJ5xTflW|qhxM2p8=RVdE_!G80ExhIZ~@kp;ldyFgy#b4M#A&88^zA431 zLsgl3`GzXS@#9^zbfg2;TXXcJh$oT_BzKJ98WU*p1D-3WTo2_tkxg{w9nuBrhnH(< zl(NBW1aT7zy3M<69&nmsV+kzi?zI&X7_esWIm+3owKj4tWoLdpw9U*_P7@4G4mi1N ziiKZveGrrPfP=L^@&^LieDBFY(CMj%bXkkOD@XH}sVmL|d1Uqq#@f<`Gqe{;05Zd^q(f*1aL8UE zcM7P>cq^h)9jqsV!sS6hDIZ9F>+aF~#F>oBZ?k#2v-ypw__y}YhwMqg07O7xce$X_ z9FctV$oLK9U?DP{!Ho;=;2|Z2E54HYb!;;BZ^To-^0Gkhhc)WQ?7bg$4Yg8pHC~Mf zftmY^=mC({N$ie1TtAj-$7ntw=aG2H&3aUrmc~gYhoa);UIG!~(eMa&h;TAZd^Jt= zunJ4EhWd8^wut4^cCoAUKgsQM*<*|)#H>~n|BGCI4oL~1Py+y<00aiXKHyS&K}elw z2;`HLzkU=Fw8x|5x(qZ?)w=HnMcQ#?jS5u=(qR>!K)9uik8 z=9t-k{r%%0tYD;KnG1INIwf<1ljw%4)`s02Dre0~!LPMzgxNbhCNZ=x06HYfA3}b0 zwWXm=PuMEL1^|qdv-_b)1U{IT>oRibr0;F~5XF2RIk!Km^e`zhL5>YT8{J`;F0BT* zO3;jDcSe+cr?mWlhXBB`-UCdP2VA9X7Es*5rdW>7?Ox8!mSKP8vqhgsCp0{s?N}j< zPu=Tk!74Im(4LJY%py&>!(qh<>Q&*kD*h_K`k6d@o8z9Yx(rK_H7GxS}$r|AnMJ~l#%Y-h-~j3jkI@F!0{0@BN8Nz`)4(%Eb(E+I+VtfH2& zX>UjZQq*4{+1N29jiU6#m!qW;o{QA7J;L~A{eua#G+1gE$%Y+~ILWqzj0AVH=eqW_iQ4Jyto*W46Vz^jsYI6HDg< z;+$6%u+Wu$mc~8-7U-Fds{;iI_L9U-d&%0A&*jPPgh+b^t5KFmJUN&n(~Q(sumlyU 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 H=iL7S7jLaE literal 0 HcmV?d00001 diff --git a/scripts/app.py b/scripts/app.py new file mode 100644 index 0000000..f76d557 --- /dev/null +++ b/scripts/app.py @@ -0,0 +1,35 @@ +import sys + + +import streamlit as st +from multiapp import MultiApp +from pages import user_overview_analysis_dashboard, user_engagement_analysis_dashboard, user_experience_analysis_dashboard , user_satisfaction_analysis_dashboard +# import your app modules here + +st.set_page_config(page_title="TellCo Telecom Analytics", layout="wide") + +app = MultiApp() + + +st.sidebar.markdown(""" +# TellCo's User Analytics +This Multipage app presents a detailed user analysis of Tellco. The analysis was based on the following key areas: +1. User Overview Analysis +2. User Engagement Analysis +3. User Experience Analysis +4. User Satisfaction Analyis + +This multi-page app is using the [streamlit-multiapps](https://github.com/upraneelnihar/streamlit-multiapps) framework developed by [Praneel Nihar](https://medium.com/@u.praneel.nihar). Also check out his [Medium article](https://medium.com/@u.praneel.nihar/building-multi-page-web-app-using-streamlit-7a40d55fa5b4). +### Modifications +\t- Page Folder Based Access + +""") + +# Add all your application here +app.add_app("User Overview Analysis", user_overview_analysis_dashboard.app) +app.add_app("User Engagement Analysis", user_engagement_analysis_dashboard.app) +app.add_app("User Experience Analysis", user_experience_analysis_dashboard.app) +app.add_app("User Satisfaction Analysis", user_satisfaction_analysis_dashboard.app) + +# The main app +app.run() diff --git a/scripts/clean_data.py b/scripts/clean_data.py new file mode 100644 index 0000000..6927e89 --- /dev/null +++ b/scripts/clean_data.py @@ -0,0 +1,46 @@ +class CleanData: + def __init__(self): + pass + #Function to drop columns with zero values + def drop_rows(self, df,col1,col2): + df_new= df.drop(df[(df[col1] == 0) & (df[col2] == 0)].index) + return df_new + # Calculating skewness of each column + def calculating_skewness(self,df): + df.skew(axis='index', skipna=True) + #Function to drop columns missing descriptive data that is unpredictable + def drop_missing(self,df,col): + df_dropped= df.dropna(subset=[col]) + return df_dropped.shape + + # Functions to backward fill and forward fill columns + def fix_missing_ffill(self,df, col): + df[col] = df[col].fillna(method='ffill',axis = 1) + return df[col] + + + def fix_missing_bfill(self,df, col): + df[col] = df[col].fillna(method='bfill') + return df[col] + # Functions to fill missing columns with mean, median, mode + #using median + def fix_missing_median(self,df): + df_Med=df['Column'].fillna(df['column'].median(), inplace=True) + return df_Med + + # Using mean + def fix_missing_mean(self,df): + df_mean=df['column'].fillna(int(df['column'].mean()), inplace=True) + return df_mean + + # Using mode + def fix_missing_mode(self,df): + df_mode=df['column'].fillna(int(df['Salary'].mode()), inplace=True) + return df_mode + # By Interpolation + def fix_missing_interpolation_fffil(self,df): + df_clean = df_dropped.interpolate(method='ffill') + return df_clean + def fix_missing_interpolation_bffil(self,df): + df_clean = df_dropped.interpolate(method='bfill') + return df_clean \ No newline at end of file diff --git a/scripts/load_data.py b/scripts/load_data.py new file mode 100644 index 0000000..17bfc37 --- /dev/null +++ b/scripts/load_data.py @@ -0,0 +1,68 @@ +import json +import pandas as pd + +class LoadData: + """ + this class contains functions to load data from json, excel or csv files into a pandas dataframe + + Return + ------ + dataframe + """ + + def __init__(self): + pass + + def read_json(self, json_file: str, dfExtractFunc: object )->pd.DataFrame: + """ + json file reader to open and read json files into a panda dataframe + Args: + ----- + json_file: str - path of a json file + dfExtractFunc: object - The function that will used to extract data from the list formed from the json file + + Returns + ------- + dataframe containing data extracted from the json file + """ + + data_list = [] + for item in open(json_file,'r'): + data_list.append(json.loads(item)) + + df = dfExtractFunc(data_list) + return df + + def read_excel(self, excel_file, startRow=0)->pd.DataFrame: + """ + excel file reader to open and read excel files into a panda dataframe + Args: + ----- + excel_file: str - path of a excel file + engine: str - sets the default engine used by pandas to load the excel file + startRow: int - sets the first row in excel sheet where pandas should start loading from + + Returns + ------- + dataframe containing data extracted from the excel file + """ + + df = pd.read_excel(excel_file,engine='openpyxl') + return df + + def read_csv(self, csv_file)->pd.DataFrame: + """ + csv file reader to open and read csv files into a panda dataframe + Args: + ----- + csv_file: str - path of a json file + + Returns + ------- + dataframe containing data extracted from the csv file + + """ + + return pd.read_csv(csv_file) + + \ No newline at end of file diff --git a/scripts/multiapp.py b/scripts/multiapp.py new file mode 100644 index 0000000..0c775d1 --- /dev/null +++ b/scripts/multiapp.py @@ -0,0 +1,51 @@ +import streamlit as st + +"""Frameworks for running multiple Streamlit applications as a single app. +""" + + +class MultiApp: + """Framework for combining multiple streamlit applications. + Usage: + def foo(): + st.title("Hello Foo") + def bar(): + st.title("Hello Bar") + app = MultiApp() + app.add_app("Foo", foo) + app.add_app("Bar", bar) + app.run() + It is also possible keep each application in a separate file. + import foo + import bar + app = MultiApp() + app.add_app("Foo", foo.app) + app.add_app("Bar", bar.app) + app.run() + """ + + def __init__(self): + self.apps = [] + + def add_app(self, title, func): + """Adds a new application. + Parameters + ---------- + func: + the python function to render this app. + title: + title of the app. Appears in the dropdown in the sidebar. + """ + self.apps.append({ + "title": title, + "function": func + }) + + def run(self): + # app = st.sidebar.radio( + app = st.sidebar.selectbox( + 'Navigation', + self.apps, + format_func=lambda app: app['title']) + + app['function']() From ea64953afc441740caf168dbfaf6ce3ad1bd1d16 Mon Sep 17 00:00:00 2001 From: wakura-mbuya Date: Sat, 21 May 2022 02:14:19 +0300 Subject: [PATCH 05/11] grouped the data by browser - chrome OS --- data.dvc | 4 +- notebooks/AD-campaign-split-data.ipynb | 628 +++++++++++++++++++++++++ scripts/utils.py | 121 +++++ 3 files changed, 751 insertions(+), 2 deletions(-) create mode 100644 notebooks/AD-campaign-split-data.ipynb create mode 100644 scripts/utils.py diff --git a/data.dvc b/data.dvc index 6a158eb..9218a8b 100644 --- a/data.dvc +++ b/data.dvc @@ -1,5 +1,5 @@ outs: -- md5: a6c492b2df37afda6ece5788bbb1bdc1.dir - size: 784224 +- md5: efaeddabdca24809e333d347ac474d8b.dir + size: 34597 nfiles: 1 path: data diff --git a/notebooks/AD-campaign-split-data.ipynb b/notebooks/AD-campaign-split-data.ipynb new file mode 100644 index 0000000..5111594 --- /dev/null +++ b/notebooks/AD-campaign-split-data.ipynb @@ -0,0 +1,628 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d1544788-6a89-4efc-afe2-1340f149a315", + "metadata": {}, + "source": [ + "# Split the Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "948d8d62-f168-4536-a159-ebe1aa9d4b15", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import sys\n", + "sys.path.append(\"../scripts\")\n", + "from utils import Clean \n", + "from load_data import LoadData" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "76ceeba5-6cca-4ea3-9f64-6a0fe212a913", + "metadata": {}, + "outputs": [], + "source": [ + "#initialize utilities\n", + "loader = LoadData()\n", + "cleaner = Clean()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ffbd3111-08d3-4bab-b0c5-58e4eaca8c44", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
auction_idexperimentdatehourdevice_makeplatform_osbrowseryesno
00008ef63-77a7-448b-bd1e-075f42c55e39exposed2020-07-108Generic Smartphone6Chrome Mobile00
1000eabc5-17ce-4137-8efe-44734d914446exposed2020-07-0710Generic Smartphone6Chrome Mobile00
20016d14a-ae18-4a02-a204-6ba53b52f2edexposed2020-07-052E58236Chrome Mobile WebView01
300187412-2932-4542-a8ef-3633901c98d9control2020-07-0315Samsung SM-A705FN6Facebook00
4001a7785-d3fe-4e11-a344-c8735acacc2ccontrol2020-07-0315Generic Smartphone6Chrome Mobile00
\n", + "
" + ], + "text/plain": [ + " auction_id experiment date hour \\\n", + "0 0008ef63-77a7-448b-bd1e-075f42c55e39 exposed 2020-07-10 8 \n", + "1 000eabc5-17ce-4137-8efe-44734d914446 exposed 2020-07-07 10 \n", + "2 0016d14a-ae18-4a02-a204-6ba53b52f2ed exposed 2020-07-05 2 \n", + "3 00187412-2932-4542-a8ef-3633901c98d9 control 2020-07-03 15 \n", + "4 001a7785-d3fe-4e11-a344-c8735acacc2c control 2020-07-03 15 \n", + "\n", + " device_make platform_os browser yes no \n", + "0 Generic Smartphone 6 Chrome Mobile 0 0 \n", + "1 Generic Smartphone 6 Chrome Mobile 0 0 \n", + "2 E5823 6 Chrome Mobile WebView 0 1 \n", + "3 Samsung SM-A705FN 6 Facebook 0 0 \n", + "4 Generic Smartphone 6 Chrome Mobile 0 0 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#laod the original dataset\n", + "loader = LoadData()\n", + "df = loader.read_csv('../data/AdSmartABdata.csv')\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "9a590d8e-aae6-4be9-a958-0aa00df29ae7", + "metadata": {}, + "source": [ + "We already have a raw dataset as version 1 of the data\n", + "We are going to create version 2 of the data by cleaning the raw dataset. First, we delete the raw dataset from the data folder" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cfc03bb6-92fc-4d63-a884-fb651b8c41f1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 8077 entries, 0 to 8076\n", + "Data columns (total 9 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 auction_id 8077 non-null object\n", + " 1 experiment 8077 non-null object\n", + " 2 date 8077 non-null object\n", + " 3 hour 8077 non-null int64 \n", + " 4 device_make 8077 non-null object\n", + " 5 platform_os 8077 non-null int64 \n", + " 6 browser 8077 non-null object\n", + " 7 yes 8077 non-null int64 \n", + " 8 no 8077 non-null int64 \n", + "dtypes: int64(4), object(5)\n", + "memory usage: 568.0+ KB\n" + ] + } + ], + "source": [ + "df.info()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "8ce5f99f-c329-4bf2-bb75-c8282899968a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 1243 entries, 0 to 1242\n", + "Data columns (total 7 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 experiment 1243 non-null object\n", + " 1 hour 1243 non-null int64 \n", + " 2 platform_os 1243 non-null int64 \n", + " 3 browser 1243 non-null object\n", + " 4 day_of_week 1243 non-null object\n", + " 5 brand 1243 non-null object\n", + " 6 response 1243 non-null int64 \n", + "dtypes: int64(3), object(4)\n", + "memory usage: 68.1+ KB\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "../scripts\\utils.py:62: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df['day_of_week'] = pd.to_datetime(df['date']).dt.day_name().values\n", + "../scripts\\utils.py:107: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df['brand'] = makers\n", + "../scripts\\utils.py:87: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df['response'] = [1] * df.shape[0]\n", + "C:\\Users\\User\\anaconda3\\envs\\envMysql\\lib\\site-packages\\pandas\\core\\indexing.py:1763: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " isetter(loc, value)\n", + "C:\\Users\\User\\anaconda3\\envs\\envMysql\\lib\\site-packages\\pandas\\core\\frame.py:4174: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " errors=errors,\n" + ] + } + ], + "source": [ + "df = cleaner.run_pipeline(df)\n", + "df.info()" + ] + }, + { + "cell_type": "markdown", + "id": "b112f45d-60d8-4d2f-99d4-922c4c5f0a2a", + "metadata": {}, + "source": [ + "### Groupby browser\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e255c909-88fc-46af-81e6-e44c9e907352", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
experimenthourplatform_osday_of_weekbrandresponse
browser
Chrome222222
Chrome Mobile695695695695695695
Chrome Mobile WebView227227227227227227
Chrome Mobile iOS111111
Facebook156156156156156156
Mobile Safari141414141414
Mobile Safari UI/WKWebView333333
Samsung Internet145145145145145145
\n", + "
" + ], + "text/plain": [ + " experiment hour platform_os day_of_week brand \\\n", + "browser \n", + "Chrome 2 2 2 2 2 \n", + "Chrome Mobile 695 695 695 695 695 \n", + "Chrome Mobile WebView 227 227 227 227 227 \n", + "Chrome Mobile iOS 1 1 1 1 1 \n", + "Facebook 156 156 156 156 156 \n", + "Mobile Safari 14 14 14 14 14 \n", + "Mobile Safari UI/WKWebView 3 3 3 3 3 \n", + "Samsung Internet 145 145 145 145 145 \n", + "\n", + " response \n", + "browser \n", + "Chrome 2 \n", + "Chrome Mobile 695 \n", + "Chrome Mobile WebView 227 \n", + "Chrome Mobile iOS 1 \n", + "Facebook 156 \n", + "Mobile Safari 14 \n", + "Mobile Safari UI/WKWebView 3 \n", + "Samsung Internet 145 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.groupby('browser').count()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "f9c2f50d-941b-4237-881d-1fe59fc37569", + "metadata": {}, + "outputs": [], + "source": [ + "#Group by browser and store them on in a dictionary\n", + "by_browser = df.groupby('browser')\n", + "browsers = by_browser['experiment'].count() > 100\n", + "browsers = browsers[browsers==True].index\n", + "browser_dfs = {}\n", + "for browser in browsers:\n", + " b_df = df.query(f\"browser=='{browser}'\").reset_index(drop=True)\n", + " browser_dfs[browser] = b_df" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "722b9a30-656b-40cc-8d64-6c795a9574a4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['Chrome Mobile', 'Chrome Mobile WebView', 'Facebook', 'Samsung Internet'])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "browser_dfs.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "62fca472-33a4-4b26-b5ac-fff3c9c8f2a2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
experimenthourplatform_osbrowserday_of_weekbrandresponse
0exposed166Chrome MobileSaturdaygeneric1
1exposed86Chrome MobileMondaygeneric0
2control156Chrome MobileFridaygeneric0
3exposed26Chrome MobileFridaygeneric0
4control156Chrome MobileFridaygeneric1
\n", + "
" + ], + "text/plain": [ + " experiment hour platform_os browser day_of_week brand response\n", + "0 exposed 16 6 Chrome Mobile Saturday generic 1\n", + "1 exposed 8 6 Chrome Mobile Monday generic 0\n", + "2 control 15 6 Chrome Mobile Friday generic 0\n", + "3 exposed 2 6 Chrome Mobile Friday generic 0\n", + "4 control 15 6 Chrome Mobile Friday generic 1" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#create version 2 of the data for chrome mobile\n", + "b_df=browser_dfs.get('Chrome Mobile')\n", + "b_df.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "6cb1fe49-e119-4297-87f1-3e79b85964c0", + "metadata": {}, + "outputs": [], + "source": [ + "b_df.to_csv('../data/AdSmartABdata.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7121712d-8111-41db-a617-1126e9b4b7d7", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/scripts/utils.py b/scripts/utils.py new file mode 100644 index 0000000..42b8707 --- /dev/null +++ b/scripts/utils.py @@ -0,0 +1,121 @@ +import pandas as pd +import numpy as np +from sklearn.preprocessing import MinMaxScaler, StandardScaler, Normalizer + +class Clean: + def get_mct(self, series: pd.Series, measure: str): + """ + get mean, median or mode depending on measure + """ + measure = measure.lower() + if measure == "mean": + return series.mean() + elif measure == "median": + return series.median() + elif measure == "mode": + return series.mode()[0] + + + def remove_null_row(self, df: pd.DataFrame, columns: str) -> pd.DataFrame: + """" + Removes rows with null values in the specified columns + """ + for column in columns: + df = df[~ df[column].isna()] + return df + + def normal_scale(self, df: pd.DataFrame) -> pd.DataFrame: + """ + Returns the DataFrame scalled using the StandardScaler from skLearn + """ + scaller = StandardScaler() + scalled = pd.DataFrame(scaller.fit_transform( + df[self.get_numerical_columns(df)])) + scalled.columns = self.get_numerical_columns(df) + return scalled + + def minmax_scale(self, df: pd.DataFrame) -> pd.DataFrame: + """ + Returns the DataFrame scalled using the MinMaxScaler from skLearn + """ + scaller = MinMaxScaler() + scalled = pd.DataFrame( + scaller.fit_transform( + df[self.get_numerical_columns(df)]), + columns=self.get_numerical_columns(df) + ) + return scalled + + def normalize(self, df: pd.DataFrame) -> pd.DataFrame: + normalizer = Normalizer() + normalized = pd.DataFrame( + normalizer.fit_transform( + df[self.get_numerical_columns(df)]), + columns=self.get_numerical_columns(df) + ) + return normalized + + def date_to_day(self, df: pd.DataFrame) -> pd.DataFrame: + """ + This converts the date column into the day of the week + """ + df['day_of_week'] = pd.to_datetime(df['date']).dt.day_name().values + return df + + def drop_unresponsive(self, df: pd.DataFrame) -> pd.DataFrame: + """ + This drops rows where users didn't repond to the questioneer. + Meaning, rows where both yes and no columns have 0 + """ + df = df.query("yes==1 | no==1") + return df + + def drop_columns(self, df: pd.DataFrame, columns: list = None) -> pd.DataFrame: + """ + Drops columns that are not essesntial for modeling + """ + if not columns: + columns = ['auction_id', 'date', 'yes', 'no', 'device_make'] + df.drop(columns=columns, inplace=True) + return df + + def merge_response_columns(self, df: pd.DataFrame) -> pd.DataFrame: + """ + This merges the one-hot-encoded target columns into + a single column named response, and drop the yes and no columns + """ + df['response'] = [1] * df.shape[0] + df.loc[df['no'] == 1, 'response'] = 0 + return df + + def convert_to_brands(self, df: pd.DataFrame) -> pd.DataFrame: + """ + This converts the device model column in to + `known` and `generic` brands. It then removes + the device_make column. + """ + known_brands = ['samsung', 'htc', 'nokia', + 'moto', 'lg', 'oneplus', + 'iphone', 'xiaomi', 'huawei', + 'pixel'] + makers = ["generic"]*df.shape[0] + for idx, make in enumerate(df['device_make'].values): + for brand in known_brands: + if brand in make.lower(): + makers[idx] = "known brand" + break + df['brand'] = makers + return df + + def run_pipeline(self, df: pd.DataFrame) -> pd.DataFrame: + """ + This runs a series of cleaner methods on the df passed to it. + """ + + df = self.drop_unresponsive(df) + df = self.date_to_day(df) + df = self.convert_to_brands(df) + df = self.merge_response_columns(df) + df = self.drop_columns(df) + df.reset_index(drop=True, inplace=True) + return df From ea3c088a7a8bd7630423716f40ae4e0a9a139247 Mon Sep 17 00:00:00 2001 From: wakura-mbuya Date: Sat, 21 May 2022 02:27:48 +0300 Subject: [PATCH 06/11] grouped the data by browser - Chrome Mobile WebView --- data.dvc | 4 +- notebooks/AD-campaign-split-data.ipynb | 130 ++++++++++++++++++++++++- 2 files changed, 131 insertions(+), 3 deletions(-) diff --git a/data.dvc b/data.dvc index 9218a8b..b132e79 100644 --- a/data.dvc +++ b/data.dvc @@ -1,5 +1,5 @@ outs: -- md5: efaeddabdca24809e333d347ac474d8b.dir - size: 34597 +- md5: 0e4a900ef20d626b0728c674327e9bbb.dir + size: 13664 nfiles: 1 path: data diff --git a/notebooks/AD-campaign-split-data.ipynb b/notebooks/AD-campaign-split-data.ipynb index 5111594..9b9f314 100644 --- a/notebooks/AD-campaign-split-data.ipynb +++ b/notebooks/AD-campaign-split-data.ipynb @@ -597,9 +597,137 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "7121712d-8111-41db-a617-1126e9b4b7d7", "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
experimenthourplatform_osbrowserday_of_weekbrandresponse
0exposed26Chrome Mobile WebViewSundaygeneric0
1exposed66Chrome Mobile WebViewSundaygeneric0
2exposed206Chrome Mobile WebViewThursdayknown brand0
3control26Chrome Mobile WebViewMondayknown brand0
4exposed116Chrome Mobile WebViewSaturdayknown brand1
\n", + "
" + ], + "text/plain": [ + " experiment hour platform_os browser day_of_week \\\n", + "0 exposed 2 6 Chrome Mobile WebView Sunday \n", + "1 exposed 6 6 Chrome Mobile WebView Sunday \n", + "2 exposed 20 6 Chrome Mobile WebView Thursday \n", + "3 control 2 6 Chrome Mobile WebView Monday \n", + "4 exposed 11 6 Chrome Mobile WebView Saturday \n", + "\n", + " brand response \n", + "0 generic 0 \n", + "1 generic 0 \n", + "2 known brand 0 \n", + "3 known brand 0 \n", + "4 known brand 1 " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#create version 3 of the data for Chrome Mobile WebView\n", + "b_df=browser_dfs.get('Chrome Mobile WebView')\n", + "b_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "0f7b89f2-107e-49f6-bf6c-86087c1869c5", + "metadata": {}, + "outputs": [], + "source": [ + "b_df.to_csv('../data/AdSmartABdata.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f8b40eda-e531-496f-b63d-cc3031bed000", + "metadata": {}, "outputs": [], "source": [] } From ea8f5812c5fdafc0dfd70fe9f877fb7f1a4c6d7f Mon Sep 17 00:00:00 2001 From: wakura-mbuya Date: Sat, 21 May 2022 02:44:38 +0300 Subject: [PATCH 07/11] split data based on browser --- git | 0 notebooks/AD-campaign-modellingj.ipynb | 2 +- notebooks/AD-campaign-split-data.ipynb | 121 ++++++++++++++++++++++++- 3 files changed, 118 insertions(+), 5 deletions(-) create mode 100644 git diff --git a/git b/git new file mode 100644 index 0000000..e69de29 diff --git a/notebooks/AD-campaign-modellingj.ipynb b/notebooks/AD-campaign-modellingj.ipynb index 89b6bb4..5dae353 100644 --- a/notebooks/AD-campaign-modellingj.ipynb +++ b/notebooks/AD-campaign-modellingj.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "602cf0cc-024c-4933-b393-d986bd5e8066", "metadata": {}, "outputs": [], diff --git a/notebooks/AD-campaign-split-data.ipynb b/notebooks/AD-campaign-split-data.ipynb index 9b9f314..2edbaba 100644 --- a/notebooks/AD-campaign-split-data.ipynb +++ b/notebooks/AD-campaign-split-data.ipynb @@ -715,7 +715,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "0f7b89f2-107e-49f6-bf6c-86087c1869c5", "metadata": {}, "outputs": [], @@ -725,11 +725,124 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "f8b40eda-e531-496f-b63d-cc3031bed000", + "execution_count": 13, + "id": "16f68977-01c9-453c-9e69-816e108f36cf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
experimenthourplatform_osbrowserday_of_weekbrandresponse
0control46FacebookWednesdayknown brand1
1control156FacebookFridaygeneric0
2exposed136FacebookThursdayknown brand1
3control206FacebookThursdayknown brand1
4control156FacebookFridayknown brand0
\n", + "
" + ], + "text/plain": [ + " experiment hour platform_os browser day_of_week brand response\n", + "0 control 4 6 Facebook Wednesday known brand 1\n", + "1 control 15 6 Facebook Friday generic 0\n", + "2 exposed 13 6 Facebook Thursday known brand 1\n", + "3 control 20 6 Facebook Thursday known brand 1\n", + "4 control 15 6 Facebook Friday known brand 0" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#create version 4 of the data for Facebook\n", + "b_df=browser_dfs.get('Facebook')\n", + "b_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "f8d5e7ab-3448-4320-bf0c-cf504d6af7f2", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "b_df.to_csv('../data/AdSmartABdata.csv')" + ] } ], "metadata": { From 1c671af8c16e739f9ab9f8ea14c0ba74c7c94fbe Mon Sep 17 00:00:00 2001 From: wakura-mbuya Date: Sat, 21 May 2022 07:17:34 +0300 Subject: [PATCH 08/11] grouped the data by browser - Samsung Internet --- data.dvc | 4 +- notebooks/AD-campaign-split-data.ipynb | 136 +++++++++++++++++++++++++ 2 files changed, 138 insertions(+), 2 deletions(-) diff --git a/data.dvc b/data.dvc index b132e79..23088e9 100644 --- a/data.dvc +++ b/data.dvc @@ -1,5 +1,5 @@ outs: -- md5: 0e4a900ef20d626b0728c674327e9bbb.dir - size: 13664 +- md5: 73b1cff6778f03c24a1b600c6ec32451.dir + size: 8149 nfiles: 1 path: data diff --git a/notebooks/AD-campaign-split-data.ipynb b/notebooks/AD-campaign-split-data.ipynb index 2edbaba..2f4a060 100644 --- a/notebooks/AD-campaign-split-data.ipynb +++ b/notebooks/AD-campaign-split-data.ipynb @@ -843,6 +843,142 @@ "source": [ "b_df.to_csv('../data/AdSmartABdata.csv')" ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "6bb56feb-ba8d-49a8-bf5c-632fad6ed047", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
experimenthourplatform_osbrowserday_of_weekbrandresponse
0control156Samsung InternetFridayknown brand0
1exposed206Samsung InternetThursdayknown brand0
2exposed36Samsung InternetTuesdayknown brand0
3exposed06Samsung InternetThursdayknown brand0
4control156Samsung InternetFridayknown brand0
\n", + "
" + ], + "text/plain": [ + " experiment hour platform_os browser day_of_week brand \\\n", + "0 control 15 6 Samsung Internet Friday known brand \n", + "1 exposed 20 6 Samsung Internet Thursday known brand \n", + "2 exposed 3 6 Samsung Internet Tuesday known brand \n", + "3 exposed 0 6 Samsung Internet Thursday known brand \n", + "4 control 15 6 Samsung Internet Friday known brand \n", + "\n", + " response \n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#create version 5 of the data for Samsung Internet\n", + "b_df=browser_dfs.get('Samsung Internet')\n", + "b_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "910287f2-bc61-4880-a9c1-794c7a1c40d1", + "metadata": {}, + "outputs": [], + "source": [ + "b_df.to_csv('../data/AdSmartABdata.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d4600843-ade6-41ce-b15f-ca4391e1c1c9", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From 7728902f61e062da030aeedb3f5e82e682475b28 Mon Sep 17 00:00:00 2001 From: wakura-mbuya Date: Sat, 21 May 2022 07:29:42 +0300 Subject: [PATCH 09/11] grouped the data by browser -Facebook --- data.dvc | 4 ++-- notebooks/AD-campaign-split-data.ipynb | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/data.dvc b/data.dvc index 23088e9..57839cf 100644 --- a/data.dvc +++ b/data.dvc @@ -1,5 +1,5 @@ outs: -- md5: 73b1cff6778f03c24a1b600c6ec32451.dir - size: 8149 +- md5: 22ef38d7ccfb57a8725f2e120d0ac603.dir + size: 7342 nfiles: 1 path: data diff --git a/notebooks/AD-campaign-split-data.ipynb b/notebooks/AD-campaign-split-data.ipynb index 2f4a060..39b8cd2 100644 --- a/notebooks/AD-campaign-split-data.ipynb +++ b/notebooks/AD-campaign-split-data.ipynb @@ -725,7 +725,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 17, "id": "16f68977-01c9-453c-9e69-816e108f36cf", "metadata": {}, "outputs": [ @@ -823,7 +823,7 @@ "4 control 15 6 Facebook Friday known brand 0" ] }, - "execution_count": 13, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -836,7 +836,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 18, "id": "f8d5e7ab-3448-4320-bf0c-cf504d6af7f2", "metadata": {}, "outputs": [], From 07a9443911953ef0ab77cd8e699e63d3d1663662 Mon Sep 17 00:00:00 2001 From: wakura-mbuya Date: Sat, 21 May 2022 07:48:41 +0300 Subject: [PATCH 10/11] grouped the data by platform_os 6 --- data.dvc | 4 +- notebooks/AD-campaign-split-data.ipynb | 222 ++++++++++++++++++++++++- 2 files changed, 223 insertions(+), 3 deletions(-) diff --git a/data.dvc b/data.dvc index 57839cf..0e61ff2 100644 --- a/data.dvc +++ b/data.dvc @@ -1,5 +1,5 @@ outs: -- md5: 22ef38d7ccfb57a8725f2e120d0ac603.dir - size: 7342 +- md5: 950cf35a35abf86276c17fc491a697ff.dir + size: 64258 nfiles: 1 path: data diff --git a/notebooks/AD-campaign-split-data.ipynb b/notebooks/AD-campaign-split-data.ipynb index 39b8cd2..4f3846a 100644 --- a/notebooks/AD-campaign-split-data.ipynb +++ b/notebooks/AD-campaign-split-data.ipynb @@ -972,10 +972,230 @@ "b_df.to_csv('../data/AdSmartABdata.csv')" ] }, + { + "cell_type": "markdown", + "id": "97266255-ab97-4ef7-baab-a906148cd05b", + "metadata": {}, + "source": [ + "### Groupby platform OS" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "3cc84c96-f156-4e68-b6d1-fb65996dde6b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
experimenthourbrowserday_of_weekbrandresponse
platform_os
5171717171717
6122612261226122612261226
\n", + "
" + ], + "text/plain": [ + " experiment hour browser day_of_week brand response\n", + "platform_os \n", + "5 17 17 17 17 17 17\n", + "6 1226 1226 1226 1226 1226 1226" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.groupby('platform_os').count()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "bf4448fe-7c58-458b-b420-67bde41b7c48", + "metadata": {}, + "outputs": [], + "source": [ + "#Group by platform_os and store them on in a dictionary\n", + "by_platform = df.groupby('platform_os')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "b5d480fb-c53f-4fc6-8a61-d5d2ffa437e2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
experimenthourplatform_osbrowserday_of_weekbrandresponse
0exposed26Chrome Mobile WebViewSundaygeneric0
1exposed166Chrome MobileSaturdaygeneric1
2exposed86Chrome MobileMondaygeneric0
3control46FacebookWednesdayknown brand1
4control156Chrome MobileFridaygeneric0
\n", + "
" + ], + "text/plain": [ + " experiment hour platform_os browser day_of_week \\\n", + "0 exposed 2 6 Chrome Mobile WebView Sunday \n", + "1 exposed 16 6 Chrome Mobile Saturday \n", + "2 exposed 8 6 Chrome Mobile Monday \n", + "3 control 4 6 Facebook Wednesday \n", + "4 control 15 6 Chrome Mobile Friday \n", + "\n", + " brand response \n", + "0 generic 0 \n", + "1 generic 1 \n", + "2 generic 0 \n", + "3 known brand 1 \n", + "4 generic 0 " + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#create version 6 of the data for platform_os 6\n", + "p_df = by_platform.get_group(6).reset_index(drop=True)\n", + "p_df.head()" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "d4600843-ade6-41ce-b15f-ca4391e1c1c9", + "id": "4f52c476-eba6-46a4-a63a-789e53336218", "metadata": {}, "outputs": [], "source": [] From 5ef9216e8d257ae707618d4f1733ab8db70132f4 Mon Sep 17 00:00:00 2001 From: wakura-mbuya Date: Sat, 21 May 2022 07:52:18 +0300 Subject: [PATCH 11/11] grouped the data by platform_os - 5 --- data.dvc | 4 +- notebooks/AD-campaign-split-data.ipynb | 152 ++++++++++++++++++++++++- 2 files changed, 151 insertions(+), 5 deletions(-) diff --git a/data.dvc b/data.dvc index 0e61ff2..5649b95 100644 --- a/data.dvc +++ b/data.dvc @@ -1,5 +1,5 @@ outs: -- md5: 950cf35a35abf86276c17fc491a697ff.dir - size: 64258 +- md5: b641f11bd5b87ca427dd46c42517c365.dir + size: 992 nfiles: 1 path: data diff --git a/notebooks/AD-campaign-split-data.ipynb b/notebooks/AD-campaign-split-data.ipynb index 4f3846a..cd01a39 100644 --- a/notebooks/AD-campaign-split-data.ipynb +++ b/notebooks/AD-campaign-split-data.ipynb @@ -1076,7 +1076,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 31, "id": "b5d480fb-c53f-4fc6-8a61-d5d2ffa437e2", "metadata": {}, "outputs": [ @@ -1181,7 +1181,7 @@ "4 generic 0 " ] }, - "execution_count": 30, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -1194,10 +1194,156 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "id": "4f52c476-eba6-46a4-a63a-789e53336218", "metadata": {}, "outputs": [], + "source": [ + "p_df.to_csv('../data/AdSmartABdata.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "7516c776-8ad3-40cd-ba7a-0756a5d76291", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(17, 7)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
experimenthourplatform_osbrowserday_of_weekbrandresponse
0exposed85Mobile SafariFridayknown brand0
1control155Mobile SafariFridayknown brand0
2control155Mobile Safari UI/WKWebViewFridayknown brand0
3control35Mobile SafariSaturdayknown brand1
4exposed35Mobile SafariSundayknown brand1
\n", + "
" + ], + "text/plain": [ + " experiment hour platform_os browser day_of_week \\\n", + "0 exposed 8 5 Mobile Safari Friday \n", + "1 control 15 5 Mobile Safari Friday \n", + "2 control 15 5 Mobile Safari UI/WKWebView Friday \n", + "3 control 3 5 Mobile Safari Saturday \n", + "4 exposed 3 5 Mobile Safari Sunday \n", + "\n", + " brand response \n", + "0 known brand 0 \n", + "1 known brand 0 \n", + "2 known brand 0 \n", + "3 known brand 1 \n", + "4 known brand 1 " + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "##### create version 7 of the data for platform_os 5\n", + "p_df = by_platform.get_group(5).reset_index(drop=True)\n", + "print(p_df.shape)\n", + "p_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "4f6aa0dd-652b-4fb3-b2be-e7551fd48193", + "metadata": {}, + "outputs": [], + "source": [ + "p_df.to_csv('../data/AdSmartABdata.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ebb8527d-3299-498e-b87a-9342f4864f1e", + "metadata": {}, + "outputs": [], "source": [] } ],