BASEMENT
R 프로그래밍 6주차 본문

두 집단의 비교
1. 독립표본과 대응표본
독립표본 : 서로 관련이 없는 두 모집단으로부터 얻어짐
대응표본 : 한 모집단으로부터 얻어진 대상에 대하여 두 번 반복 측정하여 얻어짐



2. 일표본 평균
하나의 모집단으로부터 표본을 추출하고 표본으로부터 모집단 평균의 신뢰 구간을 구함
가설검정 : t.test() 함수 사용 (귀무가설 : 모평균이 mu와 같다)
x <- rnorm(30, mean=0) # 평균0
t.test(x)
x <- rnorm(30, mean=10) # 평균10
t.test(x, mu=10) # mu=10 모평균이 10인지에 대한 가설 검증. p-value>0.05이므로 mu=10이라는 귀무가설 기각x
3. 독립 이표본 평균
두 모집단에서 각각 표본 추출하고 두 모집단의 평균이 같은지 구함
가설검정 : t.test()
var.equal : 두 집단의 모분산이 같은지 여부
paired=T 짝지은 이표본 검정 / paired=F 독립 이표본 검정
alternative = "two.sided" or "greater" or "less". 기본값은 two.sided (양측검정)
t.test(x,y, var.equal=T, alt="greater", paired=T)
분산분석
1. 일원배치 분산분석(ANOVA)
하나 이상의 모델을 평가하거나 모델 간의 비교를 위해 사용
독립성, 정규성, 등분산성의 3가지 가정을 만족해야 함
- 독립성 : 변수간 독립성
- 정규성 : 정규분포에 따르는지. t-test 실행
- 등분산성 : 분산이 균등한지

# anova를 사용하여 완전모델과 축소모델 비교
data(cars)
full <- lm(dist~speed, data=cars) # 완전모델
full
reduced <- lm(dist~1, data=cars) # 축소모델 : speed변수 제외, dist를 상수값으로 예측
reduced
anova(reduced, full) # full과 reduced 비교
# p-value < 0.05이므로 reduced모델과 full모델 간 유의한 차이가 있음
# speed열이 유의미한 설명 변수임을 의미함
2. 그 밖의 분산분석(ANOVA)
측정하고자 하는 값에 영향을 미치는 요인의 수에 따라서 구분
요인이 1개이면 one-way ANOVA, 요인이 2개이면 two-way ANOVA
cf) RM-ANOVA : 반복해서 ANOVA 측정함

단순 회귀 분석
1. 단순 회귀 분석
-
독립변수와 종속변수가 선형의 관계에 있을때, 선형회귀식을 추정
-
회귀계수 : 회귀분석에서 추정하는 값 (변수 X 앞의 βi)
-
잔차 : 표본집단에서 관측값과 회귀선에 의한 예측값 사이의 차이 (εi)
-
오차항 : 모집단에서 실제값과 회귀선 사이에 차이가 나는 부분

