<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Analyst&#39;s diary</title>
<link>https://www.analystsdiary.com/</link>
<atom:link href="https://www.analystsdiary.com/index.xml" rel="self" type="application/rss+xml"/>
<description>An independent analytical platform for data, insights and meaningful observations.</description>
<generator>quarto-1.6.40</generator>
<lastBuildDate>Mon, 24 Aug 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>What if the fastest way to board a plane is one airlines barely use?</title>
  <link>https://www.analystsdiary.com/posts/aviation/boarding-fastest-method.html</link>
  <description><![CDATA[ 




<style>
.quarto-title-block { display: none; }

.boarding-story { max-width: 100%; }
.boarding-story h1, .boarding-story h2, .boarding-story h3,
.boarding-story h4, .boarding-story h5 {
    font-family: Inter, Arial, Helvetica, sans-serif;
    letter-spacing: normal;
}
.boarding-story a { text-decoration: none; }
#quarto-content > * { padding-top: 0; }
.boarding-story .hero { border-radius: 4px; overflow: hidden; }

.boarding-story {

    --wine: #8C1D40;
    --wine-dark: #64142E;
    --gold: #D6A84B;

    --ink: #191919;
    --muted: #6A6A6A;

    --soft: #F6F3F4;
    --line: #E6E1E3;

    --white: #FFFFFF;
}

.boarding-story * {

    box-sizing:
        border-box;
}

html {

    scroll-behavior:
        smooth;
}

.boarding-story {

    margin: 0;

    background:
        var(--white);

    color:
        var(--ink);

    font-family:
        Inter,
        Arial,
        Helvetica,
        sans-serif;

    line-height:
        1.6;
}

.boarding-story .site-header {

    position:
        fixed;

    top: 0;
    left: 0;
    right: 0;

    height:
        64px;

    display:
        flex;

    align-items:
        center;

    justify-content:
        space-between;

    padding:
        0 4vw;

    background:
        rgba(
            255,
            255,
            255,
            .94
        );

    backdrop-filter:
        blur(10px);

    border-bottom:
        1px solid
        rgba(
            0,
            0,
            0,
            .05
        );

    z-index:
        1000;
}

.boarding-story .site-logo {

    width:
        120px;
}

.boarding-story .nav {

    display:
        flex;

    gap:
        22px;

    font-size:
        13px;
}

.boarding-story .nav a {

    color:
        var(--ink);

    text-decoration:
        none;
}

.boarding-story .nav a:hover {

    color:
        var(--wine);
}

.boarding-story .hero {

    min-height:
        92vh;

    position:
        relative;

    display:
        flex;

    align-items:
        flex-end;

    background-image:

        linear-gradient(
            180deg,
            rgba(0,0,0,.04),
            rgba(0,0,0,.76)
        ),

        url(
            "/assets/boarding/PLANE.jpg"
        );

    background-size:
        cover;

    background-position:
        center;

    color:
        white;
}

.boarding-story .hero-inner {

    width:
        min(
            1100px,
            92vw
        );

    margin:
        0 auto;

    padding:
        150px 0
        76px;
}

.boarding-story .eyebrow {

    display:
        inline-block;

    padding:
        6px 10px;

    margin-bottom:
        20px;

    border:
        1px solid
        rgba(
            255,
            255,
            255,
            .45
        );

    border-radius:
        100px;

    font-size:
        12px;

    letter-spacing:
        .08em;

    text-transform:
        uppercase;
}

.boarding-story .hero h1 {

    max-width:
        930px;

    margin:
        0;

    font-size:
        clamp(
            44px,
            7vw,
            86px
        );

    line-height:
        .99;

    letter-spacing:
        -.045em;
}

.boarding-story .hero-sub {

    max-width:
        760px;

    margin-top:
        28px;

    font-size:
        clamp(
            18px,
            2vw,
            24px
        );

    color:
        rgba(
            255,
            255,
            255,
            .88
        );
}

.boarding-story .byline {

    margin-top:
        28px;

    font-size:
        13px;

    color:
        rgba(
            255,
            255,
            255,
            .72
        );
}

.boarding-story .section {

    width:
        min(
            1080px,
            92vw
        );

    margin:
        0 auto;

    padding:
        95px 0;
}

.boarding-story .section.narrow {

    width:
        min(
            770px,
            90vw
        );
}

.boarding-story .section-label {

    color:
        var(--wine);

    font-size:
        12px;

    font-weight:
        800;

    letter-spacing:
        .10em;

    text-transform:
        uppercase;
}

.boarding-story h2 {

    max-width:
        900px;

    margin:
        10px 0
        24px;

    font-size:
        clamp(
            32px,
            5vw,
            56px
        );

    line-height:
        1.05;

    letter-spacing:
        -.035em;
}

.boarding-story h3 {

    margin-top:
        0;

    font-size:
        28px;

    line-height:
        1.15;
}

.boarding-story .lead {

    max-width:
        800px;

    font-size:
        20px;

    color:
        #454545;
}

.boarding-story .divider {

    height:
        1px;

    background:
        var(--line);
}

.boarding-story .context-box {

    margin-top:
        38px;

    padding:
        30px 34px;

    background:
        var(--soft);

    border-radius:
        18px;

    border-left:
        5px solid
        var(--wine);
}

.boarding-story .context-box strong {

    color:
        var(--wine);
}

.boarding-story .stats-grid {

    display:
        grid;

    grid-template-columns:
        repeat(
            3,
            1fr
        );

    gap:
        18px;

    margin-top:
        48px;
}

.boarding-story .stat-card {

    padding:
        28px;

    background:
        var(--soft);

    border-radius:
        15px;
}

.boarding-story .stat-label {

    color:
        var(--muted);

    font-size:
        12px;

    text-transform:
        uppercase;

    letter-spacing:
        .08em;
}

.boarding-story .stat-value {

    margin-top:
        8px;

    font-size:
        32px;

    font-weight:
        800;
}

.boarding-story .strategy-grid {

    display:
        grid;

    grid-template-columns:
        repeat(
            2,
            1fr
        );

    gap:
        18px;

    margin-top:
        42px;
}

.boarding-story .strategy-card {

    position:
        relative;

    padding:
        28px;

    border:
        1px solid
        var(--line);

    border-top:
        5px solid
        var(--strategy-color);

    border-radius:
        14px;

    background:
        white;
}

.boarding-story .strategy-name {

    font-size:
        21px;

    font-weight:
        850;
}

.boarding-story .strategy-short {

    margin-top:
        8px;

    font-weight:
        700;

    color:
        var(--strategy-color);
}

.boarding-story .strategy-text {

    margin-top:
        17px;

    color:
        #4A4A4A;

    font-size:
        14px;
}

.boarding-story .explorer-shell {

    margin-top:
        38px;

    padding:
        28px;

    background:
        #FAFAFA;

    border:
        1px solid
        var(--line);

    border-radius:
        20px;
}

.boarding-story .controls {

    display:
        grid;

    grid-template-columns:
        1.2fr
        1.4fr
        auto
        auto
        .7fr;

    gap:
        12px;

    align-items:
        end;

    margin-bottom:
        22px;
}

.boarding-story .control {

    display:
        flex;

    flex-direction:
        column;

    gap:
        5px;
}

.boarding-story .control label {

    font-size:
        11px;

    font-weight:
        800;

    color:
        var(--muted);

    text-transform:
        uppercase;
}

.boarding-story select, .boarding-story input, .boarding-story button {

    font:
        inherit;
}

.boarding-story select, .boarding-story input[type="number"] {

    width:
        100%;

    padding:
        10px 12px;

    background:
        white;

    border:
        1px solid
        #CFCFCF;

    border-radius:
        7px;
}

.boarding-story button {

    padding:
        10px 18px;

    border:
        1px solid
        #D0D0D0;

    border-radius:
        7px;

    background:
        white;

    cursor:
        pointer;
}

.boarding-story button.primary {

    border-color:
        var(--wine);

    background:
        var(--wine);

    color:
        white;
}

.boarding-story .explorer-metrics {

    display:
        grid;

    grid-template-columns:
        repeat(
            5,
            1fr
        );

    gap:
        10px;

    margin-bottom:
        22px;
}

.boarding-story .metric {

    padding:
        14px;

    background:
        white;

    border-radius:
        9px;

    border-top:
        3px solid
        var(--wine);
}

.boarding-story .metric-title {

    font-size:
        10px;

    color:
        var(--muted);

    text-transform:
        uppercase;
}

.boarding-story .metric-value {

    margin-top:
        3px;

    font-size:
        20px;

    font-weight:
        800;
}

.boarding-story .aircraft-wrapper {

    overflow-x:
        auto;

    padding:
        10px 0;
}

.boarding-story .aircraft {

    display:
        grid;

    grid-template-columns:
        35px
        35px 35px 35px
        64px
        35px 35px 35px;

    gap:
        4px;

    width:
        max-content;

    margin:
        auto;

    padding:
        24px 28px;

    background:
        white;

    border:
        1px solid
        #DEDEDE;

    border-radius:
        70px 70px
        24px 24px;
}

.boarding-story .row-label {

    display:
        flex;

    align-items:
        center;

    justify-content:
        flex-end;

    padding-right:
        4px;

    font-size:
        9px;

    color:
        #777;
}

.boarding-story .seat {

    width:
        35px;

    height:
        27px;

    display:
        flex;

    align-items:
        center;

    justify-content:
        center;

    background:
        white;

    border:
        1px solid
        #BDBDBD;

    border-radius:
        4px;
}

.boarding-story .aisle {

    width:
        64px;

    height:
        27px;

    display:
        flex;

    align-items:
        center;

    justify-content:
        center;

    background:
        #F0F0F0;

    border-radius:
        3px;
}

.boarding-story .person {

    width:
        15px;

    height:
        15px;

    border-radius:
        50%;
}

.boarding-story .walking {
    background: #3D7EA6;
}

.boarding-story .stowing {
    background: #D99A2B;
}

.boarding-story .seating {
    background: #986FC7;
}

.boarding-story .seated {
    background: #528458;
}

.boarding-story .legend {

    display:
        flex;

    justify-content:
        center;

    gap:
        18px;

    flex-wrap:
        wrap;

    margin:
        18px 0;

    font-size:
        12px;
}

.boarding-story .legend-dot {

    display:
        inline-block;

    width:
        10px;

    height:
        10px;

    margin-right:
        5px;

    border-radius:
        50%;
}

.boarding-story .timeline {

    width:
        100%;
}

.boarding-story .explanation {

    margin-top:
        18px;

    padding:
        17px;

    background:
        white;

    border-radius:
        10px;

    color:
        #444;
}

.boarding-story .scenario-tabs {

    display:
        flex;

    gap:
        8px;

    flex-wrap:
        wrap;

    margin:
        30px 0;
}

.boarding-story .scenario-tab.active {

    background:
        var(--wine);

    color:
        white;
}

.boarding-story .result-row {

    display:
        grid;

    grid-template-columns:
        210px
        1fr
        125px;

    gap:
        15px;

    align-items:
        center;

    padding:
        12px 0;
}

.boarding-story .result-name {

    font-weight:
        700;

    font-size:
        14px;
}

.boarding-story .bar-track {

    height:
        28px;

    background:
        #F1F1F1;

    border-radius:
        5px;
}

.boarding-story .bar-fill {

    height:
        100%;

    border-radius:
        5px;
}

.boarding-story .result-time {

    text-align:
        right;

    font-weight:
        800;

    font-size:
        14px;
}

.boarding-story .figures-grid {

    margin-top:
        45px;
}

.boarding-story .story-figure {

    margin:
        65px 0;
}

.boarding-story .story-figure img {

    display:
        block;

    width:
        100%;

    max-width:
        1000px;

    margin:
        18px auto;

    background:
        white;
}

.boarding-story .figure-caption {

    max-width:
        820px;

    color:
        var(--muted);

    font-size:
        13px;
}

.boarding-story .story-grid {

    display:
        grid;

    grid-template-columns:
        1fr 1fr;

    gap:
        22px;

    margin-top:
        40px;
}

.boarding-story .callout {

    padding:
        30px;

    background:
        var(--soft);

    border-radius:
        18px;
}

.boarding-story .callout-title {

    font-size:
        25px;

    font-weight:
        800;

    line-height:
        1.15;
}

.boarding-story .calculator {

    margin-top:
        38px;

    padding:
        32px;

    background:
        #191919;

    color:
        white;

    border-radius:
        20px;
}

.boarding-story .calc-grid {

    display:
        grid;

    grid-template-columns:
        repeat(
            5,
            1fr
        );

    gap:
        14px;
}

.boarding-story .calculator select, .boarding-story .calculator input {

    border:
        1px solid
        #555;

    background:
        #292929;

    color:
        white;
}

.boarding-story .calc-output {

    display:
        grid;

    grid-template-columns:
        repeat(
            3,
            1fr
        );

    gap:
        12px;

    margin-top:
        28px;
}

.boarding-story .calc-card {

    padding:
        22px;

    background:
        #262626;

    border-radius:
        10px;
}

.boarding-story .calc-number {

    margin-top:
        6px;

    font-size:
        clamp(
            24px,
            4vw,
            38px
        );

    font-weight:
        800;

    color:
        #F0C36A;
}

.boarding-story .calc-note {

    margin-top:
        18px;

    color:
        #AAA;

    font-size:
        12px;
}

.boarding-story details {

    margin:
        15px 0;

    padding:
        18px 20px;

    border:
        1px solid
        var(--line);

    border-radius:
        10px;
}

.boarding-story summary {

    cursor:
        pointer;

    font-weight:
        800;
}

.boarding-story .cta {

    padding:
        85px 0;

    background:
        var(--wine);

    color:
        white;
}

.boarding-story .cta-inner {

    width:
        min(
            850px,
            90vw
        );

    margin:
        auto;
}

.boarding-story .cta a {

    display:
        inline-block;

    margin-top:
        24px;

    padding:
        12px 18px;

    background:
        white;

    color:
        var(--wine);

    border-radius:
        7px;

    text-decoration:
        none;

    font-weight:
        800;
}

.boarding-story footer {

    padding:
        30px 4vw;

    display:
        flex;

    justify-content:
        space-between;

    color:
        var(--muted);

    font-size:
        12px;
}

@media (
    max-width: 850px
) {

.boarding-story .nav {

        display:
            none;
    }

.boarding-story .strategy-grid, .boarding-story .stats-grid, .boarding-story .story-grid, .boarding-story .calc-output {

        grid-template-columns:
            1fr;
    }

.boarding-story .controls {

        grid-template-columns:
            1fr 1fr;
    }

.boarding-story .explorer-metrics {

        grid-template-columns:
            repeat(
                2,
                1fr
            );
    }

.boarding-story .calc-grid {

        grid-template-columns:
            1fr 1fr;
    }

.boarding-story .result-row {

        grid-template-columns:
            120px
            1fr
            105px;
    }


}



</style>

<div class="boarding-story">
<!-- =======================================================
     HERO
     ======================================================= -->

<section class="hero">

<div class="hero-inner">

<div class="eyebrow">
66,000 final boarding simulations
</div>

<h1>
What if the fastest way to board a plane is one airlines barely use?
</h1>

<div class="hero-sub">

Eleven boarding strategies.
Three operating environments.
And one surprisingly complicated queue inside a very narrow tube.

</div>

<div class="byline">

Antonin Kremenak ·
Analysts Diary ·
24 August 2026

</div>

</div>

</section>


<!-- =======================================================
     WHY BOARDING MATTERS
     ======================================================= -->

<section class="section narrow" id="why">

<div class="section-label">
Why study boarding?
</div>

<h2>
An aircraft earns money by flying — not by waiting at the gate.
</h2>


<p class="lead">

Every commercial aircraft spends part of its day on the ground.
Passengers need to leave, the cabin must be prepared and the next
group has to board before the aircraft can depart again. Airlines
therefore try to keep turnaround times predictable and as short as
operationally possible.

</p>


<p>

A few minutes may not sound important on a single flight, but airlines
repeat the same process hundreds or thousands of times across their
networks. Time saved during boarding can contribute to faster
turnarounds, better aircraft utilisation and more resilient schedules.
Conversely, slow or unpredictable boarding can consume part of the
available turnaround buffer before the aircraft has even pushed back.

</p>


<div class="context-box">

<strong>
The important point:
</strong>

boarding is not only a passenger-experience problem.
It is also an operations problem.

The faster and more predictably an aircraft can be prepared for
departure, the sooner it can return to the activity that generates
revenue: flying.

</div>


<div class="stats-grid">

<div class="stat-card">

<div class="stat-label">
Final simulations
</div>

<div class="stat-value">
66,000
</div>

</div>


<div class="stat-card">

<div class="stat-label">
Boarding strategies
</div>

<div class="stat-value">
11
</div>

</div>


<div class="stat-card">

<div class="stat-label">
Operating scenarios
</div>

<div class="stat-value">
3
</div>

</div>

</div>

</section>


<div class="divider"></div>


<!-- =======================================================
     SCENARIO CARDS
     ======================================================= -->

<section class="section narrow" id="scenarios">

<div class="section-label">
Three operating environments
</div>

<h2>
The same aircraft, tested under three different conditions.
</h2>

<div class="story-grid">

<div class="callout">
<div class="callout-title">Single door</div>
<p><strong>One front entrance, full aircraft, baseline luggage.</strong></p>
<p>Passengers follow the assigned boarding order perfectly and no travel
groups disrupt the sequence. This is the clean baseline for seeing what a
strategy can do with one conventional front door.</p>
</div>

<div class="callout">
<div class="callout-title">Dual door</div>
<p><strong>Front and rear entrances, full aircraft, baseline luggage.</strong></p>
<p>The passengers are split between two real streams entering from opposite
ends of the same aisle. Compliance remains perfect and there are no travel
groups. The second door changes the geometry - and can change the winner.</p>
</div>

<div class="callout">
<div class="callout-title">Operational stress</div>
<p><strong>One front entrance, more luggage, 75% compliance and travel groups.</strong></p>
<p>This scenario adds the everyday friction that a neat boarding plan cannot
fully control. One quarter of passengers travel in groups and only 75% keep
their prescribed position in the boarding order.</p>
</div>

</div>

</section>


<div class="divider"></div>


<!-- =======================================================
     STRATEGIES
     ======================================================= -->

<section class="section" id="methods">

<div class="section-label">
Meet the contenders
</div>

<h2>
Eleven ways to fill the same aircraft.
</h2>


<p class="lead">

Some methods are beautifully simple.
Others look almost absurd when written as a boarding queue.
But each one is trying to solve the same problem:
how do you stop passengers from getting in one another's way?

</p>


<div class="strategy-grid">



<div class="strategy-card" style="--strategy-color:#8C1D40">

<div class="strategy-name">
CRBF — Column Rotated Back-to-Front
</div>

<div class="strategy-short">
Board one seat column at a time, from the rear of the aircraft toward the front.
</div>

<div class="strategy-text">
CRBF stands for Column Rotated Back-to-Front. Instead of sending an entire rear section of passengers into the cabin at once, the aircraft is boarded column by column. In the 3-3 cabin used here, window, middle and aisle columns are called separately and each column proceeds from the rear toward the front.<br><br>The idea is to reduce seat interference while spreading passengers along the aisle. That allows several passengers to store luggage at the same time rather than creating one large queue around the same few rows.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#315A7D">

<div class="strategy-name">
Steffen method
</div>

<div class="strategy-short">
Deliberately space passengers several rows apart so they can stow luggage in parallel.
</div>

<div class="strategy-text">
The Steffen method uses a highly structured passenger sequence. Consecutive passengers in the boarding line are usually seated several rows apart, and window-seat passengers are handled before passengers closer to the aisle.<br><br>The unusual order has one main purpose: parallelism. Instead of one passenger blocking everyone behind while storing a bag, multiple passengers should be able to use different overhead bins simultaneously.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#5D88B3">

<div class="strategy-name">
Steffen-Lug
</div>

<div class="strategy-short">
Steffen boarding, but passengers with more luggage move earlier inside each boarding wave.
</div>

<div class="strategy-text">
Steffen-Lug keeps the spatial logic of the Steffen method but adds information about carry-on luggage. Inside each Steffen boarding wave, passengers carrying more bags are placed earlier in the sequence.<br><br>The goal is to let luggage-heavy passengers use relatively empty overhead bins before those bins become crowded. In the simulation this modification became especially interesting when two aircraft doors were available.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#588157">

<div class="strategy-name">
WilMA — Window, Middle, Aisle
</div>

<div class="strategy-short">
Window passengers first, middle seats second and aisle passengers last.
</div>

<div class="strategy-text">
WilMA stands for Window, Middle and Aisle. Its logic is easy to understand: board passengers sitting next to the windows first, then passengers in middle seats, and finally passengers sitting beside the aisle.<br><br>This largely removes one common source of delay: a window passenger arriving after the middle and aisle passengers are already seated and forcing them to stand up again.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#76639A">

<div class="strategy-name">
Reverse Pyramid
</div>

<div class="strategy-short">
Combine seat position and distance from the door into diagonal boarding zones.
</div>

<div class="strategy-text">
Reverse Pyramid does not simply divide the aircraft into front and rear blocks. Instead, boarding zones combine seat type and row position. Rear window passengers tend to board earlier, followed by overlapping combinations of windows, middle seats and eventually aisle seats.<br><br>The original published cabin configuration differs from the 26-row all-economy aircraft used in this project, so the zone boundaries were proportionally adapted. That is why the strategy is labelled Reverse Pyramid (adapted).
</div>

</div>




<div class="strategy-card" style="--strategy-color:#929292">

<div class="strategy-name">
Random boarding
</div>

<div class="strategy-short">
No spatial boarding logic — passengers enter in random order.
</div>

<div class="strategy-text">
Random boarding simply shuffles the passenger order. It does not deliberately prioritise rows or seat positions.<br><br>That sounds inefficient, but randomisation naturally spreads people around the cabin. It is therefore a useful benchmark and can sometimes outperform boarding methods that create very concentrated congestion.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#3F3F3F">

<div class="strategy-name">
Back-to-Front
</div>

<div class="strategy-short">
Call passengers in rear zones first and gradually move toward the front.
</div>

<div class="strategy-text">
Back-to-Front is probably the most intuitive boarding method. Passengers in the rear section are called first, followed by successively more forward zones.<br><br>The problem is that passengers from the same boarding group often need the same part of the aisle at the same time. The queue may look organised at the gate while producing a dense moving bottleneck inside the aircraft.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#C99A35">

<div class="strategy-name">
Lufthansa-like
</div>

<div class="strategy-short">
Priority boarding combined with more explicit seat-position logic.
</div>

<div class="strategy-text">
The Lufthansa-like method first handles selected priority groups and then applies seat-position logic to the remaining economy passengers, with window passengers preceding middle and aisle passengers.<br><br>Among the simplified airline-style approaches, this creates more spatial organisation inside the cabin than a pure priority-first system.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#D8AF45">

<div class="strategy-name">
Ryanair-like
</div>

<div class="strategy-short">
A simplified priority-first boarding structure inspired by low-cost airline operations.
</div>

<div class="strategy-text">
The Ryanair-like model separates priority passengers from the standard boarding population. Priority passengers enter first and the remaining passengers follow.<br><br>It is intentionally a simplified structural approximation. It is not intended to reproduce every detail of Ryanair's actual gate procedures, airport infrastructure or commercial priority product.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#E48B48">

<div class="strategy-name">
easyJet-like
</div>

<div class="strategy-short">
Families and priority passengers board ahead of the remaining passengers.
</div>

<div class="strategy-text">
The easyJet-like structure gives early boarding access to families and priority passengers before the standard passenger population enters.<br><br>Again, the purpose is not to recreate an airline's full real operation. It provides a simplified priority-based comparator for the strongly spatial academic strategies.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#B8863B">

<div class="strategy-name">
US Network-like
</div>

<div class="strategy-short">
Several successive priority groups followed by standard boarding groups.
</div>

<div class="strategy-text">
The US Network-like model represents the multi-group boarding structure common in large network-airline environments. Families and higher-priority passengers are processed before several standard boarding groups.<br><br>The model deliberately simplifies the much more complicated real systems involving cabin class, loyalty status, credit cards, accessibility and ticket products.
</div>

</div>



</div>

</section>


<div class="divider"></div>


<!-- =======================================================
     INTERACTIVE AIRCRAFT
     ======================================================= -->

<section class="section" id="watch">

<div class="section-label">
See the difference
</div>

<h2>
Watch the cabin fill.
</h2>


<p class="lead">

Choose a boarding strategy and operating scenario.
The animation shows one representative run from the same simulation
engine used for the final experiment.

</p>


<div class="explorer-shell">


<div class="controls">


<div class="control">

<label>
Scenario
</label>

<select id="airScenario">
</select>

</div>


<div class="control">

<label>
Boarding strategy
</label>

<select id="airPolicy">
</select>

</div>


<button id="airPlay" class="primary">
▶ Play
</button>


<button id="airRestart">
↺ Restart
</button>


<div class="control">

<label>
Speed
</label>

<select id="airSpeed">

<option value="1">
1×
</option>

<option value="2">
2×
</option>

<option value="5" selected="">
5×
</option>

<option value="10">
10×
</option>

</select>

</div>

</div>


<div class="explorer-metrics">

<div class="metric">

<div class="metric-title">
Elapsed
</div>

<div class="metric-value" id="airElapsed">
0 min 00 sec
</div>

</div>


<div class="metric">

<div class="metric-title">
Seated
</div>

<div class="metric-value" id="airSeated">
0 / 156
</div>

</div>


<div class="metric">

<div class="metric-title">
Walking
</div>

<div class="metric-value" id="airWalking">
0
</div>

</div>


<div class="metric">

<div class="metric-title">
Stowing bags
</div>

<div class="metric-value" id="airStowing">
0
</div>

</div>


<div class="metric">

<div class="metric-title">
Representative run
</div>

<div class="metric-value" id="airFinal">
—
</div>

</div>

</div>


<div class="aircraft-wrapper">

<div class="aircraft" id="aircraft">
</div>

</div>


<div class="legend">

<span>
<i class="legend-dot walking"></i>
Walking
</span>

<span>
<i class="legend-dot stowing"></i>
Stowing
</span>

<span>
<i class="legend-dot seating"></i>
Taking seat
</span>

<span>
<i class="legend-dot seated"></i>
Seated
</span>

</div>


<input class="timeline" type="range" id="airSlider" min="0" value="0" step="1">


<div class="explanation" id="airExplanation">
</div>


</div>

</section>


<div class="divider"></div>


<!-- =======================================================
     INTERACTIVE RESULTS
     ======================================================= -->

<section class="section" id="results">

<div class="section-label">
The scoreboard
</div>

<h2>
There was no universal winner.
</h2>


<p class="lead">

The fastest method depends on the environment.
Change the door configuration or passenger behaviour and the ranking
can change dramatically.

</p>


<div class="scenario-tabs" id="resultTabs">
</div>


<div id="resultDescription" class="explanation">
</div>


<div id="resultsBars">
</div>

</section>


<!-- =======================================================
     TECHNICAL GRAPHS
     ======================================================= -->

<section class="section">

<div class="section-label">
The bigger picture
</div>

<h2>
What 66,000 final simulations revealed.
</h2>


<p class="lead">

The interactive ranking above shows the headline result.
The charts below come from the technical version of the study and show
how the pattern changes across scenarios — and why.

</p>


<div class="figures-grid">



<div class="story-figure">

<h3>
Single-door boarding
</h3>

<img src="https://www.analystsdiary.com/assets/boarding/figures/fig01_single_door_rankings.png" alt="Single-door boarding" loading="lazy">

<p class="figure-caption">
Mean boarding times from 2,000 Monte Carlo runs per strategy. Lower is better.
</p>

</div>



<div class="story-figure">

<h3>
Opening the rear door changes the ranking
</h3>

<img src="https://www.analystsdiary.com/assets/boarding/figures/fig02_dual_door_rankings.png" alt="Opening the rear door changes the ranking" loading="lazy">

<p class="figure-caption">
The fastest single-door strategy does not remain the fastest when the aircraft is boarded from both ends.
</p>

</div>



<div class="story-figure">

<h3>
What happens when operations get messy?
</h3>

<img src="https://www.analystsdiary.com/assets/boarding/figures/fig03_stress_rankings.png" alt="What happens when operations get messy?" loading="lazy">

<p class="figure-caption">
Higher luggage volume, imperfect compliance and travel groups slow every method, but not by the same amount.
</p>

</div>



<div class="story-figure">

<h3>
The winner depends on the scenario
</h3>

<img src="https://www.analystsdiary.com/assets/boarding/figures/fig08_scenario_sensitivity.png" alt="The winner depends on the scenario" loading="lazy">

<p class="figure-caption">
The same boarding strategy can move substantially up or down the ranking when infrastructure and passenger behaviour change.
</p>

</div>



<div class="story-figure">

<h3>
Why aisle blocking matters
</h3>

<img src="https://www.analystsdiary.com/assets/boarding/figures/fig07_blocking_vs_boarding.png" alt="Why aisle blocking matters" loading="lazy">

<p class="figure-caption">
Strategies that create more blocking also tend to produce longer total boarding times.
</p>

</div>



<div class="story-figure">

<h3>
Academic optimisation vs airline-like boarding
</h3>

<img src="https://www.analystsdiary.com/assets/boarding/figures/fig10_airline_vs_academic.png" alt="Academic optimisation vs airline-like boarding" loading="lazy">

<p class="figure-caption">
The comparison isolates boarding-flow efficiency. Real airlines must optimise many other commercial and operational objectives.
</p>

</div>



</div>

</section>


<section class="section narrow">

<div class="section-label">
How the model evolved
</div>

<h2>
This was an iterative model, not a one-script result.
</h2>

<p class="lead">
The audit found <strong>18 unique executable versions</strong>
across <strong>19 named simulation files</strong>. The two V3.0
filenames are byte-identical aliases, so they count as one version.
</p>

<div class="stats-grid">
<div class="stat-card"><div class="stat-label">Unique versions</div><div class="stat-value">18</div></div>
<div class="stat-card"><div class="stat-label">Simulation rows across development</div><div class="stat-value">523,460</div></div>
<div class="stat-card"><div class="stat-label">Final experiment</div><div class="stat-value">66,000</div></div>
</div>

<p>
The model moved from baseline aisle mechanics to experimental replication,
movement and luggage sensitivity, behavioural compliance, travel groups,
dual-door infrastructure and finally the 11-policy comparison. The total is
based on the actual <code>All Runs</code> rows saved in the result workbooks,
including the final V3.1.2 smoke test.
</p>

</section>


<div class="divider"></div>


<!-- =======================================================
     SIMPLE INTERPRETATION
     ======================================================= -->

<section class="section">

<div class="section-label">
Why?
</div>

<h2>
The cabin rewards parallel work.
</h2>


<div class="story-grid">


<div class="callout">

<div class="callout-title">
One door: spread passengers out.
</div>

<p>

With a single front entrance, CRBF performs extremely well because
passengers are distributed through the cabin and several people can
store luggage at the same time.

</p>

</div>


<div class="callout">

<div class="callout-title">
Two doors change the geometry.
</div>

<p>

When half the cabin enters from the rear, the flow pattern changes.
Steffen-Lug becomes the fastest method in the final simulation.

</p>

</div>


<div class="callout">

<div class="callout-title">
Luggage is not a small detail.
</div>

<p>

A passenger placing a bag in an overhead bin may temporarily become
a moving roadblock. Spread those passengers apart and the cabin can
process several bags simultaneously.

</p>

</div>


<div class="callout">

<div class="callout-title">
Back-to-Front has an intuitive trap.
</div>

<p>

It organises passengers neatly outside the aircraft but then sends
many of them into the same cabin area. The result can be a long,
slow-moving bottleneck.

</p>

</div>


</div>

</section>


<div class="divider"></div>


<!-- =======================================================
     SAVINGS
     ======================================================= -->

<section class="section" id="money">

<div class="section-label">
Turn minutes into money
</div>

<h2>
What could faster boarding be worth?
</h2>


<p class="lead">

Change the assumptions yourself.
Choose any Strategy A and any Strategy B, the number of daily flights
and an illustrative value for one minute of gate time. All 11 × 11
directed combinations are available, including A = B.

</p>


<div class="calculator">


<div class="calc-grid">


<div class="control">

<label>
Scenario
</label>

<select id="calcScenario">
</select>

</div>


<div class="control">

<label>
Strategy A
</label>

<select id="calcPolicy">
</select>

</div>


<div class="control">

<label>
Strategy B
</label>

<select id="calcReference"></select>

</div>


<div class="control">

<label>
Flights per day
</label>

<input id="calcFlights" type="number" min="1" value="100">

</div>


<div class="control">

<label>
Gate-time value ($/min)
</label>

<input id="calcCost" type="number" min="1" step="1" value="35">

</div>


</div>


<div class="calc-output">


<div class="calc-card">

<div class="metric-title">
Time saved by Strategy A per flight
</div>

<div class="calc-number" id="calcTime">
—
</div>

</div>


<div class="calc-card">

<div class="metric-title">
Illustrative value per flight
</div>

<div class="calc-number" id="calcFlight">
—
</div>

</div>


<div class="calc-card">

<div class="metric-title">
Illustrative annual value
</div>

<div class="calc-number" id="calcAnnual">
—
</div>

</div>


</div>


<div class="calc-note">

<strong>Illustrative operating value, not profit.</strong>
This is a gate-time extrapolation, not a prediction of real airline profit.
It does not include schedule redesign, crew costs,
network recovery, missed connections, commercial boarding products or
aircraft utilisation effects outside the boarding model.

</div>

</div>

</section>


<div class="divider"></div>


<!-- =======================================================
     AIRLINES VS THEORY
     ======================================================= -->

<section class="section narrow">

<div class="section-label">
A fair question
</div>

<h2>
If these methods are faster, why don't airlines just use them?
</h2>


<p class="lead">

Because airlines are solving a much bigger problem than this simulation.

</p>


<p>

A mathematically efficient boarding sequence may require exact
passenger ordering, stronger gate control or separating people who
want to board together. Airlines also need to accommodate families,
premium products, accessibility, loyalty status and passenger
expectations.

</p>


<p>

So the simulation should not be read as
<strong>
“airlines are doing boarding wrong.”
</strong>

It asks a narrower question:

<strong>
if we isolate passenger flow inside the cabin, what boarding structures
reduce congestion most effectively?
</strong>

</p>

</section>


<div class="divider"></div>


<!-- =======================================================
     METHODOLOGY FAQ
     ======================================================= -->

<section class="section narrow">

<div class="section-label">
Behind the dots
</div>

<h2>
A little more detail, if you want it.
</h2>


<details>

<summary>
What aircraft was simulated?
</summary>

<p>

A 26-row narrow-body aircraft with a 3-3 seating configuration:
156 passengers at full load.

</p>

</details>


<details>

<summary>
How many times was each method tested?
</summary>

<p>

Every strategy was simulated 2,000 times in each of three operating
scenarios.

11 strategies × 3 scenarios × 2,000 trials =
<strong>66,000 final simulations.</strong>

</p>

</details>


<details>

<summary>
Why simulate the same thing thousands of times?
</summary>

<p>

Because passengers are not identical. Walking speeds, luggage and
other stochastic elements vary. Monte Carlo simulation lets the study
measure not only the average result but also how reliable each method is.

</p>

</details>


<details>

<summary>
Is the aircraft animation one of the 2,000-trial averages?
</summary>

<p>

No. An average cannot literally walk down an aisle.
The animation shows one representative deterministic run so the
mechanism is visible. The numbers reported in the charts come from the
full Monte Carlo experiment.

</p>

</details>


<details>

<summary>
Are Ryanair-like and Lufthansa-like exact airline procedures?
</summary>

<p>

No. They are simplified structural approximations used for comparison.
Real airline boarding procedures contain many additional operational
and commercial rules.

</p>

</details>


<details>

<summary>
Where are the statistical tests and validation?
</summary>

<p>

They are deliberately kept out of this general-audience story.
The technical study contains paired comparisons, confidence intervals,
effect sizes, P95 analysis, validation and detailed assumptions.

</p>

</details>

</section>


<!-- =======================================================
     LIMITATIONS
     ======================================================= -->

<section class="section narrow">

<div class="section-label">
One important caveat
</div>

<h2>
This is a model, not a departure board.
</h2>


<p>

The simulation isolates passenger boarding inside a representative
narrow-body cabin. It does not model every part of airport operations,
the complete turnaround process or an airline network.

</p>


<p>

The results are therefore best understood as a controlled comparison
of boarding mechanisms rather than a prediction that every real flight
would achieve exactly the same time.

</p>

</section>


<div class="divider"></div>


<section class="section narrow" id="learn-more">

<div class="section-label">
Learn more
</div>

<h2>
The research behind the model.
</h2>

<p>
These are selected sources from the supplied literature folder. They cover
the Steffen method, experimental tests, Reverse Pyramid, robustness,
luggage handling and recent Airbus A320 simulation work.
</p>

<div class="context-box">
<p><a href="https://doi.org/10.1016/j.jairtraman.2008.03.003" target="_blank" rel="noopener">Steffen (2008) — Optimal boarding method for airline passengers</a></p>
<p><a href="https://doi.org/10.1016/j.jairtraman.2011.10.003" target="_blank" rel="noopener">Steffen &amp; Hotchkiss (2012) — Experimental test of airplane boarding methods</a></p>
<p><a href="https://doi.org/10.1287/inte.1050.0135" target="_blank" rel="noopener">van den Briel et al. (2005) — America West Airlines develops efficient boarding strategies</a></p>
<p><a href="https://doi.org/10.3141/1915-06" target="_blank" rel="noopener">Ferrari &amp; Nagel (2005) — Robustness of efficient passenger boarding strategies</a></p>
<p><a href="https://doi.org/10.3390/sym9100222" target="_blank" rel="noopener">Qiang, Jia &amp; Huang (2017) — Surrogate experimental test</a></p>
<p><a href="https://doi.org/10.15394/ijaaa.2018.1200" target="_blank" rel="noopener">Coppens et al. (2018) — Review, field study and luggage-stowing experiment</a></p>
<p><a href="https://doi.org/10.3390/su152316476" target="_blank" rel="noopener">Moreira et al. (2023) — Airbus A320 discrete-event simulation</a></p>
</div>

</section>


<!-- =======================================================
     TECHNICAL CTA
     ======================================================= -->

<section class="cta">

<div class="cta-inner">

<div class="section-label" style="color:#F1D89A">
Want the technical version?
</div>

<h2>
The methodology, validation and statistics are all there.
</h2>


<p>

The professional study contains the full simulation development,
assumptions, paired statistical analysis, confidence intervals,
P95 results, economic methodology and limitations.

</p>


<a href="../../files/boarding-study/Aircraft_Boarding_Professional_Study.html">
Read the technical study →
</a>

</div>

</section>


<footer>

<div>
© 2026 Antonin Kremenak
</div>

<div>
Analysts Diary
</div>

</footer>
</div>

<script>

const RESULTS = {"Single door": {"description": "A full aircraft with baseline luggage, perfect compliance with the assigned boarding order and one front door.", "policies": {"CRBF": {"rank": 1, "mean_minutes": 13.9234125, "mean_formatted": "13 min 55 sec", "p95_minutes": 14.86708333333334, "p95_formatted": "14 min 52 sec", "blocked_sec": 5.908355769230769, "saving_vs_random": 13.3009375, "saving_vs_btf": 25.46423333333334, "color": "#8C1D40", "explanation": "Board one seat column at a time, from the rear of the aircraft toward the front."}, "Steffen": {"rank": 2, "mean_minutes": 17.81454583333333, "mean_formatted": "17 min 49 sec", "p95_minutes": 19.075, "p95_formatted": "19 min 04 sec", "blocked_sec": 9.59548717948718, "saving_vs_random": 9.409804166666664, "saving_vs_btf": 21.5731, "color": "#315A7D", "explanation": "Deliberately space passengers several rows apart so they can stow luggage in parallel."}, "Steffen-Lug": {"rank": 3, "mean_minutes": 22.311925, "mean_formatted": "22 min 19 sec", "p95_minutes": 24.425, "p95_formatted": "24 min 26 sec", "blocked_sec": 25.80848397435897, "saving_vs_random": 4.912424999999999, "saving_vs_btf": 17.07572083333334, "color": "#5D88B3", "explanation": "Steffen boarding, but passengers with more luggage move earlier inside each boarding wave."}, "Reverse Pyramid (adapted)": {"rank": 4, "mean_minutes": 24.47439166666667, "mean_formatted": "24 min 28 sec", "p95_minutes": 26.95874999999999, "p95_formatted": "26 min 58 sec", "blocked_sec": 54.47084455128205, "saving_vs_random": 2.749958333333332, "saving_vs_btf": 14.91325416666667, "color": "#76639A", "explanation": "Combine seat position and distance from the door into diagonal boarding zones."}, "WilMA": {"rank": 5, "mean_minutes": 25.54832083333333, "mean_formatted": "25 min 33 sec", "p95_minutes": 28.02541666666666, "p95_formatted": "28 min 02 sec", "blocked_sec": 41.45546955128206, "saving_vs_random": 1.676029166666666, "saving_vs_btf": 13.83932500000001, "color": "#588157", "explanation": "Window passengers first, middle seats second and aisle passengers last."}, "Lufthansa-like": {"rank": 6, "mean_minutes": 26.51368333333333, "mean_formatted": "26 min 31 sec", "p95_minutes": 29.28333333333333, "p95_formatted": "29 min 17 sec", "blocked_sec": 45.06608173076923, "saving_vs_random": 0.7106666666666648, "saving_vs_btf": 12.8739625, "color": "#C99A35", "explanation": "Priority boarding combined with more explicit seat-position logic."}, "easyJet-like": {"rank": 7, "mean_minutes": 27.21382916666667, "mean_formatted": "27 min 13 sec", "p95_minutes": 29.94166666666667, "p95_formatted": "29 min 57 sec", "blocked_sec": 47.71442788461538, "saving_vs_random": 0.01052083333333087, "saving_vs_btf": 12.17381666666667, "color": "#E48B48", "explanation": "Families and priority passengers board ahead of the remaining passengers."}, "Random": {"rank": 8, "mean_minutes": 27.22435, "mean_formatted": "27 min 13 sec", "p95_minutes": 29.99208333333334, "p95_formatted": "30 min 00 sec", "blocked_sec": 47.51086858974359, "saving_vs_random": 0.0, "saving_vs_btf": 12.16329583333334, "color": "#929292", "explanation": "No spatial boarding logic \u2014 passengers enter in random order."}, "Ryanair-like": {"rank": 9, "mean_minutes": 27.22603333333333, "mean_formatted": "27 min 14 sec", "p95_minutes": 29.96708333333333, "p95_formatted": "29 min 58 sec", "blocked_sec": 47.51201923076923, "saving_vs_random": -0.001683333333335923, "saving_vs_btf": 12.1616125, "color": "#D8AF45", "explanation": "A simplified priority-first boarding structure inspired by low-cost airline operations."}, "US Network-like": {"rank": 10, "mean_minutes": 27.23925833333333, "mean_formatted": "27 min 14 sec", "p95_minutes": 29.84375, "p95_formatted": "29 min 51 sec", "blocked_sec": 47.87156570512821, "saving_vs_random": -0.01490833333333441, "saving_vs_btf": 12.14838750000001, "color": "#B8863B", "explanation": "Several successive priority groups followed by standard boarding groups."}, "Back-to-Front": {"rank": 11, "mean_minutes": 39.38764583333334, "mean_formatted": "39 min 23 sec", "p95_minutes": 42.69208333333334, "p95_formatted": "42 min 42 sec", "blocked_sec": 137.5018894230769, "saving_vs_random": -12.16329583333334, "saving_vs_btf": 0.0, "color": "#3F3F3F", "explanation": "Call passengers in rear zones first and gradually move toward the front."}}}, "Dual door": {"description": "The same full aircraft, but passengers are divided between the front and rear doors.", "policies": {"Steffen-Lug": {"rank": 1, "mean_minutes": 16.0863625, "mean_formatted": "16 min 05 sec", "p95_minutes": 17.73333333333333, "p95_formatted": "17 min 44 sec", "blocked_sec": 24.71025320512821, "saving_vs_random": 1.581170833333331, "saving_vs_btf": 9.1733875, "color": "#5D88B3", "explanation": "Steffen boarding, but passengers with more luggage move earlier inside each boarding wave."}, "WilMA": {"rank": 2, "mean_minutes": 16.55265833333333, "mean_formatted": "16 min 33 sec", "p95_minutes": 18.425, "p95_formatted": "18 min 26 sec", "blocked_sec": 28.68870032051282, "saving_vs_random": 1.114874999999998, "saving_vs_btf": 8.707091666666667, "color": "#588157", "explanation": "Window passengers first, middle seats second and aisle passengers last."}, "Steffen": {"rank": 3, "mean_minutes": 17.05590416666667, "mean_formatted": "17 min 03 sec", "p95_minutes": 18.875, "p95_formatted": "18 min 52 sec", "blocked_sec": 22.59648397435897, "saving_vs_random": 0.6116291666666633, "saving_vs_btf": 8.203845833333332, "color": "#315A7D", "explanation": "Deliberately space passengers several rows apart so they can stow luggage in parallel."}, "Lufthansa-like": {"rank": 4, "mean_minutes": 17.2126125, "mean_formatted": "17 min 13 sec", "p95_minutes": 19.13333333333333, "p95_formatted": "19 min 08 sec", "blocked_sec": 31.33328044871795, "saving_vs_random": 0.454920833333329, "saving_vs_btf": 8.047137499999998, "color": "#C99A35", "explanation": "Priority boarding combined with more explicit seat-position logic."}, "Random": {"rank": 5, "mean_minutes": 17.66753333333333, "mean_formatted": "17 min 40 sec", "p95_minutes": 19.65833333333333, "p95_formatted": "19 min 40 sec", "blocked_sec": 33.11660256410256, "saving_vs_random": 0.0, "saving_vs_btf": 7.592216666666669, "color": "#929292", "explanation": "No spatial boarding logic \u2014 passengers enter in random order."}, "US Network-like": {"rank": 6, "mean_minutes": 17.69554583333333, "mean_formatted": "17 min 42 sec", "p95_minutes": 19.85875, "p95_formatted": "19 min 52 sec", "blocked_sec": 33.23141185897436, "saving_vs_random": -0.02801250000000266, "saving_vs_btf": 7.564204166666666, "color": "#B8863B", "explanation": "Several successive priority groups followed by standard boarding groups."}, "Ryanair-like": {"rank": 7, "mean_minutes": 17.70456666666666, "mean_formatted": "17 min 42 sec", "p95_minutes": 19.78333333333333, "p95_formatted": "19 min 47 sec", "blocked_sec": 33.21999519230769, "saving_vs_random": -0.03703333333333347, "saving_vs_btf": 7.555183333333336, "color": "#D8AF45", "explanation": "A simplified priority-first boarding structure inspired by low-cost airline operations."}, "easyJet-like": {"rank": 8, "mean_minutes": 17.70820833333333, "mean_formatted": "17 min 42 sec", "p95_minutes": 19.71708333333333, "p95_formatted": "19 min 43 sec", "blocked_sec": 33.2449967948718, "saving_vs_random": -0.04067500000000024, "saving_vs_btf": 7.551541666666669, "color": "#E48B48", "explanation": "Families and priority passengers board ahead of the remaining passengers."}, "Reverse Pyramid (adapted)": {"rank": 9, "mean_minutes": 17.76660833333333, "mean_formatted": "17 min 46 sec", "p95_minutes": 19.6925, "p95_formatted": "19 min 42 sec", "blocked_sec": 32.88248397435898, "saving_vs_random": -0.09907500000000269, "saving_vs_btf": 7.493141666666666, "color": "#76639A", "explanation": "Combine seat position and distance from the door into diagonal boarding zones."}, "CRBF": {"rank": 10, "mean_minutes": 21.68560833333333, "mean_formatted": "21 min 41 sec", "p95_minutes": 23.94208333333334, "p95_formatted": "23 min 57 sec", "blocked_sec": 29.69971153846154, "saving_vs_random": -4.018075000000003, "saving_vs_btf": 3.574141666666666, "color": "#8C1D40", "explanation": "Board one seat column at a time, from the rear of the aircraft toward the front."}, "Back-to-Front": {"rank": 11, "mean_minutes": 25.25975, "mean_formatted": "25 min 16 sec", "p95_minutes": 27.9425, "p95_formatted": "27 min 57 sec", "blocked_sec": 67.91609294871793, "saving_vs_random": -7.592216666666669, "saving_vs_btf": 0.0, "color": "#3F3F3F", "explanation": "Call passengers in rear zones first and gradually move toward the front."}}}, "Operational stress": {"description": "A more difficult operating environment with more luggage, 75% boarding-order compliance and travel groups.", "policies": {"CRBF": {"rank": 1, "mean_minutes": 29.71283333333334, "mean_formatted": "29 min 43 sec", "p95_minutes": 33.00041666666667, "p95_formatted": "33 min 00 sec", "blocked_sec": 54.7378125, "saving_vs_random": 7.092370833333327, "saving_vs_btf": 16.15731249999999, "color": "#8C1D40", "explanation": "Board one seat column at a time, from the rear of the aircraft toward the front."}, "Steffen": {"rank": 2, "mean_minutes": 30.4579125, "mean_formatted": "30 min 27 sec", "p95_minutes": 33.84208333333333, "p95_formatted": "33 min 51 sec", "blocked_sec": 50.86504166666667, "saving_vs_random": 6.347291666666663, "saving_vs_btf": 15.41223333333333, "color": "#315A7D", "explanation": "Deliberately space passengers several rows apart so they can stow luggage in parallel."}, "Steffen-Lug": {"rank": 3, "mean_minutes": 32.94379166666667, "mean_formatted": "32 min 57 sec", "p95_minutes": 36.2175, "p95_formatted": "36 min 13 sec", "blocked_sec": 60.09545512820512, "saving_vs_random": 3.861412499999993, "saving_vs_btf": 12.92635416666666, "color": "#5D88B3", "explanation": "Steffen boarding, but passengers with more luggage move earlier inside each boarding wave."}, "Reverse Pyramid (adapted)": {"rank": 4, "mean_minutes": 34.2118, "mean_formatted": "34 min 13 sec", "p95_minutes": 37.70833333333334, "p95_formatted": "37 min 43 sec", "blocked_sec": 78.88680128205128, "saving_vs_random": 2.593404166666659, "saving_vs_btf": 11.65834583333332, "color": "#76639A", "explanation": "Combine seat position and distance from the door into diagonal boarding zones."}, "WilMA": {"rank": 5, "mean_minutes": 35.1850625, "mean_formatted": "35 min 11 sec", "p95_minutes": 38.77541666666666, "p95_formatted": "38 min 47 sec", "blocked_sec": 70.75482371794872, "saving_vs_random": 1.620141666666662, "saving_vs_btf": 10.68508333333332, "color": "#588157", "explanation": "Window passengers first, middle seats second and aisle passengers last."}, "Lufthansa-like": {"rank": 6, "mean_minutes": 35.73619583333333, "mean_formatted": "35 min 44 sec", "p95_minutes": 39.66708333333332, "p95_formatted": "39 min 40 sec", "blocked_sec": 72.95104487179488, "saving_vs_random": 1.069008333333329, "saving_vs_btf": 10.13394999999999, "color": "#C99A35", "explanation": "Priority boarding combined with more explicit seat-position logic."}, "Ryanair-like": {"rank": 7, "mean_minutes": 36.01948333333334, "mean_formatted": "36 min 01 sec", "p95_minutes": 39.77541666666666, "p95_formatted": "39 min 47 sec", "blocked_sec": 73.69030128205128, "saving_vs_random": 0.7857208333333219, "saving_vs_btf": 9.850662499999984, "color": "#D8AF45", "explanation": "A simplified priority-first boarding structure inspired by low-cost airline operations."}, "easyJet-like": {"rank": 8, "mean_minutes": 36.06260833333334, "mean_formatted": "36 min 04 sec", "p95_minutes": 40.00833333333333, "p95_formatted": "40 min 00 sec", "blocked_sec": 73.93308974358975, "saving_vs_random": 0.7425958333333256, "saving_vs_btf": 9.807537499999988, "color": "#E48B48", "explanation": "Families and priority passengers board ahead of the remaining passengers."}, "US Network-like": {"rank": 9, "mean_minutes": 36.10131666666667, "mean_formatted": "36 min 06 sec", "p95_minutes": 40.05083333333333, "p95_formatted": "40 min 03 sec", "blocked_sec": 74.04846474358975, "saving_vs_random": 0.7038874999999933, "saving_vs_btf": 9.768829166666656, "color": "#B8863B", "explanation": "Several successive priority groups followed by standard boarding groups."}, "Random": {"rank": 10, "mean_minutes": 36.80520416666666, "mean_formatted": "36 min 48 sec", "p95_minutes": 40.74166666666667, "p95_formatted": "40 min 44 sec", "blocked_sec": 78.76632051282051, "saving_vs_random": 0.0, "saving_vs_btf": 9.064941666666662, "color": "#929292", "explanation": "No spatial boarding logic \u2014 passengers enter in random order."}, "Back-to-Front": {"rank": 11, "mean_minutes": 45.87014583333332, "mean_formatted": "45 min 52 sec", "p95_minutes": 50.535, "p95_formatted": "50 min 32 sec", "blocked_sec": 149.3638221153846, "saving_vs_random": -9.064941666666662, "saving_vs_btf": 0.0, "color": "#3F3F3F", "explanation": "Call passengers in rear zones first and gradually move toward the front."}}}};

const AD_STATES = ["waiting","walking","stowing","seating","seated"];
let ANIMATION = {};
let _runCache = null, _runKey = null;

function decodeRun(c) {
    const n = c.r.length;
    const snapshots = new Array(c.S.length);
    for (let f = 0; f < c.S.length; f++) {
        const S = c.S[f], C = c.C[f];
        const passengers = new Array(n);
        let seated = 0, walking = 0, stowing = 0, seating = 0;
        for (let i = 0; i < n; i++) {
            const state = AD_STATES[S.charCodeAt(i) - 48];
            if (state === "seated") seated++;
            else if (state === "walking") walking++;
            else if (state === "stowing") stowing++;
            else if (state === "seating") seating++;
            passengers[i] = {
                row: c.r[i], seat: c.s[i], state: state,
                current_row: parseInt(C[i], 36) - 1
            };
        }
        snapshots[f] = { time: c.T[f], seated, walking, stowing, seating, passengers };
    }
    return { time: c.t, formatted: c.f, snapshots };
}

function buildAnimation(compact) {
    Object.keys(compact).forEach(scenario => {
        ANIMATION[scenario] = {};
        Object.keys(compact[scenario]).forEach(policy => {
            Object.defineProperty(ANIMATION[scenario], policy, {
                enumerable: true,
                get() {
                    const key = scenario + "|" + policy;
                    if (_runKey !== key) {
                        _runCache = decodeRun(compact[scenario][policy]);
                        _runKey = key;
                    }
                    return _runCache;
                }
            });
        });
    });
}

function boardingStoryInit() {



/* =========================================================
   HELPERS
   ========================================================= */

function formatSeconds(
    seconds
) {

    let rounded =
        Math.round(
            seconds
        );


    const mins =
        Math.floor(
            rounded / 60
        );


    const secs =
        rounded % 60;


    return (
        mins
        + " min "
        + String(
            secs
        ).padStart(
            2,
            "0"
        )
        + " sec"
    );
}


function formatMinutes(
    minutes
) {

    return formatSeconds(
        minutes * 60
    );
}


function money(
    value
) {

    const negative =
        value < 0;


    const absolute =
        Math.abs(
            value
        );


    let formatted;


    if (
        absolute >= 1000000
    ) {

        formatted =
            "$"
            + (
                absolute
                / 1000000
            ).toFixed(
                2
            )
            + "M";

    } else if (
        absolute >= 1000
    ) {

        formatted =
            "$"
            + (
                absolute
                / 1000
            ).toFixed(
                1
            )
            + "k";

    } else {

        formatted =
            "$"
            + Math.round(
                absolute
            ).toLocaleString();
    }


    return (
        negative
        ? "−" + formatted
        : formatted
    );
}


/* =========================================================
   AIRCRAFT
   ========================================================= */

const airScenario =
    document.getElementById(
        "airScenario"
    );

const airPolicy =
    document.getElementById(
        "airPolicy"
    );

const aircraft =
    document.getElementById(
        "aircraft"
    );

const airSlider =
    document.getElementById(
        "airSlider"
    );


let airIndex = 0;
let airTimer = null;
let airPlaying = false;


function buildAircraft() {

    aircraft.innerHTML =
        "";


    const blank =
        document.createElement(
            "div"
        );


    aircraft.appendChild(
        blank
    );


    [
        "A",
        "B",
        "C",
        "",
        "D",
        "E",
        "F"

    ].forEach(
        label => {

            const element =
                document.createElement(
                    "div"
                );


            element.className =
                "row-label";


            element.style.textAlign =
                "center";


            element.textContent =
                label;


            aircraft.appendChild(
                element
            );
        }
    );


    for (
        let row = 1;
        row <= 26;
        row++
    ) {

        const rowLabel =
            document.createElement(
                "div"
            );


        rowLabel.className =
            "row-label";


        rowLabel.textContent =
            row;


        aircraft.appendChild(
            rowLabel
        );


        [
            "A",
            "B",
            "C"

        ].forEach(
            seat => {

                const element =
                    document.createElement(
                        "div"
                    );


                element.className =
                    "seat";


                element.id =
                    `seat-${row}-${seat}`;


                aircraft.appendChild(
                    element
                );
            }
        );


        const aisle =
            document.createElement(
                "div"
            );


        aisle.className =
            "aisle";


        aisle.id =
            `aisle-${row}`;


        aircraft.appendChild(
            aisle
        );


        [
            "D",
            "E",
            "F"

        ].forEach(
            seat => {

                const element =
                    document.createElement(
                        "div"
                    );


                element.className =
                    "seat";


                element.id =
                    `seat-${row}-${seat}`;


                aircraft.appendChild(
                    element
                );
            }
        );
    }
}


function currentAnimation() {

    return (

        ANIMATION[
            airScenario.value
        ][
            airPolicy.value
        ]
    );
}


function clearCabin() {

    document
    .querySelectorAll(
        ".seat, .aisle"
    )
    .forEach(
        element => {

            element.innerHTML =
                "";
        }
    );
}


function renderAircraft() {

    const run =
        currentAnimation();


    const snapshot =
        run.snapshots[
            airIndex
        ];


    clearCabin();


    snapshot.passengers
    .forEach(
        passenger => {

            if (
                passenger.state
                === "seated"
            ) {

                const seat =
                    document.getElementById(

                        `seat-${passenger.row}-${passenger.seat}`
                    );


                if (seat) {

                    const person =
                        document.createElement(
                            "div"
                        );


                    person.className =
                        "person seated";


                    seat.appendChild(
                        person
                    );
                }
            }

            else if (
                passenger.current_row
                > 0
            ) {

                const aisle =
                    document.getElementById(

                        `aisle-${passenger.current_row}`
                    );


                if (aisle) {

                    const person =
                        document.createElement(
                            "div"
                        );


                    person.className =
                        `person ${passenger.state}`;


                    aisle.appendChild(
                        person
                    );
                }
            }
        }
    );


    document.getElementById(
        "airElapsed"
    ).textContent =

        formatSeconds(
            snapshot.time
        );


    document.getElementById(
        "airSeated"
    ).textContent =

        snapshot.seated
        + " / 156";


    document.getElementById(
        "airWalking"
    ).textContent =

        snapshot.walking;


    document.getElementById(
        "airStowing"
    ).textContent =

        snapshot.stowing;


    document.getElementById(
        "airFinal"
    ).textContent =

        run.formatted;


    airSlider.value =
        airIndex;


    const policyInfo =

        RESULTS[
            airScenario.value
        ]
        .policies[
            airPolicy.value
        ];


    document.getElementById(
        "airExplanation"
    ).innerHTML =

        "<strong>"
        + airPolicy.value
        + "</strong><br>"
        + policyInfo.explanation
        + "<br><br>"
        + "Average across 2,000 trials: "
        + "<strong>"
        + policyInfo.mean_formatted
        + "</strong>.";
}


function stopAircraft() {

    airPlaying =
        false;


    document.getElementById(
        "airPlay"
    ).textContent =
        "▶ Play";


    if (airTimer) {

        clearInterval(
            airTimer
        );
    }


    airTimer =
        null;
}


function playAircraft() {

    if (airPlaying) {

        stopAircraft();

        return;
    }


    airPlaying =
        true;


    document.getElementById(
        "airPlay"
    ).textContent =
        "❚❚ Pause";


    const speed =
        Number(

            document.getElementById(
                "airSpeed"
            ).value
        );


    airTimer =
        setInterval(
            () => {

                const run =
                    currentAnimation();


                airIndex++;


                if (
                    airIndex
                    >= run.snapshots.length
                ) {

                    airIndex =
                        run.snapshots.length
                        - 1;


                    renderAircraft();

                    stopAircraft();

                    return;
                }


                renderAircraft();

            },

            400 / speed
        );
}


function updateAircraftPolicies() {

    const scenario =
        airScenario.value;


    airPolicy.innerHTML =
        "";


    Object.keys(
        ANIMATION[
            scenario
        ]
    )
    .forEach(
        policy => {

            const option =
                document.createElement(
                    "option"
                );


            option.value =
                policy;


            option.textContent =
                policy;


            airPolicy.appendChild(
                option
            );
        }
    );


    airIndex =
        0;


    airSlider.max =
        currentAnimation()
        .snapshots.length
        - 1;


    renderAircraft();
}


Object.keys(
    ANIMATION
)
.forEach(
    scenario => {

        const option =
            document.createElement(
                "option"
            );


        option.value =
            scenario;


        option.textContent =
            scenario;


        airScenario.appendChild(
            option
        );
    }
);


airScenario.addEventListener(

    "change",

    () => {

        stopAircraft();

        updateAircraftPolicies();
    }
);


airPolicy.addEventListener(

    "change",

    () => {

        stopAircraft();

        airIndex =
            0;


        airSlider.max =
            currentAnimation()
            .snapshots.length
            - 1;


        renderAircraft();
    }
);


airSlider.addEventListener(

    "input",

    () => {

        stopAircraft();


        airIndex =
            Number(
                airSlider.value
            );


        renderAircraft();
    }
);


document.getElementById(
    "airPlay"
)
.addEventListener(
    "click",
    playAircraft
);


document.getElementById(
    "airRestart"
)
.addEventListener(

    "click",

    () => {

        stopAircraft();

        airIndex =
            0;

        renderAircraft();
    }
);


buildAircraft();


airScenario.value =
    Object.keys(
        ANIMATION
    )[0];


updateAircraftPolicies();


/* =========================================================
   INTERACTIVE RESULT BARS
   ========================================================= */

const resultTabs =
    document.getElementById(
        "resultTabs"
    );


const resultsBars =
    document.getElementById(
        "resultsBars"
    );


let activeResultScenario =
    Object.keys(
        RESULTS
    )[0];


function renderResults() {

    resultTabs.innerHTML =
        "";


    Object.keys(
        RESULTS
    )
    .forEach(
        scenario => {

            const button =
                document.createElement(
                    "button"
                );


            button.textContent =
                scenario;


            button.className =

                "scenario-tab"
                + (
                    scenario
                    === activeResultScenario

                    ? " active"

                    : ""
                );


            button.onclick =
                () => {

                    activeResultScenario =
                        scenario;

                    renderResults();
                };


            resultTabs.appendChild(
                button
            );
        }
    );


    document.getElementById(
        "resultDescription"
    ).textContent =

        RESULTS[
            activeResultScenario
        ]
        .description;


    const policies =

        Object.entries(

            RESULTS[
                activeResultScenario
            ]
            .policies
        )
        .sort(
            (a,b) =>
                a[1].rank
                - b[1].rank
        );


    const maxTime =

        Math.max(

            ...policies.map(
                item =>
                    item[1]
                    .mean_minutes
            )
        );


    resultsBars.innerHTML =
        "";


    policies.forEach(
        ([name, info]) => {

            const row =
                document.createElement(
                    "div"
                );


            row.className =
                "result-row";


            const nameDiv =
                document.createElement(
                    "div"
                );


            nameDiv.className =
                "result-name";


            nameDiv.textContent =

                info.rank
                + ". "
                + name;


            const track =
                document.createElement(
                    "div"
                );


            track.className =
                "bar-track";


            const fill =
                document.createElement(
                    "div"
                );


            fill.className =
                "bar-fill";


            fill.style.width =

                (
                    info.mean_minutes
                    / maxTime
                    * 100
                )
                + "%";


            fill.style.background =
                info.color;


            track.appendChild(
                fill
            );


            const value =
                document.createElement(
                    "div"
                );


            value.className =
                "result-time";


            value.textContent =
                info.mean_formatted;


            row.appendChild(
                nameDiv
            );


            row.appendChild(
                track
            );


            row.appendChild(
                value
            );


            resultsBars.appendChild(
                row
            );
        }
    );
}


renderResults();


/* =========================================================
   SAVINGS CALCULATOR
   ========================================================= */

const calcScenario =
    document.getElementById(
        "calcScenario"
    );


const calcPolicy =
    document.getElementById(
        "calcPolicy"
    );


const calcReference =
    document.getElementById(
        "calcReference"
    );


Object.keys(
    RESULTS
)
.forEach(
    scenario => {

        const option =
            document.createElement(
                "option"
            );


        option.value =
            scenario;


        option.textContent =
            scenario;


        calcScenario.appendChild(
            option
        );
    }
);


function updateCalcPolicies() {

    const scenario =
        calcScenario.value;


    const previousPolicy =
        calcPolicy.value;


    const previousReference =
        calcReference.value;


    calcPolicy.innerHTML =
        "";


    calcReference.innerHTML =
        "";


    Object.entries(

        RESULTS[
            scenario
        ]
        .policies
    )
    .sort(
        (a,b) =>
            a[1].rank
            - b[1].rank
    )
    .forEach(
        ([policy, info]) => {

            const option =
                document.createElement(
                    "option"
                );


            option.value =
                policy;


            option.textContent =
                policy;


            calcPolicy.appendChild(
                option
            );


            calcReference.appendChild(
                option.cloneNode(true)
            );
        }
    );


    const policies =
        Object.keys(
            RESULTS[scenario].policies
        );


    calcPolicy.value =
        policies.includes(previousPolicy)
        ? previousPolicy
        : (policies.includes("CRBF") ? "CRBF" : policies[0]);


    calcReference.value =
        policies.includes(previousReference)
        ? previousReference
        : (
            policies.includes("Back-to-Front")
            ? "Back-to-Front"
            : policies[policies.length - 1]
        );


    updateCalculator();
}


function updateCalculator() {

    if (
        !calcScenario.value
        ||
        !calcPolicy.value
    ) {

        return;
    }


    const scenario =
        calcScenario.value;


    const policy =
        calcPolicy.value;


    const reference =

        calcReference.value;


    const flights =

        Number(

            document.getElementById(
                "calcFlights"
            ).value
        );


    const cost =

        Number(

            document.getElementById(
                "calcCost"
            ).value
        );


    const policyData =

        RESULTS[
            scenario
        ]
        .policies[
            policy
        ];


    const referenceData =

        RESULTS[
            scenario
        ]
        .policies[
            reference
        ];


    const saved =

        referenceData.mean_minutes
        - policyData.mean_minutes;


    const perFlight =
        saved
        * cost;


    const annual =
        perFlight
        * flights
        * 365;


    document.getElementById(
        "calcTime"
    ).textContent =

        saved >= 0

        ? formatMinutes(
            saved
        )

        : "−"
          + formatMinutes(
              Math.abs(
                  saved
              )
          );


    document.getElementById(
        "calcFlight"
    ).textContent =

        money(
            perFlight
        );


    document.getElementById(
        "calcAnnual"
    ).textContent =

        money(
            annual
        );
}


calcScenario.addEventListener(

    "change",

    updateCalcPolicies
);


calcPolicy.addEventListener(

    "change",

    updateCalculator
);


[
    "calcReference",
    "calcFlights",
    "calcCost"

].forEach(
    id => {

        const element =
            document.getElementById(
                id
            );


        element.addEventListener(

            "input",

            updateCalculator
        );


        element.addEventListener(

            "change",

            updateCalculator
        );
    }
);


calcScenario.value =
    Object.keys(
        RESULTS
    )[0];


updateCalcPolicies();


}

fetch("/assets/boarding/anim.json")
    .then(response => response.json())
    .then(compact => {
        buildAnimation(compact);
        boardingStoryInit();
    })
    .catch(() => {
        const box = document.getElementById("aircraft");
        if (box) box.innerHTML =
            "<p style='padding:2rem'>The boarding animation could not be loaded.</p>";
    });

</script>



 ]]></description>
  <category>Aviation</category>
  <guid>https://www.analystsdiary.com/posts/aviation/boarding-fastest-method.html</guid>
  <pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate>
  <media:content url="https://www.analystsdiary.com/assets/icons/aviation.svg" medium="image" type="image/svg+xml"/>
