R복습_데이터 시각화2_ (그래프에 회귀선그리기(단순회귀분석), 그래프 객체 추가,도형 및 화살표 추가)

2024. 10. 7. 17:41R분석

그래프에 사선그리기

그래프에 사선을 추가하게되면 그래프 추세를 확인할 수 있다. 그래프에 사선을 그리려면 단순하게 함수만 이용해서는안되며, 상관분석, 기울기, 절편값 구하기등 단계가 조금 복잡하다. 그래프에 회귀 사선을 추가하는 단계는 다음과 같다

 

그래프에 사선추가 단계

  1. cor.test(상관분석 진행) : 상관성이 있어야 기울기, 절편 구하기 가능 
  2. lm(종속변수, 독립변수) : 절편과 기울기 구하기
  3. coef() : 모델의 데이터에서 절편과 기울기 추출
  4. geom_abline(intercept=절편, slope=기울기) : 함수에 기울기, 절편 전달
#패키지 불러오기
library(ggplot2)


#그래프에 사선그리기

#ggplot에 저장된 economics 데이터셋
economics


#1)geom_abline() : 꺾은선 그래프 그리기
#날짜(date)별 개인 저축렬(psavert)그래프 그리기

ggplot(economics,aes(x=date,y=psavert))+
  geom_line()

 

상관분석 전, 일단 데이터의 틀을 먼저 만들어두고 시작한다. 위 그래프는 economics데이터에서 날짜에 따른 개인 저축렬을 나타낸 그래프이다. 이 그래프에 회귀선을 추가할 예정이다.

 

cor.test(상관분석 진행)

#cor.test() 상관관계 구하기
#geom_abline()을 그리기위해서는 상관관계를 확인하여
#절편과 기울기를 구한 후, 두 값을 인수로 전달해야한다.

#날짜와 저축률 상관관계
cor.test(economics$date,economics$psavert)#date가 날짜이기때문에
#수치형 벡터로변환
numeric_date <- as.numeric(economics$date)
numeric_date
#1970년 1월1일 0시 0분 0초를 기준으로 날짜를 숫자로 바꾸면 "날짜 차이(일수)"
#-195인 첫번째 날짜는  1970년 1월1일 0시 0분 0초 를 기준으로 195일 전 이라는 뜻


#다시 상관관계 구하기(수치화된 데이터로)
cor.test(numeric_date,economics$psavert)

#cor : 상관관계 계수. -1~1사이의 값으로 나옴
#양수 : 양수가 1에 가까울 수록 두 변수는 강한 양의 상관관계를 가짐
#음수 : 음수가 -1에 가까울 수록 두 변수는 강항 음의 상관관계를 가진다
#절대값이 0.7이상이면 상관관계가 있다고 본다.
#p-value ; 두변수가 통계적 의미가 있는지 판단하는 검정 통계량
#-> 0.05보다 작으면 통계적으로 유의미하다


#현재데이터의 결과는 cor : -0.8386684이며 p-value < 2.2e-16으로 상관성 확인

두 변수간의 상관관계를 분석할때는 cor.test()함수를 사용한다. 이때 함수의 인수로주어지는 변수는 반드시 수치형이여야한다. 현재 데이터의 date는 수치형이아니라 date형식이기때문에 에러가 발생했으며, 이런 경우, 해당 데이를 형변환 한 후 다시 cor.test함수에 재할당 해주어야한다.

수치형 벡터로 변환된 날짜데이터를 살펴보면 이런형태로 출력되는데 이런 이유는 r언어 자체에서 1970년 1월 일 0시 0분 0초를 기준으로 날짜를 숫자로 바꾼 날짜 차이일 수 이기때문이다. 즉 숫자중에 2830이라고 적힌 데이터는 1970년 1월 일 0시 0분 0초를 기준으로 2830일이 흘렀다는 의미이다.

수치화한 데이터로 다시 상관관계를 구한 결과를 보면, 여기서 우리가 집중해서 봐야할 데이터는 크게 cor와 p-value이다. cor는 상관성을 의미하며 절대값으로 0.7이상이면 상관관계가 성립된다고 보며, p-value는 두 변수가 통계적으로 의미있는지 판단하는 검정통계량인데 0.05보다 작으면 통계적으로 유의미하다고 본다. 즉 현재 데이터의 결과가 cor : -0.8386684이며 p-value < 2.2e-16으로 상관성이 확인되어, 기울기와 절편을 구할 수 있는 상태인것을 확인할 수  있다.

 

 

lm(종속변수, 독립변수) 절편과 기울기 구하기

#절편과 기울기 구하기 : lm(종속변수y~독립변수x)
rg_result <- lm(economics$psavert~numeric_date)
rg_result

절편과 기울기를 구할때는 lm(종속변수~독립변수)의 형태로 lm함수를 이용하면 된다. intercept가 절편을, slope가 기울기를나타내는데 여기서는 numeric_date밑에있는 숫자가 데이터의 기울기이다.

 

 

