Python, corrélation et régression: partie 2

Voir le post précédent ici .





Régression

S'il peut être utile de savoir que les deux variables sont corrélées, nous ne pouvons pas utiliser cette information seule pour prédire le poids des nageurs olympiques en présence de données de taille, ou vice versa. Lors de l'établissement de la corrélation, nous avons mesuré la force et le signe de la connexion, mais pas la pente, c'est-à-dire pente. Pour générer une prédiction, vous devez connaître le taux de changement attendu d'une variable pour un changement d'unité donné dans une autre.





Nous aimerions dériver une équation qui relie la valeur spécifique d'une variable, la variable dite indépendante, à la valeur attendue d'une autre variable dépendante. Par exemple, si notre équation linéaire prédit le poids pour une taille donnée, la croissance est notre variable indépendante et dépend du poids .





Les droites décrites par ces équations sont appelées droites de régression . Ce terme a été inventé par le polymathe britannique du XIXe siècle, Sir Francis Galton. Lui et son élève Carl Pearson, qui a dérivé le coefficient de corrélation, ont développé un grand nombre de méthodes pour étudier les relations linéaires au 19e siècle, qui sont devenues collectivement connues sous le nom de méthodes d'analyse de régression.





Rappelons que la corrélation n'implique pas de causalité et que les termes «dépendante» et «indépendante» ne signifient aucune causalité implicite. Ce ne sont que des noms pour les valeurs mathématiques d'entrée et de sortie. Un exemple classique est la corrélation extrêmement positive entre le nombre de camions de pompiers envoyés pour éteindre un incendie et les dommages causés par l'incendie. Bien entendu, envoyer des camions de pompiers pour éteindre un incendie ne cause pas en soi de dommages. Personne ne conseillerait de réduire le nombre de véhicules envoyés pour éteindre un incendie afin de réduire les dommages. Dans de telles situations, nous devons rechercher une variable supplémentaire qui serait causalement liée à d'autres variables et expliquer la corrélation entre elles. Dans cet exemple, cela pourrait être la taille du feu... Ces causes sous-jacentes sont appelées variables de confusion parce qu'elles faussent notre capacité à déterminer la relation entre les variables dépendantes.





Équations linéaires

Les deux variables, que nous pouvons désigner par x  et y , peuvent être strictement ou vaguement liées l'une à l'autre. La relation la plus simple entre la variable indépendante x  et la variable dépendante y  est simple et s'exprime par la formule suivante:





y = a + bx

. , b — , . , a = 32  b = 1.8. b, :





y = 32 + 1,8x

10° x  10:





y = 32 + 1,8 (10) = 50

, , 10° 50°F, . Python pandas, , :





'''       '''
celsius_to_fahrenheit = lambda x: 32 + (x * 1.8)

def ex_3_11():
    '''    '''
    df = pd.DataFrame({'C':s, 'F':s.map(celsius_to_fahrenheit)})
    df.plot('C', 'F', legend=False, grid=True)
    plt.xlabel(' ')
    plt.ylabel(' ')
    plt.show()
      
      



:





, 0 32 . a — y, x  0.





b; 2. , . , , .





, , . y  x. , , , , :





y = a + bx + ε

, ε  — , , a  b  x  y. y — , — :





ε = y-ŷ

. - , , , . , , , ( ).





a  b  , x  , . , , , x  y.





, , , , , . , , .





, , , . , , , .





, , . , . Ordinary Least Squares (OLS), :





, , , . , , , :





(a) — , X Y:





a = y ̅-bx ̅

b — , .





covariance



, variance



mean



, . :





def slope(xs, ys):
    '''   ( )'''
    return xs.cov(ys) / xs.var()

def intercept(xs, ys): 
     '''   (  Y)'''
   return ys.mean() - (xs.mean() * slope(xs, ys))

def ex_3_12():
    '''    ( ) 
            '''
    df = swimmer_data()
    X  = df[', ']
    y  = df[''].apply(np.log)
    a  = intercept(X, y)
    b  = slope(X, y) 
    print(': %f, : %f' % (a,b))
      
      



: 1.691033, : 0.014296
      
      



0.0143 1.6910.





— ( ), () . np.exp



, np.log



. , 5.42 . , , .





, x. , 1.014 . . , , , .





regression_line



x,   b.





'''  '''
regression_line = lambda a, b: lambda x: a + (b * x)  #  fn(a,b)(x)

def ex_3_13():
    '''  
            '''
    df = swimmer_data()
    X  = df[', '].apply( jitter(0.5) )
    y  = df[''].apply(np.log)
    a, b = intercept(X, y), slope(X, y) 
    ax = pd.DataFrame(np.array([X, y]).T).plot.scatter(0, 1, s=7)
    s  = pd.Series(range(150,210))
    df = pd.DataFrame( {0:s, 1:s.map(regression_line(a, b))} )  
    df.plot(0, 1, legend=False, grid=True, ax=ax)
    plt.xlabel(', .')
    plt.ylabel(' ')
    plt.show()
      
      



regression_line



x, a + bx.





, ,   y.





def residuals(a, b, xs, ys):
    ''' '''
    estimate = regression_line(a, b)     #  
    return pd.Series( map(lambda x, y: y - estimate(x), xs, ys) )

constantly = lambda x: 0

def ex_3_14():
    '''        '''
    df = swimmer_data()
    X  = df[', '].apply( jitter(0.5) )
    y  = df[''].apply(np.log)
    a, b = intercept(X, y), slope(X, y) 
    y  = residuals(a, b, X, y)
    ax = pd.DataFrame(np.array([X, y]).T).plot.scatter(0, 1, s=12)
    s  = pd.Series(range(150,210))
    df = pd.DataFrame( {0:s, 1:s.map(constantly)} )      
    df.plot(0, 1, legend=False, grid=True, ax=ax)
    plt.xlabel(', .')
    plt.ylabel('')
    plt.show()
      
      



— , Y X. , :





, , -, , . , . , , .





, , , . , . , , . , .





, . . , , , .. . , , , .





. , , , , .





R-

, , .. , . R2, R-, 0 1 . .





, R2  1, Y X. R2 :





var(ε) — var(Y) Y. , - . , . var(Y), .. .





, , a + bx.   .





var(ε)/var(Y) — , . . , . R2  — , .





r, R2  , . , .





R2 . — , R2. R2 .





, , , , f. , y. R2  y:





def r_squared(a, b, xs, ys):
    '''   (R-)'''
    r_var = residuals(a, b, xs, ys).var() 
    y_var = ys.var()
    return 1 - (r_var / y_var)

def ex_3_15():
    '''  R- 
            '''
    df = swimmer_data()
    X  = df[', '].apply( jitter(0.5) )
    y  = df[''].apply(np.log)
    a, b = intercept(X, y), slope(X, y)
    return r_squared(a, b, X, y)
      
      



0.75268223613272323
      
      



0.753. , 75% , 2012 ., .





( ), R2 :





r  , Y X, R2 0.52, .. 0.25.





, . , . .





. , , β (), :





y = β_1x_1 + β_2x_2

- , β1 = a β2 = b , x1  1, β1 — , , x1  () , .





β, , :





y = β_1x_1 + β_2x_2 + ⋯ + β_nx_n

x1  xn  , y. β1  βn  , .





, : , , , . , , .





, x. pandas,   , : .





Les exemples de code source pour ce poste sont dans mon   Github repo . Toutes les données sources sont tirées du  référentiel de l'  auteur du livre.





Le sujet du prochain article, le post # 3 , sera les opérations matricielles, l'équation normale et la colinéarité.








All Articles