# 선형성 위반_ violation of linearity
Bacteria <- read.table("./datasets/Bacteria.txt", sep = "\t", header = TRUE)

head(Bacteria, 5)
t N_t
1 1 355
2 2 211
3 3 197
4 4 166
5 5 142
# 도식화해보자
par(mar = c(3, 3, 2, 1)) # 마진 줄이기
plot(N_t ~ t, data = Bacteria, pch = 19)
# pch = 19는 안해도 되다.

# 왼쪽 위 점 하나만 붕떠있다.
# 단순히 붕 떠있기만 한게 아니라 그 점으로 인해 전체 선이 곡선으로 보인다.
# 다시 말해 양끝점을 이어봤을때 선형성이 있다고 보기 힘들다.
# 우선 선형회귀를 해보자.
reg1 <- lm(N_t ~ t, data = Bacteria)
summary(reg1)
Call:
lm(formula = N_t ~ t, data = Bacteria)
Residuals:
Min 1Q Median 3Q Max
-43.867 -23.599 -9.652 10.223 114.883
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 259.58 22.73 11.420 3.78e-08 ***
t -19.46 2.50 -7.786 3.01e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 41.83 on 13 degrees of freedom
Multiple R-squared: 0.8234, Adjusted R-squared: 0.8098
F-statistic: 60.62 on 1 and 13 DF, p-value: 3.006e-06
# 이쯤되면 봐야할건 설명 안해도 뻔하다.
# 아참. 근데 이제 보니 Adjusted R-squared랑 Multipld R-squared랑 따로 분리해서 봐야겠더라..
# 결과 해석은 지금까지 큰 차이가 없었겠지만, 서로 다른 모델 성능 비교하는 때를 제외하고는
# Multiple R-squared를 보는게 맞겠더라..
# 아무튼 내용 해석해보자.
# 1. Multiple R-squared 값으로 보아 설명력 굿.
# 2. F-statistic의 p-value값으로 보아 해당 모형 유의미하다. 굿.
# (다시 말해 적어도 어느 변수 하나는 의미가 있다.)
# 3. 유일 변수인 t의 p-value값도 0.001이상 유의수준에서 유의하다. 굿.
# 결론 : 좋은 모형
# (+추가해석 : t가 1증가할때만다 박테리아는 -19.46 증가한다.)
# 그치만 우리가 이제 봐야할것.
# 정말 좋은 모형일까?
# 무슨 말이냐면,
# 이 회귀모형에는 기본 가정이 있다.
# 1. 선형성, 2. 오차의 (정규성/등분산성/평균이 0/독립성),
# 3. 예측 변수의 선형종속성(=다중공선성x)
# 이들도 전부 만족해야 정말 제대로 잘 만들어졌다라고 할 수 있겠다.
# 1. 잔차 vs x변수(solution of 가정 2.)
r <- rstandard(reg1)
plot(Bacteria$t, r, pch = 19)
abline(h = c(-2, 0, 2), lty = 2)

# abline은 -2~2사이에 데이터의 95퍼가 들어가야 해서
# 그런지를 검증하려고 선을 긋고 본것이다.
# 참고로 -3~3사이를 긋는다면 그건 데이터의 99퍼가 그 선 사이에 있는지 보려고 그은것!
# 아무튼 plot을 보면 대체적으로 문제가 있다.
# 잔차에서는 아무 패턴도 읽히면 안되는데 너무 명확한 2차곡선 형태이다.
# 현재 Nt = B0+B1*t+e(나머지)
# 이 e(나머지)들만으로 그래프 그린건데
# 이차곡선이 보인다는건
# 이런 패턴이 앞의 변수들에 반영되지 않았다는 증거
# 실제로는 설명력이 좋았지만
# 선형에 이차함수가 적용되지 않았다는 증거이다.
# 다시말해 적절한 모형이 아니다.
## 추가 설명
# p-value들은 해당 모델/변이 정말로 (우연이 아니라) y에 영향을 주는게 맞는지만 본다.
# R^2은 해당 모형의 설명력만 본다.
# 다시말해, x,y관계가 선형인지와 같은 기타 정보들은 확인하지 않는다.
# 현재 데이터는 곡선 관계인데,
# 모델이 직선으로 억지로 맞춘 상태이다.
# 정리하면,
# 잔차가 무작위로 분포하지 않고,
# 곡선 형태를 보이므로 선형성 가정이 위배된다.
# 따라서 현재 선형회귀모형은 부적절하다.
# x와 y의 관계를 변환해서 이 상황을 타개해야한다.
# 로그변환 _ after log-transformation
Bacteria$ln.N_t <- log(Bacteria$N_t)
# 로그를 취한후 새로운 열을 추가하고,,
par(mar = c(3, 3, 2, 1))
plot(ln.N_t ~ t, data = Bacteria, pch = 19)

