본문 바로가기
career/자격증

빅데이터분석기사 실기 3유형 : 시험에 뭐가 나올까? 내가 보려고 정리한 요약집

by 고기만두(개발자) 2024. 6. 16. 16:35
728x90
반응형

빅분기 실기 3유형

6회차 시험에 처음 생긴 유형이라,아직 기출문제가 2개 회차밖에 없음

가설검정과 통계 분석에 대해 다루지만, 내용이 워낙 많은 거에 비해

문제수는 대문항 2개 * 대문항 1개당 소문항 3개 = 6개밖에 없음.

부분점수도 없어서 알면 1분 컷이지만 걍 모르면 틀려야 하는 문제.

템플릿이 있는 2유형에서 40점을 따고, 1유형도 큰 실수를 하지 않는다면 30점이 나와야 한다.

과락이 없는 시험이라 이만큼만 해도 합격이긴 하지만

그래도 혹시나 변수가 발생할 경우에 대비하여, 보험 약 10점 ~ 15점 정도 필요하다고 가정.

그래서 아예 0점으로 던지고 갈 수는 없는 파트.

어떤 패키지의 어떤 함수 불러와야 하는지, 그걸 어떻게 써먹어야 하는지 정확하게 외워야 함.

(물론 help/dir을 사용할 수 있고 전략적으로 사용 예정인 부분도 있지만 (ex.2과목 평가지표),

뭐가 어느 패키지에 있는지조차 모르면 구제받을 방법도 없다. )

728x90

1. 상관관계분석
df.corr() -> 판다스 기본 기능. 두 요소가 만나는 곳 값 찍어서 제출

기본적으로 pearson상관계수를 보여주지만, method설정에 따라 kendall / spearman 상관계수도 볼 수 있음.


2. 정규성검정

from scipy import stats
stats.shapiro(data)


*소숫점 조정 : 초장에 set_option으로 설정하기, 출력시 조정 필요한 경우 format함수 사용하여 소숫점 조정하기.

pd.set_option('display.float_format', lambda x: f'{x:.6f}') 
format(x, '.6f')



3. 일원배치법/일원분산분석
1)집단 데이터 행렬만 나오는 경우 

from scipy import stats
stats.f_oneway(집단1,집단2, ... , 집단n) # f값, p값



2)집단 하나로 합치기 신공이 필요한 경우 (근데 굳이 그래야할까?)

import pandas as pd
groupA = [85, 92, 78, 88, 83, 90, 76, 84, 92, 87]
groupB = [79, 69, 84, 78, 79, 83, 79, 81, 86, 88]
groupC = [75, 68, 74, 65, 77, 72, 70, 73, 78, 75]
#데이터 합치기
data = {'GroupA': groupA, 'GroupB': groupB, 'GroupC': groupC}
df_wide = pd.DataFrame(data)
#멜트 
df_long = df_wide.melt(value_vars=['GroupA', 'GroupB', 'GroupC'], var_name='Group', value_name='Score')

import statsmodels.api as sm
from statsmodels.formula.api import ols

# Ordinary Least Squares (OLS) model -> statsmodels.api.stats.anova_lm
model = ols('Score ~ C(Group)', data = df_long).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
anova_table

 

from statsmodels.formula.api import ols

-> 이원분산분석에서도 사용할 수 있다. 이쪽이 범용성이 높긴 하다.

근데 멜트시키는게 더 공수가 클 것 같긴 하다.

 

4. 이원분산분석 : melt된 일원분산분석과 똑같이

패키지 알고 종속변수 ~ 독립변수1  * 독립변수2 꼴의 formula만 세울 수 있으면 된다.

import statsmodels.api as sm
from statsmodels.formula.api import ols

model = ols('Sales ~ C(Decoration_Type) * C(Region)', data=df).fit()
sm.stats.anova_lm(model)
#범주형인 경우 C(X)꼴로 감싸면 됨
#변수 2개를 x * y  꼴



5. t검정 단일표본

#alternative 옵션 - 대립가설 부등호와 같게 설정
#p > 유의수준 : 귀무가설 채택, p <= 유의수준 : 귀무가설 기각

from scipy.stats import ttest_1samp
s, p = ttest_1samp(집단, 모평균, alternative = "greater" / "less" / "two_sided"(기본))



6. t검정 독립표본 (표본 2개)

#p > 유의수준 : 귀무가설 채택, p <= 유의수준 : 귀무가설 기각
from scipy.stats import ttest_ind
s, p = ttest_ind(집단1, 집단2)
반응형

7. 점추정과 구간추정

점추정 : 표본평균

구간추정

- 신뢰구간 설정

- 표본표준편차 .std(ddof  =1) / ddof =0이면 모표준편차

- 표본갯수 설정 : len(data)

