Lo que realmente me llamó la atención fue que las velocidades promedio realmente no han cambiado mucho 
El gráfico va de unos 25km/h a más de 40km/h, y eso es un gran cambio. Como otros han mencionado, aumentar la velocidad media requiere un aumento no lineal de la potencia aplicada a los pedales. 
En otras palabras, aumentar la velocidad media de 25km/h a 26km/h es más fácil que aumentar de 40km/h a 41km/h 
Digamos que fuera a robar una máquina del tiempo, volver y montar cada curso de TdF, usando exactamente la misma bicicleta. Para igualar la velocidad media de los ganadores, este es el vataje que necesitaría producir (bueno, una aproximación muy cruda): 
    
     (de nuevo, este es un gráfico muy crudamente aproximado, diseñado para ilustrar un punto! Ignora cosas como el viento, el terreno, el dibujo, la costa, la superficie de la carretera y muchas otras cosas) 
Pasar de unos 60 vatios a 240 vatios es un cambio enorme, y es muy poco probable que los competidores de TdF hayan aumentado tanto su potencia con el tiempo… 
Parte del aumento se deberá a ciclistas más potentes (gracias a un mejor entrenamiento y nutrición), pero ciertamente no todo. 
El resto probablemente se deba a mejoras tecnológicas. Por ejemplo, una bicicleta más aerodinámica disminuirá la potencia requerida para una determinada velocidad media, lo mismo que una bicicleta más ligera cuando se sube a las colinas. 
Fuente del gráfico: Aunque mi punto debería seguir siendo válido independientemente de lo impreciso que sea el gráfico anterior, aquí está el desordenado script que utilicé para generarlo 
Utiliza los datos de  aquí , exportados a CSV (desde  este documento ) 
El cálculo de la velocidad media a los vatios requeridos podría simplificarse en gran medida, pero me resultó más fácil modificar el script desde  mi respuesta aquí ! 
#!/usr/bin/env python2
"""Wattage required to match pace of TdF over the years
Written in Python 2.7
"""
def Cd(desc):
    """Coefficient of drag
    Coefficient of drag is a dimensionless number that relates an
    objects drag force to its area and speed
    """
    values = {
        "tops": 1.15, # Source: "Bicycling Science" (Wilson, 2004)
        "hoods": 1.0, # Source: "Bicycling Science" (Wilson, 2004)
        "drops": 0.88, # Source: "The effect of crosswinds upon time trials" (Kyle,1991)
        "aerobars": 0.70, # Source: "The effect of crosswinds upon time trials" (Kyle,1991)
        }
    return values[desc]
def A(desc):
    """Frontal area is typically measured in metres squared. A
    typical cyclist presents a frontal area of 0.3 to 0.6 metres
    squared depending on position. Frontal areas of an average
    cyclist riding in different positions are as follows
    http://www.cyclingpowermodels.com/CyclingAerodynamics.aspx
    """
    values = {'tops': 0.632, 'hoods': 0.40, 'drops': 0.32}
    return values[desc]
def airdensity(temp):
    """Air density in kg/m3
    Values are at sea-level (I think..?)
    Values from changing temperature on:
    http://www.wolframalpha.com/input/?i=%28air+density+at+40%C2%B0C%29
    Could calculate this:
    http://en.wikipedia.org/wiki/Density_of_air
    """
    values = {
        0: 1.293,
        10: 1.247,
        20: 1.204,
        30: 1.164,
        40: 1.127,
        }
    return values[temp]
"""
F = CdA p [v^2/2]
where:
F = Aerodynamic drag force in Newtons.
p = Air density in kg/m3 (typically 1.225kg in the "standard atmosphere" at sea level) 
v = Velocity (metres/second). Let's say 10.28 which is 23mph
"""
def required_wattage(speed_m_s):
    """What wattage will the mathematicallytheoretical cyclist need to
    output to travel at a specific speed?
    """
    position = "drops"
    temp = 20 # celcius
    F = Cd(position) * A(position) * airdensity(temp) * ((speed_m_s**2)/2)
    watts = speed_m_s*F
    return watts
    #print "To travel at %sm/s in %s*C requires %.02f watts" % (v, temp, watts)
def get_stages(f):
    import csv
    reader = csv.reader(f)
    headings = next(reader)
    for row in reader:
        info = dict(zip(headings, row))
        yield info
if __name__ == ' __main__':
    years, watts = [], []
    import sys
    # tdf_winners.csv downloaded from
    # http://www.guardian.co.uk/news/datablog/2012/jul/23/tour-de-france-winner-list-garin-wiggins
    for stage in get_stages(open("tdf_winners.csv")):
        speed_km_h = float(stage['Average km/h'])
        dist_km = int(stage['Course distance, km'].replace(",", ""))
        dist_m = dist_km * 1000
        speed_m_s = (speed_km_h * 1000)/(60*60)
        watts_req = required_wattage(speed_m_s)
        years.append(stage['Year'])
        watts.append(watts_req)
        #print "%s,%.0f" % (stage['Year'], watts_req)
    print "year = c(%s)" % (", ".join(str(x) for x in years))
    print "watts = c(%s)" % (", ".join(str(x) for x in watts))
    print """plot(x=years, y=watts, type='l', xlab="Year of TdF", ylab="Average watts required", ylim=c(0, 250))"""