</item>
<item>
  <title>IIHF World Championship 2026</title>
  <link>https://www.analystsdiary.com/posts/sport/iihf-world-championship-2026.html</link>
  <description><![CDATA[ 




<style>

/* =========================================================
   HIDE STANDARD QUARTO TITLE
   ========================================================= */

.quarto-title-block {
  display: none;
}


/* =========================================================
   SHARED ICON STYLE
   ========================================================= */

:root {
  --iihf-icon-color: #d2c1ba;
  --iihf-icon-color-dark: #c2afa8;
}

.icon-svg {
  display: block;
  width: 28px;
  height: 28px;
  color: var(--iihf-icon-color);
}

.icon-svg svg {
  width: 100%;
  height: 100%;
  display: block;
}

.hero-icon-svg {
  width: 84px;
  height: 84px;
  color: var(--iihf-icon-color);
  opacity: .55;
}

.hero-icon-svg svg {
  width: 100%;
  height: 100%;
  display: block;
}


/* =========================================================
   HERO
   ========================================================= */

.iihf-hero {
  position: relative;
  overflow: hidden;

  padding: 2.8rem 2rem;
  margin: 0.5rem 0 2.7rem 0;

  border: 1px solid rgba(114,47,55,.20);
  border-radius: 22px;

  background:
    radial-gradient(
      circle at 86% 18%,
      rgba(114,47,55,.13),
      transparent 31%
    ),
    linear-gradient(
      135deg,
      rgba(251,240,225,.85),
      rgba(255,255,255,.44)
    );
}


.iihf-hero-icon {
  position: absolute;

  right: 2rem;
  top: 1.4rem;

  transform: rotate(-16deg);
}


.iihf-kicker {
  margin-bottom: .5rem;

  font-size: .76rem;
  letter-spacing: .16em;
  text-transform: uppercase;

  font-weight: 700;
  color: #722F37;
}


.iihf-main-title {
  margin-top: 0;
  margin-bottom: .7rem;

  color: #3D1D19;
}


.iihf-intro {
  max-width: 780px;

  font-size: 1.08rem;
  line-height: 1.65;
}


.iihf-stats {
  display: flex;
  gap: 2.7rem;
  flex-wrap: wrap;

  margin-top: 1.9rem;
}


.iihf-stat strong {
  display: block;

  font-size: 1.9rem;
  line-height: 1;

  color: #722F37;
}


.iihf-stat span {
  display: block;

  margin-top: .4rem;

  font-size: .86rem;
  opacity: .72;
}


/* =========================================================
   STAGE LABELS
   ========================================================= */

.stage-title {
  display: flex;
  align-items: center;
  gap: .45rem;

  margin-top: 3.2rem;
  margin-bottom: 1rem;

  font-size: .80rem;
  letter-spacing: .16em;
  text-transform: uppercase;

  color: #722F37;
  font-weight: 700;
}


/* =========================================================
   DAY SELECTOR
   ========================================================= */

.day-grid {
  display: grid;

  grid-template-columns:
    repeat(auto-fit, minmax(150px, 1fr));

  gap: .9rem;

  margin-bottom: 2.6rem;
}


.day-card {
  display: block;

  padding: 1.15rem;

  text-decoration: none !important;

  border: 1px solid rgba(61,29,25,.16);
  border-radius: 16px;

  background: rgba(255,255,255,.62);

  transition:
    transform .18s ease,
    box-shadow .18s ease,
    border-color .18s ease,
    background .18s ease;
}


.day-card:hover {
  transform: translateY(-3px);

  border-color: #722F37;

  box-shadow:
    0 8px 24px rgba(61,29,25,.09);

  background: rgba(255,255,255,.82);
}


.day-icon {
  display: block;

  margin-bottom: .62rem;
}


.day-card strong {
  display: block;

  color: #3D1D19;

  font-size: 1.05rem;
}


.day-card span.day-meta-small {
  display: block;

  margin-top: .27rem;

  font-size: .80rem;

  opacity: .68;
}


.day-card.playoff {
  border-color: rgba(114,47,55,.36);
}


.day-card.medal {
  border-color: rgba(114,47,55,.45);

  background:
    linear-gradient(
      135deg,
      rgba(114,47,55,.10),
      rgba(251,240,225,.84)
    );
}


/* =========================================================
   INDIVIDUAL DAYS
   ========================================================= */

.day-section {
  margin: 3.3rem 0;

  padding-top: 1rem;

  scroll-margin-top: 100px;
}


.day-header {
  padding-bottom: .8rem;
  margin-bottom: 1rem;

  border-bottom:
    1px solid rgba(61,29,25,.16);
}


.day-meta {
  color: #722F37;

  font-size: .76rem;

  letter-spacing: .11em;
  text-transform: uppercase;

  font-weight: 700;
}


.day-header-title {
  display: block;

  margin-top: .2rem;
}


.day-header-title h2 {
  margin: 0;
}


.day-summary {
  max-width: 800px;

  margin-bottom: 1.3rem;

  line-height: 1.65;
}


/* =========================================================
   MATCH CARDS
   ========================================================= */

.match-list {
  display: grid;

  grid-template-columns:
    repeat(auto-fit, minmax(270px, 1fr));

  gap: .85rem;
}


.match-card {
  padding: 1rem 1.1rem;

  border:
    1px solid rgba(61,29,25,.14);

  border-radius: 14px;

  background:
    rgba(255,255,255,.56);

  transition:
    transform .16s ease,
    border-color .16s ease,
    box-shadow .16s ease;
}


.match-card:hover {
  transform: translateY(-2px);

  border-color:
    rgba(114,47,55,.40);

  box-shadow:
    0 6px 18px rgba(61,29,25,.06);
}


.match-title {
  margin-bottom: .55rem;

  font-weight: 700;
  font-size: 1.02rem;

  line-height: 1.45;
}


.match-card a {
  color: #722F37;

  font-weight: 700;

  text-decoration: none;
}


.match-card a:hover {
  text-decoration: underline;
}


/* =========================================================
   FLAGS
   ========================================================= */

.flag-icon {
  width: 18px;
  height: 13px;

  object-fit: cover;

  border-radius: 2px;

  vertical-align: -2px;

  margin: 0 .22rem;

  box-shadow:
    0 0 0 1px rgba(61,29,25,.10);
}


/* =========================================================
   MEDAL GAMES
   ========================================================= */

.medal-card {
  border-color:
    rgba(114,47,55,.30);
}


.final-label {
  display: inline-block;

  margin-bottom: .5rem;

  color: #722F37;

  font-weight: 700;

  font-size: .71rem;

  letter-spacing: .12em;
  text-transform: uppercase;
}


.final-match {
  grid-column: 1 / -1;

  padding: 1.65rem;

  border:
    1px solid rgba(114,47,55,.50);

  background:
    radial-gradient(
      circle at 90% 18%,
      rgba(114,47,55,.14),
      transparent 28%
    ),
    rgba(251,240,225,.68);
}


.final-match .match-title {
  font-size: 1.42rem;
}


/* =========================================================
   NAVIGATION
   ========================================================= */

.back-top {
  display: inline-block;

  margin-top: 1.25rem;

  font-size: .84rem;

  color: #722F37;

  text-decoration: none;
}


.back-top:hover {
  text-decoration: underline;
}


/* =========================================================
   ABOUT PROJECT
   ========================================================= */

.project-note {
  margin-top: 4rem;

  padding-top: 1.7rem;

  border-top:
    1px solid rgba(61,29,25,.16);
}


.project-note p {
  max-width: 820px;
}


/* =========================================================
   MOBILE
   ========================================================= */

@media (max-width: 700px) {

  .iihf-hero {
    padding: 2rem 1.25rem;
  }

  .iihf-hero-icon {
    right: 1rem;
    top: 1rem;
  }

  .hero-icon-svg {
    width: 64px;
    height: 64px;
  }

  .iihf-stats {
    gap: 1.6rem;
  }

  .day-grid {
    grid-template-columns:
      repeat(2, 1fr);
  }

  .match-list {
    grid-template-columns: 1fr;
  }

}

</style>
<div id="iihf-top" class="iihf-hero">
<div class="iihf-hero-icon">
<p><span class="hero-icon-svg">  </span></p>
</div>
<div class="iihf-kicker">
<p>Sports analytics · Ice hockey</p>
</div>
<h1 class="iihf-main-title">
2026 IIHF World Championship
</h1>
<div class="iihf-intro">
<p>I analysed the majority of games played at the 2026 IIHF World Championship, following the tournament from its opening round through the medal games. The project goes beyond traditional box-score statistics and focuses on shot locations, shot quality, scoring opportunities and game flow.</p>
</div>
<div class="iihf-stats">
<div class="iihf-stat">
<p><strong>56</strong> <span>games analysed</span></p>
</div>
<div class="iihf-stat">
<p><strong>15</strong> <span>match days</span></p>
</div>
<div class="iihf-stat">
<p><strong>16</strong> <span>national teams</span></p>
</div>
</div>
</div>
<div class="stage-title">
<p>Group stage</p>
</div>
<div class="day-grid">
<p> <span class="day-icon"> <span class="icon-svg">  </span> </span> <strong>Day 1</strong> <span class="day-meta-small">4 analyses</span> </p>
<p> <span class="day-icon"> <span class="icon-svg">  </span> </span> <strong>Day 2</strong> <span class="day-meta-small">3 analyses</span> </p>
<p> <span class="day-icon"> <span class="icon-svg">  </span> </span> <strong>Day 3</strong> <span class="day-meta-small">3 analyses</span> </p>
<p> <span class="day-icon"> <span class="icon-svg">  </span> </span> <strong>Day 4</strong> <span class="day-meta-small">4 analyses</span> </p>
<p> <span class="day-icon"> <span class="icon-svg">  </span> </span> <strong>Day 5</strong> <span class="day-meta-small">4 analyses</span> </p>
<p> <span class="day-icon"> <span class="icon-svg">  </span> </span> <strong>Day 6</strong> <span class="day-meta-small">3 analyses</span> </p>
<p> <span class="day-icon"> <span class="icon-svg">  </span> </span> <strong>Day 7</strong> <span class="day-meta-small">4 analyses</span> </p>
<p> <span class="day-icon"> <span class="icon-svg">  </span> </span> <strong>Day 8</strong> <span class="day-meta-small">4 analyses</span> </p>
<p> <span class="day-icon"> <span class="icon-svg">  </span> </span> <strong>Day 9</strong> <span class="day-meta-small">6 analyses</span> </p>
<p> <span class="day-icon"> <span class="icon-svg">  </span> </span> <strong>Day 10</strong> <span class="day-meta-small">3 analyses</span> </p>
<p> <span class="day-icon"> <span class="icon-svg">  </span> </span> <strong>Day 11</strong> <span class="day-meta-small">4 analyses</span> </p>
<p> <span class="day-icon"> <span class="icon-svg">  </span> </span> <strong>Day 12</strong> <span class="day-meta-small">6 analyses</span> </p>
</div>
<div class="stage-title">
<p>Playoffs</p>
</div>
<div class="day-grid">
<p> <span class="day-icon"> <span class="icon-svg">  </span> </span> <strong>Day 13</strong> <span class="day-meta-small">Quarterfinals · 4 analyses</span> </p>
<p> <span class="day-icon"> <span class="icon-svg">  </span> </span> <strong>Day 14</strong> <span class="day-meta-small">Semifinals · 2 analyses</span> </p>
<p> <span class="day-icon"> <span class="icon-svg">  </span> </span> <strong>Day 15</strong> <span class="day-meta-small">Medal Day · 2 analyses</span> </p>
</div>

<div id="days-container"></div>

<script>

const base =
"https://kremen29.github.io/iihf_reports";


/* =========================================================
   FLAGS
   ========================================================= */

function flag(code, name) {

  return `
    <img
      class="flag-icon"
      src="https://flagcdn.com/24x18/${code}.png"
      alt="${name} flag"
      loading="lazy"
    >
  `;

}


function matchLabel(
  homeCode,
  homeName,
  awayCode,
  awayName
) {

  return `
    ${flag(homeCode, homeName)}
    ${homeName}
    –
    ${awayName}
    ${flag(awayCode, awayName)}
  `;

}


/* =========================================================
   TOURNAMENT DATA
   ========================================================= */

const days = [

{
day: 1,
stage: "Group Stage",

summary:
"Four match analyses from the opening day of the World Championship.",

matches: [

[
"1_Canada_Sweden",
matchLabel("ca","Canada","se","Sweden")
],

[
"2_Czechia_Denmark",
matchLabel("cz","Czechia","dk","Denmark")
],

[
"3_Finland_Germany",
matchLabel("fi","Finland","de","Germany")
],

[
"4_USA_Switzerland",
matchLabel("us","USA","ch","Switzerland")
]

]
},



{
day: 2,
stage: "Group Stage",

summary:
"Three analysed games from the second day of the tournament.",

matches: [

[
"5_Slovakia_Norway",
matchLabel("sk","Slovakia","no","Norway")
],

[
"6_GB_Austria",
matchLabel("gb","Great Britain","at","Austria")
],

[
"7_Italy_Canada",
matchLabel("it","Italy","ca","Canada")
]

]
},



{
day: 3,
stage: "Group Stage",

summary:
"Three match analyses from Day 3 of the group stage.",

matches: [

[
"12_GB_USA",
matchLabel("gb","Great Britain","us","USA")
],

[
"13_Denmark_Sweden",
matchLabel("dk","Denmark","se","Sweden")
],

[
"14_Austria_Hungary",
matchLabel("at","Austria","hu","Hungary")
]

]
},



{
day: 4,
stage: "Group Stage",

summary:
"Four analysed games from the fourth match day.",

matches: [

[
"17_Finland_USA",
matchLabel("fi","Finland","us","USA")
],

[
"18_Canada_Denmark",
matchLabel("ca","Canada","dk","Denmark")
],

[
"19_Germany_Switzerland",
matchLabel("de","Germany","ch","Switzerland")
],

[
"20_Sweden_Czechia",
matchLabel("se","Sweden","cz","Czechia")
]

]
},



{
day: 5,
stage: "Group Stage",

summary:
"Four games analysed from Day 5 of the championship.",

matches: [

[
"21_Italy_Norway",
matchLabel("it","Italy","no","Norway")
],

[
"22_Latvia_Austria",
matchLabel("lv","Latvia","at","Austria")
],

[
"23_Hungary_GB",
matchLabel("hu","Hungary","gb","Great Britain")
],

[
"24_Slovenia_Slovakia",
matchLabel("si","Slovenia","sk","Slovakia")
]

]
},



{
day: 6,
stage: "Group Stage",

summary:
"Three analysed games from the sixth match day.",

matches: [

[
"25_Czechia_Italy",
matchLabel("cz","Czechia","it","Italy")
],

[
"26_Austria_Switzerland",
matchLabel("at","Austria","ch","Switzerland")
],

[
"27_Sweden_Slovenia",
matchLabel("se","Sweden","si","Slovenia")
]

]
},



{
day: 7,
stage: "Group Stage",

summary:
"Four match analyses covering Day 7 of the group stage.",

matches: [

[
"29_Canada_Norway",
matchLabel("ca","Canada","no","Norway")
],

[
"30_Latvia_Finland",
matchLabel("lv","Latvia","fi","Finland")
],

[
"31_Denmark_Slovakia",
matchLabel("dk","Denmark","sk","Slovakia")
],

[
"32_Switzerland_GB",
matchLabel("ch","Switzerland","gb","Great Britain")
]

]
},



{
day: 8,
stage: "Group Stage",

summary:
"Four analysed games from the eighth day of competition.",

matches: [

[
"33_Canada_Slovenia",
matchLabel("ca","Canada","si","Slovenia")
],

[
"34_Germany_Hungary",
matchLabel("de","Germany","hu","Hungary")
],

[
"35_Finland_GB",
matchLabel("fi","Finland","gb","Great Britain")
],

[
"36_Sweden_Italy",
matchLabel("se","Sweden","it","Italy")
]

]
},



{
day: 9,
stage: "Group Stage",

summary:
"Six match analyses make Day 9 one of the largest analytical sets in the project.",

matches: [

[
"37_Denmark_Slovenia",
matchLabel("dk","Denmark","si","Slovenia")
],

[
"38_Latvia_USA",
matchLabel("lv","Latvia","us","USA")
],

[
"39_Slovakia_Czechia",
matchLabel("sk","Slovakia","cz","Czechia")
],

[
"40_Switzerland_Hungary",
matchLabel("ch","Switzerland","hu","Hungary")
],

[
"41_Norway_Sweden",
matchLabel("no","Norway","se","Sweden")
],

[
"42_Austria_Germany",
matchLabel("at","Austria","de","Germany")
]

]
},



{
day: 10,
stage: "Group Stage",

summary:
"Three games analysed from Day 10 of the tournament.",

matches: [

[
"43_Denmark_Italy",
matchLabel("dk","Denmark","it","Italy")
],

[
"44_GB_Latvia",
matchLabel("gb","Great Britain","lv","Latvia")
],

[
"45_Finland_Austria",
matchLabel("fi","Finland","at","Austria")
]

]
},



{
day: 11,
stage: "Group Stage",

summary:
"Four match analyses from the penultimate phase of group-stage competition.",

matches: [

[
"47_Czechia_Norway",
matchLabel("cz","Czechia","no","Norway")
],

[
"48_USA_Hungary",
matchLabel("us","USA","hu","Hungary")
],

[
"49_Slovenia_Italy",
matchLabel("si","Slovenia","it","Italy")
],

[
"50_Germany_GB",
matchLabel("de","Germany","gb","Great Britain")
]

]
},



{
day: 12,
stage: "Group Stage",

summary:
"Six analysed games close the group stage before the tournament moves into the knockout rounds.",

matches: [

[
"51_Norway_Denmark",
matchLabel("no","Norway","dk","Denmark")
],

[
"52_Hungary_Latvia",
matchLabel("hu","Hungary","lv","Latvia")
],

[
"53_Sweden_Slovakia",
matchLabel("se","Sweden","sk","Slovakia")
],

[
"54_USA_Austria",
matchLabel("us","USA","at","Austria")
],

[
"55_Czechia_Canada",
matchLabel("cz","Czechia","ca","Canada")
],

[
"56_Switzerland_Finland",
matchLabel("ch","Switzerland","fi","Finland")
]

]
},



{
day: 13,
stage: "Quarterfinals",

summary:
"Four quarterfinal analyses cover the first elimination round and the transition from the group stage to the final four.",

matches: [

[
"57_Finland_Czechia",
matchLabel("fi","Finland","cz","Czechia")
],

[
"58_Canada_USA",
matchLabel("ca","Canada","us","USA")
],

[
"59_Switzerland_Sweden",
matchLabel("ch","Switzerland","se","Sweden")
],

[
"60_Norway_Latvia",
matchLabel("no","Norway","lv","Latvia")
]

]
},



{
day: 14,
stage: "Semifinals",

summary:
"Two semifinal analyses capture the games that determined the two teams advancing to the World Championship Final.",

matches: [

[
"61_Switzerland_Norway",
matchLabel("ch","Switzerland","no","Norway")
],

[
"62_Canada_Finland",
matchLabel("ca","Canada","fi","Finland")
]

]
},



{
day: 15,
stage: "Medal Day",

summary:
"The final day of the championship features the bronze-medal game followed by the World Championship Final.",

matches: [

[
"63_Canada_Norway",
matchLabel("ca","Canada","no","Norway"),
"bronze"
],

[
"64_Switzerland_Finland",
matchLabel("ch","Switzerland","fi","Finland"),
"final"
]

]
}

];



/* =========================================================
   GENERATE PAGE
   ========================================================= */

const container =
document.getElementById("days-container");


days.forEach(d => {


const section =
document.createElement("section");


section.className =
"day-section";


section.id =
`day-${d.day}`;


let matches = "";



d.matches.forEach(m => {


const slug =
m[0];


const title =
m[1];


const type =
m[2] || "";


const url =
`${base}/${d.day}_day/${slug}_report.html`;



if (type === "final") {


matches += `

<div class="match-card final-match">

<div class="final-label">
World Championship Final
</div>

<div class="match-title">
${title}
</div>

<p>
The championship final is presented here as a complete technical match report and will also form the basis of a dedicated long-form analytical article.
</p>

<a
href="${url}"
target="_blank"
rel="noopener"
>
Open full technical report →
</a>

</div>

`;

}


else if (type === "bronze") {


matches += `

<div class="match-card medal-card">

<div class="final-label">
Bronze Medal Game
</div>

<div class="match-title">
${title}
</div>

<a
href="${url}"
target="_blank"
rel="noopener"
>
Open full match analysis →
</a>

</div>

`;

}


else {


matches += `

<div class="match-card">

<div class="match-title">
${title}
</div>

<a
href="${url}"
target="_blank"
rel="noopener"
>
Open full match analysis →
</a>

</div>

`;

}


});



section.innerHTML = `

<div class="day-header">

<div class="day-meta">
${d.stage}
</div>


<div class="day-header-title">

<h2>
Day ${d.day}
</h2>

</div>

</div>


<p class="day-summary">
${d.summary}
</p>


<div class="match-list">
${matches}
</div>


<a
class="back-top"
href="#iihf-top"
>
↑ Back to tournament overview
</a>

`;


container.appendChild(section);


});

</script>

<section id="about-the-project" class="level2 project-note">
<h2 class="anchored" data-anchor-id="about-the-project">About the project</h2>
<p>This project follows the 2026 IIHF World Championship through a series of game-level data analyses.</p>
<p>I analysed <strong>56 games across the tournament</strong>, covering the majority of the group stage and the complete knockout phase from the quarterfinals through the World Championship Final.</p>
<p>The analyses focus on elements that are not always visible in traditional box-score statistics, including shot locations, shot quality, scoring opportunities and the development of attacking pressure throughout each game.</p>
<p>Each match above links to its complete analytical report.</p>
<p>The World Championship Final between <strong>Switzerland and Finland</strong> will also receive a dedicated long-form article that brings the individual metrics together into a broader explanation of how the championship was decided.</p>
</section>



 ]]></description>
  <guid>https://www.analystsdiary.com/posts/sport/iihf-world-championship-2026.html</guid>
  <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
  <media:content url="https://www.analystsdiary.com/assets/icons/hockey.svg" medium="image" type="image/svg+xml"/>
