R복습_회귀분석 (1차 단순회귀분석, 다중회귀분석, 로지스틱 회귀분석)

2024. 10. 10. 15:42R분석

회귀분석

회귀분석은 한개 또는 그 이상의 변수들(독립변수)에 대하여 다른 한 변수(종속변수) 사이의 관계를 설명하고 예측하는 분석기법을 말한다. 현재의 데이터로 일정한 패턴을 계산하여 예측하는 분석방법인데, 주로 가격, 매출, 주가, 수량 등 연속적인 값을 갖는 데이터를 예측하는데 주로 사용한다.

 

 

회귀분석의 기본 개념

분석모형이 예측하고자 하는 결과 : 종속변수(예측변수)

예측을 위해 모형이 사용하는 속성 : 독립변수(설명 변수)

 

ex) y=x1 + x2 +10

      x1,x2 : 독립변수,  y : 종속변수

독립변수와 종속변수에 해당하는 데이터를 모아 관계를 분석하고 예측에 활용할 수 있도록 통계적으로 정리하는과정을 예측모델(모형)이라고 하며 이는 회귀식이 된다. 

 

 

회귀분석의 종류

단순회귀 : 독립변수가 1개인 경우

다중회귀 : 독립변수가 2개 이상인 경우

 

 

단순 선형회귀 분석

단순선형회귀는 독립변수와 종속변수 사이의 선형관계를 파악하고 예측에 활용하는 방법이며, 단순선형의 회귀식은 1차식의 형태인 y=wx+b를 가진다. 여기서 w는 기울기이며 b는 상수값이다.

 

데이터셋 준비 및 상관성 확인

#단순선형회귀 분석

#패키지 로드
library(ggplot2)


#데이터 셋 로드
#speed의 변동에 따른 dist의 수치
cars

#1)회귀분석을 하기전 두 변수 사이의상관관계 분석
#두 변수 사이에 관계가 없다면 분석결과가 나와도 무의미

#2)산점도 그래프로 대략적인 상관관계확인
ggplot(cars,aes(x=speed,y=dist))+
  geom_point()
#관측치들이 한 방향으로 가고있기때문에 대략적으로 관계가 있다고 파악 가능

#기본그래프 함수 활용하여 관계확인방법
#plot(종속변수~독립변수)
plot(cars$dist~cars$speed)

ggplot(cars,aes(x=speed,y=dist))+ geom_point()
plot(cars$dist~cars$speed)

단순 선형회귀 분석을 하려면 먼저 회귀분석에 사용할 데이터셋을 로드하여 준비한 후, 예측하고자 하는 독립변수와 종속변수간의 상관성을 파악해야한다. 회귀분석은 과거나 기존의 데이터를 가지고 미래의 값을 예측하는분석이기때문에 상관성이 없는 두 변수를 가지고 회귀분석을 하게되면 분석결과가 나오더라도 무의미한 데이터가 되고만다. 상관관계는 주로 산점도 그래프나, 상관성을 수치로 확인할 수 있는 cor.test()함수를 주로 사용한다. 위 쿼리엣는 speed에 따른 dist의 수치를 예측하기 위한 쿼리문인데 두 변수의 산점도 그래프를 살펴보면 일정한 방향으로 함께 움직이고있는 모습을 확인할 수 있다. ggplot을 이용하지 않고도 r에서 제공하는 내장그래프 함수인 plot을 사용해도 된다. plot(종속변수~독립변수)의 형태로 적게되면 간단하게 두 변수의 산점도 그래프를 보여준다.

 

상관성 함수로 확인 : cor.test

#3)상관관계 함수로 확인 : cor.test()
cor.test(cars$speed,cars$dist)
#p-value = 1.49e-12
#cor = 0.8068949 
#상관성 확인

그래프로도 쉽게 상관성을 확인할 수 있지만 보다 자세하게 상관성을 확인하기 위해 cor.test함수도 함께 사용하여 상관분석을 해주면 좋다. 두 변수의 상관관계를 파악하는 함수로는 cor.test가 있으며, cor.test(종속변수~독립변수)의 순서대로 작성한다.  상관관계에서 확인해야할것은 p-value값과 cor값인데 p-value값이 0.05보다 작아야하며, cor값은 절대값 기준0.7보다는 커야 상관성이 있다고 판단할 수 있다. 현재 두변수의 경우 p-value값은 0.05보다 작고 cor역시 0.8로 높은 상관성을 보이고 있는것이 확인된다.

 

