Sử dụng .corr để có được mối tương quan giữa hai cột


127

Tôi có khung dữ liệu gấu trúc sau Top15: nhập mô tả hình ảnh ở đây

Tôi tạo một cột ước tính số lượng tài liệu phù hợp cho mỗi người:

Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']

Tôi muốn biết mối tương quan giữa số lượng tài liệu phù hợp trên đầu người và mức cung cấp năng lượng trên đầu người. Vì vậy, tôi sử dụng .corr()phương pháp (tương quan của Pearson):

data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')

Tôi muốn trả về một số duy nhất, nhưng kết quả là: nhập mô tả hình ảnh ở đây


Tôi nghĩ bạn đúng. Nhưng bạn có thể cho tôi biết tại sao 'data.corr (method =' pearson ')' chỉ trả về mối quan hệ giữa Cung cấp năng lượng và Bổ sung năng lượng không?
tong zhu

1
Nó không. Nó sẽ trả về cho bạn một ma trận 2x2; bạn hiển thị mục nhập phía trên bên trái của nó. Nếu bạn áp dụng .corrtrực tiếp vào khung dữ liệu của mình, nó sẽ trả về tất cả các tương quan theo cặp; đó là lý do tại sao bạn quan sát 1s ở đường chéo của ma trận của bạn (mỗi cột có tương quan hoàn hảo với chính nó). Xem chỉnh sửa của tôi bên dưới.
Cleb

1
Vui lòng xem xét việc chấp nhận một câu trả lời nếu bạn nghĩ rằng nó đã trả lời câu hỏi của bạn
MaxU

1
Tôi đã chấp nhận câu trả lời của bạn, cảm ơn bạn
tong zhu

28
Câu hỏi này là trực tiếp từ khóa học "Nhập môn Khoa học Dữ liệu bằng Python" trên Coursera. Cụ thể là bài tập 3, câu hỏi 9. Khi giảng viên Chris Brooks khuyến khích học sinh đăng câu hỏi lên Stack Overflow, tôi không nghĩ ý của anh ấy là họ nên đăng nguyên văn các vấn đề từ bài tập.
LS

Câu trả lời:


209

Nếu không có dữ liệu thực tế, thật khó để trả lời câu hỏi nhưng tôi đoán bạn đang tìm kiếm một thứ như thế này:

Top15['Citable docs per Capita'].corr(Top15['Energy Supply per Capita'])

Điều đó tính toán mối tương quan giữa hai cột của bạn 'Citable docs per Capita''Energy Supply per Capita'.

Để đưa ra một ví dụ:

import pandas as pd

df = pd.DataFrame({'A': range(4), 'B': [2*i for i in range(4)]})

   A  B
0  0  0
1  1  2
2  2  4
3  3  6

Sau đó

df['A'].corr(df['B'])

cho 1như mong đợi.

Bây giờ, nếu bạn thay đổi một giá trị, ví dụ:

df.loc[2, 'B'] = 4.5

   A    B
0  0  0.0
1  1  2.0
2  2  4.5
3  3  6.0

lệnh

df['A'].corr(df['B'])

trả lại

0.99586

mà vẫn gần bằng 1, như mong đợi.

Nếu bạn áp dụng .corrtrực tiếp vào khung dữ liệu của mình, nó sẽ trả về tất cả các mối tương quan theo cặp giữa các cột của bạn ; đó là lý do tại sao bạn quan sát 1sở đường chéo của ma trận của bạn (mỗi cột tương quan hoàn hảo với chính nó).

df.corr()

do đó sẽ trở lại

          A         B
A  1.000000  0.995862
B  0.995862  1.000000

Trong đồ họa bạn hiển thị, chỉ có góc trên bên trái của ma trận tương quan được thể hiện (tôi giả sử).

Có thể có những trường hợp mà bạn nhận được NaNgiải pháp của mình - hãy xem bài đăng này để làm ví dụ.

Nếu bạn muốn lọc các mục nhập trên / dưới một ngưỡng nhất định, bạn có thể kiểm tra câu hỏi này . Nếu bạn muốn vẽ một bản đồ nhiệt của các hệ số tương quan, bạn có thể kiểm tra câu trả lời này và nếu sau đó bạn gặp sự cố với các nhãn trục chồng chéo, hãy kiểm tra bài đăng sau .


điều này có thể được áp dụng theo hàng không?
Dr.DOOM