</item>
<item>
  <title>Why aviation belongs in an analyst’s diary</title>
  <link>https://www.analystsdiary.com/posts/aviation/why-aviation.html</link>
  <description><![CDATA[ 




<p>Few industries record as much of themselves as aviation does. Every delay, diversion, and load factor is logged, published, and comparable across carriers and continents.</p>
<section id="what-this-section-will-cover" class="level2">
<h2 class="anchored" data-anchor-id="what-this-section-will-cover">What this section will cover</h2>
<!-- TODO -->
</section>
<section id="data-sources" class="level2">
<h2 class="anchored" data-anchor-id="data-sources">Data sources</h2>
<!-- TODO -->


</section>

 ]]></description>
  <category>Aviation</category>
  <guid>https://www.analystsdiary.com/posts/aviation/why-aviation.html</guid>
  <pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://www.analystsdiary.com/assets/icons/aviation.svg" medium="image" type="image/svg+xml"/>
</item>
<item>
  <title>How to visualise data the right way — part 1</title>
  <link>https://www.analystsdiary.com/posts/education/visualising-data-part-1.html</link>
  <description><![CDATA[ 




<p>Data visualizations often look objective and trustworthy, yet small design choices can dramatically change how we interpret them. This article shows how colors, ordering, scales, and chart types can subtly guide our attention, exaggerate differences, or hide important patterns. By understanding these common pitfalls, we can learn to read charts more critically and create visualizations that inform rather than mislead.</p>
<section id="colour-highlighting-what-matters-should-stand-out" class="level2">
<h2 class="anchored" data-anchor-id="colour-highlighting-what-matters-should-stand-out">Colour highlighting: what matters should stand out</h2>
<p>One of the most basic rules of good data visualization is working with color. If all elements in a chart are shown in the same color, then in practice nothing is highlighted at all. Color should be used only for the key element, such as one company, one country, or one specific result we want to draw attention to.</p>
<p>Imagine a comparison of revenues among technology companies where we want to highlight Walmart. Walmart should be shown in its distinctive dark color, while the other companies remain gray. It does not matter whether Walmart is first or fifth in the ranking. What matters is that it carries the main message. A common mistake is the use of red, which automatically signals a problem or negative emotion and can also feel overly simplistic. A much better choice is to use a brand color when presenting results to a client, such as Spotify green or Amazon orange. Such a chart feels natural and the reader intuitively understands where to look. The difference between a good and a bad example is often just a single color, yet the impact on readability is substantial.</p>
<p>Graph 1: right visualisation (interactive)</p>
<iframe class="embed-report" style="height:600px" src="https://flo.uri.sh/visualisation/27680559/embed" title="Correct colour highlighting">
</iframe>
<p>Graph 2: wrong visualisation (interactive)</p>
<iframe class="embed-report" style="height:600px" src="https://flo.uri.sh/visualisation/27680055/embed" title="Incorrect colour highlighting">
</iframe>
</section>
<section id="battery-charts" class="level2">
<h2 class="anchored" data-anchor-id="battery-charts">Battery charts</h2>
<p>Battery charts are often used to display scores, satisfaction levels, or performance on a simple scale. A typical example is customer satisfaction ratings for brands such as Netflix, Amazon, or Uber. The key issue, however, is not only the battery style itself, but especially the correct ordering of items. If brands are arranged randomly, the chart feels chaotic and the reader must work hard to identify the best and worst results.</p>
<p>The correct approach is to sort the batteries from the most positive to the most negative values. The color logic should be clear and consistent, with green for positive results, yellow for neutral, and red for negative. When sorting by satisfaction, the company with the highest satisfaction score should appear at the top and the most negative at the bottom. The sorting variable is the satisfaction value itself, which determines first place, second place, and so on. For example, if Netflix has very high satisfaction and therefore a large green segment, it should be placed at the top. Poorly ordered charts can create the impression that differences are insignificant even when they are meaningful, or they may simply appear confusing. This is why battery charts are especially effective when a correct and an incorrect version are shown side by side.</p>
<p>Graph 3: battery chart (interactive)</p>
<iframe class="embed-report" style="height:600px" src="https://flo.uri.sh/visualisation/27680682/embed" title="Battery chart">
</iframe>
</section>
<section id="time-series-and-missing-data" class="level2">
<h2 class="anchored" data-anchor-id="time-series-and-missing-data">Time series and missing data</h2>
<p>Time series charts are among the most common types of visualizations, but they are also where mistakes occur most frequently. If a certain time period is missing from the data, such as financial results during a crisis or a pandemic, we should not try to hide that gap.</p>
<p>Imagine the development of Airbnb revenues before and after Covid, where part of the data simply does not exist. Filling in or smoothing the line would create a false impression of continuous development. The correct solution is to break the line or clearly mark the missing period. This approach openly acknowledges that the data are incomplete. Inspiration can be found in the book How Charts Lie, which shows how dangerous it is to connect points between which no data exist. Such a chart may be less visually appealing, but it is far more honest. The reader then knows that no conclusions can be drawn for that specific period.</p>
<p>Graph 4: time chart (interactive)</p>
<iframe class="embed-report" style="height:600px" src="https://flo.uri.sh/visualisation/27681542/embed" title="Time series chart">
</iframe>
</section>
<section id="spaghetti-charts-the-problem-of-clarity" class="level2">
<h2 class="anchored" data-anchor-id="spaghetti-charts-the-problem-of-clarity">Spaghetti charts: the problem of clarity</h2>
<p>Spaghetti charts, as I call them, arise when we try to fit too many time series into a single chart. A typical example is comparing the stock performance of several technology companies such as Google, Microsoft, Amazon, and Meta. At first glance the chart looks rich and informative, but on closer inspection it becomes cluttered and difficult to read. The reader does not know which line to follow and the main message gets lost.</p>
<p>One solution is to highlight one key entity, for example Google, using color. The other companies are shown in gray and serve only as context. This approach works well when we want to tell the story of one specific subject. Without highlighting, the chart becomes a tangle of lines with no clear meaning. Good visualization helps the reader immediately understand where to focus.</p>
<p>Graph 5: spaghetti chart (interactive)</p>
<iframe class="embed-report" style="height:600px" src="https://flo.uri.sh/visualisation/27681650/embed" title="Spaghetti chart">
</iframe>
</section>
<section id="spaghetti-charts-splitting-into-small-multiples" class="level2">
<h2 class="anchored" data-anchor-id="spaghetti-charts-splitting-into-small-multiples">Spaghetti charts: splitting into small multiples</h2>
<p>If we want to compare the development of multiple subjects on equal terms, it is often better to use so called small multiples. Instead of one overcrowded chart, we create several smaller charts with the same scale. A typical example is a Formula 1 season, where each driver has their own chart showing positions or points across races. This makes it easy to see how each driver performed over time.</p>
<p>The same principle can be applied to companies, countries, or sports teams. The main advantage is much better readability and easier comparison. The reader does not need to decode colors or legends, but simply follows one story at a time. This approach is ideal when no single subject should be prioritized. The charts feel systematic and analytical rather than chaotic.</p>
<p>Graph 6: spaghetti chart split into small multiples (interactive)</p>
<iframe class="embed-report" style="height:600px" src="https://flo.uri.sh/visualisation/27681671/embed" title="Small multiples">
</iframe>
</section>
<section id="comparing-two-or-more-categories-horizontal-bar-charts" class="level2">
<h2 class="anchored" data-anchor-id="comparing-two-or-more-categories-horizontal-bar-charts">Comparing two or more categories: horizontal bar charts</h2>
<p>Horizontal bar charts are a very powerful tool for comparing categories. They are often used, for example, to display election results or candidate support. They work equally well when comparing customer satisfaction for brands such as Samsung, Apple, or Xiaomi.</p>
<p>When comparing multiple categories, such as very satisfied, somewhat satisfied, dissatisfied, and very dissatisfied, a horizontal layout is clearer than a pie chart. The reader can directly compare the lengths of the bars, which is more natural for the human eye than comparing angles. This type of chart also handles longer labels very well. As a result, it is suitable for more complex data structures. In many cases, it can replace several pie charts with a single clear visual.</p>
<p>Graph 7: horizontal bar chart with more categories (interactive)</p>
<iframe class="embed-report" style="height:600px" src="https://flo.uri.sh/visualisation/27681334/embed" title="Horizontal bar chart, multiple categories">
</iframe>
<p>Graph 8: horizontal bar chart with two categories (interactive)</p>
<iframe class="embed-report" style="height:600px" src="https://flo.uri.sh/visualisation/27681316/embed" title="Horizontal bar chart, two categories">
</iframe>
</section>
<section id="relationships-between-two-variables-showing-the-trend" class="level2">
<h2 class="anchored" data-anchor-id="relationships-between-two-variables-showing-the-trend">Relationships between two variables: showing the trend</h2>
<p>When examining the relationship between two variables, a scatter plot is often used. However, points alone may not be easy for the reader to interpret. For example, when showing the relationship between sugar consumption and the occurrence of tooth decay, individual points can appear chaotic.</p>
<p>Adding a trend line helps reveal the overall direction of the relationship. The reader can then see that as sugar consumption increases, the risk of cavities also rises, even though individual values fluctuate. Of course, a trend line does not imply direct causation, but it greatly simplifies interpretation. Without it, different readers might draw very different conclusions from the same chart. A well used trend does not distort the data, but helps to read them. The goal is to show the relationship, not to overwhelm the viewer with detail.</p>
<p>Graph 9: showing the trend — the wrong way (interactive)</p>
<iframe class="embed-report" style="height:600px" src="https://flo.uri.sh/visualisation/27682020/embed" title="Trend, wrong">
</iframe>
<p>Graph 10: showing the trend — the right way (interactive)</p>
<iframe class="embed-report" style="height:600px" src="https://flo.uri.sh/visualisation/27681990/embed" title="Trend, right">
</iframe>


</section>

 ]]></description>
  <category>Education</category>
  <guid>https://www.analystsdiary.com/posts/education/visualising-data-part-1.html</guid>
  <pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate>
  <media:content url="https://www.analystsdiary.com/assets/icons/education.svg" medium="image" type="image/svg+xml"/>
