본문 바로가기
기타/R

R 독학하기 - 6 (2. 그래프에 객체 추가)

by cidm 2024. 2. 27.

- 기본 그래프에 각종 객체를 추가하여 그래프 내용을 명확하게 표현할 수 있음

- 그래프에 선이나 도형, 텍스트 등 다양한 객체를 추가하여 그래프의 가독성을 높이고 명확하게 전달할 수 있음

- 예를들어 직선을 그려 그래프 추세나 변동추이, 원하는 위치를 표현하거나, 도형을 그려 그래프의 특정 영역을 강조하거나, 값을 텍스트로 그래프에 직접 표현할 수 있음

- 그래프에 직선을 표현할 때 : 절편과 기울기를 이용

  • 절편 (intercept) : 직선이 x축이나 y축과 만나는 좌표
  • 기울기(slope) : 직선의 경사도 (값이 클수록 선이 경사지다)

= 이러한 절편과 기울기는 회귀분석(regression analysis)으로 구할 수 있음


1. 사선 그리기 : geom_abline() 함수

그래프에 사선을 추가해 그래프 추세를 확인할 수 있다.

사선은 절편과 기울기를 이용해 geom_abline() 함수로 그린다.

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

economics 데이터 세트의 date(날짜) x축으로, psavert(개인저축률) y축으로 하고, 선그래프를 그리고(geom_line), 그 위에 사선을 추가한다. (geom_abline)

> library(ggplot2)
> str(economics)
spc_tbl_ [574 × 6] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ date    : Date[1:574], format: "1967-07-01" "1967-08-01" ...
 $ pce     : num [1:574] 507 510 516 512 517 ...
 $ pop     : num [1:574] 198712 198911 199113 199311 199498 ...
 $ psavert : num [1:574] 12.6 12.6 11.9 12.9 12.8 11.8 11.7 12.3 11.7 12.3 ...
 $ uempmed : num [1:574] 4.5 4.7 4.6 4.9 4.7 4.8 5.1 4.5 4.1 4.6 ...
 $ unemploy: num [1:574] 2944 2945 2958 3143 3066 ...
> ggplot(economics, aes(x=date, y=psavert)) + geom_line() + 
+   geom_abline(intercept = 12.19, slope = -0.000544)

2. 평행선 그리기 : geom_hline() 함수

평행선 : 평행선 기준으로 그래프 변동 추이를 좀 더 명확히 파악할 수 있음

geom_hline() 함수를 사용하며, yintercept 옵션에 y축 절편값을 입력하면 그 값에 따라 평행선을 그리는 함수.

geom_hline(yintercept = y절편)

ex) economics 데이터셋의 datex, psaverty, 선그래프 그리고 그 위에 평행선 그리기 (y절편은 psavert의 평균을 사용)

> ggplot(economics, aes (x = date, y = psavert)) +
+   geom_line() + 
+   geom_hline(yintercept = mean(economics$psavert))

3. 수직선 그리기 : geom_vline() 함수

geom_vline() 함수에 xintercept 옵션으로 x축 절편을 입력한다

geom_vline(xintercept = x절편)

> library(dplyr)
> x_inter <- filter(economics, psavert == min(economics$psavert))$date
> ggplot(economics, aes(x=date, y=psavert)) + geom_line() + geom_vline(xintercept = x_inter)

-      geom_vline() 함수 사용할 때 원하는 날짜 값에 수직선을 그릴 수 있는데, as.Date 옵션을 사용하면 됨.

> ggplot(economics, aes(x=date, y=psavert)) + 
	geom_line() + 
    geom_vline(xintercept = as.Date("2005-08-02"))

4. 레이블 입력하기 : geom_text 함수

그래프에 텍스트 작성하는 함수 (label 이라고 함) – 그래프 안에서 각 수치의 이름이나 값 등을 표시할 때 사용

