비교법의 일치성에 대한 감정

파이썬 3 쌍을 이용한 비교법 시리즈 2탄이다.
지난번에 비교법의 유일성에 대한 감정을 진행하였다.
https://zenn.dev/_kazuya/articles/0e0c95f82cb931
이번에는 유효한 시험 대상 간의 판정 일치성을 조사하기 위해 일치성 감정을 진행한다.
Giithub에서도 ↓
https://github.com/Iovesophy/paired_comparison_method.git

일치성 있는 감정


n 조사자가 판단한 한 쌍의 비교 결과가 얼마나 일치하는지, 완전히 일치하면 n인의 판단에 따라 함계 순위를 의미 있는 순위로 설정한다는 생각[1]
지난 글에서 유일성으로 인정된 시험대상(유효시험대상) 간 비교한 한 쌍의 판단 결과가 얼마나 일치하는지 조사할 수 있다.확률적으로 완전히 일치한다면 시험 대상 간의 판단의 합계 순위를 의미 있는 순위로 삼는다.[2] [3]
(예를 들어 어떤 옷이 어울릴지 선택할 때 사람에 따라 평가 확률이 일치하는지)

※ 위 그림은 그림입니다.

수법에 관하여


유일성 검정을 한 후 유효한 시험 대상의 판정 결과를 합계하다Σ값 획득, 일치성 계수 u 획득.
이후 카이제곱 검정을 통해 시험 대상 간의 판정이 일치하는지 판단한다.
예를 들어 20명의 시험 대상이 비교법의 실험'실험1'을 한 쌍 진행하고 유일성을 감정한 후 17명의 시험 대상이 유일성을 가진다고 가정한다.
표 1
시험 대상수(인)
유일성이 있다
무유일성
실험1
20
17
3
시험 대상 판정의 유일성에 대한 연구 결과
표 2
i>j
A_j
B_j
C_j
D_j
E_j
F_j
합계
A_i
-
1
0
2
4
5
12
B_i
16
-
2
0
2
0
20
C_i
17
15
-
2
0
0
34
D_i
15
17
15
-
4
0
51
E_i
13
15
17
13
-
2
60
F_i
12
17
17
17
15
-
78
실험 1의 실험 결과
이 시계에서 Ai ... F_i 및 Aj ... F_비교 j 시, Ai ... F_보다
표 2와 k(샘플 수량) 및 n(인원수)에서 다음 공식을 선택합니다.Σ값을 흥정하다.[2:1] [3:1]
\Sigma = {}_n C_2\cdot{} {}_k C_2 +\sum_{j>i}\chi_{ij}^2 - n\sum_{j>i}\chi_{ij}
펼치다
{}_n C_2\cdot{} {}_k C_2 =\frac{nk(n-1)(k-1)}{4}
\Sigma =\frac{nk(n-1)(k-1)}{4} +\sum_{j>i}\chi_{ij}^2 - n\sum_{j>i}\chi_{ij}
여기에서는\Sigma값을 계산하는 방법을알기 어려우므로일부계산의구체적인예를 들면↓
\sum_{j>i}\chi_{ij} = 1 + 2\times 5 + 4\times 2 + 5 = 24
\sum_{j>i}\chi_{ij}^2 = 1^2 + 2^2\times 5 + 4^2\times 2 + 5^2 = 78
즉Σ값을 계산하는 데 사용되는\sum{j>i}\chi_{ij} 합계가 아닌 Ai ... F_i 및 Aj ... F_비교 j 시, Ai ... F_판정 i를 사용하여 더 작은 느낌을 주는 각자의 득표.
다음에 일치성 계수 u를 얻습니다.[2:2] [3:2] [4]
u=\frac{2\Sigma}{{}_n C_2\cdot{} {}_k C_2}-1
펼치다
u=\frac{2\Sigma}{\frac{nk(n-1)(k-1)}{4}} - 1
u=\frac{8\Sigma}{nk(n-1)(k-1)} - 1
정합성 보장 계수 u의\Sigma 검정표를 준비할 수 있으면 정합성을 확인할 수 있습니다.

심사하여 결정하다


