ضریب همبستگی غیرخطی چترجی (Chatterjee) در پایتون — راهنمای گام به گام

۵۰۲ بازدید
آخرین به‌روزرسانی: ۰۸ خرداد ۱۴۰۲
زمان مطالعه: ۴ دقیقه
ضریب همبستگی غیرخطی چترجی (Chatterjee) در پایتون — راهنمای گام به گام

در آموزش‌های پیشین مجله فرادرس، با پیاده‌سازی الگوریتم گرادیان کاهشی و روش نیوتون رافسون در پایتون آشنا شدیم. در این آموزش، مطالبی را درباره پیاده‌سازی ضریب همبستگی چترجی در پایتون بیان می‌کنیم.

آشنایی با ضریب همبستگی غیرخطی چترجی (Chatterjee)

ضریب همبستگی معیاری برای بررسی ارتباط آماری بین دو متغیر است. با استفاده از این عدد می‌توان دریافت که آیا ارتباط معناداری بین دو متغیر وجود دارد یا خیر. از همبستگی می‌توان برای آماده‌سازی داده، کاهش ابعاد، تحلیل گراف و... استفاده کرد.

برای انواع مختلفی از متغیرها، معیارهای متفاوتی تعریف شده است که پرتکرارترین حالت مربوط به بررسی همبستگی بین دو متغیر پیوسته است.

ضریب همبستگی پیرسون (Pearson Correlation Coefficient) پرکاربردترین معیار برای بررسی همبستگی خطی بین متغیرها است که به‌صورت زیر محاسبه می‌شود:

$$ \large r{(X, Y)}=\frac{\operatorname{cov}{(X, Y)}}{\operatorname{var}{(X)} \cdot \operatorname{var}{(Y)}}=\frac{\sum\left(x_{i}-\bar{x}\right)\left(y_{i}-\bar{y}\right)}{\sqrt{\sum\left(x_{i}-\bar{x}\right)^{2} \sum\left(y_{i}-\bar{y}\right)^{2}}} $$

رابطه فوق همواره عددی بین $$-1$$ و $$+1$$ خواهد داد. مشکل بزرگی که این معیار دارد، خطی بودن آن است و سایر ارتباطات بین متغیرها را نمی‌تواند تشخیص دهد. به همین دلیل، اغلب از Scatter Pair Plot برای بررسی ارتباطات غیرخطی بین متغیر‌ها استفاده می‌شود.

روش جدید دیگر برای بررسی همبستگی‌های غیرخطی، استفاده از ضریب همبستگی رتبه‌ای چترجی (Chatterjee Rank Correlation) است. این ضریب نیز همواره عددی بین $$-1$$ و $$+1$$ را به خود می‌گیرد، با این تفاوت که قابلیت کشف ارتباطات غیرخطی (درجه دوم، لگاریتمی، سینوسی و...) را نیز دارد.

برای محاسبه ضریب همبستگی رتبه‌ای چترجی دو متغیر پیوسته با مقادیر غیرتکراری در $$X$$، به‌صورت زیر عمل می‌کنیم:

$$ \large \xi{(X, Y)}=1-\frac{3 \sum_{i=1}^{n-1}\left|r_{i+1}-r_{i}\right|}{n^{2}-1} $$

در این رابطه، $$r$$ نشان دهنده Rank مربوط به $$Y$$ها بعد از مرتب شدن با توجه به $$X$$ها است.

نکته‌ دیگری که وجود دارد، این است که به‌ازای $$n$$ داده، در شدیدترین حالت همبستگی، مقدار ضریب برابر با عبارت زیر خواهد بود:

$$ \large \frac{ n-2}{n+1}$$

که با زیاد شدن تعداد‌ها، قابل صرف‌نظر خواهد بود.

برای یادگیری برنامه‌نویسی با زبان پایتون، پیشنهاد می‌کنیم به مجموعه آموزش‌های مقدماتی تا پیشرفته پایتون فرادرس مراجعه کنید که لینک آن در ادامه آورده شده است.

ضریب همبستگی غیرخطی چترجی (Chatterjee) در پایتون

حال برای بررسی و پیاده‌سازی ضریب همبستگی چترجی در پایتون، وارد محیط برنامه‌نویسی شده و کتابخانه‌های مورد نیاز را فراخوانی می‌کنیم:

