概述
斯皮尔曼系数(Spearman correlation coefficient)是一种衡量两个变量之间的相关性的统计指标,它基于两个变量的等级(而不是原始的数值数据)进行计算。斯皮尔曼系数的取值范围在-1到1之间,其中-1表示完全的负相关,1表示完全的正相关,0表示无相关。
与皮尔逊相关系数(Pearson correlation coefficient)不同,斯皮尔曼系数使用变量的等级(即排序)进行计算,而不是使用原始的数值数据。离散值可以通过将它们转换为等级来进行排名。然后,可以使用斯皮尔曼系数来衡量这些等级之间的相关性。斯皮尔曼系数不对数据的具体数值大小敏感,而是关注变量之间的相对顺序。
一般使用步骤
① 对数据建立交叉表
如:
② 使用斯皮尔曼系数公式对数据求解
其中R(Xi)和R(Yi)为位次。
例题题目
文物编号 | 纹饰 | 类型 | 颜色 | 表面风化 |
---|---|---|---|---|
01 | C | 高钾 | 蓝绿 | 无风化 |
02 | A | 铅钡 | 浅蓝 | 风化 |
03 | A | 高钾 | 蓝绿 | 无风化 |
04 | A | 高钾 | 蓝绿 | 无风化 |
05 | A | 高钾 | 蓝绿 | 无风化 |
06 | A | 高钾 | 蓝绿 | 无风化 |
07 | B | 高钾 | 蓝绿 | 风化 |
08 | C | 铅钡 | 紫 | 风化 |
09 | B | 高钾 | 蓝绿 | 风化 |
10 | B | 高钾 | 蓝绿 | 风化 |
11 | C | 铅钡 | 浅蓝 | 风化 |
12 | B | 高钾 | 蓝绿 | 风化 |
13 | C | 高钾 | 浅蓝 | 无风化 |
14 | C | 高钾 | 深绿 | 无风化 |
15 | C | 高钾 | 浅蓝 | 无风化 |
16 | C | 高钾 | 浅蓝 | 无风化 |
17 | C | 高钾 | 浅蓝 | 无风化 |
18 | A | 高钾 | 深蓝 | 无风化 |
19 | A | 铅钡 | 风化 | |
20 | A | 铅钡 | 浅蓝 | 无风化 |
21 | A | 高钾 | 蓝绿 | 无风化 |
22 | B | 高钾 | 蓝绿 | 风化 |
23 | A | 铅钡 | 蓝绿 | 风化 |
24 | C | 铅钡 | 紫 | 无风化 |
25 | C | 铅钡 | 浅蓝 | 风化 |
26 | C | 铅钡 | 紫 | 风化 |
27 | B | 高钾 | 蓝绿 | 风化 |
28 | A | 铅钡 | 浅蓝 | 风化 |
29 | A | 铅钡 | 浅蓝 | 风化 |
30 | A | 铅钡 | 深蓝 | 无风化 |
31 | C | 铅钡 | 紫 | 无风化 |
32 | C | 铅钡 | 浅绿 | 无风化 |
33 | C | 铅钡 | 深绿 | 无风化 |
34 | C | 铅钡 | 深绿 | 风化 |
35 | C | 铅钡 | 浅绿 | 无风化 |
36 | C | 铅钡 | 深绿 | 风化 |
37 | C | 铅钡 | 深绿 | 无风化 |
38 | C | 铅钡 | 深绿 | 风化 |
39 | C | 铅钡 | 深绿 | 风化 |
40 | C | 铅钡 | 风化 | |
41 | C | 铅钡 | 浅绿 | 风化 |
42 | A | 铅钡 | 浅蓝 | 风化 |
43 | C | 铅钡 | 浅蓝 | 风化 |
44 | A | 铅钡 | 浅蓝 | 风化 |
45 | A | 铅钡 | 浅蓝 | 无风化 |
46 | A | 铅钡 | 浅蓝 | 无风化 |
47 | A | 铅钡 | 浅蓝 | 无风化 |
48 | A | 铅钡 | 风化 | |
49 | A | 铅钡 | 黑 | 风化 |
50 | A | 铅钡 | 黑 | 风化 |
51 | C | 铅钡 | 浅蓝 | 风化 |
52 | C | 铅钡 | 浅蓝 | 风化 |
53 | A | 铅钡 | 浅蓝 | 风化 |
54 | C | 铅钡 | 浅蓝 | 风化 |
55 | C | 铅钡 | 绿 | 无风化 |
56 | C | 铅钡 | 蓝绿 | 风化 |
57 | C | 铅钡 | 蓝绿 | 风化 |
58 | C | 铅钡 | 风化 |
对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析。
代码实现
import pandas as pd
import numpy as np
with pd.ExcelFile('./附件.xlsx') as xls: #将包含多个工作表的excel读取为一个文件夹
df1 = pd.read_excel(xls, '表单1') #读取单个工作表
df2 = pd.read_excel(xls, '表单2')
df3 = pd.read_excel(xls, '表单3')
pd.set_option('display.max_rows', 5) # 控制显示行数
df1 # 展示
cross_tab_1 = pd.crosstab(df1['表面风化'], df1['纹饰'],margins=True,margins_name='合计') # 求交叉表
correlation_1 = cross_tab_1.corr('spearman') # 求相关系数
print("表面风化与纹饰的交叉表为:\n",cross_tab_1)
print("表面风化与纹饰的相关系数为:\n")
correlation_1
cross_tab_2 = pd.crosstab(df1['表面风化'], df1['类型'],margins=True,margins_name='合计') # 求交叉表
correlation_2 = cross_tab_2.corr('spearman') # 求相关系数
print("表面风化与类型的交叉表为:\n",cross_tab_2)
print("表面风化与类型的相关系数为:\n")
correlation_2
cross_tab_3 = pd.crosstab(df1['表面风化'], df1['颜色'],margins=True,margins_name='合计') # 求交叉表
correlation_3 = cross_tab_3.corr('spearman') # 求相关系数
print("表面风化与颜色的交叉表为:\n",cross_tab_3)
print("表面风化与颜色的相关系数为:\n")
correlation_3
# 可视化
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 更改字体
ax_1 = sns.heatmap(
correlation_1,
annot = True,
cmap="coolwarm",
fmt='.1f'
)
bottom,top = ax_1.get_ylim()
ax_1.set_xlim(bottom,top)
plt.savefig('热力图1.png',dpi=300)
ax_2 = sns.heatmap(
correlation_2,
annot = True,
cmap="coolwarm",
fmt='.1f'
)
bottom,top = ax_2.get_ylim()
ax_2.set_xlim(bottom,top)
plt.savefig('热力图2.png',dpi=300)
ax_3 = sns.heatmap(
correlation_3,
annot = True,
cmap="coolwarm",
fmt='.1f'
)
bottom,top = ax_3.get_ylim()
ax_3.set_xlim(bottom,top)
plt.savefig('热力图3.png',dpi=300)