빅분기 실기 3유형
6회차 시험에 처음 생긴 유형이라,아직 기출문제가 2개 회차밖에 없음
가설검정과 통계 분석에 대해 다루지만, 내용이 워낙 많은 거에 비해
문제수는 대문항 2개 * 대문항 1개당 소문항 3개 = 6개밖에 없음.
부분점수도 없어서 알면 1분 컷이지만 걍 모르면 틀려야 하는 문제.
템플릿이 있는 2유형에서 40점을 따고, 1유형도 큰 실수를 하지 않는다면 30점이 나와야 한다.
과락이 없는 시험이라 이만큼만 해도 합격이긴 하지만
그래도 혹시나 변수가 발생할 경우에 대비하여, 보험 약 10점 ~ 15점 정도 필요하다고 가정.
그래서 아예 0점으로 던지고 갈 수는 없는 파트.
어떤 패키지의 어떤 함수 불러와야 하는지, 그걸 어떻게 써먹어야 하는지 정확하게 외워야 함.
(물론 help/dir을 사용할 수 있고 전략적으로 사용 예정인 부분도 있지만 (ex.2과목 평가지표),
뭐가 어느 패키지에 있는지조차 모르면 구제받을 방법도 없다. )
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))
'career > 자격증' 카테고리의 다른 글
빅데이터분석기사 실기 최종합격 후기 (2024.06 8회) / 응시료 외에 한 푼도 안 쓰고 합격하는 방법 (0) | 2024.07.06 |
---|---|
빅데이터분석기사 실기 2유형 템플릿 : 내가 보려고 작성하는 베이스라인 (2) | 2024.06.10 |
빅데이터분석기사 8회 (2024.04) 필기 합격 후기 (2) | 2024.04.21 |
네이버클라우드 NCA (Naver Cloud Platform Certified Associate) 합격후기 / AWS와 비교 / 단기속성 합격 비결 (무료강의, 기출문제) / 추천대상 (6) | 2023.10.21 |
DAsP (데이터아키텍처 준전문가) 자격증 취득 후기 (3) | 2022.12.16 |
댓글