La solicitud

De Jordan Reyes, Director de Marketing
Tu objetivo
Paso 1 de 4. Asigna a result un DataFrame con una fila por grupo (A, luego B) y las columnas arm, sessions (conteo), conversions (sesiones con converted True) y rate (conversions / sessions, redondeada a 4).
- Usa el DataFrame
web_sessionspendiente - Muestra exactamente
armsessionsconversionsratependiente - 2 filas, ordenadas como se pidependiente
Paso 2 de 4. Asigna a result un diccionario con "abs_lift" (tasa B menos tasa A), "rel_lift" (esa diferencia dividida entre la tasa A), y "ci_low", "ci_high": el intervalo del 95% para la diferencia, ±1.96 errores estándar sin agrupar. Usa las tasas sin redondear; redondea los cuatro valores a 4 decimales.
- Usa el DataFrame
web_sessionspendiente - Guarda un dict en
resultpendiente
Paso 3 de 4. Asigna a result un diccionario con "z", el estadístico z de dos proporciones para B menos A usando el error estándar agrupado (redondeado a 3), y "p_value", su valor p de dos colas (redondeado a 4).
- Usa el DataFrame
web_sessionspendiente - Guarda un dict en
resultpendiente
Paso 4 de 4. Asigna a result un diccionario con "mde_rel", el aumento relativo mínimo detectable con 80% de potencia y un nivel del 5% de dos colas, (z_0.975 + z_0.80) * sqrt(2 * p_a * (1 - p_a) / n_a) / p_a con p_a y n_a del grupo A (redondeado a 4), y "verdict": "ship" si p < 0.05 y el aumento es positivo, "stop" si p < 0.05 y el aumento es negativo, y en cualquier otro caso "inconclusive". Calcula el veredicto a partir de los datos, no lo escribas a mano.
- Usa el DataFrame
web_sessionspendiente - Guarda un dict en
resultpendiente
1,068 sessions in each arm. The banner arm converted less often. Your job is to say whether that gap means anything.
Ver los números
| Arm | Sessions that converted |
|---|---|
| A: no banner | 3.8% |
| B: banner | 3% |
Paso 1 · 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.
Paso 2 · 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.
Paso 3 · 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.
Paso 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
Los cuatro números de un informe
Un informe de prueba responde cuatro preguntas, en este orden:
- ¿Fue sana la prueba? La tabla de grupos: sesiones por grupo (la revisión de proporción de muestra) y conversiones.
- ¿Qué pasó? El aumento, absoluto y relativo.
- ¿Qué tan seguros estamos? El intervalo de confianza del 95% y el valor p.
- ¿Qué podía haber visto la prueba? El efecto mínimo detectable, y el veredicto.
Construiste las tres primeras para la prueba de fiestas. La prueba de primavera es más pequeña: 1,068 sesiones por grupo frente a 2,604, y por eso importa tanto la cuarta pregunta.
Efecto mínimo detectable
La potencia es la probabilidad de que una prueba detecte un efecto que de verdad existe. El efecto mínimo detectable (MDE) es el efecto más pequeño que la prueba detecta con una potencia elegida, normalmente 80%, al nivel habitual del 5%:
nd = NormalDist()
mde_abs = (nd.inv_cdf(0.975) + nd.inv_cdf(0.8)) * math.sqrt(2 * p_a * (1 - p_a) / n_a)
mde_rel = mde_abs / p_a # about 0.61
Con la muestra de primavera, solo un cambio de cerca del 61% en la conversión tenía una probabilidad razonable de aparecer. Los banners, los colores de botones y los cambios de texto suelen mover la conversión unos pocos por ciento. Esta prueba era demasiado pequeña para su pregunta antes de empezar, y es mejor decirlo que dejar que un resultado plano se lea como “el banner no hace nada”.
La misma fórmula responde la pregunta de planificación al revés: fija el aumento que te importa y despeja las sesiones que necesitas. Así evitas hacer la próxima prueba con poca potencia.
Redactar el veredicto
Fija la regla de decisión antes de mirar: lanzar ante una ganancia significativa, parar ante una pérdida significativa, y en cualquier otro caso llamarlo no concluyente. Entonces el veredicto se calcula, no se discute, y el informe para Jordan cabe en tres frases:
“El grupo del banner convirtió 3.00% frente a 3.84% (−0.84 puntos, −22%); el intervalo del 95% va de −2.38 a +0.70 puntos, p = 0.28. Veredicto: no concluyente. Con 1,068 sesiones por grupo la prueba solo podía detectar cambios de cerca del 61%, así que no puede descartar un efecto típico de un banner en ninguna de las dos direcciones.”
Errores comunes
- Empezar con el aumento relativo. “−22%” solo suena a desastre. Con su intervalo es un encogimiento de hombros.
- Tratar “no concluyente” como “sin efecto”. Una prueba con poca potencia que no encuentra nada ha aprendido muy poco. Di qué tan grande podría haber sido el efecto que habría encontrado.
- Escribir el veredicto a mano. Si la regla está escrita en código, cualquiera puede volver a ejecutarla y obtener la misma conclusión, incluso cuando habría preferido otra.
- Reutilizar la conclusión de fiestas. La temporada, la mezcla de tráfico y el tamaño de la muestra son distintos. Cada prueba tiene su propio informe.
¡Linterna encendida!
Practicaste: ab testconfidence intervalp valueminimum detectable effectwrite up
- Resuelto
- Sin pistas
- Al primer intento
