Python, Korrelation und Regression: Teil 1

Je mehr ich Leute kennenlerne, desto mehr mag ich meinen Hund.





 -Mark Twain





In der vorherigen Reihe von Beiträgen für Anfänger des Remix-Buches Henry Garner « Clojures Datenforschung » (Clojure for Data Science) in Python haben wir Methoden zur Beschreibung der Stichprobe im Hinblick auf die zusammenfassende Statistik überprüft, und statistische Inferenzmethoden sind Populationsparameter. Diese Analyse sagt etwas über die Gesamtbevölkerung und insbesondere über die Stichprobe aus, erlaubt uns jedoch nicht, sehr genaue Aussagen über ihre einzelnen Elemente zu treffen. Dies liegt daran, dass die Reduzierung der Daten auf nur zwei Statistiken - den Mittelwert und die Standardabweichung - eine große Menge an Informationen verliert.





Wir müssen oft weiter gehen und eine Beziehung zwischen zwei oder mehr Variablen herstellen oder eine Variable in Gegenwart einer anderen vorhersagen. Und das bringt uns zum Thema dieser 5-Post-Serie - Korrelation und Regression untersuchen. Die Korrelation befasst sich mit der Stärke und Richtwirkung einer Beziehung zwischen zwei oder mehr Variablen. Die Regression bestimmt die Art dieser Beziehung und ermöglicht Vorhersagen auf dieser Grundlage.





Diese Reihe von Beiträgen behandelt die lineare Regression . Anhand einer Datenstichprobe lernt unser Modell eine lineare Gleichung, mit der Vorhersagen über neue, bisher nicht sichtbare Daten getroffen werden können. Dazu gehen wir zurück in die Pandas-Bibliothek und untersuchen die Beziehung zwischen Größe und Gewicht bei olympischen Athleten. Wir werden das Konzept der Matrizen vorstellen und Ihnen zeigen, wie Sie sie mithilfe der Pandas-Bibliothek verwalten können.





Über Daten

, Guardian News and Media Ltd., , 2012 . . .





, , , .





all-london-2012-athletes.tsv . pandas, «Python, », read_csv



:





def load_data():
    return pd.read_csv('data/ch03/all-london-2012-athletes-ru.tsv', '\t')
                                            
def ex_3_1():
    '''    
           2012 .'''
    return load_data()
      
      



Python Jupyter, :













( , ) :









  • ,





  • ,





  • , .





  • , .





  • «» «»









  • ( )

















  • ,





  • ,





  • ,





, , , . , .





2012 . . , , :





def ex_3_2():
    '''   
          '''
    df = load_data()
    df[', '].hist(bins=20)
    plt.xlabel(', .')
    plt.ylabel('')
    plt.show()
      
      



:





, . 177 . :





def ex_3_3():
    '''    '''
    df = load_data()
    df[''].hist(bins=20)
    plt.xlabel('')
    plt.ylabel('')
    plt.show()
      
      



:





. , , , - . pandas skew



:





def ex_3_4():
    '''   '''
    df = load_data()
    swimmers = df[ df[' '] == 'Swimming']
    return swimmers[''].skew()
      
      



0.23441459903001483
      
      



, numpy np.log



:





def ex_3_5():
    '''     
            
       '''
    df = load_data()
    df[''].apply(np.log).hist(bins=20)
    plt.xlabel(' ')
    plt.ylabel('')
    plt.show()
      
      



:





. , .





— , . . , .





, () . , , . 10 e, , 2.718. numpy np.log



np.exp



e. loge , ln, - , .





, . , c 1931 . , , . , , .





, , , , , .





, , , Wolfram MathWorld, .





, . , , .





, . , , :





def swimmer_data():
    '''       '''
    df = load_data()
    return df[df[' '] == 'Swimming'].dropna()

def ex_3_6():
    '''     '''
    df = swimmer_data()
    xs = df[', ']
    ys = df[''].apply( np.log )
    pd.DataFrame(np.array([xs,ys]).T).plot.scatter(0, 1, s=12, grid=True)
    plt.xlabel(', .')
    plt.ylabel(' ')
    plt.show()
      
      



:





, . , . :





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





, , 180 , 179.5 180.5 , 80 79.5 80.5 . , -0.5 0.5 (, c , ):





def jitter(limit):
    '''  (   )'''
    return lambda x: random.uniform(-limit, limit) + x

def ex_3_7():
    '''       '''
    df = swimmer_data()
    xs = df[', '].apply(jitter(0.5))
    ys = df[''].apply(jitter(0.5)).apply(np.log)
    pd.DataFrame(np.array([xs,ys]).T).plot.scatter(0, 1, s=12, grid=True)
    plt.xlabel(', .')
    plt.ylabel(' ')
    plt.show()
      
      



:





, — , , , .





. .





, X Y, :





