[R데이터분석] 데이터 분석 예제3 : 비모수검정

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

setwd("c:/R")
install.packages("dplyr")
library(dplyr)
install.packages("car")
library(car)

d1 = read.table("wt.txt", header = T, sep = "\t")

d2 <- d1[,c(1,4)] #pid와 wt만 추출
d2 <- aggregate(wt~pid, data = d2, max) #pid에 따른 몸무게의 최대값

d3 <- d1[, -4]
d3 <- na.omit(d3)

d4 <- merge(d2,d3, key="pid")

💡

데이터 전처리

  1. 파일 불러오기

    d1 = read.table("wt.txt", header = T, sep = "\t")
    • wt.txt 파일 불러오기: \t로 구분된 텍스트 파일을 불러옵니다.
    • 주요 변수: pid, wt, age, sex 등의 변수.

  1. 데이터 정리
    ```
    d2 <- d1[, c(1, 4)] # pid와 wt만 추출
    d2 <- aggregate(wt ~ pid, data = d2, max) # pid에 따른 몸무게의 최대값
    d3 <- d1[, -4] # wt 열을 제외
    d3 <- na.omit(d3) # 결측값 제거
    d4 <- merge(d2, d3, key = "pid") # pid를 기준으로 병합
    ```
    
    - **d2**: **pid별로 wt의 최대값**을 구합니다.
    - **d3**: wt 열을 제외하고 결측치를 제거합니다.
    - **d4**: **d2와 d3를 pid 기준으로 병합**하여 최종 데이터 **d4**를 생성합니다.
    - *최종 데이터(d4)**에는 **pid, wt, age, sex** 등의 변수가 포함됩니다.

#qqnorm, qqline, shapiro 등으로 정규성 보고 정규분포 하지 않는다? -> wilcox.test

#정규분포 하는경우 : (var.test -> t.test)

#정규분포 하지 않는경우 : wilcox.test

#wilcox검정시 성별에따른 몸무게 중앙값이랑 aggregate(wt~sex, data = a5, range)해서 범위 보여줘야됨
#그냥 aggregate(wt~sex, data = a5, summary)로 보여줘도됨

shapiro.test(d4$wt) #결과 정규분포하지 않는다.

💡
shapiro.test(d4$wt)
  • Shapiro-Wilk Test를 사용하여 wt의 정규성을 검정합니다.
  • 결과: p-value < 0.05이면 정규분포를 따르지 않는다고 해석합니다.
  • 정규분포를 따르지 않으면 비모수적 방법(wilcox.test)을 사용합니다.

pairs(d4)
plot(d4)

💡

기초 시각화

pairs(d4)
plot(d4)
  • pairs()변수들 간의 산점도 행렬을 시각화하여 변수가 서로 어떻게 관계되어 있는지 확인합니다.
  • plot(d4)는 각 변수에 대한 산점도분포를 확인할 수 있습니다.

cor.test(d4wt,d4wt, d4age) #정규성 필요

cor.test(d4wt,d4wt, d4age, method = "spearman")#정규성 필요없음

💡

상관 분석

cor.test(d4$wt, d4$age) # Pearson 상관분석 (정규성 필요)
cor.test(d4$wt, d4$age, method = "spearman") # Spearman 상관분석 (정규성 불필요)
  • Pearson 상관분석: 정규성을 가정해야 합니다. 정규성을 따르지 않으면 부적합.
  • Spearman 상관분석: 비모수적 방법으로 정규성을 가정하지 않아도 됩니다.
  • cor.test()의 결과로 상관계수(r)와 p-value가 출력됩니다.
  • p-value < 0.05이면 두 변수 간 상관관계가 유의미하다고 해석합니다.

m = lm(wt~age+factor(sex), data = d4)
summary(m)

💡

회귀 분석

m = lm(wt ~ age + factor(sex), data = d4)
summary(m)
  • lm() 회귀모델: wt에 영향을 미치는 요인으로 agesex를 고려한 선형 회귀 분석.
  • factor(sex): 범주형 변수 sex를 더미 변수로 변환하여 회귀 모델에 포함합니다.
  • summary(m): 회귀계수, 표준오차, p-value 등을 보여줍니다.
  • p-value < 0.05이면 유의미한 독립변수로 해석합니다.

