1. Faro

Nivel 10 · Desafío final: ¿quién convierte en el sitio web?

La solicitud

De Jordan Reyes, Director de Marketing

“Antes de mover presupuesto quiero tres datos de las sesiones: cuántas visitas móviles de pago convirtieron, qué tan bien convierten nuestros visitantes comprometidos y cómo son nuestras visitas de correo más comprometidas.”

Tu objetivo

Paso 1 de 3. Asigna a result el número de sesiones (un int) donde device es 'mobile', source es 'paid' y converted es True.

  • Usa el DataFrame web_sessionspendiente
  • Guarda un número en resultpendiente

Paso 1 · tu código

Python

Cargando el editor…

    ResultadoVista previa de web_sessions · presiona Ejecutar para ver el tuyo
    Vista previa de web_sessions
    session_idcustomer_idstarted_atdevicesource
    1NaN2023-01-01 23:02:24mobilepaid
    2182023-01-01 15:07:49desktoppaid
    3NaN2023-01-01 16:55:46desktopdirect
    4NaN2023-01-01 12:43:28mobileorganic

    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 web_sessions · presiona Ejecutar para ver el tuyo
      Vista previa de web_sessions
      session_idcustomer_idstarted_atdevicesource
      1NaN2023-01-01 23:02:24mobilepaid
      2182023-01-01 15:07:49desktoppaid
      3NaN2023-01-01 16:55:46desktopdirect
      4NaN2023-01-01 12:43:28mobileorganic

      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 web_sessions · presiona Ejecutar para ver el tuyo
        Vista previa de web_sessions
        session_idcustomer_idstarted_atdevicesource
        1NaN2023-01-01 23:02:24mobilepaid
        2182023-01-01 15:07:49desktoppaid
        3NaN2023-01-01 16:55:46desktopdirect
        4NaN2023-01-01 12:43:28mobileorganic

        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.

        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
        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
        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
        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
        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
        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

        Un conjunto de datos de embudo

        web_sessions tiene una fila por visita al sitio web: cuándo empezó, el dispositivo, la fuente de tráfico, cuántas páginas vio el visitante y si la visita terminó en una compra. Son 40,000 filas, y cada pregunta de este nivel es un filtro seguido de un conteo, una proporción o una ordenación.

        Paso 1: contar con una máscara

        No necesitas filtrar filas para contarlas. Una máscara es una columna de True y False, y True cuenta como 1:

        mask = (
            (web_sessions["device"] == "mobile")
            & (web_sessions["source"] == "paid")
            & web_sessions["converted"]
        )
        mask.sum()

        Fíjate en que la última condición no lleva == True. converted ya es booleana, así que es una máscara por sí sola. Escribir web_sessions["converted"] == True también funciona, pero es redundante. .sum() sobre una máscara devuelve un entero de NumPy; envolverlo en int() da un número normal de Python.

        Paso 2: una tasa es una media

        La proporción de sesiones que convirtieron es el número de valores True dividido entre el número de filas, que es exactamente la media de una columna booleana:

        engaged = web_sessions[web_sessions["pages_viewed"] >= 10]
        engaged["converted"].mean()

        Este es uno de los trucos más útiles de pandas. La tasa de conversión, la tasa de devoluciones, la proporción de pedidos con cupón: cada una es la .mean() de la máscara correcta, sobre el conjunto de filas correcto. El «conjunto de filas correcto» es la parte importante. La conversión «entre las sesiones comprometidas» tiene un denominador distinto al de la conversión sobre todas las sesiones, y confundirlos es uno de los errores más comunes en los informes de embudo.

        Compárala con la tasa general, web_sessions["converted"].mean(). La tasa de las comprometidas es mucho más alta, lo cual es esperable: alguien que navega diez páginas tiene muchas más probabilidades de comprar. Eso no significa que hacer que la gente vea más páginas haría que comprara; la interacción y la intención de compra se mueven juntas. Mantén separadas la correlación y la causa cuando presentes esto.

        Paso 3: una lista ordenada

        email = web_sessions[web_sessions["source"] == "email"]
        (
            email.sort_values(["pages_viewed", "session_id"], ascending=[False, True])
            .head(15)[["session_id", "device", "pages_viewed", "converted"]]
            .reset_index(drop=True)
        )

        Muchas sesiones comparten el mismo número de páginas, así que session_id como desempate hace la lista reproducible. Filtra primero, ordena después: ordenar 40,000 filas y filtrar más tarde da la misma respuesta pero hace más trabajo, y es más fácil equivocarse en el orden de los pasos.

        Leer los resultados como un profesional de marketing

        • Un conteo de conversiones sin denominador es difícil de juzgar. «51 conversiones móviles de pago» significa poco hasta que sabes cuántas sesiones móviles de pago hubo.
        • Las sesiones sin customer_id son visitantes anónimos. En este conjunto de datos, solo convierten los clientes conocidos, lo que refleja cómo muchas tiendas registran las compras.

        Errores comunes

        • Usar and entre máscaras en lugar de &.
        • Calcular la proporción del paso 2 sobre todas las sesiones en lugar de sobre las comprometidas.
        • Ordenar solo por pages_viewed, de modo que la fila 15 cambia entre ejecuciones.

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