Tương quan được tính bằng Python như thế nào?

Chào các bạn, Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu các bước tính tương quan giữa các biến trong Python. Nói một cách đơn giản, tương quan là mối quan hệ giữa hai biến ngẫu nhiên về cơ bản đối với thống kê

Tham khảo bài viết sau để biết thêm chi tiết về tương quan. Tương quan trong Python

Dưới đây là một số tương quan phổ biến được xác định trong thống kê

  • Tương quan Pearson
  • Mối tương quan của Spearman
  • tương quan của Kendall

Tính toán tương quan trong Python

Chúng ta có thể đo lường mối tương quan giữa hai hoặc nhiều biến bằng cách sử dụng mô-đun Pingouin. Bước đầu tiên là cài đặt gói bằng cách sử dụng lệnh cơ bản

pip install --upgrade pingouin

Khi bạn đã cài đặt gói, hãy nhập gói đó vào chương trình

import pingouin as pi

Bây giờ, hãy lấy một tập dữ liệu ngẫu nhiên chứa kết quả kiểm tra tính cách của 200 cá nhân bao gồm tuổi, chiều cao, cân nặng và chỉ số IQ của họ. [Nếu bạn muốn, tôi có thể cung cấp cho bạn mã để tạo tập dữ liệu ngẫu nhiên]
Chúng tôi đã tính toán mối tương quan giữa chiều cao và cân nặng của các cá nhân bằng cách sử dụng pingouin. chức năng sửa lỗi

pi.corr[x=df['Height'], y=df['Weight']]

Mã đầy đủ

import pingouin as pi 
import pandas
 
df = pandas.read_csv['myDataset.csv'] 
print['%i people and %x columns' % df.shape] 
df.head[]

pi.corr[x=df['Height'], y=df['Weight']]

Đầu ra của đoạn mã trên sẽ là

200 subjects and 4 columns

nrCI95%r2adj_r2p-valBF10powerpearson2000. 485[0. 37, 0. 58]0. 2350. 2273. 595866e-132. 179e+101. 0

Ở đây r là hệ số tương quan
Phương pháp này hơi khó hiểu. Chúng tôi có một phương pháp dễ dàng [Mô-đun trên dựa trên phương pháp này]. Trong phần này, chúng ta chỉ cần tạo khung dữ liệu [df] và gọi df. corr[method=” “]  trong đó phương thức nhận ba đối số[‘pearson’ , ‘kendall’ , ‘spearman’]. Chẳng hạn, hãy xem bên dưới để thực hiện

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb

df = pandas.read_csv['myDataset.csv']
df.head[]
pearson_correlation = df.corr[method='pearson']
print[pearson_correlation]
sb.heatmap[pearson_correlation, 
            xticklabels=pearson_correlation.columns,
            yticklabels=pearson_correlation.columns,
            cmap="YlGnBu",
            annot=True,
            linewidth=0.5]
spearman_correlation=df.corr[method='spearman']
print[spearman_correlation]
kendall_correlation=df.corr[method='kendall']
print[kendall_correlation]

đầu ra

    Age        IQ    Height    Weight
Age     1.000000 -0.091642 -0.037185  0.062123
IQ     -0.091642  1.000000 -0.027006 -0.008442
Height -0.037185 -0.027006  1.000000  0.484540
Weight  0.062123 -0.008442  0.484540  1.000000
             Age        IQ    Height    Weight
Age     1.000000 -0.061948 -0.018034  0.038593
IQ     -0.061948  1.000000 -0.029939  0.015395
Height -0.018034 -0.029939  1.000000  0.457071
Weight  0.038593  0.015395  0.457071  1.000000
             Age        IQ    Height    Weight
Age     1.000000 -0.041663 -0.009941  0.029109
IQ     -0.041663  1.000000 -0.017685  0.011402
Height -0.009941 -0.017685  1.000000  0.315211
Weight  0.029109  0.011402  0.315211  1.000000

Ở đây tôi đã sử dụng mô-đun seaborn và matplotlib để hiển thị hình trên vì đầu ra hơi lộn xộn để nghiên cứu trực tiếp. Ở đây tôi chỉ vẽ bản đồ nhiệt cho tương quan Pearson

