Python, correlação e regressão: parte 2

Veja a postagem anterior aqui .





Regressão

Embora possa ser útil saber que as duas variáveis ​​estão correlacionadas, não podemos usar essas informações sozinhas para prever o peso de nadadores olímpicos na presença de dados de altura, ou vice-versa. Ao estabelecer a correlação, medimos a força e o sinal da conexão, mas não a inclinação, ou seja, inclinação. Para gerar uma previsão, você precisa saber a taxa esperada de mudança em uma variável para uma determinada mudança de unidade em outra.





Gostaríamos de derivar uma equação que relaciona o valor específico de uma variável, a chamada variável independente, ao valor esperado de outra variável dependente. Por exemplo, se nossa equação linear prediz o peso para uma determinada altura, o crescimento é nossa variável independente e dependente do peso .





As linhas descritas por essas equações são chamadas de linhas de regressão . Este termo foi cunhado pelo polímata britânico do século 19, Sir Francis Galton. Ele e seu aluno Carl Pearson, que derivou o coeficiente de correlação, desenvolveram um grande número de métodos para estudar relações lineares no século 19, que ficaram conhecidos coletivamente como métodos de análise de regressão.





Lembre-se de que correlação não implica causalidade, e os termos “dependente” e “independente” não significam qualquer causação implícita. Eles são apenas nomes para valores matemáticos de entrada e saída. Um exemplo clássico é a correlação extremamente positiva entre o número de caminhões de bombeiros enviados para extinguir um incêndio e os danos causados ​​pelo incêndio. Obviamente, enviar caminhões de bombeiros para extinguir um incêndio não causa danos por si só. Ninguém aconselharia a redução do número de veículos enviados para extinguir um incêndio como forma de reduzir os danos. Em tais situações, devemos procurar uma variável adicional que estaria causalmente relacionada a outras variáveis ​​e explicar a correlação entre elas. Neste exemplo, pode ser do tamanho do incêndio... Essas causas subjacentes são chamadas de variáveis ​​de confusão porque distorcem nossa capacidade de determinar a relação entre as variáveis ​​dependentes.





Equações lineares

As duas variáveis, que podemos denotar como x  e y , podem estar estrita ou vagamente relacionadas entre si. A relação simples entre a variável independente x  e a variável dependente y  é simples, que é expressa pela seguinte fórmula:





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,   , : .





Os exemplos de código fonte para este post está no meu   Github repo . Todos os dados de origem são retirados do  repositório do  autor do livro.





O tópico do próximo post, post # 3 , será operações de matriz, equação normal e colinearidade.








All Articles