무엇이 나오는가
확인된 것과 확인하지 못한 것을 갈라 둔다. 합격선과 접수 일정은 공개 자료가 없었다.
- 시험
- 삼성전자 DS 데이터사이언스 인증 Level 3. 필기와 실기로 나뉜다.
- 필기
- 6영역 28차시 커리큘럼이 범위다. 딥러닝(기본·확장 신경망)은 필기에 한해서만 나온다.
- 실기
- 파이썬. 21~25번은 번호마다 소문항 5~8개, 26번은 캐글형 모델링 20점이다. 지표는 회차마다 바뀐다(Macro F1, RMSE, F1, R²…).
- 배점
- 회차별로 달랐다 — 6·8·10·8·8 / 20, 8×5 / 20, 6·8·8·8·10 (엑셀 후기). 캐글 20점이 가장 큰 한 덩어리다.
- 합격 기준
- 확인 못 함. 웹 검색 5회, 공식·후기 어디에도 없다. 공고나 사내 안내로 확인할 것.
- 접수 일정
- 확인 못 함. 엑셀에 2025-06 ~ 2026-01 사이 7개 회차의 후기가 있어 자주 열리는 것으로 보이지만 확정은 아니다. 위 시험일 칸에 직접 넣는다.
- 실기 환경
- 라이브러리 버전은 모른다. 후기에 SMOTE·ROS, XGBoost, GridSearchCV 사용 사례가 있어 해당 패키지는 쓸 수 있었던 것으로 읽힌다. 시험 시작하자마자
import sklearn; print(sklearn.__version__)를 찍어 둘 것 — 아래 03의 버전 함정 표가 여기서 갈린다.
Level 2 에서 빠진 것은 전부 Level 3 범위엑셀 「DS3 범위」 시트
| 영역 | Level 2 에서 제외 → Level 3 에 포함 | Level 3 에서 새로 추가 |
|---|---|---|
| 데이터 처리 | 데이터 샘플링, 수치형 비선형 변환, 구간 분할·순위 변환 | — |
| 통계 분석 | 상관분석 유의성 검정, 회귀 변수 선택, 다항·비선형 회귀 | 가설 검정 · 분산 분석 · 교차 분석 |
| 지도학습 | — | GLM · Lasso/Ridge · 부스팅(GradientBoost, AdaBoost, XGBoost) · SVM |
| 비지도 | PCA · MDS · t-SNE · LDA · PLS 회귀 | K-medoids · 계층적 군집 · DBSCAN · 이상탐지 개요 · Isolation Forest |
| 평가·튜닝 | — | 하이퍼파라미터 튜닝 |
| 딥러닝 | — | 기본 신경망 · CNN · RNN · Autoencoder (필기만) |
엑셀 메모: 「LDA, PCA, DL 파라미터 수, 계층적 군집분석, RNN」 — 필기에서 따로 챙기라고 적어 둔 다섯 개.
필기
28차시를 순서대로 지우고, 영역별 핵심을 접어 둔 목록에서 확인한다. 마지막은 엑셀 필기 기출에서 고른 문제들.
28차시 진도0 / 28
영역별 핵심엑셀 필기·용어·카테고리 시트 + 보강
데이터 개론1-1 ~ 1-4
분류와 결측·이상치
- 정형은 질적(명목·서열)과 양적(연속·이산), 반정형은 JSON·XML, 비정형은 텍스트·음성·영상. 빅데이터는 3V(양·속도·다양성)에 정확성·가치를 더해 5V.
- 결측 유형은 MCAR(완전 무작위) · MAR(관측된 다른 변수에 의존) · MNAR(값 자체에 의존). 결측 자체가 정보일 수 있어 무조건 삭제하는 것은 틀린 선택지다.
- 대치: 평균·중앙값·최빈값, Hot-deck(현재 표본에서 비슷한 응답), Cold-deck(외부·이전 연구), 회귀, KNN, 다중 대치(MICE). Hot/Cold deck 을 헷갈리지 말 것.
- 이상치 탐지: IQR(Q1−1.5·IQR, Q3+1.5·IQR), Z-score(|z|>3), ESD, DBSCAN, Isolation Forest, LOF, One-Class SVM, 박스플롯. VIF 는 다중공선성 진단이지 이상치 탐지가 아니다(기출).
변환과 시각화
- MinMax는 [0,1], Standard는 평균 0·표준편차 1, Robust는 중앙값·IQR 기준. Box-Cox는 양수만, Yeo-Johnson은 음수도 가능. 거듭제곱 변환에서 λ=0 이면 로그.
- 범주형: One-Hot(k개) · 더미(k−1) · Label · Target · Frequency · Hashing. 회귀에서 더미를 k개 다 넣으면 완전 공선성.
- 바이올린은 박스플롯+KDE, 줄기-잎은 분포와 값을 함께, 평행좌표는 다차원 패턴·군집, Q-Q plot 은 정규성을 눈으로.
확률과 통계2-1 ~ 2-8
분포 — 평균과 분산
| 분포 | 무엇을 세는가 | E(X) | V(X) |
|---|---|---|---|
| 베르누이(p) | 한 번의 시행, 0 또는 1 | p | p(1−p) |
| 이항(n,p) | n번 중 1이 나온 횟수 | np | np(1−p) |
| 푸아송(λ) | 단위 시간·공간의 사건 수 | λ | λ |
| 초기하 | 비복원 추출에서 성공 수 | 비복원이면 이항이 아니다 | |
| 지수(λ) | 다음 사건까지의 시간. 무기억성 | 1/λ | 1/λ² |
| 감마 | α번째 사건까지의 시간(지수의 일반화) | α=1 이면 지수 | |
| 카이제곱(n) | 표준정규 n개의 제곱합. 감마의 특수한 경우 | n | 2n |
| t(k) | 모분산을 모를 때 표본평균. 자유도↑ → 정규분포 | 0 | k/(k−2) |
| F | 카이제곱 둘의 비. 분산 비교·ANOVA | 비대칭, 양측 검정의 p 는 한쪽 확률의 2배 | |
가설검정의 말
- 1종 오류(α): H0 가 참인데 기각. 2종 오류(β): H0 가 거짓인데 기각 못함. 검정력은 1−β. 표본이 늘면 둘 다 줄어드는 경향.
- p-value < α 이면 H0 기각. 신뢰수준은 1−α. 정규성 검정의 귀무가설은 「정규분포를 따른다」다.
- 베이즈: P(A|B) = P(B|A)·P(A) / P(B). 사전확률 · 우도 · 증거 · 사후확률 이름을 매칭할 것.
검정 선택표
| 비교 | 모수 | 비모수 |
|---|---|---|
| 한 집단 평균 vs 기준값 | 1표본 t (모분산을 알면 z) | 부호검정 · 윌콕슨 부호순위 |
| 같은 집단 전·후 (대응) | 대응표본 t · 자유도 n−1 | 윌콕슨 부호순위 |
| 독립 두 집단 | 독립표본 t (이분산이면 Welch) | 윌콕슨 순위합 = Mann-Whitney U |
| 독립 세 집단 이상 | 일원 ANOVA (F) | Kruskal-Wallis |
| 같은 대상 반복 측정 | 반복측정 ANOVA (구형성) | Friedman |
| 범주형 두 변수 | 카이제곱 — 적합도 df=범주−1 · 독립성 df=(r−1)(c−1) · 동질성. 기대도수 ≥ 5, 아니면 Fisher | |
| 상관 | Pearson | Spearman · Kendall |
| 무작위성 | — | Run 검정 |
| 등분산 | Bartlett (정규성 필요) | Levene (정규성 불필요) |
| 정규성 | Shapiro-Wilk(소표본) · Kolmogorov-Smirnov(대표본) · Jarque-Bera · Anderson-Darling · Q-Q plot | |
회귀와 분산분석
- 가정은 선형성·독립성·등분산·정규성, 거기에 독립변수 간 다중공선성 없음. 진단은 VIF(통상 10 초과면 의심), 상관행렬.
- SST = SSR + SSE, R² = SSR/SST = 1 − SSE/SST. 모형 유의성은 F-검정. 영향점은 레버리지 · Cook's distance · DFFITS · DFBETAS.
- AIC = −2lnL + 2p, BIC = −2lnL + p·ln n — 낮을수록 좋고 BIC 가 표본 수까지 벌점. 변수 선택은 전진·후진·단계적이며 PCA 는 변수 선택이 아니다. Mallow's Cp 는 p+1 에 가까운 것.
- 오즈 = p/(1−p), 오즈비 = exp(β). 로지스틱 회귀의 계수 해석은 한 단위 증가 시 오즈가 exp(β)배.
- ANOVA 는 정규·등분산·독립. 표본 수가 같을 필요는 없다. 요인이 둘이면 이원분산분석, 요인의 효과가 다른 요인의 수준에 따라 달라지면 교호작용(교호항마다 관측 2개 이상). 사후검정은 Tukey HSD 등.
머신러닝 일반3-1 ~ 3-4
- 모수 모델은 분포·함수형을 가정하고 계수를 학습(선형·로지스틱·신경망), 비모수 모델은 가정 없이 데이터로(결정트리·KNN).
- 일반화가 목표다. 과대적합 대응: 규제(L1·L2), 조기 종료, 드롭아웃, 데이터 증가, 앙상블, 교차검증, 변수 축소.
- 검증: hold-out · K-fold · Stratified(타깃 분포 유지) · Group(학습에 없는 범주를 평가에) · 시계열(T 이전 학습, T 이후 평가) · LOOCV. 데이터가 적고 정밀한 검증이 필요하면 교차검증.
- 하이퍼파라미터는 그리드·랜덤·베이지안 탐색, 매개변수는 경사하강법으로. 학습률이 크면 발산, 작으면 느림.
- 차원의 저주: 차원이 늘면 데이터가 희소해지고 거리의 변별력이 떨어져 과대적합 위험이 커진다. 대응은 변수 선택·차원축소·규제.
- 변수 선택 — Filter(통계 특성: 상관·카이제곱·정보이득) · Wrapper(모델로 탐색: RFE·전진·후진·유전알고리즘) · Embedded(모델에 내장: Lasso·Ridge·Elastic Net·트리 중요도).
- 클래스 불균형 — 언더샘플링(랜덤·Tomek link·CNN·OSS), 오버샘플링(랜덤·SMOTE·Borderline·ADASYN), 비용 함수(소수 클래스 손실 가중치를 더 크게), 임계값 이동, 앙상블. SMOTE 는 소수 클래스 이웃 사이를 선형 보간해 합성하며 클래스 수를 정확히 맞추는 것은 아니다. MCMC 는 불균형과 무관.
지도학습4-1 ~ 4-5
- Ridge(L2)는 계수를 줄이지만 0 으로 만들지 않고 닫힌 해가 있다. Lasso(L1)는 일부 계수를 정확히 0 으로 만들어 변수 선택 효과가 있고 닫힌 해가 없다(좌표하강). Elastic Net은 둘의 혼합. 람다가 클수록 규제가 강하다.
- GLM: 반응변수 분포에 맞는 연결함수 — 이항은 logit(로지스틱 회귀), 푸아송은 log. 종속변수의 정규성이 없어도 쓴다.
- 결정트리: 지니 = 1 − Σp², 엔트로피 = −Σp·log p, 정보이득이 큰 분할. 깊이를 키우면 과대적합 → 가지치기. 스케일링 불필요.
- 나이브 베이즈는 특징 간 조건부 독립 가정, 라플라스 스무딩. KNN은 지도학습이며 학습이 없는 lazy 모델, K 가 작으면 과대적합, 스케일링 필수.
- SVM: 마진 최대화, 서포트 벡터만 결정에 관여. C 가 크면 마진이 좁고 과대적합, 비선형은 커널 트릭(RBF·poly)으로 고차원 매핑 없이 계산. 스케일링 필수.
- 배깅: 부트스트랩 표본으로 병렬 학습해 분산을 줄임. 랜덤 포레스트는 배깅 + 노드마다 변수 무작위 선택, 분류와 회귀(트리 예측 평균) 모두 가능, OOB 평가.
- 부스팅: 순차 학습으로 편향을 줄임. AdaBoost는 이전 모델이 틀린 샘플의 가중치를 올리고, 약한 학습기는 「랜덤보다 약간 나은」 모델이며 신뢰도로 가중합한다. Gradient Boosting은 잔차(손실의 음의 기울기)에 다음 트리를 맞춘다. XGBoost는 정규화·2차 근사·subsample·colsample 을 더한 것.
- Voting은 hard(다수결)·soft(확률 평균), Stacking 은 메타 모델.
분류 지표
| 지표 | 식 | 뜻 |
|---|---|---|
| 정확도 | (TP+TN) / 전체 | 맞춘 비율. 불균형에 약하다 |
| 정밀도 | TP / (TP+FP) | 양성으로 예측한 것 중 진짜 양성 |
| 재현율 · 민감도 | TP / (TP+FN) | 실제 양성 중 찾아낸 비율 |
| 특이도 | TN / (TN+FP) | FP rate = 1 − 특이도 |
| F1 | 2PR / (P+R) | 정밀도·재현율의 조화평균. macro 는 클래스별 F1 의 단순 평균 |
| ROC · AUC | x=FPR, y=TPR | 왼쪽 위에 붙을수록 좋다. 0.5 는 무작위, 1.0 은 완벽 |
연관규칙
- 지지도 = P(A∩B), 신뢰도 = P(B|A), 향상도 = P(B|A)/P(B). 향상도 >1 양의 관계, =1 독립, <1 음의 관계. Apriori · FP-Growth.
비지도학습5-1 ~ 5-3
- K-means: SSE(distortion)는 반복마다 증가하지 않고 수렴하지만 초기값에 따라 결과가 달라진다(K-means++). 구형·비슷한 크기·비슷한 밀도를 가정해 이상치·밀도 차·비볼록 군집에 약하다.
- K-medoids는 중심을 실제 데이터 점으로 잡아 이상치에 강건하다.
- 계층적 군집: 단일(최단) 연결은 사슬 효과, 완전(최장) 연결은 지름이 작은 군집, 평균 연결, 중심 연결, Ward(분산 증가 최소). 덴드로그램을 자르는 높이로 군집 수 결정.
- DBSCAN: eps 와 min_samples 두 개, 핵심·경계·잡음 점. 군집 수를 정하지 않아도 되고 비구형도 찾으며 잡음을 분리한다. 밀도 차가 큰 데이터에는 약하다.
- 평가: 실루엣(−1~1, 클수록 좋음), Dunn(군집 간 최소거리 / 군집 내 최대거리), Davies-Bouldin(낮을수록 좋음), elbow.
- 차원축소: PCA(분산 최대 축, 비지도, 스케일링 필요) · 요인분석(잠재요인, 개수는 분석 중 결정, 요인은 대등) · LDA(지도, 클래스 간 분산 / 클래스 내 분산 최대화) · MDS(거리 보존) · t-SNE(시각화용, 비선형) · SVD · PLS.
- 이상탐지: Isolation Forest 는 무작위 분할로 한 점이 고립되는 경로가 짧을수록 이상치(비지도·앙상블). LOF 는 이웃 대비 밀도. One-Class SVM, Autoencoder 재구성 오차.
딥러닝 (필기만)6-1 ~ 6-3
- 단일 퍼셉트론은 선형 분리만(XOR 불가). 3클래스 이상은 다층 퍼셉트론·RNN·CNN 에 softmax 를 쓰면 가능하고, 오토인코더는 분류 모델이 아니다.
- 활성화: 비선형 활성화가 없으면 층을 쌓아도 하나의 선형 변환이다(그래서 쓴다). sigmoid·tanh 는 기울기 소실, ReLU 는 dying ReLU. 출력층은 이진 sigmoid, 다중 softmax — ReLU 는 부적절. 다중 분류 라벨은 원-핫.
- 학습: 역전파, 경사하강법(SGD·Momentum·RMSProp·Adam). 과대적합 방지는 규제·드롭아웃·배치 정규화·조기 종료·Max pooling. 기울기 소실은 역전파에서 기울기가 매우 작아지는 현상.
- CNN: 합성곱·풀링. 출력 크기 = ⌊(W − K + 2P) / S⌋ + 1.
- RNN: 시퀀스, 긴 의존성은 LSTM(게이트)·GRU 로. Autoencoder: 인코더–디코더, 차원축소·잡음 제거·이상탐지.
파라미터 수 (엑셀 메모에 있던 항목)
| 층 | 식 | 예 |
|---|---|---|
| Dense | (입력 + 1) × 출력 | 10→5 = 55 |
| Conv2D | (K×K×입력채널 + 1) × 필터 수 | 3×3, 3→16 = 448 |
| SimpleRNN | (입력 + 은닉 + 1) × 은닉 | 입력 8, 은닉 16 = 400 |
| LSTM | SimpleRNN 의 4배 | = 1,600 (GRU 는 3배, Keras 기본은 편향이 하나 더 있어 약간 큼) |
자가점검엑셀 「필기 기출」에서 고른 20문항 · 눌러서 답 확인
엑셀 해설 중 KNN 을 「비지도」라 적은 곳이 있었는데 KNN 은 지도학습이라 아래에서는 바로잡았다.
1차원의 저주에 해당하는 설명은? (a) 피처를 더 쓰면 항상 정확도가 오른다 (b) 차원이 커질수록 데이터가 희소해지고 거리가 멀어져 과대적합 위험이 커진다 (c) 차원이 커질수록 임의의 두 점 사이 거리가 가까워진다 (d) 고차원에서는 과대적합이 일어나기 어렵다
23개 클래스를 구별할 수 있는 신경망을 모두 고르면? 퍼셉트론 · 다층 퍼셉트론 · 순환 신경망 · 오토인코더 · 합성곱 신경망
3선형 분리가 안 될 때 데이터를 고차원으로 옮겨 최적의 초평면을 찾는 SVM 기법은? 커널 트릭 · 보로노이 분할 · 평균 이동 · 로버스트 피팅
4비용 함수 기반 불균형 처리에서 소수 클래스의 손실 가중치를 다수 클래스보다 작게 준다. O / X
5랜덤 포레스트 설명으로 틀린 것은? (a) 학습 데이터 일부를 뽑아 트리를 만든다 (b) 결정트리 기반 앙상블이다 (c) 트리가 독립이라 멀티코어에서 빠르다 (d) 분류만 되고 회귀는 안 된다
6AdaBoost 설명 중 틀린 것은? (a) 다음 모델은 이전 모델이 틀린 샘플에 가중치를 준다 (b) weak learner 는 랜덤 분류기보다 약간 더 나쁜 모델이다 (c) 분류기의 신뢰도로 가중합해 sign 을 정한다
7정규성 검정에 쓰지 않는 것은? QQ plot · Shapiro-Wilk · Kolmogorov-Smirnov · Levene
8Mann-Whitney U 검정 설명으로 옳지 않은 것은? (a) 순위합 검정이라고도 한다 (b) 두 집단의 독립성을 가정한다 (c) 두 집단의 정규성을 가정한다
9라쏘 회귀에 대해 맞는 것은? (a) 영향이 적은 변수의 계수가 0 이 되어 변수 선택 효과가 있다 (b) 람다가 커지면 규제가 줄어든다 (c) 쓰면 항상 정확도가 오른다 (d) 닫힌 해가 존재한다
10단일연결(single linkage) 계층적 군집. 거리: A-B 1, A-C 2, A-D 3, A-E 4, B-C 3, B-D 4, B-E 5, C-D 4, C-E 5, D-E 1. 군집 2개일 때의 군집은?
11한 학년의 중간고사·기말고사 점수 평균 차이를 검정하려 한다. 가장 적당한 것은?
1210개의 쌍으로 된 두 집단의 평균 차이를 대응표본 t 로 검정할 때 자유도는?
130~9 숫자 이미지 분류에 적합하지 않은 모델은? CNN · KNN · 다층 퍼셉트론 · 오토인코더
14이미지 분류 CNN 의 출력층 활성화로 적절하지 않은 것은? Sigmoid · Softmax · ReLU
15지수분포(λ=1)에 대해 옳지 않은 것은? (a) 평균은 1 (b) 분산은 1 (c) 0≤x≤1 구간의 면적은 1 (d) x→∞ 에서 값은 0 으로 수렴
16일원분산분석의 특징 중 틀린 것은? (a) 모분산이 같아야 한다 (b) 샘플 개수가 같아야 한다 (c) 독립이어야 한다 (d) 정규분포여야 한다
17K-means 의 distortion function(군집 내 제곱거리 합)은 반복 중 절대 증가하지 않는다. O / X
18세제 3종 × 세탁수 온도 3종으로 남은 먼지량을 측정했다. 각 세팅을 비교하는 검정은?
19DBSCAN 설명으로 옳지 않은 것은? (a) 이상치 탐지에 쓸 수 있다 (b) 지역적 밀도를 이용한다 (c) 직선으로 분리 안 되는 그룹도 군집화한다 (d) 군집 개수를 지정해야 한다
20랜덤 오버샘플링으로 옳은 것은? (a) SMOTE·ADASYN 의 고도화판이다 (b) 소수 클래스의 개수를 늘린다 (c) 중복 없이 과대적합을 막는다 (d) 정보 손실이 생긴다
실기
무엇이 얼마나 자주 나왔는지 세고, 그 순서대로 손에 익힌다. 코드는 이 페이지를 만들면서 직접 실행해 확인한 것만 실었다.
출제 빈도샘플 8세트의 소문항 268칸에서 키워드 집계
막대는 8개 샘플 세트 중 몇 세트에 나왔는지, 오른쪽 숫자는 소문항 칸에서 등장한 횟수. 8세트는 제조 공정 · 전자제품 구매 · 페이먼트 앱 · 스마트폰 센서 · 스마트폰 만족도 · 스마트팩토리 · 태양광 · 조리 품질. 키워드 일치로 센 것이라 한 칸이 두 항목에 걸릴 수 있다.
읽는 법. 데이터 분할·정규화·선형회귀는 8세트 모두에 있다. 문제 하나하나는 전처리(분할·결측·스케일링)가 앞에 깔리고 뒤에 모델·검정이 붙는 구조라, 전처리가 틀리면 뒤가 전부 틀린다. 「계산」은 라이브러리 호출이 아니라 식을 직접 쓰는 문항(신뢰구간·거리·지표)이다.
회차별 출제 기록엑셀 「실기 - 유형 분석」 후기 · 날짜순
| 회차 | 기록 |
|---|---|
| 2025-06-13 | np.matmul, np.linalg.inv 직접 · K-S 검정(표준화 필요) · Box-Cox · 병합적 군집 · IsolationForest · PCA 로 유의미한 변수 선택 |
| 2025-07-18 | 배점 6·8·10·8·8 / 20. 21 카이제곱·t-test(일별 누적값이 처음 기준을 넘는 날짜) · 22 백테스트 split 14개 + 랜덤포레스트 + MSE 가중평균 · 23 DBSCAN·KNN·실루엣으로 최적 모델, 코사인 유사도 · 24 카테고리별 R·F·M 8개씩(없으면 R=999, F·M=0) + L1 로지스틱(C=1/λ, class_weight) · 25 degree 연결중심성, VIF |
| 2025-08-22 | 6·8·8·8·10. 21 CV 계산 → Bartlett → Kruskal, 4개 조합 중 점추정이 가장 큰 것의 90% 신뢰구간 길이 · 22 이웃 변수로 결측 처리(현재·이웃 변수 1·2·3분위수), SSD 감소량 = 1 − SSD(k+1)/SSD(k) 중 0.5 가 최소가 되는 k · 23 다항 로지스틱 coef_ 평균, XGB 2개 비교(subsample 0.7, colsample_bytree) · 24 complete/incomplete 분리, 각도 계산 전처리 · 25 SVD 24→4차원, SVC 커널(poly·rbf·sigmoid) · 26 캐글 Macro F1 |
| 2025-10-17 | 21 Levene → p 값에 따라 일원분산분석 또는 Kruskal · 22 정규분포 PDF 유사 공식으로 치환 · 23 KMeans + Dunn index 직접 계산(pdist, cdist) · 24 다중 분류, Inverted Weighted F1 · 25 별도 회귀식이 주어진 다항 선형회귀 · 26 회귀 RMSE(20점). 필기 단서: 레이블 인코딩, LDA 강/약, 쌍 데이터 검정 |
| 2025-11-15 | 8×5 / 20. 21 P(A∩B) / (P(A)·P(B)) 지표, 자카드 거리 · 22 16개 PCA · 23 DBSCAN metric='precomputed' · 24 Decision Tree · 25 do_simul 구현 · 26 F1 |
| 2025-12-12 | t.ppf 로 α/2, β 계산 |
| 2026-01-23 | 1 ttest_rel 단측 · 3 군집분석 · 4 Lasso · 5 AdaBoost |
월별 메모(연도 미기재): 2월 RF · DBSCAN 이상치 · min_samples · Bartlett · Random Over Sampler F1 · MAPE · 병합 군집(최장 거리) · KNN · Lasso/Ridge 규제식 / 4월 경사하강법·learning rate · Shapiro · Mann-Whitney U · PCA 후 inverse 복구 · 조건부 확률 / 8월 p-value·chi2 · KNN macro precision · AIC 후진선택 · Dunn index · XGBoost / 10월 신뢰구간 · KMeans 유클리드 · AUC · RMSE·MAE / 11월 사용 비율 · DBSCAN+Kmeans · PCA 후 MAPE · 오버샘플링+엔트로피 · weight 앙상블 F1.
캐글형 26번 — 20점연습 9세트 기록과 전략
| 세트 | 지표 | 처리 | 모델 | 내 점수 |
|---|---|---|---|---|
| lv3-1 | Macro Recall | 불균형 SMOTE | XGB · RF · GB · KNN → Voting | 0.95 이상 |
| lv3-2 | MAE | 표준화 | 선형회귀 · KNN · RF · ADA · XGB · XGB+변수선택 · XGB+PCA | — |
| lv3-3 | Precision | SMOTE · 표준화 | 로지스틱 · KNN · RF · ADA · XGB, RF+XGB+변수선택, XGB 2개 + RF 1개 | 0.76 |
| lv3-4 | Macro F1 | 결측 선형회귀 · 그룹별 중앙값, 표준화, ROS | 결정트리 · XGB | 0.933 |
| lv3-5 | F1 | 결측 RF · 중앙값 | XGB | 0.82 |
| lv3-6 | F1 | SMOTE | DTC · LR · ADA · XGB | 0.80 |
| lv3-7 | RMSE | 결측 중앙값 | DTC · XGB | — |
| lv3-8 | R² | — | XGB | 0.54 |
| lv3-9 | R² | 이상치 제거 · 표준화 | XGB | 0.43 |
다른 응시자 후기: SMOTE + XGB + GridSearch 로 캐글 14/20. 실기 21~25번에서는 새 유형이 거의 없었고, 캐글은 F1 macro 라서 SMOTE 를 했고 22번의 「영향도 기반 이상치 탐지 후 제거」가 주효했다고 한다.
회귀 지표에 따른 방향
MAE 전반적 정확도, 이상치에 둔감 → 전체 오차를 줄이는 쪽. MAPE 상대 오차, 0 값 주의 → 로그 변환·비율 기반. RMSE 큰 오차에 민감 → 이상치 처리 + 강한 회귀 모델. R² 설명력 → 피처 공학과 적합한 모델 선택.
분류 지표에 따른 방향
샘플링 전/후를 비교하고(변수명을 구분해 둘 것), 확률 임계값(threshold)을 정하기 전/후도 비교한다. 결측은 선형회귀·중앙값·평균. Macro 지표는 소수 클래스까지 똑같이 반영하므로 불균형 처리가 곧 점수다.
진행 순서 (엑셀 메모 그대로)
y = train['target']; X = train.drop(columns=['target'])
all_ = pd.get_dummies(pd.concat([X, test.drop(columns=['id'])]), drop_first=True) # 원-핫은 합쳐서, id 는 변수가 아니다
X, Xt = all_.iloc[:len(X)], all_.iloc[len(X):]
med = X.median(); X = X.fillna(med); Xt = Xt.fillna(med) # 대치값은 train 기준
X_tr, X_va, y_tr, y_va = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
model = XGBClassifier(n_estimators=300, learning_rate=0.1, max_depth=4, random_state=42)
model.fit(X_tr, y_tr)
for name, (a, b) in {'train': (X_tr, y_tr), 'valid': (X_va, y_va)}.items():
print(name, f1_score(b, model.predict(a), average='macro')) # 지표는 지문대로
pd.DataFrame({'id': test['id'], 'pred': model.predict(Xt)}).to_csv('result.csv', index=False) # 제출 형식은 지문대로
코드 레시피scikit-learn 1.7 · SciPy 1.15 · statsmodels · imbalanced-learn 에서 실행 확인
XGBoost 호출만 로컬 환경에 OpenMP 가 없어 실행하지 못했다(표준 API). 나머지는 합성 데이터로 돌려서 결과를 대조했다.
전처리 · 분할8세트 모두에 나옴
import numpy as np, pandas as pd
from sklearn.preprocessing import StandardScaler, MinMaxScaler, PowerTransformer
from sklearn.model_selection import train_test_split
from scipy import stats
df.duplicated(subset=['id'], keep='first').sum() # 중복 개수
df = df.drop_duplicates(subset=['id'], keep='last') # keep: 'first' | 'last' | False
df['x'] = df['x'].fillna(df['x'].median()) # 한 열
df[cols] = df[cols].fillna(df[cols].mean()) # 여러 열
df['x'] = df.groupby('g')['x'].transform(lambda s: s.fillna(s.median())) # 그룹별 중앙값
df['d'] = pd.to_datetime(df['d']) # day 인지 yymmdd 인지: format='%y%m%d'
df['dow'] = df['d'].dt.dayofweek # 월=0 … 일=6, 주말은 >= 5
pd.get_dummies(df, columns=['cat'], drop_first=True)
z_pd = (s - s.mean()) / s.std() # pandas 의 std 는 ddof=1
z_sk = StandardScaler().fit_transform(s.to_frame()) # sklearn 은 ddof=0 → 두 값이 다르다
MinMaxScaler(feature_range=(0, 1)) # 범위가 지정되면 그대로
stats.boxcox(x) # (변환값, λ), 양수만
PowerTransformer(method='yeo-johnson') # 음수 가능
q1, q3 = s.quantile([.25, .75]); iqr = q3 - q1
mask = (s < q1 - 1.5*iqr) | (s > q3 + 1.5*iqr) # IQR 이상치
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)
# 지문이 「정렬 후 앞 70%」면 shuffle=False 나 iloc — 지문이 우선
검정 · 신뢰구간scipy.stats
from scipy import stats stats.shapiro(a) # 귀무: 정규분포. 표본이 많으면 stats.kstest(표준화값, 'norm') stats.levene(a, b, c) # 등분산. center='median' 이 기본이라 정규성 불필요 stats.bartlett(a, b, c) # 등분산. 정규성 가정 stats.ttest_1samp(a, popmean=0) stats.ttest_ind(a, b, equal_var=True) # 이분산이면 equal_var=False (Welch) stats.ttest_rel(before, after, alternative='less') # 대응·단측: 「before 평균 < after 평균」이 대립가설 stats.f_oneway(a, b, c) # 일원 ANOVA stats.kruskal(a, b, c) # 비모수 대안 stats.mannwhitneyu(a, b); stats.wilcoxon(x, y) tab = pd.crosstab(df['a'], df['b']) chi2, p, dof, exp = stats.chi2_contingency(tab, correction=False) # 2x2 는 기본이 Yates 보정(True) stats.chisquare(f_obs, f_exp) # 적합도 n, m, sd = len(a), a.mean(), a.std(ddof=1) stats.t.interval(0.95, df=n-1, loc=m, scale=stats.sem(a)) # 95% 신뢰구간 h = stats.t.ppf(0.975, n-1) * sd / np.sqrt(n) # 직접 쓰면 (m - h, m + h) stats.norm.pdf(x, loc=0, scale=1); stats.norm.cdf(1.96); stats.norm.ppf(0.975)
회귀 · ANOVAstatsmodels · 절편 주의
import statsmodels.api as sm, statsmodels.formula.api as smf
X = sm.add_constant(df[['x1', 'x2']]) # add_constant 를 안 하면 절편이 없다
m = sm.OLS(df['y'], X).fit()
m.params; m.pvalues; m.rsquared; m.aic; m.bic; m.fvalue
smf.ols('y ~ x1 + x2', data=df).fit() # formula 는 절편이 자동 포함
smf.ols('y ~ x1 + x2 - 1', data=df).fit() # 「절편 제외」
sm.stats.anova_lm(smf.ols('value ~ C(group)', data=df).fit(), typ=2) # 일원 ANOVA 표
smf.ols('v ~ C(a) * C(b)', data=df).fit() # 이원 + 교호작용
from statsmodels.stats.outliers_influence import variance_inflation_factor
[variance_inflation_factor(X.values, i) for i in range(1, X.shape[1])] # 0번은 const
# AIC 후진선택: 변수를 하나씩 뺀 모델의 aic 를 비교해 가장 작아지는 변수를 제거, 더 안 줄면 중단
from sklearn.linear_model import LinearRegression, Ridge, Lasso
LinearRegression(fit_intercept=False) # 절편 제외
Ridge(alpha=1.0); Lasso(alpha=0.1) # 문제가 준 규제식과 sklearn 목적함수의 스케일이 다를 수 있다
군집 · 이상치KMeans · DBSCAN · Dunn · IF · LOF
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering
from sklearn.metrics import silhouette_score
from scipy.spatial.distance import pdist, cdist, squareform
km = KMeans(n_clusters=3, random_state=42, n_init=10).fit(X)
km.labels_; km.cluster_centers_; km.inertia_ # inertia_ = 군집 내 제곱거리 합
silhouette_score(X, km.labels_)
DBSCAN(eps=0.5, min_samples=5).fit(X).labels_ # min_samples 에 자기 자신 포함, 잡음은 -1
DBSCAN(eps=0.5, min_samples=5, metric='precomputed').fit(squareform(pdist(X))) # 거리행렬을 직접 줄 때
AgglomerativeClustering(n_clusters=3, linkage='complete') # 최장 complete · 최단 single · average · ward
def dunn(X, lab): # 군집 간 최소거리 / 군집 내 최대거리
ks = np.unique(lab)
inter = min(cdist(X[lab == a], X[lab == b]).min() for i, a in enumerate(ks) for b in ks[i+1:])
intra = max(pdist(X[lab == k]).max() for k in ks if (lab == k).sum() > 1)
return inter / intra
from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor
IsolationForest(contamination=0.05, random_state=42).fit_predict(X) # -1 이 이상치
LocalOutlierFactor(n_neighbors=20, contamination=0.05).fit_predict(X) # -1 이 이상치
PCA · SVD차원 수는 지문 확인
from sklearn.decomposition import PCA pca = PCA(n_components=2).fit(Xs) # 스케일링 후 pca.explained_variance_ratio_; pca.components_ Xr = pca.inverse_transform(pca.transform(Xs)) # 복원 ((Xs - Xr) ** 2).mean() # 재구성 오차 U, S, Vt = np.linalg.svd(Xs - Xs.mean(0), full_matrices=False) # PCA = 중심화 후 SVD Z = (Xs - Xs.mean(0)) @ Vt[:k].T # k 차원으로 축소 (np.matmul, np.linalg.inv 를 직접 쓰라는 문제도 있었다)
모델 · 불균형 · 튜닝 · 지표캐글과 22~25번
from imblearn.over_sampling import SMOTE, RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
X_res, y_res = SMOTE(random_state=42).fit_resample(X_tr, y_tr) # train 에만. valid·test 는 그대로
from sklearn.model_selection import GridSearchCV, StratifiedKFold
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, VotingClassifier
from xgboost import XGBClassifier
xgb = XGBClassifier(n_estimators=300, learning_rate=0.1, max_depth=4,
subsample=0.7, colsample_bytree=0.7, random_state=42)
gs = GridSearchCV(xgb, {'max_depth': [3, 5], 'learning_rate': [0.05, 0.1]},
scoring='f1_macro', cv=StratifiedKFold(5, shuffle=True, random_state=42), n_jobs=-1)
gs.fit(X_tr, y_tr); gs.best_params_, gs.best_score_ # 「선정한 모형을 재학습시키지 마라」 같은 지문이 있다
vote = VotingClassifier([('xgb', xgb), ('rf', RandomForestClassifier(random_state=42))], voting='soft')
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(penalty='l1', solver='liblinear', C=1/lam, class_weight={0: 1, 1: w}) # C = 1/λ
np.exp(lr.coef_) # 오즈비. 다중 클래스의 coef_ 는 (클래스, 변수)
# sklearn 1.8 부터 penalty 는 deprecated → l1_ratio=1 (공식 문서 기준)
from sklearn.metrics import (f1_score, precision_score, recall_score, roc_auc_score,
mean_absolute_error, mean_absolute_percentage_error, root_mean_squared_error, r2_score)
f1_score(y, p, average='macro') # macro = 클래스별 F1 의 단순 평균
roc_auc_score(y, proba[:, 1]) # 이진
roc_auc_score(y, proba, multi_class='ovr') # 다중 클래스. 0 번 확률은 proba[:, 0]
mean_absolute_percentage_error(y, p) # 0.1 = 10% (퍼센트가 아니라 비율)
root_mean_squared_error(y, p) # 구버전이면 np.sqrt(mean_squared_error(y, p))
자주 나온 계산RFM · 백테스트 · 중심성 · 거리
t.pivot_table(index='cust', columns='cat', values='days', aggfunc='min', fill_value=999) # 없는 칸은 R=999, F·M=0 from sklearn.model_selection import TimeSeriesSplit list(TimeSeriesSplit(n_splits=14).split(X)) # 백테스트: 시간 순서 유지, 미래가 학습에 들어가지 않는다 import networkx as nx nx.degree_centrality(G) # 정규화됨 = 차수 / (n-1). G.degree(v) 는 그냥 차수 from sklearn.metrics.pairwise import cosine_similarity from scipy.spatial.distance import jaccard, cdist cdist(A, B, metric='minkowski', p=3) # 유클리드는 p=2, 맨해튼은 p=1
버전·기본값 함정공식 문서에서 직접 확인
| 대상 | 실제 동작 | 문서 |
|---|---|---|
| DBSCAN | min_samples는 자기 자신을 포함한다. 기본 eps=0.5, min_samples=5. 잡음 라벨은 −1. | sklearn |
| KMeans | n_init 기본값이 1.4 부터 'auto'(k-means++ 이면 1회). 예전 기본(10회)과 결과가 다를 수 있으니 값을 명시한다. | sklearn |
| IsolationForest | 이상치는 −1, 정상은 +1. score_samples는 낮을수록 이상. random_state 없으면 매번 다르다. | sklearn |
| LogisticRegression | C 는 규제의 역수(기본 1.0). 1.8 문서에서는 penalty가 deprecated, L1 은 l1_ratio=1. 다중 클래스 L1 은 liblinear 가 아니라 saga. | sklearn |
| MAPE | 비율로 반환(0.5 = 50%). y_true 가 0 이면 아주 큰 값이 나온다. | sklearn |
| RMSE | mean_squared_error에 squared 인자가 더는 없다. root_mean_squared_error를 쓰거나 np.sqrt. | sklearn |
| chi2_contingency | correction=True가 기본이며 자유도가 1(2×2)일 때만 Yates 보정이 적용된다. | scipy |
| levene | center='median'이 기본(치우친 분포 권장). Bartlett 은 정규성 가정. | scipy |
| 표준편차 | pandas std()는 ddof=1, numpy std()와 StandardScaler는 ddof=0. Z-score 값이 달라진다. | 직접 실행 |
| statsmodels OLS | sm.OLS는 절편을 넣지 않는다(add_constant). formula API 는 자동 포함, - 1 로 제외. | 직접 실행 |
제출 전 체크리스트0 / 0
엑셀 「실수정리」 — 시험에서 실제로 틀렸거나 틀릴 뻔한 것들. 풀이를 마친 뒤 위에서부터 훑는다.
6주 계획
시험일에서 거꾸로 센 주차. 필기 28차시는 앞 5주에 나눠 담고, 마지막 주는 시간을 재고 실기를 통째로 푼다. 시험일이 아직이면 1~6주차로만 보인다.
출처와 한계
무엇이 어디서 왔는지, 무엇을 못 찾았는지.
- 본인 엑셀 personal/datasciencelevel3/DS_LV3.xlsx — 「DS3 범위」「실기 - 유형 분석」「빅분기마무리」(캐글 전략·실수정리)「필기」「필기 기출」「필기 요약」「용어 정리」「통계분석, 가설검정」「카테고리 정리」. 시험 구조·회차 기록·점수는 전부 이 파일이다.
- 찾지 못한 것 삼성전자 DS 데이터사이언스 인증 Level 3 의 공식 요강·합격 기준·접수 일정. 검색으로는 채용 전형(GSAT 등) 자료만 나왔고 이 인증을 다룬 공개 글은 없었다. 사내 안내를 확인할 것.
- 공식 문서로 확인 DBSCAN · KMeans · IsolationForest · LogisticRegression · MAPE · mean_squared_error · chi2_contingency · levene
- 직접 실행해 확인 위 코드 레시피 전부(scikit-learn 1.7.2, SciPy 1.15, statsmodels, imbalanced-learn, networkx). XGBoost 호출과 시험장 환경의 버전은 확인하지 못했다.
- 엑셀 해설의 오류 「필기 기출」 일부 해설(KNN 을 비지도라 한 곳 등)은 틀려서 자가점검에서 바로잡았다. 엑셀의 GPT 풍 해설은 그대로 믿지 말 것.
- 유형 빈도는 시트 셀의 키워드 일치로 센 것이라 정확한 문항 통계가 아니다. 방향을 보는 용도.