pbj0812의 코딩 일기

[통계학] PYTHON 을 이용한 AUC 계산 본문

Science/통계학

[통계학] PYTHON 을 이용한 AUC 계산

pbj0812 2020. 11. 10. 02:43

0. 목표

 - PYTHON을 이용한 AUC 계산

1. 실습

 1) library 호출

import pandas as pd
import matplotlib.pyplot as plt

 2) 데이터 생성

index = [i for i in range(1, 21)]
label = ['p', 'p', 'n', 'p', 'p', 'p', 'n', 'n', 'p', 'n', 'p', 'n', 'p', 'n', 'n', 'n', 'p', 'n', 'p', 'n']
probability = [0.9, 0.8, 0.7, 0.6, 0.55, 0.54, 0.53, 0.52, 0.51, 0.505, 0.4, 0.39, 0.38, 0.37, 0.36, 0.35, 0.34, 0.33, 0.3, 0.1]

 3) 데이터 프레임화

data = pd.DataFrame({'index' : index, 'label' : label, 'probability' : probability})

  - 결과

 4) ROC 계산 모듈

# inp1 : data
def ROC(inp1):
    FPR = []
    TPR = []
    P = len(inp1[inp1['label'] == 'p'])
    N = len(inp1[inp1['label'] == 'n'])
    for i in inp1['probability']:
        tmp_p = data[data['probability'] >= i]
        TP = len(tmp_p[tmp_p['label'] == 'p'])
        tmp_TPR = TP/P
        tmp_n = data[data['probability'] >= i]
        FP = len(tmp_n[tmp_n['label'] == 'n'])
        tmp_FPR = FP/N
        TPR.append(tmp_TPR)
        FPR.append(tmp_FPR)
    return TPR, FPR

 5) ROC 계산

TPR, FPR = ROC(data)

 6) AUC 계산

  - 지점마다 사다리꼴의 넓이를 계산하여 더해주는 형식

AUC_TPR = [0] + TPR
AUC_FPR = [0] + FPR

AUC = 0
for i in range(1, len(AUC_TPR)):
    tmp_AUC = (AUC_TPR[i - 1] + AUC_TPR[i]) * (AUC_FPR[i] - AUC_FPR[i - 1]) / 2
    AUC += tmp_AUC

  - 결과 : 0.6799999999999999

print(AUC)

 7) 그래프 생성

fig = plt.figure()
fig.set_size_inches(15, 15)
plt.plot(FPR, TPR)
plt.fill_between(FPR, TPR, 0, facecolor="red", alpha=0.2)
plt.xlabel("FPR", fontsize = 24)
plt.ylabel("TPR", fontsize = 24)
for i in range(len(data['probability'])):
    plt.text(FPR[i], TPR[i], data['probability'][i], fontsize = 18)
# AUC 필기
plt.text(FPR[-1]/2, TPR[-1]/2, 'AUC : ' + str(AUC), fontsize = 24)

2. 참고

 - 데이터 과학자와 데이터 엔지니어를 위한 인터뷰 문답집(Hulu 데이터 과학팀)

Comments