</item>
<item>
  <title>Survivorship bias</title>
  <link>https://www.analystsdiary.com/posts/education/survivorship-bias.html</link>
  <description><![CDATA[ 




<div class="callout callout-style-simple callout-note">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>This article is also available on Spotify as an extended audio version. <a href="https://open.spotify.com/episode/17B0E4Jqkxeu8kHtD2KM47">Spotify</a> · <a href="https://podcasts.apple.com/us/podcast/survivorship-bias/id1879811604?i=1000751212470">Apple Podcasts</a></p>
</div>
</div>
</div>
<p>Survivorship bias is one of the most deceptive statistical distortions. It occurs when we analyze only the cases that survived, succeeded, or reached us, while ignoring those that disappeared from the data entirely. The result is conclusions that may sound logical, but are actually wrong. The following examples show how easily this bias can arise in war, science, animals, and also in sport and education.</p>
<section id="when-more-injuries-mean-fewer-deaths" class="level2">
<h2 class="anchored" data-anchor-id="when-more-injuries-mean-fewer-deaths">When more injuries mean fewer deaths</h2>
<p>One of the less known but very revealing examples of survivorship bias is the introduction of more modern military helmets during World War II. At a certain stage of the conflict, military commanders noticed an apparently alarming trend. After new, higher quality helmets were introduced, the number of injured soldiers transported to field and rear hospitals began to rise sharply. This effect raised doubts among commanders about the effectiveness of the new protective equipment. From a purely intuitive perspective, it looked as if the new helmets were failing because they were producing more injured soldiers. There were even discussions about returning to older helmet designs or limiting the use of the new ones.</p>
<p>The core problem, however, was the way the data were evaluated. The analysis relied almost exclusively on data from military hospitals and medical stations. These data included only soldiers who survived long enough to be evacuated and treated. In contrast, data on those killed in action were not systematically included, even though other parts of the military recorded them, such as burial units. Once these datasets were later connected, a completely different picture began to emerge. It turned out that the new helmets significantly reduced mortality caused by head injuries. According to military medical statistics from World War II, the share of fatal head injuries dropped by tens of percent after the introduction of modern steel helmets, with some units reporting a decline of approximately 40 to 50 percent compared with earlier equipment.</p>
<p>At the same time, the number of soldiers with non fatal head injuries, concussions, or shrapnel wounds increased, but they survived. These soldiers would have been far more likely to die on the battlefield in earlier stages of the war, and they would never have appeared in hospital statistics at all. The rise in the number of injured soldiers was therefore not evidence that the protective gear had failed. It was evidence that it worked. Helmets were turning immediately fatal hits into survivable injuries. Statistics based only on hospital data, however, completely distorted this positive effect.</p>
<p>In this case, survivorship bias did not only lead to a wrong statistical conclusion. It almost led to a wrong strategic decision. Only by including complete data on both the injured and the dead was it possible to interpret the situation correctly and confirm that the new helmets were saving lives.</p>
</section>
<section id="aircraft-in-world-war-ii-where-to-add-armor" class="level2">
<h2 class="anchored" data-anchor-id="aircraft-in-world-war-ii-where-to-add-armor">Aircraft in World War II: where to add armor</h2>
<p>The most classic and now textbook example of survivorship bias is the analysis of damage to military aircraft during World War II. This problem was addressed by the British and American air forces as they tried to reduce the heavy losses of bombers during raids over occupied Europe. Every lost aircraft meant not only a destroyed machine, but also the loss of a multi person crew, which created a serious strategic problem.</p>
<p>The military therefore began to systematically collect data on aircraft that returned from combat missions. For these planes, bullet and shrapnel hits were recorded in detail. The statistics showed that the most frequent damage appeared on the wings, the rear sections of the fuselage, and around the tail surfaces. At first glance, it seemed logical to add armor to these parts of the aircraft, because that was where the largest number of hits occurred.</p>
<p>This intuitive conclusion was challenged by the mathematician Abraham Wald. Wald pointed out a fundamental error in reasoning. Only the aircraft that returned from missions were being analyzed. Data on the aircraft that were shot down and never returned to base were completely missing. These invisible aircraft were the key to understanding the problem. Wald noticed that some parts of the aircraft, especially the engines, the cockpit, and the fuel systems, showed surprisingly few hits on the planes that came back. This did not mean those areas were hit less often in combat. It meant that hits in those areas were highly likely to be fatal. If the engine or cockpit was struck, the aircraft simply did not return, and therefore never entered the dataset.</p>
<p>Based on this reasoning, Wald recommended adding armor precisely to the places where hits on surviving aircraft were almost absent. Specifically, this included the engines, the pilot compartment, and certain fuselage sections near fuel tanks. At first, this approach seemed counterintuitive to military leadership because it went directly against the visible data. After implementation, however, there was a measurable reduction in bomber losses. According to later analyses, optimized armor placement led to a reduction in aircraft losses by single digit to lower double digit percentages depending on mission type and deployment.</p>
<p>This case became an iconic example showing that missing data can carry critical information. Wald’s analysis demonstrated that focusing only on surviving objects leads to systematically incorrect conclusions. Here, survivorship bias was not just a theoretical statistical issue. It was a matter of life and death. This example still serves as a warning that when analyzing data, we must ask not only what we see, but also whether something is missing from the data, and why. We should not look only at results, but also view the case from other angles that may reveal what the numbers alone do not.</p>
</section>
<section id="why-athletes-are-winter-born-and-academics-are-autumn-born" class="level2">
<h2 class="anchored" data-anchor-id="why-athletes-are-winter-born-and-academics-are-autumn-born">Why athletes are winter born and academics are autumn born</h2>
<p>Survivorship bias also appears very strongly in birth date data among successful people. Among elite athletes, this phenomenon is one of the best documented. Research consistently shows that athletes born in the first part of the year are significantly overrepresented compared with those born later in the year. For example, in the Canadian NHL, analyses by Rodger Barnsley found that approximately 40 percent of players were born in January through March, while only 8 to 10 percent were born in October through December. In the general population, birth distribution is close to even. This difference therefore cannot be random.</p>
<p>A similar pattern appears in European football. UEFA studies show that in youth academies of elite clubs, up to 60 percent of players are born in the first half of the year. Among famous athletes born very early in the year are, for example, Cristiano Ronaldo (5 February), Neymar (5 February), Buffon (28 January), all football, Wayne Gretzky (26 January), Jaromír Jágr (15 February), or Phil Esposito (20 February). These visible examples stand out, while thousands of less fortunate talents born later in the year disappear from the data entirely.</p>
<p>The mechanism is simple. Children born in January are almost a full year older than children born in December within the same youth category. In youth sport, this difference creates a major physical and psychological advantage. Coaches therefore more often select the older children because they show better immediate performance. These children receive more training, better conditions, and greater trust. Professional sport statistics then show only those who survived this selection. The others, often equally talented, are missing from the data. Here again, survivorship bias is at work.</p>
<p>Interestingly, the opposite pattern appears in academic success, especially among Nobel Prize winners. Analyses suggest that Nobel laureates have an above average share of births in autumn, especially in September and October. For example, studies published in the Journal of Biosocial Science found that roughly 30 to 35 percent of Nobel Prize winners born in the Northern Hemisphere fall in the period September through November, while spring months are represented much less. Well known Nobel Prize winners born in autumn include, for example, Niels Bohr (7 October), Richard Thaler (12 September), or Marie Curie (7 November). Autumn births repeatedly appear among scientists who followed long academic careers.</p>
<p>The explanation again does not lie in biology, but in the system. The school year begins in autumn. Children born shortly after the start of the school year are the oldest in their class. They often have greater cognitive maturity, better early educational results, and more frequent positive feedback from teachers. This increases their confidence and willingness to continue studying. These small advantages accumulate over time and increase the probability that a child will pass through the entire education system to its top levels. Nobel Prize statistics then again show only the survivors, not everyone who could have succeeded but dropped out earlier.</p>
<p>Survivorship bias in this case creates the impression that success is linked to the birth date itself. In reality, it reflects the structure of the systems people move through. The data are correct, but without understanding who is missing from them, they lead to incorrect conclusions. Exceptions can of course be found in both sport and science, but those are precisely the cases that had lower odds of reaching the top.</p>


</section>

 ]]></description>
  <category>Education</category>
  <guid>https://www.analystsdiary.com/posts/education/survivorship-bias.html</guid>
  <pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate>
  <media:content url="https://www.analystsdiary.com/assets/icons/education.svg" medium="image" type="image/svg+xml"/>