coef()절편과 기울기 추출하기

#y절편과 기울기 추출
rg_coef <- coef(rg_result)
rg_coef
class(rg_coef)
#굳이 coef로 한번더 추출하는 것은 안해도 되는 작업이지만
#가독성과 명확성을 위해 lm에서 추출된 기울기와 절편을 coef를 이용하여
#한번더 추출해줌

inter <- rg_coef[1] #절편저장
sl <- rg_coef[2] #기울기 저장

사실 coef로 y절편을 한번더 추출하는 과정은 생략한 후 lm으로 추출된 절편과 기울기만을 사용하여도 문제는 없다. 하지만, lm을 사용할경우 변수에 저장하지 않았기 때문에 쿼리문이 길어질 수 있고, 이런부분은 가독성 저하로 이어지기때문에 가급적이면 coef함수를 이용하여 다시 추출해주는것이 좋다. coef는 r에서 모델의 계수(회귀 분석에서 변수 간의 관계를 설명하는 값)를 반환해 주는 함수이며, 이 값에 y절편이 함께 포함되는 형식이다.

 

 

geom_abline(intercept=절편, slope=기울기)

#4)꺾은선그래프에 사선 추가하기
ggplot(economics,aes(x=numeric_date, y=psavert))+
  geom_line()+
  geom_abline(intercept=inter,slope=sl) #1차 단순 회귀분석

기울기와 절편값이 구해졌다면 원하는 그래프에 geom_abline(intercept=절편,slope=기울기)의 형태로 +로 연결지어주면 원하는 그래프에 회귀선을추가할 수 있다. 위 쿼리문의 경우 절편과 기울기를 변수에 저장한 후, 그 변수를 geom_abline함수에 전달해준것이다. 이 과정을 1차단순 회귀분석이라고 부른다.

 

 

그래프에 사선그리기 실습

#=============실습=============#
#날짜(date)별 개인 저축렬(psavert)산점도그래프위에
#회귀선 그리기


#1)산점도 그래프 그리기
ggplot(economics,aes(x=date, y=psavert))+
  geom_point(size=2,color='red')


#2)date와 psavert의 상관성 구하기
cor.test(economics$date, economics$pasavert)

#date 수치화작업
n_date <- as.numeric(economics$date)
n_date

cor.test(n_date,economics$psavert)
#상관성 확인!


#3)lm()으로 기울기, 절편값 구하기
p_lm <- lm(economics$psavert~n_date)
p_lm


#4)y절편값 추출
p_coef <- coef(p_lm)
p_coef


#5)산점도 그래프 위에 회귀선 그리기
ggplot(economics,aes(x=date,y=psavert))+
  geom_point(size=2,color='red')+
  geom_abline(intercept=p_coef[1], slope=p_coef[2])+
  labs(title='날짜별 저죽률 산점도와 회귀선')

 

 

geom_text() : 그래프에 레이블 입력하기

#geom_text() : 그래프에 레이블 입력하기
ggplot(airquality,aes(x=Day,y=Temp))+
  geom_point(color='orange')+
  geom_text(aes(label=Temp,vjust=0,hjust=1))
#x = 0: 그래프의 가로축에서 왼쪽 끝 (0% 위치)
#y = 1: 그래프의 세로축에서 위쪽 끝 (100% 위치)


ggplot(airquality,aes(x=Day, y=Temp))+
  geom_point(color='blue')+
  geom_text(aes(label=Day,vjust=1,hjust=0))
#데이터 날짜사용, 레이블 우측하단
#레이블을 오른쪽 하단에 배치하고싶다면 가로값1, 세로값0

ggplot(airquality,aes(x=Day,y=Temp))+ geom_point(color='orange')+ geom_text(aes(label=Temp,vjust=0,hjust=1))

그래프의 값마다 어떤 값인지 레이블을 표시하고싶을때는 geom_text()함수를 사용한다. geom_text(aes(label=데이터, vjust=가로위치, hjust=세로위치))값의 형태로 전달해야한다. 이때 가로위치와 세로위치는 레이블이 적용될 위치이며, 대부분의 실무에서는 vjust=0, hjust=1의 값을 사용해 좌측상단에 위치하도록 하는것이 대부분이지만

ggplot(airquality,aes(x=Day, y=Temp))+ geom_point(color='blue')+ geom_text(aes(label=Day,vjust=1,hjust=0))

이처럼 vjust와 hjust값을 적절하게 조절하여 원하는 위치에 레이블을 배치할 수도 있다.

 

 

그래프에 객체 추가

평행선 그리기

#그래프에 객체 추가

#1)평행선 그리기
economics
# 개인 저축률(psavert)과 날짜(date)를 사용한 꺾은선 그래프
#평균값에 대한 평행선 추가

