使用斯皮尔曼系数对离散值进行相关性分析

概述

斯皮尔曼系数(Spearman correlation coefficient)是一种衡量两个变量之间的相关性的统计指标,它基于两个变量的等级(而不是原始的数值数据)进行计算。斯皮尔曼系数的取值范围在-1到1之间,其中-1表示完全的负相关,1表示完全的正相关,0表示无相关。

与皮尔逊相关系数(Pearson correlation coefficient)不同,斯皮尔曼系数使用变量的等级(即排序)进行计算,而不是使用原始的数值数据。离散值可以通过将它们转换为等级来进行排名。然后,可以使用斯皮尔曼系数来衡量这些等级之间的相关性。斯皮尔曼系数不对数据的具体数值大小敏感,而是关注变量之间的相对顺序。

一般使用步骤

① 对数据建立交叉表

如:

② 使用斯皮尔曼系数公式对数据求解

其中R(Xi)和R(Yi)为位次。

例题题目

文物编号纹饰类型颜色表面风化
01C高钾蓝绿无风化
02A铅钡浅蓝风化
03A高钾蓝绿无风化
04A高钾蓝绿无风化
05A高钾蓝绿无风化
06A高钾蓝绿无风化
07B高钾蓝绿风化
08C铅钡风化
09B高钾蓝绿风化
10B高钾蓝绿风化
11C铅钡浅蓝风化
12B高钾蓝绿风化
13C高钾浅蓝无风化
14C高钾深绿无风化
15C高钾浅蓝无风化
16C高钾浅蓝无风化
17C高钾浅蓝无风化
18A高钾深蓝无风化
19A铅钡风化
20A铅钡浅蓝无风化
21A高钾蓝绿无风化
22B高钾蓝绿风化
23A铅钡蓝绿风化
24C铅钡无风化
25C铅钡浅蓝风化
26C铅钡风化
27B高钾蓝绿风化
28A铅钡浅蓝风化
29A铅钡浅蓝风化
30A铅钡深蓝无风化
31C铅钡无风化
32C铅钡浅绿无风化
33C铅钡深绿无风化
34C铅钡深绿风化
35C铅钡浅绿无风化
36C铅钡深绿风化
37C铅钡深绿无风化
38C铅钡深绿风化
39C铅钡深绿风化
40C铅钡风化
41C铅钡浅绿风化
42A铅钡浅蓝风化
43C铅钡浅蓝风化
44A铅钡浅蓝风化
45A铅钡浅蓝无风化
46A铅钡浅蓝无风化
47A铅钡浅蓝无风化
48A铅钡风化
49A铅钡风化
50A铅钡风化
51C铅钡浅蓝风化
52C铅钡浅蓝风化
53A铅钡浅蓝风化
54C铅钡浅蓝风化
55C铅钡绿无风化
56C铅钡蓝绿风化
57C铅钡蓝绿风化
58C铅钡风化

对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析。

代码实现

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)

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值