[혼공학습단 10기]혼공 R데이터분석 공부 6주차😊

rktdnjs·2023년 8월 13일
0

혼공학습단10기

목록 보기
6/7

참고한 서적 : 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순위 패키지. 그래프 틀을 만들고 그 안에 많은 이미지 객체 레이어를 쌓음!

그래프 기본 틀 만들기 - ggplot()

  • 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() 함수를 사용하여 나타낸다
  • 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_line() 함수는 geom_point()에서 한 방식처럼 ggplot() 뒤에 + geom_line()를 입력
# 선 그래프 그리기
# x축(Day) + y축(Temp)로 매핑
ggplot(airquality, aes(x = Day, y = Temp)) + geom_line()

막대 그래프 그리기 - geom_bar() 함수 활용

  • 막대 그래프는 geom_bar() 함수를 사용하여 나타낸다
  • 막대 그래프는 하나의 변수에서 각 값의 빈도를 파악하는데 유용하다
  • 막대 그래프에서는 x & y축 둘 다 지정할 필요 없이 x축만 지정하면 된다!
# 막대 그래프 그리기
# 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")

상자 그림 그리기 - geom_boxplot() 함수 활용

  • 상자 그림은 ggplot2 패키지의 geom_boxplot() 함수를 사용하여 그릴 수 있다
  • geom_boxplot() 함수는 aes() 함수 안에 상자로 그룹 지을 열을 따로 설정해주어야 한다!
# 상자 그림 그리기(airquality 데이터셋 활용)
# 날짜별로 온도 분포를 확인하기 위해 group 옵션에 Day 변수를 지정!
# 날짜별로 그룹 설정이 된다.
ggplot(airquality, aes(x = Day, y = Temp, group = Day)) + geom_boxplot()

히스토그램 그리기 - geom_histogram() 함수 활용

  • 히스토그램은 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)

🎁 그래프에 객체 추가 🎁

  • 그래프에 선 or 도형을 추가하면 그래프의 가독성이 높아지는 효과가 있다.
  • 그래프에 직선을 표현할 때는 주로 절편과 기울기를 이용한다.
  • 절편(intercept) : 직선이 x축 혹은 y축과 만나는 좌표
  • 기울기(slope) : 직선의 경사도
  • 절편과 기울기는 회귀분석(Regression analysis)을 통해 구할 수 있다!

그래프에 사선 그리기 - geom_abline() 함수 활용

  • 그래프에 사선을 추가하면 데이터의 추세를 확인할 수 있다
  • 사선은 절편과 기울기를 이용하여 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() 함수 활용

  • 평행선은 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_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() 함수 활용

  • 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 사용 방법
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())

🎁 지도의 시각화 - ggmap 패키지 🎁

  • 지도 시각화 : 지도 상에 위치 데이터를 표시하여 보여주는 것
  • R에서는 지도를 API(Application Programming Interface)로 불러와서 시각화할 수 있음
  • 구글 지도는 ggamp 패키지를 통해 불러올 수 있음

구글 지도 API 키 발급

  • R에서 구글 지도를 불러오기 위해서는 구글 지도 API 키가 필요함!
  • 구글 지도 API 키는 구글 지도 플랫폼에서 발급받을 수 있다!

  1. 아래 주소로 접속(구글 계정 있어야 함)

    Google Maps Platform - Location and Mapping Solutions

  2. 각종 계정 설정 후 다음과 같은 페이지에서 계정 설정 완료 버튼 클릭

  3. 여러가지 설정 진행 - API 키 발급 완료

  4. API 키 보호창이 뜨면 우선 나중에 버튼을 클릭하고 패스!(준비 완료)

ggmap 패키지를 통해 구글 지도 활용

  • 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)

profile
프론트엔드 꿈나무 개발자입니다:)

0개의 댓글