참고한 서적 : https://hongong.hanbit.co.kr/r-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D/ (혼자 공부하는 R언어)
📌이번 주차내용
→ R언어에서의 데이터 시각화(그래프 그리기, 도형 넣기)
→ R언어에서의 구글 API 활용(지도 불러오기)
데이터 시각화 & 데이터 시각화에 쓰이는 패키지
데이터 시각화
: 복잡한 수치 데이터를 이미지화하여 쉽게 내용을 이해할 수 있도록 만드는 것
ggplot2
: R 시각화 1순위 패키지. 그래프 틀을 만들고 그 안에 많은 이미지 객체 레이어를 쌓음!
ggplot2
패키지는 많은 그래프 함수를 포함하고 있다.# ggplot() 함수 사용 방식
# aes() 함수를 통해 x y 축에 변수를 매핑하여 그래프의 가장 기본 틀을 생성한다!
ggplot(데이터 세트, aes(데이터 속성))
준비 단계 : ggplot() 함수 설치 및 불러오기
# ggplot2 패키지 설치 & 로드
install.packages("ggplot2")
library(ggplot2)
준비 단계 : ggplot()을 통해 그래프 기본 틀 생성하기
# 그래프 기본 틀 생성 - airquality 데이터셋 활용
str(airquality) # airquality 데이터셋의 속성 파악
ggplot(airquality, aes(x = Day, y = Temp)) # x & y축에 원하는 값을 매핑
> # 그래프 기본 틀 생성 - airquality 데이터셋 활용
> str(airquality)
'data.frame': 153 obs. of 6 variables:
$ Ozone : num 41 36 12 18 0 28 23 19 8 0 ...
$ Solar.R: num 190 118 149 313 0 0 299 99 19 194 ...
$ Wind : num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
$ Temp : int 67 72 74 62 56 66 65 59 61 69 ...
$ Month : int 5 5 5 5 5 5 5 5 5 5 ...
$ Day : int 1 2 3 4 5 6 7 8 9 10 ...
> ggplot(airquality, aes(x = Day, y = Temp))
# 아래 Plots 탭에 내부에 아무것도 없는 그래프 틀이 생성된다!
산점도
: 두 변수의 관계를 파악하기 위해 평면에 점을 찍어서 표현하는 그래프!geom_point()
함수를 사용하여 나타낸다geom_point()
함수는 매핑을 위해 작성한 ggplot()
함수 뒤에 + geom_point()
를 추가로 입력# 산점도 그리기!
# 아까 작성한 내용 뒤에 + geom_point() 를 추가로 입력하면 산점도를 그릴 수 있다.
ggplot(airquality, aes(x = Day, y = Temp)) + geom_point()
산점도에서 점 크기 & 색상 바꾸기
# 산점도 점 크기와 색상 변경
# 점 크기 3 & 점 색상 빨강
ggplot(airquality, aes(x = Day, y = Temp)) + geom_point(size = 3, color = "red")
geom_line()
함수를 사용하여 나타낸다geom_line()
함수는 geom_point()
에서 한 방식처럼 ggplot()
뒤에 + geom_line()
를 입력# 선 그래프 그리기
# x축(Day) + y축(Temp)로 매핑
ggplot(airquality, aes(x = Day, y = Temp)) + geom_line()
geom_bar()
함수를 사용하여 나타낸다# 막대 그래프 그리기
# mtcars 데이터셋의 cyl 열을 x축으로 하여 막대 그래프 작성!
# 그런데 중간에 빈 범주에 대한 값이 거슬릴 수 있다!
ggplot(mtcars, aes(x = cyl)) + geom_bar(width = 0.5)
# 막대 그래프 그리기
# 빈 범주를 제외하기 위해서 factor() 함수를 사용
# cyl 변수의 값이 4 / 6 / 8로 구성된 범주형 데이터가 된다.
ggplot(mtcars, aes(x = factor(cyl))) + geom_bar(width = 0.5)
누적 막대 그래프 그리기
geom_bar()
함수 안에 aes()
함수를 이용하여 누적할 열을 지정한다# 누적 막대 그래프 그리기
# gear 변수의 빈도가 막대 안에 채워진다!(fill 옵션으로 factor(gear)를 지정)
# 주의 : 누적할 gear 변수는 값이 빈 범주가 있을 시 누적이 제대로 표현되지 않는다.
# 따라서 반드시 factor() 함수를 사용해주어야 한다.
ggplot(mtcars, aes(x = factor(cyl))) + geom_bar(aes(fill = factor(gear)))
누적 막대 그래프를 활용하여 선버스트 차트 그리기(원판형 그래프)
선버스트 차트
: 계층 구조의 데이터를 수준별로 비율을 표시하는 그래프coord_polar()
함수 하나만 추가하면 그래프를 선버스트로 표현 가능+ coord_polar()
를 추가하면 선버스트 차트로 변환된다# 선버스트 차트 그리기
ggplot(mtcars, aes(x = factor(cyl))) +
geom_bar(aes(fill = factor(gear))) +
coord_polar()
coord_polar()
함수에 theta = “y”
옵션을 추가하면 도넛모양의 선버스트 차트가 그려진다!# 도넛 모양의 선버스트 차트 그리기
ggplot(mtcars, aes(x = factor(cyl)))
+ geom_bar(aes(fill = factor(gear)))
+ coord_polar(theta = "y")
ggplot2
패키지의 geom_boxplot()
함수를 사용하여 그릴 수 있다geom_boxplot()
함수는 aes()
함수 안에 상자로 그룹 지을 열을 따로 설정해주어야 한다!# 상자 그림 그리기(airquality 데이터셋 활용)
# 날짜별로 온도 분포를 확인하기 위해 group 옵션에 Day 변수를 지정!
# 날짜별로 그룹 설정이 된다.
ggplot(airquality, aes(x = Day, y = Temp, group = Day)) + geom_boxplot()
geom_histogram()
함수를 사용하여 그릴 수 있다ggplot()
함수 뒤에 + geom_histogram()
을 추가하면 히스토그램을 그릴 수 있다!# 히스토그램 그리기
# aes를 Temp로 주어서 온도별 분포를 히스토그램을 통해 확인가능
# 자동으로 막대 구간이 30개로 조정했다는 안내 메시지가 뜬다
# 직접 구간을 지정하고 싶다면 binwidth 옵션을 사용하도록 하자.
ggplot(airquality, aes(Temp)) + geom_histogram()
예시1) 선그래프 + 산점도 조합
# 선 그래프와 산점도 조합하여 그리기
ggplot(airquality, aes(x = Day, y = Temp)) +
geom_line() +
geom_point()
예시2) 예시1번에 선그래프 컬러 & 산점도 점 크기까지 변경
# 선 그래프 컬러 & 산점도 점 크기 변경
# ggplot으로 틀을 그리고 그 위에 산점도와 선 그래프를 덮은 형태이다.
ggplot(airquality, aes(x = Day, y = Temp)) +
geom_line(color = "red") +
geom_point(size = 3)
절편(intercept)
: 직선이 x축 혹은 y축과 만나는 좌표기울기(slope)
: 직선의 경사도회귀분석(Regression analysis)
을 통해 구할 수 있다!geom_abline()
함수를 사용하여 그린다# ggplot2 패키지 로드 & economics 데이터 셋 구조 확인
library(ggplot2)
str(economics)
> 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" "1967-09-01" "1967-10-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 ...
geom_line + geom_abline을 사용하여 사선 그리기
# 그래프에 사선 그리기
# x축(date) y축(psavert) 매핑 후 + geom_line() & geom_abline()을 통해 사선 그림
# y절편값 = 12.18671 & 기울기 값 -0.0005444로 세팅
ggplot(economics, aes(x = date, y = psavert)) +
geom_line() +
geom_abline(intercept = 12.18671, slope = -0.0005444)
geom_hline()
함수를 사용하여 그린다yintercept
옵션에 y축 절편 값을 입력하면 해당 값에 따라 평행선을 그리는 함수이다# geom_hline() 사용법
geom_hline(yintercept = y절편)
# 그래프에 평행선 그리기(p.295)
# 개인 저축률의 평균 값에 평행선을 그려넣음!(mean() 함수로 평균값을 y절편으로 구함)
ggplot(economics, aes(x = date, y = psavert)) +
geom_line() +
geom_hline(yintercept = mean(economics$psavert))
geom_vline()
함수를 사용하여 그린다geom_hline()
함수와는 반대로 옵션에 x축 절편을 넣어준다!# geom_vline() 사용법
geom_vline(xintercept = x절편)
# 그래프에 수직선 그리기
# 개인 저축률이 가장 낮은 시기를 구함
# 가장 낮은 저츅률을 min()을 통해 구한다음 그에 해당하는 날짜를 filter()를 통해 얻어냄
# 그 날짜를 x_intercept에 할당하여 그래프를 그린다.
x_inter <- filter(economics, psavert == min(economics$psavert))$date
ggplot(economics, aes(x = date, y = psavert)) +
geom_line() +
geom_vline(xintercept = x_inter)
geom_text()
함수를 사용하여 그래프 위에 텍스트를 직접 표시(레이블, label)할 수 있다.# geom_text() 사용 방법
geom_text(aes(label = 레이블, vjust = 세로 위치, hjust = 가로 위치))
# 그래프에 텍스트 입력(라벨링, label 입력)
# 날짜별 온도를 산점도로 표현, 이후 각 점에 온도 표시!
# vjust & hjust 둘 다 0이면 레이블은 각 점의 오른쪽 상단에 표시된다.
ggplot(airquality, aes(x = Day, y = Temp)) +
geom_point() +
geom_text(aes(label = Temp, vjust = 0, hjust = 0))
annotate()
함수는 그래프 위에 특정 영역을 강조할 때 사용하기 좋다!# annotate 사용 방법
annotate("모양", xmin = x축 시작, xmax = x축 끝, ymin = y축 시작, ymax = y축 끝)
# 무게와 연비를 기준으로 산점도를 그림
# 이후 강조하고 싶은 부분에 사각형을 넣어보자!
# x축(wt) y축(mpg) 매핑 후 annotate() 함수에 rect를 넣어 사각형을 지정
# 그래프에 사각형 그리기
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point() +
annotate("rect", xmin = 3, xmax = 4, ymin = 12, ymax = 21,
alpha = 0.5, fill = "skyblue")
도형을 넣은 그래프에 화살표를 추가하여 강조하기
# alpha(투명도 수치)(1에 가까울수록 불투명)
# fill(채우기 색상 지정)
# 화살표를 그릴때도 annotate() 함수를 활용한다
# 선을 의미하는 segment를 입력하여 모양을 결정한후
# 화살표를 의미하는 arrow = arrow()를 옵션으로 추가!
# 그래프에 화살표 그리기
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())
지도 시각화
: 지도 상에 위치 데이터를 표시하여 보여주는 것API(Application Programming Interface)
로 불러와서 시각화할 수 있음ggamp
패키지를 통해 불러올 수 있음아래 주소로 접속(구글 계정 있어야 함)
각종 계정 설정 후 다음과 같은 페이지에서 계정 설정 완료 버튼 클릭
여러가지 설정 진행 - API 키 발급 완료
API 키 보호창이 뜨면 우선 나중에 버튼을 클릭하고 패스!(준비 완료)
ggmap 패키지
: 구글 지도 API 서비스를 활용할 수 있는 패키지ggmap 패키지에서 자주 사용하는 함수 살펴보기
# register_google() 함수는 발급받은 구글 지도 API키를 등록한다.
register_google(key = "사용자 API 키")
# get_googlemap() 함수는 설정한 위치를 지도로 가져온다.
# center : 위도와 경도 값을 넣거나 위치를 포함하는 문자열을 넣음
# maptype : 가져올 지도 유형을 넣음(terrain(기본값), satellite, roadmap, hybrid 등)
get_googlemap(center, maptype = "지도 유형")
# ggamp() 함수는 위치 데이터를 지도로 시각화한다.
ggamp()
# geocode() 함수는 위치를 포함하는 문자열(지명 혹은 주소)을 위도와 경도값으로 반환한다.
geocode()
ggmap 패키지에서 지명을 이용하여 서울 지도 정보 불러오기
# ggmap 패키지 설치 및 로드
install.packages("ggmap")
library(ggmap)
패키지 로드 이후에는 지도 사용을 위해 register_google()
함수로 API 키 인증을 진행한다.
구글 지도 플랫폼에서 받은 API키를 변수에 할당하여 키 인증을 받는다.
get_googlemap()
함수를 통해 서울 위치를 불러와보도록 하자.
참고로 API키를 까먹었다면 구글 지도 플랫폼에서 사용자 인증 정보 탭에서 확인할 수 있다.
# 구글 지도에서 서울시 지도 가져오기
register_google(key = "사용자 API 키를 여기다가 그대로 입력")
gg_seoul <- get_googlemap("seoul, south korea", maptype = "roadmap")
ggmap(gg_seoul)
# 아래 이미지에서 lon(경도) lat(위도) 표시를 확인할 수 있다
ggmap 패키지에서 좌표를 이용하여 대전역 정보 불러오기
# 지도에 대전역 좌표를 점으로 표시
library(dplyr) # %>% 연산자 사용을 위해 불러옴
library(ggplot2) # geom_point() 함수 사용을 위해 불러옴
# geo_code 함수를 이용하여 대전역의 위도 & 경도 값을 가져옴
# geom_point() 함수를 이용하여 지도에 위치를 점으로 표시!
# 한글로 입력한 지명을 enc2utf8을 통해 인코딩 한 후 as.numeric()함수로 숫자형 벡터로 변환!
geo_code <- enc2utf8("대전역") %>% geocode()
geo_data <- as.numeric(geo_code)
# 얻은 위치 데이터를 바탕으로 대전역 구글지도를 가져온다.
# get_googlemap() & ggmap() 함수를 통해 지도를 시각화한후 geom_point() 함수로 점표기!
get_googlemap(center = geo_data, maptype = "roadmap",
zoom = 13) %>% ggmap() +
geom_point(data = geo_code, aes(x = geo_code$lon, y = geo_code$lat))
288p <좀 더 알아보기> 실습 및 캡쳐
예시1) 선그래프 + 산점도 조합
# 선 그래프와 산점도 조합하여 그리기
ggplot(airquality, aes(x = Day, y = Temp)) +
geom_line() +
geom_point()
예시2) 예시1번에 선그래프 컬러 & 산점도 점 크기까지 변경
# 선 그래프 컬러 & 산점도 점 크기 변경
# ggplot으로 틀을 그리고 그 위에 산점도와 선 그래프를 덮은 형태이다.
ggplot(airquality, aes(x = Day, y = Temp)) +
geom_line(color = "red") +
geom_point(size = 3)
구글 API & ggmap 패키지를 활용하여 원하는 장소의 지도 불러오기(부산으로 진행!)
gg_busan <- get_googlemap("busan", maptype = "roadmap", zoom = 10)
ggmap(gg_busan)
# zoom 수치 20으로 조정(지도가 너무 확대되서 나옴 ㅋㅋ)
gg_busan <- get_googlemap("busan", maptype = "roadmap", zoom = 20)
ggmap(gg_busan)