일치성 계수 u의\Sigma 검정표를 준비할 수 있다면 k(샘플 수량)와 n(인원)의 범위 내에서\Sigma가 표의 값 이상이면 의미가 있고 n인의 판단은 일치한다.
이번에는 지난번과 마찬가지로 케제곱분포표에 따라 일치성\chi^2값, 자유도 f를 측정한다.
자유도
f = {}_k C_2\cdot{}\frac{n(n-1)}{(n-2)^2}
펼치다
{}_k\mathrm{C}_2 =\frac{k!}{2!(k-2)!} =\frac{n(n-1)}{2}
f=\frac{n(n-1)k(k-1)}{2(n-2)^2}
제곱값\chi^2
\chi_0^2 =\frac{4}{n-2}\left\{\Sigma -\frac{1}{2}\cdot{} {}_n C_2\cdot{} {}_k C_2\cdot{}\frac{n-3}{n-2}\right\}
펼치다
{}_n C_2\cdot{} {}_k C_2 =\frac{nk(n-1)(k-1)}{4}
\chi_0^2 =\frac{4}{n-2}\left\{\Sigma -\frac{n(n-1)(n-3)k(k-1)}{8(n-2)}\right\}
chi^2(케제곱분포표)의 유효수준\alpha는 n인의 판단이 일치한다고 할 수 있다.
\chi_0^2\geqq\chi^2 (f,\alpha)

Python 3을 사용한 일관성 검사


