La solicitud

De Jordan Reyes, Director de marketing
Tu objetivo
Paso 1 de 3. Asigna a result un dict con la media de order_value por fuente de referencia, redondeada a 2 decimales: claves "google_ads" y "pinterest".
- Usa el DataFrame
customerspendiente - Usa el DataFrame
orderspendiente - Guarda un dict en
resultpendiente
Paso 2 de 3. Asigna a result un DataFrame con una fila por segment (business, consumer) y una columna por fuente de referencia (google_ads, pinterest), con la media de order_value, redondeada a 2 decimales.
- Usa el DataFrame
customerspendiente - Usa el DataFrame
orderspendiente - Muestra exactamente
segmentgoogle_adspinterestpendiente
Paso 3 de 3. Iguala la mezcla. by_segment (en el código inicial) tiene el valor promedio de pedido por segmento y fuente. Pondera las medias por segmento de cada fuente con la proporción de cada segmento entre todos los pedidos de two, y asigna a result un dict con los promedios ponderados, claves "google_ads" y "pinterest", redondeados a 2 decimales.
- Usa el DataFrame
customerspendiente - Usa el DataFrame
orderspendiente - Guarda un dict en
resultpendiente
Overall, pinterest is ahead. Inside each segment, google_ads is ahead. Both are true at the same time.
Ver los números
| google_ads | ||
|---|---|---|
| All orders | $535.22 | $632.14 |
| Business orders | $1,172 | $1,027 |
| Consumer orders | $374.4 | $350.71 |
Paso 1 · tu código
Cargando el editor…
Solución de referencia
| customer_id | first_name | last_name | city | |
|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle |
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
| customer_id | first_name | last_name | city | |
|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle |
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
| customer_id | first_name | last_name | city | |
|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle |
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.
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 |
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 |
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 |
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 |
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 |
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 paradoja de Simpson
La paradoja de Simpson es cuando una comparación apunta en un sentido en cada subgrupo y en el sentido contrario cuando se juntan los subgrupos. Suena a truco. Es algo corriente, y ocurre siempre que dos grupos contienen mezclas distintas de algo que afecta con fuerza al resultado.
En Harbor & Pine ese algo es el segmento. Los pedidos completados de clientes de empresas promedian unos $1,050; los de consumidores, unos $350. Cualquier grupo con más clientes de empresas tendrá un valor promedio de pedido mayor, sean quienes sean esos clientes.
La mezcla detrás de la brecha total
pd.crosstab(two["referral_source"], two["segment"], normalize="index")
| referral_source | business | consumer |
|---|---|---|
| google_ads | 20% | 80% |
| 42% | 58% |
Pinterest trae el doble de proporción de clientes de empresas. Su promedio total sube por esa mezcla, no porque sus clientes gasten más que clientes comparables de Google Ads. Dentro de cada segmento, la comparación va en sentido contrario.
Igualar la mezcla
Para comparar con justicia, da a ambas fuentes la misma mezcla y recalcula. Toma un solo conjunto de pesos (las proporciones de segmento de todos los pedidos de ambas fuentes, 31% business y 69% consumer) y promedia las medias por segmento de cada fuente con esos pesos:
mix = two["segment"].value_counts(normalize=True)
by_segment.mul(mix, axis=0).sum()
Esto se llama estandarización. Responde: “¿cuál sería el promedio de cada fuente si ambas tuvieran los mismos clientes por segmento?”
¿Qué tan segura es la inversión?
No mucho, y decirlo es parte del trabajo. Los valores de pedido varían bastante (una desviación estándar de unos $1,150 en los pedidos de empresas), y hay solo 155 pedidos de empresas de google_ads. Las brechas dentro de cada segmento, de $145 y $24, quedan muy dentro de lo que produce el azar con grupos de este tamaño. El hallazgo sólido es el negativo: la brecha total de $97 es un efecto de mezcla, así que no es razón para mover presupuesto.
Errores comunes
- Comparar promedios agrupados de grupos con composiciones distintas. Pregunta siempre qué impulsa el resultado y luego comprueba si los grupos difieren en eso.
- Declarar ganador al resultado invertido. La inversión puede ser ruido; el efecto de mezcla es el hallazgo.
- Estandarizar con la mezcla propia de un grupo. Usa una mezcla común para ambos, o la comparación sigue inclinada.
- Dividir por cada columna hasta que algo se invierta. Elige la variable que impulsa el resultado por una razón que puedas explicar, antes de mirar.
¡Linterna encendida!
Practicaste: simpsons paradoxconfoundersegment mixstandardizationpivot table
- Resuelto
- Sin pistas
- Al primer intento