geom_text(aes(label = 레이블, vjust = 세로 위치, hjust = 가로 위치)

 

ex) airquality 데이터세트의 날짜별 온도를 산점도로 표현하고 각 점에 온도(temp) 표시하기

> ggplot(airquality, aes(x=day, y=temp)) + geom_point() +
   geom_text(aes(label = temp, vjust = 0, hjust = 0))

- 데이터 레이블을 입력할 위치에서 세로와 가로값을 모두 0으로 입력하면 레이블은 각 점의 오른쪽 위에 표시된다.

- +(플러스) 값은 왼쪽/아래, -(마이너스) 값은 오른쪽/위에 표시된다.

5. 도형 및 화살표 넣기 : annotate() 함수

그래프 위에 사각형이나 화살표 등을 그려 특정 영역을 강조할 때 사용한다.

1) 사각형 그리기 (annotate("rect", ...))

alpha 옵션 : 투명도 조절 (0.1~1사이의 값)

fill 옵션 : 채우기 색상 지정

annotate("모양", xmin = x축 시작, xmax = x축 끝, ymin = y축 시작, ymax = y축 끝)

ex) mtcars 데이터 셋에서 무게와 연비를 기준으로 산점도 그리고 강조할 부분에 사각형 그리기

ggplot(mtcars, aes(x=wt, y=mpg)) +
   geom_point() +
   annotate("rect", xmin = 3, xmax = 4, ymin = 12, ymax= 21, alpha = 0.5, fill = "pink")

2) 화살표 그리기 (annotate("segment", ..., arrow = arrow () ))

segment : 선을 의미

arrow = arrow() : 화살표를 의미

- x축과 y축의 시작 위치와 끝위치를 x, xend, y, yend로 표현한다.

ex) x축 2.5에서 3.7, y축 10에서 17에 빨간색 화살표 그리기

> ggplot(mtcars, aes(x=wt, y=mpg)) +
+   geom_point() +
+   annotate("rect", xmin = 3, xmax = 4, ymin = 12, ymax= 21, 
+            alpha = 0.5, fill = "pink") +
+   annotate("segment", x = 2.5, xend = 3.7, y = 10, yend = 17, 
+            color = "red", arrow = arrow())

- 화살표에 레이블 표현하기 : 도형모양을 text로 입력하고 레이블이 표시될 x와 y위치 값과 표시할 내용을 입력하면됨

> ggplot(mtcars, aes(x=wt, y=mpg)) +
+   geom_point() +
+   annotate("rect", xmin = 3, xmax = 4, ymin = 12, ymax= 21, 
+            alpha = 0.5, fill = "pink") +
+   annotate("segment", x = 2.5, xend = 3.7, y = 10, yend = 17, 
+            color = "red", arrow = arrow()) +
+   annotate("text", x = 2.5, y = 10, label = "focus")


[1] 그래프 꾸미기

1) 그래프 제목 / 축 제목 설정하기 : labs() 함수

ggplot() 함수에 labs() 함수 추가

labs(x = "x축명", y = "y축명", title = "그래프 제목")

ex) x축을 mtcars 데이터셋의 기어 수 (gear), y축을 자동차수로 하는 막대그래프를 그리고 x축, y축, 그래프에 이름 붙이기

> library(ggplot2)
> ggplot(mtcars, aes(x=gear)) +
+   geom_bar() +
+   labs(x = "기어수", y = "자동차수", title = "변속기 기어 수 별 자동차 수")

 

2) 디자인 테마 적용하기 : theme() 함수

theme () 함수 : 그래프 디자인 일괄 변경 가능한 함수

ggplot2 패키지에 포함됨

8가지 테마 있음

대) theme_gray() 함수

theme_bw()

출처  : 28. R의 시각화(그래프) 기능(10) - ggplot2 사용법(THEME function) : 네이버 블로그 (naver.com)

 

[2] 회귀분석 -  절편과 기울기 구하기

