01 로지스틱 회귀
-01 개념
-02 모형
-03 단순 로지스틱 회귀분석 모델
-04 클래스 불균형 발생시
-05 예제 및 문제풀이
02 시계열 분석
-01 정상성과 비정상성
-02 시계열 모형
-03 분해 시계열
03 연관 분석
-01 연관분석의 개념과 특징
-02 연관분석 알고리즘
-03 연관분석 측정지표
01 로지스틱 회귀
-01 개념
- 분류 예측 모형 (KNN, SVM, 나이브베이즈, 로지스틱 회귀)
- 회귀 모형(선형회귀 : 릿지, 라쏘, 랜덤포레스트 회귀, KNN 회귀, SVM 회귀)
반응변수가 범주형인 경우 적용되는 회귀분석 모형이다.
(독립변수들의 선형결합(가중합)으로 로그오즈를 추정하는 모형)
반응변수의 각 범주에 속할 확률이 얼마인지를 추정하여 추정 확률을 기준치에 따라 분류하는 모델로, 일반적으로 반응변수의 집단이 두 개인 이진 분류가 기본이며 세 개 이상인 다중 로지스틱 모델도 존재한다.
-02 모형
독립변수(X)는 연속형 변수이고, 종속변수(Y)는 범주형 변수이다.
특히 종속변수가 0과 1로 이루어진 이진 분류(Binary Classification) 문제에서 주로 사용되는데, 이진 변수 (0, 1)은 값 그자체를 선형적으로 해석하기 어렵다.
따라서 확률을 바로 사용하는 대신 확률을 로그 오즈의 형태로 변환하여 선형 모델로 표현한다.
* 오즈(Odds)란 승산, 실패 대비 성공 확률의 비 : odds = p / (1 - p)
* 오즈에 로그를 취한 값을 로짓(Logit)이라고 함
로지스틱 회귀는 이 로그 오즈를 독립변수들의 선형 결합으로 표현하는 모델이다.
또한 선형 결합 결과를 다시 0 ~ 1 사이의 확률로 변환하기 위해 시그모이드 (Sigmoid) 함수를 사용한다.