# 산점도를 그려주니 전과 달리,, 선형성이 보인다.
# 다시 lm을 돌려보자.
reg2 <- lm(ln.N_t ~ t, data = Bacteria)
summary(reg2)
Call:
lm(formula = ln.N_t ~ t, data = Bacteria)
Residuals:
Min 1Q Median 3Q Max
-0.18445 -0.06189 0.01253 0.05201 0.20021
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.973160 0.059778 99.92 < 2e-16 ***
t -0.218425 0.006575 -33.22 5.86e-14 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.11 on 13 degrees of freedom
Multiple R-squared: 0.9884, Adjusted R-squared: 0.9875
F-statistic: 1104 on 1 and 13 DF, p-value: 5.86e-14
# 설명력도 p-value들도 여전히 굿~~~~
# 다시 빠르게 잔차vs x변수 플랏도 그려보자.
r <- rstandard(reg2)
plot(Bacteria$t, r, pch = 19)
abline(h = c(-2, 0, 2), lty = 2)

# 전에 그렸던 plot과는 달리 이번에는 -2~2사이에 잘 존재한다.
# 랜덤성 있게 특정 패턴도 보이지 않는다
# 형태가 좋으니 reg2 모델을 받아들일 수 있겠다.
# 참고로 gpt에게 물어보니 lm 모델 summary를 보기 전에,
# 이런 가정사항 체크를 먼저하고 들어간다고 한다.
# 다중공선성
EEO <- read.table("./datasets/EEO.txt", sep = "\t", header = TRUE)

head(EEO, 5)
ACHV FAM PEER SCHOOL
1 -0.43148 0.60814 0.03509 0.16607
2 0.79969 0.79369 0.47924 0.53356
3 -0.92467 -0.82630 -0.61951 -0.78635
4 -2.19081 -1.25310 -1.21675 -1.04076
5 -2.84818 0.17399 -0.18517 0.14229
# 선형회귀식을 일단 만들어보자.
reg <- lm(ACHV ~ FAM+PEER+SCHOOL, data = EEO)
summary(reg)
Call:
lm(formula = ACHV ~ FAM + PEER + SCHOOL, data = EEO)
Residuals:
Min 1Q Median 3Q Max
-5.2096 -1.3934 -0.2947 1.1415 4.5881
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.06996 0.25064 -0.279 0.781
FAM 1.10126 1.41056 0.781 0.438
PEER 2.32206 1.48129 1.568 0.122
SCHOOL -2.28100 2.22045 -1.027 0.308
Residual standard error: 2.07 on 66 degrees of freedom
Multiple R-squared: 0.2063, Adjusted R-squared: 0.1702
F-statistic: 5.717 on 3 and 66 DF, p-value: 0.001535
# 각 변수들 유의성도 없고,,
# 설명력도 똥인데
# 전체 모델의 유의성이 있다.
# 즉 전체 모델을 합쳤더니 종속변수에 영향을 미치는 정도가 존재했다.
# 제 역할을 하는 변수가 없는데 전체 모델이 유의미한 이유는??
# 다중공선성 때문일 확률이 높다.
## 추가설명 _ 이게 도대체 왜 다중공선성 때문이 된걸까?
# 다중공선성이 존재한다는건 변수들의 영향력이 비슷하다는 뜻이다.
# 비슷할 경우 종속변수의 변화를 누구의 공으로 돌려야할지 결정이 어려워진다.
# 그렇게 계수의 공이 데이터별로 자주 변하게 된다. 즉, 분산이 커진다.
# 루트분산인 표준오차도 커진다. 이로 인해, 각 계수가 유의하다고 보기 어려워진다.
# 그러나, 전체적으로는 모형이 유의하다고 할 수 있는 상황이 된다.
# 다중공선성 상황임을 의심했으면
# 이제 어떤 변수들이 서로 관계가 있는지 봐야한다.
# 검증 방법은 크게 3가지이다.
# 첫번째는 앞에서 했던 f-stat의 p-value와 변수들의 p-value를 같이 보는것이다.
# 두번째 세번째는,,,
# 2. cor() + plot
cor(EEO)
# 변수들간이니 아래 코드로 보는게 더 옳겠다.
# cor(EEO[c("FAM", "PEER", "SCHOOL")])
ACHV FAM PEER SCHOOL
ACHV 1.0000000 0.4194588 0.4398464 0.4181006
FAM 0.4194588 1.0000000 0.9600806 0.9856837
PEER 0.4398464 0.9600806 1.0000000 0.9821601
SCHOOL 0.4181006 0.9856837 0.9821601 1.0000000
# cor들이 전반적으로 다 높은것 같다..
# peer ≈ FAM ≈ SCHOOL
# 그림으로도 봐보자
plot(EEO[c("FAM", "PEER", "SCHOOL")], pch = 19, cex = 1)

