Hướng dẫn spearman python

  • Giới thiệu
  • Hệ số tương quan cấp bậc của Spearman là gì?
    • Các hàm đơn điệu
    • Biểu thức toán học
    • Tính toán ví dụ
  • Tính toán Hệ số tương quan Xếp hạng Spearman bằng cách sử dụng Gấu trúc
  • Hình dung hệ số tương quan
  • Hiểu Hệ số tương quan của Spearman trên các ví dụ tổng hợp
    • Tăng các chức năng đơn điệu
    • Các chức năng giảm dần đơn điệu
    • Các hàm không đơn điệu
  • Hệ số tương quan Spearman trên Linnerud Dataset
  • Kết luận

Giới thiệu

Hướng dẫn này là phần giới thiệu về Spearman’s rank correlation coefficientphép tính toán học của nó và tính toán của nó thông qua Python pandas. Chúng tôi sẽ xây dựng các ví dụ khác nhau để hiểu cơ bản về hệ số này và trình bày cách hình dung correlation matrix qua heatmaps.

Hệ số tương quan cấp bậc của Spearman là gì?

Spearman rank correlation có liên quan chặt chẽ đến Pearson correlationvà cả hai đều là một giá trị bị giới hạn, từ -1 đến 1 biểu thị một correlation giữa hai biến.

Nếu bạn muốn đọc thêm về hệ số tương quan thay thế – hãy đọc Hướng dẫn của chúng tôi về Hệ số tương quan Pearson trong Python.

Hệ số tương quan Pearson được tính bằng cách sử dụng các giá trị dữ liệu thô, trong khi tương quan Spearman được tính từ cấp bậc của các giá trị riêng lẻ. Trong khi hệ số tương quan Pearson là thước đo mối quan hệ tuyến tính giữa hai biến, hệ số tương quan thứ hạng Spearman đo lường mối quan hệ đơn điệu giữa cặp biến. Để hiểu mối tương quan Spearman, chúng ta cần hiểu biết cơ bản về monotonic functions.

Các hàm đơn điệu

Có các hàm tăng đơn điệu, giảm đơn điệu và không đơn điệu.

Đối với một hàm tăng đơn điệu, khi X tăng, Y cũng tăng (và nó không nhất thiết phải tuyến tính). Đối với một hàm giảm đơn điệu, khi một biến tăng, biến kia giảm (cũng không nhất thiết phải tuyến tính). Một hàm không đơn điệu là khi sự gia tăng giá trị của một biến đôi khi có thể dẫn đến tăng và đôi khi dẫn đến giảm giá trị của biến kia.

Các thước đo hệ số tương quan thứ hạng Spearman the monotonic relation between two variables. Các giá trị của nó nằm trong khoảng từ -1 đến +1 và có thể được hiểu là:

  • +1: Mối quan hệ gia tăng đơn điệu một cách hoàn hảo
  • +0.8: Mối quan hệ đơn điệu ngày càng gia tăng mạnh mẽ
  • +0.2: Mối quan hệ đơn điệu gia tăng yếu
  • 0: Quan hệ không đơn điệu
  • -0.2: Mối quan hệ đơn điệu giảm dần yếu
  • -0.8: Mối quan hệ đơn điệu giảm dần mạnh mẽ
  • -1: Mối quan hệ đơn điệu giảm dần một cách hoàn hảo

Biểu thức toán học

Giả sử chúng ta có (n) quan sát về hai biến ngẫu nhiên, (X) và (Y). Đầu tiên, chúng tôi xếp hạng tất cả các giá trị của cả hai biến tương ứng là (X_r) và (Y_r). Hệ số tương quan thứ hạng Spearman được ký hiệu là (r_s) và được tính bằng:

$$
r_s = rho_ {X_r, Y_r} = frac {text {COV} (X_r, Y_r)} {text {STD} (X_r) text {STD} (Y_r)} = frac {nsumlimits_ {x_rin X_r, y_r in Y_r} x_r y_r – sumlimits_ {x_rin X_r} x_rsumlimits_ {y_rin Y_r} y_r} {sqrt {Big (nsumlimits_ {x_r in X_r} x_r ^ 2 – (sumlimits_ {x_rin X_r} x_r) ^ 2Big)} {sqrt {Big } y_r ^ 2 – (sumlimits_ {y_rin Y_r} y_r) ^ 2 Lớn)}}
$$

