빅데이터분석기사

빅분기 실기 작업형3 정리

_jju 2026. 6. 18. 19:30

1. 가설검정

1-1. 단일표본검정

한개의 집단이 있고 그 집단의 평균값이 특정값이랑 얼마나 비슷한지를 추정하는것

from scipy.stats import ttest_1samp(표본데이터, 특정값, alternative=)

alternative 옵션의 안에는 'greater', 'less', 'two-sided'가 들어갈 수 있다.

 

stats에 있는 shapiro() 함수로 정규성을 검사할 수 있다. 

shapiro(표본데이터) 이 값의 pvalue를 보고 판정, 만약 pvalue가 0.05보다 작다면 정규성을 만족하지 않는 것.

 

표본집단이 정규성을 만족하지 않는다면 윌콕슨검정을 쓰자.

마찬가지 stats에 있고 wilcoxon(표본데이터 - 특정값, alternative=) 넣고 돌리면 된다.

 

1-2. 대응표본검정

한개의 모집단에서 전, 후 차이의 유의미함을 추정하는 것

from scipy.stats import ttest_rel(전, 후, alternative=)

 

여기서 전, 후, alternative 방향성이 헷갈리는데

후가 전보다 작아졌다. -> 전>후 -> ttest_rel(큰거, 작은거, alternative='greater') -> ttest_rel(전, 후, alternative='greater')

후가 전보다 커졌다. -> 후>전 -> ttest_rel(후, 전, alternative='greater')

앞에서 뒤에꺼 뺀게 양수면 greater, 음수면 less

 

대응표본검정도 마찬가지 shapiro()로 정규성 검정을 해주는데

shapiro(전 - 후) 이렇게 두 데이터를 넣어주어야 한다. 전, 후 순서는 상관 없다. (검정하는 대상이 둘의 차이니까)

 

역시 이 경우에도 정규성을 만족하지 않으면 wilcoxon에 때려넣는다. 다만 대응표본검정의 경우

wilcoxon(전, 후, alternative=) 이런식으로 쉼표로 두 집단을 구분해서 때려넣어야한다. (- 써도되지만 그럼 아까 외웠던 방향성이 달라져서 따로 외워줘야하기에... 그냥 쉼표로 외우자.)

 

1-3. 독립표본검정

마찬가지 stats의 ttest_ind를 쓰면 된다. ttest_ind(A, B, alternative=)

아까 말한 전, 후, alternative 방향성과 똑같이 작동한다.

ex) a반이 b반보다 크다. ttest_ind(A, B, alternative='greater')

 

앞서본 단일표본, 대응표본검정은 정규성 만족만 봤다면, 독립표본검정은 정규성과 등분산성 이 두개를 봐야한다. 

정규성만족은 shapiro(A), shapiro(B)를 보면 되고

등분산검정은 levene(A, B) 이라는 함수를 사용하면 된다. pvalue가 0.05 이하면 등분산이 아니다.

 

먼저 등분산이 아닌 경우부터 보자. 등분산이 아닌건 그냥 ttest_ind에 equal_var=False라는 옵션을 더해주면 된다.

ttest_ind(A, B, alternative=, equal_var=False)

 

그리고 정규성을 만족하지 않는다면, manwhitneyu() 만 휘트니 유 검정을 써야한다. 마찬가지 stats에 있고 인자들은 ttest_ind와 동일하다. 

 

2. 범주형데이터분석

2-1. 적합도 검정

조사한 데이터가 원래 알려진 확률분포에 잘 적합하는가?를 판별하는 녀석

기출6회 작업형3에 잘 정리되어있기에 문풀프로세스만 정리하자면

 

1. 로우데이터로 주어졌다면 일단 각 범주가 몇개씩 나왔는지 value_counts()함수를 이용해서 세어줘야 한다.

그리고 index순서대로 정렬해야 원래 알려진 확률분포 데이터랑 순서가 맞을테니

df.value_counts().sort_index()

 

2. 원래 알려진 확률분포 데이터로부터 기대빈도를 계산한다. 

별거없다. 조사한 데이터의 개수 X 원래 알려진 확률분포(퍼센트) 곱해주면 된다.

expected = [total * percent for percent in origin]

 

3. chisquare(f_obs=, f_exp=) 함수에 넣어준다!

chisquare(f_obs= , f_exp=) 각각 조사한 데이터, 기대빈도 데이터를 넣어주면 된다.

 

