1. Faro

Nivel 6 · Desafío final: el canal que se ve peor

La solicitud

De Jordan Reyes, Director de marketing

“Los clientes que nos encuentran en Pinterest gastan unos $100 más por pedido que los de Google Ads, así que quiero mover presupuesto de Google Ads a Pinterest. Antes de hacerlo, ¿puedes comprobar que la comparación es justa?”

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
Average completed-order value by referral source
Average completed-order value by referral source$0$250$500$750$1,000$1,250All orders, google_ads: $535.22All orders, pinterest: $632.14All ordersBusiness orders, google_ads: $1,172Business orders, pinterest: $1,027Business ordersConsumer orders, google_ads: $374.4Consumer orders, pinterest: $350.71Consumer ordersgoogle_adspinterest
Average completed-order value by referral source$0$250$500$750$1,000$1,250All orders, google_ads: $535.22All orders, pinterest: $632.14All ordersBusiness orders, google_ads: $1,172Business orders, pinterest: $1,027Consumer orders, google_ads: $374.4Consumer orders, pinterest: $350.71Consumer ordersgoogle_adspinterest

Overall, pinterest is ahead. Inside each segment, google_ads is ahead. Both are true at the same time.

Ver los números
google_adspinterest
All orders$535.22$632.14
Business orders$1,172$1,027
Consumer orders$374.4$350.71

Paso 1 · tu código

Python