from scipy import stats

stats.t.interval(유의수준, 자유도 df = 표본갯수 - 1, loc = 표본평균 , scale  = 표본표준편차 / 표본갯수**0.5)

import pandas as pd
temperature_data = pd.read_csv("/kaggle/input/bigdatacertificationkr/daily_temperatures.csv")
temperature_data

#점추정 = 그냥 평균
sample_mean = temperature_data['Daily Average Temperature'].mean()
print(round(sample_mean, 2)) #19.94

#구간추정: 샘플 표준편차 계산 및 신뢰구간 계산
confidence_level = 0.95
 # 자유도 n-1로 설정. ddof= 0인 경우 자유도 n , 모표준편차
sample_std = temperature_data['Daily Average Temperature'].std(ddof=1) 
print(sample_std)


n_samples = len(temperature_data) #표본 갯수
print(n_samples)

from scipy import stats
#95% 신뢰구간 계산 : stats.t.interval
confidence_interval = stats.t.interval(confidence_level, df=n_samples-1, loc=sample_mean, scale=sample_std/(n_samples**0.5))

 

8. 베르누이분포와 이항분포

베르누이분포 : 우리가 아는 일반적인 확률. 성공 횟수/전체 시도 횟수

이항분포 : n번 시도 중 k번 성공할 확률

from scipy.stats import binom

binom.pmf(성공횟수, 시도횟수, 베르누이확률) : 확률질량함수

import pandas as pd
from scipy.stats import binom

df = pd.read_csv("/kaggle/input/bigdatacertificationkr/t3_success.csv")
df
# 1. 베르누이 분포: 각 시도의 성공 확률 계산
total_attempts = len(df)
number_of_successes = df['Success'].sum()
success_probability = number_of_successes / total_attempts
print(success_probability)

# 2. 이항 분포: 100번의 시도 중 정확히 60번 성공할 확률 계산
n = 100  # 시도 횟수
k = 60   # 성공 횟수
probability_of_60_successes = binom.pmf(k, n, success_probability)
print(probability_of_60_successes)


9. 카이제곱 독립성 검정
from scipy.stats import chi2_contingency

chi2_contingency(2*2행렬)

=> 검정통계량, pvalue, df, 기대도수 2*2행렬 출력

 

df를 직접 생성하거나,

일반적인 데이터셋 형태에서 칼럼 가지고 직접 뽑아야 하는 경우라면

pd.crosstab(변수1, 변수2)꼴로 2*2 기대도수 행렬 찾아야 함

import pandas as pd
from scipy.stats import chi2_contingency

# 데이터 프레임 생성
df = pd.DataFrame({'합격': [100, 130],
                   '불합격': [200, 170]},
                  index=['남자', '여자'])

#help(chi2_contingency)
result = chi2_contingency(df)
print(result)
print(f"statistics : {result.statistic}")
print(f"pvalue : {result.pvalue}")

if result.pvalue > 0.05 :
    print("귀무가설 채택")
else:
    print("귀무가설 기각")
    
print(f"남자 합격 빈도 기댓값 : {result.expected_freq[0][0]}")

 

10. 포아송 분포

from scipy.stats import poisson

poisson.pmf = 정확히 n명이 구매할 확률

poisson.cdf = n명 이하로 구매할 확률 : 확률밀도함수 왼쪽 영역 면적값

from scipy.stats import poisson
lambda_ = 3

#1. 정확히 5명이 구매할 확률
prob1 = poisson.pmf(5, lambda_)
print(int(prob1 * 100))

#2. 2명 이상이 구매할 확률 = 1 - cdf
prob2 = 1- poisson.cdf(1, lambda_)
print(int(prob2 * 100))

 

11. 지지도/향상도/신뢰도

지지도 : P(A and B)

신뢰도 : P(A and B) / P(A)

향상도 : P(A and B) * total / P(A) * P(B)

... 필기시험에서 충분히 물어본 것 같은데, 문항 3개로 쪼개서 이걸 낼까?

import pandas as pd
# 데이터
df = pd.DataFrame({
    'transaction': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    '빼빼로': [1, 0, 1, 1, 0, 1, 1, 0, 1, 1],
    '딴짓초코': [0, 1, 1, 0, 1, 0, 1, 1, 0, 0],
    '양조위빵': [1, 0, 0, 1, 1, 1, 0, 0, 1, 0],
    '오징어칩': [0, 1, 1, 0, 0, 1, 0, 1, 1, 1],
    '초코파이': [1, 1, 0, 0, 1, 0, 1, 1, 0, 0]
})

#1. 빼빼로와 딴짓초코의 지지도
pepero = df['빼빼로'] == 1
choco = df['딴짓초코'] == 1
pepero_choco = len(df[pepero & choco]) / len(df)
print(pepero_choco)