Đây, COV() là hiệp phương sai, và STD() là độ lệch chuẩn. Trước khi chúng ta xem các hàm của Python để tính toán hệ số này, hãy làm một ví dụ tính toán bằng tay để hiểu biểu thức và đánh giá cao nó.

Tính toán ví dụ

Giả sử chúng ta được cung cấp một số quan sát về các biến ngẫu nhiên (X) và (Y). Bước đầu tiên là chuyển đổi (X) và (Y) thành (X_r) và (Y_r), đại diện cho cấp bậc tương ứng của chúng. Một số giá trị trung gian cũng sẽ cần thiết, được hiển thị bên dưới:



X


=


[



2



1


0


1


2



]
T





Y


=


[


4


1


3


2


0



]
T






X
r



=


[


1


2


3


4


5



]
T






Y
r



=


[


5


2


4


3


1



]
T






X
r
2



=


[


1


4


9


16


25



]
T






Y
r
2



=


[


25


4


16


9


1



]
T






X
r


Y
r



=


[


5


4


12


12


5



]
T


Hãy sử dụng công thức từ trước để tính tương quan Spearman:

r
S=


5

38

(
15
)
(
15
)



(
5

55


15
2

)


(
5

55


15
2

)



=

181
532

=

0,7

Tuyệt quá! Mặc dù vậy, việc tính toán thủ công này tốn nhiều thời gian và cách sử dụng máy tính tốt nhất là để tính toán mọi thứ cho chúng ta. Tính toán mối tương quan Spearman thực sự dễ dàng và đơn giản với các chức năng tích hợp trong Pandas.

Tính toán Hệ số tương quan Xếp hạng Spearman bằng cách sử dụng Gấu trúc

Các hệ số tương quan khác nhau, bao gồm Spearman, có thể được tính toán thông qua corr() phương pháp của thư viện Pandas.

Là một đối số đầu vào, corr() chấp nhận phương pháp được sử dụng để tính toán tương quan (spearman trong trường hợp của chúng ta). Phương thức được gọi trên một DataFramenói về kích thước mxntrong đó mỗi cột đại diện cho các giá trị của một biến ngẫu nhiên và m đại diện cho tổng số mẫu của mỗi biến.

n biến ngẫu nhiên, nó trả về một nxn Ma trận vuông R. R(i,j) cho biết hệ số tương quan thứ hạng Spearman giữa biến ngẫu nhiên ij. Vì hệ số tương quan giữa một biến và chính nó là 1, tất cả các mục nhập đường chéo (i,i) bình đẳng với sự thống nhất. Nói ngắn gọn:

R

(
tôi
,
j
)
=

