# 일반회귀분석 vs 로지스틱 회귀분석 차이점 이해
# 1. 일반 선형회귀분석 예시
# 목표: mpg를 hp, am으로 예측
# 데이터 준비
data(mtcars)
# 선형회귀모형 적합
model_lm <- lm(mpg ~ hp + am, data = mtcars)
# 결과 요약 출력
summary(model_lm)
##
## Call:
## lm(formula = mpg ~ hp + am, data = mtcars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.3843 -2.2642 0.1366 1.6968 5.8657
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 26.584914 1.425094 18.655 < 2e-16 ***
## hp -0.058888 0.007857 -7.495 2.92e-08 ***
## am 5.277085 1.079541 4.888 3.46e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.909 on 29 degrees of freedom
## Multiple R-squared: 0.782, Adjusted R-squared: 0.767
## F-statistic: 52.02 on 2 and 29 DF, p-value: 2.55e-10
# 해석
# 다른 조건(am)이 동일할 때,
# 마력(hp)이 1단위 증가하면
# 평균 연비(mpg)는 0.0589 감소합니다.
# 즉, 마력이 클수록 연비가 낮아지는 경향이 있습니다.
#마력이 동일할 때,
#수동 변속기(am=1) 차량은 자동 변속기(am=0)보다
#평균 연비(mpg)가 약 5.28 단위 더 높다는 의미입니다.
#즉, 수동 변속기 차량이 평균적으로 연비가 더 좋습니다.
# 2. 로지스틱 회귀분석 예시
# 목표: vs (0: V형, 1: 직렬형)를 mpg, am으로 예측
# 로지스틱 회귀모형 적합 (이진분류)
model_logit <- glm(vs ~ mpg + am, data = mtcars, family = binomial())
# 결과 요약 출력
summary(model_logit)
##
## Call:
## glm(formula = vs ~ mpg + am, family = binomial(), data = mtcars)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -12.7051 4.6252 -2.747 0.00602 **
## mpg 0.6809 0.2524 2.698 0.00697 **
## am -3.0073 1.5995 -1.880 0.06009 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 43.860 on 31 degrees of freedom
## Residual deviance: 20.646 on 29 degrees of freedom
## AIC: 26.646
##
## Number of Fisher Scoring iterations: 6
# mpg 0.6809 해석
# 로그 오즈로 해석: 선형관계 설명이 직관적 (선형 회귀와 유사)->로짓변환환
# 로그 오즈 증가량: mpg가 1단위 증가할 때,
# 직렬형 엔진(vs = 1)일 로그 오즈가 +0.6809만큼 증가
# 오즈비로 해석 : 배수로 해석
# 연비(mpg)가 1단위 증가할 때,
# vs = 1(직렬형 엔진)일 오즈(odds)는
# 기존보다 약 1.975배 증가합니다.
# 연비가 높을수록 직렬형 엔진일 가능성이 커진다고 해석할 수 있습니다.
# 인공신경망
library(nnet)
library(NeuralNetTools)
library(ggplot2)
# 2. 데이터 준비
data(iris)
iris$Species <- as.factor(iris$Species)
# 3. 모델 학습
set.seed(123)
model_ann <- nnet(Species ~ .,
data = iris,
size = 5, # 은닉 노드 5개
decay = 0.01, # 가중치 감소
maxit = 200) # 반복 횟수
## # weights: 43
## initial value 230.660979
## iter 10 value 45.785846
## iter 20 value 12.827392
## iter 30 value 11.256300
## iter 40 value 9.650528
## iter 50 value 9.291849
## iter 60 value 9.136495
## iter 70 value 9.103158
## iter 80 value 9.050192
## iter 90 value 9.019544
## iter 100 value 9.000070
## iter 110 value 8.986564
## iter 120 value 8.980150
## iter 130 value 8.976378
## iter 140 value 8.975640
## iter 150 value 8.975430
## iter 160 value 8.975414
## final value 8.975413
## converged
# 은닉층 노드 수
# 은닉 노드 수가 많을수록 복잡한 패턴 학습 가능
# 너무 크면 과적합(overfitting) 위험
# 가중치 감소율 (L2 정규화)
# 값이 클수록 모델이 단순해짐 (가중치가 0에 가까워짐)
# 너무 작으면 과적합 위험, 너무 크면 과소적합 가능
# maxit = 200 : 최대 반복(Epoch) 수
# 충분한 반복이 필요하나, 너무 크면 수렴 속도 느려질 수 있음
# 4. 모델 요약
summary(model_ann)
## a 4-5-3 network with 43 weights
## options were - softmax modelling decay=0.01
## b->h1 i1->h1 i2->h1 i3->h1 i4->h1
## -1.48 -1.41 3.00 0.49 0.49
## b->h2 i1->h2 i2->h2 i3->h2 i4->h2
## 5.51 0.16 1.68 -1.15 -3.33
## b->h3 i1->h3 i2->h3 i3->h3 i4->h3
## 0.31 0.53 1.15 -2.16 -0.97
## b->h4 i1->h4 i2->h4 i3->h4 i4->h4
## -3.71 -1.00 -1.92 2.42 2.40
## b->h5 i1->h5 i2->h5 i3->h5 i4->h5
## -0.30 -0.53 -1.14 2.16 0.97
## b->o1 h1->o1 h2->o1 h3->o1 h4->o1 h5->o1
## 0.15 0.33 1.27 3.88 -1.44 -3.72
## b->o2 h1->o2 h2->o2 h3->o2 h4->o2 h5->o2
## -0.02 -2.56 4.40 -3.57 -3.29 3.55
## b->o3 h1->o3 h2->o3 h3->o3 h4->o3 h5->o3
## -0.14 2.23 -5.67 -0.31 4.74 0.17
# 4-5-3 network with 43 weights
# 4개의 입력 노드, 5개의 은닉 노드, 3개의 출력 노드 (클래스가 3개라서)
# 43 weights : 가중치(weight)와 바이어스(bias)의 총합
# 역전파로 업데이트되는 모든 파라미터 수가 43개라는 의미입니다
# softmax modelling 다중 클래스 분류용 softmax 함수 사용
# 5. 신경망 구조 시각화
plotnet(model_ann)

# plotnet(model_ann) 그림에서 나타나는 간선(edge) 하나하나는
# 결국 모델 내 학습되는 가중치(weight)를 의미합니다.
# 입력 → 은닉(4입력 + 1바이어스) × 5 은닉 노드=25개
# 은닉 → 출력 (5 은닉 + 1바이어스) × 3 출력 노드 18개
# 가중치와 편향 확인
# 1. 입력값 정의 (예: 3개의 입력)
inputs <- c(2.0, 1.5, 0.5)
# 2. 가중치 정의
weights <- c(0.4, -0.7, 0.2)
# 3. 바이어스 (bias)
bias <- 0.1
# 4. 가중합 계산: Σ(x * w) + b
weighted_sum <- sum(inputs * weights) + bias
weighted_sum
## [1] -0.05
# 5. 활성화 함수 적용 (예: sigmoid 함수)
sigmoid <- function(x) {
1 / (1 + exp(-x))
}
output <- sigmoid(weighted_sum)
output
## [1] 0.4875026