컨디션

  • Python 3.9.1 (default, Dec 24 2020, 16:23:16)
  • macOS Big Sur ver11.1(이 OS로 동작 확인)
  • 물줄기

  • 유일성 검정을 먼저 완료
  • 합계 유효시험 대상의 판정결과
  • Σ값 구하기
  • 일치성 계수 u
  • 획득
  • 캐럿 제곱값\chi0^2
  • 를 구하다
  • 케플란 검사를 사용하여 시험 대상 간의 판정이 일치하는지 판단한다
  • 다양한 라이브러리 가져오기
    import pandas as pd
    import csv
    import subprocess
    import re
    import numpy as np
    import datetime
    import sys
    
    웹 메시지 표시
    def welcome_mes(): # 起動時のメッセージ
        print("Welcome to 一対比較法得票集計システムver2:2021,1,3")
        print("paired comparison method consistency vote data aggregate software, PCCS")
        print("made by kazuya yuda.")
    
    CSV 가져오기
    여기서 유일성 검정이 완료되고 유일성이 있는 실험 대상의 실험 결과 파일 이름이 확인된 경우를 전제로 합니다.
    def import_csv(): # 試料読み込み
        material=['','','']
        loop_ans = 0
        count = 0
        n = 1
        while loop_ans < 2:
            # ファイル名確認
            return_code = subprocess.check_output(['ls','./analyze_data'])
            code = return_code.split(b"\n")
            for i in range(len(code)):
                stdout_txt = str(code[i]).replace("b","").replace('\'',"")
                if re.search("csv",stdout_txt):
                    print(stdout_txt)
            print("拡張子を含めて、解析したいmainデータファイル名を入力してください")
            filename = input()
            if filename == "csv":
                print("csvファイルを指定してください。")
                sys.exit()
            elif re.search("csv",filename):
                pass
            else:
                print("csvファイルを指定してください。")
                sys.exit()
            print(filename,end=" ")
            print("を読み込みました.")
            if count == 0 and filename != "":
                material[0] = np.loadtxt('./analyze_data/'+filename, delimiter=',')
                count += 1
            elif filename != "":
                material[0] += np.loadtxt('./analyze_data/'+filename, delimiter=',')
            else:
                pass
    
            print("読み込みを続けますか?y,n:",end=" ")
            ans = input()
            if ans == "n":
                loop_ans = 2
            else:
                n += 1
        if n <= 2:
            print("人数が足りません。")
            sys.exit()
        info=[]
        return_code = subprocess.check_output(['ls','./../selector'])
        code = return_code.split(b"\n")
        for i in range(len(code)):
            stdout_txt = str(code[i]).replace("b","").replace('\'',"")
            if re.search("csv",stdout_txt) and stdout_txt != "sample_info.csv":
                print(stdout_txt)
        print("拡張子を含めて、現在解析中の関連mainデータファイル名を入力してください")
        filename = './../selector/' + input()
        if filename == "csv":
            print("csvファイルを指定してください。")
            sys.exit()
        elif re.search("csv",filename):
            pass
        else:
            print("csvファイルを指定してください。")
            sys.exit()
        print(filename,end=" ")
        print("を読み込みました.")
        # info file のインポート
        filename2 = filename.replace("main","info")
        csv_file = open(filename2, "r", encoding="utf_8", errors="", newline="" )
        f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)
        header = next(f)
        for row in f: # データ読み込み
            info.append(row[1:])
    
        material[1] = info
        material[2] = n
    
        return material
    
    샘플 획득 수량k
    def get_k(info):
        k = int(str(info[2]).replace("[","").replace("]","").replace("\'",""))
        return k
    
    여기 행렬의 위치를 지정합니다Σ값을 계산하기 위한 사전 준비

    위의 그림을 처리합니다.
    def get_array_position():
        material_import = import_csv()
        k = get_k(material_import[1])
        n = int(material_import[2])
        material = material_import[0]
        count = 0
        sum_all = 0
        sum_2 = 0
        for a in range(k-1):
            count += 1
            for b in range(k-count):
                #print(a+1,a+b+2)
                sum_all += int(material[a+1,a+b+2])
                sum_2 += int(material[a+1,a+b+2])**2
    
        #print(material)
        #print(sum_all,sum_2)
        result=['','','','']
        result[0] = sum_all
        result[1] = sum_2
        result[2] = k
        result[3] = n
        return result
    
    다음 서브루틴을 통해 계산한다.
  • Σ값 구하기
  • 일치성 계수 u
  • 획득
  • 자유도 f
  • 캐럿 제곱값\chi0^2
  • 를 구하다
    def sigma_calculation(sum_all,sum_2,k,n):
       v_1 = n*k*(n-1)*(k-1)
       v_2 = float(v_1/4)
       sigma_val = v_2 + sum_2 - (n*sum_all)
       return sigma_val
    
    def consistency_u(sigma_val,k,n):
       v_1 = n*k*(n-1)*(k-1)
       u = float((8*sigma_val/v_1)-1)
       return u
    
    def f_calculation(k,n):
       v_1 = n * (n-1) * k * (k-1)
       v_2 = 2*(n-2)** 2
       f = float(v_1/v_2)
       return f
    
    def chi_2_0_caluculation(sigma_val,k,n):
       v_1 = float(4/(n-2))
       v_2 = n*(n-1)*(n-3)*k*(k-1)
       v_3 = 8*(n-2)
       chi_2_0 = v_1 * (sigma_val - float(v_2/v_3))
       return chi_2_0
    
    마지막으로main을 통해 각 피드의 절차를 호출합니다.
    def main():
        material = get_array_position()
        sum_all = material[0]
        sum_2 = material[1]
        k = material[2]
        n = material[3]
        sigma_val=sigma_calculation(sum_all,sum_2,k,n)
        print("Σ値:",end=" ")
        print(sigma_val)
        print("一致性係数u:",end=" ")
        print(consistency_u(sigma_val,k,n))
        print("自由度f:",end=" ")
        print(f_calculation(k,n))
        print("カイ二乗値:",end="")
        print(chi_2_0_caluculation(sigma_val,k,n))
        
    if __name__ == "__main__":
        main()
    

    실행 결과



    참고로 위의 그림은 필자가 적당히 생성한 데이터이지만 읽은 3개의 csv 파일은 같은 파일이다
    물론 제곱 분포표에서 볼 수 있듯이 데이터는 완전히 일치한다.
    '통계의 기초와 실제-보건, 임상, 가정, 영양학을 위한-'의 부표[5]에 따르면 자유도 f는 90이하이다.
    df\P_r
    0.500
    0.250
    0.100
    0.050
    0.025
    0.010
    0.005
    90
    89.3342
    98.6499
    107.565
    113.145
    118.136
    124.116
    128.299
    인용: "통계의 기초와 실제--보건, 임상, 가정, 영양학을 위하여--"수야철부 부표6카드 자승분포 df 또는 v:자유도에서 일부분을 발췌
    또 이 책에는 자유도 f가 100 이상일 때의 검정 방법도 기재돼 있다.
    이상은 일치성 감정입니다.
    다음에는 자극 사이의 차이를 양적으로 나타내기 위해 서비스법을 사용해 척도화하고 그림을 그릴 예정이다.(2021/01/15 릴리즈)
    https://zenn.dev/_kazuya/articles/a1179ed3f6e027
    ※ 오류, 오자 등이 발견되면 지적하고 지도해 주십시오.
    각주
    "AHP의 일대 비교법에 대한 일대 고찰관능 검사 중의 일대 비교법의 이용"식전양시https://soar-ir.repo.nii.ac.jp/index.php?action=pages_view_main&active_action=repository_action_common_download&item_id=16026&item_no=1&attribute_id=65&file_no=1&page_id=13&block_id=45↩︎
    '감성/관능 평가 시스템 J-SEMS>일치성 계수'https://j-sems.com/일치 계수/↩︎↩︎↩︎
    무장천여대기요(자연과학)'PC 화면에서 보는 삼원색 계절감에 대해'이조치절자, 와천지수https://core.ac.uk/download/pdf/233608433.pdf↩︎↩︎↩︎
    《기초심리학실험법수첩》, 일본기초심리학회(책임편집: 판상귀지, 하원순일랑, 목촌영사, 삼포가세, 행장차랑, 석금호사)↩︎
    "통계의 기초와 실제-보건, 임상, 가정, 영양학을 위하여-"수야철부(광생관)↩︎

    좋은 웹페이지 즐겨찾기