# 일반회귀분석 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