즉, 로지스틱 회귀는:
> 독립변수의 선형 결합을 계산하고
> 이를 로그 오즈(Logit)로 해석하며 (연속형 -> 범주형)
> 시그모이드 함수를 통해 최종적으로 0~1 사이의 확률로 변환하는 모델이다.
또한 로지스틱 회귀는 다음과 같은 장단점이 존재한다. :
> 장점 : 통계적 평가가 가능하다. (회귀계수 유의성 검정)
> 단점 : 통계적 가정이 필요하며 변수선택이 필수적이다. 또한 이상치에 민감하다.
-03 단순 로지스틱 회귀분석 모델
한 개의 설명변수를 사용하여 성공 (또는 사건 발생) 확률을 예측하는 모형으로, 로그 오즈로 성공 확률 (P(Y))를 도출할 수 있다.
성공확률에 대한 함수식을 시그모이드 함수라고 하며, 어떤 X값에 대해서도 0과 1 사이의 확률값을 반환한다.
전통적인 회귀모형은 최소제곱법에 의해 회귀식을 추정하나, 로지스틱 회귀는 y가 확률이기 때문에 최대우도추정법 (사후확률이 최대가 되는 지점을 추정)에 의해 회귀식을 추정한다.
-04 클래스 불균형 발생시
만약 1이 성공, 0이 실패일 때 다음과 같은 클래스 불균형이 발생하였다고 가정하였다. :
| 실패 (0) | 성공 (1) |
위와 같은 클래스 불균형이 발생하였고 성공 비율을 보다 올리고 싶다면 임계값 (cut off)를 낮게 조정한다.
임계값 조정이 가능한 대표적인 모델이 시그모이드 함수이다.
또한 클래스 불균형에 대한 조절 방안은 다음과 같다.
1) 오버샘플링
2) 언더샘플링
3) 임계값 (cut off) 조정
4) 소수클래스 가중치 조정
클래스 불균형 및 조정 방안은 이후 수업 시간에 설명을 보다 진행할 예정이다. (Python 모델링 수업 시)
-05 예제 및 문제풀이
[ 예제 - cancer 데이터 분류분석 (로지지스틱 회귀 / 랜덤포레스트) ]
# 1. 데이터 로딩
df <- read.csv('cancer.csv')
cancer <- df
# 불필요한 변수 제거
cancer$id <- NULL
# Y 변환 (Benign : 0, Malignant : 1)
cancer$diagnosis <- factor(ifelse(cancer$diagnosis == 'Malignant', 1, 0))
# 2. 데이터 분리
set.seed(10)
rn <- sample(1:nrow(cancer), nrow(cancer) * 0.7)
> sample(1:nrow(cancer), nrow(cancer) * 0.7)
[1] 217 396 273 488 197 85 249 219 54 475 562 241 356 434 374 75 185 384 209 451 33 399 90
[24] 202 538 275 24 552 341 545 417 537 299 305 433 415 36 500 67 50 280 366 310 522 58 435
[47] 187 481 63 560 406 180 290 203 48 71 160 123 330 312 251 287 147 40 288 446 473 565 112
cancer_tr <- cancer[rn, ]
cancer_te <- cancer[-rn, ]
y_tr <- df$diagnosis[rn, ] # 원래 train 데이터의 정답
y_te <- df$diagnosis[-rn, ] # 원래 test 데이터의 정답
# 클래스별 빈도 확인
sum(cancer$diagnosis == 0)
sum(cancer$diagnosis == 1)
> sum(cancer$diagnosis == 0)
[1] 357
> sum(cancer$diagnosis == 1)
[1] 212
# 3. 학습
# 1) 랜덤포레스트
library(randomForest)
set.seed(100)
m1 <- randomForest(diagnosis ~ ., cancer_tr)
> randomForest(diagnosis ~ ., cancer_tr)
Call:
randomForest(formula = diagnosis ~ ., data = cancer_tr)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 5
OOB estimate of error rate: 4.02%
Confusion matrix:
0 1 class.error
0 243 6 0.02409639
1 10 139 0.06711409
# 2) 로지스틱 회귀
m2 <- glm(diagnosis ~ ., data = cancer_tr, family = binomial)
> m2 <- glm(diagnosis ~ ., data = cancer_tr, family = binomial)
경고메시지(들):
1: glm.fit: 알고리즘이 수렴하지 않았습니다
2: glm.fit: 적합된 확률값들이 0 또는 1 입니다
▲ 최대우도추정법에 의하여 계속하여 확률을 계산한다.
cancer 데이터는 분류가 잘되는 편에 속하기 때문에 최대 수렴 구간을 찾는 과정에 있어 수렴구간이 보이지 않는다는 메시지다.
분류가 지나치게 잘 되어서 발생하는 경고메시지이며, 통상의 데이터에서는 잘 발생하지 않는다.
따라서 해당 경고는 무시 후 다음 단계를 진행하기로 한다.
summary(m2)
> summary(m2)
Call:
glm(formula = diagnosis ~ ., family = binomial, data = cancer_tr)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.596e+03 3.852e+05 -0.004 0.997
radius_mean -1.325e+02 1.578e+05 -0.001 0.999
texture_mean 5.895e+00 3.166e+03 0.002 0.999
perimeter_mean -6.196e+00 2.283e+04 0.000 1.000
area_mean 1.330e+00 5.026e+02 0.003 0.998
smoothness_mean -2.048e+03 1.195e+06 -0.002 0.999
compactness_mean -2.152e+03 8.184e+05 -0.003 0.998
concavity_mean 2.354e+02 9.021e+05 0.000 1.000
concave_points_mean 4.279e+03 1.130e+06 0.004 0.997
symmetry_mean -1.105e+02 3.088e+05 0.000 1.000
fractal_dimension_mean 1.036e+04 3.306e+06 0.003 0.997
radius_se 1.204e+03 1.690e+05 0.007 0.994
texture_se -2.229e-01 1.685e+04 0.000 1.000
perimeter_se -7.392e+01 2.418e+04 -0.003 0.998
area_se -4.482e+00 9.353e+02 -0.005 0.996
smoothness_se -8.465e+02 2.813e+06 0.000 1.000
compactness_se 4.167e+02 1.037e+06 0.000 1.000
concavity_se -2.542e+03 9.161e+05 -0.003 0.998
concave_points_se 1.470e+04 2.744e+06 0.005 0.996
symmetry_se -1.641e+03 1.148e+06 -0.001 0.999
fractal_dimension_se -1.767e+04 8.197e+06 -0.002 0.998
radius_worst 1.614e+02 3.007e+04 0.005 0.996
texture_worst 4.584e+00 2.258e+03 0.002 0.998
perimeter_worst 5.548e+00 3.832e+03 0.001 0.999
area_worst -1.111e+00 1.860e+02 -0.006 0.995
smoothness_worst 5.358e+02 7.427e+05 0.001 0.999
compactness_worst 2.326e+02 2.695e+05 0.001 0.999
concavity_worst 5.857e+02 1.793e+05 0.003 0.997
concave_points_worst -1.412e+03 4.555e+05 -0.003 0.998
symmetry_worst 1.837e+02 2.072e+05 0.001 0.999
fractal_dimension_worst -3.949e+02 1.414e+06 0.000 1.000
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 5.2635e+02 on 397 degrees of freedom
Residual deviance: 1.9963e-07 on 367 degrees of freedom
AIC: 62
Number of Fisher Scoring iterations: 25
# 4. 평가
# 1) 랜덤포레스트
m1_pre_tr <- predict(m1, newdata = cancer_tr)
m1_pre_te <- predict(m1, newdata = cancer_te)
sum(m1_pre_tr == cancer_tr$diagnosis) / nrow(cancer_tr) * 100
sum(m1_pre_te == cancer_te$diagnosis) / nrow(cancer_te) * 100
> sum(m1_pre_tr == cancer_tr$diagnosis) / nrow(cancer_tr) * 100
[1] 100
> sum(m1_pre_te == cancer_te$diagnosis) / nrow(cancer_te) * 100
[1] 93.56725
# 2) 로지스틱 회귀
prob_tr <- predict(m2, newdata = cancer_tr) # P(Y == 1)
* 만약 1 - prob_tr 로 세팅하면 P(Y == 0)
m1_pre_te <- predict(m2, newdata = cancer_te) # P(Y == 1)
> predict(m2, newdata = cancer_tr)
491 330 368 460 439 438 423 511
-150.12686 122.02556 -150.93469 -321.70925 -169.15921 -114.61949 -247.60527 -328.63851
344 271 143 455 568 536 525 351
555.48427 -373.60500 -328.33168 -215.23934 1084.95222 517.85267 -298.85537 -262.34323
▲ 옵션을 지정하지 않을 시 로그 오즈의 값이 그대로 출력된다.
prob_tr <- predict(m2, newdata = cancer_tr, type = 'response')
ifelse(prob_tr > 0.5, 1, 0)
> ifelse(prob_tr > 0.5, 1, 0)
491 330 368 460 439 438 423 511 344 271 143 455 568 536 525 351 392 231 342 338 285 50 101
0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 1
33 324 93 114 307 288 267 335 417 347 42 334 13 538 361 373 26 209 48 527 482 317 132
1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1
▲ 임계값 (0.5)를 기준으로 확률에 따른 0, 1 분류가 출력된다.
prob_tr <- predict(m2, newdata = cancer_tr, type = 'response')
prob_te <- predict(m2, newdata = cancer_te, type = 'response')
m2_pre_tr <- ifelse(prob_tr > 0.5, 1, 0) # cutoff = 0.5
m2_pre_te <- ifelse(prob_te > 0.5, 1, 0) # cutoff = 0.5
sum(m2_pre_tr == cancer_tr$diagnosis) / nrow(cancer_tr) * 100
sum(m2_pre_te == cancer_te$diagnosis) / nrow(cancer_te) * 100
> sum(m2_pre_tr == cancer_tr$diagnosis) / nrow(cancer_tr) * 100
[1] 100
> sum(m2_pre_te == cancer_te$diagnosis) / nrow(cancer_te) * 100
[1] 95.90643
** 참고 - 빅데이터분석기사 실기 제출 유형
result <- predict(m2, newdata = cancer_te, type = 'response') # P(Y == 1)
df_result <- data.frame(prob = result)
write.csv(df_result, 'result.csv', row.names = F)
02 시계열 분석
시간의 흐름에 따라 관측된 데이터 (예 : 주가, 날씨 등)로, 정상 시계열 자료와 비정상 시계열 자료로 구분된다.
대부분은 비정상 시계열 자료에 해당된다.
시계열 분석을 위해서는 정상성을 만족해야 한다.
+) 전통 시계열 모델은 정상성을 만족하지 않으면 분석을 진행할 수 없는 경우가 많은 편이다.
따라서 정상성에 대한 정의를 명확히 할 필요가 있다.
(대부분의 모델이 정상성을 만족해야 하는 것이지, 시계열 분석을 위해서는 무조건 정상성을 가정해야 하는 것이 아니다.)
+) 따라서 모델에 따라 비정상 시계열을 정상성 시계열로 변환해야 할 때가 있다. (정상성 변환)
로그변환 : 변동성을 잡기 위하여 사용 (분산이 일정하지 않는 경우)
차분 : 추세를 잡기 위하여 사용 (평균이 일정하지 않은 경우)
** 차분 : 1시점 차이의 데이터
Yt - Yt-1 : 1시점 차분
Yt - Yt-2 : 2시점 차분
+) 시계열 데이터는 시간의 흐름에 따라 유의한 변화를 보이는 데이터를 뜻한다.
만약 특정한 장소에 녹음기를 설치한 후 계속해서 녹음한 음성의 데시벨을 y, 시간을 x에 배치한다고 가정하자.
오토바이가 지나가거나 어린아이가 울음을 터뜨리는 등의 사건에 따라 데시벨이 변경될 것이다.
시간을 기준으로 계속해서 수집한 데이터지만 시간에 의한 영향이 아니라 외부의 사건에 의해 데시벨이 영향을 받기 때문에,
무조건적으로 x축이 시간이라고해서 시계열 데이터라고 말할 수는 없다.
-01 정상성과 비정상성
1) 정상성
시점에 관계없이 시계열의 특성이 일정하다는 의미이며, 평균이 일정하고 분산이 시점에 의존하지 않는다.
( = 평균과 분산이 시간의 흐름에 따라 바뀌지 않는다.)
시점은 시간의 흐름에 따른 변화를 말하기 때문에 시간이 흘러도 오르내리는 특성이 없다는 의미이다.
또한 분산 역시 시간이 변화되더라도 수치가 크게 오르내리지 않아야 한다.
공분산 (두 변수간의 상관성)은 단지 시차에만 의존하고 시점 자체에는 의존하지 않는다.
(ex : 어제의 주가와 오늘의 주가간의 상관관계, 2일전의 주가와 오늘의 주가간의 상관관계가 다르다.)
평균은 일정하더라도 상관관계에 있어서는 시차에 따른 차이가 존재한다는 뜻이다.
** 공분산 : 두 변수의 상관성을 수치로 해석하는 척도(방향성의 해석 가능, 크기 해석 불가)
시차가 서로 다른 공분산은 달라지는데, 1시점 차이 주가의 공분산과 2시점 차이 주가의 공분산은 다르다.
그러나 시차가 동일하다면 과거의 공분산과 현재의 공분산은 같다.

