1. Faro

Nivel 10 · Desafío final: el informe del primer vistazo

La solicitud

De Priya Shah, Directora de Datos

“El CEO pidió unas cuantas cifras clave para el dossier del consejo. Cuántos clientes han pedido de verdad, cómo se reparten los pedidos entre canales y cómo se ve nuestro rango de precios.”

Tu objetivo

Paso 1 de 3. Asigna a result el número de clientes distintos que hicieron al menos un pedido (cuenta los customer_id distintos de orders), como un int.

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

Paso 1 · tu código

Python

Cargando el editor…

    ResultadoVista previa de orders · presiona Ejecutar para ver el tuyo
    Vista previa de orders
    order_idcustomer_idorder_datestatuschannel
    10011252023-01-01 20:51:19completedweb
    10021562023-01-02 07:58:46completedweb
    1003222023-01-02 10:25:27completedmarketplace
    1004482023-01-02 11:21:51completedmarketplace

    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 orders · presiona Ejecutar para ver el tuyo
      Vista previa de orders
      order_idcustomer_idorder_datestatuschannel
      10011252023-01-01 20:51:19completedweb
      10021562023-01-02 07:58:46completedweb
      1003222023-01-02 10:25:27completedmarketplace
      1004482023-01-02 11:21:51completedmarketplace

      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 products · presiona Ejecutar para ver el tuyo
        Vista previa de products
        product_idnamecategorysubcategoryunit_price
        101Vale Velvet LoveseatFurnitureSofas1659.00
        102Alder Oak Coffee TableFurnitureTables919.00
        103Orchard Rattan Dining ChairFurnitureChairs789.00
        104Upland Oak BookcaseFurnitureStorage429.00

        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.

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

        Las cifras clave necesitan definiciones precisas

        «¿Cuántos clientes tenemos?» parece simple, pero en este conjunto de datos hay al menos dos respuestas. len(customers) cuenta a todos los que se dieron de alta. orders["customer_id"].nunique() cuenta a todos los que de verdad hicieron un pedido. La diferencia, las personas que se dieron de alta y nunca compraron, es un número que a marketing le importa mucho. Cuando informes una cifra clave, di qué definición usaste.

        Paso 1: distintos frente a totales

        len(orders)                         # 12000 orders
        orders["customer_id"].nunique()     # distinct customers among them

        Un cliente con cinco pedidos aparece cinco veces en orders, así que len cuenta de más a los clientes. nunique() cuenta cada ID una vez. Es uno de los errores más frecuentes en los informes de principiantes, y una de las preguntas de entrevista más frecuentes: «cuenta clientes, no pedidos».

        Paso 2: proporciones en lugar de conteos

        Los consejos y los directivos quieren proporciones, porque comparan a lo largo del tiempo y entre negocios de distintos tamaños:

        orders["channel"].value_counts(normalize=True).round(3)

        normalize=True divide cada conteo entre el total. Redondea al final: .round(3) conserva proporciones como 0.493, que es 49.3%. Si necesitas porcentajes para una diapositiva, multiplica por 100 o da formato con f"{share:.1%}".

        Antes de informar proporciones, comprueba que la columna no tenga valores que faltan (orders["channel"].isna().sum()). value_counts descarta por defecto los valores que faltan, así que las proporciones sumarían 1 en silencio solo sobre las filas conocidas.

        Paso 3: un resumen de precios

        products["unit_price"].describe().round(2)

        El resultado es una Series indexada por el nombre de la estadística, así que puedes extraer números sueltos:

        summary = products["unit_price"].describe()
        summary["50%"]     # the median price
        summary["max"]     # the most expensive product

        Cuando lo presentes, empieza por la mediana y el rango, y menciona que la media la suben los muebles caros. Un resumen que solo diga «precio promedio $270» invita a una imagen equivocada de una tienda donde la mitad de los productos cuesta menos de $154.

        El hábito detrás de este nivel

        Siempre que recibas un conjunto de datos nuevo, haz este tipo de perfil antes de responder ninguna pregunta:

        1. Número de filas y granularidad de cada tabla.
        2. Conteos distintos de los ID clave.
        3. value_counts(dropna=False) en cada columna de categorías.
        4. describe() en cada columna numérica.
        5. isna().sum() en todas partes.

        Lleva cinco minutos y detecta la mayoría de los problemas de datos antes de que lleguen a un informe: los clientes duplicados, los costos que faltan y las cantidades raras que tratarás en el capítulo de limpieza aparecen todos en estas mismas comprobaciones.

        Errores comunes

        • Usar len(orders) o orders["customer_id"].count() para clientes distintos. count() cuenta los valores que no faltan, no los distintos.
        • Olvidar normalize=True y devolver conteos.
        • Redondear la columna antes de describe(), lo que cambia las estadísticas. Redondea el resumen.

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