2. 단순 선형 회귀
종속 변수 Y를 하나의 독립 변수 X로 설명
선형회귀 : lm() 함수로 수행
lm(y~x, data)
data(cars)
(m <- lm(dist~speed, data=cars))
1) 선형 회귀 결과 추출
- coef() : 회귀계수 (해당되는 x값의 기울기)
- fitted() : 적합된 값 (y값 예측)
- residuals() : 잔차
- confint() : 회귀 계수의 신뢰 구간
- 잔차 제곱 합 : 데이터와 추정된 모델 간의 불일치 정도를 표현
cf) 최소 제곱법 : 선형회귀의 회귀계수는 최소제곱법으로 추정함. 오차의 제곱합이 최소가 되도록 회귀계수를 정함
data(cars)
m <- lm(dist~speed, data=cars)
coef(m)
fitted(m)
residuals(m)
confint(m)
2) 선형 모델을 사용한 예측
새로운 데이터에 대한 예측값을 구함
predict(선형모델, newdata)
# 자동차의 주행속도와 제동거리에 대한 선형회귀모델, 주행속도가 3인 경우 제동거리 예측
data(cars)
m <- lm(dist~speed, data=cars)
predict(m, newdata=data.frame(speed=3)) # 예측값 : -5.781869
coef(m)
-17.579095 + 3.932409 * 3 # 실제값 : -5.781868
# 예측값과 실제값이 일치함
predict(m, newdata=data.frame(speed=c(3)), interval="confidence")
# interverl="confidence" : 제동거리의 평균 신뢰구간을 구할 수 있음
3) 모델 평가
summary() : 주어진 인자에 대한 요약정보를 보여줌
m <- lm(dist~speed, data=cars)
summary(m)
# R-squared 값이 높을수록 좋음
cf) 결정계수 (R-squared)
R 제곱
회귀제곱 합 / 총 제곱 합
범위는 0 이상 1이하 이며, 1에 가까울수록 회귀 모델이 데이터를 더 잘 설명함
3. 회귀모형의 기본 가정
1) 선형성
-
독립변수와 종속변수의 관계는 선형관계
-
산점도로 확인
- cf) 비선형회귀 : 직선이 아님. 포아송 분석 사용
2) 오차항의 정규성
-
모든 독립변수의 값에서 종속변수는 정규분포를 이룸
-
정규 P-P 곡선으로 확인
3) 오차항의 독립성
-
개별 잔차들은 서로 독립
-
잔차산점도, Durbin-Watson 통계량으로 확인
4) 오차항의 등분산성
-
모든 독립변수 값에서 종속변수의 분산은 다음과 같음
-
잔차산점도로 관리
4. 모델 진단 그래프
plot(m) : 선형 회귀 모델을 평가하는 데 필요한 다양한 차트를 볼 수 있음
5. 회귀 직선의 시각화
데이터의 산점도와 회귀 직선을 그릴 수 있음
plot() 함수 사용
plot(cars$speed, cars$dist)
abline(coef(m)) # coef: 절편과 기울기 추출, abline : 절편과 기울기로 그래프를 그리는 함수
speed <- seq(min(cars$speed), max(cars$speed), .1)
ys <- predict(m, newdata=data.frame(speed=speed), interval="confidence") # 신뢰구간을 구함
matplot(speed, ys, type='n')
matlines(speed, ys, lty=c(1,2,2), col=1)
다중 회귀 분석 (중선형분석)
1. 다중 회귀 분석
-
예측변수(독립변수 or 설명변수)가 2개 이상인 회귀분석
-
예측변수의 개수가 많을 경우, 적절한 회귀 모형 선택이 필요