Như bạn có thể thấy các giá trị đường chéo là 1 thể hiện mối quan hệ tích cực mạnh mẽ giữa hai biến giống nhau. Để xác định mối tương quan giữa hai biến khác nhau, chỉ cần tìm kiếm tên hàng tương ứng với tên cột tương ứng

Trong hướng dẫn này, chúng tôi sử dụng tập dữ liệu “cường độ bê tông” để khám phá mối quan hệ giữa hai biến liên tục

7. 1. sơ bộ

import pandas as pd
con = pd.read_csv['Data/ConcreteStrength.csv']
con

Không Xi măng Xỉ Tro bay Nước SP Thô Aggr. tiền phạt. Khí nén Cường độ nén [28 ngày][Mpa]01273. 082. 0105. 0210. 09. 0904. 0680. 0No34. 99012163. 0149. 0191. 0180. 012. 0843. 0746. 0Có32. 27223162. 0148. 0191. 0179. 016. 0840. 0743. 0Có35. 45034162. 0148. 0190. 0179. 019. 0838. 0741. 0No42. 08045154. 0112. 0144. 0220. 010. 0923. 0658. 0No26. 820. 9899248. 3101. 0239. 1168. 97. 7954. 2640. 6No49. 97099100248. 0101. 0239. 9169. 17. 7949. 9644. 1No50. 230100101258. 888. 0239. 6175. 37. 6938. 9646. 0Có43. 461101102297. 140. 9239. 9194. 07. 5908. 9651. 8Có44. 639102103348. 70. 1223. 1208. 59. 6786. 2758. 1No48. 770

103 hàng × 10 cột

7. 2. Đổi tên cột

Nhớ lại các tên cột trong tệp “ConcretStrength” có vấn đề. chúng quá dài để nhập lặp lại, có khoảng trắng và bao gồm các ký tự đặc biệt như “. ”. Mặc dù chúng tôi có thể thay đổi tên của các cột trong bảng tính cơ bản trước khi nhập, nhưng nói chung sẽ thực tế hơn/ít công việc hơn/ít rủi ro hơn nếu để nguyên bảng tính và tệp của tổ chức và viết một số mã để sửa chữa mọi thứ trước khi phân tích. Bằng cách này, bạn không phải bắt đầu lại khi phiên bản cập nhật của dữ liệu được chuyển cho bạn

Hãy bắt đầu bằng cách liệt kê các tên cột. Đối tượng Pandas DataFrame hiển thị danh sách các cột thông qua thuộc tính

['No',
 'Cement',
 'Slag',
 'Fly ash',
 'Water',
 'SP',
 'Coarse Aggr.',
 'Fine Aggr.',
 'Air Entrainment',
 'Compressive Strength [28-day][Mpa]']
1. Ở đây tôi sử dụng phương pháp chuyển đổi loại
['No',
 'Cement',
 'Slag',
 'Fly ash',
 'Water',
 'SP',
 'Coarse Aggr.',
 'Fine Aggr.',
 'Air Entrainment',
 'Compressive Strength [28-day][Mpa]']
2 để chuyển đổi kết quả thành một danh sách đơn giản [in ra đẹp hơn]

________số 8_______

Phương pháp

['No',
 'Cement',
 'Slag',
 'Fly ash',
 'Water',
 'SP',
 'Coarse Aggr.',
 'Fine Aggr.',
 'Air Entrainment',
 'Compressive Strength [28-day][Mpa]']
3 cho khung dữ liệu rất đơn giản. Ở đây tôi định nghĩa một từ điển Python chuẩn [có dạng {key1. giá trị1, khóa2. value2, … }] và gán nó cho trục “cột”. Hãy nhớ rằng đối số
['No',
 'Cement',
 'Slag',
 'Fly ash',
 'Water',
 'SP',
 'Coarse Aggr.',
 'Fine Aggr.',
 'Air Entrainment',
 'Compressive Strength [28-day][Mpa]']
4 là bắt buộc nếu chúng ta muốn thay đổi khung dữ liệu cơ bản

con.rename[columns={'Fly ash': 'FlyAsh', 'Coarse Aggr.': "CoarseAgg",
                    'Fine Aggr.': 'FineAgg', 'Air Entrainment': 'AirEntrain', 
                    'Compressive Strength [28-day][Mpa]': 'Strength'}, inplace=True]
