취업준비

빅데이터 분석기사 실기

macbook2 2026. 6. 15. 17:43

PART 1. 

 

1.이상치

# ~ 분위수 구하기

Q1 = df['a'].quantile(0.25)
Q3 = df['a'].quantile(0.75)

IQR = Q3 - Q1 

# 이상치
outlier1 = df[df['a'] < Q1 - (IQR * 1.5)
outlier2 = df[df['a'] < Q3 + (IQR * 1.5)

 

2. 소수점인 이상치 찾기

# 소수점인 이상치 찾기

outlier1 = df['a'][df['a'] % 1 != 0]

# 이상치를 포함한 데이터 올림, 내림, 버림의 평균값 

m_ceil = np.ceil(outlier1).mean()

m_floor = np.floor(outlier1).mean()

m_trunc = np.trunc(outlier1).mean()

 

3. 결측치 처리

# 80% 이상 결측치 컬럼 확인 후 삭제

df.isnull().sum() / df.shape[0]

df.drop('a', axis = 1, inplace = 'True')

# city별 중앙값으로 대체

df = df.fillna(df.groupby('city')['a'].transform(median))

 

4. 왜도와 첨도

# 왜도와 첨도
skew = df['a'].skew()
kurt = df['a'.kurt()

# 로그 변환
skew_log = np.lop1p(skew)
kurt_log = np.log1p(kurt)

 

5. 데이터 표준편차

# 조건에 맞는 데이터 표준편차
df[df['f4'].isin(['ENFJ', 'INFP'])]['f1'].std()

 

6. 결측치 제거 및 그룹화

# 결측치 제거
df['a'] = df['a'].dropna()

# 그룹화 후 두조건 동시 만족하는 c의 값
group = df.groupby(['a', 'b']).sum().reset_index()
c = group([group['a'] == '1') & (group['b'] == '2')]['c']

 

7. 값 변경 및 2개 이상의 조건 

# 값 변경
df['f4'].replace('ESFJ', 'ISFJ', inplace= True)

# 조건에 맞는 값
df[(df['city'] == '경기') & (df['f4'] == 'ISFJ')]['age'].max()

 

8. 누적합 그리고 보간(결측치 처리)

# 누적합
df_cumsum = df['f1'][df['f2'] == 1].cumsum()

# 뒤의 값으로 결측치 채우기
df_cumsum.bfill()

 

9. 수치형 변수 표준화

# 스탠다드스케일러 임포트
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df['a'] = scaler.fit_transform(df[['a']]) # 데이터프레임이어야함

 

10.  여-존슨과 박스-칵스 변환

# 여존슨 박스칵스 임포트
from sklearn.preprocessing import power_transform

# 최빈값으로 'f1' 컬럼 결측치 대체
df['f1'] = df['f1'].fillna(df['f1'].mode()[0])

# 'f1'데이터 여-존슨 yeo-johnson 값 구하기
df['y'] = power_transform(df[['f1']])

# 'f1'데이터 박스-콕스 box-cox 값 구하기
df['y'] = power_transform(df[['f1']], standardize = Flase

 

11. min-max & 상하위 5%값

# 임포트
from sklearn.preprocessing import MinMaxScaler

# 적용
sclaer = MinMaxScaler()
df['f5'] = sclaer.fit_transform(df[['f5']])

# 상위 5%, 하위 5%
upper = df['f5'].quantile(0.95)
lower = df['f5'].quamtile(0.05)

 

12. 상위 10개, 하위 10개 차이

# 그룹화 후 정렬
df_group = df.groupby('country').max().reset_index() #시간에 따라 접종률이 점점 올라감
df_group = df_group.sort_values(by = 'ratio', ascending = False)

 

13. 상관관계 구하기

# 상관관계
df_corr = df.corr()

#퀄리티의 상관관계중 최대값과 최소값구하기
max = df_corr[['qulity']].iloc[:-1].max()
min = df_corr[['qulity']].iloc[:-1].min()

 

14. 2개 조건에 따른 상위 값

# city와 f4를 기준으로 f5의 평균값을 구한 다음
# f5를 기준으로 상위 7개 값을 모두 더해 출력하시오 (소수점 둘째자리까지 출력)

df_group = df.groupby(['f4', 'city'])['f5'].mean().reset_index()
df_group.sort_values(by = 'f5', ascending = False).head(7)
print(round(sum(group_df['f5']), 2))

 

15. 슬라이싱 조건

# 주어진 데이터 셋에서 age컬럼 상위 20개의 데이터를 구한 다음
df_20 = df.sort_values(by = 'age', ascending = False).head(20)

# f1의 결측치를 중앙값으로 채운다.
df['f1'] = df['f1'].fillna(df['f1'].median())

# f4가 ISFJ와 f5가 20 이상인 
df = df[(df['f4'] == 'ISFJ') & (df['f5'] > 20)]

# f1의 평균값을 출력하시오!
df['f1'].mean()

 

16.  분산

df_var1 = df['f1'].var()

 

17. 시계열 데이터

# date type으로 변경
df = pd.to_datetime(df['Date'])

# 2022년 5월
df = df[(df['Date'].dt.year == 2022 & (df['Date'].dt.month == 5)]

 

18. 시계열 데이터2

# date type으로 변경
df = pd.to_datetime(df['Date'])

# 2022년 5월
df = df[(df['Date'].dt.year == 2022 & (df['Date'].dt.month == 5)]

# 주말과 평일 구분
df_weekend = df[df['Date'].dt.dayofweek() >= 5] 
df_weekday = df[df['Date'].dt.dayofweek() < 5]

 

19. 시계열 데이터3

# 벡터 연산
df.loc[df['Events'] == 1, 'Sales'] *= 0.8

max_2022 = df[df['Date'].dt.year == 2022].groupby(df['Date'].dt.month)['Sales'].sum().max()
max_2023 = df[df['Date'].dt.year == 2023].groupby(df['Date'].dt.month)['Sales'].sum().max()

print(round(abs(max_2023-max_2022),0))

 

20. 데이터 병합

# 데이터 병합
df = pd.merge(b1, b3, on = 'f4', join = 'left')

# 결측 제거
df['f2'] = df['f2'].dropna()

 

21. 구간 분할

# 0포함 음수 값 이상치 제거
df = df[df['age'] > 0]

# 소수점 age 이상치 제거
df = df[df['age'] % 1 == 0]

# q컷
df['range'] = df.qcut(df['age'], q=3, label = ['age1', 'age2', 'age3'])

 

22. 시계열4 (주단위로 자르기)

# datetime 변경
df['Date'] = pd.to_datetime(df['Date'])

# index로 변경
df = df.set_index('Date')

# resample 2W - 2주, M - 월
df = df.resample('W').sum()

 

23. 중복데이터 제거

# 결측치 채우기
df['f1'] = df['f1'].fillna(df['f1'].sort_values(ascending = False).iloc[9])
before_f1 = df['f1'].median()

# 중복 제거
df = df.drop_duplicates(subset = ['age'])
after_f1 = df['f1'].median()

print(abs(before_f1-after_f1))

 

24. 시차 데이터 생성

# 시차가 있는 새로운 컬럼 만들기
df[pre_pv] = df['PV'].shift(1).bfill()

# Events가 1이면서 Sales가 1000000이하인 조건에 맞는 새로운 컬럼 합
df['pre_pv'][(df['Events'] == 1) & (df['Sales'] <= 1000000)].sum()

 

25. str_slicing

# f4가 E로 시작하면서 부산에 살고 20대인 사람
df[df['f4'].str[0] == 'E'] & (df['city'] == '부산') & ((df['age'] >= 20) & (df['age'] <=29))])

 

26. 문자열 처리 (슬라이싱)

# 라떼 키워드가 있는 데이터 수
len(df[df['menu'].str.contains('라떼')]

 

27. 문자열 치환

# 바닐라라떼 5점, 카페라떼 3점, 아메리카노 2점으로 메뉴 점수 더하기
df['menu'] = df['menu'].replace(' ', '')
df['score'] = df['menu'].map({'바닐라라떼' : 5, '카페라떼' : 3, '아메리카노':2}).fillna(0).astype(int)
df['score'].sum()

 

28. 빈도 계산 (value_counts)

# 13시 이전 가장 많은 결제
df[df['hour'] < 13][date].value_counts()

 

29. 날짜형식 변환

# date 날짜형식 변환
df['date']= pd.to_datetime(df['date'], format = '%Y%m%d')
len(df[df['date'].dt.month == 12])

 

30. 시계열 비율 계산

# 데이트 타임 변경
df['date'] = pd.to_datetime(df['date'], format = '%Y%m%d')
df = df[df['date'].dt.month == 12]

# 비율 계산
cond1 = df[df['date'].dt.day == 25]['price'].sum()
cond2 = df['price'].sum()

print(int((cond1 / cond2)* 100))

 

PART 2. 

템플릿

import pandas as pd

# 데이터 불러오기
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')

# 전처리
X = train.drop(['정답'], axis=1)
y = train['정답']

# train + test 결합
x_full = pd.concat([X, test], axis=0)

# ID 제거
x_full = x_full.drop('회원ID', axis=1)

# 결측치 처리
x_full['결측치있는변수'] = x_full['결측치있는변수'].fillna(
    x_full['결측치있는변수'].median()
)

# 원핫인코딩
x_full = pd.get_dummies(x_full)

# 다시 분리
x_train = x_full[:len(train)]
x_test = x_full[len(train):]

# 검증셋 분리
from sklearn.model_selection import train_test_split

X_train, X_val, y_train, y_val = train_test_split(
    x_train,
    y,
    test_size=0.2,
    random_state=2022
)

# 모델
from sklearn.ensemble import RandomForestRegressor #(RandomForestClassifier)

model = RandomForestRegressor(random_state=2022)

model.fit(X_train, y_train)

# 검증
y_val_pred = model.predict(X_val)

# 평가
from sklearn.metrics import mean_squared_error, r2_score

rmse = mean_squared_error(y_val, y_val_pred, squared=False)
r2 = r2_score(y_val, y_val_pred)

print("RMSE:", rmse)
print("R2:", r2)

# 최종 예측
y_pred = model.predict(x_test)

# 저장
result = pd.DataFrame({
    'pred': y_pred
})

result.to_csv('result.csv', index=False)

 

PART 3. 

1. 단일 표본 T 검정

import scipy.stats import ttest_1samp

mu = 75
alpha = 0.05

t_statisitic, p_value = ttest_1samp(scores, mu, alternative = 'greater')

 

2. 독립표본 T 검정

from scipy.stats import ttest_ind

t_statistic, p_value = stats.ttest_ind(group1, group2)

 

2. 대응표본 t 검정

df['diff'] = df['bp_post'] - df['bp_pre']

# u의 표본 평균
print(df['diff'].mean())

# 검정통계량 값
from scipy.stats import ttest_ind
st, pv = ttest_ind(df['bp_post'], df['bp_pre'], alternative = "less")

 

3. ANOVA 

# 일원배치법
from scipy.stats import f_oneway

f_value, p_value = f_oneway(groupA, groupB, groupC)

 

4. 샤피로 검정

from scipy.stats import shapiro

stat, pv = shapiro(data)

 

5. 상관계수

correlation = df.corr()

result = correlation.loc['sepal length (cm)', 'sepal width (cm)']

 

6. 로지스틱 회귀

import pandas as pd
from statsmodels.formula.api import logit

fomula = 'Survived ~ C(Pclass) + Gender + SibSp + Parch'
model = logit(formula, data = df).fit()
model.params

 

7. 선형회귀 2단계

"""
고객 정보를 나타낸 데이터이다. 주어진 데이터에서 500개 중 앞에서부터 350개는 train으로, 150개는 test 데이터로 나눈다. 모델을 학습(적합)할 때는 train 데이터를 사용하고, 예측할 때는 test 데이터를 사용한다. 모델은 로지스틱 회귀를 써서 고객이 특정 제품을 구매할지 여부를 예측하되, 페널티는 부과하지 않는다.

종속변수: purchase (0: 구매 안 함, 1: 구매 함)

문제 1-1. income 변수를 독립변수로 purchase를 종속변수로 사용하여 로지스틱 회귀 모형을 만들고, income 변수가 한 단위 증가할 때 구매할 오즈비 값을 계산하시오. (반올림하여 소수 넷째자리까지 계산)

문제 1-2. 독립변수 income만 사용해 학습한 모델에서 test 데이터의 purchase를 예측하고, accuracy (정확도)를 구하시오. (반올림하여 소수 셋째자리까지 계산)

문제 1-3. 독립변수 income만 사용해 학습한 모델의 로짓 우도를 계산하시오.

문제 1-4. 독립변수 income만 사용해 학습한 모델의 유의확률(p-value)를 구하시오.
"""

# 데이터셋 분할
train = df.iloc[:350]
test = df.iloc[350:]

# 1.1.
model_income = logit('purchase ~ income', data=train)
result_income = model_income.fit()

odds_ratio_income = np.exp(result_income.parmas['income']


# 1.2 
predictions_income = result_income.predict(test)
predicted_classes_income = (predictions_income > 0.5).astype(int)

# 정확도 계산
from sklearn.metrics import accuracy_score
accuracy_score(test['purchase'], predicted_classes_income)

# 1.3.
og_likelihood_income = result_income.llf

# 1.4.
p_value_income = result_income.pvalues['income']

 

8. 다중선형 회귀

"""
모든 변수를 사용하여 OLS 모델을 적합하고, 회귀계수 중 가장 큰 값은?
유의미하지 않은 변수를 제거한 후 모델을 다시 적합하고, 회귀계수 중 가장 작은 변수명은?
2번 모델의 R-squared 값을 계산하고 해석하세요.
1번 모델에서 새로운 데이터(x1=5, x2=12, x3=10, x4=3)에 대해 y 값을 예측하세요.
1번 모델에서 x1, x2, x3, x4의 상관관계를 계산하고 가장 큰 상관계수를 구하시오. (단, 자기 상관관계 제외)
x1과 x2만을 예측 변수로 사용하는 모델을 적합하고, 전체 모델과 R-squared 값을 구하시오.
잔차(residual) 분석을 수행하고, 잔차의 표준편차를 구하시오.
1번 모델에서 새로운 데이터(x1=5, x2=12, x3=10, x4=3)에 대해 y의 신뢰구간 하한(97% 신뢰수준)을 구하세요.
1번 모델에서 새로운 데이터(x1=5, x2=12, x3=10, x4=3)에 대해 y의 예측구간 상한(97% 신뢰수준)을 구하세요.
"""

import statsmodel.formula.api as smf

# 1. 
model_full = smf.ols('y ~ x1 + x2 + x3 + x4', data=data).fit()
print(model_full.summary())
# pvalue가 0.05보다 크면 유의하지 않음

# 2. 
model_refit = smf.ols('y ~ x1 + x2 + x3', data=data).fit()
print(model_refit.summary())

# 3.
model_refit.rsquared

# 4. 
new_data = pd.DataFrame({'x1': [5], 'x2': [12], 'x3': [10], 'x4': [3]})
y_pred = model_full.predict(new_data)
print(y_pred)

# 5.
corr_matrix  = data.corr()

# 6.
model_x1_x2 = smf.ols('y ~ x1 + x2', data=data).fit()
model_x1_x2.rsquared

#7. 
residuals = model_full.resid
print("\n7. 잔차의 표준편차:")
print(residuals.std())

#8.

 

작업형 3 유형은 통계 분석 문제가 출제되는 유형, 주어진 데이텅 ㅔ적절한 통계 분석 기법을 적용하고, 결과를 도출하여 제출하는 방식으로 진행된다. 

 

기출 문제 분석 결과, 선형 회귀분석, 로지스틱, 회귀분석이 가장 많이 출제되며, 모수 검정(예:t-검정, 카이제곱 검정) 등이 포함됩니다. 

문제에서 요구하는 내용을 정확히 이해하고, 적절한 코드로 정확한 분석 결과를 도출하는 것이 핵심입니다.

1. 모든 컬럼을 활용해서 design을 예측하는 다중회귀 분석을 시행한 후 유의하지 않은 설명변수 개수를 구하시오
2. 훈련 데이터의 예측값과 실제값의 피어슨 상관계수를 구하시오
3. 적합한 모델을 활용하여 테스트 데이터에서의 RMSE를 구하시오.
4. 이표본 T 검정을 수행하고, 검정통계량을 계산하시오.

 

1. 통계 검정 빈출 문제 : two-sample t-test 

어느 회사에서 두부서 직원들의 근무 시간 평균이 유의미하게 다른지를 조사하고자 한다. 각 부서에서 각 30명의 직원을 랜덤으로 추출하여 주간 근무 시간을 조사하였다.

 

1.1. 두 부서의, 평균 표준편차를 구하시오 

mean_a = ~
std_a
mean_b
std_b

데이터프레임.std # n-1 기준
np.std(vec, ddof =1) # n-1 기준

 

1.2. 두 부서의 평균 근무 시간이 유의미하게 다른지 검정하기 위해 이표본 t 검정을 수행하고, 검정 통계량을 계산해라

-> 이표본 T 검정 : 두 독립적인 그룹의 평균 차이가 통계적으로 유의미한지를 판단하기 위한 통계적 검정 방법이다.

from scipy.stats improt ttest_ind

# 두 표본 t검정 수행
t_statistic, p_value = ttest_ind(date[data['department'] == 'A']['hours_worked'], data[data['department'] == 'B']['hours_worked'])

print('검정통계량 : ', t_statistic)

 

1.3 p_value 계산하고 유의수준 5% 하에서 귀무가설을 기각/채택 여부를 결정하시오. 

print(p_value) # 를 보고 0.05보다 크면 채택, 작으면 기각

 

2. 통계 검정 빈출 문제 : ANOVA (변수 3개)

어느 마케팅 회사에서 세가지 마케팅 캠페인(A, B, C)의 효과가 유의미하게 다른지를 조사하고자 한다. 각 캠페인에 대해 각 50명의 고객을 랜덤으로 추출하여 만족도를 조사하였다.

 

2.1. 각 캠페인의 만족도 점수의 평균, 표준편차를 구하시오.

#동일

 

2.2. 세 캠페인의 평균 만족도 점수가 유의미하게 다른지 검정하기위해 ANOVA검정을 수행하고 검정통계량을 계산하시오

from scipy.stats import f_oneway

f_statistic, p_value = f_oneway(
	data[data['campaign'] == 'A']['satisfaction_score'],
    data[data['campaign'] == 'B']['satisfaction_score'],
    data[data['campaign'] == 'C']['satisfaction_score'])
    
print('검정 통계량 :', f_statistic.round(3))

 

2.3. p_value 계산하고 유의수준 5% 하에서 귀무가설을 기각/채택 여부를 결정하시오. 

print(p_value) # 를 보고 0.05보다 크면 채택, 작으면 기각

 

3. 한 제조회사에서 생산성을 높이고자 지구언들의 주요 생산성 요인을 분석하기로 결정하였다. 이를 위해 200명의 직원데이터를 수집했으며, 직원들의 근무기간, 특성정보, 그리고 개인적인 소성을 조사했다. 

 

3.1. 모든 컬럼을 활용하여 다중회귀 분석을 시행한 후 유의하지 않은 설명 변수 개수를 구하시오(패털티는 포함되지 않음, 모델의 절편항은 포함)

train = df[df['id'] <= 140]
test = df[df['id'] > 140]

# statsmodels 라이브러리 사용 선형회귀모델 적합
from statsmodels.formula.api import ols

formula = "design ~ tenure + f2 + f3 + f4 + f5" $ 종속 ~ 독립
model = ols(formula, data = train).fit()
print(model.summary())

# 통계적으로 유의미하지않은 컬럼을(영향이 없다 o : 귀무가설) 식별하기 위해 각 컬럼의 p-value 확인
-- p value 보다 크면 영향이 없음	

# R-squared: 0.82
-- 모형 설명력은 82%이다.

# Adj. R-squared: 0.80
-- 변수 개수를 고려한 설명력 80%

# print(model.params)
-- design = 10 + 2*tenure - 5*f2 + 1*f3

# 모델 유의성 
Prob(F-statistic): 0.00001 < 0.05  # 회귀모형은 유의하다.
Prob(F-statistic): 0.23 > 0.05 # 회귀모형은 유의하지 않다.

 

3.2. 훈련 데이터의 예측값과 실제값의 피어슨 상관계수를 구하시오

y_pred = model.predict(train)
y_real = tatin('design')

# pearsonr()
from scipy.stats import pearsonr

correlation, _ = pearsonr(y_pred, y_real)

 

3.3. 적합한 모델을 화용하여 테스트 데이터에서 rmse를 구하시오

y_pred_test = model.predict(test)

from sklearn.metrics import maen_squared_error

rmse = np.sqrt(mean_squared_error(test['design'], y_pred_test))
print(rmse)

 

4. 한 통신회사에서는 고객 이탈을 줄이고자 주요 요인들을 분석하기로 결정했다. 이를 위해 400명의 고객 데이터를 수집했으며, 고객의 서비스 이용 및 가입 정보, 그리고 일부 개인적은 속성을 조사하였다.

 

4.1. 고객 이탈을 예측하는 로지스틱 회귀를 시행한 후 col1 컬럼의 p-value를 구하시오

from statsmodels.formula.api import logit

formula = "chun ~ col1 + col2 + Phone_Service + Tech_Insurance"
model = logit(formula, data = df).fit()

model.pvalues

 

4.2. 폰 서비스를 받지 않은 고객 대비 받은 고객의 이탈 확률 오즈비를 구하시오

round(np.exp(model.params['Phone_Service']), 3)