2-2. 독립성/동질성 검정

독립성/동질성 검정은 두 변수간 영향이 있는지 없는지를 보는건데 정확히는

독립성 검정: 두 변수 서로 독립?

동질성 검정: 두 집단에서 두 변수의 분포 서로 같음? 

이거다. 사실 같은 방법으로 풀면 되기에 문제에서 두 변수가 어쩌고~ 하면 무조건 독립/동질성 검정이다.

 

아까 적합도 검정에서는 chisquare()함수를 썼지만 독립성, 동질성 검정에서는 chi2_contingency()를 써야한다. 

이 chi2_contingency() 함수는 어떤 2차원 테이블을 넣었을 때 행과 열의 독립성을 검정해준다. 

마찬가지 stats에 있고 chi2_contingency(table)

 

이 문제에서는 table을 바로 주지 않고 로우데이터로 주는 경우가 있는데, 우리가 직접 2차원 테이블을 만들어서 써야한다. 

 

동질성 검사의 경우, 두 집단에서 변수의 분포가 서로 같은지를 물어볼텐데

집단 종류를 행으로, 변수를 열으로 해서 2차원 리스트형태로 테이블을 직접 만들어줘야 한다.

suwon = ['a', 'a', 'b', 'a', 'b']
busan = ['b', 'b', 'a', 'b', 'a']

# 각 집단에서 a와 b의 빈도수를 직접 세어서 2차원 리스트로
# [[수원의 a개수, 수원의 b개수], [부산의 a개수, 부산의 b개수]]
table = [
    [suwon.count('a'), suwon.count('b')],  # 수원 행
    [busan.count('a'), busan.count('b')]   # 부산 행
]

 

반면 독립성 검사의 경우 한 집단에서 두 변수 간 독립성을 묻기에

region = ['수원', '수원', '수원', '수원', '수원', '부산', '부산', '부산', '부산', '부산']
product = ['a', 'a', 'b', 'a', 'b', 'b', 'b', 'a', 'b', 'a']

# 변환 없이 바로 crosstab에 넣기
table = pd.crosstab(region, product)

pd.crosstab()함수에 두 변수를 때려박아주면 알아서 테이블로 변환해준다. 판다스에 있다는 것을 꼭 기억할 것.

 

두 경우 모두 테이블로 만들고 내가 생각하던 모양으로 테이블이 만들어졌는지 확인해보고 chi2_contingency() 돌리자!

 

3. 회귀분석

3-1. 상관관계, 상관계수

df.corr() 으로 모든 변수들간 상관계수를 볼 수 있다.

만약 키에 대한 몸무게의 상관변수를 알고 싶으면 df['키'].corr(df['몸무게']) 하면 된다. 

 

그리고 문제에서 피어슨 상관계수를 구하라, 켄달타우 상관계수를 구하라 하는데 그런 경우에는 corr의 옵션으로 methoc='spearman', method='kendall' 을 넣어줄 수도 있지만

상관계수를 구하고 pvalue까지 구하는 경우가 많기에 아래 세 녀석을 꼭 외워줘야한다.

마찬가지 scipy.stats 모듈에 있으며

pearsonr(df키, df몸무게)

spearmanr(df키, df몸무게)

kendalltau(df키, df몸무게)

특히 피어슨이랑 스피어만의 경우 맨 뒤에 r이 붙어있다는 것을 명심하자. 이 세 함수는 상관계수뿐 아니라 pvalue까지 준다. 

 

3-2. 선형회귀분석

최소제곱법으로 회귀: ols

로지스틱회귀: logit

이 두개만 나오는 것 같다. 

 

from statsmodels.formula.api import logit, ols

이 두개 중 문제에서 말한 것을 이용해

model = logit('Y~X1+X2', data=df).fit()

하면 된다. 이건 너무 많이 해서 더 볼 필요도 없다.

 

+ 선형회귀분석해야하는데 만약 범주형변수가 있더라도 상관없다. statsmodels 내부에서 알아서 인코딩됨

 

3-3. 문제에서 묻는 것

MSE, RMSE, 신뢰구간, 예측구간, 회귀계수, 모델의 pvalue 등을 묻거나 또는 새로운 데이터를 주고 적합한 모델으로 예측해보라고 한다.

 

꼭 새로운 데이터를 안줘도 원래 데이터들을 가지고 y값을 예측하고 실제 y값과의 mse를 예측하라고 하기도 한다.