# 진짜 선형!!!
# 3. vif() (variance inflation factor)
library(car)
vif(reg)
FAM PEER SCHOOL
37.58064 30.21166 83.15544
# vif값이 10보다 크거나 같으면 다중공선성이 있다고 판단한다.
# 보니깐 10을 한참 상회한다.
# 자 그럼 다중공선성임을 확진했다.
# 그럼 해결은??
# 필요없는 변수를 하나 빼는것이다.
# + 마지막으로 다른 문제는 없나 볼겸,,
# 잔차와 추정값 y hat과의 관계도 도식화 해보겠다.
# 이들의 관계는 패턴이 없어야 좋다.
par(mar = c(3, 3, 2, 1))
plot(fitted(reg), rstandard(reg), pch = 19)
abline(h = c(-2, 0, 2), lty=2)

# 보아하니 잔차상으로는 문제가 없다. 굿
# 변수선택 _ variable selection
Supervisor <- read.table("./datasets/Supervisor.txt", sep = "\t", header = TRUE)

head(Supervisor, 5)
Y X1 X2 X3 X4 X5 X6
1 43 51 30 39 61 92 45
2 63 64 51 54 63 73 47
3 71 70 68 69 76 86 48
4 61 63 45 47 54 84 35
5 81 78 56 66 71 83 47
# 셋째자리까지 상관계수 추출해보자.
round(cor(Supervisor[c("X1", "X2", "X3", "X4", "X5", "X6")]), digits = 3)
X1 X2 X3 X4 X5 X6
X1 1.000 0.558 0.597 0.669 0.188 0.225
X2 0.558 1.000 0.493 0.445 0.147 0.343
X3 0.597 0.493 1.000 0.640 0.116 0.532
X4 0.669 0.445 0.640 1.000 0.377 0.574
X5 0.188 0.147 0.116 0.377 1.000 0.283
X6 0.225 0.343 0.532 0.574 0.283 1.000
# 선형회귀식도 만들자.
reg <- lm(Y ~ X1+X2+X3+X4+X5+X6, data = Supervisor)
summary(reg)
Call:
lm(formula = Y ~ X1 + X2 + X3 + X4 + X5 + X6, data = Supervisor)
Residuals:
Min 1Q Median 3Q Max
-10.9418 -4.3555 0.3158 5.5425 11.5990
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 10.78708 11.58926 0.931 0.361634
X1 0.61319 0.16098 3.809 0.000903 ***
X2 -0.07305 0.13572 -0.538 0.595594
X3 0.32033 0.16852 1.901 0.069925 .
X4 0.08173 0.22148 0.369 0.715480
X5 0.03838 0.14700 0.261 0.796334
X6 -0.21706 0.17821 -1.218 0.235577
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 7.068 on 23 degrees of freedom
Multiple R-squared: 0.7326, Adjusted R-squared: 0.6628
F-statistic: 10.5 on 6 and 23 DF, p-value: 1.24e-05
# X1,X3 변수가 유의미하다.
# 설명력은 적절하고, 전체 모형도 유의미
# 결과를 봤을때에는 다중공선성도 있을것 같다.
# 다중공선성 체크
library(olsrr)
ols_vif_tol(reg)
Variables Tolerance VIF
1 X1 0.3749447 2.667060
2 X2 0.6246520 1.600891
3 X3 0.4403263 2.271043
4 X4 0.3248624 3.078226
5 X5 0.8142600 1.228109
6 X6 0.5124025 1.951591
# 다중공선성은 없다.
# 1. 전진선택법
forward <- ols_step_forward_p(reg, p_val = 0.3)
print(forward)
Stepwise Summary
-------------------------------------------------------------------------
Step Variable AIC SBC SBIC R2 Adj. R2
-------------------------------------------------------------------------
0 Base Model 238.070 240.873 150.783 0.00000 0.00000
1 X1 205.764 209.967 120.987 0.68131 0.66993
2 X3 205.139 210.744 121.094 0.70802 0.68639
3 X6 205.276 212.282 122.161 0.72559 0.69393
-------------------------------------------------------------------------
Final Model Output
------------------
Model Summary
---------------------------------------------------------------
R 0.852 RMSE 6.269
R-Squared 0.726 MSE 39.304
Adj. R-Squared 0.694 Coef. Var 10.419
Pred R-Squared 0.642 AIC 205.276
MAE 5.317 SBC 212.282
---------------------------------------------------------------
RMSE: Root Mean Square Error
MSE: Mean Square Error
MAE: Mean Absolute Error
AIC: Akaike Information Criteria
SBC: Schwarz Bayesian Criteria
ANOVA
--------------------------------------------------------------------
Sum of
Squares DF Mean Square F Sig.
--------------------------------------------------------------------
Regression 3117.858 3 1039.286 22.917 0.0000
Residual 1179.109 26 45.350
Total 4296.967 29
--------------------------------------------------------------------
Parameter Estimates
----------------------------------------------------------------------------------------
model Beta Std. Error Std. Beta t Sig lower upper
----------------------------------------------------------------------------------------
(Intercept) 13.578 7.544 1.800 0.084 -1.929 29.084
X1 0.623 0.118 0.681 5.271 0.000 0.380 0.866
X3 0.312 0.154 0.301 2.026 0.053 -0.005 0.629
X6 -0.187 0.145 -0.158 -1.291 0.208 -0.485 0.111
----------------------------------------------------------------------------------------
# 이론파트에서 말했듯 봐야할건 AIC 감소량
# Step 0,1,2에선 계속 줄지만 3에서는 는다.
# X1, X3정도까지만 변수를 취하면 될것 같다.
# 추가적으로 ANOVA sig가 0이라 좋다.
# Parameter Estimates의 sig는 X6빼고(유의수준 0.05기준) 좋다.
# 실은 X3는 유의수준 0.05기준 살짝 넘는다.
# 그외의 데이터를 봤을땐 유의미하고 미세한 차이라 도메인 지식을 보고 판단하는게 좋을것으로 보인다.
# 그러니 판단을 유보
plot(forward)

