본문 바로가기
  • 가제가재_기록블로그
Python

파이썬 통계분석_TIL(scipy , pingouin)

by 가제가재 2023. 8. 14.

파이썬 통계분석을 배웠다.

 

기록용

- 개념은 얼추 배웠으나 우선 빠르게 써먹어야 하니 방법만 적는다.

- 개념과 정의 등은 추후 작성한다.(링크던 뭐던)

 

참고

- Learning statistics with pyton

- Pingouin Documentation

- Scipy Documentation


문제 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