회귀모델 구현(모델링)

#4)회귀모델 구현
#lm(종속변수~독립변수) : y절편값, 기울기
model <- lm(cars$dist~cars$speed)
model

회귀모델을 구현하기위해서는 lm()함수를 통해 절편과 기울기값을 알아야한다. lm(종속변수~독립변수)의 형태로 사용하며 결과를 보면 intercept 절편값과 독립변수 밑에 기울기값이 나온걸 확인할 수 있다. 이렇게 구해진 절편과 기울기값은 회귀분석결과를 시각화 할때 geom_abline과 함께 사용하여 회귀선을 그릴수도 있고, 모델링을 평가할때도 사용된다.

 

y절편과 기울기 추출 후 그래프 추가

#y절편 기울기 추출 : coef
b <- coef(model)[1]
w <- coef(model)[2]

b
w


#5) 회귀식(모델)그래프에 추가
ggplot(cars,aes(x=speed,y=dist))+
  geom_point()+
  geom_abline(intercept=b,slope=w)

 

위의 lm()함수를 사용하여 추출된 절편과 기울기값을 coef()함수를 사용하여 절편과 기울기값만 따로 추출하는과정을 거친다. 사실 이 과정은 필수는 아니나, 쿼리문의 가독성등을 위해 해주는것이 좋다. 이렇게 추출된 절편과 기울기 값을 회귀식 그래프에 geom_abline함수를 추가하여 그려보면, 이렇게 회귀선이 추가된것을 확인할 수 있다.

 

모델평가 (1)함수정의

#6)모델평가
#회귀식을 활용해 주행속도, speed에 따른 제동거리 구하기
#y=Wx+b  (y절편은 기울기x독립변수 + 상수)
#상수 : 변하지 않고 더해지는 값

#회귀식을 구현할 함수 정의
line_reg <- function(x){
  return(w*x+b)
}


#lm에서 구해진 y절편은 독립변수 x가 0일때의 y의값
#이 y절편은 회귀분석 모델링을 할때 상수로 사용이됨


line_reg(30) #주행속도 30일때 제동거리 예측값 100
line_reg(35) #주행속도 35일때 제동거리 예측값 120
line_reg(40) #주행속도 40일때 제동거리 예측값 139

회귀분석의 모델링 작업이 끝났다면, 만든 모델이 얼마나 예측을 잘 하는지 평가하는과정을 반드시 거쳐야한다. 모델을 평가하려면

내가 원하는 종속변수의 변동을 볼수있는 1차 회귀식이 들어간 사용자정의함수를 이용하여 실제값과 예측값을 비교해야한다.

사용자 정의함수에서는 기울기 값과 절편을 이용해야하는데 아까 lm에서 추출된 y절편값은 독립변수x가 0일때의 절편값이므로 상수로도 사용될 수 있다. 그러므로 함수의 리턴값에서 기울기*독립변수+상수(y절편)을 정의하고 정의된 함수에 직접 독립변수들을 넣어, 값을 예측해보아야하는것이다. 만약 주행속도가 30이라면 회귀분석 모델이 예측한 제동거리의 예측값은 100이 되고, 주행속도가 35라면 120이라고 예측한것을 알 수 있다.

 

모델평가 (2)실제값과 예측값 차이확인

#7)예측값과 실제값의 차이확인(예상 제동거리, 실제 제동거리)
#독립변수(speed)만 따로 추출
speed <- cars$speed
speed

#제동거리 예측값 계산
pred <- w*speed+b
pred


#모델의 예측값 구하는 함수  : predict(모델,데이터셋)
#모델은 lm()함수를사용해서 구한 값을 의미
pred <- predict(model,cars)
pred


compare <- data.frame(pred,cars$dist,abs(pred-cars$dist))
#ads() : 절대값을 구하는 함수
#절대오차를 구하는 법 : 예측값 - 실제값 (절대값 함수 사용)
View(compare)
colnames(compare) <- c('예상','실제','오차')
head(compare)

실제값과 예측값을 확인하려면 실제값이 되는 독립변수만 따로 추출하여 데이터를 저장한 후 사용자정의함수를 사용하여 전체의 예측값을 구해 변수에 저장해야한다. 그 후 모델의 예측값을 구해주는 함수인 predict(모델, 데이터셋)을 사용하여 예측값을 구해주고,