data(iris)
head(iris)
(m <- lm(iris$Sepal.Length~., data=iris[,-5])) # ~. 종속변수를 제외한 모든 변수를 가져옴
summary(m)
2. 중선형 회귀 - 범주형 변수
data("Boston")
m <- lm(Boston$medv~., data=Boston)
summary(m)
# 단계적 방법
m2 <- step(m, direction="both")
formula(m2)
m3 <- lm(Boston$medv ~ crim + zn + chas + nox + rm + dis + rad + tax +
ptratio + black + lstat, data=Boston)
summary(m3)
# stepwise를 사용하여 변수 제거/추가 등 선택 가능
# age를 삭제하거나 추가하여도 r-squared 값 차이가 없음
중선형 회귀 예제
data(Boston)
m <- lm(medv~., data=Boston.train)
summary(m)
m2 <- step(m, direction="both")
formula(m2)
m3 <- lm(medv ~ crim + zn + chas + nox + rm + dis + rad + tax + ptratio +
black + lstat, data=Boston.train)
summary(m3)
m4 <- predict(m3, newdata = Boston.test)
summary(m4)
mean((Boston.test$medv-m4)**2)
# MSE (평균오차곱합) => 회귀식을 평가하는 지표중 하나. 낮을수록 더 좋은 모델(보통 20이하)
# rmse
변수선택법
1. 변수선택법
후진제거, 전진제거, 단계적 제거
- 후진제거 (backward) = 변수소거법 : 모든 변수가 포함된 모델에서 기준 통계치에 가장 도움이 되지 않는 변수를 하나씩 제거하는 방법
- 전진선택 (forward) : 절편에 있는 모델에서 기준 통계치에 가장 도움이 되지 않는 변수를 하나씩 제거하는 방법
- 단계적 선택 (stepwise) : 모든 변수가 포함된 모델에서 출발하여 기준 통계치에 가장 도움되지 않는 변수를 삭제하거나, 모델에서 빠져있는 변수 중에서 기준 통계치를 가장 개선시키는 변수를 추가하는 방법. 주로 사용함
step(모델, direction="both") -> direction은 변수 선택의 방향 ("both", "forward", "backward")
formula() : 포뮬러 함수. 최적 모델의 포뮬러를 알려줌
data(Boston)
m <- lm(medv~., data=Boston.train)
summary(m)
m2 <- step(m, direction="both")
formula(m2)
m3 <- lm(medv ~ crim + zn + chas + nox + rm + dis + rad + tax + ptratio +
black + lstat, data=Boston.train)
summary(m3)
데이터 샘플링
1. 전수조사 vs 표본조사
모집단의 특성을 측정하기 위한 방법으로는 전수조사와 표본조사로 구분
표본조사는 확률적 방법과 비확률적 방법을 이용하여 모집단으로부터 표본을 추출함
1) 전수조사
-
관심의 대상이 되는 집단을 이루는 모든 개체들을 조사하여 모집단(조사하고자 하는 대상이 되는 집단 전체)의 특성을 축정하는 방법
-
장점 : 정확한 모집단 특성 측정 가능
-
단점 : 비용 과다 소요, 조사에 장시간 소요
2) 표본조사
-
관심의 대상이 되는 전체 모집단 중 일부(표본)를 선택하고, 조사를 실시하여 이로부터 전체 모집단의 특성을 추정
-
장점 : 시간 및 비용 절감, 심도 있는 조사 가능
-
단점 : 모집단에 대한 정확한 특성 측정이 아닌 추정
2-1) 확률적 방법
-
모집단의 개체가 표본으로 선정될 가능성이 모두 동일한 표본추출방법(Equally Likely)
-
표본오차 계산 가능
- 단순임의추출, 계통추출, 층화추출, 집락추출
2-2) 비확률적 방법
-
조사(분석)자가 편의를 위하여 표본 대상자를 임의로 선정하는 방법
-
객관적 타당성이 제시되어야 함
2. 표본추출법
단순임의추출, 계통추출, 층화추출, 집락추출
보통 층화임의추출을 자주 사용함
구분구분 |
방법방법 |
장점장점 |
단점단점 |
단순임의추출 |
|
|
|
계통추출 |
|
|
|
층화추출 |
|
|
|
집락추출 |
|
|
|
3. 단순임의추출
data(iris)
data(Boston)
t.idx <- sample(1:150, 105) # 복원추출
iris.train <- iris[t.idx,]
str(iris.train)
iris.test <- iris[-t.idx,]
str(iris.test)
l.idx <- sample(1:506, 350)
Boston.train <- Boston[l.idx, ]
str(Boston.train)
Boston.test <- Boston[-l.idx, ]
str(Boston.test)
4. 층화임의추출
install.packages("sampling")
library(sampling)
data(iris)
tr.idx <- strata(c("Species"), size=c(35,35,35), method="srswor", data=iris) # srswor : 비복원 추출
te.idx <- iris[-tr.idx$ID_unit,]
train <- getdata(iris, tr.idx)
test <- getdata(iris, te.idx)
library(MASS)
data(Boston)
str(Boston)
Boston$chas <- as.factor(Boston$chas) # as.factor : factor로 변환
table(Boston$chas)
x <- strata(c("chas"), size=c(400,30), method="srswor", data=Boston)
getdata(Boston, x)
실습
보스톤 집값 데이터
506개 타운의 13개 변수로 해당 타운의 주택가격을 예측하는 문제
data("Boston")
l <- lm(Boston$medv~., data=Boston)
summary(l)
mpg와 상관관계가 가장 높은 데이터 회귀분석
data(mtcars)
str(mtcars)
c.idx <- sample(1:32, 22) # 1. 데이터 샘플링 (1~데이터갯수, 선택할 갯수)
mtcars.train <- mtcars[c.idx,] # 2. 데이터를 train(모델훈련), test(모델검증) set으로 나눔
mtcars.test <- mtcars[-c.idx,]
c <- lm(mpg~., data=mtcars.train) # 3. train모델로 전체 회귀분석
summary(c)
c2 <- step(c, direction="both") # 4. stepwise로 변수 선택
formula(c2) # 최적값을 보여줌
c3 <- lm(mpg ~ wt + qsec + am, data=mtcars.train) #5. 선택한 변수로 다시 train
summary(c3)
c4 <- predict(c3, newdata=mtcars.test) #6. 새로운 데이터 성능 확인
summary(c4)
mean((mtcars.test$mpg-c4)**2) # 7. mse값(오차의 곱)이 낮을수록 좋음
'Programming > R' 카테고리의 다른 글
R 프로그래밍 - 8주차 (0) | 2020.08.11 |
---|---|
R 프로그래밍 - 7주차 (0) | 2020.08.11 |
R 프로그래밍 5주차 (0) | 2020.07.18 |
R프로그래밍 4주차 (0) | 2020.07.06 |
R프로그래밍 3주차 (0) | 2020.07.05 |