본문 바로가기

자격증/빅분기 실기

[작업형 3유형] 공식 예제 풀어보기 / 쌍체표본 t-검정 / 참고 사이트

안녕하세요 갓생도전입니다

아침 열시에 자고 두시에 일어나 카페 와서 글 쓰는 내 인생 ㄹㅈㄷ,, 

 

암튼 맘이 급하니까 사족 패스하고 오늘은 신유형을 익혀보는 시간입니다

통계 공부 안 한지 넘 오래돼서 걱정이 큽니다만 은혜로우신 퇴근후딴짓님의 유튭 풀이를 보며 따라해보겠어요

 

참고 영상은 아래!

https://youtu.be/xyqjl4DwVyQ

영상을 보고나니 확실히 R이 통계에 있어서는 직관적이긴 하더라구요 라이브러리 설치할 필요도 없고.. 그치만 헷갈리니까 줏대있게 Python3으로 갑니다 흑흑

와 실수로 이거 창 꺼버렸는데 자동저장 되어서 넘 다행 헥헥

 

먼저 문제 내용을 살펴볼까요?


제3유형(풀이용, 제출없음)

주어진 데이터(data/blood_pressure.csv)에는 고혈압 환자 120명의 치료 전후의 혈압이 저장되어 있다. 해당 치료가 효과가 있는지 (즉, 치료 후의 혈압이 감소했는지쌍체표본 t-검정(paired t-test)을 통해 답하고자 한다. 가설은 아래와 같다.
1. mu의 표본평균을 입력하시오. (반올림하여 소수 둘째자리까지 계산)
2. 위의 가설을 검정하기 위한 검정통계량을 입력하시오. (반올림하여 소수 넷째자리까지 계산)
3. 위의 통계량에 대한 p-값을 구하여 입력하시오.(반올림하여 소수 넷째자리까지 계산)
4. 유의수준 0.05 하에서 가설검정의 결과를 (채택 / 기각) 중 하나를 선택하여 입력하시오.

ㅎ... 네 뭐 바라는게 많네요

 

뭐 df.head()를 사용해도 되겠지만 아무래도 테이블이 주어져 있으니까요 클릭 한 번으로 어떤 데이터가 있는지 살펴보기로 하겠습니다.

환자의 성별, 나이대 그리고 치료 전 혈압과 치료 후 혈압을 담은 데이터프레임이네요!

 

해당 문제에서는 살펴봐야 할 표본이 두 개네요. 다시 말하면? 

bp_before(치료 전 혈압)와 bp_after(치료 후 혈압)이 쌍을 이루고 있다는 것이죠

 

어떤 기법을 사용해야할지 감이 안 잡히는 저를 위해 문제에서 친절하게 쌍체표본 t-검정을 사용하라고 알려주네용

 

1. mu의 표본평균을 입력하시오. (반올림하여 소수 둘째자리까지 계산)

1번은 pandas를 사용해도 되고 numpy를 사용해도 되더라구용(np가 더 깔끔한 것 같긴해요)

핵심은 round와 mean이겠네요

이 때 주의할 점은 치료가 효과적이었는지를 판단하는 것이기 때문에 사후(bp_after)에서 사전(bp_before)을 뺀 것들의 평균을 구해야한다는 것입니다. 순서를 헷갈리면 양수 음수가 바뀌어 오답 처리가 되니 꼭 잘 생각해야겠어요

# 출력을 원할 경우 print() 함수 활용
# 예시) print(df.head())

# getcwd(), chdir() 등 작업 폴더 설정 불필요
# 파일 경로 상 내부 드라이브 경로(C: 등) 접근 불가

import pandas as pd

a = pd.read_csv('data/blood_pressure.csv', index_col=0)

# 1-1. pd 사용
a['result'] = a.bp_after - a.bp_before
print('--표본평균--')
print(round(a['result'].mean(),2))

# 1-2. np 사용
import numpy as np
print(round(np.mean(a.bp_after - a.bp_before),2))

 

2. 위의 가설을 검정하기 위한 검정통계량을 입력하시오. (반올림하여 소수 넷째자리까지 계산)

3. 위의 통계량에 대한 p-값을 구하여 입력하시오.(반올림하여 소수 넷째자리까지 계산)

2,3번 문제는 scipy 라이브러리를 통해 한 번에 구할 수 있으므로 같이 적어보도록 할게요

 

* 더 깔끔한 코딩이 있어 데이터 전문가 포럼 운영진께서 정리해주신 게시물을 참고했습니다.

링크를 첨부하니 같이 확인하시면 좋을 것 같아요!

https://cafe.naver.com/sqlpd/52645

from scipy.stats import ttest_rel #쌍체표본이므로 ttest_rel // 독립이면 ttest_ind

s, p = ttest_rel(a.bp_after, a.bp_before, alternative='less')

#검정통계량
print(round(s,4))

#p-value
print(round(p,4))

저는 alternative가 처음에 헷갈렸는데 그냥 대립가설이라 생각하니 쉽더라구요 

문제로 예시를 들자면 bp_after가 bp_before보다 작아야 치료가 유의미하다고 할 수 있습니다.

즉, alternative='less'가 되겠네요!

alternative의 디폴트는 'two sided', 크던 작던 차이가 있으면 됩니다

'greater'는 'less'의 반대라고 생각하시면 쉽겠죵

4. 유의수준 0.05 하에서 가설검정의 결과를 (채택 / 기각) 중 하나를 선택하여 입력하시오.

저는 이 부분이 제일 헷갈려 다시 서칭을 하며 공부했어요,,, 하하

 

가설검정은 일반적으로 귀무가설을 기준으로 합니다.

위에서 구한 p-value가 유의수준을 넘어가지 않으면 귀무가설을 기각(즉 대립가설이 채택됨), 유의수준을 넘어가면 귀무가설을 채택(대립가설 기각)하는 것입니닷

 

즉 3번의 값이 유의수준보다 작으므로 귀무가설을 기각하게 되겠네요!


대뜸 겁부터 집어먹었는데 사이파이 쓰는 법만 익히면 생각보다 문제풀이용 레벨까지는 금방 도달할 것 같아요. 물론 통계적 지식을 같이 익히는게 베스트겠지만 저는 시간이 얼마 없으므로 문제풀이용 통계 패키지에 집중하도록 하겠습니다

 

만약 시간이 충분하시다면 기본 개념을 충분히 익히시고 코딩하시길 추천드려요

 

흐아아 개인적으로는 ML 넘 귀찮으니까 작업형 1,3 올인하고 2 포기하면,,,,,,ㅎㅋㅎㅋ 턱걸이합격 가능한데,,,라는 생각이 들었는데!!!!! ㅜ ㅜ ㅜㅜ ㅜ ㅜ ㅜ 제가 다 맞을거란 보장이 없으니 2도 열심히 해야겠어요 

 

2는 따로 정리하는 게시글은 없을 것 같아요 아마 캐글에서 연습할 듯 합니다. 에휴휴 

여러분 모두 화이팅이에욧,, 그리고 제가 제일 화이팅!!!!!!!!!!! 푸히히