ggplot(economics,aes(x=date,y=psavert))+
  geom_line()+
  geom_hline(yintercept=mean(economics$psavert))
#yintercept에 y값만 넣게되면 모든 y값이 평행선으로 표시됨

그래프에 평행선을 추가할 수 있는데 이때 geom_hline()함수를 사용한다. 평행선의 경우 y값만 입력하면 되기때문에 yintercep에 y값을 넣어 사용한다. 보통 이런 추가 객체들은 그래프에서 강조하고싶은 부분이 있을때 사용하기때문에 y의 전체값을 전부다 yinterept에 주게되면 y값의 모든 곳마다 평행선이 생성된다. 때문에 중앙값, 평균값, 최소최대같이 함수와 함께 사용하는것이 일반적이다.

 

 

수직선 그리기

#2)수직선 그리기
#개인 저축률이 가장 낮은 시기를 바로 알 수 있는 수직선 추가

#dplyr함수 사용하여 그리기
#x축데이터는 날짜이므로 psavert값이 가장 낮은 날짜부터구하기

library(dplyr)

#저축률이 가장낮은 행 추출
x_inter <- filter(economics,psavert==min(economics$psavert))
x_inter
#저축률중에서 가장 낮은 값 구한것

#행에서 데이터만 추출
x_inter <- x_inter$date
x_inter #날짜만 추출됨

#그래프에 수직선 추가
ggplot(economics,aes(x=date,y=psavert))+
  geom_line()+
  geom_vline(xintercept=x_inter)

수직선을 추가하고싶을때는 geom_vline()함수를 사용하며, 평행선 그릴때와 마찬가지로 xintercept에 수직선을 추가하고싶은 x값을 추가하면 된다. 위 쿼리문에서는 저축률이 가장 낮은 날짜에 수직선을 그리고있는데, 이때 그냥 min(date)를 사용하게되면 저추률과 상관없이 그냥 가장 작은 날짜가 출력되기때문에 dplyr패키지를 사용하여 저축률이 가장 낮은 날짜를 추출한 후, 다시 geom_vline함수에 할당해야한다.

filter함수를 사용하여 조건식에 저축률이 가장 저축률의 최소값과 같은 행만 추출한뒤에

추출된 행에서 날짜만 다시 변수에 재할당 해준다. 

재할당해준 변수로 geom_vline의 xintercept값에 할당하면 원하는 위치에 수직선을 그릴 수 있다.

 

 

annotate() : 도형 및 화살표 그리기

#annotate() : 도형 및 화살표 그리기
mtcars

#wt(무게)3~4, mpg(연비) 12~21인 영역에 사각형 도형 그리기
ggplot(mtcars,aes(x=wt,y=mpg))+
  geom_point()+
  annotate('rect',xmin=3,xmax=4,ymin=12,ymax=21,
           alpha=0.5,fill='skyblue')+
  annotate('segment',x=2.5,xend=3.7,y=10,yend=17,
           color='red',arrow=arrow())


#alpha : 투명도
#fill :  도형 색상
#arrow : 끝에 화살표 촉 추가
#x, xend : x축 설정
#y, yend : y축 설정
#x값 지정된거부터 선 시작 이런식으로 그린것


#annotate 도형 종류
#rect : 사각형
#polygon : 다각형
#segment  : 선추가

데이터에 도형이나 선을 추가하여 해당 부분을 강조하고싶다면 annotate()함수를 사용하면된다. annotate함수는 annotate('모양 및 형태', xmin=x시작값, xmax=x끝값, ymin=y시작값, ymax=y끝값, 기타옵션)의형태로 사용하며, 이때 해당객체가 선이나 화살표인경우 annotate('선',x=x시작값, xend=x끝값, y=y시작값, yend=y끝값)의 형태로 적는다. 주로 사용하는 옵션은 도형의 투명도를 조절하는 alpha와 색상을 결정하는 fill이 있으며, 화살표를 그릴경우 색상은 color를 사용하고 arrow=arrow()의 옵션을 통해 끝지점에 화살촉을 만들 수도 있다.

 

 


학습일기

오늘은 데이터분석 시각화파트의 두번째 파트를 배웠는데, 가장 기억에 남았던 부분은 회귀선을 추가할 수 있는 geom_abline이었다. 나머지 데이터분석 시각화 함수들은 함수와 옵션들정도로 그래프를 사용하면 됐는데, 당연한 이야기이지만 회귀선을 추가하기위해서는 단순회귀분석을 해야한다는점에서, 데이터시각화가 정말 단순히 데이터들을 보기좋게 예쁘게 꾸민다는것이 아니라, 데이터를 가지고 가공하여 보기좋게 해석하는 과정이라는것이 확 와닿았다. 다음파트는 회귀분석인데 회귀분석을 좀더 공부하고 다시 회귀선추가 하기를 하면 조금더 쉽게 느껴질것같다..!