파이썬 통계분석을 배웠다.
기록용
- 개념은 얼추 배웠으나 우선 빠르게 써먹어야 하니 방법만 적는다.
- 개념과 정의 등은 추후 작성한다.(링크던 뭐던)
참고
- Learning statistics with pyton
문제 01.
A와 B 두 그룹의 점수가 하나의 DataFrame으로 있다.
이 두 그룹의 평균 점수가 통계적으로 차이가 없는지 검증하려 한다.
1-1. A와 B 두 그룹의 정보를 수집한다.
DF.info()
DF.head()
DF.describe()
여러 정보를 확인, 판단
특히 데이터의 갯수를 판단한다.
1-2. 가설 설정
귀무가설 : 기존의 관념과 유사한 가설(ex. 전 세계 여자의 평균키는 남자의 평균 키보다 작다)
대립가설 : 반박(ex. 아니다. 같거나 보다 클 수 있다)
귀무가설이 채택되면 귀무가설 채택,
대립가설이 채택되면 귀무가설 기각
이라고 표현하는 것이 올바른 표현이나, 대부분 [대립가설 채택]이라고 표기함.
1-3. 정규성 검사
만약 1에서 데이터 갯수가 30개가 넘어가면 이 과정은 넘어간다.
이유) 중심극한정리에 의해 30개가 넘는 데이터는 정규성을 만족했다고 판단한다.
그런데! 가끔씩 30개가 넘어도 정규성 검사를 못넘는 데이터들이 존재한다.
이럴때는
1. 모수/ 비모수 통계 둘 다 계산한다.
2-1. 결과가 같다면 OK!
2-2. 결과가 다르다면....
1) 사수에게 묻는다.(최고)
2) 사수가 없다면 스스로 판단한다. 어떤 결과를 참이라고 말 할 것인가.
2-2) 결과를 선택했다면 그 근거는 무엇인가. 논리적인 근거인가?
2-3) 그렇다면 주변을 설득하자. 아니면 근거를 또 만들자.
만약 데이터의 갯수가 30 개 미만일 경우 정규성 검사를 실시하자.
import pingouin as pg
pg.normality(df, dv="원하는열", group='그룹할열')
from scipy.stats import shapiro
그룹1 = pd.DataFrame(df1.loc[df1['그룹열'] == '그룹1']['원하는열']).reset_index(drop=True)
그룹2 = pd.DataFrame(df1.loc[df1['그룹열'] == '그룹2']['원하는열']).reset_index(drop=True)
statistic_그룹1, p_value_그룹1 = shapiro(그룹1['원하는열'])
statistic_그룹2, p_value_그룹2 = shapiro(그룹2['원하는열'])
방법은 2가지.
pingouin 과 scipy 둘 중 하나를 적당히 사용하자.
P-Value 값을 유심히 확인하자.
1-4. 등분산성 검사
정규성 검사를 만족 했다면(P-Value >= 0.05), 혹은 갯수가 30개 이상이어서 괜찮다고 판단되면 이 단계임.
import pingouin as pg
pg.homoscedasticity(data = df, dv = '원하는열', group = '원하는그룹')
df.groupby('그룹열')['원하는열'].agg(['mean', 'std', 'count']).reset_index()
from scipy import stats
stats.levene(df.loc[df['그룹열'] == '그룹1', '원하는열'], df.loc[df['그룹열'] == '그룹2', '원하는열'])
여기서도 역시 P-Value 확인
P-Value >= 0.05 가 만족되면 다음 단계로, 안되면 다른 검정법을 사용하자.(이 부분은 공부중)
만약 만족했다면, 두 그룹의 분산은 유사함 => 등분산성을 만족했다는 뜻이다.
1-5. T-Test 진행 => T통계량, P-Value
등분산성을 만족했다면 T-Test를 진행하자.
from pingouin import ttest
ttest(그룹1['원하는열'], 그룹2['원하는열'], correction =False)
from scipy.stats import stats
t_score, p_value = stats.ttest_ind(df.loc[df['원하는그룹'] == '그룹1', '원하는열'],
df.loc[df['원하는그룹'] == '그룹2', '원하는열'],
equal_var = True)
t_score, p_value
두 개의 값을 확인하자.
- T_score(T통계) : -1.96 =< 귀무가설 =< +1.96
- P_value : 0.05 =< N
1-6. 결론내기
T-Test 를 통해 결론이 나왔을 것이다.
이를 확인하고 귀무가설을 채택 할것인지, 기각 할것인지 판단하자.
문제 02.
Dataframe 내부에 A 그룹의 원래 성적과 한 달 왕 공부 후 성적이 담겨있다.
왕 공부는 A 그룹의 평균에 긍정적 영향을 주었는가?
2-1. A와 B 두 그룹의 정보를 수집한다.
DF.info()
DF.head()
DF.describe()
여러 정보를 확인, 판단
2-2. 가설 설정
귀무가설 : 기존의 관념과 유사한 가설(ex. 왕 공부를 하면 당연히 성적이 좋아진다!)
대립가설 : 반박(ex. 아니다. 한달가지고 뭘하는거냐 / 그리고 왕공부 의미없다)
귀무가설이 채택되면 귀무가설 채택,
대립가설이 채택되면 귀무가설 기각
이라고 표현하는 것이 올바른 표현이나, 대부분 [대립가설 채택]이라고 표기함.
2-3. 데이터 가공하기 - 차이 정리
df2 = df.copy() #원본보존을 위한 카피
df2['추가열'] = df2['미래열'] - df2['과거열']
df2.describe()
추가 된 열의 데이터가 30개가 넘는지 확인한다.
2-4. 정규성 검사
만약 2-3에서 데이터 갯수가 30개가 넘어가면 이 과정은 넘어간다.
이유) 중심극한정리에 의해 30개가 넘는 데이터는 정규성을 만족했다고 판단한다.
어쩌구저쩌구 사담은 1-3을 참고하자.
만약 데이터의 갯수가 30 개 미만일 경우 정규성 검사를 실시하자.
import pingouin as pg
pg.normality(df2['추가한열'])
from scipy.stats import shapiro
print("정규성", shapiro(추가한열))
P-Value 값을 유심히 확인하자.
2-5. 대응표본 만들기: T-Test
이전엔 등분산 검사를 했다면, 이번엔 같은 그룹의 데이터 이기 때문에 대응표본을 만든다.
정규성 검사를 만족 했다면(P-Value >= 0.05), 혹은 갯수가 30개 이상이어서 괜찮다고 판단되면 이 단계임.
from pingouin import ttest
ttest(df2['미래열'], df2['과거열'], paired=True) #True는 대응표본 검정
from scipy.stats import stats
t_score, p_value = stats.ttest_rel(df['미래열'], df['과거열'])
print(t_score)
print(p_value)
- T_score(T통계) : -1.96 =< 귀무가설 =< +1.96
- P_value : 0.05 =< N
2-6. 결론내기
T-Test 를 통해 결론이 나왔을 것이다.
이를 확인하고 귀무가설을 채택 할것인지, 기각 할것인지 판단하자.
'Python' 카테고리의 다른 글
_Dataset의 구조와 이해 (0) | 2023.08.23 |
---|---|
VSCode, Git 가상환경 설정하기 (0) | 2023.07.25 |
pycharm 가상환경설정 및 django 설치 (0) | 2023.07.25 |