con.head[]

NoCementSlagFlyAshWaterSPCoarseAggFineAggAirEntrainStrength01273. 082. 0105. 0210. 09. 0904. 0680. 0No34. 99012163. 0149. 0191. 0180. 012. 0843. 0746. 0Có32. 27223162. 0148. 0191. 0179. 016. 0840. 0743. 0Có35. 45034162. 0148. 0190. 0179. 019. 0838. 0741. 0No42. 08045154. 0112. 0144. 0220. 010. 0923. 0658. 0No26. 820

Như trước đây, chúng ta nên chuyển đổi bất kỳ biến phân loại rõ ràng nào thành các loại

con['AirEntrain'] = con['AirEntrain'].astype['category']
con.describe[include='category']

AirEntraincount103unique2topNofreq56

['No',
 'Cement',
 'Slag',
 'FlyAsh',
 'Water',
 'SP',
 'CoarseAgg',
 'FineAgg',
 'AirEntrain',
 'Strength']

7. 4. Thêm nhãn

Đến thời điểm này, chúng tôi chưa nói nhiều về việc trang trí biểu đồ Seaborn bằng nhãn và các chi tiết khác. Điều này là do Seaborn làm khá tốt theo mặc định. Nhưng nếu chúng ta cần làm sạch biểu đồ của mình một chút, thì đây là điều cần biết. các phương thức biểu đồ Seaborn trả về một đối tượng [thuộc loại AxesSubplot, bất kể đó là gì] mà các thuộc tính có thể được đặt

Ở đây tôi gán kết quả của lệnh gọi

['No',
 'Cement',
 'Slag',
 'Fly ash',
 'Water',
 'SP',
 'Coarse Aggr.',
 'Fine Aggr.',
 'Air Entrainment',
 'Compressive Strength [28-day][Mpa]']
5 cho một biến có tên là
['No',
 'Cement',
 'Slag',
 'Fly ash',
 'Water',
 'SP',
 'Coarse Aggr.',
 'Fine Aggr.',
 'Air Entrainment',
 'Compressive Strength [28-day][Mpa]']
6 và sau đó đặt các thuộc tính khác nhau của
['No',
 'Cement',
 'Slag',
 'Fly ash',
 'Water',
 'SP',
 'Coarse Aggr.',
 'Fine Aggr.',
 'Air Entrainment',
 'Compressive Strength [28-day][Mpa]']
6. Tôi kết thúc dòng cuối cùng của khối mã bằng dấu chấm phẩy để chặn các giá trị trả về

ax = sns.scatterplot[x="FlyAsh", y="Strength", data=con]
ax.set_title["Concrete Strength vs. Fly ash"]
ax.set_xlabel["Fly ash"];

7. 5. Thêm một dòng phù hợp nhất

Như chúng ta đã thấy với SAS Enterprise Guide và R, đôi khi rất hữu ích khi thêm một đường phù hợp nhất [với khoảng tin cậy xung quanh độ dốc] vào biểu đồ phân tán. Nhưng hãy rõ ràng. đây không phải là một trong những tình huống này. Rõ ràng từ biểu đồ phân tán ở trên là mối quan hệ giữa cường độ bê tông và tro bay chỉ là tuyến tính yếu

Cách dễ nhất để “thêm” một đường phù hợp nhất vào biểu đồ phân tán là sử dụng một phương pháp vẽ biểu đồ khác. Phương pháp

['No',
 'Cement',
 'Slag',
 'Fly ash',
 'Water',
 'SP',
 'Coarse Aggr.',
 'Fine Aggr.',
 'Air Entrainment',
 'Compressive Strength [28-day][Mpa]']
8 của Seaborn [trong đó “lm” là viết tắt của “mô hình tuyến tính”] là một khả năng

sns.lmplot[x="FlyAsh", y="Strength", data=con];

7. 6. Thêm màu làm chiều thứ ba

