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)
输出:
Color Color_Code
0 red 0
1 blue 1
2 green 2
3 green 2
4 red 0
5 blue 1
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)
输出:
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
计算相关性
对编码之后的分类变量,可以使用 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())
输出:
A_Code B_Code
A_Code 1.000000 -0.408248
B_Code -0.408248 1.000000
从上面的结果可以看出,虽然 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())
输出:
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
从结果可以看出,使用 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'))
输出:
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
从上面的结果可以看出,Spearman 相关系数也能在离散型变量中计算出可解释的结果,但它只能度量变量之间的单调关系,不能体现其它的关系,例如二次函数。
总结
本文介绍了 Pandas 中计算字符串类型列之间相关性的方法。需要将分类变量编码为数值型变量,然后使用相关系数计算方法来度量它们之间的关系。常见的编码方式有 Label Encoding 和 OneHot Encoding,其中 OneHot Encoding 更为直观,同时适用于计算相关系数。常用的相关系数有 Pearson 相关系数和 Spearman 相关系数,两者都能在离散型变量中计算出可解释的结果,但前者不易解释,后者只能度量变量之间的单调关系。
在实际应用中,字符串类型变量之间的相关性计算可以应用于很多场景,例如文本挖掘和推荐系统等。
极客教程