1import numpy as np
2import matplotlib.pyplot as plt

ابتدا Random State و Style را تنظیم می‌کنیم:

1np.random.seed(0)
2plt.style.use('ggplot')

حال باید ضریب همبستگی پیرسون را پیاده‌سازی کنیم. برای این کار، ابتدا یک تابع تعریف می‌کنیم که در ورودی دو آرایه مربوط به متغیرها را دریافت می‌کند:

1def PCC(X:np.ndarray, Y:np.ndarray):

حال برای محاسبه کوواریانس خواهیم داشت:

1def PCC(X:np.ndarray, Y:np.ndarray):
2    C = np.cov(X, Y)

ماتریس $$C$$ در این شرایط به‌شکل زیر خواهد بود:

$$ \large \left[\begin{array}{cc}
\operatorname{var}{(X)} & \operatorname{cov}{(X, Y)} \\
\operatorname{cov}{(X, Y)} & \operatorname{var}{(Y)}
\end{array}\right] $$

بنابراین، می‌توان از آن به‌صورت زیر برای محاسبه ضریب همبستگی پیرسون استفاده کرد:

1def PCC(X:np.ndarray, Y:np.ndarray):
2    C = np.cov(X, Y)
3    pcc = C[0, 1] / (C[0, 0] * C[1, 1])**0.5
4    return pcc

این تابع، در خروجی، ضریب مورد نظر را برمی‌گرداند.

توجه داشته باشید که می‌توان از کتابخانه Scipy نیز برای محاسبه ضریب همبستگی پیرسون استفاده کرد:

1pcc = scipy.stats.pearsonr(X, Y)[0]

حال برای بررسی عملکرد کد، یک مجموعه داده با رابطه زیر تولید می‌کنیم:

$$ \large y _ i = 2 x _ i + 1 + e_i , \;\;\;\;\;\; \sigma^2(e) =0.5, \;\; \overline{e}=0 $$

1X = np.random.uniform(-5, +5, 50)
2Y = 2*X + 1 + np.random.normal(0, 0.5, 50)

که برای رسم این دو متغیر در مقابل هم، می‌نویسیم:

1plt.scatter(X, Y, s=12)
2plt.xlabel('X')
3plt.ylabel('Y')
4plt.axhline(lw=1, c='k')
5plt.axvline(lw=1, c='k')
6plt.show()

که نمودار زیر حاصل می‌شود.

ضریب همبستگی چترجی

حال برای محاسبه و مشاهده ضریب همبستگی پیرسون می‌نویسیم:

1pcc = PCC(X, Y)
2print(f'Pearson Correlation Coefficient: {pcc}')

که خواهیم داشت:

Pearson Correlation Coefficient: 0.9963573476843708

حال اگر مقدار واریانس نویز اضافه‌شده به متغیر $$Y$$ را از $$0.5$$ به $$2$$ تغییر دهیم، شکل زیر را خواهیم داشت.

ضریب همبستگی غیرخطی Chatterjee در پایتون

در این شرایط، ضریب همبستگی پیرسون نیز از $$0.99$$ به $$0.94$$ کاهش می‌یابد.

حال رابطه استفاده‌شده در تولید داده‌ها را به‌صورت زیر تغییر می‌دهیم:

$$ \large y _ i = x _ i ^2+1+ e_i , \;\;\;\;\;\; \sigma^2(e) =0.5, \;\; \overline{e}=0 $$

در این حالت نمودار زیر حاصل خواهد شد.

ضریب همبستگی غیرخطی Chatterjee در پایتون

در این نمودار با اینکه ارتباط بین $$X$$ و $$Y$$ کاملاً مشهود است، ضریب همبستگی پیرسون عدد $$-0.03$$ را به خود می‌گیرد. به دلیل این مشکل، نیاز به معیارهایی که بتواند روابط غیرخطی را تشخیص دهد، افزایش می‌یابد.

پیاده‌سازی ضریب همبستگی رتبه‌ای چترجی در پایتون

حال به سراغ ضریب همبستگی رتبه‌ای چترجی می‌رویم تا آن را نیز پیاده‌سازی کرده و نتایج را مشاهده کنیم.

ابتدا یک تابع تعریف کرده و متغیرهای ورودی را دریافت می‌کنیم:

1def CRC(X:np.ndarray, Y:np.ndarray):

