2026년 데이터 사이언스 면접 질문 25선
통계, 머신러닝, 피처 엔지니어링, 딥러닝, SQL, 시스템 설계를 망라하는 데이터 사이언스 면접 질문 25선 — Python 코드 예제와 심층 해설 포함.

2026년 데이터 사이언스 면접은 교과서적 정의를 넘어 훨씬 깊은 수준을 요구합니다. 채용팀은 통계적 추론 능력, 피처 엔지니어링 트레이드오프 판단력, 단순 정확도를 넘어선 모델 평가 역량, 그리고 비즈니스 문제를 분석 파이프라인으로 전환하는 능력을 집중적으로 검증합니다. 이 가이드는 스타트업부터 FAANG까지 다양한 기업의 데이터 사이언티스트 면접에서 반복적으로 등장하는 25개 질문을 정리합니다.
데이터 사이언스 면접은 세 가지 차원을 평가합니다. 통계적 기반(확률, 가설 검정, 분포), 머신러닝 메커니즘(편향-분산, 정규화, 트리 앙상블), 그리고 응용 판단력(피처 선택, 지표 선택, 이해관계자에게 결과 전달). 우수한 지원자는 이론과 실제 비즈니스 임팩트를 연결해 설명합니다.
확률과 통계 기초
Q1: 동전을 10번 던져 8번 앞면이 나왔습니다. 이 동전은 편향되어 있습니까?
직관적으로는 "그렇다"고 답하기 쉽지만, 엄밀한 접근은 이항 검정(binomial test)을 적용하는 것입니다. 귀무가설(공정한 동전, p=0.5) 하에서 10번 중 8번 이상 앞면이 나올 확률은 약 5.5%로, 표준 유의수준 5%를 초과합니다. alpha = 0.05에서 이 동전을 편향되었다고 선언할 수 없습니다.
# binomial_test.py
from scipy import stats
# Two-sided binomial test: is the coin fair?
result = stats.binomtest(k=8, n=10, p=0.5, alternative='two-sided')
print(f"p-value: {result.pvalue:.4f}") # 0.1094 (two-sided)
print(f"Reject H0 at alpha=0.05? {result.pvalue < 0.05}") # False이 질문은 지원자가 직관에 의존하는지, 아니면 공식적인 가설 검정을 적용하는지 확인합니다. 면접관은 1종 오류와 2종 오류의 차이, 그리고 p=0.7의 편향을 80% 검정력으로 탐지하기 위한 표본 크기를 묻는 후속 질문으로 이어가는 경우가 많습니다.
Q2: 베이즈 추론과 빈도주의 추론의 차이를 설명하십시오.
빈도주의 추론은 모수를 고정된 미지수로 취급합니다. 95% 신뢰구간은 실험을 여러 번 반복했을 때 95%의 구간이 진정한 모수를 포함한다는 의미입니다. 베이즈 추론은 모수를 사전 분포를 가진 확률 변수로 취급하며, 베이즈 정리를 통해 사후 분포를 업데이트합니다. 95% 신뢰가능구간(credible interval)은 관측 데이터와 사전 분포를 고려할 때 모수가 해당 구간에 있을 확률이 95%라는 의미입니다.
# bayesian_vs_frequentist.py
import numpy as np
from scipy import stats
# Frequentist: confidence interval for a mean
data = np.array([23.1, 25.4, 22.8, 24.9, 23.7, 25.1, 24.3])
ci = stats.t.interval(0.95, df=len(data)-1, loc=np.mean(data), scale=stats.sem(data))
print(f"95% CI (frequentist): [{ci[0]:.2f}, {ci[1]:.2f}]")
# Bayesian: posterior with conjugate prior (Normal-Normal)
prior_mean, prior_var = 24.0, 4.0 # prior belief
data_mean, data_var = np.mean(data), np.var(data, ddof=1) / len(data)
# Posterior parameters (conjugate update)
post_var = 1 / (1/prior_var + 1/data_var)
post_mean = post_var * (prior_mean/prior_var + data_mean/data_var)
post_ci = stats.norm.interval(0.95, loc=post_mean, scale=np.sqrt(post_var))
print(f"95% credible interval (Bayesian): [{post_ci[0]:.2f}, {post_ci[1]:.2f}]")실무적 차이는 면접에서 중요합니다. 베이즈 방법은 사전 분포를 통해 도메인 지식을 반영하므로 데이터가 부족할 때 유리합니다. 빈도주의 방법은 가정이 적지만 신뢰할 수 있는 추론을 위해 더 큰 표본이 필요합니다.
Q3: 중심극한정리(CLT)가 실패하는 경우는 언제이며, 데이터 사이언스에서 왜 중요합니까?
CLT는 n이 커질수록 표본 평균이 정규 분포에 수렴함을 보장하지만, 이는 모집단의 분산이 유한할 때만 성립합니다. 두꺼운 꼬리 분포(코시 분포, alpha ≤ 2인 파레토 분포)는 이 가정을 위반합니다. 실무적으로는 금융 수익률 모델링, 네트워크 트래픽 분석, 극단적 이상치가 있는 도메인에서 영향을 미칩니다. 이런 경우 중앙값이나 절사 평균이 더 강건한 추정량이 됩니다.
피처 엔지니어링과 데이터 준비
Q4: 결측값이 모델 학습에 미치는 영향은 무엇이며, 단순 대체를 넘어선 전략에는 어떤 것이 있습니까?
결측 데이터 메커니즘이 올바른 전략을 결정합니다. MCAR(완전 무작위 결측)은 리스트와이즈 삭제를 편향 없이 허용합니다. MAR(무작위 결측)은 다중 대체 또는 모델 기반 접근법을 활용합니다. MNAR(비무작위 결측)은 결측 메커니즘 자체를 도메인 특화적으로 모델링해야 합니다.
# missing_data_strategies.py
import pandas as pd
from sklearn.impute import KNNImputer, SimpleImputer
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
df = pd.DataFrame({
'age': [25, 30, None, 45, None, 38],
'income': [50000, None, 70000, 90000, 60000, None],
'score': [85, 90, 78, None, 88, 92]
})
# Strategy 1: KNN imputation (preserves local structure)
knn_imp = KNNImputer(n_neighbors=2)
df_knn = pd.DataFrame(knn_imp.fit_transform(df), columns=df.columns)
# Strategy 2: Iterative imputation (MICE-like, models each feature)
iter_imp = IterativeImputer(max_iter=10, random_state=42)
df_iter = pd.DataFrame(iter_imp.fit_transform(df), columns=df.columns)
# Strategy 3: Add missingness indicator (preserves signal in the pattern)
df['income_missing'] = df['income'].isna().astype(int)
print(df_knn.round(1))면접관이 주목하는 핵심 인사이트는 결측 패턴 자체가 정보를 담을 수 있다는 점입니다. 결측 피처에 대한 이진 지시변수를 추가하면 특히 그래디언트 부스팅 트리에서 모델 성능이 향상되는 경우가 많습니다.
Q5: 타깃 인코딩(target encoding)이란 무엇이며, 원-핫 인코딩보다 우수한 경우는 언제입니까?
원-핫 인코딩은 범주당 희소 이진 열을 생성합니다. 고카디널리티 피처(우편번호, 사용자 ID, 상품 SKU)에서는 차원이 폭발적으로 증가합니다. 타깃 인코딩은 각 범주를 해당 범주의 타깃 변수 평균값으로 치환하여 단일 밀집 수치 열을 생성합니다.
# target_encoding.py
import pandas as pd
import numpy as np
from sklearn.model_selection import KFold
def target_encode_kfold(df, col, target, n_splits=5):
"""Target encoding with K-fold regularization to prevent leakage."""
encoded = pd.Series(index=df.index, dtype=float)
global_mean = df[target].mean()
kf = KFold(n_splits=n_splits, shuffle=True, random_state=42)
for train_idx, val_idx in kf.split(df):
# Compute means only from training fold
means = df.iloc[train_idx].groupby(col)[target].mean()
encoded.iloc[val_idx] = df.iloc[val_idx][col].map(means)
# Fill categories unseen in training fold with global mean
encoded.fillna(global_mean, inplace=True)
return encoded
df = pd.DataFrame({
'city': ['Paris', 'Lyon', 'Paris', 'Marseille', 'Lyon', 'Paris',
'Marseille', 'Lyon', 'Paris', 'Marseille'],
'hired': [1, 0, 1, 0, 1, 1, 0, 0, 1, 1]
})
df['city_encoded'] = target_encode_kfold(df, 'city', 'hired')
print(df[['city', 'city_encoded', 'hired']])K-폴드 방식은 폴드 외부 샘플에서만 타깃 평균을 계산하여 데이터 누출을 방지합니다. 이 정규화 없이는 타깃 인코딩이 작은 데이터셋에서 심각하게 과적합됩니다.
Data Science & ML 면접 준비가 되셨나요?
인터랙티브 시뮬레이터, flashcards, 기술 테스트로 연습하세요.
머신러닝 핵심 개념
Q6: 편향-분산 트레이드오프란 무엇이며, 트리 기반 모델에서 어떻게 나타납니까?
편향은 체계적 오류, 즉 예측값이 실제값에서 평균적으로 얼마나 벗어나는지를 측정합니다. 분산은 학습 세트 변화에 대한 민감도, 즉 다른 샘플에서 예측이 얼마나 달라지는지를 측정합니다. 단일 깊은 결정 트리는 낮은 편향과 높은 분산을 가집니다. 즉, 학습 데이터를 외워버립니다. 랜덤 포레스트는 부트스트랩 집계(배깅)를 통해 분산을 줄이면서 낮은 편향을 유지합니다. 그래디언트 부스팅 트리는 잔차를 반복적으로 적합하여 편향을 줄이지만, 학습률, 최대 깊이, 서브샘플링 등 적절한 정규화 없이는 분산이 증가할 위험이 있습니다.
Q7: 불균형 데이터셋에서 정확도가 부적합한 지표인 이유는 무엇이며, 대안은 무엇입니까?
95% 음성, 5% 양성으로 구성된 데이터셋에서 모든 입력에 "음성"을 예측하는 모델은 95%의 정확도를 달성하지만 완전히 무용합니다. 정밀도-재현율 곡선, F1 점수, 정밀도-재현율 곡선 아래 면적(AUPRC)이 소수 클래스 성능을 더 잘 포착합니다. 순위 매기기 작업에서는 AUC-ROC가 모든 임계값에 걸친 구별 능력을 평가하므로 효과적입니다.
# imbalanced_metrics.py
from sklearn.metrics import (
classification_report, precision_recall_curve,
average_precision_score, roc_auc_score
)
import numpy as np
# Simulated predictions on imbalanced data
np.random.seed(42)
y_true = np.array([0]*950 + [1]*50) # 95/5 imbalance
y_scores = np.random.beta(2, 5, 1000) # predicted probabilities
y_scores[y_true == 1] += 0.3 # positive class scores slightly higher
y_scores = np.clip(y_scores, 0, 1)
y_pred = (y_scores > 0.5).astype(int)
print(classification_report(y_true, y_pred, digits=3))
print(f"ROC AUC: {roc_auc_score(y_true, y_scores):.3f}")
print(f"Average Precision (AUPRC): {average_precision_score(y_true, y_scores):.3f}")후속 질문은 대개 "정밀도와 재현율 중 어느 것을 선택합니까?"입니다. 답변은 위양성과 위음성의 비용에 따라 달라집니다. 사기 탐지는 재현율을 우선합니다(사기를 잡는 것이 오경보보다 중요). 스팸 필터링은 정밀도를 우선합니다(위양성이 사용자를 더 불편하게 함).
Q8: L1과 L2 정규화를 설명하고, 각각을 언제 사용합니까?
L1 정규화(라쏘)는 가중치 절대값의 합을 손실 함수에 추가하여 일부 계수를 정확히 0으로 만듭니다. 이는 희소 모델을 생성하며 임베디드 피처 선택 역할을 합니다. L2 정규화(릿지)는 가중치 제곱합을 추가하여 계수를 0 방향으로 축소하되 제거하지는 않습니다. 많은 피처가 무관하고 희소성이 필요할 때 L1을 사용합니다. 모든 피처가 기여하고 다중공선성이 있을 때 L2를 사용합니다. 엘라스틱 넷은 두 가지를 결합하며, 최적 비율을 알 수 없을 때 기본 선택지가 됩니다.
Q9: XGBoost/LightGBM 등 그래디언트 부스팅 트리는 범주형 피처를 어떻게 다르게 처리합니까?
XGBoost는 전통적으로 학습 전에 원-핫 인코딩 또는 순서형 인코딩을 요구합니다. LightGBM은 그래디언트 통계로 범주를 그룹화하는 최적 분할 탐색 알고리즘을 통해 범주형 피처를 네이티브로 처리하여 지수적 탐색 공간을 선형 시간으로 줄입니다. 이 네이티브 처리는 특히 고카디널리티 피처에서 원-핫 인코딩을 능가하는 경우가 많으며, LightGBM이 테이블형 데이터셋에서 일반적으로 더 빠르게 학습하는 이유입니다.
모델 평가와 검증
Q10: 데이터 누출(data leakage)이란 무엇이며, 가장 흔한 세 가지 원인은 무엇입니까?
데이터 누출은 훈련 분포 외부의 정보가 모델로 유입될 때 발생하여 검증 지표를 부풀리지만 실제 운영 성능은 저하됩니다. 가장 흔한 세 가지 원인은 다음과 같습니다.
- 시간적 누출: 미래 데이터를 사용하여 과거를 예측하는 경우 (예: 고객의 평생 가치를 사용하여 첫 달 이탈을 예측)
- 타깃 누출: 타깃 변수에서 파생된 피처 (예: "환불 횟수"를 사용하여 "환불 요청 여부" 예측)
- 전처리 누출: 분할 전에 전체 데이터셋에 스케일러, 인코더, 대체기를 적합하는 경우
# leakage_prevention.py
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import cross_val_score
import numpy as np
X = np.random.randn(1000, 10)
y = (X[:, 0] + X[:, 1] > 0).astype(int)
# WRONG: fit scaler on all data, then cross-validate
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X) # leakage: test fold info in scaling
# CORRECT: pipeline ensures preprocessing fits only on training folds
pipeline = Pipeline([
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler()),
('model', GradientBoostingClassifier(n_estimators=100, random_state=42))
])
scores = cross_val_score(pipeline, X, y, cv=5, scoring='roc_auc')
print(f"AUC (no leakage): {scores.mean():.3f} +/- {scores.std():.3f}")scikit-learn 파이프라인은 전처리 누출에 대한 표준 방어책입니다. 파이프라인 내의 모든 변환 단계는 각 훈련 폴드에서 독립적으로 재적합됩니다.
Q11: 시계열 교차 검증이 표준 K-폴드를 대체해야 하는 경우는 언제입니까?
표준 K-폴드는 데이터를 무작위로 섞어 시간적 순서를 깨뜨립니다. 행에 시간 요소가 있는 데이터셋(주가, 사용자 활동, 센서 데이터)에서는 미래에서 과거로의 누출이 발생합니다. 시계열 교차 검증은 확장 또는 슬라이딩 윈도우를 사용하여 각 폴드의 훈련 세트가 검증 세트보다 이전 데이터만 포함하도록 합니다. scikit-learn은 이 패턴을 위해 TimeSeriesSplit을 제공합니다.
지원자들은 종종 "K-폴드 교차 검증을 항상 사용한다"고 주장합니다. 면접관은 K-폴드가 부적절한 시계열 또는 그룹 데이터 시나리오를 제시하여 확인합니다. 데이터 구조에 따라 TimeSeriesSplit, GroupKFold, StratifiedKFold를 언제 사용해야 하는지 정확히 파악해 두어야 합니다.
딥러닝과 신경망
Q12: 깊은 신경망이 시그모이드 대신 ReLU를 사용하는 이유는 무엇이며, ReLU는 언제 실패합니까?
시그모이드는 출력을 (0, 1)로 압축하지만, 극단적인 입력에서 기울기가 소실됩니다. 0이나 1에 가까울수록 기울기가 0에 근접하여 역전파가 깊은 네트워크에서 정체됩니다. ReLU(max(0, x))는 양의 입력에 대해 기울기가 1로 일정하여 더 빠른 학습을 가능하게 합니다. ReLU는 뉴런이 일관되게 음의 입력을 받을 때 실패합니다("죽은 ReLU" 문제). 영구적으로 0 기울기를 생성합니다. Leaky ReLU와 GELU(트랜스포머에서 사용)는 음의 값에도 작은 기울기를 허용하여 이를 해결합니다.
Q13: 어텐션 메커니즘을 설명하고, 트랜스포머가 시퀀스 작업에서 RNN을 대체한 이유를 설명하십시오.
RNN은 순서대로 시퀀스를 처리하여 병목 현상을 만듭니다. 초기 토큰의 정보는 이후 모든 은닉 상태를 거쳐 살아남아야 합니다. 어텐션은 모든 위치 간의 직접적인 쌍별 관계를 동시에 계산하며, O(n²) 복잡도이지만 완전한 병렬화가 가능합니다. 트랜스포머의 셀프 어텐션은 입력에서 쿼리, 키, 값 행렬을 생성하고, softmax(QK^T / sqrt(d_k)) * V로 어텐션 가중치를 계산합니다.
# self_attention.py
import torch
import torch.nn.functional as F
def self_attention(x, d_k):
"""Scaled dot-product self-attention from scratch."""
# x shape: (batch_size, seq_len, d_model)
batch_size, seq_len, d_model = x.shape
# Linear projections for Q, K, V
W_q = torch.randn(d_model, d_k) * 0.1
W_k = torch.randn(d_model, d_k) * 0.1
W_v = torch.randn(d_model, d_k) * 0.1
Q = x @ W_q # (batch, seq_len, d_k)
K = x @ W_k
V = x @ W_v
# Scaled dot-product attention
scores = Q @ K.transpose(-2, -1) / (d_k ** 0.5) # (batch, seq_len, seq_len)
weights = F.softmax(scores, dim=-1) # attention weights
output = weights @ V # (batch, seq_len, d_k)
return output, weights
# Example: 1 batch, 4 tokens, 8-dim embeddings
x = torch.randn(1, 4, 8)
out, attn = self_attention(x, d_k=8)
print(f"Output shape: {out.shape}") # (1, 4, 8)
print(f"Attention weights:\n{attn[0].detach().numpy().round(3)}")핵심 장점은 모델이 거리에 관계없이 임의의 두 위치를 직접 연결할 수 있어, LSTM을 괴롭혔던 장거리 의존성 문제를 해결한다는 점입니다.
Q14: 파인튜닝과 전이 학습의 차이는 무엇이며, 각각은 언제 적용됩니까?
전이 학습은 사전 훈련된 모델의 학습된 표현을 출발점으로 사용합니다. 파인튜닝은 사전 훈련된 레이어의 일부 또는 전부를 동결 해제하고 타깃 작업에서 계속 학습하는 특정 전이 학습 전략입니다. 피처 추출(또 다른 전략)은 모든 사전 훈련된 레이어를 동결하고 새로운 분류 헤드만 학습합니다. 파인튜닝은 적당한 타깃 데이터(수천 샘플)가 있을 때 효과적입니다. 피처 추출은 전체 파인튜닝이 과적합을 초래할 소규모 데이터셋에 적합합니다.
SQL과 데이터 조작
Q15: 윈도우 함수 없이 부서별 두 번째로 높은 급여를 찾는 쿼리를 작성하십시오.
-- second_highest_salary.sql
-- Approach: correlated subquery counting distinct higher salaries
SELECT d.department_name, e.employee_name, e.salary
FROM employees e
JOIN departments d ON e.department_id = d.id
WHERE (
SELECT COUNT(DISTINCT e2.salary)
FROM employees e2
WHERE e2.department_id = e.department_id
AND e2.salary > e.salary
) = 1
ORDER BY d.department_name;면접관은 이 질문으로 RANK() 또는 DENSE_RANK()의 편의 없이 SQL 기초를 검증합니다. 후속 질문은 윈도우 함수로 해결하는 방식으로, 더 깔끔하지만 다른 스킬을 테스트합니다.
Q16: WHERE와 HAVING의 차이를 설명하십시오. 각각은 언제 평가됩니까?
WHERE는 집계 전에 행을 필터링합니다. HAVING은 집계 후에 그룹을 필터링합니다. SQL 실행 순서에서 WHERE는 행 스캔 단계에서 적용되고, GROUP BY가 그룹을 생성하며, 집계 함수가 계산된 후 HAVING이 해당 그룹을 필터링합니다. 흔한 실수는 GROUP BY 없이 HAVING을 사용하거나, SELECT에서 정의된 별칭을 WHERE 내에서 참조하려는 시도입니다.
응용 데이터 사이언스와 시스템 설계
Q17: 새 추천 알고리즘을 위한 A/B 테스트를 어떻게 설계하겠습니까?
설계에는 다섯 가지 요소가 필요합니다. (1) 명확한 기본 지표(예: 클릭률, 전환율, 또는 사용자당 수익), (2) 표본 크기 결정을 위한 검정력 분석, (3) 사용자 수준에서의 무작위화(교차 오염을 피하기 위해 세션 수준 아님), (4) 저하되어서는 안 되는 가드레일 지표(지연 시간, 충돌률), (5) p-해킹을 방지하기 위해 사전 등록된 분석 계획.
80% 검정력과 alpha=0.05에서 2% 절대 향상(CTR 10%에서 12%로)을 탐지하기 위한 이분산 z-검정의 경우, 그룹당 약 3,800명의 사용자가 필요합니다. 기대 효과가 작을수록 기하급수적으로 더 많은 샘플이 필요합니다. 런칭 전에 항상 검정력 분석을 수행해야 합니다.
Q18: 모델이 검증에서는 잘 작동하지만 운영에서는 성능이 저하됩니다. 상위 세 가지 원인은 무엇입니까?
- 분포 이동: 훈련 데이터가 운영 트래픽을 대표하지 않는 경우 (다른 사용자 인구통계, 기간, 또는 지역)
- 피처 스큐: 훈련(배치)과 서빙(실시간) 파이프라인에서 피처가 다르게 계산되는 경우 — 타임스탬프 파싱, 결측값 처리, 또는 집계 윈도우가 분기
- 레이블 누출: 훈련 레이블이 운영 시 예측 시점에 사용 불가능한 데이터에서 파생된 경우
디버깅은 각 피처에 대해 독립적으로 통계 검정(KS 검정, PSI — 모집단 안정성 지수)을 사용하여 훈련과 운영 간의 피처 분포를 비교하는 것으로 시작합니다.
Q19: CAP 정리와 ML 피처 스토어에 대한 시사점을 설명하십시오.
CAP 정리는 분산 시스템이 일관성(모든 읽기가 최신 쓰기를 반환), 가용성(모든 요청이 응답을 받음), 파티션 허용성(네트워크 장애에도 시스템이 작동) 중 최대 두 가지만 보장할 수 있다고 명시합니다. 피처 스토어는 이 트레이드오프에 직면합니다. 온라인 스토어(Redis, DynamoDB)는 가용성과 파티션 허용성을 우선하여 최종 일관성을 허용합니다. 오프라인 스토어(BigQuery, Hive)는 배치 학습을 위한 일관성을 우선합니다. 듀얼 스토어 아키텍처가 두 요구를 모두 충족합니다.
Q20: 운영 ML 시스템에서 개념 드리프트는 어떻게 처리합니까?
개념 드리프트는 피처와 타깃 간의 통계적 관계가 시간에 따라 변할 때 발생합니다. 탐지 방법에는 예측 분포 이동 모니터링(모델 출력의 PSI), 레이블된 운영 데이터의 성능 지표 추적, 입력 피처 분포에 대한 통계 검정이 포함됩니다. 완화 전략으로는 슬라이딩 윈도우에서의 정기적 재학습, 점진적 드리프트를 위한 온라인 학습, 또는 드리프트 지표가 임계값을 초과할 때 재학습 트리거가 있습니다.
Data Science & ML 면접 준비가 되셨나요?
인터랙티브 시뮬레이터, flashcards, 기술 테스트로 연습하세요.
Python과 Pandas 실무 능력
Q21: Pandas에서 apply(), map(), transform()의 차이는 무엇입니까?
map()은 시리즈에서만 요소별로 작동합니다. apply()는 시리즈와 데이터프레임 모두에서 작동하여 각 행/열을 함수에 전달합니다. transform()은 출력이 입력과 동일한 형태를 가져야 하며 집계할 수 없습니다. 실용적 시사점은 transform()이 apply()보다 효율적으로 원래 인덱스로 브로드캐스트되는 그룹 수준 계산을 가능하게 한다는 점입니다.
# pandas_operations.py
import pandas as pd
df = pd.DataFrame({
'team': ['A', 'A', 'B', 'B', 'A'],
'score': [10, 20, 30, 40, 50]
})
# map: element-wise on Series
df['team_upper'] = df['team'].map({'A': 'Alpha', 'B': 'Beta'})
# apply: arbitrary function per row
df['score_label'] = df['score'].apply(lambda x: 'high' if x > 25 else 'low')
# transform: group-level, same shape output (broadcasts back)
df['team_mean'] = df.groupby('team')['score'].transform('mean')
df['score_normalized'] = df.groupby('team')['score'].transform(
lambda x: (x - x.mean()) / x.std()
)
print(df)Q22: Python의 GIL이란 무엇이며 데이터 사이언스 워크플로에 어떤 영향을 미칩니까?
전역 인터프리터 잠금(GIL)은 여러 스레드가 Python 바이트코드를 동시에 실행하는 것을 방지합니다. CPU 바운드 작업(수치 계산, 모델 학습)은 스레딩의 이점을 누리지 못합니다. 이것이 NumPy, pandas, scikit-learn이 GIL을 해제하는 C 확장을 사용하는 이유이며, 순수 Python 코드에서 스레딩이 아닌 멀티프로세싱이 표준 병렬화 전략인 이유입니다. I/O 바운드 작업(API 호출, 데이터베이스 쿼리)의 경우 I/O 대기 중 GIL이 해제되므로 스레딩이 효과적입니다.
차원 축소와 비지도 학습
Q23: PCA vs. t-SNE vs. UMAP — 각각은 언제 적용됩니까?
PCA는 투영된 차원의 분산을 최대화하는 선형 방법입니다. 전역 구조를 보존하고 결정론적이므로 전처리(모델링 전 피처 수 감소)와 해석 가능한 시각화에 적합합니다. t-SNE는 비선형 방법으로, 로컬 이웃을 보존하여 2D/3D 시각화에 최적화되어 있습니다. 전역 거리를 왜곡하므로 전처리에 적합하지 않습니다. UMAP은 t-SNE보다 로컬과 전역 구조를 모두 더 잘 보존하고, 대용량 데이터셋에서 더 빠르게 실행되며, 실행 간 더 일관된 결과를 생성합니다.
| 방법 | 선형 여부 | 전역 구조 보존 | 속도 (10만 포인트) | 용도 | |------|-----------|-----------------|---------------------|------| | PCA | 예 | 예 | 초 단위 | 전처리, 피처 축소 | | t-SNE | 아니오 | 아니오 | 분 단위 | 클러스터 시각화 (소규모 데이터) | | UMAP | 아니오 | 부분적 | 초 단위 | 시각화 + 전처리 |
Q24: K-평균이 실패하는 경우는 언제이며, 비구형 클러스터를 처리하는 대안은 무엇입니까?
K-평균은 구형의 동일 크기 클러스터를 가정하고 유클리드 거리를 사용합니다. 세장형, 링 형태, 밀도가 다양한 클러스터에서는 실패합니다. DBSCAN은 밀도로 클러스터를 식별하여 임의 형태를 처리하고 이상치를 자동으로 탐지합니다. 가우시안 혼합 모델(GMM)은 각 클러스터를 다변량 가우시안으로 모델링하여 타원형 형태를 허용합니다. 스펙트럴 클러스터링은 그래프 라플라시안 고유벡터를 사용하여 복잡한 기하학을 처리하지만 약 10만 포인트 이상으로는 확장이 어렵습니다.
커뮤니케이션과 비즈니스 임팩트
Q25: 이해관계자가 "모델에서 가장 중요한 피처는 무엇입니까?"라고 묻습니다. 어떻게 답변합니까?
피처 중요도에는 여러 유효한 정의가 있으며, 답변은 청중에 따라 달라집니다. 트리 기반 모델에서는 세 가지 일반적인 측정이 있습니다. 분할 기반 중요도(피처가 분할에 사용된 빈도), 이득 기반 중요도(해당 피처의 분할로 인한 총 손실 감소), 순열 중요도(피처를 무작위로 섞을 때 성능 저하). SHAP 값은 게임 이론적 원리를 사용하여 각 피처의 개별 예측 기여를 정량화하는 가장 엄밀한 답변을 제공합니다.
# feature_importance_shap.py
import shap
import xgboost as xgb
from sklearn.datasets import make_classification
# Generate synthetic dataset
X, y = make_classification(n_samples=1000, n_features=10,
n_informative=5, random_state=42)
# Train XGBoost model
model = xgb.XGBClassifier(n_estimators=100, random_state=42, eval_metric='logloss')
model.fit(X, y)
# SHAP explanation
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)
# Global importance: mean absolute SHAP value per feature
import numpy as np
importance = np.abs(shap_values).mean(axis=0)
for i in np.argsort(importance)[::-1]:
print(f"Feature {i}: {importance[i]:.4f}")이해관계자에게는 SHAP 값을 비즈니스 언어로 변환합니다. "피처 3의 평균 SHAP 값은 0.23입니다" 대신 "소득이 8만 달러 이상인 고객은 다른 조건이 동일할 때 전환 가능성이 15% 더 높습니다"라고 표현합니다.
결론
- 가설 검정의 정밀성이 중요합니다. 이항 검정 적용 시점을 파악하고, p-값을 이해하며, 베이즈 추론과 빈도주의 추론을 구별해야 합니다.
- 피처 엔지니어링이 알고리즘 선택보다 모델 성능을 더 많이 결정하는 경우가 많습니다. 타깃 인코딩, 결측 데이터 전략, 누출 방지를 숙달해야 합니다.
- 평가는 정확도를 넘어섭니다. 불균형 데이터에는 AUPRC를, 시계열 데이터에는 TimeSeriesSplit을, 전처리 누출 방지에는 파이프라인을 사용해야 합니다.
- 딥러닝 기초(어텐션, 활성화 함수, 전이 학습)는 주로 테이블형 방법을 사용하는 데이터 사이언스 역할에서도 등장합니다.
- 운영 ML 질문(드리프트 탐지, A/B 테스트, 피처 스토어)이 시니어 지원자와 주니어 지원자를 점점 더 구분짓습니다.
- 커뮤니케이션 능력은 피처 중요도 설명을 통해 테스트됩니다. SHAP 값을 이해관계자 친화적 언어로 변환하는 연습이 필요합니다.
연습을 시작하세요!
면접 시뮬레이터와 기술 테스트로 지식을 테스트하세요.
태그
공유
관련 기사

머신러닝 알고리즘 완벽 해설: 기술 면접을 위한 종합 가이드
머신러닝 알고리즘 기술 면접 가이드. 선형 모델, 의사결정 트리, 앙상블, 클러스터링, 평가 지표, 정규화를 scikit-learn 코드와 함께 체계적으로 해설합니다.

Django 면접 질문: ORM, 미들웨어, DRF 심층 분석
Django 면접에서 자주 출제되는 ORM 최적화(select_related와 prefetch_related), 미들웨어 아키텍처, Django REST Framework 시리얼라이저 성능, 권한 설정, 페이지네이션 패턴을 상세히 다룹니다.

Kubernetes 면접 완벽 가이드: Pod, Service, Deployment 핵심 정리
Kubernetes 면접에서 자주 출제되는 Pod, Service, Deployment의 핵심 개념을 YAML 예제와 함께 상세히 정리합니다. 2026년 최신 트렌드를 반영한 실전 대비 가이드입니다.