본문 바로가기
IT/오랫만코딩:파이썬

DAY07 통계검정 (with OpenAI/Bing 챗(chat) GPT 생성한 파이썬 코드 첨삭)

by 자바라머신러닝 2023. 3. 14.

빅데이터분석기사나 ADsP 응시 때 포기했던 통계분석이 이번에도 필자를 괴롭힙니다. 도대체 이해가 안 되는 내요입니다. 이번에는 강의에서 풀지 못했던 일부 문제를 Bing 챗(chat) GPT 의 도움으로 작성해 보았습니다. 잘 작성된 단측검정 코드로 양측검정 코드 생성을 요청하니 제대로 답해줬습니다.

 

자유도 30 (사건회수) + 검정통계량 1.5 / 1.9 / 2.4 일 때, 단측 t-검정 코드 생성

자유도 30 (사건회수) + 검정통계량 1.5 / 1.9 / 2.4 일때, 단측 t-검정 후 검정통계량, 신뢰구간, 유의 수준, 검정경례 산출 후 시각화까지 파이썬 코드 작성 요청

 

챗 gpt 실행결과의 코드는 아래 접은글에 작성되어 있습니다.

더보기
for i in [1.5, 1.9, 2.4]:
    t_check_oneway(i, 30, 0.05)
 
def t_check_oneway(t_stat, df, alpha):  
    # 검정통계량
    t_stat = t_stat

    # 자유도
    df = df

    # 유의수준
    alpha = alpha
   
    print(f"검정통계량 : ({t_stat:.2f}, 자유도 : {df:.2f}, 유의수준 : {alpha:.2f})")

    # 단측검정 범위 구하기 (상한값만 구함)
    t_crit = t.ppf(1 - alpha, df) # 누적분포함수의 역함수 사용
    upper_bound = t_crit # 상한값은 그대로 사용
    print(f"단측검정 범위: (-inf, {upper_bound:.2f})")

    # p-value 구하기 (상한값만 구함)
    p_value = 1 - t.cdf(t_stat, df) # 누적분포함수 사용하고 양쪽 꼬리 곱하지 않음
    print(f"p-value: {p_value:.3f}")

    # 유의수준과 p-value 비교하여 결론 도출
    if p_value < alpha:
        print("p-value가 유의수준보다 작으므로 귀무가설을 기각합니다.")
    else:
        print("p-value가 유의수준보다 크거나 같으므로 귀무가설을 채택합니다.")

    # t-분포 그래프 그리기
    x = np.linspace(-4, 4, 100) # x축 범위 설정
    y = t.pdf(x, df) # y축 값 설정 (확률밀도함수 사용)
    plt.plot(x, y) # 그래프 그리기

    # 임계영역 색칠하기 (상한값만 색칠) - 우측
    x_fill = np.linspace(upper_bound, 4) # x축 임계영역 설정
    y_fill = t.pdf(x_fill, df) # y축 임계영역 설정
    plt.fill_between(x_fill, y_fill) # 임계영역 색칠하기

    # 검정 통계량 표시하기 (점으로 표시)
    plt.scatter(t_stat, 0) # 점으로 표시
    plt.annotate(f"t={t_stat}", (t_stat + 0.1 ,0)) # 점 옆에 값 표시

    # 축 이름 및 제목 설정하기
    plt.xlabel("t value")
    plt.ylabel("Probability density")
    plt.title("One-tailed t-test")

    # 그래프 보여주기
    plt.show()

단측검정 결과는 다음과 같이 출력됩니다.

 

검정통계량 1.9 일때
검정통계량 1.5 일때 단측검정
검정통계량 1.9 일때 단측검정
검정통계량 1.9 일때 단측검정
검정통계량 2.4 일때 단측검정
검정통계량 2.4 일때 단측검정

자유도 30 (사건회수) + 검정통계량 1.5 / 1.9 / 2.4 일 때, 양측 t-검정 코드 생성

여러 번 시도 중에 위 단측 검정 코드가 괜찮아서 아래처럼 단측 검정 함수를 입력한 후 양측 t-검정 코드 생성을 요청했습니다.

단측검정 함수를 입력하고 양측검정 함수 생성 요청 결과
단측검정 함수를 입력하고 양측검정 함수 생성 요청 결과

결과 코드는 다음과 같습니다.

더보기
for i in [1.5, 1.9, 2.4]:
    t_check_twoway(i, 30, 0.05)
 
def t_check_twoway(t_stat, df, alpha):  
    # 검정통계량
    t_stat = t_stat

 

    # 자유도
    df = df

 

    # 유의수준
    alpha = alpha
   
    print(f"검정통계량 : ({t_stat:.2f}, 자유도 : {df:.2f}, 유의수준 : {alpha:.2f})")

 

    # 양측검정 범위 구하기 (상한값과 하한값 모두 구함)
    t_crit = abs(t.ppf(alpha / 2, df)) # 누적분포함수의 역함수 사용하고 절대값 취함
    lower_bound = -t_crit # 하한값은 음수로 사용
    upper_bound = t_crit # 상한값은 그대로 사용
    print(f"양측검정 범위: ({lower_bound:.2f}, {upper_bound:.2f})")

 

    # p-value 구하기 (상한값과 하한값 모두 구함)
    p_value = 2 * (1 - t.cdf(abs(t_stat), df)) # 누적분포함수 사용하고 절대값 취하고 양쪽 꼬리 곱하기 2
    print(f"p-value: {p_value:.3f}")

 

    # 유의수준과 p-value 비교하여 결론 도출
    if p_value < alpha:
        print("p-value가 유의수준보다 작으므로 귀무가설을 기각합니다.")
    else:
        print("p-value가 유의수준보다 크거나 같으므로 귀무가설을 채택합니다.")

 

    # t-분포 그래프 그리기
    x = np.linspace(-4, 4, 100) # x축 범위 설정
    y = t.pdf(x, df) # y축 값 설정 (확률밀도함수 사용)
    plt.plot(x, y) # 그래프 그리기
    #임계영역 색칠하기 (상한값과 하한값 모두 색칠) - 양쪽
    x_fill1 = np.linspace(-4, lower_bound) # x축 임계영역 설정 (좌측)
    y_fill1 = t.pdf(x_fill1, df) # y축 임계영역 설정
    plt.fill_between(x_fill1, y_fill1) # 임계영역 색칠하기

 

    x_fill2 = np.linspace(upper_bound, 4) # x축 임계영역 설정 (우측)
    y_fill2 = t.pdf(x_fill2, df) # y축 임계영역 설정
    plt.fill_between(x_fill2, y_fill2) # 임계영역 색칠하기

 

    #검정 통계량 표시하기 (점으로 표시)
    plt.scatter(t_stat, 0) # 점으로 표시
    plt.annotate(f"t={t_stat}", (t_stat + 0.1 ,0)) # 점 옆에 값 표시

 

    # 축 이름 및 제목 설정하기
    plt.xlabel('t value')
    plt.ylabel('Probability density')
    plt.title('Two-tailed t-test')

 

    #그래프 보여주기
    plt.show()

양측검정 결과는 다음과 같이 출력됩니다.

검정통계량 1.5 일때 양측검정
검정통계량 1.5 일때 양측검정
검정통계량 1.9 일때 단측검정
검정통계량 1.9 일때 단측검정
검정통계량 2.4 일때 단측검정
검정통계량 2.4 일때 단측검정

여러모로 챗 gpt 도움을 많이 받네요.

댓글