빅데이터분석기사 실기 3유형 : 시험에 뭐가 나올까? 내가 보려고 정리한 요약집
빅분기 실기 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))