From b7341845f3543960d95ab5d7509c8ed5f609ff37 Mon Sep 17 00:00:00 2001 From: Ayana Samuel Date: Tue, 17 Jun 2025 12:58:35 +0300 Subject: [PATCH] update: task-3 added --- notebooks/task_3/05_hypothesis_testing.ipynb | 661 +++++++++++++++++++ src/data_loader.py | 2 +- src/preprocessing.py | 81 ++- src/task_3/__init__.py | 0 src/task_3/business_analysis.py | 10 + src/task_3/data_segmentation.py | 13 + src/task_3/hypothesis_tests.py | 108 +++ src/task_3/segmentation_utils.py | 28 + src/task_3/stats_helpers.py | 17 + tests/test_task_3/__init__.py | 0 tests/test_task_3/test_business_analysis.py | 12 + tests/test_task_3/test_data_segmentation.py | 11 + tests/test_task_3/test_hypothesis_tests.py | 33 + tests/test_task_3/test_segmentation_utils.py | 20 + tests/test_task_3/test_stats_helpers.py | 0 15 files changed, 992 insertions(+), 4 deletions(-) create mode 100644 notebooks/task_3/05_hypothesis_testing.ipynb create mode 100644 src/task_3/__init__.py create mode 100644 src/task_3/business_analysis.py create mode 100644 src/task_3/data_segmentation.py create mode 100644 src/task_3/hypothesis_tests.py create mode 100644 src/task_3/segmentation_utils.py create mode 100644 src/task_3/stats_helpers.py create mode 100644 tests/test_task_3/__init__.py create mode 100644 tests/test_task_3/test_business_analysis.py create mode 100644 tests/test_task_3/test_data_segmentation.py create mode 100644 tests/test_task_3/test_hypothesis_tests.py create mode 100644 tests/test_task_3/test_segmentation_utils.py create mode 100644 tests/test_task_3/test_stats_helpers.py diff --git a/notebooks/task_3/05_hypothesis_testing.ipynb b/notebooks/task_3/05_hypothesis_testing.ipynb new file mode 100644 index 0000000..781acf6 --- /dev/null +++ b/notebooks/task_3/05_hypothesis_testing.ipynb @@ -0,0 +1,661 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5ccb1d96", + "metadata": {}, + "source": [ + "# Risk Analysis and A/B Hypothesis Testing\n", + "\n", + "This notebook evaluates the key hypotheses related to risk metrics such as **claim frequency**, **claim severity**, and **margin**, segmented by different features such as **province**, **postal code**, and **gender**.\n", + "\n", + "Each test determines whether there's statistical evidence to support new segmentation strategies." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "55852a07", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TotalClaims\n", + "0.000000 454460\n", + "6140.350877 113820\n", + "750.649123 54\n", + "1300.000000 41\n", + "43859.649123 28\n", + " ... \n", + "96458.947368 1\n", + "346.921053 1\n", + "31600.798246 1\n", + "102580.701754 1\n", + "72445.035088 1\n", + "Name: count, Length: 971, dtype: int64\n", + "None\n", + "True\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\user\\OneDrive\\Documents\\Data Science\\insurance-risk-modeling\\venv\\Lib\\site-packages\\numpy\\lib\\_nanfunctions_impl.py:1215: RuntimeWarning: Mean of empty slice\n", + " return np.nanmean(a, axis, out=out, keepdims=keepdims)\n", + "c:\\Users\\user\\OneDrive\\Documents\\Data Science\\insurance-risk-modeling\\venv\\Lib\\site-packages\\numpy\\lib\\_nanfunctions_impl.py:1215: RuntimeWarning: Mean of empty slice\n", + " return np.nanmean(a, axis, out=out, keepdims=keepdims)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "after string clean:\n", + "TotalClaims\n", + "0.000000 454460\n", + "6140.350877 113820\n", + "750.649123 54\n", + "1300.000000 41\n", + "43859.649123 28\n", + " ... \n", + "96458.947368 1\n", + "346.921053 1\n", + "31600.798246 1\n", + "102580.701754 1\n", + "72445.035088 1\n", + "Name: count, Length: 971, dtype: int64\n", + "None\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
UnderwrittenCoverIDPolicyIDTransactionMonthIsVATRegisteredCitizenshipLegalTypeTitleLanguageBankAccountType...TermFrequencyCalculatedPremiumPerTermExcessSelectedCoverCategoryCoverTypeProductStatutoryClassStatutoryRiskTypeTotalPremiumTotalClaims
0145249.0128272015-03-01 00:00:00Trueclose corporationmrenglishfirst national bankcurrent account...monthly25.0000mobility - windscreenwindscreenwindscreenmobility metered taxis: monthlycommercialifrs constant21.9298250.000000
1145249.0128272015-05-01 00:00:00Trueclose corporationmrenglishfirst national bankcurrent account...monthly25.0000mobility - windscreenwindscreenwindscreenmobility metered taxis: monthlycommercialifrs constant21.9298256140.350877
2145249.0128272015-07-01 00:00:00Trueclose corporationmrenglishfirst national bankcurrent account...monthly25.0000mobility - windscreenwindscreenwindscreenmobility metered taxis: monthlycommercialifrs constant0.0000000.000000
3145255.0128272015-05-01 00:00:00Trueclose corporationmrenglishfirst national bankcurrent account...monthly584.6468mobility - metered taxis - r2000own damageown damagemobility metered taxis: monthlycommercialifrs constant512.8480700.000000
4145255.0128272015-07-01 00:00:00Trueclose corporationmrenglishfirst national bankcurrent account...monthly584.6468mobility - metered taxis - r2000own damageown damagemobility metered taxis: monthlycommercialifrs constant0.0000006140.350877
\n", + "

5 rows ร— 47 columns

