{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Detecting Dataset Drift with whylogs\n", "\n", "We will be using data from Kaggle (https://www.kaggle.com/yugagrawal95/sample-media-spends-data) that is packaged with this notebook." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "import datetime\n", "import math\n", "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "import matplotlib.ticker as ticker\n", "\n", "from whylogs import get_or_create_session" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Read our Media Spend dataset as Pandas dataframe\n", "data = pd.read_csv(\"MediaSpendDataset.csv\",\n", " parse_dates=[\"Calendar_Week\"], infer_datetime_format=True)" ] }, { "cell_type": "code", "execution_count": 3, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DivisionCalendar_WeekPaid_ViewsOrganic_ViewsGoogle_ImpressionsEmail_ImpressionsFacebook_ImpressionsAffiliate_ImpressionsOverall_ViewsSales
0A2018-01-063924224083.498950e+05735801207268259417
1A2018-01-137879041105.062702e+0511804949985356806
2A2018-01-20819707424.300422e+05522321704875948715
3A2018-01-2725575654.177457e+05786401020794272047
4A2018-02-035652842954.085058e+0540561583465856235
.................................
3046Z2020-02-0129239253116224061.459071e+0645026120985366782707
3047Z2020-02-0826230280316244095.342505e+0522707095485366584503
3048Z2020-02-1524749312814393624.227182e+05393685986155561147325
3049Z2020-02-2220713303564641786.085799e+054246761022149221111525
3050Z2020-02-2915990269934490324.390165e+05161439102944299498187
\n", "

3051 rows × 10 columns

\n", "
" ], "text/plain": [ " Division Calendar_Week Paid_Views Organic_Views Google_Impressions \\\n", "0 A 2018-01-06 392 422 408 \n", "1 A 2018-01-13 787 904 110 \n", "2 A 2018-01-20 81 970 742 \n", "3 A 2018-01-27 25 575 65 \n", "4 A 2018-02-03 565 284 295 \n", "... ... ... ... ... ... \n", "3046 Z 2020-02-01 29239 25311 622406 \n", "3047 Z 2020-02-08 26230 28031 624409 \n", "3048 Z 2020-02-15 24749 31281 439362 \n", "3049 Z 2020-02-22 20713 30356 464178 \n", "3050 Z 2020-02-29 15990 26993 449032 \n", "\n", " Email_Impressions Facebook_Impressions Affiliate_Impressions \\\n", "0 3.498950e+05 73580 12072 \n", "1 5.062702e+05 11804 9499 \n", "2 4.300422e+05 52232 17048 \n", "3 4.177457e+05 78640 10207 \n", "4 4.085058e+05 40561 5834 \n", "... ... ... ... \n", "3046 1.459071e+06 45026 12098 \n", "3047 5.342505e+05 227070 9548 \n", "3048 4.227182e+05 393685 9861 \n", "3049 6.085799e+05 424676 10221 \n", "3050 4.390165e+05 161439 10294 \n", "\n", " Overall_Views Sales \n", "0 682 59417 \n", "1 853 56806 \n", "2 759 48715 \n", "3 942 72047 \n", "4 658 56235 \n", "... ... ... \n", "3046 53667 82707 \n", "3047 53665 84503 \n", "3048 55561 147325 \n", "3049 49221 111525 \n", "3050 42994 98187 \n", "\n", "[3051 rows x 10 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see here, we have advertising and media impressions and views per week for a number of marketing campaigns for some unknown company. Included with this information is sales against those spends.\n", "\n", "## Exploratory Data Analysis\n", "\n", "Let's now explore the dataset; we have very little metadata or context." ] }, { "cell_type": "code", "execution_count": 4, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Calendar_Week2018-01-062018-01-132018-01-202018-01-272018-02-032018-02-102018-02-172018-02-242018-03-032018-03-10...2019-12-282020-01-042020-01-112020-01-182020-01-252020-02-012020-02-082020-02-152020-02-222020-02-29
Division27272727272727272727...27272727272727272727
Paid_Views27272727272727272727...27272727272727272727
Organic_Views27272727272727272727...27272727272727272727
Google_Impressions27272727272727272727...27272727272727272727
Email_Impressions27272727272727272727...27272727272727272727
Facebook_Impressions27272727272727272727...27272727272727272727
Affiliate_Impressions27272727272727272727...27272727272727272727
Overall_Views27272727272727272727...27272727272727272727
Sales27272727272727272727...27272727272727272727
\n", "

9 rows × 113 columns

\n", "
" ], "text/plain": [ "Calendar_Week 2018-01-06 2018-01-13 2018-01-20 2018-01-27 \\\n", "Division 27 27 27 27 \n", "Paid_Views 27 27 27 27 \n", "Organic_Views 27 27 27 27 \n", "Google_Impressions 27 27 27 27 \n", "Email_Impressions 27 27 27 27 \n", "Facebook_Impressions 27 27 27 27 \n", "Affiliate_Impressions 27 27 27 27 \n", "Overall_Views 27 27 27 27 \n", "Sales 27 27 27 27 \n", "\n", "Calendar_Week 2018-02-03 2018-02-10 2018-02-17 2018-02-24 \\\n", "Division 27 27 27 27 \n", "Paid_Views 27 27 27 27 \n", "Organic_Views 27 27 27 27 \n", "Google_Impressions 27 27 27 27 \n", "Email_Impressions 27 27 27 27 \n", "Facebook_Impressions 27 27 27 27 \n", "Affiliate_Impressions 27 27 27 27 \n", "Overall_Views 27 27 27 27 \n", "Sales 27 27 27 27 \n", "\n", "Calendar_Week 2018-03-03 2018-03-10 ... 2019-12-28 2020-01-04 \\\n", "Division 27 27 ... 27 27 \n", "Paid_Views 27 27 ... 27 27 \n", "Organic_Views 27 27 ... 27 27 \n", "Google_Impressions 27 27 ... 27 27 \n", "Email_Impressions 27 27 ... 27 27 \n", "Facebook_Impressions 27 27 ... 27 27 \n", "Affiliate_Impressions 27 27 ... 27 27 \n", "Overall_Views 27 27 ... 27 27 \n", "Sales 27 27 ... 27 27 \n", "\n", "Calendar_Week 2020-01-11 2020-01-18 2020-01-25 2020-02-01 \\\n", "Division 27 27 27 27 \n", "Paid_Views 27 27 27 27 \n", "Organic_Views 27 27 27 27 \n", "Google_Impressions 27 27 27 27 \n", "Email_Impressions 27 27 27 27 \n", "Facebook_Impressions 27 27 27 27 \n", "Affiliate_Impressions 27 27 27 27 \n", "Overall_Views 27 27 27 27 \n", "Sales 27 27 27 27 \n", "\n", "Calendar_Week 2020-02-08 2020-02-15 2020-02-22 2020-02-29 \n", "Division 27 27 27 27 \n", "Paid_Views 27 27 27 27 \n", "Organic_Views 27 27 27 27 \n", "Google_Impressions 27 27 27 27 \n", "Email_Impressions 27 27 27 27 \n", "Facebook_Impressions 27 27 27 27 \n", "Affiliate_Impressions 27 27 27 27 \n", "Overall_Views 27 27 27 27 \n", "Sales 27 27 27 27 \n", "\n", "[9 rows x 113 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.groupby(\"Calendar_Week\").count().T" ] }, { "cell_type": "code", "execution_count": 5, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DivisionABCDEFGHIJ...QRSTUVWXYZ
Calendar_Week113113113113113113113113113113...113113113113113113113113113226
Paid_Views113113113113113113113113113113...113113113113113113113113113226
Organic_Views113113113113113113113113113113...113113113113113113113113113226
Google_Impressions113113113113113113113113113113...113113113113113113113113113226
Email_Impressions113113113113113113113113113113...113113113113113113113113113226
Facebook_Impressions113113113113113113113113113113...113113113113113113113113113226
Affiliate_Impressions113113113113113113113113113113...113113113113113113113113113226
Overall_Views113113113113113113113113113113...113113113113113113113113113226
Sales113113113113113113113113113113...113113113113113113113113113226
\n", "

9 rows × 26 columns

\n", "
" ], "text/plain": [ "Division A B C D E F G H I J ... \\\n", "Calendar_Week 113 113 113 113 113 113 113 113 113 113 ... \n", "Paid_Views 113 113 113 113 113 113 113 113 113 113 ... \n", "Organic_Views 113 113 113 113 113 113 113 113 113 113 ... \n", "Google_Impressions 113 113 113 113 113 113 113 113 113 113 ... \n", "Email_Impressions 113 113 113 113 113 113 113 113 113 113 ... \n", "Facebook_Impressions 113 113 113 113 113 113 113 113 113 113 ... \n", "Affiliate_Impressions 113 113 113 113 113 113 113 113 113 113 ... \n", "Overall_Views 113 113 113 113 113 113 113 113 113 113 ... \n", "Sales 113 113 113 113 113 113 113 113 113 113 ... \n", "\n", "Division Q R S T U V W X Y Z \n", "Calendar_Week 113 113 113 113 113 113 113 113 113 226 \n", "Paid_Views 113 113 113 113 113 113 113 113 113 226 \n", "Organic_Views 113 113 113 113 113 113 113 113 113 226 \n", "Google_Impressions 113 113 113 113 113 113 113 113 113 226 \n", "Email_Impressions 113 113 113 113 113 113 113 113 113 226 \n", "Facebook_Impressions 113 113 113 113 113 113 113 113 113 226 \n", "Affiliate_Impressions 113 113 113 113 113 113 113 113 113 226 \n", "Overall_Views 113 113 113 113 113 113 113 113 113 226 \n", "Sales 113 113 113 113 113 113 113 113 113 226 \n", "\n", "[9 rows x 26 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.groupby(\"Division\").count().T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that the *Z* division has double the entries than the other divisions." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "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, 3))\n", "sns.lineplot(x=\"Calendar_Week\", y=\"Sales\", data=data, ax=ax)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "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, 3))\n", "sns.scatterplot(x=\"Google_Impressions\", y=\"Sales\", data=data, ax=ax)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's compare the data from the first month to the last month, which happens to capture differences in transactions prior to and during the COVID-19 global pandemic." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Profiling with whylogs" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "model_date = datetime.datetime(2020, 1, 1)\n", "training_data = data[data[\"Calendar_Week\"] < model_date]\n", "test_data = data[data[\"Calendar_Week\"] >= model_date]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARN: Missing config\n" ] } ], "source": [ "session = get_or_create_session()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "profiles = []\n", "profiles.append(session.log_dataframe(training_data, dataset_timestamp=model_date))\n", "profiles.append(session.log_dataframe(test_data, dataset_timestamp=datetime.datetime.now()))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[,\n", " ]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profiles" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can compare the data we'll use for training with that in early 2020." ] }, { "cell_type": "code", "execution_count": 12, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
columncountnull_countbool_countnumeric_countmaxmeanminstddevnunique_numbers...ununique_str_upperquantile_0.0000quantile_0.0100quantile_0.0500quantile_0.2500quantile_0.5000quantile_0.7500quantile_0.9500quantile_0.9900quantile_1.0000
0Facebook_Impressions2808.00.00.02808.07.558435e+06269330.69408829.000004.800746e+052793.0...0.029.0000003092.00000013177.0000055651.00000122368.00279480.01068670.0002549912.07558435.0
1Overall_Views2808.00.00.02808.06.350570e+0524357.8785612.000004.901499e+042360.0...0.02.00000032.000000159.00000698.000005772.0027299.0106580.000249012.0635057.0
2Division2808.00.00.00.00.000000e+000.0000000.000000.000000e+000.0...26.0NaNNaNNaNNaNNaNNaNNaNNaNNaN
3Sales2808.00.00.02808.03.575430e+06186838.81445915436.000002.372908e+052788.0...0.015436.00000025081.00000044106.0000072069.00000112454.00201010.0579378.000997182.03575430.0
4Paid_Views2808.00.00.02808.05.181900e+0513424.5965101.000002.974463e+042111.0...0.01.00000017.000000120.00000497.00000982.0014169.054496.000140432.0518190.0
5Email_Impressions2808.00.00.02808.05.160764e+06755149.14582540894.447326.095038e+052808.0...0.040894.44921972250.273438133280.15625377753.90625590957.25955171.01884721.1253123674.55160763.5
6Google_Impressions2808.00.00.02808.01.715044e+07898847.3497157.000001.391820e+062678.0...0.07.00000071.000000262.00000164461.00000490842.001042217.03213254.0005978991.017150440.0
7Calendar_Week2808.00.00.00.00.000000e+000.0000000.000000.000000e+000.0...0.0NaNNaNNaNNaNNaNNaNNaNNaNNaN
8Affiliate_Impressions2808.00.00.02808.01.757910e+0523426.283476910.000002.198081e+042715.0...0.0910.0000001678.0000003255.000009202.0000017048.0028283.069402.000112846.0175791.0
9Organic_Views2808.00.00.02808.02.704530e+0511406.0933051.000002.218563e+042316.0...0.01.00000028.000000138.00000667.000003075.0012929.047239.000100749.0270453.0
\n", "

10 rows × 32 columns

\n", "
" ], "text/plain": [ " column count null_count bool_count numeric_count \\\n", "0 Facebook_Impressions 2808.0 0.0 0.0 2808.0 \n", "1 Overall_Views 2808.0 0.0 0.0 2808.0 \n", "2 Division 2808.0 0.0 0.0 0.0 \n", "3 Sales 2808.0 0.0 0.0 2808.0 \n", "4 Paid_Views 2808.0 0.0 0.0 2808.0 \n", "5 Email_Impressions 2808.0 0.0 0.0 2808.0 \n", "6 Google_Impressions 2808.0 0.0 0.0 2808.0 \n", "7 Calendar_Week 2808.0 0.0 0.0 0.0 \n", "8 Affiliate_Impressions 2808.0 0.0 0.0 2808.0 \n", "9 Organic_Views 2808.0 0.0 0.0 2808.0 \n", "\n", " max mean min stddev nunique_numbers \\\n", "0 7.558435e+06 269330.694088 29.00000 4.800746e+05 2793.0 \n", "1 6.350570e+05 24357.878561 2.00000 4.901499e+04 2360.0 \n", "2 0.000000e+00 0.000000 0.00000 0.000000e+00 0.0 \n", "3 3.575430e+06 186838.814459 15436.00000 2.372908e+05 2788.0 \n", "4 5.181900e+05 13424.596510 1.00000 2.974463e+04 2111.0 \n", "5 5.160764e+06 755149.145825 40894.44732 6.095038e+05 2808.0 \n", "6 1.715044e+07 898847.349715 7.00000 1.391820e+06 2678.0 \n", "7 0.000000e+00 0.000000 0.00000 0.000000e+00 0.0 \n", "8 1.757910e+05 23426.283476 910.00000 2.198081e+04 2715.0 \n", "9 2.704530e+05 11406.093305 1.00000 2.218563e+04 2316.0 \n", "\n", " ... ununique_str_upper quantile_0.0000 quantile_0.0100 quantile_0.0500 \\\n", "0 ... 0.0 29.000000 3092.000000 13177.00000 \n", "1 ... 0.0 2.000000 32.000000 159.00000 \n", "2 ... 26.0 NaN NaN NaN \n", "3 ... 0.0 15436.000000 25081.000000 44106.00000 \n", "4 ... 0.0 1.000000 17.000000 120.00000 \n", "5 ... 0.0 40894.449219 72250.273438 133280.15625 \n", "6 ... 0.0 7.000000 71.000000 262.00000 \n", "7 ... 0.0 NaN NaN NaN \n", "8 ... 0.0 910.000000 1678.000000 3255.00000 \n", "9 ... 0.0 1.000000 28.000000 138.00000 \n", "\n", " quantile_0.2500 quantile_0.5000 quantile_0.7500 quantile_0.9500 \\\n", "0 55651.00000 122368.00 279480.0 1068670.000 \n", "1 698.00000 5772.00 27299.0 106580.000 \n", "2 NaN NaN NaN NaN \n", "3 72069.00000 112454.00 201010.0 579378.000 \n", "4 497.00000 982.00 14169.0 54496.000 \n", "5 377753.90625 590957.25 955171.0 1884721.125 \n", "6 164461.00000 490842.00 1042217.0 3213254.000 \n", "7 NaN NaN NaN NaN \n", "8 9202.00000 17048.00 28283.0 69402.000 \n", "9 667.00000 3075.00 12929.0 47239.000 \n", "\n", " quantile_0.9900 quantile_1.0000 \n", "0 2549912.0 7558435.0 \n", "1 249012.0 635057.0 \n", "2 NaN NaN \n", "3 997182.0 3575430.0 \n", "4 140432.0 518190.0 \n", "5 3123674.5 5160763.5 \n", "6 5978991.0 17150440.0 \n", "7 NaN NaN \n", "8 112846.0 175791.0 \n", "9 100749.0 270453.0 \n", "\n", "[10 rows x 32 columns]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Training data profile summary\n", "training_summary = profiles[0].flat_summary()[\"summary\"]\n", "training_summary" ] }, { "cell_type": "code", "execution_count": 13, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
columncountnull_countbool_countnumeric_countmaxmeanminstddevnunique_numbers...ununique_str_upperquantile_0.0000quantile_0.0100quantile_0.0500quantile_0.2500quantile_0.5000quantile_0.7500quantile_0.9500quantile_0.9900quantile_1.0000
0Google_Impressions243.00.00.0243.04924815.000739724.279835156.00000806022.000918243.0...0.0156.000000196.000000531.000000274410.000504923.0000926291.00002542278.04304549.004924815.0
1Facebook_Impressions243.00.00.0243.01884146.000266771.7942396987.00000263839.011975243.0...0.06987.00000013480.00000033168.000000103418.000180094.0000331702.0000792423.01073992.001884146.0
2Sales243.00.00.0243.01181536.000175069.01234623012.00000162280.683991243.0...0.023012.00000025043.00000048057.00000086953.000124325.0000206752.0000430355.0968892.001181536.0
3Calendar_Week243.00.00.00.00.0000.0000000.000000.0000000.0...0.0NaNNaNNaNNaNNaNNaNNaNNaNNaN
4Affiliate_Impressions243.00.00.0243.079685.00016955.3909471139.0000015712.996483241.0...0.01139.0000001529.0000002498.0000007719.00012525.000020478.000059464.074730.0079685.0
5Paid_Views243.00.00.0243.0195738.00034384.152263374.0000035731.933116242.0...0.0374.0000001033.0000004106.00000013171.00023623.000041052.0000118075.0183982.00195738.0
6Email_Impressions243.00.00.0243.07317730.249822449.83568061334.57103791161.059026243.0...0.061334.57031265779.898438137562.171875387119.625580975.6875997442.81252390848.03884578.757317730.0
7Organic_Views243.00.00.0243.0198041.00035884.1522631917.0000032322.531757242.0...0.01917.0000002064.0000007516.00000017112.00026315.000044050.0000104290.0173100.00198041.0
8Division243.00.00.00.00.0000.0000000.000000.0000000.0...26.0NaNNaNNaNNaNNaNNaNNaNNaNNaN
9Overall_Views243.00.00.0243.0381029.00069847.1028812767.0000066124.495307243.0...0.02767.0000002934.00000012456.00000031996.00049221.000082206.0000227079.0337803.00381029.0
\n", "

10 rows × 32 columns

\n", "
" ], "text/plain": [ " column count null_count bool_count numeric_count \\\n", "0 Google_Impressions 243.0 0.0 0.0 243.0 \n", "1 Facebook_Impressions 243.0 0.0 0.0 243.0 \n", "2 Sales 243.0 0.0 0.0 243.0 \n", "3 Calendar_Week 243.0 0.0 0.0 0.0 \n", "4 Affiliate_Impressions 243.0 0.0 0.0 243.0 \n", "5 Paid_Views 243.0 0.0 0.0 243.0 \n", "6 Email_Impressions 243.0 0.0 0.0 243.0 \n", "7 Organic_Views 243.0 0.0 0.0 243.0 \n", "8 Division 243.0 0.0 0.0 0.0 \n", "9 Overall_Views 243.0 0.0 0.0 243.0 \n", "\n", " max mean min stddev nunique_numbers \\\n", "0 4924815.000 739724.279835 156.00000 806022.000918 243.0 \n", "1 1884146.000 266771.794239 6987.00000 263839.011975 243.0 \n", "2 1181536.000 175069.012346 23012.00000 162280.683991 243.0 \n", "3 0.000 0.000000 0.00000 0.000000 0.0 \n", "4 79685.000 16955.390947 1139.00000 15712.996483 241.0 \n", "5 195738.000 34384.152263 374.00000 35731.933116 242.0 \n", "6 7317730.249 822449.835680 61334.57103 791161.059026 243.0 \n", "7 198041.000 35884.152263 1917.00000 32322.531757 242.0 \n", "8 0.000 0.000000 0.00000 0.000000 0.0 \n", "9 381029.000 69847.102881 2767.00000 66124.495307 243.0 \n", "\n", " ... ununique_str_upper quantile_0.0000 quantile_0.0100 quantile_0.0500 \\\n", "0 ... 0.0 156.000000 196.000000 531.000000 \n", "1 ... 0.0 6987.000000 13480.000000 33168.000000 \n", "2 ... 0.0 23012.000000 25043.000000 48057.000000 \n", "3 ... 0.0 NaN NaN NaN \n", "4 ... 0.0 1139.000000 1529.000000 2498.000000 \n", "5 ... 0.0 374.000000 1033.000000 4106.000000 \n", "6 ... 0.0 61334.570312 65779.898438 137562.171875 \n", "7 ... 0.0 1917.000000 2064.000000 7516.000000 \n", "8 ... 26.0 NaN NaN NaN \n", "9 ... 0.0 2767.000000 2934.000000 12456.000000 \n", "\n", " quantile_0.2500 quantile_0.5000 quantile_0.7500 quantile_0.9500 \\\n", "0 274410.000 504923.0000 926291.0000 2542278.0 \n", "1 103418.000 180094.0000 331702.0000 792423.0 \n", "2 86953.000 124325.0000 206752.0000 430355.0 \n", "3 NaN NaN NaN NaN \n", "4 7719.000 12525.0000 20478.0000 59464.0 \n", "5 13171.000 23623.0000 41052.0000 118075.0 \n", "6 387119.625 580975.6875 997442.8125 2390848.0 \n", "7 17112.000 26315.0000 44050.0000 104290.0 \n", "8 NaN NaN NaN NaN \n", "9 31996.000 49221.0000 82206.0000 227079.0 \n", "\n", " quantile_0.9900 quantile_1.0000 \n", "0 4304549.00 4924815.0 \n", "1 1073992.00 1884146.0 \n", "2 968892.00 1181536.0 \n", "3 NaN NaN \n", "4 74730.00 79685.0 \n", "5 183982.00 195738.0 \n", "6 3884578.75 7317730.0 \n", "7 173100.00 198041.0 \n", "8 NaN NaN \n", "9 337803.00 381029.0 \n", "\n", "[10 rows x 32 columns]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Test data profile summary\n", "test_summary = profiles[1].flat_summary()[\"summary\"]\n", "test_summary" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Dataset Drift in whylogs Data\n", "\n", "We need to understand how the data changes between that used in training and test data. To do so, let's first view one of the many objects in the dataset profile provided by whylogs, a histogram for each feature tracked. We can then inspect the **Overall_Views** feature." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'bin_edges': [2767.0,\n", " 15375.73460343,\n", " 27984.46920686,\n", " 40593.203810290004,\n", " 53201.93841372,\n", " 65810.67301715,\n", " 78419.40762058001,\n", " 91028.14222401001,\n", " 103636.87682744,\n", " 116245.61143087,\n", " 128854.3460343,\n", " 141463.08063773002,\n", " 154071.81524116002,\n", " 166680.54984459002,\n", " 179289.28444802001,\n", " 191898.01905145,\n", " 204506.75365488,\n", " 217115.48825831,\n", " 229724.22286174,\n", " 242332.95746517,\n", " 254941.6920686,\n", " 267550.42667203,\n", " 280159.16127546004,\n", " 292767.89587889,\n", " 305376.63048232003,\n", " 317985.36508575,\n", " 330594.09968918003,\n", " 343202.83429261,\n", " 355811.56889604003,\n", " 368420.30349947,\n", " 381029.0381029],\n", " 'counts': [17,\n", " 32,\n", " 42,\n", " 40,\n", " 26,\n", " 18,\n", " 15,\n", " 13,\n", " 8,\n", " 3,\n", " 5,\n", " 7,\n", " 0,\n", " 0,\n", " 1,\n", " 2,\n", " 0,\n", " 2,\n", " 0,\n", " 3,\n", " 1,\n", " 1,\n", " 2,\n", " 0,\n", " 1,\n", " 0,\n", " 2,\n", " 1,\n", " 0,\n", " 1]}" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "training_histograms = profiles[0].flat_summary()[\"hist\"]\n", "test_histograms = profiles[1].flat_summary()[\"hist\"]\n", "\n", "test_histograms[\"Overall_Views\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "While we plan to integrate convienient dataset shift visualization and analysis API soon, you are always able to access the attributes you need.\n", "\n", "We will first define a custom range and bins, then utilize our access to the data sketches' probability mass function. We then visualize these values using Seaborn." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "def get_custom_histogram_info(variable, n_bins):\n", " min_range = min(training_summary[training_summary[\"column\"]==variable][\"min\"].values[0],\n", " test_summary[test_summary[\"column\"]==variable][\"min\"].values[0])\n", " max_range = max(training_summary[training_summary[\"column\"]==variable][\"max\"].values[0],\n", " test_summary[test_summary[\"column\"]==variable][\"max\"].values[0])\n", " bins = range(int(min_range), int(max_range), int((max_range-min_range)/n_bins))\n", "\n", " training_counts = np.array(\n", " profiles[0].columns[variable].number_tracker.histogram.get_pmf(bins[:-1]))\n", " test_counts = np.array(\n", " profiles[1].columns[variable].number_tracker.histogram.get_pmf(bins[:-1]))\n", " \n", " return bins, training_counts, test_counts\n", "\n", "\n", "def plot_distribution_shift(variable, n_bins):\n", " \"\"\"Visualization for distribution shift\"\"\"\n", " bins, training_counts, test_counts = get_custom_histogram_info(variable, n_bins)\n", "\n", " fig, ax = plt.subplots(figsize=(10, 3))\n", " sns.histplot(x=bins, weights=training_counts, bins=n_bins, \n", " label=\"Training data\", color=\"teal\", alpha=0.7, ax=ax)\n", " sns.histplot(x=bins, weights=test_counts, bins=n_bins, \n", " label=\"Test data\", color=\"gold\", alpha=0.7, ax=ax)\n", " ax.legend()\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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pePvBHxtkSRJB7z9oWAqwt/+7d/yne98h9dff52ZM2fyiU98otYhVc0iTJIk7beuvvrqms189ZU35kuSJNWARZgkSVINWIRJkiTVgEWYJElSDViESZKkXmttbaWxsZHGxkYmTZrElClT2vdff/31Ho9ftmwZjz32WFXfa9q0abz88svdjvlSP768fKAU+nRkRMwFvgrUAbdn5vwO/acB3wfeXFDrvsz8n0XGJEnSgejUU2azdeuWfjvfYYdNZvlPV3XZP2HCBJ588kkAbrzxRkaPHs21115b9fmXLVvG6NGjOemkk/oaKlAqwq6//vp+OddAKawIi4g64BvAmUAzsCIiFmdmxzde/iQz/7CoOCRJGgq2bt3Cukdn99v5jjmj6wKsK6tWreKaa65hx44d1NfXc8cddzB58mRuu+02FixYwLBhwzjuuOOYP38+CxYsoK6ujjvvvJOvfe1rvOc972k/T2trKxdeeCEtLS3MmTNnr3dEnnvuuWzatIldu3bxqU99innz5nHdddexc+dOGhsbOf7447nrrrs6HTfYFDkTNgdYn5kbACLibuAcoO+vHZckSYNKZnLFFVfw/e9/n4kTJ3LPPfdwww03sGjRIubPn8/GjRsZMWIEr776KmPHjuXSSy/tcvbspptu4pRTTuHzn/88Dz74IAsXLmzvW7RoEePHj2fnzp28613v4kMf+hDz58/n61//evvMXFfjJkyYMBCpqFqRRdgUYFPFfjPwB52MOzEifgVsBq7NzLUFxiRJkgrwm9/8hjVr1nDmmWcCsHv3biZPngzAjBkz+MhHPsK5557Lueee2+O5li9fzn333QfA2Wefzbhx49r7brvtNu6//34ANm3axHPPPddpcVXtuFoqsgiLTto6vqjyl8DvZuaOiPgg8I/A9LecKGIeMA/gyCOP7OcwJUlSX2Umxx9/PI938vqkBx98kOXLl7N48WK+8IUvsHZtz/MtEW8tI5YtW8YjjzzC448/zqhRozjttNPYtWvXPo+rtSKfjmwGjqjYn0pptqtdZr6WmTvK20uA4RFR3/FEmbkwM5sys2nixIkFhixJkvbFiBEjaGlpaS/C3njjDdauXcuePXvYtGkTp59+Ol/5yld49dVX2bFjB2PGjGH79u2dnuvUU0/lrrvuAuChhx7ilVdeAWDbtm2MGzeOUaNGsW7dOn72s5+1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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_distribution_shift(\"Overall_Views\", n_bins=60)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "While it is quite clear that the distribution in this case differs between the training and test dataset, we will likely need a quantitative measure. You can also use whylogs histogram metrics to calculate dataset shift using a number of metrics: Population Stability Index (PSI), Kolmogorov-Smirnov statistic, Kullback-Lebler divergence (or other f-divergences), and histogram intersection.\n", "\n", "## Kullback-Lebler divergence\n", "\n", "This score, often shortened to K-L divergence, is measure of how one probability distribution is different from a second, reference probability distribution. The K-L divergence can be interpreted as the average difference of the number of bits required for encoding samples of one distribution (*P*) using a code optimized for another (*Q*) rather than one optimized for *P*. KL divergence is not a true statistical metric of spread as it is not symmetric and does not satisfy the triangle inequality.\n", "\n", "However, this value has become quite poplular and easy to calculate in Python. We'll use the implementation in `scikit-learn`." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "from sklearn.metrics import mutual_info_score\n", " \n", "def calculate_kl_divergence(variable, n_bins):\n", " _, training_counts, test_counts = get_custom_histogram_info(variable, n_bins)\n", " \n", " return mutual_info_score(training_counts, test_counts)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0302670122463595" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "calculate_kl_divergence(\"Overall_Views\", n_bins=60)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Histogram intersection metric\n", "\n", "Our second metric is the histogram intersection score, which is an intuitive metric that measures the area of overlap between the two probability distributions. A histogram intersection score of 0.0 represents no overlap while a score of 1.0 represents identical distributions. This score requires discretized probability distributions and depends heavily on the choice of bin size and scale used." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "def calculate_histogram_intersection(variable, n_bins):\n", " _, training_counts, test_counts = get_custom_histogram_info(variable, n_bins)\n", " \n", " result = 0\n", " for i in range(n_bins):\n", " result += min(training_counts[i], test_counts[i])\n", " return result" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.4224833808167141" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "calculate_histogram_intersection(\"Overall_Views\", n_bins=60)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.8290993985438428" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "calculate_histogram_intersection(\"Sales\", n_bins=60)" ] }, { "cell_type": "code", "execution_count": null, "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.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }