Glider Performance

So I started wondering the other day just how each of our gliders at the club stack up against each other on OLC. Thankfully, the Online Contest website has a large amount of data available.  After grabbing a bunch of data and writing a python script to analyze it we have the following result:

The DG808/15m is the most successful aircraft for collecting Points.  This is not taking into account any bias on the pilot.  It could be that all 16 flights recorded were done by the best pilot on earth and are skewing the data (what a jerk!).  There is also the possibility of a bias based on how OLC rates the aircraft, since they have a “handicap” number for each aircraft.

What is interesting is that our oldest aircraft, the 1-26, rates at 230 on the chart, where other more advanced planes like the L-23 and L-33 are at 339 and 414 respectively.  Our best aircraft, the Cirrus, rates at 220, just barely above the 1-26.  So the handicap levels are working to level the playing field at least to some extent.

Something else that might be interesting is comparing the cost vs average number of points collected to see what is the most cost effective aircraft for collecting points.

The finished dataset can be downloaded here: aircraftStats

The python script used is below.

import csv
data = list()
canadaFiles = ['OLC_Daily Score_Canada_2016.csv',
                 'OLC_Daily Score_Canada_2015.csv',
                 'OLC_Daily Score_Canada_2014.csv',
                 'OLC_Daily Score_Canada_2013.csv']

worldFiles = ['OLC_Daily Score_Worldwide_2016.csv',
              'OLC_Daily Score_Worldwide_2015.csv',
              'OLC_Daily Score_Worldwide_2014.csv',
              'OLC_Daily Score_Worldwide_2013.csv',
              'OLC_Daily Score_Worldwide_2012.csv',
              'OLC_Daily Score_Worldwide_2011.csv',
              'OLC_Daily Score_Worldwide_2010.csv',
              'OLC_Daily Score_Worldwide_2009.csv',
              'OLC_Daily Score_Worldwide_2008.csv',
              'OLC_Daily Score_Worldwide_2007.csv']

for filename in worldFiles:
    with open(filename, 'rb') as file:
        csvreader = csv.reader(file)
        for line in csvreader:
            if line[0] is not '#':
                data.append(line)
print "Num Flights Examined: %d"%len(data)
# Sort by Aircraft type
aircraftSortedNames = list()
aircraftPoints = list()
aircraftDistance = list()
for row in data:
    if row[7] not in aircraftSortedNames:
        aircraftSortedNames.append(row[7])
        aircraftPoints.append(list())
        aircraftDistance.append(list())
    aircraftPoints[aircraftSortedNames.index(row[7])].append(float(row[1]))
    aircraftDistance[aircraftSortedNames.index(row[7])].append(float(row[3]))

# Aircraft stats formatted as [aircraft name, flightCount, Max Points, Min Points, Average Points per flight, max km, min km, ave km]
aircraftStats = list()
for index in range(len(aircraftSortedNames)):
    flightCount = len(aircraftPoints[index])
    maxPoints = max(aircraftPoints[index])
    minPoints = min(aircraftPoints[index])
    sumPoints = sum(aircraftPoints[index])
    avePoints = float(sumPoints)/float(flightCount)
    maxDist = max(aircraftDistance[index])
    minDist = min(aircraftDistance[index])
    sumDist = sum(aircraftDistance[index])
    aveDist = float(sumDist)/float(flightCount)
    # Remove anything with less than 3 flights, since it's not statistically significant (yes, even three is a stretch)
    if flightCount > 3:
        row = [aircraftSortedNames[index], flightCount, maxPoints, minPoints, avePoints, maxDist, minDist, aveDist]
        aircraftStats.append(row)

print "Num Aircraft: %d"%len(aircraftStats)

sortedList = sorted(aircraftStats, key=lambda l:l[4], reverse=True)

# Create a csv result file
with open('aircraftStats.csv', 'wb') as outfile:
    csvwriter = csv.writer(outfile, delimiter=',')
    csvwriter.writerow(['Aircraft name', 'FlightCount', 'Max Points', 'Min Points', 'Average Points per flight',
                        'Max km Flown', 'Min km Flown', 'Average km Flown'])
    for row in sortedList:
        csvwriter.writerow(row)