그래프는 데이터 분석 과정의 세 번째 부분이다. 첫 번째 부분은 데이터 추출(data extraction)에 관한 것으로, 두 번째 부분은 클린징(cleansing)과 데이터 조작(data manipulation)을 다룬다. 마지막으로 데이터 과학자는 자신의 결과를 그래픽으로 전달(시각화 : visualization)해야 하는 것이다.
데이터 과학자의 일은 다음 그림에서 검토될 수 있다.
이 튜토리얼에서, 다음에 대하여 학습한다.
튜토리얼의 이 부분은 R로 그래프/차트를 만드는 방법에 초점을 맞춘다.
이 튜토리얼에서는 ggplot2
패키지를 사용할 것이다. 이 패키지는 2005년 Wilkinson에 의해 쓰여진 '그래픽의 문법(Grammar of Graphics)'의 일관된 기초 위에 만들어졌으며, ggplot2
는 매우 유연하며, 많은 주제와 플롯 사양을 높은 추상화 수준에서 통합한다. ggplot2
로는 3차원 그래픽과 인터랙티브 그래픽을 만들 수는 없다.
ggplot2에서 그래프는 다음과 같은 인수로 구성된다.
당신은 튜토리얼에서 그러한 인수들을 제어하는 방법을 배우게 될 것이다.
ggplot2
의 기본 구문은 다음과 같다.
ggplot(data, mapping=aes()) +
geometric object
인수 :
data : 그래픽 작성을 위해 사용되는 데이터 세트
mapping : x와 y축 제어
geometric object : 보여주고 싶은 그래픽 유형. 가장 일반적인 유형은 다음과 같다 :
geom_point()
geom_bar()
geom_line()
geom_histogram()
ggplot이 mtcar 데이터 세트에서 어떻게 작동하는지 확인해 보자. 먼저 mpg 변수와 drat 변수의 산포도를 작성하기로 한다.
xxxxxxxxxx
library(ggplot2)
ggplot(mtcars, aes(x = drat, y = mpg)) +
geom_point()
코드 설명 :
mtcars
를 ggplot에 전달한다.+
기호는 R의 코드가 계속 이어짐을 의미한다. 그것은 코드를 분할해서 더 읽기 쉽게 만든다.결과 :
때로는 데이터 그룹(즉, factor 수준 데이터)에 의해 값들을 구별하는 것이 흥미로울 수 있다.
xxxxxxxxxx
ggplot(mtcars, aes(x = mpg, y = drat)) +
geom_point(aes(color = factor(gear)))
코드 설명 :
gear
는 factor 타입으로 변환한다.결과 :
데이터의 척도 변경은 이터 과학자의 업무에서 큰 부분을 차지한다. 드물게 데이터는 멋진 종 모양으로 나온다. 데이터를 특이치(outlier)에 덜 민감하게 만드는 한 가지 해결책은 데이터의 크기를 다시 조정하는 것이다.
xxxxxxxxxx
ggplot(mtcars, aes(x = log(mpg), y = log(drat))) +
geom_point(aes(color = factor(gear)))
코드 설명 :
주의 : 다른 변환은 표준화(standardization)와 정규화(normalization) 등을 적용할 수 있다.
결과 :
그래프에 다른 수준의 정보를 추가할 수 있다. 선형 회귀 분석에 의한 예측값(fitted value)을 표시할 수 있다.
xxxxxxxxxx
my_graph <- ggplot(mtcars, aes(x = log(mpg), y = log(drat))) +
geom_point(aes(color = factor(gear))) +
stat_smooth(method = "lm",
col = "#C42126",
se = FALSE,
size = 1)
my_graph
코드 설명 :
결과 :
주의 : 이용가능한 평활 방법은 다음과 같다.
지금까지 그래프에 정보를 추가하지 않았다. 그래프는 많은 정보를 담고 있어야 한다. 독자는 추가 문서를 참조하지 않고 그래프를 보는 것만으로도 데이터 분석 뒤에 숨어있는 스토리를 보아야 한다. 따라서 그래프는 좋은 라벨을 필요로 한다. lab() 함수를 사용하여 라벨을 추가할 수 있다.
lab() 함수의 기본 구문은 다음과 같다 :
xxxxxxxxxx
lab(title = "Hello Guru99")
인수 :
title : 제목 제어. 제목을 변경하거나 추가할 수 있다.
subtitle : 제목 밑에 부제를 추가
caption : 그래프 밑에 그래프 설명 추가
x : x-축 제목
y : y-축 제목
예제 : lab(title = "Hello Guru99", subtitle = "My first plot")
추가해야 할 하나의 필수 정보는 분명히 제목(title)이다.
xxxxxxxxxx
my_graph +
labs(
title = "Plot Mile per hours and drat, in log"
)
코드 설명 :
결과 :
동적 제목(dynamic title)은 제목에 더 정확한 정보를 추가하는 데 도움이 된다.
정적 텍스트(static text)와 동적 텍스트(dynamic text)를 출력할 paste() 함수를 사용할 수 있다. paste()의 기본 구문은 다음과 같다.
xxxxxxxxxx
paste("This is a text", A)
인수 :
" " : 인용부호 안의 텍스트는 정적 텍스트이다.
A : A에 저장된 변수를 표시
주의 : 원하는 만큼의 정적 텍스트와 변수를 추가할 수 있다. 그것들은 컴마(,)로 구분해야 한다.
예제 :
xxxxxxxxxx
A <-2010
paste("The first year is", A)
결과 :
xxxxxxxxxx
## [1] "The first year is 2010"
xxxxxxxxxx
B <-2018
paste("The first year is", A, "and the last year is", B)
결과 :
xxxxxxxxxx
## [1] "The first year is 2010 and the last year is 2018"
이제 우리의 그래프에 동적 이름, 즉 mpg
의 평균을 추가할 수 있다.
xxxxxxxxxx
mean_mpg <- mean(mtcars$mpg)
my_graph + labs(
title = paste("Plot Mile per hours and drat, in log. Average mpg is", mean_mpg)
)
코드 설명 :
결과 :
두 가지 추가 세부 사항이 그래프를 더 명확하게 만들 수 있다. 부제목(subtitle)과 캡션(caption)을 말하고 있는 것이다. 부제목(subtitle)은 제목(title) 바로 아래에 있다. 캡션(caption)은 누가 계산을 했는지 그리고 데이터의 출처에 대하여 알려줄 수 있다.
xxxxxxxxxx
my_graph +
labs(
title =
"Relation between Mile per hours and drat",
subtitle =
"Relationship break down by gear class",
caption = "Authors own computation"
)
코드 설명 :
lab() 안에 다음의 것들을 추가할 수 있다 :
,
)로 구분한다.주의 : 코드의 줄을 분리하라. 필수는 아니지만 코드를 좀 더 쉽게 이해할 수 있게 해준다.
결과 :
데이터 세트에 있는 변수 자체는 항상 명시적이지 않으며 또는 복수의 단어(예: GDP_CAP)가 있는 경우 관례상 _를 이용한다. 당신은 그런 이름이 당신의 그래프에 나타나기를 원하지 않는다. 이름을 변경하거나 단위와 같은 세부사항을 추가하는 것이 중요하다.
xxxxxxxxxx
my_graph +
labs(
x = "Drat definition",
y = "Mile per hours",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
코드 설명 :
lab() 안에 다음을 추가할 수 있다.
결과 :
축의 척도를 조절할 수 있다.
seq() 함수는 연속된 숫자(수열, sequence)를 만들 필요가 있을 때 편리하다. 기본 구문은 다음과 같다 :
xxxxxxxxxx
seq(begin, last, by = x)
인수 :
예를 들어, 0에서 12까지 4을 단계로 하는 범위를 생성하고자 한다면, 0, 4, 8, 12 등의 네 개의 숫자가 생성될 것이다.
xxxxxxxxxx
seq(0, 12, 4)
결과 :
xxxxxxxxxx
## [1] 0 4 8 12
여러분은 x-축과 y-축의 척도를 다음과 같이 제어할 수 있다.
xxxxxxxxxx
my_graph +
scale_x_continuous(breaks = seq(1, 3.6, by = 0.2)) +
scale_y_continuous(breaks = seq(1, 1.6, by = 0.1)) +
labs(
x = "Drat definition",
y = "Mile per hours",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
코드 설명 :
scale_y_continuous() 함수는 y-축을 제어한다.
scale_x_continuous() 함수는 x-축을 제어한다..
파라미터 브레이크가 축의 분할이 제어된다. 수열을 수동으로 추가하거나 seq() 함수를 사용할 수 있다.
결과 :
마지막으로, R은 우리가 다양한 테마로 플롯을 커스터마이징할 수 있게 해준다. ggplot2
라이브러리에는 다음과 같은 8가지 테마가 포함되어 있다 :
xxxxxxxxxx
my_graph +
theme_dark() +
labs(
x = "Drat definition, in log",
y = "Mile per hours, in log",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
결과 :
이 모든 단계를 거쳐, 그래프를 저장하고 공유할 시간이다. 그래프를 그린 직후 ggsave('FILE의 이름')를 추가하면 하드 드라이브에 저장된다.
그래프는 작업 디렉토리에 저장된다. 작업 디렉토리를 확인하려면 다음 코드를 실행한다 :
xxxxxxxxxx
directory <-getwd()
directory
환상적인 그래프를 그려보고, 저장하고, 위치를 확인해보자
xxxxxxxxxx
my_graph +
theme_dark() +
labs(
x = "Drat definition, in log",
y = "Mile per hours, in log",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
결과 :
xxxxxxxxxx
ggsave("my_fantastic_plot.png")
Output:
xxxxxxxxxx
## Saving 5 x 4 in image
주의 : 교육적 목적으로만, 우리는 당신을 위해 디렉토리 폴더를 열기 위한 open_folder()
라는 함수를 만들었다. 아래 코드를 실행하여 사진이 저장되어 있는 위치를 확인하고, my_fantastic_plot.png
파일 이름을 확인하십시오.
x# Run this code to create the
function
open_folder <- function(dir) {
if (.Platform['OS.type'] == "windows") {
shell.exec(dir)
} else {
system(paste(Sys.getenv("R_BROWSER"), dir))
}
}
# Call the function to open the folder open_folder(directory)
아래 표에 산포도를 작성하기 위한 인수를 요약한다 :
목적 | 코드 |
---|---|
기본 산포도 | ggplot(df, aes(x = x1, y = y)) + geom_point() |
컬러 그룹 산포도 | ggplot(df, aes(x = x1, y = y)) +<br /> geom_point(aes(color = factor(x1)) + stat_smooth(method = "lm") |
예측치 추가 | ggplot(df, aes(x = x1, y = y)) + geom_point(aes(color = factor(x1)) |
제목 추가 | ggplot(df, aes(x = x1, y = y)) + <br />geom_point() + <br />labs(title = paste("Hello Guru99")) |
부제목 추가 | ggplot(df, aes(x = x1, y = y)) + <br />geom_point() + labs(subtitle = paste("Hello Guru99")) |
x축 재설정 | ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(x = "X1") |
y축 재설정 | ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(y = "y1") |
척도의 제어 | ggplot(df, aes(x = x1, y = y)) + <br />geom_point() + <br />scale_y_continuous(breaks = seq(10, 35, by = 10)) + <br />scale_x_continuous(breaks = seq(2, 5, by = 1) |
log 생성 | ggplot(df, aes(x =log(x1), y = log(y))) + geom_point() |
테마 | ggplot(df, aes(x = x1, y = y)) + geom_point() + <br />theme_classic() |
저장 | ggsave("my_fantastic_plot.png") |