# 시차가 다른 경우의 공분산은 다르다.
cov(Yt, Yt-1) != cov(Yt, Yt-2)
# 시간대(시점)은 다르지만 시차가 같다면 공분산은 같아야 한다.
cov(Yt, Yt-1) = cov(Yt, Yt-2)
2) 비정상성
평균이 시간 흐름에 따라 꾸준히 증가하며, 분산과 공분산이 일정하지 않다.
3) 정상성 확인
(1) 시각화
(2) ACF (Autocorrelation function : 자기상관함수)
시차 (lag)별로 데이터의 자기상관 계수를 나타내는 값이며 정상 시계열이라면 ACF는 빠르게 0에 수렴해야 한다.
피어슨 상관계수를 통해 자기상관 계수를 알 수 있다.
보통 그래프로 그려서 확인하기 때문에 시각화 도구로 오인하는 경우가 있다.
정확히 말하면 상관계수를 구하고, 상관계수를 그래프로 그리는 경우가 많다.
(3) PACF (Partial Autocrrelation function : 부분자기상관함수)
각 시차에서 직접적인 자기상관만 추출한 함수이다.
시계열 모델 (특히 AR모델)에서 몇 시차까지 포함할지를 결정할 때 사용한다.
PACF가 특정 시차 이후 급격히 떨어진다면 그 시차까지 AR 구성이 가능하다.
(4) ADF (Augmented Dickey-Fuller test)
가장 널리 사용되는 정상성 검정 통계검정 방법이다. (가설검정)
H0 : 비정상 시계열
H1 : 정상 시계열
따라서 p-value가 0.05보다 작을 경우 H0을 기각하며 정상 시계열임을 확인하는 방식이다.
-02 시계열 모형
1) 자기회귀모형 (AR : Auto - Regressive)
현 시점의 자료를 p시점 이전의 과거 자료로 설명하는 시계열 모델이다.
현 시점의 데이터가 이전 시점의 데이터들의 선형 결합으로 표현되며, 백색잡음 (오차항)은 서로 독립, 평균이 0, 분산이 일정한 정규분포를 따른다고 가정한다.
따라서 전통회귀모형과 동일하게 요구되는 독립성, 등분산성, 정규성 등에 대한 만족이 오차항에 요구된다. (선형성 가정 제외)
추세가 존재한다 하더라도 자기상관이 없을 수 있다.
(추세가 있다 != 자기상관이 있다.)
따라서 자기회귀모형은 자기상관에 의한 영향만으로 예측하기 때문에 정상성 가정이 필수로 요구된다.

