Last entry provided a glimpse into how Australia’s mining industry plays a big role in our aviation industry. I also found this graphic1 which shows a pretty cool visualisation of how FIFO flights look in the grand scale of things.

In my last analysis, I used some big assumptions to label flights as FIFO vs non-FIFO based on carrier. However, since then, I have come to see that this is not a great way to estimate if a flight is a FIFO service or not. While I don’t plan to do anything particularly as complex as creating a model, I want to use this entry to get a more accurate depiction of FIFO scheduling and then hopefully use this dataset in my next entry with my Contrails data, which has continued to grow with my cron job.


Filtering Data

This time, I used my ADSB data and filtered it using state boundaries to filter the dataset to Western Australia instead of the whole Australian continent.


wa = states.loc[
    (states["admin"] == "Australia") & (states["name"] == "Western Australia"),
    "geometry",
].iloc[0]

gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.longitude, df.latitude), crs="EPSG:4326")
df_wa = gdf[gdf.within(wa)]


I initially thought of using the registration number of the plane to filter data, but noticed that this can be inconsistent with the operating airline (e.g. if an airline sells the plane to another company). I also realised that callsign is not a great way to distinguish a carrier, as this seems to conflate airlines with its subsidiaries (e.g. Qantas + Network Aviation + QantasLink).

I decided to filter using icao24 which are 24-bit addresses using Australia’s hex range, which is 7C0000–7FFFFF2. I also made sure to keep the earliest entry for that aircraft to remove duplicate entries.

I then merged this with OpenSky data on the icao24 column which gave me information such as: operator, owner, and aircraft.

Frequency of flights by operator in WA

Interestingly, QLK callsign for Qantaslink is completely absent from WA due to the QantasLink brand being completely operated by Network Aviation there. Virgin Australia Regional Airlines and Virgin Australia are also indistinguishable by callsign.


How to best distinguish FIFO vs non-FIFO?

After some confusion with operator codes, I decided that for the scope of this task, I would use flight number and origin/destination to determine if a flight was FIFO or non-FIFO.


Flight Number Rules

On major airlines:

Virgin Australia: Flights VA9000 to VA9999 are operated by Virgin Australia Regional Airlines and are listed as charter services3 which I will take to be FIFO services for this exercise.

Qantas: QF1600–QF1999 are FIFO services4 and QF2700–2735, QF2770–2775 and QF6590–6599 are all Network Aviation flight numbers5, which can be considered as FIFO here.

Jetstar: All flights can be labeled non-FIFO as it is a LCC carrier

Alliance Airlines: Could not find a clear designation of flight number being FIFO or not. Considering it’s described as Australia’s major FIFO operator, I am going to label all as FIFO despite it being a simplification.

Rex (Regional Express): all FIFO flights are operated via National Jet Express, so I labelled all ZL/RXA flights as non-FIFO6.


Origin/Destination Filtering

I used standingdata on Github’s repo containing callsigns and their corresponding route (origin-destination) and then joined that with my dataset.

I located the airports of several confirmed mine sites using the ICAO codes: “YCHK”, “YFDF”, “YANG”, “YBGD”, “YWGA”, “YIBO”, “YGIA”, “YSOL”, “YEWA”



After doing both of these filtering actions, I got the following using pandas crosstab.

Note that the “unknown” label was applied when the standingdata merge did not result in a match for the callsign so the origin or destination of a flight could not be determined, nor could the FIFO status be later determined from the flight number. “Unlabelled” is used when there was a flight number with a matching origin/destination but none of the flight number airline-specific rules were applied to them. I couldn’t determine a flight number rule for Network Aviation to classify as FIFO/non-FIFO, which is a weakness as most flights are likely to be FIFO but outside of my mine-site airport list. “none” represents cases where the flight callsign failed to match with an airline in my list from Wikipedia of Australian airlines, which are mostly small Australian-registered aircraft which are private, business and small charter flights.

There are definitely a lot of limitations in the dataset, but let’s see if there’s an improvement to the plots:

fifo_or_non_fifo      FIFO  non-FIFO  unknown  unlabelled
airline
Airnorth                 0         0       55         214
Alliance Airlines     1852         0        0           0
FlyPelican               0         0       21           0
Jetstar                  0      1979        0           0
National Jet Express  2157         0        0           0
Network Aviation      1747         0      667        4900
Qantas                  88      3572        0           0
Rex Airlines             0        31        0           0
Skytraders               0         0        2           0
Virgin Australia      2824      4789        0           0
none                     0         0     4522           0

Next, I plotted my plots from Entry 9 with the newly filtered and more accurate Entry 10 data to compare FIFO vs non-FIFO flights in day of week and time of day.

FIFO vs non-FIFO in WA by hour of day compared with Entry 9

The effects are much more pronounced for FIFO flights, with a large majority of flights occurring early in the day or around 5pm. This is explained as the “morning wave”, where workers arrive early to get to the site and work their 12-hour days by mid-morning7. The rise in the afternoon is explained by workers completing their shifts and returning to Perth where they commute home8.

The human factors element here is important for any future contrail-avoidance scheme. Maisey et al. 7 found that shift start times earlier than 06:00 can result in significant sleep loss and reduced alertness throughout the day, which can pose accident and health risks. The implications of this are that shifting FIFO departures to avoid contrail-forming air would need to balance accounting for its effect on workers with costs to companies such as weekend penalty rates.

FIFO vs non-FIFO in WA by day of week compared with Entry 9

Compared to Entry 9, there is a more visible split in proportion of weekend flights for FIFO compared to non-FIFO Saturday through Monday and then more FIFO flights occurring on weekdays. Weekend flights are uncommon for FIFO perhaps because weekends result in penalty rates for crew (higher expenses) and there are limited flights in regional areas on weekends.


It is exciting to work with the data directly on Jupyter Notebooks using Pandas but I don’t want to go down a rabbithole in refining FIFO vs non-FIFO classification! I look forward to using this dataset next with the contrails dataset.


References

[1] r/perth (Reddit). Air traffic around Australia, eight hours.

[2] AirLabs. ICAO 24-bit address.

[3] Hong Kong Airlines. Airline partner: Virgin Australia.

[4] Australian Frequent Flyer. Qantas flight numbers.

[5] Qantas Group. Network Aviation.

[6] Regional Express (Rex) (2022, September 30). Rex finalises purchase of National Jet Express [Media release].

[7] Maisey, G., Cattani, M., Devine, A., Lo, J., Fu, S. C., & Dunican, I. C. (2022). Digging for data: How sleep is losing out to roster design, sleep disorders, and lifestyle factors. Applied Ergonomics, 99, 103617.

[8] Smithies, T. D., Vincent, G. E., Ferguson, S. A., Maisey, G., Fraser, H., & Dunican, I. C. (2026). Drilling down on roster design: comparing fly-in fly-out roster patterns in the West Australian mining industry. Annals of Work Exposures and Health, 70(2), wxag007.


<
Previous Post
Entry 9: Exploring FIFO Charter Flights
>
Next Post
Entry 11: Do FIFO flights enter contrail-forming regions?