計算兩列的相關性

ben犇發表於2024-03-26

計算兩列的相關性

使用Pandas中的corr()函式計算DataFrame中特定的兩列之間相關係數。

def corr_analys(input_file_path, col_1, col_2, output_pic_path, sheet_name='Sheet1'):
    '''
    # ######################################
    # 計算兩列之間的相關係數(Pearson相關係數)
    # 列印輸出計算結果
    # 並繪製相關性熱圖
    # 輸入資料建議先歸一化處理
    # ######################################

    Parameters
    ----------
    input_file_path : 包含要計算的列的檔案,這裡是excel檔案

    col_1, col_2 : 要計算的兩列

    output_pic_path :生成的相關性熱圖儲存的路徑,圖片名稱是日期

    sheet_name : 指定具體的excel工作表
    '''
    
    df = pd.read_excel(input_file_path, sheet_name=sheet_name)

    subset = df[[col_1, col_2]]

    corr_coefficient = subset[col_1].corr(subset[col_2])
    print('Correlation coefficient between {} and {} : {:.7f}'.format(col_1, col_2, corr_coefficient))

    corr_matrix = subset.corr()

    plt.figure(figsize=(8, 6))
    # 顯示中文,防止亂碼
    plt.rcParams['font.family'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    # 使用sns中的heatmap()函式講計算出來的相關係數轉化為熱力圖
    sns.heatmap(corr_matrix, cmap='coolwarm', annot=True, fmt='.2f')
    plt.title('Correlation Heatmap between {} and {}'.format(col_1, col_2))
    plt.xlabel(col_2)
    plt.ylabel(col_1)

    current_time = datetime.datetime.now()
    file_time = current_time.strftime("%Y%m%d%H%M%S") + '.png'
    output_file_path = output_pic_path + 'Corr_' + file_time
    # 檢查目錄是否存在,如果不存在則建立
    output_dir = os.path.dirname(output_pic_path)
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    plt.savefig(output_file_path)

    plt.close()

    print('Correlation coefficient completed')

    return output_file_path


def call_corr():
    input_file_path = '../n.xlsx'
    output_pic_path = './cor/'
    col_1 = 'xxxx'
    col_2 = 'xxxx'

    output_file_path = corr_analys(input_file_path, col_1, col_2, output_pic_path)
    print('Hotmap saved to {}'.format(output_file_path))

關鍵的程式碼其實就是

corr_coefficient = subset[col_1].corr(subset[col_2])

這裡corr()預設是使用Pearson方法,如果需要使用Spearman方法或者Kendall方法,需要在執行計算式顯式指定。

例如下面是一個計算Spearman相關係數的函式介面:

def corr_analys_spearman(input_file_path, col_1, col_2, output_pic_path, sheet_name='Sheet1'):
    # 計算斯皮爾曼相關係數
    df = pd.read_excel(input_file_path, sheet_name=sheet_name)

    subset = df[[col_1, col_2]]

    corr_coefficient = subset[col_1].corr(subset[col_2], method='spearman')
    print('Spearman correlation coefficient between {} and {} : {:.7f}'.format(col_1, col_2, corr_coefficient))

關鍵是在corr中顯示的指定method='spearman'

Reference

不錯的網站:極客筆記

https://deepinout.com/pandas/pandas-tutorials/t_how-to-get-the-correlation-between-two-columns-in-pandas.html

相關文章