1
@ Dr.DOOM: Vâng, nó chỉ cần loạt phim, vì vậy ví dụ như df.loc[1, :].corr(df.loc[2, :])sẽ hoạt động tốt. Đối với toàn bộ dataframe, bạn chỉ có thể transpose: df.T.corr().
Cleb

Tôi đã thử gợi ý của bạn tuy nhiên phép tính vẫn trả về 1 ngay cả sau khi thay đổi giá trị trong cột B bằng cách sử dụng df.loc [2, 'B'] = 4,5. có lẽ tôi chỉ nhầm lẫn về tính toán
Dr.DOOM

@ Dr.DOOM: Khó giúp vì tôi không biết mã của bạn. Tôi có hiểu đúng rằng ví dụ của tôi ở trên trả về 1trong trường hợp của bạn thay vì 0.99586?
Cleb

1
@Cleb: Chà, trong bối cảnh tôi đang làm việc, mọi chỉ mục nhiều cột cấp cao hơn đều có các lớp con giống hệt nhau. Xem câu hỏi này để biết những gì tôi đang cố gắng thực hiện: stackoverflow.com/questions/57513002/…
Adrian Keister

7

Tôi gặp phải vấn đề tương tự. Nó xuất hiện Citable Documents per Personlà một phao và python bỏ qua nó bằng cách nào đó theo mặc định. Tất cả các cột khác trong khung dữ liệu của tôi đều ở định dạng numpy, vì vậy tôi đã giải quyết nó bằng cách chuyển đổi cột thànhnp.float64

Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])

Hãy nhớ rằng đó chính xác là cột bạn tự tính toán


6

Giải pháp của tôi sẽ là sau khi chuyển đổi dữ liệu sang kiểu số:

Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()

chọn cột và sau đó áp dụng phương pháp .corr () là một lựa chọn tốt khi chúng ta có thể tính toán cặp tương quan giữa hơn 2 cột
Sébastien Wieckowski

4

Nếu bạn muốn có mối tương quan giữa tất cả các cặp cột, bạn có thể làm như sau:

import pandas as pd
import numpy as np

def get_corrs(df):
    col_correlations = df.corr()
    col_correlations.loc[:, :] = np.tril(col_correlations, k=-1)
    cor_pairs = col_correlations.stack()
    return cor_pairs.to_dict()

my_corrs = get_corrs(df)
# and the following line to retrieve the single correlation
print(my_corrs[('Citable docs per Capita','Energy Supply per Capita')])

3

Khi bạn gọi cái này:

data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')

Vì, hàm DataFrame.corr () thực hiện các tương quan theo cặp, bạn có bốn cặp từ hai biến. Vì vậy, về cơ bản, bạn đang nhận các giá trị đường chéo dưới dạng tương quan tự động (tương quan với chính nó, hai giá trị vì bạn có hai biến) và hai giá trị khác dưới dạng tương quan chéo của một so với một và ngược lại.

Thực hiện tương quan giữa hai chuỗi để nhận được một giá trị duy nhất:

from scipy.stats.stats import pearsonr
docs_col = Top15['Citable docs per Capita'].values
energy_col = Top15['Energy Supply per Capita'].values
corr , _ = pearsonr(docs_col, energy_col)

hoặc, nếu bạn muốn một giá trị duy nhất từ ​​cùng một hàm (mã của DataFrame):

single_value = correlation[0][1] 

Hi vọng điêu nay co ich.


3

Nó hoạt động như thế này:

Top15['Citable docs per Capita']=np.float64(Top15['Citable docs per Capita'])

Top15['Energy Supply per Capita']=np.float64(Top15['Energy Supply per Capita'])

Top15['Energy Supply per Capita'].corr(Top15['Citable docs per Capita'])

1

Tôi đã giải quyết vấn đề này bằng cách thay đổi kiểu dữ liệu. Nếu bạn thấy 'Nguồn cung cấp năng lượng trên mỗi Capita' là một loại số trong khi 'Tài liệu có thể phù hợp trên mỗi Capita' là một loại đối tượng. Tôi đã chuyển đổi cột thành float bằng cách sử dụng astype. Tôi đã gặp vấn đề tương tự với một số hàm np: count_nonzerosumhoạt động trong khi meanstdkhông.


0

thay đổi 'Tài liệu có thể cho mỗi Capita' thành số trước khi tương quan sẽ giải quyết được vấn đề.

    Top15['Citable docs per Capita'] = pd.to_numeric(Top15['Citable docs per Capita'])
    data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
    correlation = data.corr(method='pearson')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.