[R데이터분석] 데이터 분석 예제2 : 데이터통합 및 회귀분석

근이의 개발일기·2024년 12월 9일
post-thumbnail

setwd("C:/R")

d1 = read.table("wt.txt", header = T, sep = "\t")
tmp1 <- d1[,c(1,4)]
tmp1 <- aggregate(wt~pid, data = tmp, max)
tmp2 <- d1[,c(-4)]
tmp2 <- na.omit(tmp2)
d1 <- merge(tmp1, tmp2)

#"pid", "A_steps", "A_calorie", "A_distance"
a1 <- read.table("2_App data_e.txt", header = T, sep = "\t")
a1 <- a1[, c("A_myhealth_id", "A_steps", "A_calorie", "A_distance")]
names(a1)[names(a1) == "A_myhealth_id"] <- "pid"
summary(a1)
a1Adistance<as.numeric(a1A_distance <- as.numeric(a1A_distance)
summary(a1)
a1 <- a1[a1A_steps >= 0 & a1A_steps <= 20000,]
summary(a1)
a1 <- na.omit(a1)

💡

데이터 전처리 과정

  1. 파일 불러오기 및 데이터 정리
    • d1 = read.table("wt.txt", header = T, sep = "\t"): wt.txt 파일을 불러옵니다.
    • tmp1: d1wt 열에 대해 pid별 최대값을 추출합니다.
      tmp1 <- d1[, c(1, 4)] # pid와 wt 열만 선택
      tmp1 <- aggregate(wt ~ pid, data = tmp1, max) # pid별로 wt의 최대값 추출
    • tmp2: d1의 4번째 열(wt)을 제외한 모든 열을 선택합니다.
      tmp2 <- d1[, -4] # 4번째 열(wt) 제거
      tmp2 <- na.omit(tmp2) # 결측값 제거
    • 최종 병합: tmp1tmp2pid 기준으로 병합합니다.
      d1 <- merge(tmp1, tmp2) # pid 기준 병합

  1. 두 번째 데이터 정리 (2_App data_e.txt)
    • a1 = read.table("2_App data_e.txt", header = T, sep = "\t"): 앱 데이터 파일 불러오기.
    • 컬럼명 변경: A_myhealth_idpid로 변경.
      names(a1)[names(a1) == "A_myhealth_id"] <- "pid"
    • 필터링 및 전처리:
      • A_distance숫자형으로 변환

      • A_steps가 0에서 20,000 사이의 값만 남기고, 결측값 제거.

        a1$A_distance <- as.numeric(a1$A_distance)
        a1 <- a1[a1$A_steps >= 0 & a1$A_steps <= 20000, ]
        a1 <- na.omit(a1) # 결측값 제거

tmp1 <- aggregate(A_steps~pid, data = a1, mean)
tmp2 <- aggregate(A_calorie~pid, data = a1, mean)
tmp3 <- aggregate(A_distance~pid, data = a1, mean)

tmp4 <- merge(tmp1,tmp2)
tmp4 <- merge(tmp4, tmp3)
summary(tmp4)

finaldata <- merge(d1,tmp4)

💡

데이터 요약 및 병합

  • 집계: pid별로 A_steps, A_calorie, A_distance의 평균값을 계산합니다.
    tmp1 <- aggregate(A_steps ~ pid, data = a1, mean)
    tmp2 <- aggregate(A_calorie ~ pid, data = a1, mean)
    tmp3 <- aggregate(A_distance ~ pid, data = a1, mean)
  • 병합: 위에서 만든 tmp1, tmp2, tmp3pid 기준으로 병합합니다.
    tmp4 <- merge(tmp1, tmp2)
    tmp4 <- merge(tmp4, tmp3)
  • 최종 병합: 최종적으로 d1tmp4를 병합하여 finaldata를 생성합니다.
    finaldata <- merge(d1, tmp4) # pid 기준으로 병합

summary(lm(wt~age, data = finaldata))
summary(lm(wt~factor(sex), data = finaldata))
summary(lm(wt~A_steps, data = finaldata))
summary(lm(wt~A_calorie, data = finaldata))
summary(lm(wt~A_distance, data = finaldata))

res <- lm(wt~ . -pid, data = finaldata)

💡

회귀분석 과정

  1. 단일 변수 회귀분석

    summary(lm(wt ~ age, data = finaldata))
    summary(lm(wt ~ factor(sex), data = finaldata))
    summary(lm(wt ~ A_steps, data = finaldata))
    summary(lm(wt ~ A_calorie, data = finaldata))
    summary(lm(wt ~ A_distance, data = finaldata))
    • 종속변수 (y): wt
    • 독립변수 (x): age, sex, A_steps, A_calorie, A_distance
    • 각 독립변수의 p-value와 결정계수(R-squared) 등을 확인하여 유의미한 변수를 식별합니다.

  1. 다중 회귀분석
    ```
    res <- lm(wt ~ . - pid, data = finaldata)
    ```
    
    - 종속변수 **wt**를 기준으로 모든 변수를 포함해 다중 회귀분석을 수행합니다.
    - `~ . - pid`: 모든 변수를 사용하되, **pid는 제외**합니다.

res <- lm(wt~age+sex+A_steps+A_calorie, data = finaldata)
vif(res)
step(res) #모든 변수가 AIC를 낮추는데 기여
summary(res) #모델은 유의미하지만, 종속변수의 변동성을 크게 설명하지는 못한다.

💡

VIF 계산 (다중공선성 확인)

library(car)
vif(res)
  • *VIF(분산 팽창 계수)**를 계산하여 다중공선성이 존재하는지를 확인합니다.
  • VIF > 10인 변수는 다중공선성 문제가 있다고 볼 수 있습니다.

모델 최적화 및 변수 선택

res <- lm(wt ~ age + sex + A_steps + A_calorie, data = finaldata)
vif(res) # 다중공선성 확인
step(res) # AIC 기반의 변수 선택
summary(res)
  • 변수 선택 (stepwise selection):
    • step() 함수는 AIC(Akaike Information Criterion) 기준으로 불필요한 변수를 제거합니다.
    • 모델의 AIC가 가장 낮아지는 최적의 모델을 자동으로 선택합니다.
  • 최종 모델 평가:
    ```
    summary(res)
    ```
    
    - 회귀 모델의 **p-value, R-squared, Coefficients** 등을 확인합니다.
    - p-value가 유의한 독립변수를 식별하고, R-squared를 통해 **설명력**을 평가합니다.
💡
  • 데이터 전처리
    • wt.txt2_App data_e.txt의 데이터를 병합하여 finaldata 데이터셋을 생성했습니다.
    • 결측치 제거, 이상치 제거, 변수명 변경 등의 전처리가 수행되었습니다.
  • 회귀분석
    • 단일 변수 회귀분석을 통해, age, sex, A_steps, A_calorie, A_distance의 영향을 확인했습니다.
    • 다중 회귀분석을 통해 최적의 모델을 선택했습니다.
    • AIC를 기준으로 불필요한 변수를 제거하였고, vif()를 통해 다중공선성을 확인했습니다.
  • 모델 해석
    - 최종 모델의 회귀계수와 p-value를 통해 유의미한 변수를 식별했습니다.
    - 최종 모델의 R-squared 값과 AIC 값을 통해 모델의 설명력과 적합도를 평가했습니다.
    - AIC를 줄이기 위해 step() 함수를 사용하여 모델 단순화를 수행했습니다.

0개의 댓글