{




r

tôi
,
j




nếu
tôi

j




1


nếu không thì




Lưu ý rằng ma trận tương quan là đối xứng vì tương quan là đối xứng, tức là M(i,j)=M(j,i). Hãy lấy ví dụ đơn giản của chúng tôi từ phần trước và xem cách sử dụng Pandas ‘ corr() fuction:

import numpy as np
import pandas as pd
import seaborn as sns # For pairplots and heatmaps
import matplotlib.pyplot as plt

Chúng tôi sẽ sử dụng Pandas để tự tính toán, Matplotlib với Seaborn để hiển thị và Numpy cho các hoạt động bổ sung trên dữ liệu.

Đoạn mã dưới đây tính toán ma trận tương quan Spearman trên khung dữ liệu x_simple. Lưu ý ones trên các đường chéo, chỉ ra rằng hệ số tương quan của một biến với chính nó là tự nhiên, one:

x_simple = pd.DataFrame([(-2,4),(-1,1),(0,3),(1,2),(2,0)],
                        columns=["X","Y"])
my_r = x_simple.corr(method="spearman")
print(my_r)
     X    Y
X  1.0 -0.7
Y -0.7  1.0

Hình dung hệ số tương quan

Với cấu trúc giống như bảng của các cường độ bị giới hạn, [-1, 1] – một cách tự nhiên và thuận tiện hình dung hệ số tương quan là một heatmap.

Nếu bạn muốn đọc thêm về bản đồ nhiệt trong Seaborn, hãy đọc Hướng dẫn cơ bản về bản đồ nhiệt trong Seaborn bằng Python của chúng tôi!

Bản đồ nhiệt là một lưới các ô, trong đó mỗi ô được gán một màu tùy theo giá trị của nó và cách giải thích ma trận tương quan trực quan này dễ dàng hơn cho chúng ta nhiều so với việc phân tích cú pháp số. Đối với các bảng nhỏ như bảng xuất trước đây – nó hoàn toàn ổn. Nhưng vơi rất nhiều của các biến, thật sự khó hơn nhiều để diễn giải những gì đang xảy ra.

Hãy xác định một display_correlation() tính toán hệ số tương quan và hiển thị nó dưới dạng bản đồ nhiệt:

def display_correlation(df):
    r = df.corr(method="spearman")
    plt.figure(figsize=(10,6))
    heatmap = sns.heatmap(df.corr(), vmin=-1, 
                      vmax=1, annot=True)
    plt.title("Spearman Correlation")
    return(r)

Hãy gọi display_correlation() trên của chúng tôi r_simple DataFrame để hình dung mối tương quan Spearman:

r_simple=display_correlation(x_simple)

Hiểu Hệ số tương quan của Spearman trên các ví dụ tổng hợp

Để hiểu hệ số tương quan Spearman, hãy tạo một vài ví dụ tổng hợp làm nổi bật cách hệ số này hoạt động – trước khi chúng ta đi sâu vào các ví dụ tự nhiên hơn. Những ví dụ này sẽ giúp chúng tôi hiểu, đối với loại mối quan hệ nào, hệ số này là +1, -1 hoặc gần bằng 0.

Trước khi tạo các ví dụ, chúng tôi sẽ tạo một hàm trợ giúp mới, plot_data_corr()cuộc gọi đó display_correlation() và lập biểu đồ dữ liệu dựa trên X:

def plot_data_corr(df,title,color="green"):    
    r = display_correlation(df)
    fig, ax = plt.subplots(nrows=1, ncols=len(df.columns)-1,figsize=(14,3))
    for i in range(1,len(df.columns)):
        ax[i-1].scatter(df["X"],df.values[:,i],color=color)
        ax[i-1].title.set_text(title[i] +'n r=" + 
                             "{:.2f}".format(r.values[0,i]))
        ax[i-1].set(xlabel=df.columns[0],ylabel=df.columns[i])
    fig.subplots_adjust(wspace=.7)    
    plt.show()

Tăng các chức năng đơn điệu

Hãy tạo một vài hàm tăng đơn điệu, sử dụng Numpy và xem qua DataFrame sau khi được lấp đầy với dữ liệu tổng hợp:

seed = 11
rand = np.random.RandomState(seed)
# Create a data frame using various monotonically increasing functions
x_incr = pd.DataFrame({"X":rand.uniform(0,10,100)})
x_incr["Line+"] = x_incr.X*2+1
x_incr["Sq+"] = x_incr.X**2
x_incr["Exp+"] = np.exp(x_incr.X)
x_incr["Cube+"] = (x_incr.X-5)**3

print(x_incr.head())
XDòng +Sq +Exp +Khối lập phương +
01.802697 4.605394 3.249716 6.065985 -32,685221
10,194752 1.389505 0,037929 1.215010 -110.955110
24,632185 10.264371 21.457140 102.738329 -0.049761
37.249339 15.498679 52.552920 1407.174809 11.380593
44.202036 9.404072 17.657107 66.822246 -0.508101

Bây giờ chúng ta hãy xem xét bản đồ nhiệt của tương quan Spearman và sơ đồ của các chức năng khác nhau chống lại X:

plot_data_corr(x_incr,["X","2X+1","$X^2$","$e^X$","$(X-5)^3$"])

Hướng dẫn spearman python

Chúng ta có thể thấy rằng đối với tất cả các ví dụ này, có một mối quan hệ tăng đơn điệu hoàn hảo giữa các biến. Tương quan Spearman là +1, bất kể các biến có mối quan hệ tuyến tính hay phi tuyến tính.

Pearson sẽ tạo ra nhiều kết quả khác nhau ở đây, vì nó được tính toán dựa trên linear mối quan hệ giữa các biến.

Miễn là Y tăng khi X tăng, không thất bạiHệ số tương quan Xếp hạng của Spearman sẽ là 1.

Các chức năng giảm dần đơn điệu

Hãy lặp lại các ví dụ tương tự về các hàm giảm đơn điệu. Chúng tôi sẽ lại tạo dữ liệu tổng hợp và tính toán mối tương quan về thứ hạng của Spearman. Đầu tiên, chúng ta hãy xem xét 4 hàng đầu tiên của DataFrame:

# Create a data matrix
x_decr = pd.DataFrame({"X":rand.uniform(0,10,100)})
x_decr["Line-"] = -x_decr.X*2+1
x_decr["Sq-"] = -x_decr.X**2
x_decr["Exp-"] = np.exp(-x_decr.X)
x_decr["Cube-"] = -(x_decr.X-5)**3
x_decr.head()
XĐường kẻ-Sq-Exp-Khối lập phương-
03,181872 -5.363744 -10.124309 0,041508 6.009985
12.180034 -3.360068 -4,752547 0,113038 22.424963
28.449385 -15.898771 -71.392112 0,000214 -41.041680
33.021647 -5.043294 -9.130350 0,048721 7.743039
44.382207 -7.764413 -19,203736 0,012498 0,235792

Bản đồ nhiệt của ma trận tương quan và biểu đồ của các biến được đưa ra dưới đây:

plot_data_corr(x_decr,["X","-2X+1","$-X^2$","$-e^X$","$-(X-5)^3$"],"blue")

Hướng dẫn spearman python

Hướng dẫn spearman python

Các hàm không đơn điệu

Các ví dụ dưới đây dành cho các hàm không đơn điệu khác nhau. Cột cuối cùng được thêm vào DataFrame là của một biến độc lập Randkhông có liên kết với X.

Những ví dụ này cũng nên làm rõ rằng mối tương quan Spearman là thước đo của monotonicity của mối quan hệ giữa hai biến. Hệ số 0 không nhất thiết chỉ ra không có mối quan hệ nào, nhưng nó chỉ ra rằng không có monotonicity giữa họ.

Trước khi tạo dữ liệu tổng hợp, chúng tôi sẽ xác định thêm một hàm trợ giúp khác, display_corr_pairs()cuộc gọi đó display_correlation() để hiển thị bản đồ nhiệt của ma trận tương quan và sau đó vẽ biểu đồ tất cả các cặp biến trong DataFramest nhau bằng cách sử dụng thư viện Seaborn.

Trên các đường chéo, chúng tôi sẽ hiển thị biểu đồ của từng biến bằng màu vàng bằng cách sử dụng map_diag(). Bên dưới các đường chéo, chúng tôi sẽ tạo một biểu đồ phân tán của tất cả các cặp biến. Vì ma trận tương quan là đối xứng, chúng ta không cần các đồ thị phía trên các đường chéo.

Hãy cũng hiển thị hệ số tương quan Pearson để so sánh:

def display_corr_pairs(df,color="cyan"):
    s = set_title = np.vectorize(lambda ax,r,rho: ax.title.set_text("r = " + 
                                        "{:.2f}".format(r) + 
                                        'n $rho$ = ' + 
                                        "{:.2f}".format(rho)) if ax!=None else None
                            )      

    r = display_correlation(df)
    rho = df.corr(method="pearson")
    g = sns.PairGrid(df,corner=True)
    g.map_diag(plt.hist,color="yellow")
    g.map_lower(sns.scatterplot,color="magenta")
    set_title(g.axes,r,rho)
    plt.subplots_adjust(hspace = 0.6)
    plt.show()    

Chúng tôi sẽ tạo một DataFrame không đơn điệu, x_nonvới các chức năng này của X:

  • Hình parabol: ((X-5) ^ 2)

  • Sin: (sin (frac {X} {10} 2pi))

  • Frac: (frac {X-5} {(X-5) ^ 2 + 1})

  • Rand: Các số ngẫu nhiên trong phạm vi [-1,1]

Dưới đây là 4 dòng đầu tiên của x_non:

x_non = pd.DataFrame({"X":rand.uniform(0,10,100)})
x_non["Parabola"] = (x_non.X-5)**2
x_non["Sin"] = np.sin(x_non.X/10*2*np.pi)
x_non["Frac"] = (x_non.X-5)/((x_non.X-5)**2+1)
x_non["Rand"] = rand.uniform(-1,1,100)

print(x_non.head())
XParabolTộiFracRand
00,654466 18.883667 0,399722 -0.218548 0,072827
15,746559 0,557351 -0,452063 0,479378 -0.818150
26.879362 3.532003 -0,924925 0,414687 -0.868501
35.683058 0,466569 -0.416124 0,465753 0,337066
46.037265 1.075920 -0,606565 0,499666 0,583229

Hệ số tương quan Spearman giữa các cặp dữ liệu khác nhau được minh họa dưới đây:

display_corr_pairs(x_non)

Hướng dẫn spearman python

Hướng dẫn spearman python

Những ví dụ này cho thấy loại dữ liệu nào thì tương quan Spearman gần bằng 0 và nó có giá trị trung gian ở đâu. Một điều cần lưu ý nữa là hệ số tương quan Spearman và hệ số tương quan Pearson không phải lúc nào cũng đồng ý với nhau, vì vậy thiếu cái này không có nghĩa là thiếu cái khác.

Chúng được sử dụng để kiểm tra sự tương quan cho các khía cạnh khác nhau của dữ liệu và không thể được sử dụng thay thế cho nhau. Mặc dù họ sẽ đồng ý trong một số trường hợp, nhưng không phải lúc nào họ cũng như vậy.

Hệ số tương quan Spearman trên Linnerud Dataset

Hãy áp dụng hệ số Tương quan Spearman trên một tập dữ liệu thực tế. Chúng tôi đã chọn đơn giản tập dữ liệu tập thể dục triệu tập linnerud từ sklearn.datasets để trình diễn:

import sklearn.datasets.load_linnerud

Đoạn mã bên dưới tải tập dữ liệu và kết hợp các biến mục tiêu và thuộc tính trong một DataFrame. Hãy xem 4 hàng đầu tiên của linnerud dữ liệu:

d=load_linnerud()

dat = pd.DataFrame(d.data,columns=d.feature_names)
alldat=dat.join(pd.DataFrame(d.target,columns=d.target_names) )
alldat.head()
ChinsSơ đồ trang webNhảyCân nặngThắt lưngXung
05.0 162.0 60.0 191.0 36.0 50.0
12.0 110.0 60.0 189.0 37.0 52.0
212.0 101.0 101.0 193.0 38.0 58.0
312.0 105.0 37.0 162.0 35.0 62.0
413.0 155.0 58.0 189.0 35.0 46.0

Bây giờ, hãy hiển thị các cặp tương quan bằng cách sử dụng display_corr_pairs():

display_corr_pairs(alldat)

Hướng dẫn spearman python

Hướng dẫn spearman python

Nhìn vào các giá trị tương quan Spearman, chúng ta có thể đưa ra các kết luận thú vị như:

  • Giá trị vòng eo cao hơn ngụ ý giá trị trọng lượng tăng lên (từ r = 0.81)
  • Nhiều tư thế ngồi hơn có giá trị vòng eo thấp hơn (từ r = -0.72)
  • Chins, situp và jump dường như không có mối quan hệ đơn điệu với xung, vì các giá trị r tương ứng gần bằng không.

Kết luận

Trong hướng dẫn này, chúng tôi đã thảo luận về hệ số tương quan thứ hạng Spearman, biểu thức toán học của nó và tính toán của nó thông qua Python pandas.

Chúng tôi đã chứng minh hệ số này trên các ví dụ tổng hợp khác nhau và cả trên Linnerrud tập dữ liệu. Hệ số tương quan Spearman là một thước đo lý tưởng để tính toán tính đơn điệu của mối quan hệ giữa hai biến. Tuy nhiên, giá trị gần bằng 0 không nhất thiết chỉ ra rằng các biến không có mối liên hệ nào giữa chúng.