2) 이동평균모형 (MA : Moving Average)
시간이 지날수록 관측치의 평균값이 지속적으로 증가하거나 감소하는 시계열 모형이다.
현시점의 자료는 평균과 유한 개의 과거 백색 잡음의 선형결합으로 표현되었기 때문에 항상 정상성을 만족한다.

3) 자기 회귀 누적 이동평균 모형 (ARIMA : Auto Regressive Integrated Moving Average)
비정상 시계열 자료를 다룰 수 있는 모형으로 대부분의 시계열 자료를 설명할 수 있다.
차분이나 변환을 통해 정상화할 수 있다.
ARIMA(p,d,q) : AR(p) + diff(d) + MA(q)
+) 그러나 계절에 의한 영향을 받는 데이터를 사용할 시, 계절성에 대한 고려를 해야 한다.
차분과 계절성을 함께 고려한 SARIMA(Seasonal Autoregressive Integrated Moving Average Model)라는 모델이 존재한다.
따라서 계절성 데이터를 사용할 시에는 일반 ARIMA가 아닌 SARIMA의 사용을 고려하여야 한다.
1차차분은 추세(선형)를 잡기 위해서, 2차차분은 곡선 형태의 추세를 잡기 위해서 사용한다.
-03 분해 시계열
시계열에 영향을 주는 일반적인 요인을 시계열에서 분리해 분석하는 방법이다.
추세 요인, 계절 요인, 순환 요인, 불규칙 요인으로 분해한다.