#2. 빼빼로->오징어칩 신뢰도 : 빼빼로 중 빼빼로 & 오징어칩
squid = df['오징어칩'] == 1
pepero_squid = len(df[pepero & squid]) / len(df[pepero])
print(pepero_squid)

#3. 빼빼로와 양조위빵의 향상도 : P(빼빼로&양조위빵)/(P(빼빼로)*P(양조위빵)) = 빼&양 * 총합 / 빼 * 양
bread = df['양조위빵'] == 1
summ = len(df['transaction'])
pepero_and_bread = ((len(df[bread & pepero]) * summ)/ (len(df[bread]) * len(df[pepero])))
print(pepero_and_bread)

 

12. 카이제곱 적합성 검정 (6회 기출)

from scipy.stats import chisquare(실제도수, 기대도수)

실제 관측값과, 기대되는 관측값 행렬 2개 있어야 함.

ob = [30,60,50,40,20]
expected = [200 * 0.2, 200 * 0.3, 200 * 0.25, 200 * 0.15, 200 * 0.1]

from scipy import stats
print(stats.chisquare(ob, expected))

 

13.로지스틱 회귀분석 (7회 기출 8회 기출)

from statsmodels.formula.api import logit

logit("종속변수 ~ 독립변수" , 데이터셋).fit

 

sklearn.linear_model 밑에 LogisticRegression 이 있지만, 계수를 볼 수 없어 범용성이 떨어짐.

2유형처럼 예측시켜서 뭔가를 하는 그런 형태의 문제라면 가능은 할 듯.

 

오즈비

import numpy as np

np.exp(해당 변수의 로지스틱회귀계수)

 

로짓우도

model.llf

 

오류율

from sklearn.metrics import accuracy_rate

오류율 = 1- accuracy_rate(실제, 예측)

train = df.loc[0:349]
test = df.loc[350:]

import numpy as np
from statsmodels.formula.api import logit

model_income = logit("purchase ~ income", data = train)
result_income = model_income.fit()
print(result_income.summary())
print(result_income.params['income'])
#오즈비
odds_ratio_income = np.exp(result_income.params['income'])
odds_ratio_income #1.0000019601805765

#정확도
predictions_income = result_income.predict(test)
predicted_classes_income = (predictions_income > 0.5).astype(int)
accuracy_income = (predicted_classes_income == test['purchase']).mean()
accuracy_income #0.5066666666666667

#로짓우도
log_likelihood_income = result_income.llf
log_likelihood_income #-242.40981957168498

#p_value
p_value_income = result_income.pvalues['income']
p_value_income #0.5964910811075119

 

잔차이탈도 나오는 경우 glm을 사용한 로지스틱 회귀 적용후 이항분포 추가 사용

from statsmodels.formula.api import glm (일반화 선형회귀)

import statsmodels.api as sm

model = glm(formula, dataset, family = sm.families.Binomial()).fit()

from statsmodels.formula.api import glm
import statsmodels.api as sm

# 1) glm 모델 적합 (로지스틱 회귀를 위해 이항 분포 사용)
formula = "gender ~ age + length + diameter + height + weight"
model = glm(formula, data=train, family=sm.families.Binomial()).fit()

# 2) 잔차이탈도 계산
print(model.summary())
print(round(model.deviance,2))

*로지스틱이 나오는 이유 - 오즈비 구하기 / 로짓우도 / 정확도 등으로 문제가 파생될 수 있음에 주의.

 

14. 선형회귀 (7회 기출 8회 기출)

from statsmodels.formula.api import ols

model = ols("종속 ~ 독립", data = dataset).fit()

결정계수 model.rsquared / rsquared_adj

from statsmodels.formula.api import ols

# 1) CPU가 100 미만인 데이터 필터링
cond = df['CPU'] < 100
df = df[cond]

# 2) 선형회귀 모델 생성: ERP를 종속 변수로, 나머지 변수들을 독립 변수로 설정
model = ols('ERP ~ Feature1 + Feature2 + Feature3 + CPU', data=df).fit()

# 3) 모델 요약 정보 출력
print(model.summary())
print(model.rsquared)
print(model.rsquared_adj)

 

다중선형회귀 신뢰구간 : ols model구한 후 model.prediction(data) (6회 기출)

from statsmodels.formula.api import ols
formula = "temperature ~ solar + wind + o3"
model = ols(formula, data=df).fit()
print(model.summary())
# 0.0749
model.params['o3']

new_data = pd.DataFrame({
    'solar':[100],
    'wind':[5],
    'o3':[30]
})
pred = model.get_prediction(new_data)
print(pred.summary_frame(alpha=0.05))
728x90
반응형

댓글