Một “mánh khóe tiệc tùng” đồ họa được các công cụ như Tableau tạo ra thời trang là sử dụng màu sắc, kích thước hoặc một số gợi ý trực quan khác để thêm chiều thứ ba vào biểu đồ phân tán hai chiều. Trong trường hợp màu sắc [hay “sắc độ” trong thuật ngữ Seaborn], chiều thứ ba này phải là một biến không liên tục. Điều này là do bảng màu có sẵn có một số tùy chọn hữu hạn

sns.lmplot[x="FlyAsh", y="Strength", hue="AirEntrain", data=con];

7. 7. Hệ số tương quan

Hệ số tương quan [thường được ký hiệu là r] là một số duy nhất mô tả mức độ của mối quan hệ tuyến tính giữa hai biến. Giá trị +1 biểu thị tuyến tính hoàn hảo [hai biến di chuyển cùng nhau, như “chiều cao tính bằng inch” và “chiều cao tính bằng centimet”]. Giá trị của r = 0 cho biết không có mối tương quan [các biến độc lập] và r = -1 cho biết các biến có tương quan nghịch [sự gia tăng của một biến có liên quan đến sự giảm của biến kia]

Giống như nhiều số liệu thống kê khác [các phép đo bắt nguồn từ dữ liệu thô], có các cách hơi khác nhau để tính hệ số tương quan ít nhiều nhạy cảm với các giá trị ngoại lai và các đặc điểm khác của dữ liệu. Biện pháp phổ biến nhất là hệ số tương quan Pearson. Thư viện Scipy cung cấp một phương thức có tên là

['No',
 'Cement',
 'Slag',
 'Fly ash',
 'Water',
 'SP',
 'Coarse Aggr.',
 'Fine Aggr.',
 'Air Entrainment',
 'Compressive Strength [28-day][Mpa]']