dx_i = x_i-x ̅  dy_i = y_i-y̅

xi — X i, yi — Y i,  — X,  — Y. X Y , : , — , , . , , , , . .





:





Python :





def covariance(xs, ys):
    '''  (, .. n-1)'''
    dx = xs - xs.mean() 
    dy = ys - ys.mean()
    return (dx * dy).sum() / (dx.count() - 1)
      
      



, pandas cov



:





df[', '].cov(df[''])
      
      



1.3559273321696459
      
      



1.356, . .





. , . -1 +1. .





, . standard score, z- — , . , , — . , .





r  , dxi  dyi  :





X Y , , σx  σy — X Y:





, , r.





. :





def variance(xs):
    ''' ,
          n <= 30'''
    x_hat = xs.mean()
    n = xs.count()
    n = n - 1 if n in range( 1, 30 ) else n  
    return sum((xs - x_hat) ** 2) / n

def standard_deviation(xs):
    '''  '''
    return np.sqrt(variance(xs))

def correlation(xs, ys): 
    ''' '''
    return covariance(xs, ys) / (standard_deviation(xs) * 
                                 standard_deviation(ys))
      
      



pandas corr



:





df[', '].corr(df[''])
      
      



, r  . -1.0 1.0, .





, r = 0, , . . , , r  :





, , y = 0. r  0, . ; y  . .





:





def ex_3_8():
    '''   pandas
            '''
    df = swimmer_data()
    return df[', '].corr( df[''].apply(np.log))
      
      



0.86748249283924894
      
      



0.867, , , .





r  ρ

, . ; , : . r, ρ ().





, , , , . , . , , , -.





— , , — . , r, ρ, :









  • r





, , , . , ,   , . , .





, , (, , ) . , , .





, , :





H_0∶ρ = 0 H_1∶ρ \ ne 0

H0 - , . , , .





H1 - , . , , . , .





r  :





, r  (, ρ  ), , , .





t- t-:





df — . n - 2, n — . , :





t- 102.21. p- t-. scipy () t- stats.t.cdf



, (1-cdf) stats.t.sf



. p- . 2, :





def t_statistic(xs, ys):
    ''' t-'''
    r = xs.corr(ys)  #  , correlation(xs, ys)
    df = xs.count() - 2
    return r * np.sqrt(df / 1 - r ** 2)

def ex_3_9():
    '''  t-'''
    df = swimmer_data()
    xs = df[', ']
    ys = df[''].apply(np.log)
    t_value = t_statistic(xs, ys)
    df = xs.count() - 2 
    p = 2 * stats.t.sf(t_value, df)  #   
    return {'t-':t_value, 'p-':p}
      
      



{'p-': 1.8980236317815443e-106, 't-': 25.384018200627057}
      
      



P- , 0, , , , . .





, , , , , , , , , ρ, . , r  ( %), ρ  .





, . r  1, r  r  .





r- ρ, 0.6.





, z- r   . , , .





z- :





z :





, r  z z-, SEz  r.





SEz, , . 1.96, , 95% . , 1.96 ρ 95%- .





, scipy stats.norm.ppf



. , .





, , , .. 2.5%, , 95%- . 100%. , 95% , 97.5%:





def critical_value(confidence, ntails): #    
    '''   
           
          '''
    lookup = 1 - ((1 - confidence) / ntails) 
    return stats.norm.ppf(lookup, 0, 1# mu=0, sigma=1

critical_value(0.95, 2)
      
      



1.959963984540054
      
      



95%- z- ρ  :





zr SEz, :





r=0.867  n=859  1.137 1.722. z- r-, z-:





:





def z_to_r(z):
    ''' z-   r-'''
    return (np.exp(z*2) - 1) / (np.exp(z*2) + 1)

def r_confidence_interval(crit, xs, ys): 
    '''  
           '''
    r   = xs.corr(ys)
    n   = xs.count()
    zr  = 0.5 * np.log((1 + r) / (1 - r)) 
    sez = 1 / np.sqrt(n - 3)
    return (z_to_r(zr - (crit * sez))), (z_to_r(zr + (crit * sez)))

def ex_3_10():
    '''  
            '''
    df = swimmer_data()
    X = df[', ']
    y = df[''].apply(np.log)
    interval = r_confidence_interval(1.96, X, y) 
    print('  (95%):', interval)
      
      



  (95%): (0.8499088588880347, 0.8831284878884087)
      
      



95%- ρ, 0.850 0.883. , .





Die Quellcodebeispiele für diesen Beitrag befinden sich in meinem   Github- Repo . Alle Quelldaten stammen aus dem  Repository des  Autors des Buches.





Im nächsten Beitrag, Beitrag Nr. 2 , wird das Thema der Reihe selbst behandelt - Regression und Techniken zur Bewertung ihrer Qualität.








All Articles