</item>
<item>
  <title>How statistics lie</title>
  <link>https://www.analystsdiary.com/posts/education/how-statistics-lie.html</link>
  <description><![CDATA[ 




<p>Even accurate statistics can lead to wrong conclusions if they are presented without proper care and context. The way numbers are visualized, summarized, and framed strongly influences how they are understood by the reader. Charts, averages, or percentages may appear objective, yet they always highlight some aspects of reality while downplaying others. Without clear explanation and transparent presentation, correct results can easily be misunderstood or become misleading. That is why responsible statistical communication is not only about getting the numbers right, but about presenting them in a way that supports fair and accurate interpretation.</p>
<section id="us-presidential-election-2016-when-the-map-lies-but-the-data-do-not" class="level2">
<h2 class="anchored" data-anchor-id="us-presidential-election-2016-when-the-map-lies-but-the-data-do-not">US Presidential Election 2016: when the map lies but the data do not</h2>
<p>The 2016 US presidential election is one of the most well known examples of how data visualization can fundamentally distort reality. Donald Trump won the election even though he received fewer votes than his opponent. This fact alone is surprising to many people because we intuitively expect the winner of an election to be the candidate who receives the highest number of votes. In the American electoral system, however, the outcome is decided by electors, not by the direct popular vote.</p>
<p>Shortly after the election, a map of the United States spread widely across media and social networks. The map was almost entirely colored red. At first glance, it appeared to be clear evidence of a sweeping Republican victory across the entire country. For many people, it became a visual confirmation that Trump had the support of the majority of America. This impression, however, was largely misleading.</p>
<p>The problem was not the election data themselves, but the way they were displayed. A traditional state map primarily shows geographic area, not the number of inhabitants or voters. Large and sparsely populated states therefore occupy vast areas on the map, even though relatively few people live there. These states also have a low number of electors, which limits their real influence on the election result. In contrast, densely populated states such as California or New York appear relatively small on the map, despite being home to tens of millions of people. Their actual weight is therefore visually strongly underestimated. The map highlights space rather than population and creates an image that does not correspond to the distribution of votes. The result is a visualization that supports a very strong but misleading narrative.</p>
<p>Once a cartogram or so called tile map is used instead, where one unit corresponds to a specific number of inhabitants or electors, the picture of the election changes dramatically. It suddenly becomes clear where support for individual candidates was truly concentrated. Small but populous states are no longer visually marginalized and their importance becomes much more apparent. At the same time, it becomes evident that vast areas with few inhabitants do not carry the decisive weight suggested by the traditional map. The same data begin to tell a completely different story.</p>
<p>In neither case are the numbers incorrect. The difference lies solely in what the visualization emphasizes and what it hides. This example clearly shows that a map is not a neutral tool, but a powerful interpretive framework. It can very easily shape public perception of reality and political sentiment. That is why it is always important to ask what exactly a given map shows and especially what it does not show. The data did not lie. The visual interpretation was misleading.</p>
</section>
<section id="manipulating-scale-how-to-turn-a-small-difference-into-a-crisis" class="level2">
<h2 class="anchored" data-anchor-id="manipulating-scale-how-to-turn-a-small-difference-into-a-crisis">Manipulating scale: how to turn a small difference into a crisis</h2>
<p>Another very common way statistics can create a misleading impression is through manipulation of axis scales in graphs. This issue appears mainly in media, political communication, and various presentations where a chart is meant to support a particular narrative. At first glance, such a graph may appear completely correct and professional.</p>
<p>A typical example is a comparison of two values, such as inflation at 4.0 percent and 5.5 percent. On paper, this represents a difference of 1.5 percentage points, which is a change with some significance but not an extreme one. However, if the graph is designed so that the axis does not start at zero but instead at 3.8 percent, the difference begins to look dramatic. Bars or curves visually diverge much more, and the change appears far larger than it actually is. The viewer may then gain the impression that inflation has surged or that the economic situation has deteriorated dramatically.</p>
<p>In reality, the absolute change has not changed at all. Only the method of visualization has. The same data plotted on an axis starting at zero would appear much calmer and more moderate. The difference would still be visible, but it would not feel alarming. This contrast shows that the numbers themselves are not the problem. The problem lies in the context into which they are placed and the visual framing chosen by the author of the chart. The axis scale determines whether a change is perceived as a minor deviation or as a crisis.</p>
<p>The same principle can also be used in the opposite direction. If we want to obscure or downplay a difference, we choose a very wide scale. In that case, graphs look almost identical even when the values differ significantly. Such a graph can create the impression that nothing has really changed, even in situations where the change has real consequences. This approach often appears in presentations intended to reassure the public, investors, or voters. Negative developments are visually diluted within a wide scale and lose urgency. Readers or viewers may not notice the difference at all or may underestimate it.</p>
<p>Axis scaling thus becomes a very powerful tool for interpreting data. In such cases, the graph does not convey information but works with emotions. Sometimes it triggers panic, other times false calm. Yet the underlying data remain the same in both cases. That is why it is essential to always check where an axis starts and where it ends. Without this context, a graph may appear convincing while being misleading at the same time. Proper visualization should reflect the real significance of a change, not serve political, media, or marketing intentions. Once scale becomes a tool of manipulation, the graph stops informing and starts influencing, even when the values themselves are correct.</p>
</section>
<section id="is-the-average-or-the-median-better" class="level2">
<h2 class="anchored" data-anchor-id="is-the-average-or-the-median-better">Is the average or the median better?</h2>
<p>Misleading interpretation of statistics does not concern only elections or sports. It appears very often in everyday economic and social data as well. A typical example is the use of averages, which may seem intuitive and objective at first glance.</p>
<p>Average wages are frequently used when comparing cities, regions, or entire countries. When we look more closely, however, we find that averages can significantly distort reality. Imagine a city where most people earn around 3,500 dollars per month, but where several large companies also operate with extremely high executive salaries. These extreme incomes pull the average sharply upward. The result may be an average wage of 5,000 dollars per month, even though most residents are nowhere near that income. The average then does not describe the experience of the typical person, but rather reflects the existence of a small group of very highly paid individuals.</p>
<p>In such situations, the median wage is a much more appropriate indicator. The median shows how much the person exactly in the middle of the income distribution earns. Half of the people earn less and half earn more. If the median in a given city is, for example, 3,800 dollars, it corresponds much better to the reality of most residents. The difference between the average and the median also reveals income inequality. The larger the gap between these two values, the more unevenly incomes are distributed.</p>
<p>A similar issue appears when comparing regions, where one large city can significantly improve the average for an entire region. People in smaller towns or rural areas then feel that the presented figures do not match their lived reality at all. This is largely because people generally understand averages more easily than medians. When we tell them that the average wage in a region is 3,500 dollars, they grasp it faster than if we say that the median income in the region is 3,800 dollars.</p>
<p>Distortion also often arises from poor choice of comparison periods. If we compare an extreme year with a normal period, results may appear either excessively positive or catastrophically negative. Crisis years often serve as a very low baseline. Any return toward normal then looks like rapid growth, even though it is only partial recovery. This was clearly visible during the COVID 19 pandemic, when the economy contracted sharply in 2020 due to lockdowns. If GDP then grew year on year by, for example, 5 percent in 2021, it could appear as an extraordinary success, even though the economy still had not reached pre pandemic levels.</p>
<p>In such cases, the data are technically correct but taken out of context. A simple year on year comparison does not indicate whether we are seeing real growth or merely recovery from an unusually weak period. For correct interpretation of statistics, it is therefore crucial to ask not only how much, but also who it affects, which period the data come from, and how the values are distributed. Only the combination of these questions allows us to understand what the numbers truly say and what they only seem to suggest.</p>
</section>
<section id="sports-statistics-when-percentages-mislead-goaltenders" class="level2">
<h2 class="anchored" data-anchor-id="sports-statistics-when-percentages-mislead-goaltenders">Sports statistics: when percentages mislead goaltenders</h2>
<p>Sports statistics can appear very convincing, but without context they often lead to incorrect conclusions. A typical example is evaluating ice hockey goaltenders solely by save percentage.</p>
<p>Imagine two goaltenders. The first has a 100 percent save rate because he stopped all 10 shots he faced. The second has a save percentage of 88 percent because he faced 50 shots and allowed 6 goals. At first glance, it appears that the first goaltender delivered a much better performance. This conclusion, however, is misleading.</p>
<p>The goaltender with a perfect save rate may have played behind a very strong team and faced only a few non dangerous situations. In contrast, the second goaltender may have been under extreme pressure throughout the game. Fifty shots represent a very high workload, and even very strong performances usually result in goals against. In this context, an 88 percent save rate may be above average, even though the percentage itself looks negative. Both values are calculated correctly, but without understanding the circumstances, they tell a distorted story.</p>
<p>The problem therefore lies not in mathematics, but in interpretation. Save percentage does not account for shot quality, team defense, or the overall workload of the goaltender. That is why it is necessary to consider additional metrics such as shot volume, expected goals, or game context. This example shows that a single number is never sufficient on its own and that even correct statistics can be misleading without context.</p>
</section>
<section id="why-correct-data-are-not-enough" class="level2">
<h2 class="anchored" data-anchor-id="why-correct-data-are-not-enough">Why correct data are not enough</h2>
<p>All the previous examples show one fundamental truth. Statistics themselves do not lie. Misleading conclusions arise when we interpret them without understanding context. Whether we are dealing with election maps, axis scales in charts, sports percentages, or average wages, the problem is not the number but how it is interpreted.</p>
<p>Visualization can strongly influence how we perceive data. It can emphasize one aspect of reality while hiding another. An average can conceal inequality, a map can highlight space instead of people, and axis scaling can turn a small difference into a crisis. That is why it is essential to approach data critically and ask what the numbers truly tell us and what they do not. Proper work with data is not only about calculation, but primarily about fair interpretation. Only then can statistics genuinely help us understand reality instead of distorting it.</p>


</section>

 ]]></description>
  <category>Education</category>
  <guid>https://www.analystsdiary.com/posts/education/how-statistics-lie.html</guid>
  <pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate>
  <media:content url="https://www.analystsdiary.com/assets/icons/education.svg" medium="image" type="image/svg+xml"/>
