Level 2 · The bar that looks four times taller

The request

From Daniel Foster, Mobile Product Manager

“Marketing's deck has this chart and the caption says desktop converts 'several times better' than mobile, so they want to move budget away from the app. The bars do look dramatic. Is the gap really that big?”

Your goal

The chart's y axis starts at 2% (0.02), not at zero. Set result to a dict with "looks": how many times taller the desktop bar is drawn than the mobile bar, (desktop - 0.02) / (mobile - 0.02), and "real": the real ratio of the two conversion rates, desktop / mobile. Use the conversion rate (share of sessions with converted True) per device from web_sessions, and round both to 2 decimals.

  • Use the web_sessions DataFramenot done yet
  • Store a dict in resultnot done yet
Conversion rate by device (axis starts at 2%)
Conversion rate by device (axis starts at 2%)2%2.5%3%3.5%4%desktop: 3.9%3.9%desktoptablet: 2.8%2.8%tabletmobile: 2.4%2.4%mobile
Conversion rate by device (axis starts at 2%)2%2.5%3%3.5%4%desktop: 3.9%3.9%desktoptablet: 2.8%2.8%tabletmobile: 2.4%2.4%mobile

The chart from the deck. Look at where the y axis begins.

Show the numbers
conversion_rate
desktop3.9%
tablet2.8%
mobile2.4%

Your code

Python

Loading the editor…

    ResultPreview of web_sessions · press Run to see yours
    Preview of 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 checks your result

    Press Run. Each row that matches the goal becomes a firefly in your lantern.

    DataFrames

    Loaded for you as pandas DataFrames, plus pd and np.

    web_sessions40,000 rows · 7 columns
    • session_idinteger
    • customer_idinteger
    • started_attimestamp
    • devicevarchar
    • sourcevarchar
    • pages_viewedinteger
    • convertedboolean
    First 5 rows of 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 rows · 9 columns
    • customer_idinteger
    • first_namevarchar
    • last_namevarchar
    • emailvarchar
    • cityvarchar
    • statevarchar
    • signup_datedate
    • segmentvarchar
    • referral_sourcevarchar
    First 5 rows of 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 rows · 8 columns
    • product_idinteger
    • namevarchar
    • categoryvarchar
    • subcategoryvarchar
    • unit_pricedecimal
    • unit_costdecimal
    • launched_ondate
    • is_activeboolean
    First 5 rows of 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 rows · 7 columns
    • order_idinteger
    • customer_idinteger
    • order_datetimestamp
    • statusvarchar
    • channelvarchar
    • shipping_feedecimal
    • coupon_codevarchar
    First 5 rows of 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 rows · 6 columns
    • order_item_idinteger
    • order_idinteger
    • product_idinteger
    • quantityinteger
    • unit_pricedecimal
    • discount_pctdecimal
    First 5 rows of 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 rows · 5 columns
    • return_idinteger
    • order_item_idinteger
    • returned_ondate
    • reasonvarchar
    • refund_amountdecimal
    First 5 rows of 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 rows · 8 columns
    • employee_idinteger
    • first_namevarchar
    • last_namevarchar
    • departmentvarchar
    • titlevarchar
    • manager_idinteger
    • hire_datedate
    • salaryinteger
    First 5 rows of 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 rows · 3 columns
    • spend_datedate
    • channelvarchar
    • amountdecimal
    First 5 rows of marketing_spend
    spend_datechannelamount
    2023-01-01paid492.99
    2023-01-01email37.38
    2023-01-01social200.53
    2023-01-02paid709.13
    2023-01-02email64.13

    The lesson

    Bars are read by length

    When people look at a bar chart they compare how long the bars are. That only works if every bar starts from the same place, and that place is zero. Then a bar twice as long means a value twice as large, which is exactly what the eye assumes.

    Cut the axis off at 2% and every bar loses its first 2%. What’s left is not the value but the value minus 2%, and the ratio between two of those leftovers can be anything.

    Measuring the distortion

    The conversion rate is the share of sessions that ended in an order. converted is True or False, and the mean of a True/False column is the share of Trues:

    rates = web_sessions.groupby("device")["converted"].mean()
    # desktop 0.0387, tablet 0.0281, mobile 0.0241

    The real ratio is desktop / mobile. The drawn ratio is (desktop - 0.02) / (mobile - 0.02), because only the part above the axis start is drawn. The closer the smaller value sits to the axis start, the more extreme the drawn ratio gets: move the start up to 2.2% and the same data looks almost eight times taller.

    Is the gap real?

    Yes. Desktop converts better than mobile on every traffic source in this data, and 40,000 sessions make a 1.5-point gap far bigger than chance. The chart’s problem is not the direction, it’s the size. “Desktop converts 1.6 times as often as mobile” is true. “Several times better” is what the axis made up. A budget decision built on the second sentence is built on the axis.

    When a non-zero axis is fine

    Line charts are read by slope and position, not length, so a line chart of daily revenue doesn’t need to start at zero, and forcing it there can flatten real changes. The rule is about bars and areas: anything whose length or filled area is the message must start at zero.

    Common mistakes

    • Trusting the default axis. Some tools pick the axis range from the data. Check where a bar chart’s axis starts before you paste it into a deck.
    • Fixing the chart by adding a note. Readers see the bars before they read the footnote. Redraw it from zero.
    • Describing ratios as differences, or the other way round. “1.5 points higher” and “60% higher” are both true here. Say which one you mean.
    • Comparing rates without the sizes behind them. A rate from 300 sessions is much noisier than one from 20,000. Chapter 3 covers how sure a rate is.

    Pick what may run on this site. You can change this any time from "Cookie settings" at the bottom of every page.