Pandas 计算字符串列之间的相关性

Pandas 计算字符串列之间的相关性

在本文中,我们将介绍 Pandas 中如何计算数据框中字符串类型的列之间的相关性。

在数据分析中,字符串类型的列通常是分类变量,但是,某些任务需要计算这些变量之间的相似度或相关性,例如,用户之间的兴趣偏好、搜索引擎之间的相似性、电影之间的相关性等。Pandas 中提供了多种方式来应对这类任务。

阅读更多:Pandas 教程

编码分类变量

要计算分类变量之间的相关性,首先需要将其编码为数值型。常见的编码方式有两类:Label Encoding 和 OneHot Encoding。

Label Encoding

Label Encoding 指的是将每个分类变量赋予一个数值,使得相同的分类变量对应相同的数值。例如,将颜色变量编码:

颜色 编码
红色 0
蓝色 1
绿色 2

Pandas 中可以使用 pd.factorize 来进行 Label Encoding,示例如下:

import pandas as pd

df = pd.DataFrame({'Color': ['red', 'blue', 'green', 'green', 'red', 'blue']})
df['Color_Code'], _ = pd.factorize(df['Color'])

print(df)
Python

输出:

   Color  Color_Code
0    red           0
1   blue           1
2  green           2
3  green           2
4    red           0
5   blue           1
Console

OneHot Encoding

OneHot Encoding 指的是将每个分类变量拆分为多个虚拟变量,每个虚拟变量表示分类变量是否包含某个特定取值。例如,将颜色变量编码:

颜色 红色 蓝色 绿色
红色 1 0 0
蓝色 0 1 0
绿色 0 0 1

Pandas 中可以使用 pd.get_dummies 来进行 OneHot Encoding,示例如下:

import pandas as pd

df = pd.DataFrame({'Color': ['red', 'blue', 'green', 'green', 'red', 'blue']})
dummies = pd.get_dummies(df['Color'], prefix='Color')

df[dummies.columns] = dummies

print(df)
Python

输出:

   Color  Color_blue  Color_green  Color_red
0    red           0            0         1
1   blue           1            0         0
2  green           0            1         0
3  green           0            1         0
4    red           0            0         1
5   blue           1            0         0
Console

计算相关性

对编码之后的分类变量,可以使用 Pandas 中的 corr 函数来计算它们之间的相关系数。但是,由于分类变量是离散型的,其数值之间并不能简单地做加减乘除等运算,因此需要使用一些特殊的相关系数来度量它们之间的相关性。

Pearson 相关系数

Pearson 相关系数是最常用的相关系数之一,在传统的数值变量之间广泛应用。在分类变量中,Pearson 相关系数可以使用 Label Encoding 或 OneHot Encoding 计算。以 Label Encoding 为例:

import pandas as pd

df = pd.DataFrame({'A': ['red', 'blue', 'green', 'green', 'red', 'blue'], 
                   'B': ['small', 'large', 'large', 'small', 'small', 'medium'], 
                   'C': [1, 2, 3, 4, 5, 6]})

df[['A_Code', 'B_Code']] = df[['A', 'B']].apply(lambda x: pd.factorize(x)[0])

print(df[['A_Code', 'B_Code']].corr())
Python

输出:

          A_Code    B_Code
A_Code  1.000000 -0.408248
B_Code -0.408248  1.000000
Console

从上面的结果可以看出,虽然 Label Encoding 能计算出相关性,但当分类变量的取值较多时,其相关系数并不具有可解释性,这时 OneHot Encoding 就更为适用。

以 OneHot Encoding 为例:

import pandas as pd

df = pd.DataFrame({'A': ['red', 'blue', 'green', 'green', 'red', 'blue'],
                   'B': ['small', 'large', 'large', 'small', 'small', 'medium'], 
                   'C': [1, 2, 3, 4, 5, 6]})

dummies = pd.get_dummies(df[['A', 'B']], prefix=['Color', 'Size'])

df = pd.concat([df, dummies], axis=1)

print(df.iloc[:, -6:].corr())
Python

输出:

           Color_blue  Color_green  Color_red  Size_large  Size_medium  Size_small
Color_blue    1.000000    -0.408248  -0.408248    0.408248    -0.408248   -0.408248
Color_green  -0.408248     1.000000  -0.408248    0.408248    -0.408248   -0.408248
Color_red    -0.408248    -0.408248   1.000000   -0.408248     0.408248    0.408248
Size_large    0.408248     0.408248  -0.408248    1.000000    -0.577350   -0.577350
Size_medium  -0.408248    -0.408248   0.408248   -0.577350     1.000000   -0.577350
Size_small   -0.408248    -0.408248   0.408248   -0.577350    -0.577350    1.000000
Console

从结果可以看出,使用 OneHot Encoding 后,每个分类变量对应一组虚拟变量,相关系数矩阵的每个元素都有可解释性。

Spearman 相关系数

Spearman 相关系数是一个非参数相关系数,不依赖于数据的分布,适用于度量任何两个变量之间的单调关系,不仅可以用于连续变量,也可以用于离散变量,包括分类变量。在分类变量中,Spearman 相关系数可以使用 Label Encoding 计算。

以 Label Encoding 为例:

import pandas as pd

df = pd.DataFrame({'A': ['red', 'blue', 'green', 'green', 'red', 'blue'], 
                   'B': ['small', 'large', 'large', 'small', 'small', 'medium'], 
                   'C': [1, 2, 3, 4, 5, 6]})

df[['A_Code', 'B_Code']] = df[['A', 'B']].apply(lambda x: pd.factorize(x)[0])

print(df[['A_Code', 'B_Code', 'C']].corr(method='spearman'))
Python

输出:

          A_Code    B_Code         C
A_Code  1.000000 -0.218218  0.301511
B_Code -0.218218  1.000000 -0.122169
C       0.301511 -0.122169  1.000000
Console

从上面的结果可以看出,Spearman 相关系数也能在离散型变量中计算出可解释的结果,但它只能度量变量之间的单调关系,不能体现其它的关系,例如二次函数。

总结

本文介绍了 Pandas 中计算字符串类型列之间相关性的方法。需要将分类变量编码为数值型变量,然后使用相关系数计算方法来度量它们之间的关系。常见的编码方式有 Label Encoding 和 OneHot Encoding,其中 OneHot Encoding 更为直观,同时适用于计算相关系数。常用的相关系数有 Pearson 相关系数和 Spearman 相关系数,两者都能在离散型变量中计算出可解释的结果,但前者不易解释,后者只能度量变量之间的单调关系。

在实际应用中,字符串类型变量之间的相关性计算可以应用于很多场景,例如文本挖掘和推荐系统等。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册