8편 - ADsP 과목3: 데이터 분석
ADsP 과목3: 데이터 분석
제1장. 통계학 기초
1.1 기술통계 (Descriptive Statistics)
1.1.1 데이터의 종류
(1) 척도의 종류
| 척도 | 설명 | 예시 | 연산 가능 |
|---|---|---|---|
| 명목 척도 (Nominal) | 단순 분류. 순서 의미 없음 | 성별(남/여), 혈액형(A/B/O/AB) | 빈도, 최빈값 |
| 순서 척도 (Ordinal) | 순서 의미 있음. 간격은 불균등 | 학점(A/B/C), 만족도(상/중/하) | + 중앙값 |
| 등간 척도 (Interval) | 순서 + 균등한 간격. 절대 영점 없음 | 온도(℃), 지능지수(IQ) | + 평균, 표준편차 |
| 비율 척도 (Ratio) | 순서 + 균등 간격 + 절대 영점 있음 | 키, 몸무게, 나이, 소득 | + 비율 계산 |
시험 핵심: "명순등비"로 암기! 명목 → 순서 → 등간 → 비율 순으로 측정 수준이 높아진다. 등간 척도는 0이 "없음"을 의미하지 않고(0℃ ≠ 온도 없음), 비율 척도는 0이 "없음"을 의미한다(0kg = 무게 없음).
(2) 연속형 vs 이산형
| 구분 | 설명 | 예시 |
|---|---|---|
| 연속형 (Continuous) | 연속적인 실수 값 | 키, 몸무게, 온도 |
| 이산형 (Discrete) | 셀 수 있는 정수 값 | 학생 수, 자동차 수 |
1.1.2 중심 경향 측도 (대표값)
| 측도 | 설명 | 특징 |
|---|---|---|
| 평균 (Mean) | 모든 값의 합 / 개수 | 이상값에 민감 |
| 중앙값 (Median) | 정렬 후 가운데 값 | 이상값에 강건(Robust) |
| 최빈값 (Mode) | 가장 빈번한 값 | 명목 척도에도 사용 가능 |
| 절사평균 (Trimmed Mean) | 상하위 일정 비율을 제거한 후 평균 | 이상값 영향 완화 |
# R 코드 x <- c(10, 20, 30, 40, 100) # 100은 이상값 mean(x) # 평균: 40 median(x) # 중앙값: 30 mean(x, trim = 0.2) # 20% 절사평균: 30
시험 핵심: 이상값(Outlier)이 있을 때 평균보다 중앙값이 더 적합한 대표값이다.
1.1.3 산포도 (Dispersion)
| 측도 | 공식 | 설명 |
|---|---|---|
| 분산 (Variance) | Σ(xᵢ - x̄)² / (n-1) | 평균으로부터 편차 제곱의 평균 (표본: n-1) |
| 표준편차 (Standard Deviation) | √분산 | 분산의 제곱근. 원래 단위와 동일 |
| 범위 (Range) | 최대값 - 최소값 | 가장 간단한 산포 측도 |
| 사분위수 범위 (IQR) | Q3 - Q1 | 이상값에 강건한 산포 측도 |
| 변동계수 (CV) | (표준편차/평균) × 100 | 단위가 다른 데이터의 산포 비교 |
# R 코드 x <- c(10, 20, 30, 40, 50) var(x) # 분산: 250 sd(x) # 표준편차: 15.81 range(x) # 범위: 10, 50 IQR(x) # 사분위수 범위: 20
1.1.4 사분위수 (Quartile)
데이터를 정렬 후 4등분:
최소값 ── Q1(25%) ── Q2(50%=중앙값) ── Q3(75%) ── 최대값
IQR = Q3 - Q1
이상값 기준:
하한: Q1 - 1.5 × IQR 미만
상한: Q3 + 1.5 × IQR 초과
# R 코드: 사분위수와 boxplot x <- c(1, 5, 10, 15, 20, 25, 30, 35, 100) quantile(x) # 0%, 25%, 50%, 75%, 100% boxplot(x) # 상자 그림 (이상값 시각화) summary(x) # 최솟값, Q1, 중앙값, 평균, Q3, 최댓값 한 번에
1.1.5 분포의 형태
| 측도 | 설명 | 해석 |
|---|---|---|
| 왜도 (Skewness) | 분포의 비대칭 정도 | 0: 대칭, 양수: 오른쪽 꼬리, 음수: 왼쪽 꼬리 |
| 첨도 (Kurtosis) | 분포의 뾰족한 정도 | 0(정규분포 기준): 보통, 양수: 뾰족, 음수: 납작 |
오른쪽 꼬리 (양의 왜도): 평균 > 중앙값 > 최빈값
대칭 (왜도 = 0): 평균 = 중앙값 = 최빈값
왼쪽 꼬리 (음의 왜도): 평균 < 중앙값 < 최빈값
시험 핵심: 오른쪽으로 꼬리가 긴 분포(양의 왜도)에서는 평균 > 중앙값이다. 소득분포가 대표적 예시이다.
1.2 확률과 확률분포
1.2.1 확률의 기본 개념
| 용어 | 설명 |
|---|---|
| 표본공간 (S) | 모든 가능한 결과의 집합 |
| 사건 (Event) | 표본공간의 부분집합 |
| 확률 | 0 ≤ P(A) ≤ 1, P(S) = 1 |
확률의 덧셈 법칙: P(A ∪ B) = P(A) + P(B) - P(A ∩ B)
조건부 확률: P(A|B) = P(A ∩ B) / P(B)
독립 사건: P(A ∩ B) = P(A) × P(B) (독립일 때)
베이즈 정리: P(A|B) = P(B|A) × P(A) / P(B)
시험 핵심: 베이즈 정리는 사전확률 P(A)를 관측 후 사후확률 P(A|B)로 갱신하는 공식이다.
1.2.2 이산형 확률분포
(1) 이항분포 (Binomial Distribution)
n번의 독립 시행에서 성공 확률이 p일 때, 성공 횟수 X의 분포
- X ~ B(n, p)
- 평균: np, 분산: np(1-p)
# 동전 10번 던져서 앞면 나올 확률 # P(X = 6) = ? dbinom(6, size = 10, prob = 0.5) # 정확히 6번: 0.2050781 # P(X <= 6) = ? (누적) pbinom(6, size = 10, prob = 0.5) # 6번 이하: 0.828125
(2) 포아송분포 (Poisson Distribution)
단위 시간/공간에서 사건 발생 횟수의 분포
- X ~ Poisson(λ)
- 평균: λ, 분산: λ (평균 = 분산이 특징!)
# 시간당 평균 3건의 전화가 올 때, 정확히 5건 올 확률 dpois(5, lambda = 3) # 0.1008188
시험 핵심: 포아송분포는 평균 = 분산 = λ이다. 이 특징은 자주 출제된다.
1.2.3 연속형 확률분포
(1) 정규분포 (Normal Distribution)
가장 중요한 연속형 확률분포. 좌우 대칭의 종 모양(Bell Curve)이다.
- X ~ N(μ, σ²)
- 평균(μ)을 중심으로 좌우 대칭
- 68-95-99.7 법칙: μ±1σ(68.27%), μ±2σ(95.45%), μ±3σ(99.73%)
# 표준정규분포 N(0,1) pnorm(1.96) # P(Z ≤ 1.96) = 0.975 pnorm(1.96) - pnorm(-1.96) # P(-1.96 ≤ Z ≤ 1.96) = 0.95 qnorm(0.975) # 상위 2.5% 기준점: 1.96
(2) 표준정규분포
Z = (X - μ) / σ 로 표준화하면 N(0, 1)이 된다.
(3) t분포
정규분포와 유사하지만 꼬리가 더 두꺼운 분포이다. 표본 크기가 작을 때(n < 30) 사용한다.
- 자유도(df)가 클수록 정규분포에 가까워짐
- 자유도 = n - 1
(4) 카이제곱분포 (χ² Distribution)
양수 값만 취하며, 적합도 검정이나 독립성 검정에 사용된다.
(5) F분포
두 집단의 분산비를 검정할 때 사용한다. 분산분석(ANOVA)의 기초이다.
1.3 추론통계 (Inferential Statistics)
1.3.1 모집단과 표본
| 용어 | 설명 |
|---|---|
| 모집단 (Population) | 연구 대상이 되는 전체 집합 |
| 표본 (Sample) | 모집단에서 추출된 일부 |
| 모수 (Parameter) | 모집단의 특성값 (μ, σ) |
| 통계량 (Statistic) | 표본의 특성값 (x̄, s) |
| 표본 오차 | 표본 통계량과 모수 간의 차이 |
1.3.2 표본추출 방법
| 방법 | 설명 |
|---|---|
| 단순 랜덤 추출 | 모집단에서 무작위로 동일한 확률로 추출 |
| 층화 추출 (Stratified) | 모집단을 동질적 계층으로 나눈 후 각 층에서 추출 |
| 군집 추출 (Cluster) | 모집단을 군집으로 나눈 후 일부 군집 전체를 추출 |
| 체계적 추출 (Systematic) | 일정 간격으로 추출 (매 k번째) |
시험 핵심: 층화 추출은 "각 층에서 일부를 추출", 군집 추출은 "일부 군집 전체를 추출"이다. 혼동하지 말 것!
1.3.3 중심극한정리 (CLT: Central Limit Theorem)
모집단의 분포에 관계없이, 표본 크기 n이 충분히 크면(보통 n ≥ 30), 표본평균의 분포는 정규분포에 근사한다.
- 표본평균의 기대값: E(X̄) = μ
- 표본평균의 표준오차: SE = σ / √n
시험 핵심: 중심극한정리는 "표본 크기가 충분히 크면 표본평균은 정규분포를 따른다"는 것이 핵심이다. 모집단이 정규분포가 아니어도 성립한다!
1.3.4 신뢰구간 (Confidence Interval)
모수가 포함될 것으로 기대되는 구간이다.
모평균의 95% 신뢰구간:
X̄ ± 1.96 × (σ/√n) (모표준편차 σ를 알 때)
X̄ ± t(α/2, n-1) × (s/√n) (모표준편차를 모를 때, t분포 사용)
# R에서 신뢰구간 구하기 x <- c(23, 25, 28, 30, 32, 35, 38, 40) t.test(x, conf.level = 0.95) # 95% 신뢰구간 출력
시험 핵심: "95% 신뢰구간"이란 같은 방법으로 100번 구간을 구하면 약 95번은 모수를 포함한다는 의미이다. 신뢰수준이 높아지면 구간이 넓어진다.
1.4 가설검정 (Hypothesis Testing)
1.4.1 가설검정의 개념
| 용어 | 설명 |
|---|---|
| 귀무가설 (H₀) | 기존의 주장 또는 "차이가 없다"는 가설. 검정 대상 |
| 대립가설 (H₁ 또는 Hₐ) | 연구자가 증명하려는 가설. "차이가 있다" |
| 유의수준 (α) | 귀무가설이 참인데 기각할 확률의 허용 한계 (보통 0.05) |
| p-value | 귀무가설이 참이라는 전제 하에 관측 결과가 나올 확률 |
| 검정통계량 | 검정에 사용되는 통계값 (z, t, χ², F 등) |
1.4.2 가설검정의 절차
1. 가설 설정 (H₀, H₁)
2. 유의수준 설정 (α = 0.05)
3. 검정통계량 계산
4. p-value 계산 또는 기각역 판단
5. 결론 도출 (H₀ 기각 또는 채택)
판단 기준:
- p-value < α → H₀ 기각 (통계적으로 유의하다)
- p-value ≥ α → H₀ 채택 (유의하지 않다)
1.4.3 오류의 종류
| 오류 | 설명 | 확률 |
|---|---|---|
| 제1종 오류 (α 오류) | H₀이 참인데 기각 (거짓 경보) | α (유의수준) |
| 제2종 오류 (β 오류) | H₀이 거짓인데 채택 (놓침) | β |
| 검정력 (Power) | H₀이 거짓일 때 올바르게 기각할 확률 | 1 - β |
시험 핵심: 제1종 오류는 "없는데 있다고 함", 제2종 오류는 "있는데 없다고 함"이다. 유의수준 α를 낮추면 제1종 오류는 줄어들지만 제2종 오류는 증가한다.
1.4.4 주요 검정 방법
| 검정 | 목적 | 사용 조건 |
|---|---|---|
| 단일표본 t검정 | 모평균이 특정 값과 같은지 | 하나의 집단, 정규성 가정 |
| 독립표본 t검정 | 두 집단의 평균 차이 검정 | 두 독립 집단, 정규성 + 등분산 |
| 대응표본 t검정 | 짝지어진 두 집단의 평균 차이 | 짝지어진(Before/After) 자료 |
| 카이제곱 검정 | 범주형 변수의 독립성/적합도 | 빈도 자료 |
| ANOVA (분산분석) | 3개 이상 집단의 평균 차이 | 여러 집단, 정규성 + 등분산 |
# 단일표본 t검정: 평균이 50과 다른가? x <- c(48, 52, 55, 47, 51, 53, 49, 50) t.test(x, mu = 50) # 독립표본 t검정: 두 그룹의 평균이 다른가? group1 <- c(23, 25, 28, 30, 32) group2 <- c(30, 33, 35, 38, 40) t.test(group1, group2) # 대응표본 t검정: Before vs After before <- c(200, 180, 210, 190, 220) after <- c(180, 170, 195, 175, 200) t.test(before, after, paired = TRUE)
1.5 상관분석과 회귀분석
1.5.1 상관분석 (Correlation Analysis)
두 변수 간의 선형적 관련성의 강도와 방향을 측정한다.
피어슨 상관계수 (r)
- 범위: -1 ≤ r ≤ 1
- r = 1: 완전 양의 상관
- r = -1: 완전 음의 상관
- r = 0: 선형 관계 없음 (비선형 관계는 있을 수 있음!)
| |r| 값 | 해석 | |---------|------| | 0.0 ~ 0.2 | 거의 없음 | | 0.2 ~ 0.4 | 약한 상관 | | 0.4 ~ 0.6 | 보통 상관 | | 0.6 ~ 0.8 | 강한 상관 | | 0.8 ~ 1.0 | 매우 강한 상관 |
# 상관분석 x <- c(10, 20, 30, 40, 50) y <- c(15, 25, 32, 42, 48) cor(x, y) # 상관계수: 0.998 cor.test(x, y) # 상관계수 + 유의성 검정 # 상관 행렬 data <- data.frame(키 = c(170,165,180,175,160), 몸무게 = c(70,60,80,75,55), 나이 = c(30,25,35,28,22)) cor(data) # 상관 행렬
시험 핵심: 상관관계는 인과관계가 아니다! 상관계수가 높아도 원인-결과 관계를 의미하지 않는다.
1.5.2 단순 회귀분석 (Simple Linear Regression)
독립변수(X) 하나로 종속변수(Y)를 예측하는 모델이다.
Y = β₀ + β₁X + ε
β₀: 절편 (Y축 교차점)
β₁: 기울기 (X가 1 증가할 때 Y의 변화량)
ε: 오차항
# 단순 회귀분석 x <- c(1, 2, 3, 4, 5) y <- c(2.1, 3.9, 6.2, 7.8, 10.1) model <- lm(y ~ x) # 회귀모델 적합 summary(model) # 결과 확인 # 주요 출력: # Coefficients: # Estimate Std. Error t value Pr(>|t|) # (Intercept) -0.02 0.31 -0.06 0.953 ← β₀ # x 2.02 0.09 22.44 0.000 *** ← β₁ # # Multiple R-squared: 0.9941 ← 결정계수 R² # F-statistic: 503.6, p-value: 2.04e-04
1.5.3 다중 회귀분석 (Multiple Linear Regression)
독립변수가 2개 이상인 회귀분석이다.
Y = β₀ + β₁X₁ + β₂X₂ + ... + βₚXₚ + ε
# 다중 회귀분석 model <- lm(mpg ~ wt + hp + cyl, data = mtcars) summary(model) # 변수 선택법 # 전진선택법 (Forward): 변수를 하나씩 추가 # 후진제거법 (Backward): 전체에서 하나씩 제거 # 단계적 방법 (Stepwise): 추가/제거 반복 step(model, direction = "both") # Stepwise
1.5.4 회귀분석의 주요 지표
| 지표 | 설명 | 범위 |
|---|---|---|
| R² (결정계수) | 모델이 데이터를 설명하는 비율 | 0 ~ 1 (1에 가까울수록 좋음) |
| 수정된 R² (Adjusted R²) | 변수 수를 고려하여 보정한 R² | 다중 회귀에서 더 적합 |
| F 통계량 | 회귀 모델 전체의 유의성 검정 | p-value < 0.05이면 유의 |
| t 통계량 | 각 회귀계수의 유의성 검정 | p-value < 0.05이면 유의 |
| 잔차 (Residual) | 실제값 - 예측값 | 0에 가까울수록 좋음 |
시험 핵심: R²가 높다고 항상 좋은 모델은 아니다. 변수가 많으면 R²는 항상 증가하므로 수정된 R²(Adjusted R²)를 확인해야 한다.
1.5.5 회귀분석의 가정
| 가정 | 설명 | 위반 시 |
|---|---|---|
| 선형성 | X와 Y의 관계가 선형 | 비선형 변환 필요 |
| 독립성 | 잔차가 서로 독립 | 더빈-왓슨 검정으로 확인 |
| 등분산성 | 잔차의 분산이 일정 | 가중최소제곱법 등 |
| 정규성 | 잔차가 정규분포를 따름 | 샤피로-윌크 검정으로 확인 |
| 다중공선성 없음 | 독립변수 간 높은 상관 없음 | VIF 확인 (VIF > 10이면 문제) |
# 회귀 진단 model <- lm(mpg ~ wt + hp, data = mtcars) # 잔차 정규성 검정 shapiro.test(resid(model)) # 다중공선성 확인 (car 패키지) # install.packages("car") library(car) vif(model) # VIF > 10이면 다중공선성 의심 # 더빈-왓슨 검정 (자기상관 확인) # durbinWatsonTest(model)
1.6 분산분석 (ANOVA)
1.6.1 ANOVA란?
3개 이상 집단의 평균 차이를 검정하는 방법이다. t검정의 확장이다.
| 유형 | 설명 |
|---|---|
| 일원분산분석 | 독립변수 1개 (예: 3개 교수법의 성적 차이) |
| 이원분산분석 | 독립변수 2개 (예: 교수법 × 성별의 성적 차이) |
# 일원분산분석 group <- factor(c(rep("A",5), rep("B",5), rep("C",5))) score <- c(85,90,88,92,87, 70,75,72,68,73, 90,95,88,92,96) result <- aov(score ~ group) summary(result) # p-value < 0.05이면 "적어도 하나의 집단 평균이 다르다" # 사후검정 (어떤 집단이 다른지) TukeyHSD(result)
시험 핵심: ANOVA에서 귀무가설은 "모든 집단의 평균이 같다"이다. 기각되면 "적어도 하나의 집단 평균이 다르다"는 것이지, 어떤 집단이 다른지는 사후검정이 필요하다.
제2장. 데이터마이닝
2.1 데이터마이닝 개요
2.1.1 데이터마이닝이란?
대량의 데이터로부터 숨겨진 패턴, 관계, 규칙 등 유용한 지식을 자동적으로 발견하는 과정이다.
2.1.2 데이터마이닝 기법 분류
| 분류 | 기법 | 목적 |
|---|---|---|
| 지도학습 (Supervised) | 분류, 회귀 | 정답(레이블)이 있는 데이터로 학습 |
| 비지도학습 (Unsupervised) | 군집, 연관분석 | 정답 없이 데이터의 구조를 발견 |
| 과제 유형 | 종속변수 | 목적 | 대표 기법 |
|---|---|---|---|
| 분류 (Classification) | 범주형 | 범주 예측 | 로지스틱, 의사결정나무, SVM, kNN |
| 회귀 (Regression) | 연속형 | 수치 예측 | 선형회귀, 릿지, 라쏘 |
| 군집 (Clustering) | 없음 | 유사 그룹화 | K-means, 계층적 군집 |
| 연관 (Association) | 없음 | 항목 간 관계 발견 | Apriori |
2.2 분류 (Classification)
2.2.1 로지스틱 회귀 (Logistic Regression)
종속변수가 0/1(이진)인 분류 문제에 사용한다.
P(Y=1|X) = 1 / (1 + e^-(β₀ + β₁X)) (시그모이드 함수)
- 결과값이 0~1 사이의 확률로 출력
- 확률이 0.5 이상이면 1, 미만이면 0으로 분류 (임계값 조정 가능)
# 로지스틱 회귀 model <- glm(am ~ wt + hp, data = mtcars, family = binomial) summary(model) # 예측 pred_prob <- predict(model, type = "response") # 확률 pred_class <- ifelse(pred_prob >= 0.5, 1, 0) # 분류
2.2.2 의사결정나무 (Decision Tree)
조건에 따라 데이터를 분할하여 트리 형태로 분류하는 기법이다.
[소득 > 5000?]
/ \
예 아니오
[나이 > 30?] → 미구매
/ \
예 아니오
→ 구매 → 미구매
| 알고리즘 | 분할 기준 | 특징 |
|---|---|---|
| CART | 지니 지수 (Gini Index) | 이진 분할만 가능 |
| C4.5/C5.0 | 정보 이득 (Information Gain) / 엔트로피 | 다중 분할 가능 |
| CHAID | 카이제곱 검정 | 범주형 변수에 적합 |
# 의사결정나무 (rpart) library(rpart) library(rpart.plot) model <- rpart(Species ~ ., data = iris, method = "class") rpart.plot(model) # 트리 시각화 # 예측 pred <- predict(model, iris, type = "class")
의사결정나무의 장단점:
| 장점 | 단점 |
|---|---|
| 해석이 쉬움 (화이트박스) | 과적합(Overfitting) 경향 |
| 비선형 관계도 포착 가능 | 작은 데이터 변화에 민감 |
| 전처리가 거의 불필요 | 연속형 변수 처리가 비효율적 |
2.2.3 앙상블 기법
여러 모델을 결합하여 단일 모델보다 더 좋은 성능을 얻는 기법이다.
| 기법 | 설명 | 대표 모델 |
|---|---|---|
| 배깅 (Bagging) | 부트스트랩 샘플링으로 여러 모델 학습 후 투표/평균 | 랜덤 포레스트 |
| 부스팅 (Boosting) | 이전 모델의 오류에 가중치를 부여하며 순차적 학습 | GBM, XGBoost, AdaBoost |
랜덤 포레스트 (Random Forest)
- 여러 의사결정나무의 집합 (배깅 기반)
- 각 나무 학습 시 변수도 랜덤하게 선택
- 과적합 방지에 효과적
# 랜덤 포레스트 library(randomForest) model <- randomForest(Species ~ ., data = iris, ntree = 500) print(model) importance(model) # 변수 중요도
2.2.4 kNN (k-Nearest Neighbors)
가장 가까운 k개의 이웃을 찾아 다수결 투표로 분류하는 기법이다.
- 거리 측정: 유클리드 거리, 맨하탄 거리 등
- k가 작으면 과적합, k가 크면 과소적합
- 데이터 정규화(스케일링)가 필수!
2.2.5 SVM (Support Vector Machine)
클래스 간 마진(Margin)을 최대화하는 결정 경계(Hyperplane)를 찾는 기법이다.
- 고차원에서도 효과적
- 커널 트릭으로 비선형 분류 가능 (RBF, Polynomial 커널 등)
2.2.6 나이브 베이즈 (Naive Bayes)
베이즈 정리를 기반으로 분류하며, 변수 간 독립을 가정한다.
- 텍스트 분류(스팸 필터 등)에 널리 사용
- 학습 속도가 빠름
- "나이브"한 이유: 변수 간 독립이라는 강한 가정
2.2.7 분류 모델의 평가
(1) 혼동 행렬 (Confusion Matrix)
| 예측: Positive | 예측: Negative | |
|---|---|---|
| 실제: Positive | TP (True Positive) | FN (False Negative) |
| 실제: Negative | FP (False Positive) | TN (True Negative) |
(2) 평가 지표
| 지표 | 공식 | 설명 |
|---|---|---|
| 정확도 (Accuracy) | (TP+TN) / 전체 | 전체 중 올바르게 분류한 비율 |
| 정밀도 (Precision) | TP / (TP+FP) | Positive 예측 중 실제 Positive 비율 |
| 재현율 (Recall, 민감도) | TP / (TP+FN) | 실제 Positive 중 올바르게 예측한 비율 |
| 특이도 (Specificity) | TN / (TN+FP) | 실제 Negative 중 올바르게 예측한 비율 |
| F1 Score | 2×(정밀도×재현율)/(정밀도+재현율) | 정밀도와 재현율의 조화평균 |
시험 핵심: 정밀도는 "예측의 정확성", 재현율은 "빠짐없이 찾아냄"에 초점. 암 진단 같은 경우 재현율이 더 중요하고(놓치면 안 되므로), 스팸 필터는 정밀도가 더 중요하다(정상 메일을 스팸으로 처리하면 안 되므로).
(3) ROC 곡선과 AUC
- ROC 곡선: FPR(1-특이도) vs TPR(재현율) 그래프
- AUC: ROC 곡선 아래 면적 (0.5~1, 1에 가까울수록 좋음)
- AUC = 0.5: 랜덤 수준, AUC = 1: 완벽한 분류
# 혼동 행렬 actual <- factor(c(1,1,0,1,0,0,1,0,1,0)) predicted <- factor(c(1,0,0,1,0,1,1,0,1,0)) table(actual, predicted) # 정확도 계산 sum(actual == predicted) / length(actual)
2.3 군집분석 (Clustering)
2.3.1 K-means 군집분석
| 항목 | 설명 |
|---|---|
| 원리 | k개의 중심점(centroid)을 잡고, 가장 가까운 중심에 데이터를 할당 → 중심 재계산 → 반복 |
| 장점 | 간단하고 빠름, 대규모 데이터에 적합 |
| 단점 | k를 사전에 지정해야 함, 초기값에 민감, 구형 군집만 잘 찾음 |
K-means 알고리즘 절차:
1. k개의 초기 중심점을 랜덤하게 선택
2. 각 데이터를 가장 가까운 중심에 할당
3. 각 군집의 새로운 중심 계산 (평균)
4. 중심이 변하지 않을 때까지 2~3 반복
# K-means data <- iris[, 1:4] # 숫자형 변수만 result <- kmeans(data, centers = 3, nstart = 20) result$cluster # 각 데이터의 군집 번호 result$centers # 각 군집의 중심 result$size # 각 군집의 크기 # 시각화 plot(data[,1:2], col = result$cluster, pch = 19) points(result$centers[,1:2], col = 1:3, pch = 8, cex = 3)
2.3.2 계층적 군집분석 (Hierarchical Clustering)
| 방식 | 설명 |
|---|---|
| 병합적 (Agglomerative) | 각 개체를 하나의 군집으로 시작 → 가장 가까운 군집끼리 병합 (Bottom-Up) |
| 분리적 (Divisive) | 전체를 하나의 군집으로 시작 → 나누어가며 분리 (Top-Down) |
거리 측정 방법 (연결법):
| 방법 | 설명 |
|---|---|
| 단일 연결법 (Single) | 두 군집 간 가장 가까운 거리 |
| 완전 연결법 (Complete) | 두 군집 간 가장 먼 거리 |
| 평균 연결법 (Average) | 모든 쌍의 거리 평균 |
| 와드법 (Ward) | 군집 내 분산 증가량을 최소화 |
# 계층적 군집분석 d <- dist(iris[,1:4]) # 거리 행렬 hc <- hclust(d, method = "ward.D2") # 와드법 plot(hc) # 덴드로그램 rect.hclust(hc, k = 3) # 3개 군집 표시 groups <- cutree(hc, k = 3) # 군집 할당
시험 핵심: K-means는 k를 미리 정해야 하고 계층적 군집은 덴드로그램(Dendrogram)을 보고 결정할 수 있다.
2.4 연관분석 (Association Analysis)
2.4.1 연관규칙이란?
항목 간의 연관 관계를 규칙(Rule) 형태로 발견하는 기법이다. 장바구니 분석이 대표적이다.
예: {맥주} → {기저귀} (맥주를 사면 기저귀도 산다)
2.4.2 연관규칙의 3대 지표 (★ 매우 중요)
| 지표 | 공식 | 설명 |
|---|---|---|
| 지지도 (Support) | P(A ∩ B) | A와 B가 동시에 발생하는 비율 |
| 신뢰도 (Confidence) | P(B|A) = P(A∩B)/P(A) | A를 구매한 사람 중 B도 구매한 비율 |
| 향상도 (Lift) | P(B|A)/P(B) = 신뢰도/P(B) | 우연 대비 실제 연관의 강도 |
향상도 해석:
- Lift = 1: A와 B는 독립 (연관 없음)
- Lift > 1: 양의 연관 (A를 사면 B도 살 확률 증가)
- Lift < 1: 음의 연관 (A를 사면 B를 살 확률 감소)
예시 계산:
전체 거래 1000건 중:
- 맥주 포함: 400건
- 기저귀 포함: 300건
- 맥주+기저귀 포함: 200건
지지도 = 200/1000 = 0.2 (20%)
신뢰도 = 200/400 = 0.5 (50%) ← 맥주 산 사람 중 50%가 기저귀도 구매
향상도 = 0.5 / 0.3 = 1.67 ← 우연보다 1.67배 더 연관
시험 핵심: 지지도·신뢰도·향상도의 공식과 해석을 반드시 숙지! 특히 향상도 = 1이면 독립이라는 점이 자주 출제된다.
2.4.3 Apriori 알고리즘
최소 지지도(Minimum Support)를 만족하는 빈발 항목집합(Frequent Itemset)을 찾은 후, 최소 신뢰도를 만족하는 연관규칙을 생성하는 알고리즘이다.
# 연관분석 (arules 패키지) # install.packages("arules") library(arules) # 트랜잭션 데이터 예시 data("Groceries") rules <- apriori(Groceries, parameter = list(support = 0.01, confidence = 0.3)) inspect(sort(rules, by = "lift")[1:10]) # 향상도 기준 상위 10개
제3장. R 프로그래밍
3.1 R 기초
3.1.1 R이란?
통계 분석과 데이터 시각화에 특화된 오픈소스 프로그래밍 언어이다.
3.1.2 데이터 타입
| 타입 | 설명 | 예시 |
|---|---|---|
| numeric | 숫자 (실수) | 3.14, 100 |
| integer | 정수 | 1L, 2L |
| character | 문자열 | "Hello", 'World' |
| logical | 논리값 | TRUE, FALSE |
| factor | 범주형 | factor(c("A","B","C")) |
3.1.3 데이터 구조
| 구조 | 설명 | 생성 |
|---|---|---|
| 벡터 (Vector) | 같은 타입의 1차원 배열 | c(1, 2, 3) |
| 행렬 (Matrix) | 같은 타입의 2차원 배열 | matrix(1:6, nrow=2) |
| 데이터프레임 (Data Frame) | 다른 타입 가능한 2차원 표 | data.frame(a=1:3, b=c("x","y","z")) |
| 리스트 (List) | 다른 타입·구조를 담을 수 있는 컨테이너 | list(a=1, b="hello", c=TRUE) |
# 벡터 x <- c(10, 20, 30, 40, 50) x[1] # 10 (R은 1부터 시작!) x[2:4] # 20, 30, 40 length(x) # 5 # 데이터프레임 df <- data.frame( 이름 = c("홍길동", "김철수", "이영희"), 나이 = c(25, 30, 28), 성별 = c("M", "M", "F") ) df$이름 # 칼럼 접근 df[1, ] # 첫 번째 행 df[, 2] # 두 번째 칼럼
3.1.4 자주 출제되는 R 함수
| 함수 | 설명 | 예시 |
|---|---|---|
| str(x) | 데이터 구조 확인 | str(iris) |
| summary(x) | 요약 통계량 | summary(iris) |
| head(x, n) | 처음 n행 | head(iris, 10) |
| tail(x, n) | 마지막 n행 | tail(iris, 5) |
| dim(x) | 행수, 열수 | dim(iris) → 150 4 |
| nrow(x), ncol(x) | 행수/열수 | nrow(iris) → 150 |
| names(x) | 칼럼명 | names(iris) |
| class(x) | 데이터 타입 | class(iris$Species) |
| table(x) | 빈도표 | table(iris$Species) |
| which.max(x) | 최대값 인덱스 | which.max(c(3,1,4,1,5)) → 5 |
| paste() | 문자열 결합 | paste("A", "B") → "A B" |
| subset() | 조건부 추출 | subset(iris, Species=="setosa") |
| apply() | 행/열 단위 함수 적용 | apply(matrix, 2, mean) |
| sapply() | 벡터/리스트에 함수 적용 | sapply(iris[,1:4], mean) |
| ifelse() | 조건부 값 반환 | ifelse(x > 0, "양수", "음수") |
| is.na() | NA 여부 확인 | is.na(x) |
| na.rm = TRUE | NA 제외 계산 | mean(x, na.rm = TRUE) |
| complete.cases() | NA 없는 행 확인 | complete.cases(df) |
# 시험에 자주 나오는 패턴 iris_summary <- summary(iris) # 각 칼럼의 요약 통계 str(iris) # 구조 확인 # 'data.frame': 150 obs. of 5 variables: # $ Sepal.Length: num 5.1 4.9 4.7 ... # $ Species : Factor w/ 3 levels ... head(iris, 3) # 상위 3행 dim(iris) # 150 5 table(iris$Species) # setosa:50, versicolor:50, virginica:50
3.2 데이터 전처리
3.2.1 결측치 처리
# 결측치 확인 sum(is.na(df)) # 전체 NA 개수 colSums(is.na(df)) # 칼럼별 NA 개수 # 결측치 제거 df_clean <- na.omit(df) # NA가 있는 행 전체 제거 # 결측치 대체 df$age[is.na(df$age)] <- mean(df$age, na.rm = TRUE) # 평균으로 대체
3.2.2 이상값 처리
# 상자 그림으로 이상값 확인 boxplot(x)$out # 이상값 목록 # IQR 방법 Q1 <- quantile(x, 0.25) Q3 <- quantile(x, 0.75) IQR_val <- Q3 - Q1 lower <- Q1 - 1.5 * IQR_val upper <- Q3 + 1.5 * IQR_val x_clean <- x[x >= lower & x <= upper]
3.2.3 데이터 변환
# 정규화 (Min-Max Scaling): 0~1 범위로 변환 normalize <- function(x) (x - min(x)) / (max(x) - min(x)) df_norm <- sapply(df[,1:4], normalize) # 표준화 (Z-score): 평균=0, 표준편차=1 df_scaled <- scale(df[,1:4]) # 로그 변환 (오른쪽 꼬리 분포에 유효) x_log <- log(x)
3.3 데이터 시각화
3.3.1 기본 그래프
| 함수 | 그래프 유형 | 용도 |
|---|---|---|
| plot(x, y) | 산점도 | 두 변수의 관계 |
| hist(x) | 히스토그램 | 연속형 변수의 분포 |
| barplot(x) | 막대 그래프 | 범주별 빈도/값 비교 |
| boxplot(x) | 상자 그림 | 분포와 이상값 파악 |
| pie(x) | 원형 그래프 | 비율 표시 |
# 산점도 plot(iris$Sepal.Length, iris$Sepal.Width, main = "Sepal Length vs Width", xlab = "Length", ylab = "Width", col = iris$Species, pch = 19) # 히스토그램 hist(iris$Sepal.Length, breaks = 20, main = "Sepal Length Distribution", col = "lightblue") # 상자 그림 boxplot(Sepal.Length ~ Species, data = iris, main = "Species별 Sepal Length", col = c("red", "green", "blue"))
3.3.2 ggplot2 (자주 출제!)
library(ggplot2) # 산점도 ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + geom_point() + labs(title = "Sepal Dimensions") # 히스토그램 ggplot(iris, aes(x = Sepal.Length, fill = Species)) + geom_histogram(bins = 20, alpha = 0.7) # 상자 그림 ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species)) + geom_boxplot() # 선 그래프 ggplot(data, aes(x = date, y = value)) + geom_line() + geom_point()
ggplot2 핵심 구조:
ggplot(데이터, aes(x=변수, y=변수, color=변수)) +
geom_xxx() + # 그래프 유형 (point, line, bar, histogram, boxplot)
labs() + # 제목, 축 이름
theme_xxx() # 테마
시험 핵심: ggplot2에서 aes()는 미적 매핑(aesthetic mapping)으로 데이터를 시각적 속성에 연결한다. geom_xxx()는 기하학적 객체(geometric object)로 그래프 유형을 결정한다.
연습문제
기본 문제
문제 1. 다음 중 비율 척도에 해당하는 것은?
① 온도(℃) ② 학점(A/B/C) ③ 몸무게(kg) ④ 지능지수(IQ)
정답: ③ 해설: 몸무게는 절대 영점(0kg = 무게 없음)이 있으므로 비율 척도이다. 온도(℃)와 IQ는 등간 척도(0이 "없음"을 의미하지 않음), 학점은 순서 척도이다.
문제 2. 이상값이 포함된 데이터에서 대표값으로 가장 적합한 것은?
① 평균 ② 중앙값 ③ 최빈값 ④ 표준편차
정답: ② 해설: 중앙값(Median)은 이상값에 강건(Robust)하여 이상값이 있을 때 대표값으로 가장 적합하다.
문제 3. 포아송분포의 특징으로 올바른 것은?
① 평균 > 분산 ② 평균 < 분산 ③ 평균 = 분산 ④ 평균과 분산은 무관
정답: ③ 해설: 포아송분포 Poisson(λ)에서 평균과 분산은 모두 λ로 같다.
문제 4. 제1종 오류에 대한 설명으로 올바른 것은?
① 귀무가설이 거짓인데 채택하는 오류 ② 귀무가설이 참인데 기각하는 오류 ③ 대립가설이 참인데 기각하는 오류 ④ 대립가설이 거짓인데 채택하는 오류
정답: ② 해설: 제1종 오류(α 오류)는 귀무가설(H₀)이 참인데 잘못 기각하는 오류이다. "없는데 있다고 판단"하는 것이다.
문제 5. 다중 회귀분석에서 독립변수 간의 높은 상관관계로 인해 발생하는 문제는?
① 이분산성 ② 자기상관 ③ 다중공선성 ④ 정규성 위반
정답: ③ 해설: 다중공선성(Multicollinearity)은 독립변수들 간에 강한 상관관계가 있을 때 발생하며, VIF(분산팽창요인)로 진단한다.
문제 6. 연관분석에서 향상도(Lift)가 1인 경우의 해석으로 올바른 것은?
① 강한 양의 연관 관계 ② 강한 음의 연관 관계 ③ 두 항목은 독립 ④ 데이터 부족
정답: ③ 해설: 향상도(Lift) = 1이면 두 항목은 서로 독립이며, 우연히 함께 구매하는 수준이다.
문제 7. K-means 군집분석에 대한 설명으로 올바르지 않은 것은?
① k를 사전에 지정해야 한다 ② 초기 중심점에 영향을 받지 않는다 ③ 유클리드 거리를 주로 사용한다 ④ 반복적으로 중심을 재계산한다
정답: ② 해설: K-means는 초기 중심점(centroid)에 민감하다. 따라서 nstart 옵션으로 여러 번 실행하여 최적의 결과를 선택하는 것이 좋다.
문제 8. 다음 R 코드의 결과는?
x <- c(3, 7, NA, 5, 2) mean(x, na.rm = TRUE)
① NA ② 3.4 ③ 4.25 ④ 17
정답: ③ 해설: na.rm = TRUE는 NA를 제거하고 계산한다. (3+7+5+2)/4 = 17/4 = 4.25
문제 9. 다음 중 분류 모델의 평가 지표에서 "실제 Positive 중 올바르게 예측한 비율"은?
① 정확도 ② 정밀도 ③ 재현율 ④ 특이도
정답: ③ 해설: 재현율(Recall, 민감도) = TP / (TP+FN)으로, 실제 Positive 중 올바르게 Positive로 예측한 비율이다.
문제 10. 의사결정나무의 장점으로 올바르지 않은 것은?
① 해석이 쉽다 ② 이상값에 민감하지 않다 ③ 과적합이 발생하지 않는다 ④ 비선형 관계를 포착할 수 있다
정답: ③ 해설: 의사결정나무는 과적합(Overfitting) 경향이 있는 것이 대표적 단점이다. 가지치기(Pruning)로 이를 완화한다.
심화 문제
문제 11. 다음 연관분석 결과를 해석하시오.
전체 거래: 500건, A 구매: 200건, B 구매: 150건, A와 B 동시 구매: 100건
지지도, 신뢰도, 향상도를 구하시오.
정답:
- 지지도(Support) = P(A∩B) = 100/500 = 0.2 (20%)
- 신뢰도(Confidence) = P(B|A) = P(A∩B)/P(A) = 100/200 = 0.5 (50%)
- 향상도(Lift) = 신뢰도/P(B) = 0.5 / (150/500) = 0.5/0.3 = 1.67
- 해석: 향상도가 1보다 크므로 A와 B는 양의 연관 관계가 있다.
문제 12. 다음 R 코드의 출력 결과는?
x <- c(10, 20, 30, 40, 50) x[x > 25]
① 10 20 ② 30 40 50 ③ TRUE TRUE TRUE ④ 3 4 5
정답: ② 해설: x > 25는 논리 벡터 (FALSE, FALSE, TRUE, TRUE, TRUE)를 생성하고, 이를 인덱스로 사용하면 TRUE인 위치의 값 30, 40, 50이 반환된다.
문제 13. 다음 혼동 행렬에서 정밀도와 재현율을 구하시오.
| 예측: P | 예측: N | |
|---|---|---|
| 실제: P | 40 | 10 |
| 실제: N | 5 | 45 |
정답:
- TP=40, FN=10, FP=5, TN=45
- 정밀도 = TP/(TP+FP) = 40/(40+5) = 40/45 = 0.889 (88.9%)
- 재현율 = TP/(TP+FN) = 40/(40+10) = 40/50 = 0.8 (80%)
- F1 = 2×0.889×0.8/(0.889+0.8) = 0.842
문제 14. 다음 중 ggplot2의 문법 구조로 올바른 것은?
① ggplot(data) + aes(x, y) + geom_point ② ggplot(data, aes(x, y)) + geom_point() ③ ggplot(aes(x, y), data) + point() ④ geom_point(data, aes(x, y))
정답: ② 해설: ggplot2는 ggplot(데이터, aes(매핑)) + geom_xxx() 구조를 따른다. geom 함수에는 반드시 괄호()가 필요하다.
문제 15. 중심극한정리에 대한 설명으로 올바르지 않은 것은?
① 표본 크기가 충분히 크면 표본평균은 정규분포를 따른다 ② 모집단이 정규분포가 아니어도 성립한다 ③ 보통 표본 크기 n ≥ 30이면 적용 가능하다 ④ 표본 크기가 클수록 표본평균의 분산도 커진다
정답: ④ 해설: 표본 크기(n)가 커질수록 표본평균의 표준오차(SE = σ/√n)는 작아진다. 즉, 표본 크기가 클수록 표본평균의 분산은 줄어든다.