예측값, 실제값, 오차범위(예측값-실제값)의 값들을 순서대로 데이터프레임에 저장하여 한눈에 모델평가결과를 확인하면된다.

오차범위를 보면 실제값과 평균적으로 5~8정도의 오차범위를 보여주고있다. 거의 차이가 없는 오차범위도 있긴하지만 10이 넘어가는 오차범위가 큰값이 있기때문에 모델링이 전체가 틀렸다기보다는 데이터의 특정 구간에서 성능이 떨어진다고 판단된다. 이런 경우 MAE나 MSE 등의 지표를 계산해 보고 필요에 따라 모델을 다시 조정하거나, 데이터에 적합한 다른 모델을 적용하며 모델의 성능을 높여나가면서 모델의 성능을 향상시켜야한다.

 

 

다중선형회귀 분석

다중선형회귀분석은 여러개의 독립변수를 다루는 분석방법이다. 실제로 실무에서도 어떤 결과에 영향을 미치는 요인이 1개인경우는 거의 드물기때문에 다중선형회귀 분석이 더 많이 활용된다. 다중선형회귀분석의 식은 y=b0+b1x1=b2x2+...(x1,x2: 독립변수, b0는 상수)이다.

 

데이터셋 준비

#다중 선형회귀분석

#다중 선형회귀분석을 위한 패키지 설치

#car 패키지 : 'Compaion to Appied Regression'
#회귀분석을 수행하는데 있어 유용한 함수와 도구를 포함
install.packages('car')
library(car)

#데이터 셋 불러오기
Prestige
#1971년 캐나다 직업과 관련된 사회적 지위,
#소득, 교육, 수준 등을 나타내는 데이터


#1)데이터 준비
data.set <- Prestige[,1:4] #행은 전체 다 가져오고 열은 1~4열까지만 로드
data.set
print(colnames(data.set))#열 이름확인


#education, women, prestige를 독립변수, income(수입)을 종속변수
#3개의 독립변수로 1개의 종속변수 예측하는 다중 선형회귀 분석

다중 선형회귀 분석은 단순선형회귀분석보다 까다롭기때문에 데이터셋 준비 과정역시 보다 더 신경써야한다. 다중선형회귀 분석의 경우, 먼저 필요한 패키지인 car를 로드한 후 시작하는게 좋다. 또한 다중선형회귀분석에 필요한 데이터만 골라 데이터를 준비하는 것이 좋기때문에 데이터를 새로운 변수에 필요한값만 정의하여 저장해야한다.

 

상관관계 확인 

#2)산점도로 변수간 관계확인
dev.off() # 이전 그래프 장치 종료
plot(data.set,ph=16,col='blue')


#3)상관관계와 산점도 확인
#필요 패키지 설치 및 로드
install.packages('GGally')
library(GGally)

#ggpairs()를 사용한 산점도, 상관관계 같이 확인
ggpairs(data.set,title="산점도, 밀도, 상관관계")+
  theme_minimal()
#변수간의 밀도그래프, 산점도, 상관관계를 한번에 확인 가능

#[그래프 설명]
#하단 삼각형에 산점도 표시
#상단 삼각형에 상관관게 개수 표시
#대각선에 밀도 표시

#인컴과 프레스티지, 인컴과 에듀케이션이 양의 상관관계를 가진다는걸 확인할 수 있음
#education, prestige 와 income은 양의 상관관계
#women과 income은 음의 관계

다중회귀분석도 마찬가지로 종속변수와 독립변수들간의 상관관계가 있는지 먼저 확인해야하는데, 다중회귀분석의 경우 GGally패키에 포함되어있는 ggpairs()그래프 함수를 주로 사용하여 상관관계를 확인하는 경우가많다. GGally의 ggpairs()함수의 그래프는 ggpairs(데이터, 타이틀)+theme_minimal()형식으로 작성하는데 여기서 theme_minimal은 그래프의 테마를 결정하는것이기때문에 생략해도 그래프는확인할 수 있다. ggpairs 함수는 산점도, 밀도, 상관관계수치 까지 한번에 확인할 수있기 떄문에 다중선형회귀분석은 그래프와 수치모두 따로 계산해야하는 단순선형회귀분석과 달리 이 패키지를 사용하여 한번에 확인하는경우가많다.

그래프의 결과를 확인해보면 education, prestige 와 income은 양의 상관관계를 띄고 있고 women과 income은 음의 관계를 띄고있는 것을 확인할 수 있다.(데이터가 매우 옛날그래프라 여성과 소득의 관계가 낮은것이므로 이부분은 넘어가자...!)

 

이외에도 산점도만 확인하고싶다면 plot함수를 이용하여 각 변수들간의 상관관계를 파악할 수 도있다.

 

 

회귀모델 구현(모델링)

#4)회귀모델 도출(회귀식)
#lm(종속변수~독립변수)
model <- lm(income~education+women+prestige,data=data.set)
#데이터 직접 지정(data.set$income)하지 않았으므로 뒤에 데이터 표시해주어야함
model
summary(model)

다중회귀분석도 마찬가지로 lm()함수를 사용하여 절편과 기울기값을 추출해주는데 독립변수들은 +로 연결하여 사용한다. 이렇게 추출된 모델을 summary함수를 사용하여 몇가지의 값을 확인해야한다. 첫번째로는 변수들의 Estimate값(특정 변수의 계수를 추정한 값)이다. 보면 어떤값들이 가장 영향을 많이주고, 적게주는지 확인할 수 있고, 필요한 변수가 어떤 변수인지도 확인이 가능하다. 다음으로는 ***으로 된 부분인데 income(종속변수)를 설명하는데 중요한 변수이다. *이 많을 수록 회귀분석하는데 영향을 많이 준다는뜻이다. 다음으로는 p-value값을 확인하여 0.05보다 작은지 확인해야하며 마지막으로는 Adjusted R-squared값이다. 이는 모델이 실제 데이터를(현재 회귀식에서는 data.부분) 얼마나 설명할 수 있는지에 대한 값을 보여주며 0~1사이로 이루어져 있다. 현재 데이터에서는 0.6323이기때문에 모델이 실제 데이터를 63%를 설명할 수 있음을 나타낸다.

 

 

데이터 재 정의

#다중선형회귀 할때는 필요한 변수들만 가져와서 모델을 생성해야함
data <-  Prestige[,1:5] #데이터 하나 더 추가해서 데이터 다시 설정
#type변수 제외하고 전부로드
data

#패키지 불러오기
library(MASS)
#MASS : 다양한 통계분석 기법과 데이터 셋을 제공하는 패키지

이렇게 다중선형회귀분석에서는 독립변수의 값이 많기때문에 summary의 값을 보고 데이터를 재정의 하기도한다. 위의 쿼리문에서는 결과에딱히 이상은 없지만 education값이 다른값들에 비해 결과가 상대적으로 높짆않기때문에 새로운 독립변수의 값인 census을 하나더 추가하여 모델링을 재작업 해주었다. 이렇게 추출된 최종 기울기값과 절편값을 가지고 모델을 생성해야하는데 이때 사용할 수있는 패키지가 MASS패키지의 stepAIC()함수이다.

 

 

모델링 (1) stepAIC()

#5)모델생성
model <- lm(income~education+women+prestige+census,data=data)
model

#stepAIC()함수 : 모델생성에 기여하는 변수들을 선별하는 함수
model2 <- stepAIC(model)
#기존 model에서 모델생성에 기여하는 변수들을 선별하여 model2에 재할당

#step이 진행될때마다 필요없는 변수가 하나씩 줄어든다
#AIC=1607.93 : 모델의 적합도와 복잡도를 모두 고려하는 지표
#AIC 계산식 : AIC=2 X log-likelihood + 2 x k
#AIC값은 모델의 적합도(log-likelihood)와
#모델의 자유도(모수의 수)에 의해 결정
#k는 모델 변수의 개수

stepAIC함수는 모델생성에 기여하는 변수들을 선별하는 함수이며 step이 진행될때마다 필요없는 변수가 하나씩 줄어들면서 최적의 모델을 선택해주는 함수이다. 이 과정들은 더이상 AIC값이 감소하지 않을때까지 반복한다

.새롭게 생성된 model2를 확인해보면 women과 Prestige 2개의 변수만 남은것을 확인할 수 있다.

 

 

모델평가 (1)예측값 도출하기

#6)모델평가
pred <- predict(model2,data)
pred #직업명과 함께 출력
pred<- unname(pred) #예측값만 보기
pred <- round(pred,0)
pred


#실제값
Prestige$income

predict함수에 새롭게 생성된 모델과 기존 데이터를 인수로 주어 예측값을 도출한 후 실제값과 비교분석을 해야한다.

 

모델평가 (2)실제값과 예측값 차이확인

#7)실제값과 예측값 차이확인
pred_data <- data.frame(pred,Prestige$income,pred-Prestige$income)
colnames(pred_data) <- c('예측값','실제값','오차범위')
pred_data
View(pred_data)

#8)MAE값 확인하기
MAE <- mean(abs(pred-Prestige$income))
MAE

모델평가방법은 단순회귀분석과 거의 동일하다. 이렇게 예측값, 실제값, 오차범위를 한 데이터프레임에 정리해주고 오차범위를 확인하거나 MAE값을 이용하여 모델의 평균절대 오차를 확인하면된다. 현재 오차범위와 MAE값을보니 오차가 작은 경우(예: -5, 8 등)도있지만 오차가 큰 경우(예: -14,180, -10,923 등)도 보이고있으며 MAE값도 1501.098로 크게 나왔으므로 약간의 개선이 필요해보이는 결과가 도출됐다.

 

 

 

로지스틱 회귀분석

로지스틱 회귀분석은 회귀모델에서 종속변수의 값이 연속적인 숫자가 아닌 범주형 데이터일경우 사용하는 회귀분석으로, 로지스틱 회귀분석도 회귀분석이기때문에 범주형인 종속변수도 숫자로 표현되어야한다. 그렇기때문에 대부분 문자형으로 되어있는 범주의 값을 정수형데이터로 형변환 한 후 분석을 진행하는 경우가 많다.

 

 

데이터셋 준비

#로지스틱 회귀분석 : 종속변수가 연속적인 숫자가 아니라 범주형데이터로 되어있을때사용

#iris 데이터셋
#다양한 붓꽃(iris) 종을 분류한 데이터
iris


#꽃받침과 꽃임 데이터로 품종을 예측하는 모델 구축
#(로지스틱 회귀 모델)


#1)데이터 준비
data <- iris
data

#2)범주형데이터를 숫자형으로 변환
#as.intrger()
data$Species <- as.integer(data$Species)

#3)변환확인
iris$Species #기존데이터
data$Specise #변환 확인
#setosa : 1
#versicolor :2
#virginica : 3

로지스틱 회귀분석에서는 r의 내장데이터 iris를 사용할 예정인데, 꽃받침과 꽃임 데이터로 품종을 예측하는 모델 구축해보고자한다. 현재 품종이 문자형으로 되어있기때문에 이를 as.integer함수를 사용하여 숫자로 형변환 한 후 분석모델을 만들어주어야한다.

 

로지스틱 회귀모델 생성

#4)로지스틱 회귀모델 생성
#glm(종속변수~독립변수)
model <- glm(Species ~ ., data=data) # . : 종속변수 제외 전체
model

summary(model)
# Estimate 랑 *확인해야함
# Estimate 를 확인해보면 회귀식의 상수와 변수의 계수를 확인할 수 있다
# Petal.Length와 petal.width(꽃잎의 길이와 너비)는
#회귀식을 도출하는데 큰 기여

로지스틱회귀분석의 경우 기울기와 절편을 구할때는 lm이 아닌glm을 사용해야한다. 로지스틱회귀모델도마찬가지로 모델을 summary함수에 넣어 주요한 값들을 확인한 후 수정할것이 있다면 수정하는 과정을 거쳐 모델을 생성해준다.

 

 

모델평가 (1) 생성한 모델로 품종예측 테스트

#생성한 모델로 품종예측
head(iris,3) #행 3개만 확인

#5)첫번째 행의 독립변수로 품종 예측
#첫번째 행 도출 후 -> 데이터 프레임

unkown <- data.frame(rbind(c(5.1,3.5,1.4,0.2)))
#rinb 행추가
names(unkown) <- names(iris)[1:4]

unkown
#하나의 데이터로 붓꽃 품종 데이터 예측
#predict(모델, 데이터셋) 
#데이터셋에 모델 적용하여 예측결과 반환

pred <- predict(model,unkown)
pred #예측값 : 0.9174506 (예측결과는 실수로반환되기때문에 반올림 필수)
pred <- round(pred,0) #정수로 반올림
pred #반환값 1 : setosa

head(iris)#첫번째 예측결과 실제 값과 일치

먼저 모델이 잘 작동이 되는지를 살펴보기위해 실제 데이터의 첫번째 행만 가지고 테스트로 예측값을 확인한 후에 실제 데이터와 비교과정을 거친다. 실제 데이터를 한행만 가지고 온 후, 데이터프레임으로 저장하고 이를 predict함수를 사용하여 반환값을 확인한다. 모델에서 예측값을 1로 반환했는데 1은 setosa로 실제값과 일치하고있음을 확인할 수 있다.

 

모델평가 (2) 생성한 모델로 품종예측 전체데이터 확인

#6)전체데이터로 모델 평가하기

#전체데이터 준비
#종속변수(품종)을 제외한 독립변수로만 구성된 데이터 셋
head(iris)
test <- iris[,1:4]
test #품종빠진 데이터 셋

#7)모델에 데이터를 적용하여 품종예측
pred <- predict(model,test)
pred

#8)실제값이 정수형이기때문에 예측값을 정수형으로 변환
pred <- round(pred,0)
pred #예측값

#9)실제 품종 데이터 가져오기
answer <- iris$Species
answer


#10)범주형 데이터를 숫자형으로 변환
answer<- as.integer(answer)
answer #실제품종(정수형)

이제 같은 방법으로 전체데이터의 예측값을 출력해보자. 품종이빠진 데이터셋을 다시 준비해주고 predict함수에 모델과 데이터셋을 넣어, 전체 품종을 예측하는 예측값을 도출해야하는데 이때 예측값은 실수로 나오는데 실제값이 정수이기때문에 예측값을 정수로 형변환 시켜주는 작업을 한번 더 거쳐서 이 둘을 비교해야한다.

 

모델평가 (3) 예측품종과 실제 품종비교

#11) 예측품종과 실제 품종비교
#관계연산자 사용
#실제 데이터와 예측데이터가 다르다면 False출력될것 
answer==pred

#12)예측 정확도 계산
acc <- mean(answer==pred)
acc

#일치하는 개수 확인
total_acc <- sum(answer==pred)
total_acc #146
print(length(pred)) #150
#4개의 값 제외하고 146개의 값이 일치!

#연산될때 TRUE 는 1로 FALSE는 0으pred#연산될때 TRUE 는 1로 FALSE는 0으로 계산된다
# ->TREU(1)의 합계 / 데이터 수 =정확도
# ->TRUE의 개수 / 행의개수

먼저, 로지스틱 회귀분석에서는 관계연산자를 주로 사용하여 비교분석을 하는 편인데, 실제데이터와 예측데이터의 값이 같은것을 보여달라는 조건식을 적게되면 같은값은 TRUE로 다른값들은 FALSE로 반환될것이다.  이를 새로운 변수에 저장해주고 집계함수와 함께 사용하면 TREU 는1로 FALSE는0으로 치환되기때문에 평균값이나 일치하는 개수등을 쉽게 확인할 수 있다.

결과를 확인해보면 일치하는개수가 전체데이터 150개 중 146개이고 정확도가 0.97로 굉장히 높은 예측률을 보이는 로지스틱 회귀분석 모델링이 구축된것을 확인할 수 있다.

 

 

 


학습일기

드디어 머신러닝 파트인 회귀분석파트까지 오게됐다....ㅋㅋㅋㅋ확실히 어렵다..ㅠㅠ 너무 어려워서 같은 쿼리문을 몇번을 썼다가 지우기를 반복하면서 흐름이라도 외워보자...이해를 못하겠으면 그냥 외워보자..하면서 몇번이고 반복했더니 어느순간 아..! 이거 이래서 이렇게 되는거구나..!하는 분석방법이 보이기시작했다...!!ㅎㅎ 사실 그래도 조금 헷갈리거나 어려운 부분들이 있어서 오늘 공부한 이 회귀분석 파트는 직접 다른 데이터들로 만족스러운 모델이 나오도록 직접 로직구성부터 결과도출까지 해볼예정이다.

그래도 진짜 많이 어려워하던 파트였는데...ㅠㅠㅠ 노력의결실이 그나마 보여서 다행이다..ㅠㅠㅠㅠ더 어려운 회귀분석도 쉽게쉽게 써내려갈 수 있는 그날까지..!! 날 몇번이나 울게했던 회귀분석파트....