La solicitud

De Jessica Turner, Gerente de merchandising

“Antes de cambiar precios, me gustaría tener un número para algo en lo que todos creemos: los productos caros venden menos unidades. ¿Qué tan fuerte es en realidad esa relación en todo nuestro catálogo?”

Tu objetivo

Asigna a result un dict con dos claves, ambas redondeadas a 3 decimales: "pearson", la correlación entre per_product["unit_price"] y per_product["units_sold"], y "rank", la correlación entre sus rangos (.rank() de cada columna y luego .corr()).

  • Usa el DataFrame productspendiente
  • Usa el DataFrame orderspendiente
  • Guarda un dict en resultpendiente
Units sold by list price, one dot per product
Units sold by list price, one dot per product05001,0001,5002,0002,500$0$500$1,000$1,500$2,000$31.99, 571$11.99, 1,568$159, 787$19.99, 2,320$25.99, 812$53.99, 1,349$92.99, 507$349, 309$20.99, 2,017$159, 559$66.99, 96$70.99, 423$1,599, 163$28.99, 2,300$239, 293$17.99, 1,704$149, 214$179, 384$189, 606$27.99, 842$25.99, 601$76.99, 433$259, 370$104.99, 1,325$189, 568$13.99, 1,035$289, 205$169, 592$53.99, 772$159, 190$45.99, 687$179, 268$379, 1,046$38.99, 664$54.99, 648$179, 354$109, 545$43.99, 1,122$179, 766$189, 629$109, 324$369, 101$72.99, 467$29.99, 1,318$93.99, 747$409, 113$18.99, 402$10.99, 1,527$329, 139$84.99, 360$179, 195$449, 152$30.99, 546$199, 305$52.99, 1,645$50.99, 716$259, 143$78.99, 180$219, 317$129, 196$86.99, 83$289, 514$23.99, 517$249, 331$629, 98$439, 79$79.99, 206$74.99, 509$779, 37$429, 39$1,099, 208$51.99, 238$1,379, 33$779, 88$1,609, 105$689, 56$219, 64$969, 45$669, 53$169, 115$349, 465$13.99, 743$789, 37$16.99, 853$219, 114$72.99, 169$1,659, 44$60.99, 792$999, 208$1,209, 25$109, 105$169, 492$379, 34$15.99, 454$179, 100$239, 54$19.99, 1,061$919, 46$20.99, 744$229, 377$30.99, 226$17.99, 295$189, 167$519, 77$159, 71$44.99, 790$51.99, 211$70.99, 356$139, 138$139, 447$289, 23$12.99, 407$109, 135$279, 29$279, 8$18.99, 195$1,289, 6$17.99, 305$103.99, 35$869, 13List priceUnits sold, 2023–2025
Units sold by list price, one dot per product05001,0001,5002,0002,500$0$500$1,000$1,500$2,000$31.99, 571$11.99, 1,568$159, 787$19.99, 2,320$25.99, 812$53.99, 1,349$92.99, 507$349, 309$20.99, 2,017$159, 559$66.99, 96$70.99, 423$1,599, 163$28.99, 2,300$239, 293$17.99, 1,704$149, 214$179, 384$189, 606$27.99, 842$25.99, 601$76.99, 433$259, 370$104.99, 1,325$189, 568$13.99, 1,035$289, 205$169, 592$53.99, 772$159, 190$45.99, 687$179, 268$379, 1,046$38.99, 664$54.99, 648$179, 354$109, 545$43.99, 1,122$179, 766$189, 629$109, 324$369, 101$72.99, 467$29.99, 1,318$93.99, 747$409, 113$18.99, 402$10.99, 1,527$329, 139$84.99, 360$179, 195$449, 152$30.99, 546$199, 305$52.99, 1,645$50.99, 716$259, 143$78.99, 180$219, 317$129, 196$86.99, 83$289, 514$23.99, 517$249, 331$629, 98$439, 79$79.99, 206$74.99, 509$779, 37$429, 39$1,099, 208$51.99, 238$1,379, 33$779, 88$1,609, 105$689, 56$219, 64$969, 45$669, 53$169, 115$349, 465$13.99, 743$789, 37$16.99, 853$219, 114$72.99, 169$1,659, 44$60.99, 792$999, 208$1,209, 25$109, 105$169, 492$379, 34$15.99, 454$179, 100$239, 54$19.99, 1,061$919, 46$20.99, 744$229, 377$30.99, 226$17.99, 295$189, 167$519, 77$159, 71$44.99, 790$51.99, 211$70.99, 356$139, 138$139, 447$289, 23$12.99, 407$109, 135$279, 29$279, 8$18.99, 195$1,289, 6$17.99, 305$103.99, 35$869, 13List priceUnits sold, 2023–2025

