Hiểu mối quan hệ giữa hai hoặc nhiều biến là cốt lõi của nhiều khía cạnh của phân tích dữ liệu hoặc phân tích thống kê. Hệ số tương quan hoặc tương quan nắm bắt mối liên hệ giữa hai biến [trong trường hợp đơn giản nhất], bằng số
Một trong những thước đo tương quan thường được sử dụng là hệ số tương quan Pearson. Một thước đo tương quan thường được sử dụng khác là hệ số tương quan Spearman
Trong bài đăng này, trước tiên chúng ta sẽ xem các ví dụ về tính toán tương quan Pearson và Spearman trong Python bằng Pandas, Scikit Learn và NumPy
Chúng tôi sẽ sử dụng dữ liệu gapminder và tính toán mối tương quan giữa gdpPercap và giá trị tuổi thọ từ nhiều quốc gia theo thời gian. Trong trường hợp này, chúng tôi hy vọng rằng tuổi thọ sẽ tăng lên khi GDP bình quân đầu người của đất nước tăng lên
Hãy để chúng tôi tìm ra cách tính tương quan Pearson và spearman trong Python. Trước tiên chúng ta hãy tải các gói cần thiết
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline
Hãy để chúng tôi tải dữ liệu gapminder dưới dạng khung dữ liệu Pandas
data_url = '//bit.ly/2cLzoxH' # read data from url as pandas dataframe gapminder = pd.read_csv[data_url] # let us select two relevant columns gapminder = gapminder[['gdpPercap', 'lifeExp']] print[gapminder.head[3]] gdpPercap lifeExp 0 779.445314 28.801 1 820.853030 30.332 2 853.100710 31.997
Tương quan Pearson
Tương quan Pearson định lượng mối quan hệ tuyến tính giữa hai biến. Hệ số tương quan Pearson có thể nằm trong khoảng từ -1 đến +1, giống như các biện pháp tương quan khác. Tương quan Pearson dương có nghĩa là giá trị của một biến tăng theo các biến khác. Và hệ số Pearson âm có nghĩa là một biến giảm khi biến khác giảm. Các hệ số tương quan -1 hoặc +1 có nghĩa là mối quan hệ chính xác là tuyến tính
Tương quan Pearson với Pandas
Pandas cung cấp hàm corr[] mà chúng ta có thể sử dụng nó với chuỗi Pandas như hình bên dưới. Chúng ta có thể thấy rằng gdpPercap và lifeExp có mối tương quan tích cực cho thấy sự gia tăng của gdpPercap làm tăng tuổi thọ trên tất cả
gapminder.gdpPercap.corr[gapminder.lifeExp, method="pearson"] 0.5837062198659948
Tương quan Pearson với NumPy
Chúng ta cũng có thể sử dụng NumPy để tính hệ số tương quan Pearson. Hàm corrcoef[] của NumPy có thể nhận nhiều biến dưới dạng mảng 2D NumPy và trả về ma trận tương quan
np.corrcoef[gapminder.gdpPercap, gapminder.lifeExp]
Trong trường hợp đơn giản nhất với hai biến, nó trả về ma trận 2×2 với các giá trị tương quan Pearson
array[[[1. , 0.58370622], [0.58370622, 1. ]]]
Tương quan Pearson với SciPy
Chúng ta cũng có thể tính toán hệ số tương quan Pearson bằng cách sử dụng mô-đun thống kê của SciPy
from scipy import stats gdpPercap = gapminder.gdpPercap.values life_exp = gapminder.lifeExp.values
Mô-đun thống kê SciPy có một hàm gọi làpeasonr[] có thể lấy hai mảng NumPy và trả về một bộ chứa hệ số tương quan Pearson và tầm quan trọng của mối tương quan dưới dạng giá trị p
stats.pearsonr[gdpPercap,life_exp]
Phần tử đầu tiên của bộ dữ liệu là tương quan Pearson và phần tử thứ hai là giá trị p
[0.5837062198659948, 3.565724241051659e-156]
tương quan giáo
Tương quan Pearson giả định rằng dữ liệu chúng ta đang so sánh được phân phối bình thường. Khi giả định đó không đúng, giá trị tương quan đang phản ánh mối liên hệ thực sự. Tương quan Spearman không giả định rằng dữ liệu đến từ một phân phối cụ thể, do đó, đây là phép đo tương quan phi tham số. Tương quan Spearman còn được gọi là tương quan xếp hạng của Spearman vì nó tính toán hệ số tương quan trên các giá trị xếp hạng của dữ liệu
Mối tương quan của Spearman với Pandas
Chúng ta có thể sử dụng hàm corr[] với tham số method=”spearman” để tính toán tương quan của spearman bằng cách sử dụng Pandas
gapminder.gdpPercap.corr[gapminder.lifeExp, method="spearman"]____9
data_url = '//bit.ly/2cLzoxH' # read data from url as pandas dataframe gapminder = pd.read_csv[data_url] # let us select two relevant columns gapminder = gapminder[['gdpPercap', 'lifeExp']] print[gapminder.head[3]] gdpPercap lifeExp 0 779.445314 28.801 1 820.853030 30.332 2 853.100710 31.9970
Tương quan Spearman với NumPy
NumPy không có chức năng cụ thể để tính tương quan Spearman. Tuy nhiên, chúng ta có thể sử dụng định nghĩa tương quan Spearman, đó là tương quan giá trị xếp hạng của các biến. Về cơ bản, chúng tôi tính toán thứ hạng của hai biến và sử dụng thứ hạng với hàm tương quan Pearson có sẵn trong NumPy
data_url = '//bit.ly/2cLzoxH' # read data from url as pandas dataframe gapminder = pd.read_csv[data_url] # let us select two relevant columns gapminder = gapminder[['gdpPercap', 'lifeExp']] print[gapminder.head[3]] gdpPercap lifeExp 0 779.445314 28.801 1 820.853030 30.332 2 853.100710 31.9971
data_url = '//bit.ly/2cLzoxH' # read data from url as pandas dataframe gapminder = pd.read_csv[data_url] # let us select two relevant columns gapminder = gapminder[['gdpPercap', 'lifeExp']] print[gapminder.head[3]] gdpPercap lifeExp 0 779.445314 28.801 1 820.853030 30.332 2 853.100710 31.9972
data_url = '//bit.ly/2cLzoxH' # read data from url as pandas dataframe gapminder = pd.read_csv[data_url] # let us select two relevant columns gapminder = gapminder[['gdpPercap', 'lifeExp']] print[gapminder.head[3]] gdpPercap lifeExp 0 779.445314 28.801 1 820.853030 30.332 2 853.100710 31.9973
Như chúng ta đã thấy trước đây, điều này trả về một ma trận tương quan cho tất cả các biến. Và lưu ý kết quả tương quan Spearman từ NumPy khớp với athat từ Pandas
data_url = '//bit.ly/2cLzoxH' # read data from url as pandas dataframe gapminder = pd.read_csv[data_url] # let us select two relevant columns gapminder = gapminder[['gdpPercap', 'lifeExp']] print[gapminder.head[3]] gdpPercap lifeExp 0 779.445314 28.801 1 820.853030 30.332 2 853.100710 31.9974
Mối tương quan giữa Spearman với SciPy
Sử dụng SciPy, chúng ta có thể tính tương quan Spearman bằng cách sử dụng hàm spearmanr[] và chúng ta sẽ nhận được kết quả tương tự như trên
data_url = '//bit.ly/2cLzoxH' # read data from url as pandas dataframe gapminder = pd.read_csv[data_url] # let us select two relevant columns gapminder = gapminder[['gdpPercap', 'lifeExp']] print[gapminder.head[3]] gdpPercap lifeExp 0 779.445314 28.801 1 820.853030 30.332 2 853.100710 31.9975
Hiểu sự khác biệt giữa tương quan Pearson và Spearman
Điều đầu tiên nổi bật khi so sánh các hệ số tương quan giữa gdpPercap và lifeExp được tính toán bởi các hệ số tương quan Pearson và Spearman là sự khác biệt lớn giữa chúng. Tại sao chúng khác nhau?
Như đã đề cập trước đây, tương quan Pearson giả định dữ liệu được phân phối bình thường. Tuy nhiên, Spearman không đưa ra bất kỳ giả định nào về việc phân phối dữ liệu. Đó là lý do chính cho sự khác biệt
Hãy để chúng tôi kiểm tra xem các biến có được phân phối bình thường không. Chúng ta có thể hình dung các bản phân phối bằng biểu đồ. Hãy để chúng tôi lập biểu đồ giá trị tuổi thọ từ dữ liệu gapminder
data_url = '//bit.ly/2cLzoxH' # read data from url as pandas dataframe gapminder = pd.read_csv[data_url] # let us select two relevant columns gapminder = gapminder[['gdpPercap', 'lifeExp']] print[gapminder.head[3]] gdpPercap lifeExp 0 779.445314 28.801 1 820.853030 30.332 2 853.100710 31.9976
Đây là phân phối của tuổi thọ và chúng ta có thể thấy rõ rằng nó không phải là phân phối bình thường. Không được hiển thị ở đây, nhưng phân phối của gdPercap không được phân phối bình thường. Do đó, giả định hệ số tương quan Pearson rõ ràng bị vi phạm và có thể giải thích sự khác biệt mà chúng ta thấy
Ngoài ra, tương quan Pearson nắm bắt được sức mạnh của mối quan hệ tuyến tính giữa hai biến. Tuy nhiên, tương quan xếp hạng Spearman cũng có thể nắm bắt được mối liên hệ phi tuyến tính. Nếu chúng ta nhìn vào biểu đồ phân tán của mối quan hệ giữa gdpPercap và lifeExp, chúng ta có thể thấy rằng mối quan hệ này không phải là tuyến tính. Và điều này cũng có thể giải thích sự khác biệt