아마 데이터 시각화가 중요하다는 것은 모두 인정하실거예요.
기본적인 통계 분석을 하다 보면 안보이던 요소가 데이터 시각화를 통해 인사이트를 얻기도 하니까요. 하나의 데이터 분석 영역이라고 할 만큼 중요한 부분입니다.
물론 전통적인 정적인 차트는 유용하지만, 인터랙티브 시각화는 사용자와 데이터 간의 상호작용을 하기 때문에 더 도움이 됩니다.
이번 포스팅에서는 여러분과 함께 R 패키지를 사용하여 인터랙티브 시각화를 만드는 방법을 소개하려고 합니다.
인터렉티브 시각화란?
한마디로 내가 시각적 요소에 직접 참여할 수 있도록 하는 기술입니다. 데이터의 그래픽 표현을 사용하여 데이터를 탐색, 조작, 드릴다운하여 또 다른 인사이트를 얻을 수 있도록 함을 의미하죠.
정적인 시각화와는 달리 클릭, 마우스 오버, 필터링, 확대/축소 등의 사용자 입력이 가능하여 표시된 정보가 동적으로 업데이트됩니다. 이제 아셨죠. 그러면 슬슬 코딩으로 들어가 보시죠.
준비하기
우선 아래 예제는 R 언어로 구현할 수 있습니다. 그리고 인터랙티브 시각화를 시작하기 위해 몇 가지 패키지가 필요합니다. 이것들은 데이터 조작과 시각화를 위해 필요합니다.
# 필요한 패키지 설치
install.packages("tidyverse")
install.packages("DT")
install.packages("ggplot2")
install.packages("dplyr")
install.packages("gapminder")
install.packages("plotly")
install.packages("leaflet")
# 패키지 로드
library(tidyverse)
library(DT)
library(ggplot2)
library(dplyr)
library(gapminder)
library(plotly)
library(leaflet)
인터랙티브 테이블
DT 패키지는 인터랙티브 테이블을 만드는 데 유용한데요. 데이터를 정렬, 필터 및 검색할 수 있습니다. 다음은 gapminder 데이터셋을 사용하여 인터랙티브 테이블을 만드는 방법입니다. 참고로 gapmider 데이터셋은 링크에서 다운로드 받을 수 있습니다.
Gapminder 데이터 무엇일까요?
Gapminder 데이터는 한눈에 세계의 불평등과 발전을 보여주는 자료입니다. 스웨덴의 통계학자 한스 로슬링(Hans Rosling)이 설립한 Gapminder 재단에서 공개한 이 데이터는 국가별 경제 수준, 의료 수준, 인구 등 다양한 사회 지표를 시간의 흐름에 따라 담고 있습니다.
우리는 무엇을 분석할 수 있을까요?
- 국가별 비교: 전 세계 국가들의 경제 성장과 사회 발전을 비교 분석할 수 있습니다.
- 시간의 흐름: 역사적 데이터를 통해 시간에 따른 변화를 파악하고 미래를 예측할 수 있습니다.
- 다양한 지표: GDP, 기대 수명, 인구, 교육 수준 등 다양한 사회 지표를 포함하고 있습니다.
- 시각화에 최적화: 데이터 시각화를 통해 복잡한 정보를 직관적으로 이해할 수 있도록 구성되어 있습니다.
# 필요한 라이브러리 로드
library(DT)
# 인터랙티브 데이터 테이블 생성
datatable(gapminder,
options = list(pageLength = 10,
autoWidth = TRUE,
dom = 'Bfrtip',
buttons = c('copy', 'csv', 'excel', 'pdf', 'print'))) %>%
formatCurrency('gdpPercap', currency = "$") %>%
formatStyle('lifeExp',
backgroundColor = styleInterval(c(50, 70), c('red', 'green', 'blue')))
이 테이블에서는 컬럼 헤더를 클릭하여 데이터를 정렬하거나, 검색 상자를 통해 특정 국가나 값을 빠르게 찾을 수 있습니다.
인터랙티브 차트
Plotly는 인터랙티브 플롯을 만드는 데 필요한 패키지입니다. 이를 이용하여 정적 ggplot2 차트를 인터랙티브 차트로 변환하는 것도 가능합니다. 다음은 gapminder 데이터셋을 사용한 ‘인터랙티브 산점도’입니다.
# 인터랙티브 산점도 생성
plot_ly(data = gapminder,
x = ~gdpPercap,
y = ~lifeExp,
color = ~continent,
text = ~paste(country, "", "GDP per Capita:", gdpPercap),
type = 'scatter',
mode = 'markers') %>%
layout(title = "GDP per Capita vs Life Expectancy",
xaxis = list(title = "GDP per Capita (Log Scale)", type = "log"),
yaxis = list(title = "Life Expectancy"))
이 플롯에서는 포인트 위에 마우스를 올리면 각 국가에 대한 추가 정보를 볼 수 있습니다. 또한, 아래 코드를 이용해 바 차트도 쉽게 만들 수 있습니다:
# 각 대륙별 평균 기대 수명 계산
avg_lifeExp <- gapminder %>%
group_by(continent) %>%
summarise(avg_lifeExp = mean(lifeExp, na.rm = TRUE))
# 인터랙티브 바 차트 생성
plot_ly(data = avg_lifeExp,
x = ~continent,
y = ~avg_lifeExp,
type = 'bar',
marker = list(color = 'orange')) %>%
layout(title = "Average Life Expectancy by Continent",
xaxis = list(title = "Continent"),
yaxis = list(title = "Average Life Expectancy"),
showlegend = FALSE)
이 바 차트에서는 각 막대 위에 마우스를 올리면 대륙별로 평균 기대 수명을 확인할 수 있습니다.
인터랙티브 지도
Leaflet 패키지를 사용하면 지리적 데이터를 표시하는 인터랙티브 지도(map)을 만들 수 있습니다. 다음은 특정 국가의 인구를 표시하는 인터랙티브 맵입니다.
# 국가 좌표를 가진 데이터셋 생성
country_coords <- gapminder %>%
filter(year == 2007) %>%
left_join(map_data("world"), by = c("country" = "region"))
# 인터랙티브 맵 생성
leaflet(country_coords) %>%
addTiles() %>%
setView(lng = 0, lat = 20, zoom = 2) %>%
addCircleMarkers(lng = ~long, lat = ~lat, radius = ~sqrt(pop / 1000000),
color = "blue", stroke = FALSE, fillOpacity = 0.5,
popup = ~paste("<b>", country, "</b><br>Population: ", format(pop, big.mark = ","))) %>%
addLegend("bottomright", pal = colorNumeric("Blues", NULL),
values = ~pop, title = "Population",
labFormat = labelFormat(big.mark = ","), opacity = 1)
이 맵에서는 마커를 클릭하면 국가명과 인구가 표시되는 팝업이 나타납니다.
결론
R을 이용해 인터랙티브 시각화를 해 보았는데요. 기존 정적 시각화 보다 데이터 분석을 다양하게 할 수 있다는 생각 드시나요?
Plotly, DT, Leaflet과 같은 패키지를 활용하면, 데이터 탐색과 인사이트 도출이 훨씬 수월해집니다. 여러분도 이 기술들을 활용하여 데이터 시각화를 업그레이드 해 보세요.