diff --git a/lab-dw-aggregating.ipynb b/lab-dw-aggregating.ipynb index fadd718..304ad88 100644 --- a/lab-dw-aggregating.ipynb +++ b/lab-dw-aggregating.ipynb @@ -127,14 +127,1189 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, + "id": "c623d287", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(10910, 26)\n", + "(10910, 26)\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", + "
unnamed:_0customerstatecustomer_lifetime_valueresponsecoverageeducationeffective_to_dateemploymentstatusgender...number_of_open_complaintsnumber_of_policiespolicy_typepolicyrenew_offer_typesales_channeltotal_claim_amountvehicle_classvehicle_sizevehicle_type
00DK49336Arizona4809.216960NoBasicCollege2/18/11EmployedM...0.09Corporate AutoCorporate L3Offer3Agent292.800000Four-Door CarMedsizeNaN
11KX64629California2228.525238NoBasicCollege1/18/11UnemployedF...0.01Personal AutoPersonal L3Offer4Call Center744.924331Four-Door CarMedsizeNaN
\n", + "

2 rows × 26 columns

\n", + "
" + ], + "text/plain": [ + " unnamed:_0 customer state customer_lifetime_value response coverage \\\n", + "0 0 DK49336 Arizona 4809.216960 No Basic \n", + "1 1 KX64629 California 2228.525238 No Basic \n", + "\n", + " education effective_to_date employmentstatus gender ... \\\n", + "0 College 2/18/11 Employed M ... \n", + "1 College 1/18/11 Unemployed F ... \n", + "\n", + " number_of_open_complaints number_of_policies policy_type policy \\\n", + "0 0.0 9 Corporate Auto Corporate L3 \n", + "1 0.0 1 Personal Auto Personal L3 \n", + "\n", + " renew_offer_type sales_channel total_claim_amount vehicle_class \\\n", + "0 Offer3 Agent 292.800000 Four-Door Car \n", + "1 Offer4 Call Center 744.924331 Four-Door Car \n", + "\n", + " vehicle_size vehicle_type \n", + "0 Medsize NaN \n", + "1 Medsize NaN \n", + "\n", + "[2 rows x 26 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "CSV_PATH = \"https://raw.githubusercontent.com/data-bootcamp-v4/data/main/marketing_customer_analysis.csv\"\n", + "df = pd.read_csv(CSV_PATH)\n", + "\n", + "# clean column names\n", + "df.columns = (df.columns.str.strip()\n", + " .str.lower()\n", + " .str.replace(\" \", \"_\")\n", + " .str.replace(\"-\", \"_\"))\n", + "print(df.shape)\n", + "df.head()\n", + "\n", + "df.columns = (df.columns.str.strip()\n", + " .str.lower()\n", + " .str.replace(\" \", \"_\")\n", + " .str.replace(\"-\", \"_\"))\n", + "\n", + "print(df.shape)\n", + "df.head(2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "6840b954", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
unnamed:_0customerstatecustomer_lifetime_valueresponsecoverageeducationeffective_to_dateemploymentstatusgender...number_of_open_complaintsnumber_of_policiespolicy_typepolicyrenew_offer_typesales_channeltotal_claim_amountvehicle_classvehicle_sizevehicle_type
33XL78013Oregon22332.439460YesExtendedCollege1/11/11EmployedM...0.02Corporate AutoCorporate L3Offer2Branch484.013411Four-Door CarMedsizeA
88FM55990California5989.773931YesPremiumCollege1/19/11EmployedM...0.01Personal AutoPersonal L1Offer2Branch739.200000Sports CarMedsizeNaN
1515CW49887California4626.801093YesBasicMaster1/16/11EmployedF...0.01Special AutoSpecial L1Offer2Branch547.200000SUVMedsizeNaN
1919NJ54277California3746.751625YesExtendedCollege2/26/11EmployedF...1.01Personal AutoPersonal L2Offer2Call Center19.575683Two-Door CarLargeA
2727MQ68407Oregon4376.363592YesPremiumBachelor2/28/11EmployedF...0.01Personal AutoPersonal L3Offer2Agent60.036683Four-Door CarMedsizeNaN
\n", + "

5 rows × 26 columns

\n", + "
" + ], + "text/plain": [ + " unnamed:_0 customer state customer_lifetime_value response \\\n", + "3 3 XL78013 Oregon 22332.439460 Yes \n", + "8 8 FM55990 California 5989.773931 Yes \n", + "15 15 CW49887 California 4626.801093 Yes \n", + "19 19 NJ54277 California 3746.751625 Yes \n", + "27 27 MQ68407 Oregon 4376.363592 Yes \n", + "\n", + " coverage education effective_to_date employmentstatus gender ... \\\n", + "3 Extended College 1/11/11 Employed M ... \n", + "8 Premium College 1/19/11 Employed M ... \n", + "15 Basic Master 1/16/11 Employed F ... \n", + "19 Extended College 2/26/11 Employed F ... \n", + "27 Premium Bachelor 2/28/11 Employed F ... \n", + "\n", + " number_of_open_complaints number_of_policies policy_type \\\n", + "3 0.0 2 Corporate Auto \n", + "8 0.0 1 Personal Auto \n", + "15 0.0 1 Special Auto \n", + "19 1.0 1 Personal Auto \n", + "27 0.0 1 Personal Auto \n", + "\n", + " policy renew_offer_type sales_channel total_claim_amount \\\n", + "3 Corporate L3 Offer2 Branch 484.013411 \n", + "8 Personal L1 Offer2 Branch 739.200000 \n", + "15 Special L1 Offer2 Branch 547.200000 \n", + "19 Personal L2 Offer2 Call Center 19.575683 \n", + "27 Personal L3 Offer2 Agent 60.036683 \n", + "\n", + " vehicle_class vehicle_size vehicle_type \n", + "3 Four-Door Car Medsize A \n", + "8 Sports Car Medsize NaN \n", + "15 SUV Medsize NaN \n", + "19 Two-Door Car Large A \n", + "27 Four-Door Car Medsize NaN \n", + "\n", + "[5 rows x 26 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# customers with claim <1000 and responded Yes\n", + "low_claim_yes = df[(df[\"total_claim_amount\"] < 1000) & (df[\"response\"] == \"Yes\")]\n", + "low_claim_yes.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "ec5077d1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
monthly_premium_autocustomer_lifetime_value
policy_typegender
Corporate AutoF91.3846157980.306825
M94.7642497750.741082
Personal AutoF93.1531798074.660516
M93.3010567971.386285
Special AutoF93.5630258460.398042
M93.1970449010.601583
\n", + "
" + ], + "text/plain": [ + " monthly_premium_auto customer_lifetime_value\n", + "policy_type gender \n", + "Corporate Auto F 91.384615 7980.306825\n", + " M 94.764249 7750.741082\n", + "Personal Auto F 93.153179 8074.660516\n", + " M 93.301056 7971.386285\n", + "Special Auto F 93.563025 8460.398042\n", + " M 93.197044 9010.601583" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# group by policy_type + gender and take mean\n", + "analysis = df.groupby([\"policy_type\", \"gender\"])[[\"monthly_premium_auto\", \"customer_lifetime_value\"]].mean()\n", + "analysis\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "90e9ac6d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "state\n", + "California 3552\n", + "Oregon 2909\n", + "Arizona 1937\n", + "Nevada 993\n", + "Washington 888\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# count customers per state\n", + "state_counts = df[\"state\"].value_counts()\n", + "big_states = state_counts[state_counts > 500]\n", + "big_states\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e73095c5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
maxminmedian
educationgender
BachelorF73225.956521904.0008525640.505303
M67907.270501898.0076755548.031892
CollegeF61850.188031898.6836865623.611187
M61134.683071918.1197006005.847375
DoctorF44856.113972395.5700005332.462694
M32677.342842267.6040385577.669457
High School or BelowF55277.445892144.9215356039.553187
M83325.381191940.9812216286.731006
MasterF51016.067042417.7770325729.855012
M50568.259122272.3073105579.099207
\n", + "
" + ], + "text/plain": [ + " max min median\n", + "education gender \n", + "Bachelor F 73225.95652 1904.000852 5640.505303\n", + " M 67907.27050 1898.007675 5548.031892\n", + "College F 61850.18803 1898.683686 5623.611187\n", + " M 61134.68307 1918.119700 6005.847375\n", + "Doctor F 44856.11397 2395.570000 5332.462694\n", + " M 32677.34284 2267.604038 5577.669457\n", + "High School or Below F 55277.44589 2144.921535 6039.553187\n", + " M 83325.38119 1940.981221 6286.731006\n", + "Master F 51016.06704 2417.777032 5729.855012\n", + " M 50568.25912 2272.307310 5579.099207" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# max, min, median CLV grouped by education + gender\n", + "clv_stats = df.groupby([\"education\", \"gender\"])[\"customer_lifetime_value\"].agg([\"max\", \"min\", \"median\"])\n", + "clv_stats\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "d68d573b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
effective_to_date1/1/111/10/111/11/111/12/111/13/111/14/111/15/111/16/111/17/111/18/11...2/26/112/27/112/28/112/3/112/4/112/5/112/6/112/7/112/8/112/9/11
state
Arizona35343532353629333537...40402949484223304137
California56728149555754666059...61644962575562763959
Nevada13251912201018101418...1120192317515111814
Oregon42704136395451447745...59556437544743553534
Washington1821912131115112313...15151712111821101416
\n", + "

5 rows × 59 columns

\n", + "
" + ], + "text/plain": [ + "effective_to_date 1/1/11 1/10/11 1/11/11 1/12/11 1/13/11 1/14/11 \\\n", + "state \n", + "Arizona 35 34 35 32 35 36 \n", + "California 56 72 81 49 55 57 \n", + "Nevada 13 25 19 12 20 10 \n", + "Oregon 42 70 41 36 39 54 \n", + "Washington 18 21 9 12 13 11 \n", + "\n", + "effective_to_date 1/15/11 1/16/11 1/17/11 1/18/11 ... 2/26/11 2/27/11 \\\n", + "state ... \n", + "Arizona 29 33 35 37 ... 40 40 \n", + "California 54 66 60 59 ... 61 64 \n", + "Nevada 18 10 14 18 ... 11 20 \n", + "Oregon 51 44 77 45 ... 59 55 \n", + "Washington 15 11 23 13 ... 15 15 \n", + "\n", + "effective_to_date 2/28/11 2/3/11 2/4/11 2/5/11 2/6/11 2/7/11 2/8/11 \\\n", + "state \n", + "Arizona 29 49 48 42 23 30 41 \n", + "California 49 62 57 55 62 76 39 \n", + "Nevada 19 23 17 5 15 11 18 \n", + "Oregon 64 37 54 47 43 55 35 \n", + "Washington 17 12 11 18 21 10 14 \n", + "\n", + "effective_to_date 2/9/11 \n", + "state \n", + "Arizona 37 \n", + "California 59 \n", + "Nevada 14 \n", + "Oregon 34 \n", + "Washington 16 \n", + "\n", + "[5 rows x 59 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# group by state + month (effective_to_date), pivot table\n", + "policies_by_state_month = df.groupby([\"state\", \"effective_to_date\"]).size().unstack(fill_value=0)\n", + "policies_by_state_month.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "752f7ee1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
effective_to_date1/1/111/10/111/11/111/12/111/13/111/14/111/15/111/16/111/17/111/18/11...2/26/112/27/112/28/112/3/112/4/112/5/112/6/112/7/112/8/112/9/11
state
Arizona35343532353629333537...40402949484223304137
California56728149555754666059...61644962575562763959
Oregon42704136395451447745...59556437544743553534
\n", + "

3 rows × 59 columns

\n", + "
" + ], + "text/plain": [ + "effective_to_date 1/1/11 1/10/11 1/11/11 1/12/11 1/13/11 1/14/11 \\\n", + "state \n", + "Arizona 35 34 35 32 35 36 \n", + "California 56 72 81 49 55 57 \n", + "Oregon 42 70 41 36 39 54 \n", + "\n", + "effective_to_date 1/15/11 1/16/11 1/17/11 1/18/11 ... 2/26/11 2/27/11 \\\n", + "state ... \n", + "Arizona 29 33 35 37 ... 40 40 \n", + "California 54 66 60 59 ... 61 64 \n", + "Oregon 51 44 77 45 ... 59 55 \n", + "\n", + "effective_to_date 2/28/11 2/3/11 2/4/11 2/5/11 2/6/11 2/7/11 2/8/11 \\\n", + "state \n", + "Arizona 29 49 48 42 23 30 41 \n", + "California 49 62 57 55 62 76 39 \n", + "Oregon 64 37 54 47 43 55 35 \n", + "\n", + "effective_to_date 2/9/11 \n", + "state \n", + "Arizona 37 \n", + "California 59 \n", + "Oregon 34 \n", + "\n", + "[3 rows x 59 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# find top 3 states with most policies\n", + "top_states = df[\"state\"].value_counts().head(3).index\n", + "top3 = df[df[\"state\"].isin(top_states)]\n", + "top3_table = top3.groupby([\"state\", \"effective_to_date\"]).size().unstack(fill_value=0)\n", + "top3_table\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, "id": "449513f4-0459-46a0-a18d-9398d974c9ad", "metadata": { "id": "449513f4-0459-46a0-a18d-9398d974c9ad" }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
vehicle_classFour-Door CarLuxury CarLuxury SUVSUVSports CarTwo-Door Car
response
No0.8657570.9314290.8367350.8386760.8157390.861895
Yes0.1342430.0685710.1632650.1613240.1842610.138105
\n", + "
" + ], + "text/plain": [ + "vehicle_class Four-Door Car Luxury Car Luxury SUV SUV Sports Car \\\n", + "response \n", + "No 0.865757 0.931429 0.836735 0.838676 0.815739 \n", + "Yes 0.134243 0.068571 0.163265 0.161324 0.184261 \n", + "\n", + "vehicle_class Two-Door Car \n", + "response \n", + "No 0.861895 \n", + "Yes 0.138105 " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# your code goes here" + "# response rate by channel\n", + "channel_response = pd.crosstab(df[\"response\"], df[\"vehicle_class\"], normalize=\"columns\")\n", + "channel_response\n" ] } ], @@ -143,7 +1318,7 @@ "provenance": [] }, "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -157,7 +1332,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.13" + "version": "3.11.3" } }, "nbformat": 4,