03 연관 분석
-01 연관분석의 개념과 특징
데이터 내부에 존재하는 항목 간의 상호 관계 혹은 종속 관계를 찾아내는 분석기법이다.
데이터 간의 관계에서 조건과 반응을 연결하는 분석기법으로 장바구니 분석, 서열 분석이라고도 부른다.
비지도 학습의 대표적 분석 기법이다. (품목이라는 x 사이의 연관성을 확인하기 때문)
목적변수 (종속변수)가 없는 경우에 사용하기에 분석 방향과 목적 없이 분석이 가능하다.
분석에 필요한 계산이 쉬우며(연관성의 강도를 확률로 계산) 조건과 반응으로 결과가 표현되기에 쉽게 이해가 가능하다.
적절한 세분화로 인한 품목 결정이 장점이지만 너무 세분화된 품목은 의미 없는 결과를 얻을 수 있기에 주의가 필요하다.
=> 전처리 능력 (적절한 세분화)이 중요한 분석이다.
-02 연관분석 알고리즘
1) Apriori 알고리즘
데이터들에 대한 발생 빈도를 기반으로 각 데이터 간의 연관 관계를 밝히는 방법이다.
빈발 항목 집합 (Frequent Itemsets)을 찾기 위한 전통적인 알고리즘으로, 하위 항목 집합이 빈발하지 않으면 상위 항목 집합도 빈발하지 않다는 Apriori 원리를 이용한다.
단계적으로 후보 집합을 생성 -> 지지도 (Support) 계산 -> 필터링
모든 경우의 수를 탐색하며 반복적인 스캔을 많이 하기 때문에 속도가 느릴 수 있다.
{라면} -> {우유}
{라면, 김치} -> {우유}
{우유} -> {라면, 김치}
{차면,치즈} -> {우유}
▲ 위와 같이 계속하여 스캔을 진행한다.
2) FP-Growth
Apriori의 속도 문제를 개선한 고속 알고리즘이다.
데이터를 압축한 트리 구조(FP-트리)를 사용하여 전체 데ㅌ이터 재탐색 없이 빈발 항목 집합을 효율적으로 찾는다.
후보 집합을 생성하지 않고 트리를 따라가며 패턴을 확장한다.
속도와 메모리 사용 측면에서 Apriori보다 효율적이다.
-03 연관분석 측정지표
1) 지지도 (Support)
P(A∩B) = A와 B가 동시에 포함된 거래 수 / 전체 거래 수
전체 거래 중 항목 A와 항목 B를 동시에 포함하는 거래의 비율이다.
연관성 분석에 있어 초기 기준점이 되는데, 거래수를 기반으로 지지한다.
예를 들어서 100건의 거래 중 3건이 존재하는 거래를 위해 새로운 판매 이벤트를 기획할 이유는 없을 것이다.
따라서 100건의 거래 중 n건 아래의 조합은 관계가 있다 하더라도 무시한다. 식으로 지지도를 설정할 수 있다.
2) 신뢰도 (Confidence)
P(B|A) = P(A∩B) / P(A) = A와 B가 동시에 포함된 거래 수 / A를 포함하는 거래 수
A 상품을 샀을 때 B 상품을 살 조건부 확률로 추천을 할 만하다고 보여주는 기준 혹은 강도를 말한다.
예를 들어서 A 상품이 100개 판매되었으나, 그 중에서도 A와 B 상품이 동시에 거래되는 것과 A 상품만 100건 거래되는 것은 다르다.
3) 향상도 (Lift)
신뢰도 / P(B) = P(B|A) / P(B) = P(A∩B) / P(A) X P(B)
규칙이 우연에 의해 발생한 것인지를 판단하기 위해 연관성 정도를 측정하는 척도이다.
두 품목의 상관관계를 기준으로 도출된 규칙의 예측력을 평가하며, 신뢰도가 동일하였을 때 향상도가 높은 품목을 추천하게 된다.
향상도 > 1 : 양의 상관 관계
향상도 = 1 : 독립적 관계
향상도 < 1 : 음의 상관 관계
=> 따라서 최소 지지도를 넘으면서도 신뢰도가 강해야하고, 향상도도 높아야 한다.
'아이티윌_데이터 분석 55기 > 강의내용 필기_통계 및 분석' 카테고리의 다른 글
| #16 16일차_결측값 처리와 이상값 검색 (★) (0) | 2026.05.07 |
|---|---|
| #15 15일차_차원축소 : 다차원 척도법(MDS), 주성분 분석(PCA) (0) | 2026.05.06 |
| #14 14일차_회귀분석, 변수 선택 및 제거 (0) | 2026.04.30 |
| #13 13일차_군집분석 및 평가 ·해석, 변수 스케일링, 회귀분석 (0) | 2026.04.29 |
| #12 12일차_교차검증, 분류모형, 군집분석 (0) | 2026.04.28 |