문제 번호는 실제와 다를 수 있음
1. 머신러닝 분류 분석(다중 분류)
- 변수 탐색, 결측치/이상치, 전처리
→ Boxplot 등으로 이상치 확인하고, 결측치 제거하기 등 - feature engineering
→ 그래프를 통해 데이터 분포 확인 후,
→ 정규분포화(로그 변환 등), 이상치 제거, 스케일링, 언더/오버 샘플링, 원 핫 인코딩, 그룹핑
- 머신러닝 분류 모델 3개 – 앙상블 빼고
→ SVM, KNN, Naive Bayes, 로지스틱 회귀(다중분류), 의사결정나무, MLP, LDA 등
- grid search – 하이퍼파라미터 튜닝을 위한 기법 중 하나
→ SVM의 경우 C = [1, 10, 100], gamma = [0.001, 0.01, 0.1] 조합에 대한 모델 생성 - 위에 3개 모델 보팅: https://study-genius.tistory.com/43
- 모델 성능 평가 – Accuracy, Precision 등 구하기
- Drop Column Importance – 특정 특성의 중요성 평가
→ 특정 특성을 데이터에서 제거했을 때, 모델의 성능 변화를 측정하는 방법
– 원본 모델 학습: 모든 특성을 포함하여 머신 러닝 모델을 학습
– 특성 제거와 재학습: 하나의 특성을 제거하고, 나머지 특성들을 사용하여 모델을 다시 학습
– 성능 비교: 제거된 특성을 포함한 원래 모델과 제거된 특성 없이 학습된 모델의 성능을 비교*
*일반적으로 정확도, F1 점수, AUC 등과 같은 성능 지표 사용
– 중요도 평가: 특성을 제거했을 때 모델의 성능이 크게 감소하면, 해당 특성은 중요한 것으로 간주하고, 반대로 성능에 큰 변화가 없다면, 그 특성은 덜 중요하거나 중요하지 않은 것으로 봄
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# Iris 데이터 로드
iris = load_iris()
X = iris.data
y = iris.target
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 기준 모델 생성
base_model = RandomForestClassifier(random_state=42)
base_model.fit(X_train, y_train)
base_accuracy = accuracy_score(y_test, base_model.predict(X_test))
# 각 특성 제거 후 정확도 측정
drop_column_accuracies = []
for i in range(X.shape[1]):
X_modified = X[:, [j for j in range(X.shape[1]) if j != i]]
X_train_mod, X_test_mod, _, _ = train_test_split(X_modified, y, test_size=0.2, random_state=42)
model = RandomForestClassifier(random_state=42)
model.fit(X_train_mod, y_train)
accuracy = accuracy_score(y_test, model.predict(X_test_mod))
drop_column_accuracies.append(accuracy)
# 결과 출력
print("기준 모델의 정확도:", base_accuracy)
print("각 특성별 정확도:")
for i, accuracy in enumerate(drop_column_accuracies):
print(f"특성 {i+1}: {accuracy}")

→ 각 특성을 제거한 후의 정확도가 특성의 중요도
→ 특성 1은 제거 후에도 정확도가 유지되지만, 특성 3은 제거 후에 정확도가 크게 감소하는 것을 확인
*해당 특성 제거
– 데이터프레임: df_modified = df.drop(columns=[column_to_remove])
– 배열: X_modified = np.delete(X, feature_index_to_remove, axis=1)
*Feature Importance
→ 머신 러닝 모델이 각 특성의 예측에 얼마나 중요한지
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
iris = load_iris()
X = iris.data
y = iris.target
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X, y)
importances = rf_model.feature_importances_
print("특성 중요도:")
for i, importance in enumerate(importances):
print(f"특성 {i+1}: {importance}")
2. 비만 청소년 데이터 분석
- datetime 사용해서 대상 청소년 나이 구하기
→ datetime 함수 사용법 익히자 - 명목형 변수에 따른 변수들 차이가 있는지 검정
→ 카이제곱 검정? - Roc 그래프 겹쳐 그리기 두 개 분류 모델
→ 전처리부터 말림
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib.pyplot as plt
# 데이터 생성
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 모델 학습
model1 = LogisticRegression()
model2 = RandomForestClassifier()
model1.fit(X_train, y_train)
model2.fit(X_train, y_train)
y_prob1 = model1.predict_proba(X_test)[:, 1]
y_prob2 = model2.predict_proba(X_test)[:, 1]
fpr1, tpr1, _ = roc_curve(y_test, y_prob1)
fpr2, tpr2, _ = roc_curve(y_test, y_prob2)
plt.plot(fpr1, tpr1, label='Logistic Regression')
plt.plot(fpr2, tpr2, label='Random Forest')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend()
plt.show()

3. 사전분포가 정규분포인데, 어떤 값에 대한 사후분포 값은?
→ 베이지안 통계
- 사전 분포(Prior Distribution): 사전 지식이나 믿음을 바탕으로 한 분포. 예를 들어, 정규 분포 N(μ₀, σ₀²)를 사용할 수 있음
- 가능도 함수(Likelihood Function): 관찰된 데이터를 기반으로 한 확률 분포. 일반적으로, 이는 데이터의 분포를 나타냄. 예를 들어, 데이터가 정규 분포 N(x̄, s²/n)를 따른다고 가정할 수 있다.
- 사후 분포(Posterior Distribution): 사전 분포와 가능도 함수를 결합하여 업데이트된 믿음을 나타냄. 사후 분포는 베이즈 정리에 따라 계산된다.
사전 분포가 정규 분포 N(0, 1)이고, 관찰된 데이터의 평균이 1, 분산이 0.5, 데이터 개수가 10인 경우
import pymc3 as pm
import numpy as np
observed_mean = 1
observed_var = 0.5
n_data = 10
prior_mean = 0
prior_var = 1
np.random.seed(42)
data = np.random.normal(loc=observed_mean, scale=np.sqrt(observed_var), size=n_data)
# 모델링
with pm.Model() as model:
prior = pm.Normal('prior', mu=prior_mean, sd=np.sqrt(prior_var)) # 사전분포 설정
likelihood = pm.Normal('likelihood', mu=prior, sd=np.sqrt(observed_var), observed=data) # 우도함수 설정
trace = pm.sample(1000, tune=1000, cores=1)
posterior_mean = np.mean(trace['prior']) # 추론 결과 요약
posterior_var = np.var(trace['prior'])
print("사후분포의 평균:", posterior_mean)
print("사후분포의 분산:", posterior_var)