m = glm(wt~age+factor(sex), data = d4)
summary(m)

💡

로지스틱 회귀 분석

m = glm(wt ~ age + factor(sex), data = d4)
summary(m)
  • glm() 회귀모델: 로지스틱 회귀 분석으로, 이진종속변수일 때 사용.
  • *summary(m)**를 통해 회귀계수, 표준오차, z-value, p-value 등을 확인합니다.

a1 <- read.table("2_App data_e.txt", header = T, sep = "\t")
a1 <- a1[,c(1,3,4,5)]
names(a1) <- c("pid", "A_steps", "A_calorie", "A_distance")

summary(a1) #확인결과 A_distance가 character이다.
a1Adistance<as.numeric(a1A_distance <- as.numeric(a1A_distance)
summary(a1Adistance)a1<a1[a1A_distance) a1 <- a1[a1A_steps > 0 & a1Asteps<20000,]summary(a1A_steps < 20000, ] summary(a1A_distance)
summary(a1)
a1 <- na.omit(a1)

💡
  1. 두 번째 데이터 불러오기

    a1 <- read.table("2_App data_e.txt", header = T, sep = "\t")
    a1 <- a1[, c(1, 3, 4, 5)]
    names(a1) <- c("pid", "A_steps", "A_calorie", "A_distance")
    • 2_App data_e.txt를 불러오고, A_steps, A_calorie, A_distance 변수를 선택합니다.
    • A_distance가 문자형 변수이기 때문에, 이를 숫자형으로 변환합니다.

  1. 데이터 필터링 및 결측값 제거
    ```
    a1$A_distance <- as.numeric(a1$A_distance)
    a1 <- a1[a1$A_steps > 0 & a1$A_steps < 20000, ]
    a1 <- na.omit(a1)
    ```
    
    - **이상치 제거**: A_steps의 범위를 0에서 20000 사이로 제한합니다.
    - **결측치 제거**: **na.omit()**으로 결측치를 제거합니다.

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

f <- merge(tmp1, tmp2,key = "pid")
f <- merge(f, tmp3, key = "pid")

final <- merge(d4, f, key = "pid")

💡

집계 및 병합

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

f <- merge(tmp1, tmp2, key = "pid")
f <- merge(f, tmp3, key = "pid")

final <- merge(d4, f, key = "pid")
  • 집계: pid별로 평균값을 계산합니다.
  • 병합: d4와 f를 병합하여 final 데이터셋을 만듭니다.

m <- lm(wt~ . - pid, data = final) #전체 변수들중 pid만 제외.
m

vif(m)

m <- glm(wt~age+factor(sex)+A_steps+A_calorie, data = final)
vif(m)

step(m) #더이상 뺄건 없다.
summary(m) #해석, 함의까지 작성하면 됩니다.

💡

최종 회귀 모델

  1. 모델 생성

    m <- lm(wt ~ . - pid, data = final)
    vif(m)
    • 모든 변수를 포함한 다중회귀모델을 생성합니다.
    • *VIF(분산 팽창 계수)**를 계산하여 다중공선성이 있는지 확인합니다.
    • VIF > 10인 변수가 있다면, 다중공선성이 있다고 판단하고 변수를 제거해야 합니다.

  1. 모형 단순화
    ```
    m <- glm(wt ~ age + factor(sex) + A_steps + A_calorie, data = final)
    vif(m)
    step(m)
    summary(m)
    ```
    
    - **변수 선택**: AIC(Akaike Information Criterion)를 기준으로 최적의 변수를 선택합니다.
    - **AIC가 가장 낮은 조합**을 찾고, 불필요한 변수를 제거합니다.
    - **모형 평가**:
        - **p-value**가 유의미한 변수만 남깁니다.
        - 회귀계수의 해석을 통해, **변수의 영향력**을 평가합니다.

0개의 댓글