Cargando el editor…

    ResultadoVista previa de customers · presiona Ejecutar para ver el tuyo
    Vista previa de customers
    customer_idfirst_namelast_nameemailcity
    1OwenHudsonowen.hudson@icloud.comSan Francisco
    2DouglasMendozadmendoza69@gmail.comAtlanta
    3HenryBrookshbrooks@lakesidecafe.comLos Angeles
    4BrianGrahambgraham@bluecedarhomes.comSeattle

    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

    Python

    Cargando el editor…

      ResultadoVista previa de customers · presiona Ejecutar para ver el tuyo
      Vista previa de customers
      customer_idfirst_namelast_nameemailcity
      1OwenHudsonowen.hudson@icloud.comSan Francisco
      2DouglasMendozadmendoza69@gmail.comAtlanta
      3HenryBrookshbrooks@lakesidecafe.comLos Angeles
      4BrianGrahambgraham@bluecedarhomes.comSeattle

      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

      Python

      Cargando el editor…

        ResultadoVista previa de customers · presiona Ejecutar para ver el tuyo
        Vista previa de customers
        customer_idfirst_namelast_nameemailcity
        1OwenHudsonowen.hudson@icloud.comSan Francisco
        2DouglasMendozadmendoza69@gmail.comAtlanta
        3HenryBrookshbrooks@lakesidecafe.comLos Angeles
        4BrianGrahambgraham@bluecedarhomes.comSeattle

        Mote revisa tu resultado

        Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

        DataFrames

        Cargados como DataFrames de pandas, junto con pd y np.

        customers2,018 filas · 9 columnas
        • customer_idinteger
        • first_namevarchar
        • last_namevarchar
        • emailvarchar
        • cityvarchar
        • statevarchar
        • signup_datedate
        • segmentvarchar
        • referral_sourcevarchar
        Primeras 5 filas de customers
        customer_idfirst_namelast_nameemailcitystatesignup_datesegmentreferral_source
        1OwenHudsonowen.hudson@icloud.comSan FranciscoCA2022-06-02consumersearch
        2DouglasMendozadmendoza69@gmail.comAtlantaGA2022-06-02consumerNaN
        3HenryBrookshbrooks@lakesidecafe.comLos AngelesCA2022-06-04businessNaN
        4BrianGrahambgraham@bluecedarhomes.comSeattleWA2022-06-06businesspinterest
        5KyleJimenezkjimenez27@yahoo.comIndianapolisIN2022-06-07consumerNaN
        orders12,000 filas · 7 columnas
        • order_idinteger
        • customer_idinteger
        • order_datetimestamp
        • statusvarchar
        • channelvarchar
        • shipping_feedecimal
        • coupon_codevarchar
        Primeras 5 filas de orders
        order_idcustomer_idorder_datestatuschannelshipping_feecoupon_code
        10011252023-01-01 20:51:19completedweb0.00NaN
        10021562023-01-02 07:58:46completedweb0.00NaN
        1003222023-01-02 10:25:27completedmarketplace4.99WELCOME10
        1004482023-01-02 11:21:51completedmarketplace4.99WELCOME10
        1005822023-01-02 11:43:36completedweb0.00WELCOME10
        order_items30,338 filas · 6 columnas
        • order_item_idinteger
        • order_idinteger
        • product_idinteger
        • quantityinteger
        • unit_pricedecimal
        • discount_pctdecimal
        Primeras 5 filas de order_items
        order_item_idorder_idproduct_idquantityunit_pricediscount_pct
        11001121931.990.00
        21001154311.990.00
        31002154411.990.00
        410021941149.000.00
        51002193219.990.00
        products120 filas · 8 columnas
        • product_idinteger
        • namevarchar
        • categoryvarchar
        • subcategoryvarchar
        • unit_pricedecimal
        • unit_costdecimal
        • launched_ondate
        • is_activeboolean
        Primeras 5 filas de products
        product_idnamecategorysubcategoryunit_priceunit_costlaunched_onis_active
        101Vale Velvet LoveseatFurnitureSofas1659.00NaN2023-09-11true
        102Alder Oak Coffee TableFurnitureTables919.00503.502024-05-16true
        103Orchard Rattan Dining ChairFurnitureChairs789.00429.872023-05-27true
        104Upland Oak BookcaseFurnitureStorage429.00214.702022-12-20true
        105Avery Leather Bed FrameFurnitureBeds449.00232.702021-08-31true
        returns1,673 filas · 5 columnas
        • return_idinteger
        • order_item_idinteger
        • returned_ondate
        • reasonvarchar
        • refund_amountdecimal
        Primeras 5 filas de returns
        return_idorder_item_idreturned_onreasonrefund_amount
        1142023-01-10damaged83.69
        2422023-01-10wrong_item19.99
        31052023-01-14wrong_item10.99
        4242023-01-16changed_mind26.99
        51262023-01-16late20.99
        employees60 filas · 8 columnas
        • employee_idinteger
        • first_namevarchar
        • last_namevarchar
        • departmentvarchar
        • titlevarchar
        • manager_idinteger
        • hire_datedate
        • salaryinteger
        Primeras 5 filas de employees
        employee_idfirst_namelast_namedepartmenttitlemanager_idhire_datesalary
        1CatherineHaleExecutiveChief Executive OfficerNaN2016-03-01285000
        2RobertKimExecutiveChief Operating Officer12017-01-09235000
        3MeganCollinsSalesHead of Sales12018-04-16172000
        4ChloeGutierrezSalesAccount Executive32020-01-2172000
        5FrankBellSalesAccount Executive32023-05-2173000
        web_sessions40,000 filas · 7 columnas
        • session_idinteger
        • customer_idinteger
        • started_attimestamp
        • devicevarchar
        • sourcevarchar
        • pages_viewedinteger
        • convertedboolean
        Primeras 5 filas de web_sessions
        session_idcustomer_idstarted_atdevicesourcepages_viewedconverted
        1NaN2023-01-01 23:02:24mobilepaid1false
        2182023-01-01 15:07:49desktoppaid1false
        3NaN2023-01-01 16:55:46desktopdirect7false
        4NaN2023-01-01 12:43:28mobileorganic3false
        5NaN2023-01-01 13:06:21mobilesocial2false
        marketing_spend3,276 filas · 3 columnas
        • spend_datedate
        • channelvarchar
        • amountdecimal
        Primeras 5 filas de marketing_spend
        spend_datechannelamount
        2023-01-01paid492.99
        2023-01-01email37.38
        2023-01-01social200.53
        2023-01-02paid709.13
        2023-01-02email64.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%
        pinterest 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.

        Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.