회귀분석 : 독립변수와 종속변수 간 인과관계를 구하는 분석 기법

  • 단순회귀분석 : 독립변수가 1개
  • 다중회귀분석 : 독립변수가 2개

* 독립변수 : 다른 변수의 변화에 영향을 받지 않는 독립적인 변수
* 종속변수 : 독립변수에 영향을 받아 변하는 변수. 분석의 대상.

함수 : 독립변수(x) -> 종속변수(y)

 

- 단순회귀분석(simple regression analysis) : 두 변수간의 관계식을 도출하는 분석기법. 

- 두 변수간의 선형성, 독립성, 정규분포, 등분산성을 가정하는 분석이다.

- lm() 함수를 사용해 두 변수 간의 p-value, 절편, 기울기를 구할 수 있다.

lm(종속변수 ~ 독립변수, data = 데이터세트)

 

ex) Sample1 데이터의 Y21_CNT와 Y20_CNT 변수 간 관계 확인하여 절편과 기울기 알기

(1) 두 변수 간 상관관계가 있는지 알아보기 : cor.test() 함수

- 먼저 두 변수간의 상관관계가 있는지 파악해야함 : 이를 상관분석(correlation analysis) 이라고 함

- cor.test() 함수를 사용

cor.test(테이블명$변수명1, 테이블명$변수명2)

상관관계 있으면 : cor 값이 1(양의 상관관계) 또는 -1(음의 상관관계)로 나타남

0에 가까울 수록 두 변수간의 상관관계가 없음을 의미

> cor.test(exdata1$Y20_CNT, exdata1$Y21_CNT)

	Pearson's product-moment correlation

data:  exdata1$Y20_CNT and exdata1$Y21_CNT
t = 4.9343, df = 18, p-value = 0.000107
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.4751688 0.8990895
sample estimates:
      cor 
0.7582507 

- cor 값 : 0.7582507 : 1에 가까우므로 양의 상관관계가 있다는 걸 알 수 있음 -> 20년 카드 이용건수가 많을수록 21년 이용건수도 증가한다고 해석할 수 있음

- p-value : 0.000107 

* p-value란, 두 변수간 상관관계가 통계적으로 유의미한지 판단하는 검정통계량(test statistics) 이다. 유의확률(significance probability)이라고도 한다. p-value값이 기준값(보통 0.05)보다 작으면 귀무가설 확률이 매우 낮다는 의미로 귀무가설을 기각하고 대립가설을 채택한다. p-value값이 기준값(0.05)보다 크면 귀무가설을 채택한다. (통계적으로 유의미하다)

위 예시에서 p-value가 0.000107으로 0.05보다 작다. 그러므로 두 변수간 상관관계가 통계적으로 유의미하다고 할수있다.

 

(2) 절편과 기울기 알아내기

> lm(Y21_CNT ~ Y20_CNT, data = exdata1)

Call:
lm(formula = Y21_CNT ~ Y20_CNT, data = exdata1)

Coefficients:
(Intercept)      Y20_CNT  
     0.7104       0.7864  

y절편 (intercept) : 0.7104

Y20_CNT 변수에 대한 기울기 : 0.7864

즉, y = 0.7864x + 0.7104 (y는 21년 이용건수, x는 20년 이용건수

=> 정리하면, 두 변수간 양의 상관관계 (통계적으로 유의미) 가 있고, y절편 0.7104, 기울기 0.7864이다.

두 변수로 선 그래프 그리고 사선으로 위의 일차함수도 그려주기

> ggplot(exdata1, aes(x=Y20_CNT, y=Y21_CNT)) + 
	geom_line() + geom_abline(intercept = 0.7104, slope = 0.7864)


함수 (ggplot2 패키지에 포함) 기능
geom_abline() 사선 그리기
geom_hline() 평행선 그리기
geom_vline() 수직선 그리기
geom_text() 레이블 입력
annotate() 도형 그리기