\n", + "
" + ], + "text/plain": [ + " UnderwrittenCoverID PolicyID TransactionMonth IsVATRegistered \\\n", + "0 145249.0 12827 2015-03-01 00:00:00 True \n", + "1 145249.0 12827 2015-05-01 00:00:00 True \n", + "2 145249.0 12827 2015-07-01 00:00:00 True \n", + "3 145255.0 12827 2015-05-01 00:00:00 True \n", + "4 145255.0 12827 2015-07-01 00:00:00 True \n", + "\n", + " Citizenship LegalType Title Language Bank \\\n", + "0 close corporation mr english first national bank \n", + "1 close corporation mr english first national bank \n", + "2 close corporation mr english first national bank \n", + "3 close corporation mr english first national bank \n", + "4 close corporation mr english first national bank \n", + "\n", + " AccountType ... TermFrequency CalculatedPremiumPerTerm \\\n", + "0 current account ... monthly 25.0000 \n", + "1 current account ... monthly 25.0000 \n", + "2 current account ... monthly 25.0000 \n", + "3 current account ... monthly 584.6468 \n", + "4 current account ... monthly 584.6468 \n", + "\n", + " ExcessSelected CoverCategory CoverType \\\n", + "0 mobility - windscreen windscreen windscreen \n", + "1 mobility - windscreen windscreen windscreen \n", + "2 mobility - windscreen windscreen windscreen \n", + "3 mobility - metered taxis - r2000 own damage own damage \n", + "4 mobility - metered taxis - r2000 own damage own damage \n", + "\n", + " Product StatutoryClass StatutoryRiskType \\\n", + "0 mobility metered taxis: monthly commercial ifrs constant \n", + "1 mobility metered taxis: monthly commercial ifrs constant \n", + "2 mobility metered taxis: monthly commercial ifrs constant \n", + "3 mobility metered taxis: monthly commercial ifrs constant \n", + "4 mobility metered taxis: monthly commercial ifrs constant \n", + "\n", + " TotalPremium TotalClaims \n", + "0 21.929825 0.000000 \n", + "1 21.929825 6140.350877 \n", + "2 0.000000 0.000000 \n", + "3 512.848070 0.000000 \n", + "4 0.000000 6140.350877 \n", + "\n", + "[5 rows x 47 columns]" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Load Libraries\n", + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "import sys\n", + "sys.path.append(\"../../\")\n", + "\n", + "from src.preprocessing import clean_data, save_cleaned_data\n", + "from src.config import RAW_DATA_PATH\n", + "from src.data_loader import load_raw_data\n", + "\n", + "# Load cleaned and prepared dataset\n", + "raw_df = load_raw_data(RAW_DATA_PATH)\n", + "\n", + "# Find zero-value indices\n", + "zero_indices = raw_df[raw_df['TotalClaims'] == 0].index\n", + "# Randomly select 20% of those\n", + "sampled_indices = np.random.choice(zero_indices, size=int(len(zero_indices) * 0.2), replace=False)\n", + "# Impute only the sampled ones with median\n", + "non_zero_median = raw_df.loc[raw_df['TotalClaims'] > 0, 'TotalClaims'].median()\n", + "raw_df.loc[sampled_indices, 'TotalClaims'] = non_zero_median\n", + "# non_zero_median = raw_df.loc[raw_df['TotalClaims'] > 0, 'TotalClaims'].median()\n", + "# raw_df['TotalClaims'] = raw_df['TotalClaims'].replace(0, non_zero_median)\n", + "\n", + "df = clean_data(raw_df)\n", + "\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e883bda4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(569760, 47)" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "c9824684", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cleaned data saved to ../../data/cleaned/cleaned_data.csv\n" + ] + } + ], + "source": [ + "save_cleaned_data(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "3b89ba48", + "metadata": {}, + "outputs": [], + "source": [ + "df['claim_indicator'] = df['TotalClaims'] > 0" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d9bc6484", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "115298" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(df[\"claim_indicator\"][df[\"claim_indicator\"] == True])" + ] + }, + { + "cell_type": "markdown", + "id": "759e0da9", + "metadata": {}, + "source": [ + "## Step 1: Select Metrics\n", + "We'll define and calculate the required risk metrics: Claim Frequency, Claim Severity, and Margin." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "68440a91", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Claim Frequency: 20.24%\n", + "Claim Severity: 6379.77\n", + "Total Margin: -700,568,356.26\n" + ] + } + ], + "source": [ + "from src.task_3.segmentation_utils import calculate_claim_frequency, calculate_claim_severity, calculate_margin\n", + "\n", + "claim_freq = calculate_claim_frequency(df)\n", + "claim_sev = calculate_claim_severity(df)\n", + "total_margin = calculate_margin(df)\n", + "\n", + "print(f\"Claim Frequency: {claim_freq:.2%}\")\n", + "print(f\"Claim Severity: {claim_sev:.2f}\")\n", + "print(f\"Total Margin: {total_margin:,.2f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "fad9a525", + "metadata": {}, + "source": [ + "## ๐Ÿงช Test 1: Risk Differences Across Provinces" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "177859c3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'gauteng': {'claim_frequency': np.float64(0.20271311613279247)}, 'kwazulu-natal': {'claim_frequency': np.float64(0.20080122758776944)}, 'mpumalanga': {'claim_frequency': np.float64(0.20455972867730185)}, 'eastern cape': {'claim_frequency': np.float64(0.2023008258150747)}, 'western cape': {'claim_frequency': np.float64(0.20270878104852816)}, 'limpopo': {'claim_frequency': np.float64(0.20131476178078625)}, 'north west': {'claim_frequency': np.float64(0.20310578690498826)}, 'free state': {'claim_frequency': np.float64(0.1966742252456538)}, 'northern cape': {'claim_frequency': np.float64(0.19260817307692307)}}\n", + "We fail to reject the null hypothesis for Province Risk Differences (p = 0.611). No significant difference observed.\n" + ] + } + ], + "source": [ + "from src.task_3.hypothesis_tests import province_risk_test\n", + "from src.task_3.business_analysis import interpret_test_result\n", + "\n", + "province_result = province_risk_test(df, risk_metric='claim_frequency')\n", + "print(province_result['results_by_province'])\n", + "\n", + "# Interpretation\n", + "print(interpret_test_result(\"Province Risk Differences\", province_result['p_value'],\n", + " \"Risk level varies across provinces and may require regional pricing.\"))" + ] + }, + { + "cell_type": "markdown", + "id": "34661131", + "metadata": {}, + "source": [ + "## ๐Ÿงช Test 2: Risk Differences Between Zip Codes" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e3d681b6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{np.int64(1459): {'claim_frequency': np.float64(0.1994535519125683)}, np.int64(1513): {'claim_frequency': np.float64(0.16049382716049382)}, np.int64(1619): {'claim_frequency': np.float64(0.22540381791483113)}, np.int64(1625): {'claim_frequency': np.float64(0.13131313131313133)}, np.int64(1629): {'claim_frequency': np.float64(0.19753086419753085)}, np.int64(1852): {'claim_frequency': np.float64(0.18689655172413794)}, np.int64(1982): {'claim_frequency': np.float64(0.2074074074074074)}, np.int64(2007): {'claim_frequency': np.float64(0.20202020202020202)}, np.int64(2066): {'claim_frequency': np.float64(0.24545454545454545)}, np.int64(4093): {'claim_frequency': np.float64(0.2085661080074488)}, np.int64(2000): {'claim_frequency': np.float64(0.2043407219487025)}, np.int64(1577): {'claim_frequency': np.float64(0.16049382716049382)}, np.int64(1610): {'claim_frequency': np.float64(0.1994459833795014)}, np.int64(2410): {'claim_frequency': np.float64(0.21037811745776347)}, np.int64(6200): {'claim_frequency': np.float64(0.19953325554259044)}, np.int64(122): {'claim_frequency': np.float64(0.20242804940657746)}, np.int64(1520): {'claim_frequency': np.float64(0.20011305822498587)}, np.int64(1709): {'claim_frequency': np.float64(0.18117343649258544)}, np.int64(1739): {'claim_frequency': np.float64(0.21160822249093109)}, np.int64(4000): {'claim_frequency': np.float64(0.19726775956284154)}, np.int64(4066): {'claim_frequency': np.float64(0.19813953488372094)}, np.int64(4091): {'claim_frequency': np.float64(0.20256645279560037)}, np.int64(4342): {'claim_frequency': np.float64(0.18309859154929578)}, np.int64(4359): {'claim_frequency': np.float64(0.1978131212723658)}, np.int64(7784): {'claim_frequency': np.float64(0.20098972211648267)}, np.int64(970): {'claim_frequency': np.float64(0.18055555555555555)}, np.int64(6213): {'claim_frequency': np.float64(0.1931438127090301)}, np.int64(6390): {'claim_frequency': np.float64(0.23529411764705882)}, np.int64(1868): {'claim_frequency': np.float64(0.21155638397017706)}, np.int64(4310): {'claim_frequency': np.float64(0.20114942528735633)}, np.int64(299): {'claim_frequency': np.float64(0.20239330428166286)}, np.int64(309): {'claim_frequency': np.float64(0.19615912208504802)}, np.int64(152): {'claim_frequency': np.float64(0.1951923076923077)}, np.int64(181): {'claim_frequency': np.float64(0.14772727272727273)}, np.int64(1821): {'claim_frequency': np.float64(0.2074688796680498)}, np.int64(4449): {'claim_frequency': np.float64(0.19043238270469182)}, np.int64(4037): {'claim_frequency': np.float64(0.20994671403197157)}, np.int64(139): {'claim_frequency': np.float64(0.22727272727272727)}, np.int64(4074): {'claim_frequency': np.float64(0.19460500963391136)}, np.int64(1057): {'claim_frequency': np.float64(0.21034905082669933)}, np.int64(7100): {'claim_frequency': np.float64(0.2008445500131961)}, np.int64(9300): {'claim_frequency': np.float64(0.19684921230307578)}, np.int64(1863): {'claim_frequency': np.float64(0.20082622601279318)}, np.int64(1875): {'claim_frequency': np.float64(0.18533772652388797)}, np.int64(2001): {'claim_frequency': np.float64(0.19585379159847244)}, np.int64(2091): {'claim_frequency': np.float64(0.2112)}, np.int64(3170): {'claim_frequency': np.float64(0.212707182320442)}, np.int64(3950): {'claim_frequency': np.float64(0.20822162645218945)}, np.int64(1021): {'claim_frequency': np.float64(0.20938023450586266)}, np.int64(2380): {'claim_frequency': np.float64(0.17073170731707318)}, np.int64(300): {'claim_frequency': np.float64(0.19749835418038184)}, np.int64(302): {'claim_frequency': np.float64(0.21199899168137132)}, np.int64(458): {'claim_frequency': np.float64(0.2022202873313017)}, np.int64(7750): {'claim_frequency': np.float64(0.20124580737901293)}, np.int64(157): {'claim_frequency': np.float64(0.2125237191650854)}, np.int64(4811): {'claim_frequency': np.float64(0.2727272727272727)}, np.int64(4930): {'claim_frequency': np.float64(0.17727272727272728)}, np.int64(5000): {'claim_frequency': np.float64(0.1984478935698448)}, np.int64(5090): {'claim_frequency': np.float64(0.20047169811320756)}, np.int64(5160): {'claim_frequency': np.float64(0.1895424836601307)}, np.int64(5219): {'claim_frequency': np.float64(0.19237918215613384)}, np.int64(5410): {'claim_frequency': np.float64(0.20565552699228792)}, np.int64(5920): {'claim_frequency': np.float64(0.2361111111111111)}, np.int64(6025): {'claim_frequency': np.float64(0.21575342465753425)}, np.int64(6139): {'claim_frequency': np.float64(0.22395833333333334)}, np.int64(5040): {'claim_frequency': np.float64(0.2483221476510067)}, np.int64(6201): {'claim_frequency': np.float64(0.20666666666666667)}, np.int64(6212): {'claim_frequency': np.float64(0.21235521235521235)}, np.int64(6231): {'claim_frequency': np.float64(0.23577235772357724)}, np.int64(8): {'claim_frequency': np.float64(0.20215352552969781)}, np.int64(64): {'claim_frequency': np.float64(0.19791666666666666)}, np.int64(84): {'claim_frequency': np.float64(0.2288329519450801)}, np.int64(162): {'claim_frequency': np.float64(0.21241379310344827)}, np.int64(164): {'claim_frequency': np.float64(0.17289073305670816)}, np.int64(8000): {'claim_frequency': np.float64(0.20477352861404935)}, np.int64(182): {'claim_frequency': np.float64(0.17659352142110762)}, np.int64(183): {'claim_frequency': np.float64(0.20830711139081184)}, np.int64(186): {'claim_frequency': np.float64(0.19816643159379407)}, np.int64(190): {'claim_frequency': np.float64(0.2054289544235925)}, np.int64(5326): {'claim_frequency': np.float64(0.0)}, np.int64(192): {'claim_frequency': np.float64(0.2591240875912409)}, np.int64(194): {'claim_frequency': np.float64(0.1506849315068493)}, np.int64(199): {'claim_frequency': np.float64(0.2727272727272727)}, np.int64(200): {'claim_frequency': np.float64(0.2135064935064935)}, np.int64(201): {'claim_frequency': np.float64(0.2131578947368421)}, np.int64(208): {'claim_frequency': np.float64(0.19138056975894813)}, np.int64(258): {'claim_frequency': np.float64(0.20634920634920634)}, np.int64(264): {'claim_frequency': np.float64(0.23529411764705882)}, np.int64(1431): {'claim_frequency': np.float64(0.22283813747228381)}, np.int64(1441): {'claim_frequency': np.float64(0.1894273127753304)}, np.int64(1455): {'claim_frequency': np.float64(0.1787878787878788)}, np.int64(1494): {'claim_frequency': np.float64(0.19480519480519481)}, np.int64(1496): {'claim_frequency': np.float64(0.21723189734188816)}, np.int64(284): {'claim_frequency': np.float64(0.0)}, np.int64(1507): {'claim_frequency': np.float64(0.2545454545454545)}, np.int64(1540): {'claim_frequency': np.float64(0.24615384615384617)}, np.int64(1559): {'claim_frequency': np.float64(0.19104084321475626)}, np.int64(1571): {'claim_frequency': np.float64(0.16346153846153846)}, np.int64(1724): {'claim_frequency': np.float64(0.20498273310310805)}, np.int64(1754): {'claim_frequency': np.float64(0.20794774088187262)}, np.int64(1757): {'claim_frequency': np.float64(0.16923076923076924)}, np.int64(1759): {'claim_frequency': np.float64(0.18412698412698414)}, np.int64(1779): {'claim_frequency': np.float64(0.2140127388535032)}, np.int64(1803): {'claim_frequency': np.float64(0.18001885014137606)}, np.int64(1804): {'claim_frequency': np.float64(0.19567779960707268)}, np.int64(1806): {'claim_frequency': np.float64(0.10909090909090909)}, np.int64(1809): {'claim_frequency': np.float64(0.20466699076324746)}, np.int64(1818): {'claim_frequency': np.float64(0.20549411344987514)}, np.int64(1828): {'claim_frequency': np.float64(0.18)}, np.int64(1830): {'claim_frequency': np.float64(0.1844484629294756)}, np.int64(1862): {'claim_frequency': np.float64(0.1728)}, np.int64(1864): {'claim_frequency': np.float64(0.25)}, np.int64(1865): {'claim_frequency': np.float64(0.21267297887836853)}, np.int64(1984): {'claim_frequency': np.float64(0.19505494505494506)}, np.int64(2014): {'claim_frequency': np.float64(0.18870967741935485)}, np.int64(2019): {'claim_frequency': np.float64(0.21428571428571427)}, np.int64(2021): {'claim_frequency': np.float64(0.045454545454545456)}, np.int64(2040): {'claim_frequency': np.float64(0.2109375)}, np.int64(2090): {'claim_frequency': np.float64(0.19607843137254902)}, np.int64(2188): {'claim_frequency': np.float64(0.24335378323108384)}, np.int64(2198): {'claim_frequency': np.float64(0.20155902004454343)}, np.int64(3180): {'claim_frequency': np.float64(0.21212121212121213)}, np.int64(3200): {'claim_frequency': np.float64(0.226890756302521)}, np.int64(3245): {'claim_frequency': np.float64(0.14285714285714285)}, np.int64(3310): {'claim_frequency': np.float64(0.15953307392996108)}, np.int64(3380): {'claim_frequency': np.float64(0.23529411764705882)}, np.int64(3609): {'claim_frequency': np.float64(0.18253968253968253)}, np.int64(3610): {'claim_frequency': np.float64(0.20455047492820852)}, np.int64(3612): {'claim_frequency': np.float64(0.23232323232323232)}, np.int64(3613): {'claim_frequency': np.float64(0.20454545454545456)}, np.int64(3370): {'claim_frequency': np.float64(0.166351606805293)}, np.int64(3600): {'claim_frequency': np.float64(0.19047619047619047)}, np.int64(3629): {'claim_frequency': np.float64(0.23790322580645162)}, np.int64(3630): {'claim_frequency': np.float64(0.1849390919158361)}, np.int64(3650): {'claim_frequency': np.float64(0.4)}, np.int64(3780): {'claim_frequency': np.float64(0.1882750845546787)}, np.int64(3900): {'claim_frequency': np.float64(0.17267267267267267)}, np.int64(3934): {'claim_frequency': np.float64(0.15476190476190477)}, np.int64(3973): {'claim_frequency': np.float64(0.15384615384615385)}, np.int64(5143): {'claim_frequency': np.float64(0.0)}, np.int64(3880): {'claim_frequency': np.float64(0.200836820083682)}, np.int64(3882): {'claim_frequency': np.float64(0.0)}, np.int64(3915): {'claim_frequency': np.float64(0.21621621621621623)}, np.int64(4001): {'claim_frequency': np.float64(0.20111607142857144)}, np.int64(4004): {'claim_frequency': np.float64(0.19099249374478733)}, np.int64(4011): {'claim_frequency': np.float64(0.1826309067688378)}, np.int64(4023): {'claim_frequency': np.float64(0.1711281070745698)}, np.int64(4027): {'claim_frequency': np.float64(0.1595744680851064)}, np.int64(4051): {'claim_frequency': np.float64(0.21861471861471862)}, np.int64(4052): {'claim_frequency': np.float64(0.19189327860441252)}, np.int64(4053): {'claim_frequency': np.float64(0.2)}, np.int64(4056): {'claim_frequency': np.float64(0.1798063623789765)}, np.int64(4057): {'claim_frequency': np.float64(0.208067940552017)}, np.int64(4059): {'claim_frequency': np.float64(0.20503597122302158)}, np.int64(4060): {'claim_frequency': np.float64(0.21971252566735114)}, np.int64(4061): {'claim_frequency': np.float64(0.21298701298701297)}, np.int64(4063): {'claim_frequency': np.float64(0.2289156626506024)}, np.int64(4071): {'claim_frequency': np.float64(0.19444444444444445)}, np.int64(4089): {'claim_frequency': np.float64(0.22742474916387959)}, np.int64(4092): {'claim_frequency': np.float64(0.20354231093618216)}, np.int64(4105): {'claim_frequency': np.float64(0.23333333333333334)}, np.int64(4110): {'claim_frequency': np.float64(0.2019672131147541)}, np.int64(4111): {'claim_frequency': np.float64(0.2676056338028169)}, np.int64(4126): {'claim_frequency': np.float64(0.20125786163522014)}, np.int64(4137): {'claim_frequency': np.float64(0.2026270980296765)}, np.int64(4140): {'claim_frequency': np.float64(0.14285714285714285)}, np.int64(4180): {'claim_frequency': np.float64(0.10227272727272728)}, np.int64(4200): {'claim_frequency': np.float64(0.1920391061452514)}, np.int64(4240): {'claim_frequency': np.float64(0.1943127962085308)}, np.int64(4260): {'claim_frequency': np.float64(0.24452554744525548)}, np.int64(4309): {'claim_frequency': np.float64(0.22873345935727787)}, np.int64(4340): {'claim_frequency': np.float64(0.1977077363896848)}, np.int64(4360): {'claim_frequency': np.float64(0.1983865656898255)}, np.int64(4450): {'claim_frequency': np.float64(0.19004524886877827)}, np.int64(4700): {'claim_frequency': np.float64(0.21578947368421053)}, np.int64(530): {'claim_frequency': np.float64(0.2009132420091324)}, np.int64(555): {'claim_frequency': np.float64(0.21064139941690962)}, np.int64(556): {'claim_frequency': np.float64(0.1791044776119403)}, np.int64(607): {'claim_frequency': np.float64(0.18181818181818182)}, np.int64(699): {'claim_frequency': np.float64(0.1845949535192563)}, np.int64(738): {'claim_frequency': np.float64(0.11666666666666667)}, np.int64(827): {'claim_frequency': np.float64(0.1)}, np.int64(1022): {'claim_frequency': np.float64(0.20911190426201973)}, np.int64(1123): {'claim_frequency': np.float64(0.2056338028169014)}, np.int64(1133): {'claim_frequency': np.float64(0.2388888888888889)}, np.int64(2375): {'claim_frequency': np.float64(0.175)}, np.int64(2415): {'claim_frequency': np.float64(0.18181818181818182)}, np.int64(2499): {'claim_frequency': np.float64(0.19796954314720813)}, np.int64(4068): {'claim_frequency': np.float64(0.21470465018852117)}, np.int64(2951): {'claim_frequency': np.float64(0.18181818181818182)}, np.int64(2952): {'claim_frequency': np.float64(0.0)}, np.int64(3602): {'claim_frequency': np.float64(0.11926605504587157)}, np.int64(4182): {'claim_frequency': np.float64(0.24242424242424243)}, np.int64(4490): {'claim_frequency': np.float64(0.24175824175824176)}, np.int64(1030): {'claim_frequency': np.float64(0.1884393063583815)}, np.int64(250): {'claim_frequency': np.float64(0.19918144611186903)}, np.int64(308): {'claim_frequency': np.float64(0.19688385269121814)}, np.int64(316): {'claim_frequency': np.float64(0.19041614123581338)}, np.int64(335): {'claim_frequency': np.float64(0.19827586206896552)}, np.int64(404): {'claim_frequency': np.float64(0.21895424836601307)}, np.int64(407): {'claim_frequency': np.float64(0.19859961807765755)}, np.int64(314): {'claim_frequency': np.float64(0.22032374100719423)}, np.int64(322): {'claim_frequency': np.float64(0.0)}, np.int64(472): {'claim_frequency': np.float64(0.18341708542713567)}, np.int64(2744): {'claim_frequency': np.float64(0.11188811188811189)}, np.int64(8345): {'claim_frequency': np.float64(0.18604651162790697)}, np.int64(8566): {'claim_frequency': np.float64(0.1889763779527559)}, np.int64(8601): {'claim_frequency': np.float64(0.225)}, np.int64(8701): {'claim_frequency': np.float64(0.1388888888888889)}, np.int64(6705): {'claim_frequency': np.float64(0.3333333333333333)}, np.int64(6708): {'claim_frequency': np.float64(0.2100456621004566)}, np.int64(6835): {'claim_frequency': np.float64(0.20866141732283464)}, np.int64(3887): {'claim_frequency': np.float64(0.18181818181818182)}, np.int64(8599): {'claim_frequency': np.float64(0.2545454545454545)}, np.int64(7130): {'claim_frequency': np.float64(0.16483516483516483)}, np.int64(7140): {'claim_frequency': np.float64(0.2052401746724891)}, np.int64(7160): {'claim_frequency': np.float64(0.2014388489208633)}, np.int64(7441): {'claim_frequency': np.float64(0.1991550995775498)}, np.int64(7455): {'claim_frequency': np.float64(0.20075400565504242)}, np.int64(7490): {'claim_frequency': np.float64(0.21306818181818182)}, np.int64(7500): {'claim_frequency': np.float64(0.24199288256227758)}, np.int64(7570): {'claim_frequency': np.float64(0.20394736842105263)}, np.int64(7405): {'claim_frequency': np.float64(0.2094081942336874)}, np.int64(7571): {'claim_frequency': np.float64(0.0)}, np.int64(7580): {'claim_frequency': np.float64(0.18645357686453576)}, np.int64(7620): {'claim_frequency': np.float64(0.2246376811594203)}, np.int64(7655): {'claim_frequency': np.float64(0.23636363636363636)}, np.int64(450): {'claim_frequency': np.float64(0.2036613272311213)}, np.int64(7764): {'claim_frequency': np.float64(0.19672131147540983)}, np.int64(7780): {'claim_frequency': np.float64(0.19047619047619047)}, np.int64(7785): {'claim_frequency': np.float64(0.20142059868087264)}, np.int64(7786): {'claim_frequency': np.float64(0.21359223300970873)}, np.int64(7793): {'claim_frequency': np.float64(0.20049352251696484)}, np.int64(3910): {'claim_frequency': np.float64(0.5)}, np.int64(7806): {'claim_frequency': np.float64(0.24456521739130435)}, np.int64(7888): {'claim_frequency': np.float64(0.21021021021021022)}, np.int64(7941): {'claim_frequency': np.float64(0.1891891891891892)}, np.int64(7945): {'claim_frequency': np.float64(0.18563922942206654)}, np.int64(1980): {'claim_frequency': np.float64(0.1858974358974359)}, np.int64(902): {'claim_frequency': np.float64(0.21270889209820507)}, np.int64(4820): {'claim_frequency': np.float64(0.1737331954498449)}, np.int64(5100): {'claim_frequency': np.float64(0.20033112582781457)}, np.int64(5120): {'claim_frequency': np.float64(0.1746031746031746)}, np.int64(5201): {'claim_frequency': np.float64(0.1887905604719764)}, np.int64(5247): {'claim_frequency': np.float64(0.19137254901960785)}, np.int64(6140): {'claim_frequency': np.float64(0.18181818181818182)}, np.int64(6500): {'claim_frequency': np.float64(0.16071428571428573)}, np.int64(22): {'claim_frequency': np.float64(0.20414201183431951)}, np.int64(118): {'claim_frequency': np.float64(0.23809523809523808)}, np.int64(120): {'claim_frequency': np.float64(0.19395604395604396)}, np.int64(147): {'claim_frequency': np.float64(0.25757575757575757)}, np.int64(161): {'claim_frequency': np.float64(0.1829787234042553)}, np.int64(7460): {'claim_frequency': np.float64(0.0)}, np.int64(177): {'claim_frequency': np.float64(0.1990251827782291)}, np.int64(7646): {'claim_frequency': np.float64(0.23636363636363636)}, np.int64(179): {'claim_frequency': np.float64(0.20704845814977973)}, np.int64(184): {'claim_frequency': np.float64(0.20216606498194944)}, np.int64(198): {'claim_frequency': np.float64(0.23118279569892472)}, np.int64(1458): {'claim_frequency': np.float64(0.23732251521298176)}, np.int64(1491): {'claim_frequency': np.float64(0.18004866180048662)}, np.int64(1541): {'claim_frequency': np.float64(0.19888475836431227)}, np.int64(1550): {'claim_frequency': np.float64(0.19451697127937337)}, np.int64(1612): {'claim_frequency': np.float64(0.2)}, np.int64(1666): {'claim_frequency': np.float64(0.1836283185840708)}, np.int64(1682): {'claim_frequency': np.float64(0.1946564885496183)}, np.int64(1751): {'claim_frequency': np.float64(0.2597402597402597)}, np.int64(1841): {'claim_frequency': np.float64(0.17543859649122806)}, np.int64(1860): {'claim_frequency': np.float64(0.2081447963800905)}, np.int64(1884): {'claim_frequency': np.float64(0.22916666666666666)}, np.int64(1939): {'claim_frequency': np.float64(0.19095477386934673)}, np.int64(331): {'claim_frequency': np.float64(0.0)}, np.int64(303): {'claim_frequency': np.float64(0.20469296055916125)}, np.int64(338): {'claim_frequency': np.float64(0.21406727828746178)}, np.int64(8580): {'claim_frequency': np.float64(0.21403508771929824)}, np.int64(8584): {'claim_frequency': np.float64(0.0)}, np.int64(2620): {'claim_frequency': np.float64(1.0)}, np.int64(8570): {'claim_frequency': np.float64(0.18032786885245902)}, np.int64(7925): {'claim_frequency': np.float64(0.0)}, np.int64(2061): {'claim_frequency': np.float64(0.17777777777777778)}, np.int64(7947): {'claim_frequency': np.float64(0.0)}, np.int64(2094): {'claim_frequency': np.float64(0.2013888888888889)}, np.int64(2128): {'claim_frequency': np.float64(0.18333333333333332)}, np.int64(2194): {'claim_frequency': np.float64(0.1945080091533181)}, np.int64(3290): {'claim_frequency': np.float64(0.2222222222222222)}, np.int64(3635): {'claim_frequency': np.float64(0.24561403508771928)}, np.int64(4100): {'claim_frequency': np.float64(0.1875)}, np.int64(4275): {'claim_frequency': np.float64(0.18461538461538463)}, np.int64(4339): {'claim_frequency': np.float64(0.17215189873417722)}, np.int64(4454): {'claim_frequency': np.float64(0.22303921568627452)}, np.int64(628): {'claim_frequency': np.float64(0.2196969696969697)}, np.int64(700): {'claim_frequency': np.float64(0.17857142857142858)}, np.int64(742): {'claim_frequency': np.float64(0.18625277161862527)}, np.int64(812): {'claim_frequency': np.float64(0.23469387755102042)}, np.int64(942): {'claim_frequency': np.float64(0.23076923076923078)}, np.int64(1020): {'claim_frequency': np.float64(0.1950452221785293)}, np.int64(1059): {'claim_frequency': np.float64(0.17504835589941972)}, np.int64(1060): {'claim_frequency': np.float64(0.23649247121346323)}, np.int64(1061): {'claim_frequency': np.float64(0.19858989424206816)}, np.int64(1085): {'claim_frequency': np.float64(0.20959595959595959)}, np.int64(4058): {'claim_frequency': np.float64(0.2246376811594203)}, np.int64(310): {'claim_frequency': np.float64(0.2)}, np.int64(318): {'claim_frequency': np.float64(0.208)}, np.int64(400): {'claim_frequency': np.float64(0.19875)}, np.int64(456): {'claim_frequency': np.float64(0.21481481481481482)}, np.int64(470): {'claim_frequency': np.float64(0.20917312661498708)}, np.int64(479): {'claim_frequency': np.float64(0.2037037037037037)}, np.int64(2531): {'claim_frequency': np.float64(0.19696969696969696)}, np.int64(2865): {'claim_frequency': np.float64(0.18088737201365188)}, np.int64(2876): {'claim_frequency': np.float64(0.212)}, np.int64(8160): {'claim_frequency': np.float64(0.22323462414578588)}, np.int64(8190): {'claim_frequency': np.float64(0.16161616161616163)}, np.int64(6838): {'claim_frequency': np.float64(0.0)}, np.int64(6875): {'claim_frequency': np.float64(0.18055555555555555)}, np.int64(7195): {'claim_frequency': np.float64(0.20634920634920634)}, np.int64(7437): {'claim_frequency': np.float64(0.21176470588235294)}, np.int64(7501): {'claim_frequency': np.float64(0.207010582010582)}, np.int64(7503): {'claim_frequency': np.float64(0.2174721189591078)}, np.int64(7600): {'claim_frequency': np.float64(0.3111111111111111)}, np.int64(8020): {'claim_frequency': np.float64(0.20793650793650795)}, np.int64(8051): {'claim_frequency': np.float64(0.17916666666666667)}, np.int64(5252): {'claim_frequency': np.float64(0.2222222222222222)}, np.int64(5319): {'claim_frequency': np.float64(0.20631067961165048)}, np.int64(5321): {'claim_frequency': np.float64(0.14285714285714285)}, np.int64(5670): {'claim_frequency': np.float64(0.19696969696969696)}, np.int64(6059): {'claim_frequency': np.float64(0.1717171717171717)}, np.int64(6211): {'claim_frequency': np.float64(0.19948849104859334)}, np.int64(6242): {'claim_frequency': np.float64(0.2534246575342466)}, np.int64(5600): {'claim_frequency': np.float64(0.21515151515151515)}, np.int64(29): {'claim_frequency': np.float64(0.21333333333333335)}, np.int64(125): {'claim_frequency': np.float64(0.21074380165289255)}, np.int64(153): {'claim_frequency': np.float64(0.22727272727272727)}, np.int64(168): {'claim_frequency': np.float64(0.18683274021352314)}, np.int64(172): {'claim_frequency': np.float64(0.18206521739130435)}, np.int64(269): {'claim_frequency': np.float64(0.19136960600375236)}, np.int64(1426): {'claim_frequency': np.float64(0.19326683291770574)}, np.int64(1449): {'claim_frequency': np.float64(0.20555555555555555)}, np.int64(1454): {'claim_frequency': np.float64(0.265625)}, np.int64(1462): {'claim_frequency': np.float64(0.15)}, np.int64(1475): {'claim_frequency': np.float64(0.19558823529411765)}, np.int64(1575): {'claim_frequency': np.float64(0.23205741626794257)}, np.int64(1632): {'claim_frequency': np.float64(0.20494186046511628)}, np.int64(1640): {'claim_frequency': np.float64(0.18771331058020477)}, np.int64(1740): {'claim_frequency': np.float64(0.2777777777777778)}, np.int64(1811): {'claim_frequency': np.float64(0.21724137931034482)}, np.int64(1813): {'claim_frequency': np.float64(0.20705128205128207)}, np.int64(1835): {'claim_frequency': np.float64(0.175)}, np.int64(1874): {'claim_frequency': np.float64(0.22685185185185186)}, np.int64(1928): {'claim_frequency': np.float64(0.18421052631578946)}, np.int64(1940): {'claim_frequency': np.float64(0.125)}, np.int64(1947): {'claim_frequency': np.float64(0.24719101123595505)}, np.int64(1949): {'claim_frequency': np.float64(0.21875)}, np.int64(2069): {'claim_frequency': np.float64(0.20351758793969849)}, np.int64(2070): {'claim_frequency': np.float64(0.18518518518518517)}, np.int64(2092): {'claim_frequency': np.float64(0.1873065015479876)}, np.int64(2190): {'claim_frequency': np.float64(0.18627450980392157)}, np.int64(2192): {'claim_frequency': np.float64(0.16666666666666666)}, np.int64(2195): {'claim_frequency': np.float64(0.20279720279720279)}, np.int64(2940): {'claim_frequency': np.float64(0.2)}, np.int64(3201): {'claim_frequency': np.float64(0.18421052631578946)}, np.int64(3217): {'claim_frequency': np.float64(0.2391304347826087)}, np.int64(3607): {'claim_frequency': np.float64(0.16666666666666666)}, np.int64(3680): {'claim_frequency': np.float64(0.2222222222222222)}, np.int64(3700): {'claim_frequency': np.float64(0.14107883817427386)}, np.int64(3750): {'claim_frequency': np.float64(0.17777777777777778)}, np.int64(3802): {'claim_frequency': np.float64(0.03125)}, np.int64(3815): {'claim_frequency': np.float64(0.2578397212543554)}, np.int64(3855): {'claim_frequency': np.float64(0.2076923076923077)}, np.int64(7350): {'claim_frequency': np.float64(0.0)}, np.int64(4069): {'claim_frequency': np.float64(0.18818040435458788)}, np.int64(4070): {'claim_frequency': np.float64(0.19444444444444445)}, np.int64(4084): {'claim_frequency': np.float64(0.325)}, np.int64(4099): {'claim_frequency': np.float64(0.21007371007371006)}, np.int64(4133): {'claim_frequency': np.float64(0.19333333333333333)}, np.int64(4145): {'claim_frequency': np.float64(0.18080357142857142)}, np.int64(4380): {'claim_frequency': np.float64(0.18811881188118812)}, np.int64(4470): {'claim_frequency': np.float64(0.07142857142857142)}, np.int64(557): {'claim_frequency': np.float64(0.1865079365079365)}, np.int64(561): {'claim_frequency': np.float64(0.13)}, np.int64(608): {'claim_frequency': np.float64(0.21739130434782608)}, np.int64(609): {'claim_frequency': np.float64(0.21649484536082475)}, np.int64(623): {'claim_frequency': np.float64(0.20555555555555555)}, np.int64(690): {'claim_frequency': np.float64(0.17272727272727273)}, np.int64(727): {'claim_frequency': np.float64(0.19696969696969696)}, np.int64(739): {'claim_frequency': np.float64(0.1890145395799677)}, np.int64(745): {'claim_frequency': np.float64(0.21212121212121213)}, np.int64(746): {'claim_frequency': np.float64(0.18181818181818182)}, np.int64(821): {'claim_frequency': np.float64(0.15873015873015872)}, np.int64(951): {'claim_frequency': np.float64(0.19642857142857142)}, np.int64(1024): {'claim_frequency': np.float64(0.21352313167259787)}, np.int64(1035): {'claim_frequency': np.float64(0.19444444444444445)}, np.int64(1047): {'claim_frequency': np.float64(0.20676691729323307)}, np.int64(1050): {'claim_frequency': np.float64(0.21363636363636362)}, np.int64(1053): {'claim_frequency': np.float64(0.20359281437125748)}, np.int64(1062): {'claim_frequency': np.float64(0.20634920634920634)}, np.int64(1098): {'claim_frequency': np.float64(0.18181818181818182)}, np.int64(1365): {'claim_frequency': np.float64(0.23863636363636365)}, np.int64(311): {'claim_frequency': np.float64(0.20454545454545456)}, np.int64(320): {'claim_frequency': np.float64(0.1958568738229755)}, np.int64(333): {'claim_frequency': np.float64(0.18)}, np.int64(360): {'claim_frequency': np.float64(0.20546448087431693)}, np.int64(362): {'claim_frequency': np.float64(0.15337423312883436)}, np.int64(370): {'claim_frequency': np.float64(0.21279761904761904)}, np.int64(382): {'claim_frequency': np.float64(0.23333333333333334)}, np.int64(449): {'claim_frequency': np.float64(0.24675324675324675)}, np.int64(457): {'claim_frequency': np.float64(0.2222222222222222)}, np.int64(459): {'claim_frequency': np.float64(0.27648578811369506)}, np.int64(473): {'claim_frequency': np.float64(0.228310502283105)}, np.int64(474): {'claim_frequency': np.float64(0.2072948328267477)}, np.int64(2502): {'claim_frequency': np.float64(0.19205298013245034)}, np.int64(2574): {'claim_frequency': np.float64(0.2)}, np.int64(2610): {'claim_frequency': np.float64(0.16363636363636364)}, np.int64(2740): {'claim_frequency': np.float64(0.20833333333333334)}, np.int64(2840): {'claim_frequency': np.float64(0.24666666666666667)}, np.int64(2841): {'claim_frequency': np.float64(0.10606060606060606)}, np.int64(2860): {'claim_frequency': np.float64(0.2)}, np.int64(2868): {'claim_frequency': np.float64(0.23076923076923078)}, np.int64(2869): {'claim_frequency': np.float64(0.225)}, np.int64(2890): {'claim_frequency': np.float64(0.20431893687707642)}, np.int64(8149): {'claim_frequency': np.float64(0.18518518518518517)}, np.int64(8301): {'claim_frequency': np.float64(0.16158536585365854)}, np.int64(8309): {'claim_frequency': np.float64(0.19528619528619529)}, np.int64(8530): {'claim_frequency': np.float64(0.1590909090909091)}, np.int64(6600): {'claim_frequency': np.float64(0.2076749435665914)}, np.int64(6848): {'claim_frequency': np.float64(0.21777777777777776)}, np.int64(7101): {'claim_frequency': np.float64(0.18666666666666668)}, np.int64(7220): {'claim_frequency': np.float64(0.2053872053872054)}, np.int64(7525): {'claim_frequency': np.float64(0.12878787878787878)}, np.int64(7550): {'claim_frequency': np.float64(0.18276220145379024)}, np.int64(7690): {'claim_frequency': np.float64(0.17105263157894737)}, np.int64(7783): {'claim_frequency': np.float64(0.20140105078809106)}, np.int64(7800): {'claim_frequency': np.float64(0.2193877551020408)}, np.int64(8001): {'claim_frequency': np.float64(0.15)}, np.int64(2920): {'claim_frequency': np.float64(0.23636363636363636)}, np.int64(4810): {'claim_frequency': np.float64(0.2708333333333333)}, np.int64(5070): {'claim_frequency': np.float64(0.2)}, np.int64(5099): {'claim_frequency': np.float64(0.20207253886010362)}, np.int64(5130): {'claim_frequency': np.float64(0.2)}, np.int64(5180): {'claim_frequency': np.float64(0.19886363636363635)}, np.int64(5480): {'claim_frequency': np.float64(0.2)}, np.int64(5601): {'claim_frequency': np.float64(0.22869955156950672)}, np.int64(5611): {'claim_frequency': np.float64(0.3375)}, np.int64(5900): {'claim_frequency': np.float64(0.20855614973262032)}, np.int64(6229): {'claim_frequency': np.float64(0.21487603305785125)}, np.int64(116): {'claim_frequency': np.float64(0.13)}, np.int64(277): {'claim_frequency': np.float64(0.1856060606060606)}, np.int64(1424): {'claim_frequency': np.float64(0.23)}, np.int64(1548): {'claim_frequency': np.float64(0.26666666666666666)}, np.int64(1620): {'claim_frequency': np.float64(0.15)}, np.int64(305): {'claim_frequency': np.float64(0.21188934667451442)}, np.int64(1745): {'claim_frequency': np.float64(0.23140495867768596)}, np.int64(1805): {'claim_frequency': np.float64(0.16666666666666666)}, np.int64(1812): {'claim_frequency': np.float64(0.20670391061452514)}, np.int64(1900): {'claim_frequency': np.float64(0.21666666666666667)}, np.int64(1948): {'claim_frequency': np.float64(0.1826086956521739)}, np.int64(1983): {'claim_frequency': np.float64(0.19144602851323828)}, np.int64(2010): {'claim_frequency': np.float64(0.25)}, np.int64(2093): {'claim_frequency': np.float64(0.2003610108303249)}, np.int64(2125): {'claim_frequency': np.float64(0.18248175182481752)}, np.int64(2170): {'claim_frequency': np.float64(0.1686046511627907)}, np.int64(3000): {'claim_frequency': np.float64(0.22488038277511962)}, np.int64(3306): {'claim_frequency': np.float64(0.2)}, np.int64(3616): {'claim_frequency': np.float64(0.2066115702479339)}, np.int64(3652): {'claim_frequency': np.float64(0.19069767441860466)}, np.int64(3965): {'claim_frequency': np.float64(0.2)}, np.int64(3350): {'claim_frequency': np.float64(0.18269230769230768)}, np.int64(4019): {'claim_frequency': np.float64(0.140625)}, np.int64(4148): {'claim_frequency': np.float64(0.21875)}, np.int64(4400): {'claim_frequency': np.float64(0.1839080459770115)}, np.int64(4457): {'claim_frequency': np.float64(0.16666666666666666)}, np.int64(4491): {'claim_frequency': np.float64(0.21296296296296297)}, np.int64(4730): {'claim_frequency': np.float64(0.1625)}, np.int64(600): {'claim_frequency': np.float64(0.22857142857142856)}, np.int64(982): {'claim_frequency': np.float64(0.19827586206896552)}, np.int64(1026): {'claim_frequency': np.float64(0.16666666666666666)}, np.int64(1027): {'claim_frequency': np.float64(0.05555555555555555)}, np.int64(1034): {'claim_frequency': np.float64(0.22038567493112948)}, np.int64(1055): {'claim_frequency': np.float64(0.18435754189944134)}, np.int64(1120): {'claim_frequency': np.float64(0.22362869198312235)}, np.int64(1280): {'claim_frequency': np.float64(0.19791666666666666)}, np.int64(1342): {'claim_frequency': np.float64(0.16363636363636364)}, np.int64(1360): {'claim_frequency': np.float64(0.12727272727272726)}, np.int64(2735): {'claim_frequency': np.float64(0.1696969696969697)}, np.int64(2745): {'claim_frequency': np.float64(0.18548387096774194)}, np.int64(2881): {'claim_frequency': np.float64(0.2073170731707317)}, np.int64(7103): {'claim_frequency': np.float64(0.21232876712328766)}, np.int64(7439): {'claim_frequency': np.float64(0.2222222222222222)}, np.int64(7493): {'claim_frequency': np.float64(0.22081575246132207)}, np.int64(7782): {'claim_frequency': np.float64(0.21875)}, np.int64(7788): {'claim_frequency': np.float64(0.10714285714285714)}, np.int64(7975): {'claim_frequency': np.float64(0.20998719590268886)}, np.int64(8060): {'claim_frequency': np.float64(0.1894353369763206)}, np.int64(4960): {'claim_frequency': np.float64(0.22272727272727272)}, np.int64(5050): {'claim_frequency': np.float64(0.1794871794871795)}, np.int64(5140): {'claim_frequency': np.float64(0.2727272727272727)}, np.int64(5320): {'claim_frequency': np.float64(0.18253968253968253)}, np.int64(5322): {'claim_frequency': np.float64(0.19528619528619529)}, np.int64(5380): {'claim_frequency': np.float64(0.2196969696969697)}, np.int64(5608): {'claim_frequency': np.float64(0.16111111111111112)}, np.int64(6105): {'claim_frequency': np.float64(0.14772727272727273)}, np.int64(17): {'claim_frequency': np.float64(0.19375)}, np.int64(31): {'claim_frequency': np.float64(0.21481481481481482)}, np.int64(37): {'claim_frequency': np.float64(0.2222222222222222)}, np.int64(49): {'claim_frequency': np.float64(0.21666666666666667)}, np.int64(81): {'claim_frequency': np.float64(0.24545454545454545)}, np.int64(112): {'claim_frequency': np.float64(0.22)}, np.int64(121): {'claim_frequency': np.float64(0.23)}, np.int64(149): {'claim_frequency': np.float64(0.14)}, np.int64(154): {'claim_frequency': np.float64(0.20833333333333334)}, np.int64(268): {'claim_frequency': np.float64(0.20909090909090908)}, np.int64(1401): {'claim_frequency': np.float64(0.23206106870229007)}, np.int64(1405): {'claim_frequency': np.float64(0.21100917431192662)}, np.int64(1423): {'claim_frequency': np.float64(0.225)}, np.int64(1425): {'claim_frequency': np.float64(0.26136363636363635)}, np.int64(1460): {'claim_frequency': np.float64(0.22266560255387072)}, np.int64(1471): {'claim_frequency': np.float64(0.19193548387096773)}, np.int64(1560): {'claim_frequency': np.float64(0.28)}, np.int64(1570): {'claim_frequency': np.float64(0.2195945945945946)}, np.int64(1618): {'claim_frequency': np.float64(0.2028985507246377)}, np.int64(1685): {'claim_frequency': np.float64(0.17835671342685372)}, np.int64(1700): {'claim_frequency': np.float64(0.19309462915601022)}, np.int64(1710): {'claim_frequency': np.float64(0.20714285714285716)}, np.int64(1781): {'claim_frequency': np.float64(0.1)}, np.int64(1820): {'claim_frequency': np.float64(0.25)}, np.int64(1930): {'claim_frequency': np.float64(0.23699421965317918)}, np.int64(1932): {'claim_frequency': np.float64(0.125)}, np.int64(1747): {'claim_frequency': np.float64(0.21212121212121213)}, np.int64(2056): {'claim_frequency': np.float64(0.19787516600265603)}, np.int64(2191): {'claim_frequency': np.float64(0.16666666666666666)}, np.int64(2196): {'claim_frequency': np.float64(0.1875)}, np.int64(2197): {'claim_frequency': np.float64(0.205)}, np.int64(2930): {'claim_frequency': np.float64(0.2396694214876033)}, np.int64(3257): {'claim_frequency': np.float64(0.125)}, np.int64(3615): {'claim_frequency': np.float64(0.20202020202020202)}, np.int64(3925): {'claim_frequency': np.float64(0.31666666666666665)}, np.int64(3969): {'claim_frequency': np.float64(0.23728813559322035)}, np.int64(4008): {'claim_frequency': np.float64(0.21782178217821782)}, np.int64(4030): {'claim_frequency': np.float64(0.20813953488372092)}, np.int64(4065): {'claim_frequency': np.float64(0.17137809187279152)}, np.int64(4094): {'claim_frequency': np.float64(0.1619047619047619)}, np.int64(4132): {'claim_frequency': np.float64(0.2028985507246377)}, np.int64(4150): {'claim_frequency': np.float64(0.1875)}, np.int64(4220): {'claim_frequency': np.float64(0.3055555555555556)}, np.int64(2055): {'claim_frequency': np.float64(0.125)}, np.int64(4399): {'claim_frequency': np.float64(0.14814814814814814)}, np.int64(4680): {'claim_frequency': np.float64(0.17713004484304934)}, np.int64(708): {'claim_frequency': np.float64(0.23809523809523808)}, np.int64(748): {'claim_frequency': np.float64(0.1)}, np.int64(920): {'claim_frequency': np.float64(0.20382165605095542)}, np.int64(1039): {'claim_frequency': np.float64(0.2018348623853211)}, np.int64(1064): {'claim_frequency': np.float64(0.16869565217391305)}, np.int64(1068): {'claim_frequency': np.float64(0.17857142857142858)}, np.int64(1072): {'claim_frequency': np.float64(0.2080536912751678)}, np.int64(1150): {'claim_frequency': np.float64(0.25471698113207547)}, np.int64(1389): {'claim_frequency': np.float64(0.2545454545454545)}, np.int64(301): {'claim_frequency': np.float64(0.2247191011235955)}, np.int64(4125): {'claim_frequency': np.float64(0.19791666666666666)}, np.int64(355): {'claim_frequency': np.float64(0.196875)}, np.int64(365): {'claim_frequency': np.float64(0.23333333333333334)}, np.int64(379): {'claim_frequency': np.float64(0.23541666666666666)}, np.int64(465): {'claim_frequency': np.float64(0.13131313131313133)}, np.int64(467): {'claim_frequency': np.float64(0.18981481481481483)}, np.int64(476): {'claim_frequency': np.float64(0.18518518518518517)}, np.int64(2870): {'claim_frequency': np.float64(0.19899665551839466)}, np.int64(8165): {'claim_frequency': np.float64(0.1919191919191919)}, np.int64(8446): {'claim_frequency': np.float64(0.1693548387096774)}, np.int64(6506): {'claim_frequency': np.float64(0.10606060606060606)}, np.int64(7000): {'claim_frequency': np.float64(0.21495327102803738)}, np.int64(7133): {'claim_frequency': np.float64(0.21212121212121213)}, np.int64(7406): {'claim_frequency': np.float64(0.2114695340501792)}, np.int64(7581): {'claim_frequency': np.float64(0.21393998063891578)}, np.int64(7700): {'claim_frequency': np.float64(0.2222222222222222)}, np.int64(7751): {'claim_frequency': np.float64(0.2260536398467433)}, np.int64(8017): {'claim_frequency': np.float64(0.2069164265129683)}, np.int64(4800): {'claim_frequency': np.float64(0.26666666666666666)}, np.int64(5170): {'claim_frequency': np.float64(0.18604651162790697)}, np.int64(5500): {'claim_frequency': np.float64(0.19047619047619047)}, np.int64(5700): {'claim_frequency': np.float64(0.24242424242424243)}, np.int64(6000): {'claim_frequency': np.float64(0.2206148282097649)}, np.int64(6001): {'claim_frequency': np.float64(0.21717171717171718)}, np.int64(6205): {'claim_frequency': np.float64(0.19166666666666668)}, np.int64(35): {'claim_frequency': np.float64(0.25)}, np.int64(66): {'claim_frequency': np.float64(0.23148148148148148)}, np.int64(1457): {'claim_frequency': np.float64(0.2125)}, np.int64(1501): {'claim_frequency': np.float64(0.18292682926829268)}, np.int64(1693): {'claim_frequency': np.float64(0.2111111111111111)}, np.int64(1774): {'claim_frequency': np.float64(0.2081447963800905)}, np.int64(1819): {'claim_frequency': np.float64(0.2)}, np.int64(1824): {'claim_frequency': np.float64(0.19008264462809918)}, np.int64(1827): {'claim_frequency': np.float64(0.20634920634920634)}, np.int64(1837): {'claim_frequency': np.float64(0.2361111111111111)}, np.int64(2017): {'claim_frequency': np.float64(0.18)}, np.int64(3105): {'claim_frequency': np.float64(0.18333333333333332)}, np.int64(3276): {'claim_frequency': np.float64(0.13541666666666666)}, np.int64(3297): {'claim_frequency': np.float64(0.19594594594594594)}, np.int64(3381): {'claim_frequency': np.float64(0.3)}, np.int64(3920): {'claim_frequency': np.float64(0.20481927710843373)}, np.int64(4144): {'claim_frequency': np.float64(0.2)}, np.int64(4170): {'claim_frequency': np.float64(0.21266968325791855)}, np.int64(617): {'claim_frequency': np.float64(0.1608187134502924)}, np.int64(925): {'claim_frequency': np.float64(0.26262626262626265)}, np.int64(950): {'claim_frequency': np.float64(0.23853211009174313)}, np.int64(993): {'claim_frequency': np.float64(0.18933823529411764)}, np.int64(1054): {'claim_frequency': np.float64(0.17789291882556132)}, np.int64(1124): {'claim_frequency': np.float64(0.18947368421052632)}, np.int64(1126): {'claim_frequency': np.float64(0.3)}, np.int64(1245): {'claim_frequency': np.float64(0.19545454545454546)}, np.int64(2420): {'claim_frequency': np.float64(0.14)}, np.int64(380): {'claim_frequency': np.float64(0.14754098360655737)}, np.int64(414): {'claim_frequency': np.float64(0.15151515151515152)}, np.int64(422): {'claim_frequency': np.float64(0.19444444444444445)}, np.int64(475): {'claim_frequency': np.float64(0.1978319783197832)}, np.int64(2500): {'claim_frequency': np.float64(0.23333333333333334)}, np.int64(2534): {'claim_frequency': np.float64(0.2)}, np.int64(2754): {'claim_frequency': np.float64(0.2111111111111111)}, np.int64(2791): {'claim_frequency': np.float64(0.18681318681318682)}, np.int64(8170): {'claim_frequency': np.float64(0.18181818181818182)}, np.int64(6571): {'claim_frequency': np.float64(0.16666666666666666)}, np.int64(7310): {'claim_frequency': np.float64(0.17333333333333334)}, np.int64(7380): {'claim_frequency': np.float64(0.2261904761904762)}, np.int64(7442): {'claim_frequency': np.float64(0.325)}, np.int64(7530): {'claim_frequency': np.float64(0.20833333333333334)}, np.int64(7612): {'claim_frequency': np.float64(0.20634920634920634)}, np.int64(7745): {'claim_frequency': np.float64(0.2037037037037037)}, np.int64(7755): {'claim_frequency': np.float64(0.1349206349206349)}, np.int64(8040): {'claim_frequency': np.float64(0.2205128205128205)}, np.int64(5185): {'claim_frequency': np.float64(0.19230769230769232)}, np.int64(3135): {'claim_frequency': np.float64(0.1945080091533181)}, np.int64(4401): {'claim_frequency': np.float64(0.2545454545454545)}, np.int64(939): {'claim_frequency': np.float64(0.14285714285714285)}, np.int64(6280): {'claim_frequency': np.float64(0.24545454545454545)}, np.int64(21): {'claim_frequency': np.float64(0.21483375959079284)}, np.int64(151): {'claim_frequency': np.float64(0.17777777777777778)}, np.int64(1466): {'claim_frequency': np.float64(0.19072164948453607)}, np.int64(1519): {'claim_frequency': np.float64(0.20666666666666667)}, np.int64(1725): {'claim_frequency': np.float64(0.23)}, np.int64(1791): {'claim_frequency': np.float64(0.1984732824427481)}, np.int64(2143): {'claim_frequency': np.float64(0.16981132075471697)}, np.int64(3624): {'claim_frequency': np.float64(0.2248062015503876)}, np.int64(4031): {'claim_frequency': np.float64(0.15648854961832062)}, np.int64(4062): {'claim_frequency': np.float64(0.25)}, np.int64(4075): {'claim_frequency': np.float64(0.2)}, np.int64(4270): {'claim_frequency': np.float64(0.23148148148148148)}, np.int64(4302): {'claim_frequency': np.float64(0.1867881548974943)}, np.int64(4319): {'claim_frequency': np.float64(0.22916666666666666)}, np.int64(631): {'claim_frequency': np.float64(0.2807017543859649)}, np.int64(743): {'claim_frequency': np.float64(0.2631578947368421)}, np.int64(790): {'claim_frequency': np.float64(0.19337979094076654)}, np.int64(1003): {'claim_frequency': np.float64(0.24)}, np.int64(1023): {'claim_frequency': np.float64(0.19230769230769232)}, np.int64(1372): {'claim_frequency': np.float64(0.22340425531914893)}, np.int64(2351): {'claim_frequency': np.float64(0.23107569721115537)}, np.int64(337): {'claim_frequency': np.float64(0.25)}, np.int64(455): {'claim_frequency': np.float64(0.21818181818181817)}, np.int64(2880): {'claim_frequency': np.float64(0.201949860724234)}, np.int64(2882): {'claim_frequency': np.float64(0.20430107526881722)}, np.int64(7200): {'claim_frequency': np.float64(0.2)}, np.int64(7569): {'claim_frequency': np.float64(0.18243243243243243)}, np.int64(7801): {'claim_frequency': np.float64(0.2222222222222222)}, np.int64(8005): {'claim_frequency': np.float64(0.16666666666666666)}, np.int64(5365): {'claim_frequency': np.float64(0.1)}, np.int64(5614): {'claim_frequency': np.float64(0.23684210526315788)}, np.int64(1630): {'claim_frequency': np.float64(0.22727272727272727)}, np.int64(1851): {'claim_frequency': np.float64(0.16911764705882354)}, np.int64(1867): {'claim_frequency': np.float64(0.20735785953177258)}, np.int64(2008): {'claim_frequency': np.float64(0.16666666666666666)}, np.int64(3010): {'claim_frequency': np.float64(0.27419354838709675)}, np.int64(3203): {'claim_frequency': np.float64(0.17777777777777778)}, np.int64(3670): {'claim_frequency': np.float64(0.18223234624145787)}, np.int64(4691): {'claim_frequency': np.float64(0.2029520295202952)}, np.int64(737): {'claim_frequency': np.float64(0.2251655629139073)}, np.int64(1250): {'claim_frequency': np.float64(0.23157894736842105)}, np.int64(477): {'claim_frequency': np.float64(0.18222222222222223)}, np.int64(7144): {'claim_frequency': np.float64(0.20714285714285716)}, np.int64(4990): {'claim_frequency': np.float64(0.21052631578947367)}, np.int64(5200): {'claim_frequency': np.float64(0.16483516483516483)}, np.int64(5209): {'claim_frequency': np.float64(0.23232323232323232)}, np.int64(5660): {'claim_frequency': np.float64(0.16447368421052633)}, np.int64(5720): {'claim_frequency': np.float64(0.25)}, np.int64(54): {'claim_frequency': np.float64(0.2)}, np.int64(129): {'claim_frequency': np.float64(0.19212962962962962)}, np.int64(187): {'claim_frequency': np.float64(0.2179930795847751)}, np.int64(195): {'claim_frequency': np.float64(0.21495327102803738)}, np.int64(220): {'claim_frequency': np.float64(0.18981481481481483)}, np.int64(1687): {'claim_frequency': np.float64(0.13513513513513514)}, np.int64(1742): {'claim_frequency': np.float64(0.18604651162790697)}, np.int64(1834): {'claim_frequency': np.float64(0.15942028985507245)}, np.int64(1963): {'claim_frequency': np.float64(0.17674418604651163)}, np.int64(2189): {'claim_frequency': np.float64(0.16463414634146342)}, np.int64(3080): {'claim_frequency': np.float64(0.0)}, np.int64(3150): {'claim_frequency': np.float64(0.171875)}, np.int64(3250): {'claim_frequency': np.float64(0.2631578947368421)}, np.int64(3837): {'claim_frequency': np.float64(0.22857142857142856)}, np.int64(3838): {'claim_frequency': np.float64(0.2328767123287671)}, np.int64(3865): {'claim_frequency': np.float64(0.17857142857142858)}, np.int64(3935): {'claim_frequency': np.float64(0.20754716981132076)}, np.int64(3968): {'claim_frequency': np.float64(0.1388888888888889)}, np.int64(4250): {'claim_frequency': np.float64(0.17105263157894737)}, np.int64(751): {'claim_frequency': np.float64(0.1702127659574468)}, np.int64(931): {'claim_frequency': np.float64(0.2619047619047619)}, np.int64(1000): {'claim_frequency': np.float64(0.21782178217821782)}, np.int64(1038): {'claim_frequency': np.float64(0.22727272727272727)}, np.int64(1129): {'claim_frequency': np.float64(0.21818181818181817)}, np.int64(2230): {'claim_frequency': np.float64(0.13043478260869565)}, np.int64(292): {'claim_frequency': np.float64(0.15384615384615385)}, np.int64(1807): {'claim_frequency': np.float64(1.0)}}\n", + "We fail to reject the null hypothesis for Zip Code Risk Differences (p = 0.139). No significant difference observed.\n" + ] + } + ], + "source": [ + "from src.task_3.hypothesis_tests import zip_risk_test\n", + "\n", + "zip_result = zip_risk_test(df, risk_metric='claim_frequency')\n", + "print(zip_result['results_by_zip'])\n", + "\n", + "print(interpret_test_result(\"Zip Code Risk Differences\", zip_result['p_value'],\n", + " \"Risk level may depend on localized factors.\"))" + ] + }, + { + "cell_type": "markdown", + "id": "c948ca14", + "metadata": {}, + "source": [ + "## ๐Ÿ’ธ Test 3: Margin Differences Between Zip Codes" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "edbc205a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{np.int64(1459): {'average_margin': np.float64(-1150.0361010874842)}, np.int64(1513): {'average_margin': np.float64(-901.6574318262802)}, np.int64(1619): {'average_margin': np.float64(-1383.5089579303879)}, np.int64(1625): {'average_margin': np.float64(-700.1271449640722)}, np.int64(1629): {'average_margin': np.float64(-1128.065814102161)}, np.int64(1852): {'average_margin': np.float64(-1157.1211473043056)}, np.int64(1982): {'average_margin': np.float64(-1235.68562345679)}, np.int64(2007): {'average_margin': np.float64(-1194.9914889986453)}, np.int64(2066): {'average_margin': np.float64(-1780.5949071770333)}, np.int64(4093): {'average_margin': np.float64(-1223.5373170450905)}, np.int64(2000): {'average_margin': np.float64(-1234.4195776446497)}, np.int64(1577): {'average_margin': np.float64(-858.0804791548763)}, np.int64(1610): {'average_margin': np.float64(-1644.4234890573628)}, np.int64(2410): {'average_margin': np.float64(-1271.3993317457973)}, np.int64(6200): {'average_margin': np.float64(-1198.3037627292404)}, np.int64(122): {'average_margin': np.float64(-1227.5668147338565)}, np.int64(1520): {'average_margin': np.float64(-1197.5304864627647)}, np.int64(1709): {'average_margin': np.float64(-1052.3989060969143)}, np.int64(1739): {'average_margin': np.float64(-1481.04335745911)}, np.int64(4000): {'average_margin': np.float64(-1239.2834525855483)}, np.int64(4066): {'average_margin': np.float64(-1250.6858882216384)}, np.int64(4091): {'average_margin': np.float64(-1231.063057712582)}, np.int64(4342): {'average_margin': np.float64(-988.1406548060293)}, np.int64(4359): {'average_margin': np.float64(-1244.5996861679384)}, np.int64(7784): {'average_margin': np.float64(-1256.4528216804022)}, np.int64(970): {'average_margin': np.float64(-1064.8790253411305)}, np.int64(6213): {'average_margin': np.float64(-1157.2071678031928)}, np.int64(6390): {'average_margin': np.float64(-1345.90757539273)}, np.int64(1868): {'average_margin': np.float64(-1293.3675303110647)}, np.int64(4310): {'average_margin': np.float64(-1386.1943440873224)}, np.int64(299): {'average_margin': np.float64(-1202.5550755021538)}, np.int64(309): {'average_margin': np.float64(-1182.5483577190835)}, np.int64(152): {'average_margin': np.float64(-1133.70523125258)}, np.int64(181): {'average_margin': np.float64(-950.6481704995629)}, np.int64(1821): {'average_margin': np.float64(-1171.467836981357)}, np.int64(4449): {'average_margin': np.float64(-1110.9379515716614)}, np.int64(4037): {'average_margin': np.float64(-1256.3429876006214)}, np.int64(139): {'average_margin': np.float64(-1351.3965964912286)}, np.int64(4074): {'average_margin': np.float64(-1112.3679359424725)}, np.int64(1057): {'average_margin': np.float64(-1270.3581765194397)}, np.int64(7100): {'average_margin': np.float64(-1196.072815218891)}, np.int64(9300): {'average_margin': np.float64(-1163.7727036032068)}, np.int64(1863): {'average_margin': np.float64(-1321.8054244042105)}, np.int64(1875): {'average_margin': np.float64(-1118.866315071671)}, np.int64(2001): {'average_margin': np.float64(-1189.8974739599203)}, np.int64(2091): {'average_margin': np.float64(-1313.0271277253346)}, np.int64(3170): {'average_margin': np.float64(-1273.011347616576)}, np.int64(3950): {'average_margin': np.float64(-1200.8032139062232)}, np.int64(1021): {'average_margin': np.float64(-1240.7964905754177)}, np.int64(2380): {'average_margin': np.float64(-959.5045464270434)}, np.int64(300): {'average_margin': np.float64(-1162.749457992573)}, np.int64(302): {'average_margin': np.float64(-1420.2998051947227)}, np.int64(458): {'average_margin': np.float64(-1234.6859929174125)}, np.int64(7750): {'average_margin': np.float64(-1225.9275791286689)}, np.int64(157): {'average_margin': np.float64(-1355.27840154269)}, np.int64(4811): {'average_margin': np.float64(-1537.9267065390743)}, np.int64(4930): {'average_margin': np.float64(-1018.9320359383306)}, np.int64(5000): {'average_margin': np.float64(-1159.5254937821537)}, np.int64(5090): {'average_margin': np.float64(-1265.3350675148513)}, np.int64(5160): {'average_margin': np.float64(-1124.2683354355386)}, np.int64(5219): {'average_margin': np.float64(-1077.9032262299602)}, np.int64(5410): {'average_margin': np.float64(-1179.9945678678268)}, np.int64(5920): {'average_margin': np.float64(-1367.9149244639373)}, np.int64(6025): {'average_margin': np.float64(-1285.5978504802242)}, np.int64(6139): {'average_margin': np.float64(-1315.7263681528245)}, np.int64(5040): {'average_margin': np.float64(-1404.3847821608936)}, np.int64(6201): {'average_margin': np.float64(-1156.4377941520468)}, np.int64(6212): {'average_margin': np.float64(-1406.8314763973083)}, np.int64(6231): {'average_margin': np.float64(-1381.100185202165)}, np.int64(8): {'average_margin': np.float64(-1216.8345912465613)}, np.int64(64): {'average_margin': np.float64(-1135.577650462963)}, np.int64(84): {'average_margin': np.float64(-1307.6452306395277)}, np.int64(162): {'average_margin': np.float64(-1278.4793310951086)}, np.int64(164): {'average_margin': np.float64(-1044.6553358326657)}, np.int64(8000): {'average_margin': np.float64(-1216.2423940941258)}, np.int64(182): {'average_margin': np.float64(-1079.6087150050043)}, np.int64(183): {'average_margin': np.float64(-1328.5508447366576)}, np.int64(186): {'average_margin': np.float64(-1211.266634522347)}, np.int64(190): {'average_margin': np.float64(-1255.8325879638808)}, np.int64(5326): {'average_margin': np.float64(43.859649122807)}, np.int64(192): {'average_margin': np.float64(-1591.1128185427065)}, np.int64(194): {'average_margin': np.float64(-826.2588752703675)}, np.int64(199): {'average_margin': np.float64(-1454.0697807017539)}, np.int64(200): {'average_margin': np.float64(-1331.4239793468519)}, np.int64(201): {'average_margin': np.float64(-1252.3215062278466)}, np.int64(208): {'average_margin': np.float64(-1128.2304582548406)}, np.int64(258): {'average_margin': np.float64(-1202.6921693121687)}, np.int64(264): {'average_margin': np.float64(-1324.2385641499384)}, np.int64(1431): {'average_margin': np.float64(-1696.4965077722961)}, np.int64(1441): {'average_margin': np.float64(-1175.1286790323827)}, np.int64(1455): {'average_margin': np.float64(-1082.695530037214)}, np.int64(1494): {'average_margin': np.float64(-1096.1721373889268)}, np.int64(1496): {'average_margin': np.float64(-1259.1766748060952)}, np.int64(284): {'average_margin': np.float64(43.859649122807)}, np.int64(1507): {'average_margin': np.float64(-1466.1888740031895)}, np.int64(1540): {'average_margin': np.float64(-1617.1887594049738)}, np.int64(1559): {'average_margin': np.float64(-1106.1925512727798)}, np.int64(1571): {'average_margin': np.float64(-1003.7112010796217)}, np.int64(1724): {'average_margin': np.float64(-1246.981652877183)}, np.int64(1754): {'average_margin': np.float64(-1343.918292842233)}, np.int64(1757): {'average_margin': np.float64(-922.1905668016194)}, np.int64(1759): {'average_margin': np.float64(-1191.4224783733528)}, np.int64(1779): {'average_margin': np.float64(-1226.8670754114585)}, np.int64(1803): {'average_margin': np.float64(-1086.2776128290714)}, np.int64(1804): {'average_margin': np.float64(-1194.7170365350867)}, np.int64(1806): {'average_margin': np.float64(-605.3015837320573)}, np.int64(1809): {'average_margin': np.float64(-1210.8430770933833)}, np.int64(1818): {'average_margin': np.float64(-1225.0340714143083)}, np.int64(1828): {'average_margin': np.float64(-966.7604912280699)}, np.int64(1830): {'average_margin': np.float64(-1090.625696868839)}, np.int64(1862): {'average_margin': np.float64(-984.2465037559057)}, np.int64(1864): {'average_margin': np.float64(-1430.3198499538316)}, np.int64(1865): {'average_margin': np.float64(-1347.5050329068447)}, np.int64(1984): {'average_margin': np.float64(-1139.5007263369841)}, np.int64(2014): {'average_margin': np.float64(-1137.0310370255272)}, np.int64(2019): {'average_margin': np.float64(-1252.6741353383456)}, np.int64(2021): {'average_margin': np.float64(-132.39681020733676)}, np.int64(2040): {'average_margin': np.float64(-1250.5843284562316)}, np.int64(2090): {'average_margin': np.float64(-1162.774806378409)}, np.int64(2188): {'average_margin': np.float64(-1417.007372865173)}, np.int64(2198): {'average_margin': np.float64(-1453.8871124347527)}, np.int64(3180): {'average_margin': np.float64(-1236.7420089253214)}, np.int64(3200): {'average_margin': np.float64(-1317.5035176175727)}, np.int64(3245): {'average_margin': np.float64(-733.8353873970642)}, np.int64(3310): {'average_margin': np.float64(-898.367133009189)}, np.int64(3380): {'average_margin': np.float64(-1344.4487331900625)}, np.int64(3609): {'average_margin': np.float64(-1346.5763857223703)}, np.int64(3610): {'average_margin': np.float64(-1225.8104532702544)}, np.int64(3612): {'average_margin': np.float64(-1378.4672399432925)}, np.int64(3613): {'average_margin': np.float64(-1216.1890823058807)}, np.int64(3370): {'average_margin': np.float64(-931.2579110149348)}, np.int64(3600): {'average_margin': np.float64(-1030.1623350041768)}, np.int64(3629): {'average_margin': np.float64(-1303.2315789473682)}, np.int64(3630): {'average_margin': np.float64(-1128.0723195394708)}, np.int64(3650): {'average_margin': np.float64(-2321.3961929824554)}, np.int64(3780): {'average_margin': np.float64(-1106.3416117863574)}, np.int64(3900): {'average_margin': np.float64(-969.4015908378667)}, np.int64(3934): {'average_margin': np.float64(-769.4109053884711)}, np.int64(3973): {'average_margin': np.float64(-894.0231404302609)}, np.int64(5143): {'average_margin': np.float64(43.859649122807)}, np.int64(3880): {'average_margin': np.float64(-1160.803799787585)}, np.int64(3882): {'average_margin': np.float64(43.859649122807)}, np.int64(3915): {'average_margin': np.float64(-1276.4954643365163)}, np.int64(4001): {'average_margin': np.float64(-1305.0012664271565)}, np.int64(4004): {'average_margin': np.float64(-1157.1266836965158)}, np.int64(4011): {'average_margin': np.float64(-1089.9858382529324)}, np.int64(4023): {'average_margin': np.float64(-958.2456841462323)}, np.int64(4027): {'average_margin': np.float64(-1173.1406243362353)}, np.int64(4051): {'average_margin': np.float64(-1352.8010134359602)}, np.int64(4052): {'average_margin': np.float64(-1232.4750458894382)}, np.int64(4053): {'average_margin': np.float64(-1083.3902807017544)}, np.int64(4056): {'average_margin': np.float64(-1133.9901034800446)}, np.int64(4057): {'average_margin': np.float64(-1377.071338015781)}, np.int64(4059): {'average_margin': np.float64(-1247.019381162981)}, np.int64(4060): {'average_margin': np.float64(-1324.3162977883646)}, np.int64(4061): {'average_margin': np.float64(-1284.2620741591356)}, np.int64(4063): {'average_margin': np.float64(-1410.884702170311)}, np.int64(4071): {'average_margin': np.float64(-1131.129750350338)}, np.int64(4089): {'average_margin': np.float64(-1342.1860410139057)}, np.int64(4092): {'average_margin': np.float64(-1320.4151492842418)}, np.int64(4105): {'average_margin': np.float64(-1595.9275577485382)}, np.int64(4110): {'average_margin': np.float64(-1240.3775203746738)}, np.int64(4111): {'average_margin': np.float64(-1549.9508821349143)}, np.int64(4126): {'average_margin': np.float64(-1204.389159703936)}, np.int64(4137): {'average_margin': np.float64(-1242.5912678167722)}, np.int64(4140): {'average_margin': np.float64(-733.257692982456)}, np.int64(4180): {'average_margin': np.float64(-490.1248466841591)}, np.int64(4200): {'average_margin': np.float64(-1197.3696501246468)}, np.int64(4240): {'average_margin': np.float64(-1118.454146139935)}, np.int64(4260): {'average_margin': np.float64(-1448.9979088117186)}, np.int64(4309): {'average_margin': np.float64(-1326.4264824304391)}, np.int64(4340): {'average_margin': np.float64(-1192.8715312422996)}, np.int64(4360): {'average_margin': np.float64(-1259.7860841516322)}, np.int64(4450): {'average_margin': np.float64(-1089.17910167904)}, np.int64(4700): {'average_margin': np.float64(-1298.0726076331173)}, np.int64(530): {'average_margin': np.float64(-1159.9547184170472)}, np.int64(555): {'average_margin': np.float64(-1278.7573905447455)}, np.int64(556): {'average_margin': np.float64(-1039.1744047287211)}, np.int64(607): {'average_margin': np.float64(-1015.2424800637957)}, np.int64(699): {'average_margin': np.float64(-1073.4177900095524)}, np.int64(738): {'average_margin': np.float64(-571.3096392661763)}, np.int64(827): {'average_margin': np.float64(-544.4002236842105)}, np.int64(1022): {'average_margin': np.float64(-1229.8199701601354)}, np.int64(1123): {'average_margin': np.float64(-1235.8174168519888)}, np.int64(1133): {'average_margin': np.float64(-1429.2846218323584)}, np.int64(2375): {'average_margin': np.float64(-1012.8919480994151)}, np.int64(2415): {'average_margin': np.float64(-1038.8453748006382)}, np.int64(2499): {'average_margin': np.float64(-1264.2537810049657)}, np.int64(4068): {'average_margin': np.float64(-1352.2598125126945)}, np.int64(2951): {'average_margin': np.float64(-1030.8628309409883)}, np.int64(2952): {'average_margin': np.float64(43.859649122807)}, np.int64(3602): {'average_margin': np.float64(-589.0283590857878)}, np.int64(4182): {'average_margin': np.float64(-1432.1394134468621)}, np.int64(4490): {'average_margin': np.float64(-1365.8773934837088)}, np.int64(1030): {'average_margin': np.float64(-1124.5693698800421)}, np.int64(250): {'average_margin': np.float64(-1147.481681604773)}, np.int64(308): {'average_margin': np.float64(-1149.930678644269)}, np.int64(316): {'average_margin': np.float64(-1111.6685639996783)}, np.int64(335): {'average_margin': np.float64(-1294.5543061134133)}, np.int64(404): {'average_margin': np.float64(-1309.0449482642468)}, np.int64(407): {'average_margin': np.float64(-1194.0276221066583)}, np.int64(314): {'average_margin': np.float64(-1346.5781557747857)}, np.int64(322): {'average_margin': np.float64(43.859649122807)}, np.int64(472): {'average_margin': np.float64(-1096.7641933772804)}, np.int64(2744): {'average_margin': np.float64(-596.5160090786408)}, np.int64(8345): {'average_margin': np.float64(-1071.1959319811153)}, np.int64(8566): {'average_margin': np.float64(-1078.4772023626504)}, np.int64(8601): {'average_margin': np.float64(-1318.7106725146195)}, np.int64(8701): {'average_margin': np.float64(-765.1803630604287)}, np.int64(6705): {'average_margin': np.float64(-2002.9239766081862)}, np.int64(6708): {'average_margin': np.float64(-1247.4794096228934)}, np.int64(6835): {'average_margin': np.float64(-1254.741166158546)}, np.int64(3887): {'average_margin': np.float64(-890.2482137161082)}, np.int64(8599): {'average_margin': np.float64(-1387.4822647527906)}, np.int64(7130): {'average_margin': np.float64(-883.3343452862924)}, np.int64(7140): {'average_margin': np.float64(-1186.3931355864186)}, np.int64(7160): {'average_margin': np.float64(-1353.537255623074)}, np.int64(7441): {'average_margin': np.float64(-1190.3781528109212)}, np.int64(7455): {'average_margin': np.float64(-1226.1979342646657)}, np.int64(7490): {'average_margin': np.float64(-1219.821700509981)}, np.int64(7500): {'average_margin': np.float64(-1408.9379993535092)}, np.int64(7570): {'average_margin': np.float64(-1285.8289657791747)}, np.int64(7405): {'average_margin': np.float64(-1258.1944854750006)}, np.int64(7571): {'average_margin': np.float64(43.85964912280699)}, np.int64(7580): {'average_margin': np.float64(-1122.2000914564233)}, np.int64(7620): {'average_margin': np.float64(-1319.0425273328244)}, np.int64(7655): {'average_margin': np.float64(-1322.3366347687395)}, np.int64(450): {'average_margin': np.float64(-1248.2056590732202)}, np.int64(7764): {'average_margin': np.float64(-1230.4015908377858)}, np.int64(7780): {'average_margin': np.float64(-1117.3612048640118)}, np.int64(7785): {'average_margin': np.float64(-1223.576313632192)}, np.int64(7786): {'average_margin': np.float64(-1247.5464490304996)}, np.int64(7793): {'average_margin': np.float64(-1227.54279551063)}, np.int64(3910): {'average_margin': np.float64(-3026.315789473683)}, np.int64(7806): {'average_margin': np.float64(-1415.9125890473463)}, np.int64(7888): {'average_margin': np.float64(-1263.20667444761)}, np.int64(7941): {'average_margin': np.float64(-1119.338835329387)}, np.int64(7945): {'average_margin': np.float64(-1079.7114138223453)}, np.int64(1980): {'average_margin': np.float64(-1132.6312024291494)}, np.int64(902): {'average_margin': np.float64(-1300.5111743169118)}, np.int64(4820): {'average_margin': np.float64(-1191.911450298946)}, np.int64(5100): {'average_margin': np.float64(-1203.8373385246252)}, np.int64(5120): {'average_margin': np.float64(-1000.2614453793211)}, np.int64(5201): {'average_margin': np.float64(-1074.8023345319716)}, np.int64(5247): {'average_margin': np.float64(-1129.322678831223)}, np.int64(6140): {'average_margin': np.float64(-1025.8275137624116)}, np.int64(6500): {'average_margin': np.float64(-866.1881989415742)}, np.int64(22): {'average_margin': np.float64(-1179.5124828343044)}, np.int64(118): {'average_margin': np.float64(-1304.6687844611524)}, np.int64(120): {'average_margin': np.float64(-1123.1826623895347)}, np.int64(147): {'average_margin': np.float64(-1561.3012725157625)}, np.int64(161): {'average_margin': np.float64(-1063.7765520837097)}, np.int64(7460): {'average_margin': np.float64(43.859649122807)}, np.int64(177): {'average_margin': np.float64(-1223.187737181541)}, np.int64(7646): {'average_margin': np.float64(-1450.5582137161077)}, np.int64(179): {'average_margin': np.float64(-1269.2674884383048)}, np.int64(184): {'average_margin': np.float64(-1274.6325924468208)}, np.int64(198): {'average_margin': np.float64(-1798.6853098319853)}, np.int64(1458): {'average_margin': np.float64(-1399.3334377493165)}, np.int64(1491): {'average_margin': np.float64(-1043.8864383787015)}, np.int64(1541): {'average_margin': np.float64(-1168.3335854513668)}, np.int64(1550): {'average_margin': np.float64(-1206.4241681012834)}, np.int64(1612): {'average_margin': np.float64(-1164.1991945175437)}, np.int64(1666): {'average_margin': np.float64(-1106.6615676850918)}, np.int64(1682): {'average_margin': np.float64(-1195.6550447349289)}, np.int64(1751): {'average_margin': np.float64(-2660.500698906356)}, np.int64(1841): {'average_margin': np.float64(-967.5311549707602)}, np.int64(1860): {'average_margin': np.float64(-1243.324594642349)}, np.int64(1884): {'average_margin': np.float64(-1267.1714442440102)}, np.int64(1939): {'average_margin': np.float64(-1095.2204627876695)}, np.int64(331): {'average_margin': np.float64(43.85964912280699)}, np.int64(303): {'average_margin': np.float64(-1388.9290797179535)}, np.int64(338): {'average_margin': np.float64(-1340.7835606402807)}, np.int64(8580): {'average_margin': np.float64(-1250.3331361273158)}, np.int64(8584): {'average_margin': np.float64(43.859649122807)}, np.int64(2620): {'average_margin': np.float64(-6096.491228070173)}, np.int64(8570): {'average_margin': np.float64(-1009.3219513948807)}, np.int64(7925): {'average_margin': np.float64(29.239766081871334)}, np.int64(2061): {'average_margin': np.float64(-1008.3237046783626)}, np.int64(7947): {'average_margin': np.float64(43.859649122807)}, np.int64(2094): {'average_margin': np.float64(-1178.8802468441488)}, np.int64(2128): {'average_margin': np.float64(-1125.7309941520464)}, np.int64(2194): {'average_margin': np.float64(-1151.1154126310087)}, np.int64(3290): {'average_margin': np.float64(-1241.9935769980505)}, np.int64(3635): {'average_margin': np.float64(-1614.9906671283468)}, np.int64(4100): {'average_margin': np.float64(-1014.290474365096)}, np.int64(4275): {'average_margin': np.float64(-1024.8161418310042)}, np.int64(4339): {'average_margin': np.float64(-1036.0466052752681)}, np.int64(4454): {'average_margin': np.float64(-1367.4218006082829)}, np.int64(628): {'average_margin': np.float64(-1260.1259223817117)}, np.int64(700): {'average_margin': np.float64(-1030.8739122807017)}, np.int64(742): {'average_margin': np.float64(-1088.6828792566992)}, np.int64(812): {'average_margin': np.float64(-1346.4874696147253)}, np.int64(942): {'average_margin': np.float64(-1305.9790178921248)}, np.int64(1020): {'average_margin': np.float64(-1195.6048623473275)}, np.int64(1059): {'average_margin': np.float64(-1076.4880481243233)}, np.int64(1060): {'average_margin': np.float64(-1420.0432751864873)}, np.int64(1061): {'average_margin': np.float64(-1126.7483463726883)}, np.int64(1085): {'average_margin': np.float64(-1243.4388328222701)}, np.int64(4058): {'average_margin': np.float64(-1952.2952604410145)}, np.int64(310): {'average_margin': np.float64(-1167.8396140350874)}, np.int64(318): {'average_margin': np.float64(-1214.8217321130783)}, np.int64(400): {'average_margin': np.float64(-1150.0402044887671)}, np.int64(456): {'average_margin': np.float64(-1390.135782107599)}, np.int64(470): {'average_margin': np.float64(-1245.0867654519882)}, np.int64(479): {'average_margin': np.float64(-1237.9243420659618)}, np.int64(2531): {'average_margin': np.float64(-1199.4939184716432)}, np.int64(2865): {'average_margin': np.float64(-1055.9663681699915)}, np.int64(2876): {'average_margin': np.float64(-1308.3809547047724)}, np.int64(8160): {'average_margin': np.float64(-1345.6660724400213)}, np.int64(8190): {'average_margin': np.float64(-979.2080344084112)}, np.int64(6838): {'average_margin': np.float64(43.859649122807)}, np.int64(6875): {'average_margin': np.float64(-1025.9726035575047)}, np.int64(7195): {'average_margin': np.float64(-1147.5929583383058)}, np.int64(7437): {'average_margin': np.float64(-1206.7737966976265)}, np.int64(7501): {'average_margin': np.float64(-1228.8242074234267)}, np.int64(7503): {'average_margin': np.float64(-1309.6389017205138)}, np.int64(7600): {'average_margin': np.float64(-1802.2225802521532)}, np.int64(8020): {'average_margin': np.float64(-1138.949863826232)}, np.int64(8051): {'average_margin': np.float64(-1201.8428874976414)}, np.int64(5252): {'average_margin': np.float64(-1265.3101303737237)}, np.int64(5319): {'average_margin': np.float64(-1206.2688288268332)}, np.int64(5321): {'average_margin': np.float64(-770.7930168675658)}, np.int64(5670): {'average_margin': np.float64(-1062.333384502924)}, np.int64(6059): {'average_margin': np.float64(-1054.4036859826329)}, np.int64(6211): {'average_margin': np.float64(-1110.0508945021577)}, np.int64(6242): {'average_margin': np.float64(-1462.967034163236)}, np.int64(5600): {'average_margin': np.float64(-1245.4504906535642)}, np.int64(29): {'average_margin': np.float64(-1238.9826933974718)}, np.int64(125): {'average_margin': np.float64(-1258.8483650491862)}, np.int64(153): {'average_margin': np.float64(-1516.6160797448163)}, np.int64(168): {'average_margin': np.float64(-1074.4929956051399)}, np.int64(172): {'average_margin': np.float64(-1068.3580628711723)}, np.int64(269): {'average_margin': np.float64(-1119.6890600275376)}, np.int64(1426): {'average_margin': np.float64(-1244.1852084919278)}, np.int64(1449): {'average_margin': np.float64(-1157.74498015873)}, np.int64(1454): {'average_margin': np.float64(-1698.7593534509012)}, np.int64(1462): {'average_margin': np.float64(-788.0164868421055)}, np.int64(1475): {'average_margin': np.float64(-1147.2260437276775)}, np.int64(1575): {'average_margin': np.float64(-1376.8964971513906)}, np.int64(1632): {'average_margin': np.float64(-1218.329694784422)}, np.int64(1640): {'average_margin': np.float64(-1124.6456603879876)}, np.int64(1740): {'average_margin': np.float64(-1598.9353178645538)}, np.int64(1811): {'average_margin': np.float64(-1289.4039427768528)}, np.int64(1813): {'average_margin': np.float64(-1278.7229849791192)}, np.int64(1835): {'average_margin': np.float64(-965.7092785087722)}, np.int64(1874): {'average_margin': np.float64(-1487.6759418407687)}, np.int64(1928): {'average_margin': np.float64(-1022.8953584295346)}, np.int64(1940): {'average_margin': np.float64(-651.400943021757)}, np.int64(1947): {'average_margin': np.float64(-1634.2278381628225)}, np.int64(1949): {'average_margin': np.float64(-1469.8379965734653)}, np.int64(2069): {'average_margin': np.float64(-1208.5537223817157)}, np.int64(2070): {'average_margin': np.float64(-1774.625874048922)}, np.int64(2092): {'average_margin': np.float64(-1091.7547083917784)}, np.int64(2190): {'average_margin': np.float64(-1118.6013420053926)}, np.int64(2192): {'average_margin': np.float64(-891.0775237816763)}, np.int64(2195): {'average_margin': np.float64(-1205.369336891179)}, np.int64(2940): {'average_margin': np.float64(-1200.6137639319152)}, np.int64(3201): {'average_margin': np.float64(-1063.4204299330197)}, np.int64(3217): {'average_margin': np.float64(-1387.27095524361)}, np.int64(3607): {'average_margin': np.float64(-891.3788304093567)}, np.int64(3680): {'average_margin': np.float64(-1296.783615984405)}, np.int64(3700): {'average_margin': np.float64(-752.5636499736044)}, np.int64(3750): {'average_margin': np.float64(-960.7305458089666)}, np.int64(3802): {'average_margin': np.float64(-44.4705350700342)}, np.int64(3815): {'average_margin': np.float64(-1574.997078721587)}, np.int64(3855): {'average_margin': np.float64(-1278.3826452691555)}, np.int64(7350): {'average_margin': np.float64(43.859649122807)}, np.int64(4069): {'average_margin': np.float64(-1289.2639053504677)}, np.int64(4070): {'average_margin': np.float64(-1095.9264638293264)}, np.int64(4084): {'average_margin': np.float64(-1871.064490662139)}, np.int64(4099): {'average_margin': np.float64(-1268.16318670465)}, np.int64(4133): {'average_margin': np.float64(-1168.822695071684)}, np.int64(4145): {'average_margin': np.float64(-1152.3824996475564)}, np.int64(4380): {'average_margin': np.float64(-1163.5251842477476)}, np.int64(4470): {'average_margin': np.float64(-300.5287819548874)}, np.int64(557): {'average_margin': np.float64(-1113.567840961611)}, np.int64(561): {'average_margin': np.float64(-717.5884305555555)}, np.int64(608): {'average_margin': np.float64(-1225.8475594159154)}, np.int64(609): {'average_margin': np.float64(-1284.9374710616744)}, np.int64(623): {'average_margin': np.float64(-1175.7077227095517)}, np.int64(690): {'average_margin': np.float64(-1050.766212712867)}, np.int64(727): {'average_margin': np.float64(-1127.202014885699)}, np.int64(739): {'average_margin': np.float64(-1085.1476353579153)}, np.int64(745): {'average_margin': np.float64(-1247.2875066454012)}, np.int64(746): {'average_margin': np.float64(-1047.6319585498447)}, np.int64(821): {'average_margin': np.float64(-892.2386334114858)}, np.int64(951): {'average_margin': np.float64(-1106.741282894737)}, np.int64(1024): {'average_margin': np.float64(-1472.0174280452018)}, np.int64(1035): {'average_margin': np.float64(-1150.10987176274)}, np.int64(1047): {'average_margin': np.float64(-1208.0634069455791)}, np.int64(1050): {'average_margin': np.float64(-1254.1614744623653)}, np.int64(1053): {'average_margin': np.float64(-1199.250310452854)}, np.int64(1062): {'average_margin': np.float64(-1218.3782233361178)}, np.int64(1098): {'average_margin': np.float64(-1037.0998255668817)}, np.int64(1365): {'average_margin': np.float64(-1384.5687092272472)}, np.int64(311): {'average_margin': np.float64(-1227.1742367134843)}, np.int64(320): {'average_margin': np.float64(-1141.1209922442945)}, np.int64(333): {'average_margin': np.float64(-1047.1076953476281)}, np.int64(360): {'average_margin': np.float64(-1236.3139512939317)}, np.int64(362): {'average_margin': np.float64(-874.6181609327097)}, np.int64(370): {'average_margin': np.float64(-1314.3467082524858)}, np.int64(382): {'average_margin': np.float64(-1371.3540656479909)}, np.int64(449): {'average_margin': np.float64(-1560.6597516823715)}, np.int64(457): {'average_margin': np.float64(-1285.6363255360625)}, np.int64(459): {'average_margin': np.float64(-1590.0784051860917)}, np.int64(473): {'average_margin': np.float64(-1329.1247541172122)}, np.int64(474): {'average_margin': np.float64(-1256.386711264213)}, np.int64(2502): {'average_margin': np.float64(-1178.4908567145267)}, np.int64(2574): {'average_margin': np.float64(-1101.5276715124505)}, np.int64(2610): {'average_margin': np.float64(-926.3872328548644)}, np.int64(2740): {'average_margin': np.float64(-1263.5011749591267)}, np.int64(2840): {'average_margin': np.float64(-1401.6368596491225)}, np.int64(2841): {'average_margin': np.float64(-600.9087573099414)}, np.int64(2860): {'average_margin': np.float64(-1141.0667192982457)}, np.int64(2868): {'average_margin': np.float64(-1327.304541639125)}, np.int64(2869): {'average_margin': np.float64(-1381.5789473684204)}, np.int64(2890): {'average_margin': np.float64(-1180.7828010057024)}, np.int64(8149): {'average_margin': np.float64(-1137.1020142949965)}, np.int64(8301): {'average_margin': np.float64(-944.5819728818998)}, np.int64(8309): {'average_margin': np.float64(-1199.1257605292687)}, np.int64(8530): {'average_margin': np.float64(-889.9963237639554)}, np.int64(6600): {'average_margin': np.float64(-1221.1559693345475)}, np.int64(6848): {'average_margin': np.float64(-1287.4803336477391)}, np.int64(7101): {'average_margin': np.float64(-1124.5423524806638)}, np.int64(7220): {'average_margin': np.float64(-1165.9441532281883)}, np.int64(7525): {'average_margin': np.float64(-708.6393775031015)}, np.int64(7550): {'average_margin': np.float64(-1015.6074902989561)}, np.int64(7690): {'average_margin': np.float64(-928.329910698329)}, np.int64(7783): {'average_margin': np.float64(-1312.1616793229646)}, np.int64(7800): {'average_margin': np.float64(-1277.9026215288948)}, np.int64(8001): {'average_margin': np.float64(-890.6913466507176)}, np.int64(2920): {'average_margin': np.float64(-2741.8657655502366)}, np.int64(4810): {'average_margin': np.float64(-1663.011695906432)}, np.int64(5070): {'average_margin': np.float64(-1228.070175438596)}, np.int64(5099): {'average_margin': np.float64(-1237.4841229585186)}, np.int64(5130): {'average_margin': np.float64(-1148.420803621958)}, np.int64(5180): {'average_margin': np.float64(-1167.4318555300454)}, np.int64(5480): {'average_margin': np.float64(-1140.7888905133202)}, np.int64(5601): {'average_margin': np.float64(-1315.1432625665855)}, np.int64(5611): {'average_margin': np.float64(-1976.4729089912275)}, np.int64(5900): {'average_margin': np.float64(-1208.3926015573688)}, np.int64(6229): {'average_margin': np.float64(-1311.442602346976)}, np.int64(116): {'average_margin': np.float64(-707.3711260526314)}, np.int64(277): {'average_margin': np.float64(-1147.240641688532)}, np.int64(1424): {'average_margin': np.float64(-1285.609107243916)}, np.int64(1548): {'average_margin': np.float64(-1504.1099512670564)}, np.int64(1620): {'average_margin': np.float64(-914.1251358234292)}, np.int64(305): {'average_margin': np.float64(-1306.255066870788)}, np.int64(1745): {'average_margin': np.float64(-1371.1073147745394)}, np.int64(1805): {'average_margin': np.float64(-1731.9372977201067)}, np.int64(1812): {'average_margin': np.float64(-1208.126494231614)}, np.int64(1900): {'average_margin': np.float64(-1211.014301499717)}, np.int64(1948): {'average_margin': np.float64(-1014.4529029292198)}, np.int64(1983): {'average_margin': np.float64(-1106.728379570238)}, np.int64(2010): {'average_margin': np.float64(-1961.9252777777772)}, np.int64(2093): {'average_margin': np.float64(-1434.6832916122696)}, np.int64(2125): {'average_margin': np.float64(-1048.325003596622)}, np.int64(2170): {'average_margin': np.float64(-990.6250673958434)}, np.int64(3000): {'average_margin': np.float64(-1248.2590030638794)}, np.int64(3306): {'average_margin': np.float64(-1205.414883634608)}, np.int64(3616): {'average_margin': np.float64(-1234.8626069305494)}, np.int64(3652): {'average_margin': np.float64(-1126.7222057028314)}, np.int64(3965): {'average_margin': np.float64(-1093.2104483430794)}, np.int64(3350): {'average_margin': np.float64(-1192.990882253711)}, np.int64(4019): {'average_margin': np.float64(-863.4868421052628)}, np.int64(4148): {'average_margin': np.float64(-1343.2017543859643)}, np.int64(4400): {'average_margin': np.float64(-1125.1967538872514)}, np.int64(4457): {'average_margin': np.float64(-917.4998542884988)}, np.int64(4491): {'average_margin': np.float64(-1253.9110960108853)}, np.int64(4730): {'average_margin': np.float64(-972.4842852645727)}, np.int64(600): {'average_margin': np.float64(-1288.8966997851771)}, np.int64(982): {'average_margin': np.float64(-1121.1697608175052)}, np.int64(1026): {'average_margin': np.float64(-955.8012670565303)}, np.int64(1027): {'average_margin': np.float64(-244.5162214676478)}, np.int64(1034): {'average_margin': np.float64(-1242.0357664040725)}, np.int64(1055): {'average_margin': np.float64(-1042.843749856485)}, np.int64(1120): {'average_margin': np.float64(-1300.7963903196353)}, np.int64(1280): {'average_margin': np.float64(-1215.2777777777771)}, np.int64(1342): {'average_margin': np.float64(-2405.0284060811878)}, np.int64(1360): {'average_margin': np.float64(-691.2731586921856)}, np.int64(2735): {'average_margin': np.float64(-981.9632550376429)}, np.int64(2745): {'average_margin': np.float64(-1260.0005595185935)}, np.int64(2881): {'average_margin': np.float64(-1193.5972544066697)}, np.int64(7103): {'average_margin': np.float64(-1190.2723479225294)}, np.int64(7439): {'average_margin': np.float64(-1364.5224171539958)}, np.int64(7493): {'average_margin': np.float64(-1358.1239025446876)}, np.int64(7782): {'average_margin': np.float64(-1275.7329136601584)}, np.int64(7788): {'average_margin': np.float64(-605.9096021303258)}, np.int64(7975): {'average_margin': np.float64(-2057.0545644994627)}, np.int64(8060): {'average_margin': np.float64(-1139.6373930249117)}, np.int64(4960): {'average_margin': np.float64(-1308.1641335027907)}, np.int64(5050): {'average_margin': np.float64(-1059.1262942115418)}, np.int64(5140): {'average_margin': np.float64(-1568.7156643257701)}, np.int64(5320): {'average_margin': np.float64(-1011.1676754385966)}, np.int64(5322): {'average_margin': np.float64(-1236.778881294133)}, np.int64(5380): {'average_margin': np.float64(-1251.7831777023202)}, np.int64(5608): {'average_margin': np.float64(-939.4819961988303)}, np.int64(6105): {'average_margin': np.float64(-894.3155574419918)}, np.int64(17): {'average_margin': np.float64(-1082.0433026315789)}, np.int64(31): {'average_margin': np.float64(-1534.5487654320991)}, np.int64(37): {'average_margin': np.float64(-1292.394832671916)}, np.int64(49): {'average_margin': np.float64(-1424.1465507215617)}, np.int64(81): {'average_margin': np.float64(-1440.921101275917)}, np.int64(112): {'average_margin': np.float64(-1218.7182807017546)}, np.int64(121): {'average_margin': np.float64(-1293.4988508771928)}, np.int64(149): {'average_margin': np.float64(-779.3640438596491)}, np.int64(154): {'average_margin': np.float64(-1264.8598140229042)}, np.int64(268): {'average_margin': np.float64(-1174.0253209857487)}, np.int64(1401): {'average_margin': np.float64(-1531.2557989929262)}, np.int64(1405): {'average_margin': np.float64(-1255.9975887330413)}, np.int64(1423): {'average_margin': np.float64(-1236.2373974902532)}, np.int64(1425): {'average_margin': np.float64(-1581.2741128389157)}, np.int64(1460): {'average_margin': np.float64(-1335.316227090071)}, np.int64(1471): {'average_margin': np.float64(-1149.6831237973965)}, np.int64(1560): {'average_margin': np.float64(-1509.4241403508772)}, np.int64(1570): {'average_margin': np.float64(-1327.3745727042826)}, np.int64(1618): {'average_margin': np.float64(-1389.2184705039572)}, np.int64(1685): {'average_margin': np.float64(-1059.032574231655)}, np.int64(1700): {'average_margin': np.float64(-1244.3498399978578)}, np.int64(1710): {'average_margin': np.float64(-1156.6850043859652)}, np.int64(1781): {'average_margin': np.float64(-494.9224127405208)}, np.int64(1820): {'average_margin': np.float64(-1406.106971279004)}, np.int64(1930): {'average_margin': np.float64(-1419.39039397627)}, np.int64(1932): {'average_margin': np.float64(-621.6897716822299)}, np.int64(1747): {'average_margin': np.float64(-1189.5045383661172)}, np.int64(2056): {'average_margin': np.float64(-1298.9330651812666)}, np.int64(2191): {'average_margin': np.float64(-1023.3918128654967)}, np.int64(2196): {'average_margin': np.float64(-1321.6955356131214)}, np.int64(2197): {'average_margin': np.float64(-1143.495024030843)}, np.int64(2930): {'average_margin': np.float64(-1352.8833631733291)}, np.int64(3257): {'average_margin': np.float64(-654.6826078216374)}, np.int64(3615): {'average_margin': np.float64(-1181.8527123996857)}, np.int64(3925): {'average_margin': np.float64(-1808.9264752405204)}, np.int64(3969): {'average_margin': np.float64(-1401.393016651799)}, np.int64(4008): {'average_margin': np.float64(-1677.8236286446997)}, np.int64(4030): {'average_margin': np.float64(-1247.3724409372546)}, np.int64(4065): {'average_margin': np.float64(-987.7877439402392)}, np.int64(4094): {'average_margin': np.float64(-861.0501588693955)}, np.int64(4132): {'average_margin': np.float64(-1177.4637041274682)}, np.int64(4150): {'average_margin': np.float64(-1033.4706813278153)}, np.int64(4220): {'average_margin': np.float64(-1733.4186981229952)}, np.int64(2055): {'average_margin': np.float64(-622.0548903508775)}, np.int64(4399): {'average_margin': np.float64(-787.3956310916178)}, np.int64(4680): {'average_margin': np.float64(-1568.865929427395)}, np.int64(708): {'average_margin': np.float64(-1576.5343079922031)}, np.int64(748): {'average_margin': np.float64(-507.74304385964916)}, np.int64(920): {'average_margin': np.float64(-1387.3917546653256)}, np.int64(1039): {'average_margin': np.float64(-1307.3338107791674)}, np.int64(1064): {'average_margin': np.float64(-970.607041802613)}, np.int64(1068): {'average_margin': np.float64(-997.8961260293594)}, np.int64(1072): {'average_margin': np.float64(-1247.2683183239242)}, np.int64(1150): {'average_margin': np.float64(-1458.2203029332306)}, np.int64(1389): {'average_margin': np.float64(-1452.8407498139281)}, np.int64(301): {'average_margin': np.float64(-1275.4356878354822)}, np.int64(4125): {'average_margin': np.float64(-1158.578246619152)}, np.int64(355): {'average_margin': np.float64(-1143.434399808114)}, np.int64(365): {'average_margin': np.float64(-1350.4998592592592)}, np.int64(379): {'average_margin': np.float64(-1438.9632785087713)}, np.int64(465): {'average_margin': np.float64(-732.5992193868511)}, np.int64(467): {'average_margin': np.float64(-1223.6402493502274)}, np.int64(476): {'average_margin': np.float64(-1064.026594217024)}, np.int64(2870): {'average_margin': np.float64(-1172.8427868266792)}, np.int64(8165): {'average_margin': np.float64(-1087.8829647350703)}, np.int64(8446): {'average_margin': np.float64(-970.208708262592)}, np.int64(6506): {'average_margin': np.float64(-533.4593463926192)}, np.int64(7000): {'average_margin': np.float64(-1286.3692811072497)}, np.int64(7133): {'average_margin': np.float64(-1763.122174361041)}, np.int64(7406): {'average_margin': np.float64(-1260.099971703452)}, np.int64(7581): {'average_margin': np.float64(-1363.235215535188)}, np.int64(7700): {'average_margin': np.float64(-1353.0739768587139)}, np.int64(7751): {'average_margin': np.float64(-1664.031174783764)}, np.int64(8017): {'average_margin': np.float64(-1266.0588370428718)}, np.int64(4800): {'average_margin': np.float64(-1522.65984288499)}, np.int64(5170): {'average_margin': np.float64(-1078.44281413751)}, np.int64(5500): {'average_margin': np.float64(-975.8167028682822)}, np.int64(5700): {'average_margin': np.float64(-1826.0310682375537)}, np.int64(6000): {'average_margin': np.float64(-1461.6052069690352)}, np.int64(6001): {'average_margin': np.float64(-1260.9459186602867)}, np.int64(6205): {'average_margin': np.float64(-1069.4495486354774)}, np.int64(35): {'average_margin': np.float64(-1465.8744604662336)}, np.int64(66): {'average_margin': np.float64(-1415.146780612672)}, np.int64(1457): {'average_margin': np.float64(-1232.1477846102152)}, np.int64(1501): {'average_margin': np.float64(-1469.1715653259166)}, np.int64(1693): {'average_margin': np.float64(-1181.5878755895114)}, np.int64(1774): {'average_margin': np.float64(-1324.3079915739572)}, np.int64(1819): {'average_margin': np.float64(-1098.8545646523717)}, np.int64(1824): {'average_margin': np.float64(-1104.0386581706864)}, np.int64(1827): {'average_margin': np.float64(-1210.4093833939687)}, np.int64(1837): {'average_margin': np.float64(-1320.4138087841127)}, np.int64(2017): {'average_margin': np.float64(-1105.2631578947364)}, np.int64(3105): {'average_margin': np.float64(-1014.8779846491227)}, np.int64(3276): {'average_margin': np.float64(-759.956622158555)}, np.int64(3297): {'average_margin': np.float64(-1081.9791183904615)}, np.int64(3381): {'average_margin': np.float64(-1842.105263157894)}, np.int64(3920): {'average_margin': np.float64(-1159.922782505233)}, np.int64(4144): {'average_margin': np.float64(-1163.5694619081949)}, np.int64(4170): {'average_margin': np.float64(-1235.511572242257)}, np.int64(617): {'average_margin': np.float64(-919.5638166499535)}, np.int64(925): {'average_margin': np.float64(-1500.8595791245789)}, np.int64(950): {'average_margin': np.float64(-1354.621132303235)}, np.int64(993): {'average_margin': np.float64(-1136.2976557974632)}, np.int64(1054): {'average_margin': np.float64(-1007.6054455655545)}, np.int64(1124): {'average_margin': np.float64(-1120.5078263708929)}, np.int64(1126): {'average_margin': np.float64(-1775.9526330110982)}, np.int64(1245): {'average_margin': np.float64(-1116.6966080542265)}, np.int64(2420): {'average_margin': np.float64(-802.406749649123)}, np.int64(380): {'average_margin': np.float64(-840.9903897037678)}, np.int64(414): {'average_margin': np.float64(-841.4157708665605)}, np.int64(422): {'average_margin': np.float64(-1135.4189483430798)}, np.int64(475): {'average_margin': np.float64(-1147.7933562225346)}, np.int64(2500): {'average_margin': np.float64(-1334.3153049707603)}, np.int64(2534): {'average_margin': np.float64(-1105.522020609319)}, np.int64(2754): {'average_margin': np.float64(-1272.4897688172039)}, np.int64(2791): {'average_margin': np.float64(-1117.1070383205736)}, np.int64(8170): {'average_margin': np.float64(-1051.0760099295162)}, np.int64(6571): {'average_margin': np.float64(-971.1628232618579)}, np.int64(7310): {'average_margin': np.float64(-1009.0726274018377)}, np.int64(7380): {'average_margin': np.float64(-1280.4352184089253)}, np.int64(7442): {'average_margin': np.float64(-1902.3074737195807)}, np.int64(7530): {'average_margin': np.float64(-1247.2390003654968)}, np.int64(7612): {'average_margin': np.float64(-1184.366869185435)}, np.int64(7745): {'average_margin': np.float64(-1199.525740336504)}, np.int64(7755): {'average_margin': np.float64(-740.3591728425008)}, np.int64(8040): {'average_margin': np.float64(-1269.1789717820536)}, np.int64(5185): {'average_margin': np.float64(-1174.9650160256408)}, np.int64(3135): {'average_margin': np.float64(-1112.0963770123244)}, np.int64(4401): {'average_margin': np.float64(-1504.7537926634768)}, np.int64(939): {'average_margin': np.float64(-754.1227085571072)}, np.int64(6280): {'average_margin': np.float64(-1421.6574727324175)}, np.int64(21): {'average_margin': np.float64(-1363.4751965994928)}, np.int64(151): {'average_margin': np.float64(-1066.526022904483)}, np.int64(1466): {'average_margin': np.float64(-991.4045514559594)}, np.int64(1519): {'average_margin': np.float64(-1269.0058479532158)}, np.int64(1725): {'average_margin': np.float64(-1356.9709559649118)}, np.int64(1791): {'average_margin': np.float64(-1790.364170176735)}, np.int64(2143): {'average_margin': np.float64(-912.7300769345762)}, np.int64(3624): {'average_margin': np.float64(-1433.9260580057294)}, np.int64(4031): {'average_margin': np.float64(-1304.544277584814)}, np.int64(4062): {'average_margin': np.float64(-1471.5887960282648)}, np.int64(4075): {'average_margin': np.float64(-1164.855060657596)}, np.int64(4270): {'average_margin': np.float64(-1271.7630653021436)}, np.int64(4302): {'average_margin': np.float64(-1097.8609903404993)}, np.int64(4319): {'average_margin': np.float64(-1249.3460562865496)}, np.int64(631): {'average_margin': np.float64(-1662.675810798927)}, np.int64(743): {'average_margin': np.float64(-1541.9545822039531)}, np.int64(790): {'average_margin': np.float64(-1127.748597229863)}, np.int64(1003): {'average_margin': np.float64(-1443.101792982456)}, np.int64(1023): {'average_margin': np.float64(-1010.6090941295544)}, np.int64(1372): {'average_margin': np.float64(-1356.2786813176554)}, np.int64(2351): {'average_margin': np.float64(-1516.448038316457)}, np.int64(337): {'average_margin': np.float64(-1465.9191940789472)}, np.int64(455): {'average_margin': np.float64(-1271.197074162679)}, np.int64(2880): {'average_margin': np.float64(-1204.1869417882413)}, np.int64(2882): {'average_margin': np.float64(-1171.0754889673888)}, np.int64(7200): {'average_margin': np.float64(-1115.705159734012)}, np.int64(7569): {'average_margin': np.float64(-1117.8028258357037)}, np.int64(7801): {'average_margin': np.float64(-1357.1738368601705)}, np.int64(8005): {'average_margin': np.float64(-921.5350264101113)}, np.int64(5365): {'average_margin': np.float64(-504.5670546123374)}, np.int64(5614): {'average_margin': np.float64(-1381.5801912623235)}, np.int64(1630): {'average_margin': np.float64(-1395.5342902711316)}, np.int64(1851): {'average_margin': np.float64(-983.890963622291)}, np.int64(1867): {'average_margin': np.float64(-1240.3398668074867)}, np.int64(2008): {'average_margin': np.float64(-920.5233188874967)}, np.int64(3010): {'average_margin': np.float64(-1563.921072941198)}, np.int64(3203): {'average_margin': np.float64(-982.1855964912278)}, np.int64(3670): {'average_margin': np.float64(-1082.080475549591)}, np.int64(4691): {'average_margin': np.float64(-1129.7971353660903)}, np.int64(737): {'average_margin': np.float64(-1661.0585947484603)}, np.int64(1250): {'average_margin': np.float64(-1421.9759926131112)}, np.int64(477): {'average_margin': np.float64(-1075.216033528265)}, np.int64(7144): {'average_margin': np.float64(-1257.304604407524)}, np.int64(4990): {'average_margin': np.float64(-1173.5089716066484)}, np.int64(5200): {'average_margin': np.float64(-1012.1457489878537)}, np.int64(5209): {'average_margin': np.float64(-1288.6682143068106)}, np.int64(5660): {'average_margin': np.float64(-1016.4418092105263)}, np.int64(5720): {'average_margin': np.float64(-1411.9821063088996)}, np.int64(54): {'average_margin': np.float64(-1105.9734487534627)}, np.int64(129): {'average_margin': np.float64(-1159.4527416341778)}, np.int64(187): {'average_margin': np.float64(-1256.5918156984153)}, np.int64(195): {'average_margin': np.float64(-1233.3962911952776)}, np.int64(220): {'average_margin': np.float64(-1104.89297677063)}, np.int64(1687): {'average_margin': np.float64(-712.239864864865)}, np.int64(1742): {'average_margin': np.float64(-1069.6035773153812)}, np.int64(1834): {'average_margin': np.float64(-902.0399032586139)}, np.int64(1963): {'average_margin': np.float64(-1081.210391676866)}, np.int64(2189): {'average_margin': np.float64(-968.7833616816428)}, np.int64(3080): {'average_margin': np.float64(43.85964912280699)}, np.int64(3150): {'average_margin': np.float64(-1055.3728070175434)}, np.int64(3250): {'average_margin': np.float64(-1476.312576177285)}, np.int64(3837): {'average_margin': np.float64(-1403.5087719298238)}, np.int64(3838): {'average_margin': np.float64(-1429.9447248257625)}, np.int64(3865): {'average_margin': np.float64(-1060.6927631578944)}, np.int64(3935): {'average_margin': np.float64(-1228.5365339291625)}, np.int64(3968): {'average_margin': np.float64(-783.9576900584798)}, np.int64(4250): {'average_margin': np.float64(-923.3665512465375)}, np.int64(751): {'average_margin': np.float64(-1045.1661067562518)}, np.int64(931): {'average_margin': np.float64(-1401.3512050960733)}, np.int64(1000): {'average_margin': np.float64(-1270.4584002084414)}, np.int64(1038): {'average_margin': np.float64(-1395.5013971291858)}, np.int64(1129): {'average_margin': np.float64(-1153.7381626794254)}, np.int64(2230): {'average_margin': np.float64(-710.5312814645312)}, np.int64(292): {'average_margin': np.float64(-938.482226720648)}, np.int64(1807): {'average_margin': np.float64(-6096.491228070173)}}\n", + "We fail to reject the null hypothesis for Zip Code Margin Differences (p = 0.402). No significant difference observed.\n" + ] + } + ], + "source": [ + "from src.task_3.hypothesis_tests import zip_margin_test\n", + "\n", + "margin_result = zip_margin_test(df)\n", + "print(margin_result['results_by_zip'])\n", + "\n", + "print(interpret_test_result(\"Zip Code Margin Differences\", margin_result['p_value'],\n", + " \"Some zip codes may be underperforming in profitability.\"))" + ] + }, + { + "cell_type": "markdown", + "id": "e309d79b", + "metadata": {}, + "source": [ + "## ๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘ Test 4: Gender-Based Risk Differences" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "8931988a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n" + ] + }, + { + "data": { + "text/plain": [ + "Gender\n", + "Female 563581\n", + "Male 6179\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(df['Gender'].isnull().sum())\n", + "# replace not specified with \"Female\"\n", + "df['Gender'] = df['Gender'].replace('not specified', 'Female')\n", + "df['Gender'] = df['Gender'].replace('male', 'Male')\n", + "df['Gender'].value_counts()\n", + "# len(df['Gender'].unique())" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "e8e83041", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Gender\n", + "Female 563581\n", + "Male 6179\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['Gender'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "5a01eb4d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'Male': np.float64(6279.275842256856), 'Female': np.float64(6380.889344354306)}\n", + "We fail to reject the null hypothesis for Gender Risk Differences (p = 0.127). No significant difference observed.\n" + ] + } + ], + "source": [ + "from src.task_3.hypothesis_tests import gender_risk_test\n", + "\n", + "gender_result = gender_risk_test(df, risk_metric='claim_severity')\n", + "print(gender_result['results_by_gender'])\n", + "\n", + "print(interpret_test_result(\"Gender Risk Differences\", gender_result['p_value'],\n", + " \"Indicates potential bias or meaningful risk gap by gender.\"))" + ] + }, + { + "cell_type": "markdown", + "id": "1e37f457", + "metadata": {}, + "source": [ + "## โœ… Summary and Recommendations\n", + "\n", + "Based on the statistical tests above, the business can decide how to update segmentation and pricing strategies.\n", + "- **Significant differences** suggest the feature influences risk and should be considered in pricing.\n", + "- **No differences** indicate the feature may not be necessary for segmentation.\n", + "\n", + "- and since all of the hypothesis have no significant difference we accept all the null hypothesis" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/data_loader.py b/src/data_loader.py index 7475987..ef3d18b 100644 --- a/src/data_loader.py +++ b/src/data_loader.py @@ -7,7 +7,7 @@ def load_data(path: str) -> pd.DataFrame: skiprows=0 ) def load_raw_data(path: str) -> pd.DataFrame: - return pd.read_csv(path) + return pd.read_csv(path, low_memory=False) def check_structure(df: pd.DataFrame): return df.info(), df.dtypes diff --git a/src/preprocessing.py b/src/preprocessing.py index 0b42d5e..7e45e32 100644 --- a/src/preprocessing.py +++ b/src/preprocessing.py @@ -1,10 +1,85 @@ import pandas as pd -def clean_numeric_strings(df: pd.DataFrame, cols: list): +import numpy as np +from scipy import stats +from src.data_loader import extract_numeric_cols, extract_categorical_cols, extract_date_time_cols + + +def clean_numeric_strings(df: pd.DataFrame, cols: list) -> pd.DataFrame: """ Convert string-formatted numbers with commas to proper floats. """ for col in cols: if df[col].dtype == 'object': - df[col] = df[col].str.replace(',', '', regex=False) # Remove thousands separator - df[col] = pd.to_numeric(df[col], errors='coerce') # Convert to float + df[col] = df[col].str.replace(',', '', regex=False) + df[col] = pd.to_numeric(df[col], errors='coerce') return df + + +def clean_data(df: pd.DataFrame) -> pd.DataFrame: + """ + Clean the dataset by performing the following steps: + - Drop duplicate records. + - Fill missing numerical values with the median. + - Standardize and fill missing categorical values with the mode. + - Clean numeric strings (e.g., "1,000"). + - Cap numerical outliers between 1st and 99th percentile. + - Convert datetime columns. + + Returns the cleaned DataFrame. + """ + # 1. Remove Duplicate Rows + df_clean = df.drop_duplicates().copy() + print(print(df['TotalClaims'].value_counts())) + + # 2. Handle Numeric Columns + num_cols = extract_numeric_cols(df_clean) + print('TotalClaims' in num_cols) + for col in num_cols: + median_val = df_clean[col].median() + df_clean[col] = df_clean[col].fillna(median_val) + + # 3. Handle Categorical Columns + cat_cols = extract_categorical_cols(df_clean) + for col in cat_cols: + # Ensure string formatting and remove invalid 'nan' strings + df_clean[col] = df_clean[col].astype(str).str.strip().str.lower() + df_clean[col] = df_clean[col].replace('nan', np.nan) + + for col in cat_cols: + if df_clean[col].isnull().all(): + continue # Skip if entire column is NaN + mode_vals = df_clean[col].mode() + if not mode_vals.empty: + mode_val = mode_vals[0] + df_clean[col] = df_clean[col].fillna(mode_val) + + # 4. Clean Numeric Strings + numeric_string_cols = [ + col for col in df_clean.columns + if df_clean[col].dtype == 'object' and df_clean[col].str.contains(',', na=False).any() + ] + df_clean = clean_numeric_strings(df_clean, numeric_string_cols) + print('after string clean:') + print(print(df['TotalClaims'].value_counts())) + + # 5. Cap Outliers to 1st and 99th percentiles + for col in num_cols: + if col != 'TotalClaims': + lower, upper = df_clean[col].quantile([0.01, 0.99]) + df_clean[col] = np.clip(df_clean[col], lower, upper) + + # 6. Convert Date/Time Columns + date_time_cols = extract_date_time_cols(df_clean) + for col in date_time_cols: + df_clean[col] = pd.to_datetime(df_clean[col], errors='coerce') + + df_clean = df_clean.dropna(thresh=len(df) * 0.2, axis=1) + # df_clean.drop_duplicates(inplace=True) + + return df_clean +def save_cleaned_data(df: pd.DataFrame, file_path: str = '../../data/cleaned/cleaned_data.csv') -> None: + """ + Save the cleaned DataFrame to a CSV file. + """ + df.to_csv(file_path, index=False) + print(f"Cleaned data saved to {file_path}") \ No newline at end of file diff --git a/src/task_3/__init__.py b/src/task_3/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/task_3/business_analysis.py b/src/task_3/business_analysis.py new file mode 100644 index 0000000..8f164b7 --- /dev/null +++ b/src/task_3/business_analysis.py @@ -0,0 +1,10 @@ +def interpret_test_result(test_name, p_value, additional_info=""): + """ + Returns a clear business interpretation of the test result. + If p_value < 0.05, we reject the null hypothesis, and we can add further explanation. + """ + if p_value < 0.05: + interpretation = f"We reject the null hypothesis for {test_name} (p = {p_value:.3f}). {additional_info}" + else: + interpretation = f"We fail to reject the null hypothesis for {test_name} (p = {p_value:.3f}). No significant difference observed." + return interpretation \ No newline at end of file diff --git a/src/task_3/data_segmentation.py b/src/task_3/data_segmentation.py new file mode 100644 index 0000000..330880c --- /dev/null +++ b/src/task_3/data_segmentation.py @@ -0,0 +1,13 @@ +import pandas as pd + +def segment_data(data, feature, test_value): + """ + Segments the data into two groups: + - Group A (Control): Plans without the test feature. + - Group B (Test): Plans with the test feature (i.e., where feature == test_value). + + Returns: control, test as two DataFrame objects. + """ + control = data[data[feature] != test_value].copy() + test = data[data[feature] == test_value].copy() + return control, test \ No newline at end of file diff --git a/src/task_3/hypothesis_tests.py b/src/task_3/hypothesis_tests.py new file mode 100644 index 0000000..fd6f193 --- /dev/null +++ b/src/task_3/hypothesis_tests.py @@ -0,0 +1,108 @@ +import numpy as np +import pandas as pd +from src.task_3.stats_helpers import anova_test, t_test_independent, chi_square_test +def province_risk_test(data, risk_metric='claim_frequency'): + """ + Compare risk across provinces using the specified risk metric. + + For claim frequency: Calculate the proportion of policies with at least one claim. + For claim severity: Consider only policies with at least one claim and compute their average. + Use ANOVA to compare differences across provinces. + + Returns a dictionary with test statistics and p-values. + """ + results = {} + provinces = data['Province'].unique() + groups = [] + + if risk_metric == 'claim_frequency': + for province in provinces: + subset = data[data['Province'] == province] + # Binary flag: 1 if claim exists, 0 otherwise + freq = subset['claim_indicator'].mean() + groups.append(subset['claim_indicator'].values) + results[province] = {'claim_frequency': freq} + elif risk_metric == 'claim_severity': + for province in provinces: + subset = data[(data['Province'] == province) & (data['claim_indicator'] == 1)] + severity = subset['TotalClaims'].mean() if not subset.empty else np.nan + groups.append(subset['TotalClaims'].values if not subset.empty else np.array([0])) + results[province] = {'claim_severity': severity} + else: + raise ValueError("Invalid risk metric specified.") + + stat, p_val = anova_test(groups) + return {'results_by_province': results, 'anova_stat': stat, 'p_value': p_val} + + +def zip_risk_test(data, risk_metric='claim_frequency'): + """ + Compares risk across zip codes using the specified risk metric (frequency or severity). + Performs ANOVA across groups. + """ + results = {} + zip_codes = data['PostalCode'].dropna().unique() + groups = [] + + if risk_metric == 'claim_frequency': + for z in zip_codes: + subset = data[data['PostalCode'] == z] + freq = subset['claim_indicator'].mean() + groups.append(subset['claim_indicator'].values) + results[z] = {'claim_frequency': freq} + elif risk_metric == 'claim_severity': + for z in zip_codes: + subset = data[(data['PostalCode'] == z) & (data['claim_indicator'] == 1)] + severity = subset['TotalClaims'].mean() if not subset.empty else np.nan + groups.append(subset['TotalClaims'].values if not subset.empty else np.array([0])) + results[z] = {'claim_severity': severity} + else: + raise ValueError("Invalid risk metric.") + + stat, p_val = anova_test(groups) + return {'results_by_zip': results, 'anova_stat': stat, 'p_value': p_val} + +def zip_margin_test(data): + """ + Tests whether margin (TotalPremium - TotalClaims) differs by zip code using ANOVA. + """ + data = data.copy() + data['margin'] = data['TotalPremium'] - data['TotalClaims'] + + results = {} + zip_codes = data['PostalCode'].dropna().unique() + groups = [] + + for z in zip_codes: + subset = data[data['PostalCode'] == z] + margin_mean = subset['margin'].mean() + groups.append(subset['margin'].values) + results[z] = {'average_margin': margin_mean} + + stat, p_val = anova_test(groups) + return {'results_by_zip': results, 'anova_stat': stat, 'p_value': p_val} + +def gender_risk_test(data, risk_metric='claim_severity'): + """ + Compare risk between genders using a two-sample t-test. + """ + results = {} + + male_data = data[data['Gender'] == 'Male'] + female_data = data[data['Gender'] == 'Female'] + + if risk_metric == 'claim_frequency': + male_vals = male_data['claim_indicator'] + female_vals = female_data['claim_indicator'] + results['Male'] = male_vals.mean() + results['Female'] = female_vals.mean() + elif risk_metric == 'claim_severity': + male_vals = male_data[male_data['claim_indicator'] == 1]['TotalClaims'] + female_vals = female_data[female_data['claim_indicator'] == 1]['TotalClaims'] + results['Male'] = male_vals.mean() + results['Female'] = female_vals.mean() + else: + raise ValueError("Invalid risk metric.") + + stat, p_val = t_test_independent(male_vals, female_vals) + return {'results_by_gender': results, 't_stat': stat, 'p_value': p_val} diff --git a/src/task_3/segmentation_utils.py b/src/task_3/segmentation_utils.py new file mode 100644 index 0000000..a865580 --- /dev/null +++ b/src/task_3/segmentation_utils.py @@ -0,0 +1,28 @@ +import numpy as np +import pandas as pd + +def calculate_claim_frequency(data): + """ + Calculate Claim Frequency as the proportion of policies with at least one claim. + """ + # data['claim_indicator'] = data['TotalClaims'] > 0 + return data['claim_indicator'].mean() + +def calculate_claim_severity(data): + """ + Calculate Claim Severity as the average claim amount for policies with a claim. + """ + data['claim_indicator'] = data['TotalClaims'] > 0 + claims = data[data['claim_indicator']] + return claims['TotalClaims'].mean() if not claims.empty else np.nan + +def calculate_margin(data): + """ + Calculate margin as (TotalPremium - TotalClaims) for the data provided. + """ + return (data['TotalPremium'] - data['TotalClaims']).sum() + +def get_groups_by_feature(df, feature: str, value_a, value_b): + group_a = df[df[feature] == value_a] + group_b = df[df[feature] == value_b] + return group_a, group_b diff --git a/src/task_3/stats_helpers.py b/src/task_3/stats_helpers.py new file mode 100644 index 0000000..4298e7c --- /dev/null +++ b/src/task_3/stats_helpers.py @@ -0,0 +1,17 @@ +from scipy.stats import ttest_ind, chi2_contingency, f_oneway +import pandas as pd + +def t_test_independent(group_a, group_b): + return ttest_ind(group_a.dropna(), group_b.dropna(), equal_var=False) + +def chi_square_test(df, col1, col2): + contingency = pd.crosstab(df[col1], df[col2]) + return chi2_contingency(contingency) + +def anova_test(groups): + """ + Perform one-way ANOVA. + `groups` should be a list/tuple of arrays (or lists) containing your samples. + Returns the ANOVA statistic and p-value. + """ + return f_oneway(*groups) \ No newline at end of file diff --git a/tests/test_task_3/__init__.py b/tests/test_task_3/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_task_3/test_business_analysis.py b/tests/test_task_3/test_business_analysis.py new file mode 100644 index 0000000..0003792 --- /dev/null +++ b/tests/test_task_3/test_business_analysis.py @@ -0,0 +1,12 @@ +import pytest +from src.task_3.business_analysis import interpret_test_result + +def test_interpret_test_result_reject(): + msg = interpret_test_result("Province Risk", 0.01, "Higher risk observed in Gauteng.") + assert "reject the null hypothesis" in msg + assert "Higher risk observed" in msg + +def test_interpret_test_result_fail(): + msg = interpret_test_result("Gender Risk", 0.2) + assert "fail to reject the null hypothesis" in msg + assert "No significant difference" in msg diff --git a/tests/test_task_3/test_data_segmentation.py b/tests/test_task_3/test_data_segmentation.py new file mode 100644 index 0000000..4d43f61 --- /dev/null +++ b/tests/test_task_3/test_data_segmentation.py @@ -0,0 +1,11 @@ +import pandas as pd +from src.task_3.data_segmentation import segment_data + +def test_segment_data(): + df = pd.DataFrame({ + 'Gender': ['Male', 'Female', 'Male', 'Female'], + 'claim_amount': [100, 200, 150, 250] + }) + control, test = segment_data(df, 'Gender', 'Female') + assert all(control['Gender'] != 'Female') + assert all(test['Gender'] == 'Female') diff --git a/tests/test_task_3/test_hypothesis_tests.py b/tests/test_task_3/test_hypothesis_tests.py new file mode 100644 index 0000000..59bcd53 --- /dev/null +++ b/tests/test_task_3/test_hypothesis_tests.py @@ -0,0 +1,33 @@ +import pandas as pd +import numpy as np +from src.task_3.hypothesis_tests import province_risk_test, zip_margin_test, gender_risk_test + +def test_province_risk_test(): + df = pd.DataFrame({ + 'Province': ['A', 'A', 'B', 'B'], + 'claim_indicator': [1, 0, 1, 1], + 'TotalClaims': [100, 0, 200, 300] + }) + result = province_risk_test(df, 'claim_frequency') + assert 'anova_stat' in result + assert 'p_value' in result + +def test_zip_margin_test(): + df = pd.DataFrame({ + 'PostalCode': ['X', 'X', 'Y', 'Y'], + 'TotalPremium': [500, 600, 300, 400], + 'TotalClaims': [200, 300, 150, 200] + }) + result = zip_margin_test(df) + assert 'p_value' in result + assert 'results_by_zip' in result + +def test_gender_risk_test(): + df = pd.DataFrame({ + 'Gender': ['Male', 'Female', 'Male', 'Female'], + 'claim_indicator': [1, 0, 1, 1], + 'TotalClaims': [1000, 0, 800, 300] + }) + result = gender_risk_test(df, 'claim_severity') + assert 'p_value' in result + assert 'results_by_gender' in result diff --git a/tests/test_task_3/test_segmentation_utils.py b/tests/test_task_3/test_segmentation_utils.py new file mode 100644 index 0000000..0cb5658 --- /dev/null +++ b/tests/test_task_3/test_segmentation_utils.py @@ -0,0 +1,20 @@ +import pandas as pd +from src.task_3.segmentation_utils import calculate_claim_frequency, calculate_claim_severity, calculate_margin, get_groups_by_feature + +def test_claim_frequency(): + df = pd.DataFrame({'claim_indicator': [1, 0, 1, 1]}) + assert calculate_claim_frequency(df) == 0.75 + +def test_claim_severity(): + df = pd.DataFrame({'claim_indicator': [1, 0, 1], 'TotalClaims': [100, 0, 300]}) + assert calculate_claim_severity(df) == 200 + +def test_calculate_margin(): + df = pd.DataFrame({'TotalPremium': [1000, 800], 'TotalClaims': [400, 200]}) + assert calculate_margin(df) == 1200 + +def test_get_groups_by_feature(): + df = pd.DataFrame({'Gender': ['M', 'F', 'F', 'M']}) + a, b = get_groups_by_feature(df, 'Gender', 'M', 'F') + assert set(a['Gender']) == {'M'} + assert set(b['Gender']) == {'F'} diff --git a/tests/test_task_3/test_stats_helpers.py b/tests/test_task_3/test_stats_helpers.py new file mode 100644 index 0000000..e69de29