La solicitud

De Andrew Ramos, Gerente de Marketing
Tu objetivo
Asigna a result un DataFrame con una fila por cada source de web_sessions (todos los años) y las columnas source, sessions (número de sesiones), conversions (sesiones convertidas), conversion_rate_pct (conversions * 100 / sessions) y known_rate_pct (conversions * 100 / sesiones con un customer_id), ambas tasas redondeadas a 2. Ordena por conversion_rate_pct descendente, con un índice nuevo 0..n-1.
- Usa el DataFrame
web_sessionspendiente - Muestra exactamente
sourcesessionsconversionsconversion_rate_pctknown_rate_pctpendiente - 5 filas, ordenadas como se pidependiente
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 Andrew, 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
Una tasa por fuente
Una diapositiva de canales necesita la tasa de conversión de cada fuente de tráfico. Es la misma fórmula de antes, calculada por grupo:
s.groupby("source").agg(sessions=("session_id", "size"), conversions=("converted", "sum"))
converted es una columna booleana, así que al sumarla cuentas las sesiones convertidas. Si divides
las conversiones entre las sesiones de cada fila, obtienes la tasa de cada fuente. De 2023 a 2025, el
email convierte el 9.41% y social el 0.62%: una brecha de quince veces.
El denominador decide la historia
El 5% de la agencia sale de un denominador distinto. En estos datos una conversión solo se registra para un cliente conocido, con sesión iniciada, así que las sesiones anónimas nunca pueden convertir. Si divides solo entre las sesiones conocidas, todas las tasas suben, y en cantidades muy distintas:
| source | proporción anónima | todas las sesiones | solo conocidas |
|---|---|---|---|
| 10.7% | 9.41% | 10.54% | |
| organic | 65.3% | 1.83% | 5.28% |
| social | 71.3% | 0.62% | 2.18% |
El tráfico de email es casi todo de clientes conocidos que hacen clic en un boletín, así que las dos tasas se parecen. Organic y social traen sobre todo visitantes nuevos y anónimos, así que quitarlos casi triplica la tasa.
Cuál va en la diapositiva
La tasa de todas las sesiones responde “del tráfico que trae esta fuente, ¿cuánto compra?”. Esa es la pregunta de marketing, y es el KPI. La tasa de solo conocidos responde “una vez que un visitante ha iniciado sesión, ¿qué tan probable es que compre?”. Sirve para diagnosticar el pago y engaña si se usa para comparar canales, porque oculta cuánto del tráfico de cada canal nunca llega tan lejos.
Puedes dar las dos, pero etiqueta el denominador en el nombre de la columna, como hace esta tarea.
Errores comunes
- Promediar banderas por sesión en el lugar equivocado.
s["converted"].mean()es la tasa global; por fuente necesitas la media del grupo o los dos conteos. - Filtrar
customer_id.notna()sin avisar al principio del análisis “para limpiar los datos”. Las sesiones anónimas no están sucias, son la mayor parte del tráfico. - Ordenar sin reiniciar el índice, lo que deja atrás las etiquetas de fila antiguas.
¡Linterna encendida!
Practicaste: conversion rategroupbynamed aggregationdenominatorstraffic source
- Resuelto
- Sin pistas
- Al primer intento
