Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Intersect
- 순위출력
- if문 작성법
- difftime
- Sum
- 히스토그램 그리기
- count
- 그래프시각화
- 총과 카드만들기
- 빅데이터분석
- max
- merge
- Dense_Rank
- 팀스파르타
- 막대그래프
- 빅데이터
- 회귀분석
- 상관관계
- %in%
- 여러 데이터 검색
- loop 문
- 정보획득량
- 회귀분석 알고리즘
- 그래프 생성 문법
- 불순도제거
- 데이터분석가
- 단순회귀 분석
- sqld
- 데이터분석
- sql
Archives
- Today
- Total
ch0nny_log
[빅데이터분석] R _ 60. 다중회귀 본문
■ 상관관계 복습
※ paris 패키지 설명
1. pairs 그래프 보는 방법 순서
library(psych)
pairs.panels(cha,pch='.')
대각선 쪽 그래프 4개 설명
- 대각선 그래프 확인 : 히스토그램 그래프와 확률밀도 그래프로 데이터의 분포를 확인
- distress_ct : 대부분의 데이터가 0에 집중되어있고, 일부 1 또는 2가 보임
- temperature : 온도가 약 55에서 80 사이로 분포하며 가장 빈도가 높은 구간이 65~75사이
- pressure : 50, 100, 200 으로 분포 되어있음
- flight_num : 균등하게 분포 되어있음
- 상관관계를 나타내는 숫자를 두번째로 확인
- 0.84 : 비행기 번호와 압력과는 높은 상관관계를 보이고 있음. 최신 비행기일수록 높은 압력에 견딜 수 있게 구성이 되고 있다는 뜻
- -0.51 : 온도와 o형링 파손수와는 음의 상관관계를 보이고 있음. 이는 온도가 낮을수록 더 많은 o형링이 파손된다는 뜻
- 0.28 : 압력이 높을수록 o형링 파손수가 높아지는 양의 상관관계를 보이고 있음
- 빨간색 선, 빨간점, 검정 동그라미를 세번째로 확인
- 빨간선이 두 변수간의 단순 선형 회귀선
- 비행기 번호와 압력의 빨간선이 직선에 가깝고 기울기가 큼. 압력이 증가할수록 비행기 번호가 증가하는 경향이 있는데, 이는 최신 비행기일수록 압력에 잘 견디도록 설계되었다는 뜻
- 두번째로 기울기 있는 빨간직선이 압력과 o형링 파손수인데 압력이 높을수록 o형링 파손수가 높아지는 관계를 보이고 있음을 증명
- 빨간점은 두 변수간의 평균값이 교차하는 지점을 나타냄.
- 빨간점의 위치에 따라서 평균이 높은지 낮은지를 한눈에 확인 가능
- 검정 동그라미는 두 변수간의 데이터 분포에 따른 상관관계를 시각적으로 나타낸것.
- 동그란 원 모양 : 상관관계가 약함. 데이터가 균등하게 분포되어있음
- 길쭉한 타원모양 : 상관관계가 강함. 데이터가 특정 방향으로 향해있는 경향을 보임
- 대부분의 데이터는 이 동그라미 안에 분포해있음
- 빨간선이 두 변수간의 단순 선형 회귀선
실습1. 미국민 의료비 데이터에서 age, bmi, children, expenses 를 가져와서 다음과 같이 시각화하기
setwd("c:\\data") ins <- read.csv("c:\\data\\insurance.csv", header = T) library(psych) pairs.panels(ins[ , c('age','bmi','children','expenses')],pch='.')
대각선 : age는 값이 고르게 분포되어있고 특정 연령대에 데이터가 집중되어있지 않음
bmi는 대략적인 정규분포 형태를 보이고 대부분의 값이 중간 범위에 집중되어 있음
children은 대부분 0~2 사이에 있고 3이상의 값은 상대적으로 적음
expenses는 오른쪽으로 꼬리가 긴 분포를 보이며 대부분 값이 낮은 범위에 집중되어 있음
두번째 상관관계를 나타내는 숫자 : 거의 대부분 상관관계가 없지만 나이와 의료비와는 약한 양의 상관관게를 보임 나이가 많을수록 의료비가 더 지출되는 경향이 있음을 보임
세번째 빨간색 선, 점, 동그란 원 그래프: 상관관계가 조금이나마 있는 나이와 의료비와의 빨간 직선이 기울어져 있는 부분을 확인하면 됨
■ 다중회귀
다중회귀분석 수업자료
다중회귀 분석을 왜 배워야하는가?
- 선배 기수의 회귀분석 현업 사용예: https://cafe.daum.net/oracleoracle/SibM/2
2. 첫번째 설명 그림
3. 두번째 설명 그림(책 291페이지)
4. 세번째 설명 그림(책 292페이지)
5. 다중회귀 분석의 기울기를 구하기 위해 알아야할 수학 용어 5가지 ?
- 전치행렬
- 단위행렬
- 정방행렬
- 역행렬
- 의사 역행렬
■ 전치행렬
실습1.
행렬곱하는 공식입니다.
2. 단위행렬이란?
■ 추가문제
■ 정방행렬이란? (정사각형 행렬)
■ 역행렬이란?
방정식에서는 역행렬이 다음과 같이 사용됨.
의사 역행렬
코드로 구현하기 위한 설명:
다음은 참고 자료입니다.
책 264 페이지 맨위에 Y =BX 를 위의 식을 보고 다시 쓰면 BX = Y 가 된다.
여기서 B 를 A 로 하고 Y 를 b 라고 하면 위의 식처럼 나오는데 A 행렬이 정방행렬이 아니면 역행렬을
구할 수 없으니 아래와 같이 A 행렬의 전치행렬을 곱하게 되면 정방행렬이 되고
이 정방행렬의 정방행렬 역행렬을 곱하면 단위행렬이 된다.
단위행렬에 x 를 곱하면 그냥 x 이므로 왼쪽은 그냥 아래와 같이 x 만 남게 된다.
실습. 아래의 식을 R코드로 구현하기 (p.292)
reg <- function(y,x) { x <- as.matrix(x) x <- cbind(Intercept = 1,x) b <- solve(t(x) %*% x) %*% t(x) %*% y colnames(b) <- "estimate" print(b) }
풀이:
# 필요한 패키지 로드 library(MASS) # reg 함수 정의 reg <- function(y, x) { x <- as.matrix(x) x <- cbind(Intercept = 1, x) b <- ginv(t(x) %*% x) %*% t(x) %*% y colnames(b) <- "estimate" print(b) } # 주어진 연립일차방정식의 행렬 A와 벡터 b A <- matrix(c(2, 1, 2, 3, 2, -1), nrow = 2, byrow = TRUE) b <- matrix( c(7, 1) ,nrow=2, byrow=T) # 함수를 사용하여 해를 구함 reg(b, A)
실습. 책 p.294 에서 만든 reg 함수를 사용해서 우주 왕복선 챌린저호 폭파의 가장 큰 원인인 O형링 파손 (distress_ct)의 가장 큰 영향을 준 독립변수가 무엇인지 출력하기
setwd("c:\\data\\") cha <- read.csv("c:\\data\\challenger.csv",header=T) cha x <- cha[ ,c(2:4)] x y <- cha$distress_ct y #reg 함수 정의 reg <- function(y,x) { x <- as.matrix(x) x <- cbind(Intercept = 1,x) b <- solve(t(x) %*% x) %*% t(x) %*% y colnames(b) <- "estimate" print(b) } reg(y=cha$distress_ct, x=cha[ , c(2:4)])
> reg(y=cha$distress_ct, x=cha[ , c(2:4)]) estimate Intercept 3.527093383 #절편 temperature -0.051385940 #온도의 기울기 field_check_pressure 0.001757009 #압력의 기울기 flight_num 0.014292843 #비행기 번호의 기울기 >
회귀식 : y = 3.527093383 -0.051385940 * x1 + 0.001757009 * x2 + 0.014292843 * x3
# 이번에는 R 내장함수인 lm 함수를 이용해서 기울기와 절편을 구하기model <- lm(distress_ct ~ ., data=cha) model
실습. 스마트폰 만족도에 가장 큰 영향을 주는 독립변수가 무엇인지 다중 회귀 분석을 해서 알아내기 ( 데이터 : multi_hg.csv)
smart <- read.csv("c:\\data\\multi_hg.csv", header=T, fileEncoding = "euc-kr") head(smart) model <- lm(만족감 ~ ., data=smart) model
실습. 미국민 의료비를 예측하는 다중 회귀 모델 생성하기
해석:#1. 데이터를 불러오기 ins <- read.csv("insurance.csv", header=T) #2. 데이터를 살펴보기 View(ins) colSums(is.na(ins)) #결측치 확인 #3. 다중회귀 분석 모델을 생성하기 model <- lm(expenses ~ ., data = ins) #또는 아래와 같이 써도 됨 model <- lm(expenses ~ age + children + sex + smoker + region + bmi, data = ins) #4. 회귀분석 결과를 해석하기 options(scipen = 999) summary(model) #5. 회귀분석 모델의 성능을 높이기 #파생변수를 추가해서 설명력을 높이기 #파생변수1. 기계에게 비만인 사람과 비만이 아닌 사람에 대한 기준을 알려주기 ins$bmi30 <- ifelse(ins$bmi >= 30, 1, 0) head(ins) model2 <- lm(expenses ~ ., data = ins) summary(model2) # 결정계수값이 0.7509 --> 0.7559 으로 소폭 상승 #귀무가설 : 비만과 의료비는 서로 연관이 없다 #대립가설 : 비만과 의료비는 서로 연관이 있다 #bmi30의 p-value 값이 작으므로 대립가설을 채택할 충분한 근거가 있음 #파생변수2. 비만이면서 흡연을 하면 1이라고 하고 아니면 0이라고 하는 파생변수를 smokeryse_bmi30이라는 이름으로 추가하기 ins$smokeryes_bmi30 <- ifelse(ins$smoker=='yes' & insurance$bmi >= 30, 1, 0) head(ins) model3 <- lm(expenses ~ ., data = ins) summary(model3) #Multiple R-squared: 0.8639 #다음과 같이 모델을 생성해도 됨 #비만이면서 흡연을 했을 때 의료비 영향을 미치는지 확인 model4 <- lm(expenses ~ age + children + bmi +smoker + bmi30*smoker, data=ins) summary(model4)
- 나이가 일년씩 더해질 때 마다 평균적으로 의료비가 256.8 달러 증가될 것으로 예상됨
- 더미 변수인 sexmale 이 자동으로 추가되면서 변수값의 상대적 추정을 했을 때 결과는 남성은 여성에 비해서 매년 의료비가 131.4 달러 적게 든다고 예상하고 있음
- 비만지수 (bmi)의 단위가 증가할 때 연간 의료비가 339 달러가 증가될 것으로 예상하고 있음
- 자녀(children)수가 한 명 추가될 때 마다 475달러가 추가될 것으로 예상됨
- 흡연자(smokeryes)가 비 흡연자보다 매년 평균 의료비가 23847 달러가 더 소요될 것으로 예상됨
- northeast에 비해서 northwest는 의료비가 연간 평균 352.8 달러가 덜 소요되고,
- southeast는 의료비가 연간 평균 1035.6 달러가 덜 소요되고 southwest는 의료비가 연간 평균 959.3 달러 덜 소요됨
결정계수 : Multiple R-squared : 0.7509,
결정계수란? 모델이 데이터를 설명하는 설명력의 척도로, 1에 가까울수록 설명력이 좋은 회귀모델임
실습. 여러분들이 추가하고 싶은 파생변수를 위와 같이 * 를 사용해서 모델을 생성하고 통계적으로 유의한지 확인하기
model5 <- lm(expenses ~ age + children + bmi +smoker + bmi30*smoker + children*smoker, data=ins) summary(model5)
■ 표준화와 정규화를 수행한 후의 회귀분석
실습.미국 학교 데이터의 acceptance에 가장 영향이 큰 과목이 학과점수인지 체육점수인지 음악점수인지 확인하는 방법
1. 정규화하지 않았을 때의 결과
m <- read.csv("sports.csv", header=T) lm(acceptance ~ ., data=m)
2. 정규화했을 때의 결과
normalize <- function(x) { return ( (x-min(x) ) / (max(x) - min(x) ) ) } sports_n <- as.data.frame( lapply(m[ , c(2:5)], normalize)) head(sports_n) summary(sports_n) lm(acceptance ~ ., data=sports_n)
3. 표준화를 하고 모델을 생성하기 (평균이 0, 표준편차 1)
m <- read.csv("sports.csv", header=T) sports_n <- as.data.frame( lapply(m[ , c(2:5)], scale)) head(sports_n) summary(sports_n) lm(acceptance ~ ., data=sports_n)
★ 마지막문제: 다중회귀 이론 수업 맨 아래쪽에 나오는 연립방정식 문제를 오늘 만든 reg 함수를 이용해서 풀기
# 필요한 패키지 로드 library(MASS) # reg 함수 정의 reg <- function(y, x) { x <- as.matrix(x) # 독립 변수 행렬을 행렬로 변환 b <- ginv(t(x) %*% x) %*% t(x) %*% y # 일반화된 역행렬을 사용하여 해 계산 colnames(b) <- "estimate" # 결과에 열 이름을 붙임 print(b) # 결과 출력 return(b) # 결과 반환 } # 주어진 연립일차방정식의 행렬 A와 벡터 b A <- matrix(c(3, 2, 1, 1, -1, 4), nrow = 2, byrow = TRUE) b <- matrix(c(4, 3), nrow = 2, byrow = TRUE) A b # 함수를 사용하여 해를 구함 r <- reg(b, A) r # 해를 검증함 r1 <- 3 * r[1] + 2 * r[2] + r[3] # 첫 번째 방정식의 좌변 r2 <- r[1] - r[2] + 4 * r[3] # 두 번째 방정식의 좌변 # 검증 결과 출력 cat("3 * r[1] + 2 * r[2] + r[3] =", r1, "\n") # 기대값: 4 cat("r[1] - r[2] + 4 * r[3] =", r2, "\n") # 기대값: 3
'빅데이터 분석(with 아이티윌) > R' 카테고리의 다른 글
[빅데이터분석] R _ 62. 훈련과 테스트를 분리한 다중 회귀 모델 (0) | 2024.07.18 |
---|---|
[빅데이터분석] R _ 61. 다중 공선성 (0) | 2024.07.18 |
[빅데이터분석] R _ 59. 상관관계 (0) | 2024.07.16 |
[빅데이터분석] R _ 58. 단순 회귀분석 알고리즘 (1) | 2024.07.16 |
[빅데이터분석] R _ 57. 의사 결정 트리 (5) | 2024.07.16 |