๋ชจ๋ ์น์ฌ์ดํธ์ ๊ฒ์๋ฌผ์ ์ง์ ์ฝ์
ํ ์ ์๋ ์ ๋๋ฉ์ด์
๋ง๋ ์ฐจํธ๊ฐ ์ ์ ์ธ๊ธฐ๋ฅผ ์ป๊ณ ์์ต๋๋ค. ์ด๋ ํน์ ์๊ฐ ๋์ ๋ชจ๋ ํน์ฑ์ ๋ณํ ์ญํ์ ํ์ํ๊ณ ์ด๋ฅผ ๋ช
ํํ๊ฒ ์ํํฉ๋๋ค. R ๋ฐ ์ผ๋ฐ ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Skillbox๋ ๋ค์์ ๊ถ์ฅํฉ๋๋ค. ์ค๊ธฐ ์ฝ์ค
"์ฒ์๋ถํฐ Python ๊ฐ๋ฐ์" .์๋ฆผ: "Habr"์ ๋ชจ๋ ๋ ์๋ฅผ ์ํ - "Habr" ํ๋ก๋ชจ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ Skillbox ๊ณผ์ ์ ๋ฑ๋กํ ๋ 10 ๋ฃจ๋ธ ํ ์ธ.
ํจํค์ง
R์๋ ํจํค์ง๊ฐ ํ์ํฉ๋๋ค.
- ggplot2
-
๊ฐ๋๋ฉ์ดํธ
์ด ๋ ๊ฐ์ง๋ ๋งค์ฐ ํ์ํฉ๋๋ค. ๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ๊ทธ์ ๋ฐ๋ผ ๋ฐฐ์ด์ ์ ๋ฆฌํ๊ณ ํฌ๋งทํ๋ ค๋ฉด tidyverse, ๊ด๋ฆฌ์ธ ๋ฐ ์ ์ธ์ด ํ์ํฉ๋๋ค.
๋ฐ์ดํฐ
์ด ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์๋ณธ ๋ฐ์ดํฐ์ธํธ๋ World Bank ์น์ฌ์ดํธ์์ ๋ค์ด๋ก๋๋ฉ๋๋ค. ์ฌ๊ธฐ ์์ต๋๋ค -
์ด๊ฒ์ ์ด๋ค ์ข ๋ฅ์ ์ ๋ณด์ ๋๊น? ์ํ์๋ ์๋ ๊ฐ(2000๋ ๋ถํฐ 2017๋ ๊น์ง) ๋๋ถ๋ถ์ ๊ตญ๊ฐ์ GDP ๊ฐ์น๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
๋ฐ์ดํฐ ์ฒ๋ฆฌ
์๋์ ๊ฒ์๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ๋ฐ์ดํฐ ํ์์ ์ค๋นํ๊ฒ ์ต๋๋ค. ์ด ์ด๋ฆ์ ์ง์ฐ๊ณ , ์ซ์๋ฅผ ์ซ์ ํ์์ผ๋ก ๋ณํํ๊ณ , ์์ง() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ณํํฉ๋๋ค. ๋์ค์ ์ฌ์ฉํ ์ ์๋๋ก gdp_tidy.csv์ ์์ ๋ ๋ชจ๋ ๋ด์ฉ์ ์ ์ฅํฉ๋๋ค.
library(tidyverse)
library(janitor)
gdp <- read_csv("./data/GDP_Data.csv")
#select required columns
gdp <- gdp %>% select(3:15)
#filter only country rows
gdp <- gdp[1:217,]
gdp_tidy <- gdp %>%
mutate_at(vars(contains("YR")),as.numeric) %>%
gather(year,value,3:13) %>%
janitor::clean_names() %>%
mutate(year = as.numeric(stringr::str_sub(year,1,4)))
write_csv(gdp_tidy,"./data/gdp_tidy.csv")
์ ๋๋ฉ์ด์ ํ์คํ ๊ทธ๋จ
์์ฑ์๋ ๋ ๋จ๊ณ๊ฐ ํ์ํฉ๋๋ค.
- ggplot2๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ํ์คํ ๊ทธ๋จ์ ์ ์ฒด ์ธํธ๋ฅผ ํ๋กฏํฉ๋๋ค.
- gganimate๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ ๋งค๊ฐ๋ณ์๋ก ์ ์ ํ์คํ ๊ทธ๋จ์ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํฉ๋๋ค.
๋ง์ง๋ง ๋จ๊ณ๋ GIF ๋๋ MP4๋ฅผ ํฌํจํ์ฌ ์ํ๋ ํ์์ผ๋ก ์ ๋๋ฉ์ด์ ์ ๋ ๋๋งํ๋ ๊ฒ์ ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ก๋ ์ค
- ๋์๊ด(ํ์ด๋๋ฒ์ค)
- ๋์๊ด(gganimate)
๋ฐ์ดํฐ ๊ด๋ฆฌ
์ด ๋จ๊ณ์์๋ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ์ฌ ๋งค๋ ์์ 10๊ฐ ๊ตญ๊ฐ๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ํ์คํ ๊ทธ๋จ์ ๋ฒ๋ก๋ฅผ ํ์ํ ์ ์๋ ์ฌ๋ฌ ์ด์ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
gdp_tidy <- read_csv("./data/gdp_tidy.csv")
gdp_formatted <- gdp_tidy %>%
group_by(year) %>%
# The * 1 makes it possible to have non-integer ranks while sliding
mutate(rank = rank(-value),
Value_rel = value/value[rank==1],
Value_lbl = paste0(" ",round(value/1e9))) %>%
group_by(country_name) %>%
filter(rank <=10) %>%
ungroup()
์ ์ ํ์คํ ๊ทธ๋จ ์์ฑ
์ด์ ํ์ํ ํ์์ ๋ฐ์ดํฐ ํจํค์ง๊ฐ ์์ผ๋ฏ๋ก ์ ์ ํ์คํ ๊ทธ๋จ ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ์์ํฉ๋๋ค. ๊ธฐ๋ณธ ์ ๋ณด - ์ ํํ ๊ธฐ๊ฐ ๋์ ์ต๋ GDP๋ฅผ ๊ธฐ๋กํ ์์ 10๊ฐ ๊ตญ๊ฐ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋งค๋ ๊ทธ๋ํ๋ฅผ ๋ง๋ญ๋๋ค.
staticplot = ggplot(gdp_formatted, aes(rank, group = country_name,
fill = as.factor(country_name), color = as.factor(country_name))) +
geom_tile(aes(y = value/2,
height = value,
width = 0.9), alpha = 0.8, color = NA) +
geom_text(aes(y = 0, label = paste(country_name, " ")), vjust = 0.2, hjust = 1) +
geom_text(aes(y=value,label = Value_lbl, hjust=0)) +
coord_flip(clip = "off", expand = FALSE) +
scale_y_continuous(labels = scales::comma) +
scale_x_reverse() +
guides(color = FALSE, fill = FALSE) +
theme(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
legend.position="none",
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
panel.grid.major.x = element_line( size=.1, color="grey" ),
panel.grid.minor.x = element_line( size=.1, color="grey" ),
plot.title=element_text(size=25, hjust=0.5, face="bold", colour="grey", vjust=-1),
plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="grey"),
plot.caption =element_text(size=8, hjust=0.5, face="italic", color="grey"),
plot.background=element_blank(),
plot.margin = margin(2,2, 2, 4, "cm"))
ggplot2๋ฅผ ์ฌ์ฉํ์ฌ ํ๋กฏ์ ๋ง๋๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ์์ ์ฝ๋ ์น์ ์์ ๋ณผ ์ ์๋ฏ์ด theme() ํจ์์๋ ๋ช ๊ฐ์ง ํต์ฌ ์ฌํญ์ด ์์ต๋๋ค. ๋ชจ๋ ์์๊ฐ ๋ฌธ์ ์์ด ์ ๋๋ฉ์ด์ ๋๋๋ก ํ๋ ค๋ฉด ํ์ํฉ๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์ผ๋ถ๋ ํ์๋์ง ์์ ์ ์์ต๋๋ค. ์: ์์ง ๊ทธ๋ฆฌ๋ ์ ๊ณผ ๋ฒ๋ก๋ง ๊ทธ๋ ค์ง์ง๋ง ์ถ ์ ๋ชฉ๊ณผ ๊ธฐํ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๋ ์์ญ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
์๊ธฐ
์ฌ๊ธฐ์ ํต์ฌ ๊ธฐ๋ฅ์ ์ ํ_์ํ()์ด๋ฉฐ, ์ด๋ ๋ณ๋์ ์ ์ ๊ทธ๋ํ๋ฅผ ํจ๊ป ์ฐ๊ฒฐํฉ๋๋ค. view_follow()๋ ๊ทธ๋ฆฌ๋ ์ ์ ๊ทธ๋ฆฌ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
anim = staticplot + transition_states(year, transition_length = 4, state_length = 1) +
view_follow(fixed_x = TRUE) +
labs(title = 'GDP per Year : {closest_state}',
subtitle = "Top 10 Countries",
caption = "GDP in Billions USD | Data Source: World Bank Data")
ํํ
์ ๋๋ฉ์ด์ ์ด ์์ฑ๋์ด anim ๊ฐ์ฒด์ ์ ์ฅ๋๋ฉด animate() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋๋งํ ์ฐจ๋ก์ ๋๋ค. animate()์ ์ฌ์ฉ๋๋ ๋ ๋๋ฌ๋ ํ์ํ ์ถ๋ ฅ ํ์ผ ์ ํ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
GIF
# For GIF
animate(anim, 200, fps = 20, width = 1200, height = 1000,
renderer = gifski_renderer("gganim.gif"))
MP4
# For MP4
animate(anim, 200, fps = 20, width = 1200, height = 1000,
renderer = ffmpeg_renderer()) -> for_mp4
anim_save("animation.mp4", animation = for_mp4 )
๊ฒฐ๊ณผ
๋ณด์๋ค์ํผ ๋ณต์กํ ๊ฒ์ ์์ต๋๋ค. ์ ์ฒด ํ๋ก์ ํธ๋ ๋ค์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Skillbox๋ ๋ค์์ ๊ถ์ฅํฉ๋๋ค.
- XNUMX๋ ์ค์ต ์ฝ์ค
"์ ๋ PRO ์น ๊ฐ๋ฐ์์ ๋๋ค" .- ์จ๋ผ์ธ ์ฝ์ค
"์ฒ์๋ถํฐ C# ๊ฐ๋ฐ์" .- ์ค๊ธฐ ์ฝ์ค
"0์์ PRO๋ก์ PHP ๊ฐ๋ฐ์" .
์ถ์ฒ : habr.com