9 [Pearson's r]

from scipy import stats
stats.pearsonr[con['Strength'], con['FlyAsh']]

[0.4063870105954507, 2.0500713273946373e-05]

Một lần nữa, nó không phải là kết quả đẹp nhất. Tuy nhiên, nếu chúng tôi muốn, chúng tôi có thể ghi kết quả vào khung dữ liệu và áp dụng bất kỳ định dạng nào trong Python mà chúng tôi muốn. Tuy nhiên, ở dạng này, chúng tôi nhận được hai số

  1. Pearson's r [0,4063—giống như chúng ta có trong Excel, R, v.v. ]

  2. Giá trị p. Đây là xác suất mà giá trị thực của r bằng 0 [không tương quan]

Dựa trên điều này, chúng tôi kết luận rằng có mối quan hệ tuyến tính yếu giữa cường độ bê tông và tro bay nhưng không quá yếu đến mức chúng tôi có thể kết luận rằng các biến số này không tương quan với nhau. Nói cách khác, có vẻ như tro bay có ảnh hưởng nhất định đến cường độ bê tông

Tất nhiên, tương quan không bao hàm quan hệ nhân quả. Cũng đúng, dựa trên giá trị của r, để nói rằng cường độ bê tông có ảnh hưởng nhất định đến lượng tro bay trong hỗn hợp. Nhưng hy vọng rằng chúng ta đủ thông minh để biết điều gì đó về việc trộn một mẻ bê tông và nói chung có thể suy ra quan hệ nhân quả, hoặc ít nhất là tính định hướng. Nghĩa là, chúng tôi sử dụng kiến ​​thức về lĩnh vực của mình để giúp diễn giải các kết quả thống kê

7. 8. Ma trận tương quan

Ma trận tương quan là một cách thuận tiện để tính các hệ số tương quan theo cặp giữa hai hoặc nhiều biến [số]. Khung dữ liệu Pandas có chức năng này được tích hợp sẵn trong phương thức

con.rename[columns={'Fly ash': 'FlyAsh', 'Coarse Aggr.': "CoarseAgg",
                    'Fine Aggr.': 'FineAgg', 'Air Entrainment': 'AirEntrain', 
                    'Compressive Strength [28-day][Mpa]': 'Strength'}, inplace=True]
con.head[]
0 của nó, mà tôi đã gói bên trong phương thức
con.rename[columns={'Fly ash': 'FlyAsh', 'Coarse Aggr.': "CoarseAgg",
                    'Fine Aggr.': 'FineAgg', 'Air Entrainment': 'AirEntrain', 
                    'Compressive Strength [28-day][Mpa]': 'Strength'}, inplace=True]
con.head[]
1 để giữ cho mọi thứ gọn gàng. Lưu ý rằng mọi ma trận tương quan đều đối xứng. tương quan của “Xi măng” với “Xỉ” giống như tương quan của “Xỉ” với “Xi măng” [-0. 24]. Do đó, trên cùng [hoặc dưới cùng, tùy thuộc vào sở thích của bạn] của mọi ma trận tương quan là dư thừa. Mối tương quan giữa mỗi biến và chính nó là 1. 0, do đó đường chéo

['No',
 'Cement',
 'Slag',
 'Fly ash',
 'Water',
 'SP',
 'Coarse Aggr.',
 'Fine Aggr.',
 'Air Entrainment',
 'Compressive Strength [28-day][Mpa]']
0

NoCementSlagFlyAshWaterSPCoarseAggFineAggStrengthNo1. 00-0. 03-0. 080. 34-0. 14-0. 330. 22-0. 310. 19Xi măng-0. 031. 00-0. 24-0. 490. 22-0. 11-0. 310. 060. 46Slag-0. 08-0. 241. 00-0. 32-0. 030. 31-0. 22-0. 18-0. 33FlyAsh0. 34-0. 49-0. 321. 00-0. 24-0. 140. 17-0. 280. 41Nước-0. 140. 22-0. 03-0. 241. 00-0. 16-0. 600. 11-0. 22SP-0. 33-0. 110. 31-0. 14-0. 161. 00-0. 100. 06-0. 02ThôAgg0. 22-0. 31-0. 220. 17-0. 60-0. 101. 00-0. 49-0. 15MỹAgg-0. 310. 06-0. 18-0. 280. 110. 06-0. 491. 00-0. 17Sức mạnh0. 190. 46-0. 330. 41-0. 22-0. 02-0. 15-0. 171. 00

7. 9. Ma trận tương quan với bản đồ nhiệt

Python và các thư viện của nó làm cho nhiều thứ trở nên dễ dàng. Ví dụ: một khi ma trận tương quan được xác định [tôi đã gán cho biến

con.rename[columns={'Fly ash': 'FlyAsh', 'Coarse Aggr.': "CoarseAgg",
                    'Fine Aggr.': 'FineAgg', 'Air Entrainment': 'AirEntrain', 
                    'Compressive Strength [28-day][Mpa]': 'Strength'}, inplace=True]
con.head[]
2 ở trên], nó có thể được chuyển đến phương thức
con.rename[columns={'Fly ash': 'FlyAsh', 'Coarse Aggr.': "CoarseAgg",
                    'Fine Aggr.': 'FineAgg', 'Air Entrainment': 'AirEntrain', 
                    'Compressive Strength [28-day][Mpa]': 'Strength'}, inplace=True]
con.head[]
3 của Seaborn để tạo bản đồ nhiệt [hoặc lưới phủ đầu]. Ý tưởng cơ bản của bản đồ nhiệt là chúng thay thế các con số bằng các màu có sắc thái khác nhau, như được biểu thị bằng tỷ lệ bên phải. Các ô nhẹ hơn có giá trị r cao hơn. Kiểu trực quan hóa này có thể giúp phát hiện các mối quan hệ tuyến tính giữa các biến dễ dàng hơn nhiều so với một bảng số. Ví dụ: nếu tôi tập trung vào cột “Sức mạnh”, tôi thấy ngay rằng “Xi măng” và “Tro bay” có mối tương quan thuận lớn nhất trong khi “Xỉ” có mối tương quan nghịch lớn nhất

Tương quan được tính như thế nào?

Hệ số tương quan được tính bằng cách xác định hiệp phương sai của các biến và chia số đó cho tích của độ lệch chuẩn của các biến đó .

Làm thế nào để tính toán tương quan trong gấu trúc?

Khởi tạo hai biến col1 và col2 và gán cho chúng các cột mà bạn muốn tìm mối tương quan của. Tìm mối tương quan giữa col1 và col2 bằng cách sử dụng df[col1]. corr[df[col2]] và lưu giá trị tương quan vào một biến, corr. In giá trị tương quan, corr

Chủ Đề