La solicitud

De Jordan Reyes, Director de Marketing
Tu objetivo
Asigna a result un diccionario: "rate_a" y "rate_b", la tasa de conversión (proporción de sesiones con converted True) de cada grupo, "abs_lift", la tasa B menos la tasa A, y "rel_lift", esa diferencia dividida entre la tasa A. Calcula con las tasas sin redondear y luego redondea los cuatro valores a 4 decimales.
- Usa el DataFrame
web_sessionspendiente - Guarda un dict en
resultpendiente
Each arm has 2,604 sessions. Arm A converted 98 of them, arm B 105. The axis starts at zero, so bar heights compare honestly.
Ver los números
| Arm | Sessions that converted |
|---|---|
| A: no banner | 3.8% |
| B: banner | 4% |
Tu código
Cargando el editor…
Solución de referencia
| session_id | customer_id | started_at | device | source |
|---|---|---|---|---|
| 1 | NaN | 2023-01-01 23:02:24 | mobile | paid |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid |
| 3 | NaN | 2023-01-01 16:55:46 | desktop | direct |
| 4 | NaN | 2023-01-01 12:43:28 | mobile | organic |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Jordan, y por qué
DataFrames
Cargados como DataFrames de pandas, junto con pd y np.
web_sessions40,000 filas · 7 columnas
session_idintegercustomer_idintegerstarted_attimestampdevicevarcharsourcevarcharpages_viewedintegerconvertedboolean
| session_id | customer_id | started_at | device | source | pages_viewed | converted |
|---|---|---|---|---|---|---|
| 1 | NaN | 2023-01-01 23:02:24 | mobile | paid | 1 | false |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid | 1 | false |
| 3 | NaN | 2023-01-01 16:55:46 | desktop | direct | 7 | false |
| 4 | NaN | 2023-01-01 12:43:28 | mobile | organic | 3 | false |
| 5 | NaN | 2023-01-01 13:06:21 | mobile | social | 2 | false |
customers2,018 filas · 9 columnas
customer_idintegerfirst_namevarcharlast_namevarcharemailvarcharcityvarcharstatevarcharsignup_datedatesegmentvarcharreferral_sourcevarchar
| customer_id | first_name | last_name | city | state | signup_date | segment | referral_source | |
|---|---|---|---|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco | CA | 2022-06-02 | consumer | search |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta | GA | 2022-06-02 | consumer | NaN |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles | CA | 2022-06-04 | business | NaN |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle | WA | 2022-06-06 | business | |
| 5 | Kyle | Jimenez | kjimenez27@yahoo.com | Indianapolis | IN | 2022-06-07 | consumer | NaN |
products120 filas · 8 columnas
product_idintegernamevarcharcategoryvarcharsubcategoryvarcharunit_pricedecimalunit_costdecimallaunched_ondateis_activeboolean
| product_id | name | category | subcategory | unit_price | unit_cost | launched_on | is_active |
|---|---|---|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 | NaN | 2023-09-11 | true |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 | 503.50 | 2024-05-16 | true |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 | 429.87 | 2023-05-27 | true |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 | 214.70 | 2022-12-20 | true |
| 105 | Avery Leather Bed Frame | Furniture | Beds | 449.00 | 232.70 | 2021-08-31 | true |
orders12,000 filas · 7 columnas
order_idintegercustomer_idintegerorder_datetimestampstatusvarcharchannelvarcharshipping_feedecimalcoupon_codevarchar
| order_id | customer_id | order_date | status | channel | shipping_fee | coupon_code |
|---|---|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web | 0.00 | NaN |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web | 0.00 | NaN |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace | 4.99 | WELCOME10 |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace | 4.99 | WELCOME10 |
| 1005 | 82 | 2023-01-02 11:43:36 | completed | web | 0.00 | WELCOME10 |
order_items30,338 filas · 6 columnas
order_item_idintegerorder_idintegerproduct_idintegerquantityintegerunit_pricedecimaldiscount_pctdecimal
| order_item_id | order_id | product_id | quantity | unit_price | discount_pct |
|---|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 | 0.00 |
| 2 | 1001 | 154 | 3 | 11.99 | 0.00 |
| 3 | 1002 | 154 | 4 | 11.99 | 0.00 |
| 4 | 1002 | 194 | 1 | 149.00 | 0.00 |
| 5 | 1002 | 193 | 2 | 19.99 | 0.00 |
returns1,673 filas · 5 columnas
return_idintegerorder_item_idintegerreturned_ondatereasonvarcharrefund_amountdecimal
| return_id | order_item_id | returned_on | reason | refund_amount |
|---|---|---|---|---|
| 1 | 14 | 2023-01-10 | damaged | 83.69 |
| 2 | 42 | 2023-01-10 | wrong_item | 19.99 |
| 3 | 105 | 2023-01-14 | wrong_item | 10.99 |
| 4 | 24 | 2023-01-16 | changed_mind | 26.99 |
| 5 | 126 | 2023-01-16 | late | 20.99 |
employees60 filas · 8 columnas
employee_idintegerfirst_namevarcharlast_namevarchardepartmentvarchartitlevarcharmanager_idintegerhire_datedatesalaryinteger
| employee_id | first_name | last_name | department | title | manager_id | hire_date | salary |
|---|---|---|---|---|---|---|---|
| 1 | Catherine | Hale | Executive | Chief Executive Officer | NaN | 2016-03-01 | 285000 |
| 2 | Robert | Kim | Executive | Chief Operating Officer | 1 | 2017-01-09 | 235000 |
| 3 | Megan | Collins | Sales | Head of Sales | 1 | 2018-04-16 | 172000 |
| 4 | Chloe | Gutierrez | Sales | Account Executive | 3 | 2020-01-21 | 72000 |
| 5 | Frank | Bell | Sales | Account Executive | 3 | 2023-05-21 | 73000 |
marketing_spend3,276 filas · 3 columnas
spend_datedatechannelvarcharamountdecimal
| spend_date | channel | amount |
|---|---|---|
| 2023-01-01 | paid | 492.99 |
| 2023-01-01 | 37.38 | |
| 2023-01-01 | social | 200.53 |
| 2023-01-02 | paid | 709.13 |
| 2023-01-02 | 64.13 |
La lección
La tasa de conversión es una media
Una sesión convirtió o no convirtió. Guárdalo como True/False y la tasa de conversión es simplemente la media de la columna, porque pandas cuenta True como 1 y False como 0:
test.groupby("arm")["converted"].mean()
# A 0.0376
# B 0.0403
El grupo B, el del banner, convirtió 105 de 2,604 sesiones; el grupo A convirtió 98 de 2,604. Vale
la pena imprimir los conteos junto a las tasas (.agg(["size", "sum", "mean"])), porque 105 frente
a 98 es una imagen mucho más honesta de la evidencia que 4.03% frente a 3.76%.
Aumento absoluto y relativo
Hay dos formas de decir cuánto mejor le fue a B, y la gente las mezcla constantemente:
- Aumento absoluto:
rate_b - rate_a= 0.0027, o 0.27 puntos porcentuales. - Aumento relativo:
(rate_b - rate_a) / rate_a= 0.071, o 7.1%.
El número relativo suena más impresionante, y por eso termina en los titulares. Ambos son correctos; lo que importa es decir cuál quieres decir. “La conversión subió 7%”, leído por alguien que piensa en puntos, suena como si 3.8% se hubiera vuelto 10.8%, que no es lo que pasó.
Usa puntos (pp) para diferencias de tasas y porcentaje para el cambio relativo. Escríbelo como “+0.27 pp (+7.1% relativo)” y nadie podrá malinterpretarlo.
¿Siete por ciento de qué?
Siete pedidos extra en dos meses es el tamaño real de esta diferencia. Con conversiones tan poco frecuentes, un puñado de sesiones mueve mucho la tasa: si ocho de los 105 compradores de B se hubieran ido sin pedir, B sería el grupo perdedor. Esa es la pregunta que responde bien el siguiente nivel: ¿cuánto de esta diferencia podría ser ruido?
Errores comunes
- Redondear antes de dividir. Redondea 0.037634 y 0.040323 a 0.0376 y 0.0403 primero y el aumento relativo sale 0.0718 en lugar de 0.0714. Calcula con precisión completa y redondea al final.
- Dividir entre el grupo equivocado. El aumento relativo se mide contra el control (A). Dividir entre B da un número distinto que responde una pregunta distinta.
- Contar filas en vez de sesiones con conversión.
count()cuenta los valores no faltantes, así que cuenta todas las sesiones. Usasum()para las conversiones ymean()para la tasa. - Declarar un ganador solo por el aumento. Toda prueba tiene un ganador si solo comparas dos números. El aumento es la estimación; si es real es otra pregunta.
¡Linterna encendida!
Practicaste: ab testconversion rateliftrelative change
- Resuelto
- Sin pistas
- Al primer intento