→ 기본 라이브러리만 이용한 예제
import numpy as np
observed_mean = 1
observed_var = 0.5
n_data = 10
prior_mean = 0
prior_var = 1
np.random.seed(42)
data = np.random.normal(loc=observed_mean, scale=np.sqrt(observed_var), size=n_data)
sample_mean = np.mean(data)
posterior_var = 1 / (1/prior_var + n_data/observed_var)
posterior_mean = posterior_var * (prior_mean/prior_var + n_data * sample_mean/observed_var)
print("사후분포의 평균:", posterior_mean)
print("사후분포의 분산:", posterior_var)
4. 범주형 데이터에 대한 통계 검정
a,b,c,d,e 다섯 가지 처리 방법이 동일한 대상에 적용되었을 때, 처리 방법들이 통계적으로 유의미한 차이를 보이는지 검정
→ 코크란 Q 검정
import numpy as np
from statsmodels.stats.contingency_tables import cochrans_q
# 샘플 데이터 생성 (3개의 처리 방법, 10개의 샘플)
data = np.array([
[1, 0, 0],
[1, 1, 0],
[1, 0, 1],
[1, 1, 1],
[0, 0, 1],
[0, 1, 1],
[0, 1, 0],
[1, 1, 0],
[0, 0, 0],
[1, 0, 1]
])
# 코크란 Q 검정 실행
result = cochrans_q(data)
# 결과 추출
q_stat = result.statistic
p_value = result.pvalue
# 출력
print(f"Cochran's Q 통계량: {q_stat:.4f}")
print(f"p-value: {p_value:.4f}")
→ p-값이 특정 유의수준(예: 0.05)보다 작다면, 적어도 두 처리 방법 간에는 통계적으로 유의미한 차이가 있다는 것
5. 포아송분포 예측문제 – 유기견 2마리
– 다음 주엔 몇 마리?
from scipy.stats import poisson
import numpy as np
# 평균 유기견 수 (이번 주 관측값)
lambda_ = 2
# 1. 기댓값 기반 예측 (가장 단순)
expected = round(lambda_)
# 2. 최빈값 기반 예측
k_vals = np.arange(0, 20)
probs = poisson.pmf(k_vals, mu=lambda_)
mode = k_vals[np.argmax(probs)]
# 3. 95% 신뢰구간 (central interval)
lower_bound = poisson.ppf(0.025, mu=lambda_)
upper_bound = poisson.ppf(0.975, mu=lambda_)
print(f"📌 기댓값 기반 예상: {expected}마리")
print(f"📌 최빈값 기반 예상: {mode}마리")
print(f"📌 95% 예측 구간: {int(lower_bound)} ~ {int(upper_bound)}마리")
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import poisson
lambda_ = 2
# 예측 범위: 0~10마리
k_values = np.arange(0, 11)
probabilities = poisson.pmf(k_values, mu=lambda_)
for k, p in zip(k_values, probabilities):
print(f"P(X = {k}) = {p:.4f}")
plt.bar(k_values, probabilities)
plt.xlabel("다음 주 유기견 수")
plt.ylabel("확률")
plt.title("다음 주 유기견 수의 포아송 분포 (λ=2)")
plt.grid(True)
plt.show()
*(라이브러리) #마리일 확률 구하기
from scipy.stats import poisson
lambda_ = 2
prob_zero = poisson.pmf(0, mu=lambda_)
print(f"유기견이 0마리일 확률: {prob_zero:.4f}")
import math
# 포아송 분포의 파라미터(람다) 설정 - 주당 평균 2마리
lambda_ = 2
# k = 0 (다음 주에 유기견이 한 마리도 발견되지 않을 경우)
k = 0
# 포아송 분포 확률 계산
probability = (math.exp(-lambda_) * lambda_**k) / math.factorial(k)
print(probability)
6. 다중회귀, 다중공선성(VIF) 확인
https://study-genius.tistory.com/49
'데이터 분석 > ADP 자격증 공부' 카테고리의 다른 글
| (파이썬 한권으로 끝내기) 머신러닝 분류 알고리즘 – 로지스틱 회귀, SVM, KNN, 의사결정나무, 앙상블/보팅, 나이브베이즈, 인공신경망 (0) | 2026.04.05 |
|---|---|
| [ADP 실기] Pandas, Numpy, 문자열 관련 함수 (1) | 2026.04.05 |
| [ADP 실기] (지도학습) 파이썬 선형 회귀, 경사하강법, 다항 회귀, 다중 회귀 예제 코드 (0) | 2026.04.05 |
| [ADP 실기] (모델평가) 회귀모델, 분류분석모델 성능평가(MAE, MSE, Accuracy, Precision, Recall, F1-score) (0) | 2026.04.05 |
| [ADP 실기] (시각화) 파이썬 그래프 그리기(Boxplot, Scatter, Pairplot, Hitmap 등) (0) | 2026.04.05 |