在编制指标体系和数据分析时,需要从多个维度对多个评价对象进行综合评价时,可以考虑使用秩和比法。从实验数据来看,当评价对象较多时,结果会呈现较好的正态分布特征。
秩和比法(Rank-sum ratio,简称RSR法),是我国学者、原中国预防医学科学院田凤调教授于1988年提出的,集古典参数统计与近代非参数统计各自优点于一体的统计分析方法。
它不仅适用于四格表资料的综合评价,也适用于行×列表资料的综合评价,同时也适用于计量资料和分类资料的综合评价。
RSR法现在广泛地应用于医疗卫生、科技、经济等邻域的多指标综合评价、统计预测预报、鉴别分类、统计质量控制等方面。
使用数据大小的相对关系,对评价对象进行排名,根据排名的结果计算得到RSR。
一般过程是将效益型指标从小到大排序进行排名、成本型指标从大到小排序进行排名,再计算秩和比,最后统计回归、分档排序。通过秩转换,获得无量纲统计量RSR;
在此基础上,运用参数统计分析的概念与方法,研究RSR的分布;以RSR值对评价对象的优劣直接排序或分档排序,从而对评价对象做出综合评价。
以非参数法为基础,对指标的选择无特殊要求,适用于各种评价对象,由于计算时使用的数值是秩次,可以消除异常值的干扰。
排序的主要依据是利用原始数据的秩次,最终算得的 RSR 值反映的是综合秩次的差距,而与原始数据的顺位间的差距程度大小无关,这样在指标转化为秩次是会失去一些原始数据的信息,如原始数据的大小差别等。
当 RSR 值实际上不满足正态分布时,分档归类的结果与实际情况会有偏差(根据中心极限定理,样本量大时会趋近于正态分布),且只能回答分级程度是否有差别,不能进一步回答具体的差别情况。
此处计算步骤以基金投资案例说明,选取7个指标对基金投资进行评价。
其中X1,X2,X3为正向指标(效益型指标),值越大越好,排序时从小到大排。
X4,X5为负向指标(成本型指标),值越低越好,排序时从大到小排。
原始数据如下:
X1 | X2 | X3 | X4 | X5 | |
---|---|---|---|---|---|
1 | 34100 | 0.999091 | 0.98 | 0.971793 | 0.002727 |
2 | 22630 | 0.673973 | 0.673973 | 1 | 0 |
3 | 5766 | 0.774194 | 0.774194 | 0.993056 | 0 |
4 | 992 | 1 | 0.9375 | 0.71875 | 0.21875 |
5 | 13206 | 0.680751 | 0.664319 | 0.775862 | 0.00939 |
6 | 26319 | 0.831567 | 0.804476 | 0.805949 | 0.014134 |
7 | 45601 | 0.807614 | 0.7845 | 0.771886 | 0.004759 |
8 | 34007 | 0.836828 | 0.807657 | 0.899782 | 0.000912 |
9 | 34565 | 0.910314 | 0.896861 | 0.796059 | 0.006278 |
10 | 5735 | 1 | 1 | 1 | 0 |
编秩方法有整次秩和比法和非整次秩和比法。
将 n 个评价对象的 m 个评价指标排列成 n 行 m 列的原始数据表。编出每个指标各评价对象的秩,其中效益型指标从小到大编秩,成本型指标从大到小编秩,同一指标数据相同者编平均秩。
得到秩矩阵 R = ( R i j ) m × n R=\left ( R_{ij} \right )_{m \times n} R=(Rij)m×n
如下表:
X1 | R1 | X2 | R2 | X3 | R3 | X4 | R4 | X5 | R5 | |
---|---|---|---|---|---|---|---|---|---|---|
1 | 34100 | 8 | 0.999091 | 8 | 0.98 | 9 | 0.971793 | 4 | 0.002727 | 6 |
2 | 22630 | 5 | 0.673973 | 1 | 0.673973 | 2 | 1 | 1.5 | 0 | 9 |
3 | 5766 | 3 | 0.774194 | 3 | 0.774194 | 3 | 0.993056 | 3 | 0 | 9 |
4 | 992 | 1 | 1 | 9.5 | 0.9375 | 8 | 0.71875 | 10 | 0.21875 | 1 |
5 | 13206 | 4 | 0.680751 | 2 | 0.664319 | 1 | 0.775862 | 8 | 0.00939 | 3 |
6 | 26319 | 6 | 0.831567 | 5 | 0.804476 | 5 | 0.805949 | 6 | 0.014134 | 2 |
7 | 45601 | 10 | 0.807614 | 4 | 0.7845 | 4 | 0.771886 | 9 | 0.004759 | 5 |
8 | 34007 | 7 | 0.836828 | 6 | 0.807657 | 6 | 0.899782 | 5 | 0.000912 | 7 |
9 | 34565 | 9 | 0.910314 | 7 | 0.896861 | 7 | 0.796059 | 7 | 0.006278 | 4 |
10 | 5735 | 2 | 1 | 9.5 | 1 | 10 | 1 | 1.5 | 0 | 9 |
用类似于线性插值(也比较像优劣解距离法)的方式对指标值进行编秩,以改进 RSR 法编秩方法的不足,所编秩次与原指标值之间存在定量的线性对应关系,从而克服了 RSR 法秩次化时易损失原指标值定量信息的缺点。
将某对象的各秩乘以相应的权重并求和后,除以对象个数,得到该对象的RSR,公式: R S R i = 1 n ∑ j = 1 m ω j R i j RSR_{i} = \frac{1}{n}\sum_{j=1}^{m}\omega_{j}R_{ij} RSRi=n1∑j=1mωjRij
其中, i i i表示某个对象, j j j表示各指标的序号。
当各指标权重相同时,权重 ω j = 1 m \omega_{j}=\frac{1}{m} ωj=m1 ,RSR的计算可以简化为: R S R i = 1 m n ∑ j = 1 m R i j RSR_{i} = \frac{1}{mn}\sum_{j=1}^{m}R_{ij} RSRi=mn1∑j=1mRij
本例中使用整次秩和比法编秩,计算结果如下,如 R S R 11 = ( 8 + 8 + 9 + 4 + 6 ) / ( 5 × 10 ) = 0.7 RSR_{11}=\left (8+8+9+4+6 \right ) /(5 \times 10)=0.7 RSR11=(8+8+9+4+6)/(5×10)=0.7
X1 | X2 | X3 | X4 | X5 | R1 | R2 | R3 | R4 | R5 | RSR | |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 34100 | 0.999091 | 0.980000 | 0.971793 | 0.002727 | 8 | 8 | 9 | 4 | 6 | 0.7 |
2 | 22630 | 0.673973 | 0.673973 | 1 | 0 | 5 | 1 | 2 | 1.5 | 9 | 0.37 |
3 | 5766 | 0.774194 | 0.774194 | 0.993056 | 0 | 3 | 3 | 3 | 3 | 9 | 0.42 |
4 | 992 | 1 | 0.937500 | 0.71875 | 0.21875 | 1 | 9.5 | 8 | 10 | 1 | 0.59 |
5 | 13206 | 0.680751 | 0.664319 | 0.775862 | 0.00939 | 4 | 2 | 1 | 8 | 3 | 0.36 |
6 | 26319 | 0.831567 | 0.804476 | 0.805949 | 0.014134 | 6 | 5 | 5 | 6 | 2 | 0.48 |
7 | 45601 | 0.807614 | 0.784500 | 0.771886 | 0.004759 | 10 | 4 | 4 | 9 | 5 | 0.64 |
8 | 34007 | 0.836828 | 0.807657 | 0.899782 | 0.000912 | 7 | 6 | 6 | 5 | 7 | 0.62 |
9 | 34565 | 0.910314 | 0.896861 | 0.796059 | 0.006278 | 9 | 7 | 7 | 7 | 4 | 0.68 |
10 | 5735 | 1 | 1.000000 | 1 | 0 | 2 | 9.5 | 10 | 1.5 | 9 | 0.64 |
对RSR进行分布检验,确认分布之后通过分布的概率进行分级。主要步骤:
确定RSR分布是指用概率单位Probit表达值的累计频率。Probit模型是一种广义的线性模型,服从正态分布。其转换步骤为:
以上4个步骤为理论步骤,实际操作中可以简化为:
X1 | X2 | X3 | X4 | X5 | R1 | R2 | R3 | R4 | R5 | RSR | f | Σf | R ˉ / n \bar R/n Rˉ/n | R ˉ / n \bar R/n Rˉ/n 修正 | 原Probit | Probit | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 13206 | 0.680751 | 0.664319 | 0.775862 | 0.00939 | 4 | 2 | 1 | 8 | 3 | 0.36 | 1 | 1 | 0.1 | 0.1 | -1.28155 | 3.718448 |
2 | 22630 | 0.673973 | 0.673973 | 1 | 0 | 5 | 1 | 2 | 1.5 | 9 | 0.37 | 1 | 2 | 0.2 | 0.2 | -0.84162 | 4.158379 |
3 | 5766 | 0.774194 | 0.774194 | 0.993056 | 0 | 3 | 3 | 3 | 3 | 9 | 0.42 | 1 | 3 | 0.3 | 0.3 | -0.5244 | 4.475599 |
4 | 26319 | 0.831567 | 0.804476 | 0.805949 | 0.014134 | 6 | 5 | 5 | 6 | 2 | 0.48 | 1 | 4 | 0.4 | 0.4 | -0.25335 | 4.746653 |
5 | 992 | 1 | 0.937500 | 0.71875 | 0.21875 | 1 | 9.5 | 8 | 10 | 1 | 0.59 | 1 | 5 | 0.5 | 0.5 | 0 | 5 |
6 | 34007 | 0.836828 | 0.807657 | 0.899782 | 0.000912 | 7 | 6 | 6 | 5 | 7 | 0.62 | 1 | 6 | 0.6 | 0.6 | 0.253347 | 5.253347 |
7 | 45601 | 0.807614 | 0.784500 | 0.771886 | 0.004759 | 10 | 4 | 4 | 9 | 5 | 0.64 | 1 | 7.5 | 0.75 | 0.75 | 0.67449 | 5.67449 |
8 | 5735 | 1 | 1.000000 | 1 | 0 | 2 | 9.5 | 10 | 1.5 | 9 | 0.64 | 1 | 7.5 | 0.75 | 0.75 | 0.67449 | 5.67449 |
9 | 34565 | 0.910314 | 0.896861 | 0.796059 | 0.006278 | 9 | 7 | 7 | 7 | 4 | 0.68 | 1 | 9 | 0.9 | 0.9 | 1.281552 | 6.281552 |
10 | 34100 | 0.999091 | 0.980000 | 0.971793 | 0.002727 | 8 | 8 | 9 | 4 | 6 | 0.7 | 1 | 10 | 1 | 0.975 | 1.959964 | 6.959964 |
此处的校验R-squared和Adj. R-squared值并不高,因为数据做了截取。在真实数据中这两项的值都超过了0.99
将Probit代入回归方程,计算出校正RSR值
X1 | X2 | X3 | X4 | X5 | R1 | R2 | R3 | R4 | R5 | RSR | f | Σf | R/n | R/n’ | Probit | Probit’ | regression | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 13206 | 0.680751 | 0.664319 | 0.775862 | 0.00939 | 4 | 2 | 1 | 8 | 3 | 0.36 | 1 | 1 | 0.1 | 0.1 | -1.28155 | 3.718448 | 0.368154 |
2 | 22630 | 0.673973 | 0.673973 | 1 | 0 | 5 | 1 | 2 | 1.5 | 9 | 0.37 | 1 | 2 | 0.2 | 0.2 | -0.84162 | 4.158379 | 0.42236 |
3 | 5766 | 0.774194 | 0.774194 | 0.993056 | 0 | 3 | 3 | 3 | 3 | 9 | 0.42 | 1 | 3 | 0.3 | 0.3 | -0.5244 | 4.475599 | 0.461446 |
4 | 26319 | 0.831567 | 0.804476 | 0.805949 | 0.014134 | 6 | 5 | 5 | 6 | 2 | 0.48 | 1 | 4 | 0.4 | 0.4 | -0.25335 | 4.746653 | 0.494844 |
5 | 992 | 1 | 0.937500 | 0.71875 | 0.21875 | 1 | 9.5 | 8 | 10 | 1 | 0.59 | 1 | 5 | 0.5 | 0.5 | 0 | 5 | 0.52606 |
6 | 34007 | 0.836828 | 0.807657 | 0.899782 | 0.000912 | 7 | 6 | 6 | 5 | 7 | 0.62 | 1 | 6 | 0.6 | 0.6 | 0.253347 | 5.253347 | 0.557276 |
7 | 45601 | 0.807614 | 0.784500 | 0.771886 | 0.004759 | 10 | 4 | 4 | 9 | 5 | 0.64 | 1 | 7.5 | 0.75 | 0.75 | 0.67449 | 5.67449 | 0.609168 |
8 | 5735 | 1 | 1.000000 | 1 | 0 | 2 | 9.5 | 10 | 1.5 | 9 | 0.64 | 1 | 7.5 | 0.75 | 0.75 | 0.67449 | 5.67449 | 0.609168 |
9 | 34565 | 0.910314 | 0.896861 | 0.796059 | 0.006278 | 9 | 7 | 7 | 7 | 4 | 0.68 | 1 | 9 | 0.9 | 0.9 | 1.281552 | 6.281552 | 0.683967 |
10 | 34100 | 0.999091 | 0.980000 | 0.971793 | 0.002727 | 8 | 8 | 9 | 4 | 6 | 0.7 | 1 | 10 | 1 | 0.975 | 1.959964 | 6.959964 | 0.767558 |
在分级时可以按照合理拍档或最佳拍档原则进行分级。本例中将40%以下的作为C等,80%以下的作为B等,其余的作为A等。40%,80%对应的就是正态分布函数的累计概率(面积)。
注:其实在实际操作中,level分类时,直接使用regression的分位数得到的效果也是一样的,而且操作起来更简单。
X1 | X2 | X3 | X4 | X5 | R1 | R2 | R3 | R4 | R5 | RSR | f | Σf | R/n | R/n’ | Probit | Probit’ | regression | level | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 13206 | 0.680751 | 0.664319 | 0.775862 | 0.00939 | 4 | 2 | 1 | 8 | 3 | 0.36 | 1 | 1 | 0.1 | 0.1 | -1.28155 | 3.718448 | 0.368154 | C |
2 | 22630 | 0.673973 | 0.673973 | 1 | 0 | 5 | 1 | 2 | 1.5 | 9 | 0.37 | 1 | 2 | 0.2 | 0.2 | -0.84162 | 4.158379 | 0.42236 | C |
3 | 5766 | 0.774194 | 0.774194 | 0.993056 | 0 | 3 | 3 | 3 | 3 | 9 | 0.42 | 1 | 3 | 0.3 | 0.3 | -0.5244 | 4.475599 | 0.461446 | C |
4 | 26319 | 0.831567 | 0.804476 | 0.805949 | 0.014134 | 6 | 5 | 5 | 6 | 2 | 0.48 | 1 | 4 | 0.4 | 0.4 | -0.25335 | 4.746653 | 0.494844 | C |
5 | 992 | 1 | 0.937500 | 0.71875 | 0.21875 | 1 | 9.5 | 8 | 10 | 1 | 0.59 | 1 | 5 | 0.5 | 0.5 | 0 | 5 | 0.52606 | B |
6 | 34007 | 0.836828 | 0.807657 | 0.899782 | 0.000912 | 7 | 6 | 6 | 5 | 7 | 0.62 | 1 | 6 | 0.6 | 0.6 | 0.253347 | 5.253347 | 0.557276 | B |
7 | 45601 | 0.807614 | 0.784500 | 0.771886 | 0.004759 | 10 | 4 | 4 | 9 | 5 | 0.64 | 1 | 7.5 | 0.75 | 0.75 | 0.67449 | 5.67449 | 0.609168 | B |
8 | 5735 | 1 | 1.000000 | 1 | 0 | 2 | 9.5 | 10 | 1.5 | 9 | 0.64 | 1 | 7.5 | 0.75 | 0.75 | 0.67449 | 5.67449 | 0.609168 | B |
9 | 34565 | 0.910314 | 0.896861 | 0.796059 | 0.006278 | 9 | 7 | 7 | 7 | 4 | 0.68 | 1 | 9 | 0.9 | 0.9 | 1.281552 | 6.281552 | 0.683967 | A |
10 | 34100 | 0.999091 | 0.980000 | 0.971793 | 0.002727 | 8 | 8 | 9 | 4 | 6 | 0.7 | 1 | 10 | 1 | 0.975 | 1.959964 | 6.959964 | 0.767558 | A |
import pandas as pd
import statsmodels.api as sm
from warnings import simplefilter
from scipy.stats import norm
df = pd.DataFrame([
[34100, 0.999091, 0.98, 0.971793, 0.002727],
[22630, 0.673973, 0.673973, 1, 0],
[5766, 0.774194, 0.774194, 0.993056, 0],
[992, 1, 0.9375, 0.71875, 0.21875],
[13206, 0.680751, 0.664319, 0.775862, 0.00939],
[26319, 0.831567, 0.804476, 0.805949, 0.014134],
[45601, 0.807614, 0.7845, 0.771886, 0.004759],
[34007, 0.836828, 0.807657, 0.899782, 0.000912],
[34565, 0.910314, 0.896861, 0.796059, 0.006278],
[5735, 1, 1, 1, 0]
], columns=["X1", "X2", "X3", "X4", "X5"])
# 正向指标,从小到大排序
df["R1"] = df["X1"].rank(ascending=True, method="average")
df["R2"] = df["X2"].rank(ascending=True, method="average")
df["R3"] = df["X3"].rank(ascending=True, method="average")
# 负向指标,从大到小排
df["R4"] = df["X4"].rank(ascending=False, method="average")
df["R5"] = df["X5"].rank(ascending=False, method="average")
# 计算RSR值
df["RSR"] = df.loc[:, ["R1", "R2", "R3", "R4", "R5"]].sum(axis=1) / (5 * 10)
# 排序
df.sort_values(by="RSR", inplace=True)
# 因为实际数据没有重复,此处偷懒,直接写1
df["f"] = 1
df["Σf"] = df["RSR"].rank(method="average")
df["R/n"] = df["Σf"] / len(df)
df["R/n'"] = df["R/n"]
df.iat[-1, -1] = 1 - 1 / 4 / len(df)
df["Probit"] = norm.ppf(df["R/n'"])
df["Probit'"] = df["Probit"] + 5
import numpy as np
r0 = np.polyfit(df["Probit'"], df["RSR"], deg=1)
if r0[1] > 0:
print(f"\n回归直线方程为:y = {r0[0]} Probit + {r0[1]}")
else:
print(f"\n回归直线方程为:y = {r0[0]} Probit - {abs(r0[1])}")
simplefilter(action="ignore", category=FutureWarning)
simplefilter(action="ignore", category=UserWarning)
print(sm.OLS(df["Probit"], sm.add_constant(df["RSR"])).fit().summary())
df["regression"] = np.polyval(r0, df["Probit'"])
C_LEVEL = norm.ppf(0.4) + 5
B_LEVEL = norm.ppf(0.8) + 5
A_LEVEL = 10
threshold = np.polyval(r0, [0, C_LEVEL, B_LEVEL, A_LEVEL])
print("threshold:", threshold)
df["level"] = pd.cut(df["regression"], threshold, labels=["C", "B", "A"])
df["regression_pct"] = df["regression"].rank(pct=True, ascending=True, method="average")
# 设置pandas打印时显示的列数
pd.set_option("display.max_columns", 1000)
pd.set_option("display.max_columns", None)
pd.set_option("display.width", 1000)
print(df)