حال باید اندیس‌های داده‌ها را با توجه به ترتیب $$X$$ محاسبه کنیم:

1def CRC(X:np.ndarray, Y:np.ndarray):
2    A = np.argsort(X)

حال می‌توانیم ماتریس $$Y$$ را با استفاده از ماتریس $$A$$ مرتب کنیم:

1def CRC(X:np.ndarray, Y:np.ndarray):
2    A = np.argsort(X)
3    Ys = Y[A]

حال می‌توانیم ماترس Rank را تولید کنیم، در این ماتریس، هر عضو از داده‌ها با تک تک اعضای دیگر مقایسه می‌شود و بزرگ‌تر یا کوچک‌تر بودن آن نشان داده می‌شود. برای این کار می‌توانیم بنویسیم:

1def CRC(X:np.ndarray, Y:np.ndarray):
2    A = np.argsort(X)
3    Ys = Y[A]
4    R = (Ys[:, None] <= Ys)

به این ترتیب، ماتریس مربعی $$R$$ تولید می‌شود. در شکل نهایی رابطه، تنها نیاز به تعداد Trueها در هر ستون داریم، بنابراین باید در طول ستون‌ها عمل جمع (Summation) انجام دهیم:

1    A = np.argsort(X)
2    Ys = Y[A]
3    R = (Ys[:, None] <= Ys).sum(1)

حال تعداد داده‌ها را نیز محاسبه کرده و در فرمول آورده شده قرار می‌دهیم:

1def CRC(X:np.ndarray, Y:np.ndarray):
2    A = np.argsort(X)
3    Ys = Y[A]
4    R = (Ys[:, None] <= Ys).sum(1)
5    N = R.size
6    crc = 1 - (3 * np.sum(np.abs(R[1:] - R[:-1]))) / (N**2 - 1)
7    return crc

به این ترتیب، ضریب همبستگی رتبه‌ای چترجی محاسبه و در خروجی برگردانده می‌شود.

حال مجموعه داده مربوط به رابطه سهمی را تولید کرده و ضریب همبستگی رتبه‌ای چترجی را محاسبه می‌کنیم:

1X = np.random.uniform(-5, +5, 50)
2Y = X**2 + 1 + np.random.normal(0, 0.5, 50)
3
4pcc = PCC(X, Y)
5crc = CRC(X, Y)
6print(f'Pearson Correlation Coefficient: {pcc}')
7print(f'Chatterjee Rank Correlation:     {crc}')
8
9plt.scatter(X, Y, s=12)
10plt.xlabel('X')
11plt.ylabel('Y')
12plt.axhline(lw=1, c='k')
13plt.axvline(lw=1, c='k')
14plt.show()

که شکل زیر را خواهیم داشت.

پیاده‌سازی ضریب همبستگی در پایتون 
Pearson Correlation Coefficient: -0.03724899705945379
Chatterjee Rank Correlation:     +0.82953181272509

به این ترتیب، مشاهده می‌کنیم که ضریب همبستگی رتبه‌ای چترجی وجود ارتباطی آماری بین دو متغیر را تأیید می‌کند.

می‌توان ارتباطات پیچیده‌تر مثل ترکیب دو تابع سینوسی را نظر گرفت:

1X = np.random.uniform(-5, +5, 100)
2Y = 0.5 * np.sin(2*X + 1) + 1.2 * np.sin(X) + np.random.normal(0, 0.1, 100)

که در این حالت نتایج مطابق شکل زیر خواهد بود.

ضریب همبستگی رتبه‌ای
Pearson Correlation Coefficient: -0.2120912310052988
Chatterjee Rank Correlation:     +0.786978697869787

به این ترتیب، عملکرد مناسب ضریب همبستگی رتبه‌ای چترجی مشهود است.

جمع‌بندی

در این آموزش، با پیاده‌سازی ضریب همبستگی غیرخطی Chatterjee در پایتون به‌صورت گام به گام آشنا شدیم. برای بررسی‌های بیشتر می‌توان ضرایب مشابه را با ضریب همبستگی رتبه‌ای چترجی مقایسه کرد:

  1. ضریب همبستگی رتبه‌ای اسپیرمن (Spearman Rank Correlation Coefficient)
  2. ضریب همبستگی رتبه‌ای کندال (Kendall Rank Correlation Coefficient)
بر اساس رای ۹ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
مجله فرادرس
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *