R/실습(project)

[R/머신러닝/실습] 단순 선형회귀 분석

연정양 2023. 1. 5.

목표

  제품적절성이 제품만족도에 미치는 영향 주제로 R을 이용한 단순 선형 회귀분석을 실시하고, 인공신경망을 이용한 선형 회귀분석을 python으로 실행하여 결과를 비교한다.

 

분석방법

  SyncRNG패키지를 써서 R과 Python의 랜덤 데이터를 동일하게 맞춘다. R은 lm함수, Python은 인공신경망 경사하강법을 이용해서 모델링후 test셋으로 예측 결과를 비교한다.

 

데이터 정의

사용 데이터 : product.csv

product.csv
0.00MB

 

 

  264개 제품의 점수를 “제품_친밀도, 제품_적절성, 제품_만족도”의 세 항목으로 나누어 살펴볼 수 있는 데이터이다. 각 항목은 최소1에서 최대5까지의 점수 값을 포함하고 있다. 본 보고서에서는 “제품_적절성”이 “제품_만족도”에 미치는 영향을 분석해 보고자 한다. 따라서 “제품_친밀도”는 제외하고 “제품_적절성”, ”제품_만족도” 두 개 열을 이용하여 분석을 수행한다.

 

탐색적 데이터 분석(EDA)

데이터셋의 구조와 데이터 요약

> summary(df)
  제품_친밀도     제품_적절성     제품_만족도   
 Min.   :1.000      Min.   :1.000       Min.   :1.000  
 1st Qu.:2.000     1st Qu.:3.000      1st Qu.:3.000  
 Median :3.000    Median :3.000    Median :3.000  
 Mean   :2.928    Mean   :3.133     Mean   :3.095  
 3rd Qu.:4.000    3rd Qu.:4.000      3rd Qu.:4.000  
 Max.   :5.000     Max.   :5.000      Max.   :5.000  
> str(df)
'data.frame': 264 obs. of  3 variables:
 $ 제품_친밀도: int  3 3 4 2 2 3 4 2 3 4 ...
 $ 제품_적절성: int  4 3 4 2 2 3 4 2 2 2 ...
 $ 제품_만족도: int  3 2 4 2 2 3 4 2 3 3 ...

 

제품만족도를 막대그래프으로 시각화



제품적절성을 막대그래프으로 시각화

히스토그램을 통해 독립변수의 분포가 정규분포와 근사하다 볼 수 있다. EDA 결과, 결측치나 이상치를 발견할 수 없었고 전처리가 필요한 변수도 없음을 확인했다. 

 

 

단순 선형회귀 분석

1) 데이터 호출

library(ggplot2)
library(caret)
df<-read.csv("product.csv")

 

2) 모델 생성

library(SyncRNG)
v <- 1:nrow(df)
s <- SyncRNG(seed=42)
idx <- s$shuffle(v)[1:round(nrow(df)*0.7)]

idx[1:length(idx)]
train <- df[idx,]
test <- df[-idx,]

m_lm<- lm(제품_만족도~제품_적절성, train)

결과:

> m_lm
Call:
lm(formula = 제품_만족도 ~ 제품_적절성, data = train)

Coefficients:
(Intercept)  제품_적절성  
     0.7171       0.7607

 파이썬과 R에서 동일한 데이터로 홀드아웃 교차검증을 진행하기 위해 SyncRNG 패키지를 이용하여 데이터를 분할했다. 그리고 독립변수는 적절성, 종속변수는 만족도로 한다. 

> summary(m_lm)
Call:
lm(formula = 제품_만족도 ~ 제품_적절성, data = train)

Residuals:
     Min       1Q     Median     3Q       Max 
-1.75974 -0.23841  0.00092  0.24026  1.24026 

Coefficients:
                 Estimate    Std. Error   t value      Pr(>|t|)    
(Intercept)     0.71708    0.14118    5.079       9.29e-07 ***
제품_적절성  0.76067    0.04402    17.281      < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.522 on 183 degrees of freedom
Multiple R-squared:   0.62,	Adjusted R-squared:  0.618 
F-statistic: 298.6 on 1 and 183 DF,  p-value: < 2.2e-16

 p-value<2.2e-16이므로 모델이 통계적으로 유의하고, 결정계수는 0.62이다. 회귀식은 제품_만족도=0.76067*제품_적절성 + 0.71708 이다.

 

3) 모델 평가(RMSE, R2)

library(Metrics)
library(caret)
p_lm<-predict(m_lm,test[,-1])
RMSE(p_lm,test[,3])
R2(p_lm,test[,3])

결과:

> RMSE(p_lm,test[,3])
0.5585512
> R2(p_lm,test[,3])
0.5023452

 train셋으로 학습한 모델로 test셋을 예측한 결과 RMSE는 0.559, R2는 0.502가 나왔다.

 

4) 시각화 

ggplot(train,aes(x=제품_적절성,y=제품_만족도))+
  geom_count()+
  scale_size_area(max_size = 15)+
  stat_smooth(method='lm',color='red')+
  geom_text(x=4.3,y=3.5,label="제품_만족도=0.76x제품_적절성+0.72")+
  geom_text(x=4,y=3.3,label="R²=0.62")

제품적절성에 대한 제품만족도의 변화를 점 그래프로 시각화 하였다. 중첩되는 데이터가 많을수록 점의 크기가 커지도록 했으며 회귀선을 추가해 모델링 결과를 대략적으로 파악 할 수 있도록 했다.

점은 제품_적절성에 따른 제품_만족도의 누적 크기로 적절성이 3일때 만족도 3의 갯수가 가장 많았고,

선은 제품_만족도=0.76067*제품_적절성 + 0.71708을 설명하고 있다.

 

 

 

 

댓글