The dashed line is the best straight line through the dots. The dots bend: steep at low prices, nearly flat above $500.

Ver los números
List priceUnits sold, 2023–2025
$31.99571
$11.991,568
$159787
$19.992,320
$25.99812
$53.991,349
$92.99507
$349309
$20.992,017
$159559
$66.9996
$70.99423
$1,599163
$28.992,300
$239293
$17.991,704
$149214
$179384
$189606
$27.99842
$25.99601
$76.99433
$259370
$104.991,325
$189568
$13.991,035
$289205
$169592
$53.99772
$159190
$45.99687
$179268
$3791,046
$38.99664
$54.99648
$179354
$109545
$43.991,122
$179766
$189629
$109324
$369101
$72.99467
$29.991,318
$93.99747
$409113
$18.99402
$10.991,527
$329139
$84.99360
$179195
$449152
$30.99546
$199305
$52.991,645
$50.99716
$259143
$78.99180
$219317
$129196
$86.9983
$289514
$23.99517
$249331
$62998
$43979
$79.99206
$74.99509
$77937
$42939
$1,099208
$51.99238
$1,37933
$77988
$1,609105
$68956
$21964
$96945
$66953
$169115
$349465
$13.99743
$78937
$16.99853
$219114
$72.99169
$1,65944
$60.99792
$999208
$1,20925
$109105
$169492
$37934
$15.99454
$179100
$23954
$19.991,061
$91946
$20.99744
$229377
$30.99226
$17.99295
$189167
$51977
$15971
$44.99790
$51.99211
$70.99356
$139138
$139447
$28923
$12.99407
$109135
$27929
$2798
$18.99195
$1,2896
$17.99305
$103.9935
$86913

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.

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

    Qué mide una correlación

    El coeficiente de correlación r es un número de -1 a 1 que dice qué tan de cerca se mueven dos columnas a lo largo de una línea recta:

    • cerca de 1: cuando una es alta, la otra es alta, casi sobre una recta ascendente;
    • cerca de -1: cuando una es alta, la otra es baja, casi sobre una recta descendente;
    • cerca de 0: no hay un patrón de línea recta.

    En pandas es una sola llamada sobre dos Series de la misma longitud:

    per_product["unit_price"].corr(per_product["units_sold"])   # -0.425

    Entre los 120 productos de Harbor & Pine, r es -0.425: los productos más caros venden menos unidades, pero los puntos están lejos de una recta ordenada. Una regla práctica común llama débil a 0.1, moderada a 0.3 y fuerte a 0.5, pero el número solo nunca te dice la forma. Mira el gráfico.

    Cuando Pearson subestima una curva

    La r de Pearson (el .corr() por defecto) premia una línea recta. Los puntos del gráfico se curvan: las unidades caen en picada desde los juegos de tazones y jarrones de $11 hasta las lámparas de $200, y luego casi no cambian desde las sillas de comedor de $800 hasta el sofá de dos plazas de $1,659. La recta de mejor ajuste punteada falla en ambos extremos, así que r se ve apenas moderada.

    Una correlación de rangos (la de Spearman) hace una pregunta más laxa: a medida que sube el precio, ¿bajan las unidades, sea cual sea la forma? Reemplaza cada valor por su rango (1 = el más barato) y correlaciona los rangos:

    per_product["unit_price"].rank().corr(per_product["units_sold"].rank())   # -0.694

    -0.694 es una relación negativa fuerte. Con SciPy instalado, .corr(method="spearman") da el mismo número; ordenar por rangos primero funciona en todas partes, incluido este navegador.

    Lo que r no te dice

    • No es la pendiente. r = -0.7 no significa “cada dólar extra cuesta 0.7 unidades”. El tamaño del efecto es una pregunta de regresión (nivel 3).
    • No es la causa. El extremo barato es menaje de cocina, decoración y textiles, que compran muchísimos más clientes; el extremo caro son muebles y juegos de exterior. El precio está enredado con lo que es el producto, así que este gráfico no puede decir qué haría un recorte de precio a las unidades.
    • No es robusta a los valores atípicos. Un producto con ventas enormes puede mover r mucho. Los rangos son mucho menos sensibles.

    Errores comunes

    • Reportar r sin el diagrama de dispersión. Formas muy distintas pueden compartir la misma r.
    • Llamar “sin relación” a una r moderada. Aquí r = -0.43 esconde un patrón fuerte y curvo.
    • Mezclar granularidades. Correlacionar el precio con las unidades por línea de pedido en lugar de por producto cuenta cientos de veces los productos populares. Decide qué es una fila (aquí: un producto), construye ambas columnas en un solo DataFrame con esa granularidad y luego correlaciona.

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