# 겸사겸사 도식화
# 2. 후진선택법
backward <- ols_step_backward_p(reg, p_val = 0.3)
print(backward)
Stepwise Summary
-------------------------------------------------------------------------
Step Variable AIC SBC SBIC R2 Adj. R2
-------------------------------------------------------------------------
0 Full Model 210.500 221.709 129.439 0.73260 0.66285
1 X5 208.589 218.397 126.878 0.73181 0.67594
2 X4 206.863 215.271 124.447 0.72934 0.68604
3 X2 205.276 212.282 122.161 0.72559 0.69393
-------------------------------------------------------------------------
Final Model Output
------------------
Model Summary
---------------------------------------------------------------
R 0.852 RMSE 6.269
R-Squared 0.726 MSE 39.304
Adj. R-Squared 0.694 Coef. Var 10.419
Pred R-Squared 0.642 AIC 205.276
MAE 5.317 SBC 212.282
---------------------------------------------------------------
RMSE: Root Mean Square Error
MSE: Mean Square Error
MAE: Mean Absolute Error
AIC: Akaike Information Criteria
SBC: Schwarz Bayesian Criteria
ANOVA
--------------------------------------------------------------------
Sum of
Squares DF Mean Square F Sig.
--------------------------------------------------------------------
Regression 3117.858 3 1039.286 22.917 0.0000
Residual 1179.109 26 45.350
Total 4296.967 29
--------------------------------------------------------------------
Parameter Estimates
----------------------------------------------------------------------------------------
model Beta Std. Error Std. Beta t Sig lower upper
----------------------------------------------------------------------------------------
(Intercept) 13.578 7.544 1.800 0.084 -1.929 29.084
X1 0.623 0.118 0.681 5.271 0.000 0.380 0.866
X3 0.312 0.154 0.301 2.026 0.053 -0.005 0.629
X6 -0.187 0.145 -0.158 -1.291 0.208 -0.485 0.111
----------------------------------------------------------------------------------------
# 전체 모델에서 X5,X4,X2까지 없애면 좋다고 한다.
# ANOVA sig는 이번에도 0이라 좋다.
# 개별 sig는 X6은 기각하는게 좋을 것이다.
# (아참 참고로 Parameter Estimates에 나오는 변수들은 살아남은 변수들이 등장한다.
# 위와 다르게 이상하게 출력된게 아니다!)
plot(backward)