</item>
<item>
  <title>Home field advantage in the AFC, 2024 season</title>
  <link>https://www.analystsdiary.com/posts/sport/home-field-advantage.html</link>
  <description><![CDATA[ 




<div class="callout callout-style-simple callout-note">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>I examined this question in far more depth in my bachelor’s thesis, which analyses ten seasons (2015–2024) rather than one, and covers all 32 teams. Its conclusions differ from this earlier piece in important ways — see <a href="../../publications.html">Publications</a>.</p>
</div>
</div>
</div>
<p>The home environment in professional sport, including American football, has long been considered a key factor influencing match outcomes. Home field advantage is commonly attributed to several main factors, such as fan support, familiar playing conditions, the absence of travel related stress, and in some cases unintentional referee bias. In the NFL, it has been historically documented that teams achieve a higher winning percentage in home games than in away games, although the magnitude of this effect may vary across individual seasons.</p>
<p>The main research question of this article is: <strong>do teams in the AFC have a higher probability of winning home games than away games?</strong> This question is analyzed through a statistical examination of the results from the 2024 regular season. Average points scored and points allowed in home and away games are compared, along with their effect on the probability of winning.</p>
<p>Home field advantage in the NFL is not fixed. Its impact may vary depending on factors such as team quality, playing strategy, stadium specific characteristics, or coaching decision making styles. It is therefore essential to determine whether the 2024 season confirms traditional patterns of home advantage or suggests a shift in its importance.</p>
<section id="key-factors-influencing-home-advantage" class="level2">
<h2 class="anchored" data-anchor-id="key-factors-influencing-home-advantage">Key factors influencing home advantage</h2>
<p>One of the most frequently cited factors is home crowd support. Fans can positively influence home team players by providing energy and motivation (Nevill &amp; Holder, 1999). At the same time, they may exert psychological pressure on referees and influence their decisions in favor of the home team (Anderson et al., 2012). In the NFL, some stadiums are famous for their noise levels, such as Arrowhead Stadium, the home of the Kansas City Chiefs, where crowd noise often exceeds 100 decibels. This noise can disrupt the opposing team’s communication, particularly during offensive plays.</p>
<p>Home teams are accustomed to the conditions of their stadium, including the type of playing surface, climate, and lighting conditions (Pollard, 2006). This can play a crucial role, especially in cases where teams from warmer regions must adapt to games played in colder climates and vice versa. For example, teams such as the Buffalo Bills or the New England Patriots are accustomed to playing in cold weather, which may give them an advantage over teams from warmer regions such as the Miami Dolphins or the Jacksonville Jaguars.</p>
<p>Visiting teams often have to overcome long travel distances, which can negatively affect their performance. Research has shown that traveling across multiple time zones can lead to jet lag, which negatively affects both physical performance and mental concentration (Smith et al., 1997). The NFL is specific in that it includes teams spread across the entire United States, meaning that some teams must travel thousands of kilometers between games. For example, the Seattle Seahawks, based in the northwestern United States, often face the longest travel distances of all NFL teams.</p>
<p>Another factor that may influence home advantage is subconscious cognitive bias among referees. Research shows that referees often subconsciously favor home teams, especially in borderline situations (Balmer et al., 2007). Analyses of penalty decisions in the NFL suggest that home teams tend to receive fewer penalties than visiting teams, although this effect has slightly decreased in recent years due to the introduction of video review systems.</p>
<p>According to a study by Jamieson (2010), the average level of home advantage in the NFL is around 55 to 60 percent home team victories. However, this trend has shown a slight decline over recent decades.</p>
</section>
<section id="data-and-method" class="level2">
<h2 class="anchored" data-anchor-id="data-and-method">Data and method</h2>
<p>The data used for this analysis come from official results of the 2024 NFL regular season. The sample includes all teams from the AFC conference, and the following statistics were recorded:</p>
<ul>
<li>number of home wins and losses — the total number of games won at the home stadium</li>
<li>number of away wins and losses — the total number of games won on the opponent’s field</li>
<li>average points scored at home and away</li>
<li>average points allowed at home and away</li>
<li>percentage probability of winning at home and away</li>
</ul>
<p>Descriptive statistics and regression analysis were used for the analysis. The model evaluates the relationship between points scored and points allowed and the probability of winning. In addition to regression analysis, differences between home and away winning probabilities are also presented.</p>
<p>Based on previous research and theoretical insights, teams should exhibit a higher percentage probability of winning at home than away, which would confirm the hypothesis of home field advantage.</p>
</section>
<section id="results" class="level2">
<h2 class="anchored" data-anchor-id="results">Results</h2>
<p>The average values of individual variables show that teams score more points at home than away, suggesting that offensive performance is stronger in the home environment. Teams also allow fewer points at home than away, which may indicate that defense is more effective at home or that visiting teams struggle to adapt to new conditions. The probability of winning at home is higher than away, confirming the existence of home field advantage.</p>
<ul>
<li>The probability of winning at home is 63.2 percent, compared with 43.8 percent away.</li>
<li>Points scored away have a greater impact on winning than points scored at home.</li>
<li>Points allowed at home have a stronger negative effect on winning than points allowed away.</li>
</ul>
<p>Overall, the models confirm that home advantage exists, but its effect may be smaller than expected, particularly for elite teams that perform consistently well away from home.</p>
</section>
<section id="why-conceding-hurts-more-at-home" class="level2">
<h2 class="anchored" data-anchor-id="why-conceding-hurts-more-at-home">Why conceding hurts more at home</h2>
<p>The analysis shows that points allowed have a greater negative impact on the probability of winning at home than away. This means that when a home team concedes points, its chance of winning decreases more than that of a visiting team in a comparable situation. If a home team concedes, its probability of winning decreases by an average of 25 percent. For away teams, the decrease is smaller, averaging 22.7 percent.</p>
<p>This effect can be explained by several factors. The home team faces greater pressure from fans who expect a victory. When the home team allows points, demoralization may occur, which affects on field performance. Coaches of home teams may be under pressure to respond quickly and adjust strategy, leading to greater risk taking. Some teams adopt more aggressive play after conceding points, which can result in additional mistakes.</p>
<p>These results suggest that the psychological effect of the home environment may in certain situations be more negative than positive, particularly when a team finds itself in a disadvantageous position. These findings offer a new perspective on the traditional concept of home advantage and indicate that the pressure associated with home games can be counterproductive for some teams.</p>
</section>
<section id="limitations" class="level2">
<h2 class="anchored" data-anchor-id="limitations">Limitations</h2>
<p>Although the analysis provides valuable insights into home advantage in the NFL, it is important to consider certain limitations. The results apply only to the 2024 regular season and may not be fully generalizable to other seasons. Home advantage may change over time depending on league trends, rule changes, or competitive balance.</p>
<p>Individual team performance was not taken into account. The analysis worked with overall trends within the AFC conference, but specific teams may exhibit different patterns. Some teams may have an extremely strong home record, while others may perform similarly at home and away, and differences may also be driven by schedule strength.</p>
</section>
<section id="conclusion" class="level2">
<h2 class="anchored" data-anchor-id="conclusion">Conclusion</h2>
<p>This article confirmed that the home environment provides teams in the AFC conference with an advantage during the 2024 regular season, while also revealing several surprising nuances. While home teams show a higher probability of winning and better offensive and defensive statistics, points scored away play a more significant role in victories than points scored at home. In addition, psychological pressure after conceding points is greater for home teams, which may be an important factor in game strategy planning.</p>
</section>
<section id="a-note-on-what-came-next" class="level2">
<h2 class="anchored" data-anchor-id="a-note-on-what-came-next">A note on what came next</h2>
<p>This article works with a single season and one conference. Extending the same question to ten seasons and the whole league changes the picture: once team strength is controlled for season by season, the only environmental factor that reliably moves home-field advantage is the visiting team crossing three time zones. Stadium type and weather do not hold up. The full analysis is in my bachelor’s thesis, linked under <a href="../../publications.html">Publications</a>.</p>
</section>
<section id="references" class="level2">
<h2 class="anchored" data-anchor-id="references">References</h2>
<p>ANDERSON, Eric, et al.&nbsp;(2012). Home Advantage in Professional Sports: A Meta-Analysis. <em>Journal of Sports Science and Medicine.</em></p>
<p>BALMER, Nigel J., et al.&nbsp;(2007). Influence of Crowd Noise on Refereeing Decisions in Association Football. <em>Journal of Sports Sciences.</em></p>
<p>JAMIESON, John P. (2010). The Home Field Advantage in Athletics: A Meta-Analysis. <em>Psychology of Sport and Exercise.</em></p>
<p>NEVILL, Alan M., &amp; HOLDER, Russell L. (1999). Home Advantage in Sport: An Overview of Studies on the Advantage of Playing at Home. <em>Sports Medicine.</em></p>
<p>POLLARD, Richard. (2006). Home Advantage in Soccer: Variations in its Magnitude and a Literature Review on Inter-Related Factors. <em>Journal of Sports Sciences.</em></p>
<p>SMITH, R. S., &amp; REILLY, Thomas. (1997). Influence of Travel on Performance in Sport: Implications for Performance and Recovery. <em>Sports Medicine.</em></p>
<p>NFL.com (2024). Team Stats — NFL Statistics. <a href="https://www.nfl.com/stats/team-stats/" class="uri">https://www.nfl.com/stats/team-stats/</a></p>
<p>Livesport.cz (2024). NFL — Results and statistics. <a href="https://www.livesport.cz/americky-fotbal/usa/nfl/" class="uri">https://www.livesport.cz/americky-fotbal/usa/nfl/</a></p>


</section>

 ]]></description>
  <category>Sport</category>
  <guid>https://www.analystsdiary.com/posts/sport/home-field-advantage.html</guid>
  <pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate>
  <media:content url="https://www.analystsdiary.com/assets/icons/football.svg" medium="image" type="image/svg+xml"/>
</item>
</channel>
</rss>
