:: 기본 개념
*모집단과 표본
- 모집단 : 연구 대상이 되는 전체 집단
- 표본 : 모집단의 일부
*귀무가설과 대립가설
- 귀무가설(H0) : 기존에 알려진 사실, 효과나 차이가 없음
- 대립가설(H1) : 연구자가 입증 하려는 사실, 효과나 차이가 있음
*검정 결과
- 검정통계량: 주어진 데이터와 귀무가설 간의 차이를 통계적으로 나타내는 값
- p-value (유의수준 0.05) ⇒ 귀무가설을 지지하는 정도
- 유의수준보다 작으면 귀무가설을 기각하고, 대립가설을 채택한다.
- 유의수준보다 크면 귀무가설을 기각하지 못한다.(귀무가설 채택)
*가설검정 프로세스
- 통계적 가설 설정: 귀무가설과 대립가설
- 유의수준 결정: 예) 0.05
- 검정 통계량 및 p-value(유의확률) 계산
- 결과 도출 (해석)
:: 1. t-test (t검정)
1) 단일표본검정 | 모집단 1개 | 한 그룹 | 예) 과자 무게가 200g에서 달라졌는지 검정 |
2) 대응(쌍체) 표본검정 | 모집단 2개 (같은 집단) | 같은 그룹 | 예) 신약 효과 검정 (사전 / 사후 비교) |
3) 독립표본검정 | 모집단 2개 | 서로 다른 그룹 | 예) 1반과 2반의 성적 차이 검정 |
#단일표본검정
stats.ttest_1samp(칼럼명, 검증값, alternative)
1) 모집단에 대해 정규성 검정 : shapiro-wilk
2-1) 정규성 검정되지 않았을 경우 : wilconon 부호 순위 검정
2-2) 정규성 검정됐을 경우 : ttest_1samp
1) 모집단에 대해 정규성 검정 : shapiro-wilk
*샤피로윌크 검정을 진행할 때는 '대립가설'이 채택되기를 바라는 다른 검정방법과 달리 '귀무가설'이 채택되기를 바라야 함
(정규분포를 따라야 하기 때문에 p-value가 0.05보다 커야 함)
# 귀무가설 (H0): 주어진 데이터 샘플은 정규 분포를 따른다.
# 대립가설(H1): 주어진 데이터 샘플은 정규 분포를 따르지 않는다.
# Shapiro-Wilk(샤피로-윌크) 정규성 검정
from scipy import stats
stats.shapiro(df['무게'])
# p-value가 2.2139254318709334e-10이므로 0.05보다 매우 작음
# => 귀무가설을 기각하여 해당 데이터는 정규분포를 따르지 않음 (윌콕슨 부호 순위 검정 수행)
2-1) 정규성 검정되지 않았을 경우 : wilconon 부호 순위 검정
# 귀무가설 (H0): μ = μ0, "합격 원두(dark)" 상품의 평균 무게는 120g이다.
# 대립가설(H1): μ < μ0, "합격 원두(dark)" 상품의 평균 무게는 120g 보다 작다
# Wilcoxon(윌콕슨)의 부호 순위 검정 수행
stats.wilcoxon(df['무게']-120, alternative='less') # 관측값(실제값)이 더 작아야 하므로 'less'로 설정
# p-value 값이 유의수준 0.05보다 크므로 귀무가설 채택 => 합격원두 상품의 평균 무게는 120g이다.
2-2) 정규성 검정됐을 경우 : ttest_1samp
# 귀무가설: μ = μ0, "합격 원두(dark)" 상품의 평균 무게는 120g이다.
# 대립가설: μ ≠ μ0, "합격 원두(dark)" 상품의 평균 무게는 120g 아니다.
from scipy import stats
print(stats.ttest_1samp(df['무게'], 120))
# TtestResult(statistic=2.153709967150663, pvalue=0.03970987897788578, df=29)
# p-value값이 유의수준(0.05)보다 작으므로 귀무가설 기각 => 합격 원두 상품의 무게는 120g이 아니다.
#대응표본검정
: 같은 집단의 전/후 비교
stats.ttest_rel(첫번째 칼럼, 두번째 칼럼, alternative)
1) 모집단에 대해 정규성 검정 : shapiro-wilk
2-1) 정규성 검정되지 않았을 경우 : wilconon 부호 순위 검정
2-2) 정규성 검정됐을 경우 : ttest_rel
'''
μd = (before – after)의 평균
⇒ after의 효과가 커야 μd가 음수가 되며 귀무가설 기각 (= 효과가 있다)
귀무가설: μd ≥ 0, 새로운 교육 프로그램은 효과가 없다.
대립가설: μd < 0, 새로운 교육 프로그램은 효과가 있다.
'''
1) 모집단에 대해 정규성 검정 : shapiro-wilk
→ 전, 후 차이를 비교한 값으로 정규성 검정
'''
μd = (before - after)의 평균
귀무가설: μd ≤ 0
대립가설: μd > 0
'''
df['diff'] = df['before'] - df['after'] # 순서가 바뀌어도 결과는 동일
from scipy import stats
stats.shapiro(df['diff'])
# 0.05보다 작으므로 귀무가설(정규분포를 따른다)을 기각 = 정규분포를 따르지 않음)
2-1) 정규성 검정되지 않았을 경우 : wilconon 부호 순위 검정
# 방법1
stats.wilcoxon(df['before'], df['after'], alternative='greater') # 순서 동일하게 맞춤
# 방법2
stats.wilcoxon(df['diff'], alternative='greater') # 동일한 결과 출력
2-2) 정규성 검정됐을 경우 : ttest_rel
from scipy import stats
stats.ttest_rel(df['before'], df['after'], alternative='less')
# μd = (before – after)이므로 순서에 맞춰서 'before'자리와 'after'자리에 넣어주기
# alternative 속성은 대립가설 채택을 위해 μd가 음수가 나오기 위해선 첫번째 파라미터가 '작아야'하기 때문에 이를 기준으로 'less'로 선택
# TtestResult(statistic=-2.119860886666164, pvalue=0.03152591671694539, df=9)
# 해석 : 유의수준 0.05보다 작으므로 귀무가설 기각하고 대립가설 채택 = 새로운 교육 프로그램은 효과가 있다.
#독립표본검정
: 정규성 검정뿐 아니라 등분산 검정 과정까지 있음
→ 집단 중 하나라도 정규성 없을 경우 비모수 검정 실시
stats.ttest_ind(처리집단:특정 처리를 한 집단, 대조집단:아무것도 적용하지 않은 집단)
1) 모집단에 대해 정규성 검정 : shapiro-wilk
2-1) 정규성 검정되지 않았을 경우 : mann-whitney u 검정
2-2) 정규성 검정됐을 경우 : 등분산 검정
3-1) 등분산 검정됐을 경우 : ttest_ind
3-2) 등분산 검정되지 않았을 경우 : ttest_ind 검정에 equal_var=False 속성 추가
1) 모집단에 대해 정규성 검정 : shapiro-wilk
# 두 그룹 정규성 각각 검정
print(stats.shapiro(A), stats.shapiro(B))
2-1) 정규성 검정되지 않았을 경우 : mann-whitney u 검정
stats.mannwhitneyu(A, B, alternative='less')
2-2) 정규성 검정됐을 경우 : 등분산 검정
# 귀무가설 : 분산이 동일하다
# 정규성 검정과 동일하게 귀무가설이 채택되어야 등분산성이 가정됨
stats.levene(A, B)
3-1) 등분산 검정됐을 경우 : ttest_ind
'''
귀무가설(H0): 그룹별 시험 평균 점수는 차이가 없다. (μ1 = μ2)
대립가설(H1): B그룹 시험 평균 점수가 더 높다. (μ1 < μ2)
'''
from scipy import stats
stats.ttest_ind(A, B, alternative='less')
# 대립가설 기준으로 봤을 때 첫번째 파라미터인 'A'가 더 작아야 함 = less
3-2) 등분산 검정되지 않았을 경우 : ttest_ind 검정에 equal_var=False 속성 추가
stats.ttest_ind(A, B, equal_var=False, alternative='less')
:: 2. 범주형 데이터 분석 (카이제곱 검정)
#적합도 검정
- 관찰도수와 기대도수의 차이
- 빈도(count)로 변경 (관찰값, 기대값)
scipy.stats.chisquare(observed, expected)
- observed: 관찰된 빈도 리스트
- expected: 기대 빈도 리스트
#독립성 검정
- 두 변수가 서로 독립적인지(연관성이 있는지) 확인
- 교차표 테이블로 만들기
- 문제에서 표로 주어졌을 때 → 표를 데이터프레임으로 직접 구성
- 로우(원) 데이터가 주어졌을 때 → 데이터를 교차표 형태로 재구성 (pd.crosstab)
scipy.stats.chi2_contingency(table, correction=True)
- table: 교차표
- correction: 연속성 보정 (기본값 True, 연속성 보정하지 말라는 언급이 있으면 False)
#동질성 검정
- 두 개 이상의 집단에서 동질성을 갖는지 확인
- 검정 절차는 독립성과 같음 (동일 코드 사용)
:: 3. 회귀분석
#상관관계
: 두 변수 간의 선형적인 관계
상관계수
두 변수 간의 선형 관계의 강도와 방향 (-1 ≤ r ≤ 1)
r = 1: 강한 양의 선형관계
r = 0: 선형 관계 없음
r = -1: 강한 음의 선형관계
- df.corr() #피어슨 (기본값)
- df.corr(method='spearman') #스피어맨
- df.corr(method='kendall') #켄달타우
상관계수에 대한 t검정
귀무가설: 두 변수 간에 상관관계가 없다.
대립가설: 두 변수 간에 상관관계가 있다.
- stats.pearsonr(x, y) #피어슨
- stats.spearmanr(x, y) # 스피어맨
- stats.kendalltau(x, y) # 켄달타우
#회귀분석
1. 단순 선형 회귀 분석
- OLS: 최소제곱법(Ordinary Least Squares)
- ols(’종속변수 ~ 독립변수’, data=df).fit()
- model.summary() # 회귀 모델 통계적 요약
# 키: 종속변수
# 몸무게: 독립변수
from statsmodels.formula.api import ols
model = ols('키 ~ 몸무게', data=df).fit()
print(model.summary()) # 최소제곱법 결과표 출력
# 결정계수
model.rsquared
# 기울기
model.params['몸무게']
# 절편
model.params['Intercept']
# p-value
model.pvalues['몸무게']
- model.predict() #예측값
# 몸무게가 50 일때 예측키
newdata = pd.DataFrame({'몸무게':[50]}) # 데이터프레임화 시켜야함
model.predict(newdata)
- model.get_prediction() #예측값과 예측값에 대한 신뢰구간, 예측구간
# 몸무게가 50일 때 예측키에 대한 신뢰구간, 예측구간
newdata = pd.DataFrame({'몸무게':[50]})
pred = model.get_prediction(newdata)
pred.summary_frame(alpha=0.05) # 95%
# 신뢰구간: 155.695318 165.323136
# 예측구간: 146.068566 174.949888
- df['잔차'] = df['종속변수'] - model.predict(df)
#잔차 = 관측(실제)값 - 예측값
df['잔차'] = df['키'] - model.predict(df['몸무게'])
# 잔차를 활용해 MSE 구하기 (사이킷런 패키지에서 사용하는 것도 가능)
(df['잔차'] ** 2).mean()
2. 다중 선형 회귀 분석
- ols(’종속변수 ~ 독립변수1 + 독립변수2’, data=df).fit()
# 잔차 구하는 메서드
model.resid
# 광고비, 플랫폼 회귀계수의 95% 신뢰구간
model.conf_int(alpha=0.05)
# 광고비 50, 플랫폼 20일 때 매출액에 대한 95% 신뢰구간과 예측구간
newdata = pd.DataFrame({
'광고비':[50],
'플랫폼':[20]
})
pred = model.get_prediction(newdata)
pred.summary_frame(alpha=0.05)
# 신뢰구간 268.612221 352.52844
# 예측구간 179.700104 441.440556
# 시험환경에서는 컬럼을 모두 보기 위해서 pd.set_option('display.max_columns', None) 설정이 필요함
*범주형 변수가 존재할 경우
- ols를 사용할 땐 독립변수에 범주형 칼럼을 넣어도 자동으로 처리됨
- 판다스의 pd.get_dummies(drop_first=True)로 원핫인코딩 처리
- 원핫인코딩 진행 후 인코딩된 칼럼 중 첫번째를 지워도 구별됨
:: 4. 분산분석 (ANOVA)
#일원 분산 분석 (One-way ANOVA)
ㄴ 하나의 요인(독립변수)에 따라 평균의 차이 검정
- 3개 이상의 집단 간의 평균의 차이가 통계적으로 유의한지 검정
- 요인이 하나이고(집단을 나누는 기준이 1개), 집단의 수가 3개 이상일 때 사용
1. scipy 패키지
> f_oneway(sample1, sample2, ...)
2. statsmodels 패키지
> model = ols('종속변수 ~ 요인', data=df).fit()
> anova_lm(model)
1) 모집단에 대해 정규성 검정 : shapiro-wilk
2-1) 정규성 검정되지 않았을 경우 : kruskal-wallis 검정
2-2) 정규성 검정됐을 경우 : 등분산 검정
3) 일원 분산 분석 : f_oneway
4) 사후검정 : 투키(tukey), 본페로니(bonferroni)
1) 모집단에 대해 정규성 검정 : shapiro-wilk
# 정규성, 등분산, 일원 분산 분석 모두 시행해야 할 경우
# 집단별로 각각 실행해야 함
print(stats.shapiro(df['A']))
print(stats.shapiro(df['B']))
print(stats.shapiro(df['C']))
print(stats.shapiro(df['D']))
# 정규분포를 따르는 점 확인
2-1) 정규성 검정되지 않았을 경우 : kruskal-wallis 검정
#한 그룹이라도 정규성을 만족하지 못했을 경우 실행
stats.kruskal(df['A'], df['B'], df['C'], df['D'])
2-2) 정규성 검정됐을 경우 : 등분산 검정
# 집단 모두 넣어서 집단별 등분산성 검정
print(stats.levene(df['A'], df['B'], df['C'], df['D']))
# 등분산 확인
3) 일원 분산 분석 : f_oneway
print(stats.f_oneway(df['A'], df['B'], df['C'], df['D']))
4) 사후검정 : 투키(tukey), 본페로니(bonferroni)
from scipy import stats
from statsmodels.stats.multicomp import pairwise_tukeyhsd, MultiComparison
# Tukey HSD (투키)
tukey_result = pairwise_tukeyhsd(df_melt['value'], df_melt['variable'], alpha=0.05)
print(tukey_result.summary())
# Bonferroni(본페로니)
mc = MultiComparison(df_melt['value'], df_melt['variable'])
bon_result = mc.allpairtest(stats.ttest_ind, method='bonf')
print(bon_result[0])
#이원 분산 분석 (Two-way ANOVA)
ㄴ 두 개의 요인에 따라 평균의 차이 검정
- 3개 이상의 집단 간의 평균의 차이가 통계적으로 유의한지 검정
- 요인의 수가 2개, 집단의 수가 3개 이상일 때 사용
*귀무가설과 대립가설 ⇒ 요인별로 가설 확인
- 주 효과(요인1)
- 귀무가설: 모든 그룹의 첫 번째 요인의 평균은 동일하다.
- 대립가설: 적어도 두 그룹은 첫 번째 요인의 평균은 다르다.
- 주 효과(요인2)
- 귀무가설: 모든 그룹의 두 번째 요인의 평균은 동일하다.
- 대립가설: 적어도 두 그룹은 두 번째 요인의 평균은 다르다.
- 상호작용효과
- 귀무가설: 두 요인의 그룹 간에 상호작용은 없다.
- 대립가설: 두 요인의 그룹 간에 상호작용이 있다.
model = ols('종속변수 ~ C(요인1) * C(요인2)', data=df).fit()
anova_lm(model)
1) 모집단에 대해 정규성 검정 : shapiro-wilk
2) 등분산 검정
3) 이원 분산 분석
4) 사후검정 : 투키(tukey), 본페로니(bonferroni)
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
model = ols('토마토수 ~ C(종자) + C(비료) + C(종자):C(비료)', data=df).fit()
# 상호작용 검증을 위해 독립변수에 대해 '종자:비료'값도 추가해서 확인 (+가 아니라 *로 표현하면 굳이 안 써도 됨)
# 범주형 변수인 모든 독립변수를 C()로 감쌈
anova_lm(model)
*해당 내용은 인프런 '퇴근후딴짓' 강의 수강 및 개인공부를 통해 개별적으로 정리한 내용입니다.
'Study' 카테고리의 다른 글
[자격증] 빅데이터분석기사 실기 요약정리(작업형2) (0) | 2024.07.18 |
---|---|
[자격증] 빅데이터분석기사 실기 요약정리(작업형1) (0) | 2024.07.07 |
[자격증] 빅데이터분석기사 8회 실기 합격 후기 | 준비기간, 퇴근후딴짓 강의, 꿀팁 (0) | 2024.07.02 |
[자격증] (✨요약정리 공유) 빅데이터분석기사 8회 필기 합격 후기 | 비전공자 공부방법, 준비기간 (14) | 2024.06.29 |