예측하는건 너무 당연히 pred = model.predict(df) 이고

MSE는 model.squared 또는

from sklearn.metrics import mean_squared_error 으로 구할 수 있고

RMSE는 model.rsquared 또는
from sklearn.metrics import root_mean_squared_error 으로 구할 수 있다.

답지가 항상 먼저, 그다음 예측데이터를 인자로 넘긴다는 점에 유의해야한다. 

 

신뢰구간 예측구간

 

pred = model.get_prediction(data)
pred.summary_frame(alpha=0.05)

이 두개를 못외우면 그냥 틀려야 하는 문제다. 제발 외워...

 

순서대로 mean이 예측값, 신뢰구간 하한 상한, 예측구간 하한 상한

회귀계수, 모델의 pvalue등도 있는데 이건 

model.summary

model.params

model.pvalue 

이 세 함수를 외워두자. 

 

4. 분산분석

3개 이상의 집단의 평균을 비교할 때 쓴다.

 

4-1. 일원분산분석

평균에 영향을 주는 원인이 딱 1개일때, 3개이상의 집단에 대해서 

ex) 치킨브랜드에 따라 치킨만족도에 차이가 있는가?

 

from scipy.stats import f_oneway

f_oneway(A, B, C)

이렇게 f_oneway() 함수를 쓰면 가장 편하고

 

from statsmodels.stats.anova import anova_lm

# 참고로 치킨브랜드는 한컬럼이지만 내부적으로 인코딩돼서 여러 변수가 될 것

# 범주형변수인데 숫자라면 C(치킨브랜드) 로 적어줘서 범주형변수임을 알려줄 것

model = ols('치킨만족도~치킨브랜드', data=df).fit()

anova_table = anova_lm(model) 하는 방법도 있다. 두가지 다 알아놓기.

 

4-2. 이원분산분석

평균에 영향을 주는 요인이 2개일때, 3개이상의 집단에 대해서

ex) 치킨브랜드와 성별에 따라 치킨만족도에 차이가 있는가?

 

아까는 싸이파이 stats의 f_oneway써서 쉽게 했다면 이번엔 어떤 요인인지 적어줘야 하니까 ols 밖에 못쓴다.

그리고 치킨브랜드와 성별의 상호작용효과도 이번엔 고려해야한다. 그래서 꼭 + 대신 *를 적어줘야 한다. 그냥 외우자.

 

4-3. 사후검정

아까 anova검정했을 때 pvalue가 0.05보다 작게 나왔을 때, 어떤 집단의 평균이 다른건지 알아내는 검정

ex) 치킨브랜드에 따라 치킨만족도 차이가 있다고 나왔을 때, 굽네가 BBQ보다 선호도가 높은건지, 굽네가 BHC보다 선호도가 높은건지 알아내는 검정

 

투키랑 본페로니를 외워야한다.

1. 투키

from statsmodels.stats.multicomp import pairwise_tukeyhsd, MultiComparison

tukey_result = pairwise_tukeyhsd(결과컬럼, 원인컬럼, alpha=)

 

2. 본페로니 

mc = MultiComparison(결과컬럼, 원인컬럼)

bon_result = mc.allpairtest(stats.ttest_ind, method = 'bonf')

 

여기 결과컬럼 원인컬럼으로 쓴 것은 df를 melt()해서 세로로 길게 만들어서 넣어줘야 한다.

교촌 굽네 네네 처갓집
       
       

뭐 이런식이였다면

df.melt()를 해서 

variable value
교촌  
굽네   
네네  
처갓집  
네네  
처갓집  
교촌  

이런식으로 만들어주고 원인컬럼 df['variable'] 결과컬럼 df['value'] 넣어주는 것

 

4-4. 이제 진짜 마지막으로 분산분석에서 정규성과 등분산성이 지켜지지 않았다면(샤피로, 레닌 해봤겠지)

kruskal() 에 때려넣으면 된다. 모든 검정들은 거의 scipy.stats에 있고 이녀석도 마찬가지이다. 

stats.kruskal(df['A'], df['B'] , df['C']) 

'빅데이터분석기사' 카테고리의 다른 글

기출풀이  (0) 2026.06.18
작업형3 추가적으로  (0) 2026.06.14
작업형2 문풀  (0) 2026.06.14
작업형 제1유형 헷갈리는 내용 정리  (0) 2026.06.10
빅분기 실기 작업형2 정리  (0) 2026.05.17