评价方法-秩和比
基本概念
- 秩:rank,秩次,序數(shù)
- 秩和:秩次的和
- 平均秩次:將數(shù)據(jù)從小到大排序并編號(hào)之后序號(hào)的平均數(shù)
- 通過(guò)秩轉(zhuǎn)換獲得無(wú)量綱的統(tǒng)計(jì)量
- 秩和比的精髓不在前半部分的根據(jù)秩次為評(píng)價(jià)對(duì)象排序,而在于后半部分的正態(tài)離差分檔。做綜合評(píng)價(jià)時(shí),可以利用TOPSIS等更加細(xì)膩的方法為評(píng)價(jià)對(duì)象排序,再與秩和比法結(jié)合進(jìn)行分檔。
算法過(guò)程
?
Code
import pandas as pd import numpy as np import statsmodels.api as sm import scipy.stats def rsr(data, weight=None, threshold=None, full_rank=True):Result = pd.DataFrame()n, m = data.shape# 對(duì)原始數(shù)據(jù)編秩if full_rank:for i, X in enumerate(data.columns):Result[f'X{str(i + 1)}:{X}'] = data.iloc[:, i]Result[f'R{str(i + 1)}:{X}'] = data.iloc[:, i].rank(method="average")else:for i, X in enumerate(data.columns):Result[f'X{str(i + 1)}:{X}'] = data.iloc[:, i]Result[f'R{str(i + 1)}:{X}'] = 1 + (n - 1) * (data.iloc[:, i].max() - data.iloc[:, i]) / (data.iloc[:, i].max() - data.iloc[:, i].min())# 計(jì)算秩和比weight = 1 / m if weight is None else np.array(weight) / sum(weight)Result['RSR'] = (Result.iloc[:, 1::2] * weight).sum(axis=1) / nResult['RSR_Rank'] = Result['RSR'].rank(ascending=False)# 繪制 RSR 分布表RSR = Result['RSR']RSR_RANK_DICT = dict(zip(RSR.values, RSR.rank().values))Distribution = pd.DataFrame(index=sorted(RSR.unique()))Distribution['f'] = RSR.value_counts().sort_index()Distribution['Σ f'] = Distribution['f'].cumsum()Distribution[r'\bar{R} f'] = [RSR_RANK_DICT[i] for i in Distribution.index]Distribution[r'\bar{R}/n*100%'] = Distribution[r'\bar{R} f'] / n #根據(jù)累計(jì)頻數(shù)算累計(jì)頻率Distribution.iat[-1, -1] = 1 - 1 / (4 * n) #修正最后一項(xiàng)累計(jì)頻率Distribution['Probit'] = 5 - stats.norm.isf(Distribution.iloc[:, -1]) #inverse survival function 將累計(jì)頻率換算為概率單位# 計(jì)算回歸方差并進(jìn)行回歸分析r0 = np.polyfit(Distribution['Probit'], Distribution.index, deg=1) #x,ymodel = sm.OLS(Distribution.index, sm.add_constant(Distribution['Probit']))#y,xresult = model.fit()print(result.summary())#print(sm.OLS(Distribution.index, sm.add_constant(Distribution['Probit'])).fit().summary())# 殘差檢驗(yàn)z_error, p_error = stats.normaltest(result.resid.values) #tests the null hypothesis that a sample comes from a normal distributionprint("殘差分析: ", p_error)if r0[1] > 0:print(f"\n回歸直線(xiàn)方程為:y = {r0[0]} Probit + {r0[1]}")else:print(f"\n回歸直線(xiàn)方程為:y = {r0[0]} Probit - {abs(r0[1])}")# 代入回歸方程并分檔排序Result['Probit'] = Result['RSR'].apply(lambda item: Distribution.at[item, 'Probit'])Result['RSR Regression'] = np.polyval(r0, Result['Probit'])threshold = np.polyval(r0, [2, 4, 6, 8]) if threshold is None else np.polyval(r0, threshold)Result['Level'] = pd.cut(Result['RSR Regression'], threshold, labels=range(len(threshold) - 1, 0, -1)) #Probit分組[(2, 4] < (4, 6] < (6, 8]]return Result, Distributiondef rsrAnalysis(data, file_name=None, **kwargs):Result, Distribution = rsr(data, **kwargs)file_name = 'RSR 分析結(jié)果報(bào)告.xlsx' if file_name is None else file_name + '.xlsx'Excel_Writer = pd.ExcelWriter(file_name)Result.to_excel(Excel_Writer, '綜合評(píng)價(jià)結(jié)果')Result.sort_values(by='Level', ascending=False).to_excel(Excel_Writer, '分檔排序結(jié)果')Distribution.to_excel(Excel_Writer, 'RSR分布表')Excel_Writer.save()return Result, Distribution### 下面添加文件讀取,然后調(diào)用rsr子函數(shù)就可以了,最后結(jié)果會(huì)自動(dòng)輸出到excel #鏈接里面的是: # 讀取數(shù)據(jù) data = pd.DataFrame({'產(chǎn)前檢查率': [99.54, 96.52, 99.36, 92.83, 91.71, 95.35, 96.09, 99.27, 94.76, 84.80],'孕婦死亡率': [60.27, 59.67, 43.91, 58.99, 35.40, 44.71, 49.81, 31.69, 22.91, 81.49],'圍產(chǎn)兒死亡率': [16.15, 20.10, 15.60, 17.04, 15.01, 13.93, 17.43, 13.89, 19.87, 23.63]},index=list('ABCDEFGHIJ'), columns=['產(chǎn)前檢查率', '孕婦死亡率', '圍產(chǎn)兒死亡率']) #因?yàn)橄旅鎯蓚€(gè)是成本型指標(biāo),需要反向排序,所以他做了這個(gè)變換 data["孕婦死亡率"] = 1 / data["孕婦死亡率"] data["圍產(chǎn)兒死亡率"] = 1 / data["圍產(chǎn)兒死亡率"] # 下面是調(diào)用子函數(shù)進(jìn)行秩和比幾個(gè)步驟的計(jì)算 rsr(data)Notes
Barlett檢驗(yàn):Bartlett檢驗(yàn)是方差齊性檢驗(yàn)(對(duì)兩組樣本的方差是否相同進(jìn)行檢驗(yàn))的一種方法,其核心思想是通過(guò)求取不同組之間的卡方統(tǒng)計(jì)量,然后根據(jù)卡方統(tǒng)計(jì)量的值來(lái)判斷組間方差是否相等。該方法極度依賴(lài)于數(shù)據(jù)是正態(tài)分布,如果數(shù)據(jù)非正態(tài)分布,則結(jié)果偏差很大;而Levene檢驗(yàn)對(duì)正態(tài)分布沒(méi)有要求
方差分析(ANOVA/F檢驗(yàn)):
- 用于兩個(gè)及兩個(gè)以上樣本均數(shù)差別的顯著性檢驗(yàn);而T檢驗(yàn)只能分析兩組(兩個(gè)類(lèi)別)數(shù)據(jù)間的差異;如果剛好兩組,建議樣本較少(小于100)時(shí)使用T檢驗(yàn),反之使用方差分析
- 方差分析有一個(gè)重要的假設(shè)是方差齊性,因?yàn)榉讲罘治鍪怯脕?lái)比較多組之間均值是否存在顯著差異。那如果方差不一致,也就意味著值的波動(dòng)程度是不一樣的,如果此時(shí)均值之間存在顯著差異,不能夠說(shuō)明一定是不同組間處理帶來(lái)的,有可能是大方差帶來(lái)大的波動(dòng);如果方差一樣,也就意味著值的波動(dòng)程度是一樣的,在相同波動(dòng)程度下,直接去比較均值,如果均值之間存在顯著差異,那么可以認(rèn)為是不同組間處理帶來(lái)的。(另外兩個(gè)假設(shè)是:每個(gè)樣本的值服從正態(tài)分布;每個(gè)樣本中的個(gè)體相互獨(dú)立)
Reference
RSR(秩和比綜合評(píng)價(jià)法)介紹及python3實(shí)現(xiàn)
秩和比法RSR
概率密度函數(shù)pdf
python 計(jì)算概率密度、累計(jì)分布、逆函數(shù)
probit與分位函數(shù)
scipy.stats與統(tǒng)計(jì)學(xué)(概率分布)
一元線(xiàn)性回歸分析的t檢驗(yàn)和f檢驗(yàn)
?
總結(jié)
- 上一篇: 高质量发展-协调发展指标体系构建及测算
- 下一篇: 矩阵求秩