# 3. 단계적 방법
stepwise <- ols_step_both_p(reg, p_enter = 0.3, p_remove = 0.3)
print(stepwise)
Stepwise Summary
-------------------------------------------------------------------------
Step Variable AIC SBC SBIC R2 Adj. R2
-------------------------------------------------------------------------
0 Base Model 238.070 240.873 150.783 0.00000 0.00000
1 X1 (+) 205.764 209.967 120.987 0.68131 0.66993
2 X3 (+) 205.139 210.744 121.094 0.70802 0.68639
3 X6 (+) 205.276 212.282 122.161 0.72559 0.69393
-------------------------------------------------------------------------
Final Model Output
------------------
Model Summary
---------------------------------------------------------------
R 0.852 RMSE 6.269
R-Squared 0.726 MSE 39.304
Adj. R-Squared 0.694 Coef. Var 10.419
Pred R-Squared 0.642 AIC 205.276
MAE 5.317 SBC 212.282
---------------------------------------------------------------
RMSE: Root Mean Square Error
MSE: Mean Square Error
MAE: Mean Absolute Error
AIC: Akaike Information Criteria
SBC: Schwarz Bayesian Criteria
ANOVA
--------------------------------------------------------------------
Sum of
Squares DF Mean Square F Sig.
--------------------------------------------------------------------
Regression 3117.858 3 1039.286 22.917 0.0000
Residual 1179.109 26 45.350
Total 4296.967 29
--------------------------------------------------------------------
Parameter Estimates
----------------------------------------------------------------------------------------
model Beta Std. Error Std. Beta t Sig lower upper
----------------------------------------------------------------------------------------
(Intercept) 13.578 7.544 1.800 0.084 -1.929 29.084
X1 0.623 0.118 0.681 5.271 0.000 0.380 0.866
X3 0.312 0.154 0.301 2.026 0.053 -0.005 0.629
X6 -0.187 0.145 -0.158 -1.291 0.208 -0.485 0.111
----------------------------------------------------------------------------------------
# X1, X3을 추가하고 끝내는게 좋겠다.
# AIC가 x6을 추가할때 증가하기 때문이다.
# 전체 sig는 0이라 좋고,
# 개별 sig로 보아 X6은 제거, X3은 상황보고 판단하는게 좋겠다.
plot(stepwise)

# 아참 print한 결과에서
# Variable옆에 (+)가 나오면 더하는게 좋다는 것이고, (-)는 빼는게 좋다는것이다.
# 유의!! 같은게 더하고 이후에 빼는게 좋다고 나올수도 있다!!!
'Deep Learning + AI' 카테고리의 다른 글
| 데이터분석응용 in R_로지스틱 회귀 pt2 실습260415 (0) | 2026.04.19 |
|---|---|
| 데이터분석응용 in R_로지스틱 회귀 pt1 이론 (0) | 2026.04.19 |
| 데이터분석응용 in R_3월 내용, 문제로 전체 훑기 (0) | 2026.04.18 |
| 데이터분석응용 in R_회귀분석 pt2 실습260401 (0) | 2026.04.17 |
| 데이터분석응용 in R_회귀분석 pt1 이론 (1) | 2026.04.13 |