R을 μ‚¬μš©ν•˜μ—¬ μ• λ‹ˆλ©”μ΄μ…˜ νžˆμŠ€ν† κ·Έλž¨ λ§Œλ“€κΈ°

R을 μ‚¬μš©ν•˜μ—¬ μ• λ‹ˆλ©”μ΄μ…˜ νžˆμŠ€ν† κ·Έλž¨ λ§Œλ“€κΈ°

λͺ¨λ“  μ›Ήμ‚¬μ΄νŠΈμ˜ κ²Œμ‹œλ¬Όμ— 직접 μ‚½μž…ν•  수 μžˆλŠ” μ• λ‹ˆλ©”μ΄μ…˜ λ§‰λŒ€ μ°¨νŠΈκ°€ 점점 인기λ₯Ό μ–»κ³  μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” νŠΉμ • μ‹œκ°„ λ™μ•ˆ λͺ¨λ“  νŠΉμ„±μ˜ λ³€ν™” 역학을 ν‘œμ‹œν•˜κ³  이λ₯Ό λͺ…ν™•ν•˜κ²Œ μˆ˜ν–‰ν•©λ‹ˆλ‹€. R 및 일반 νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•˜μ—¬ 이λ₯Ό μƒμ„±ν•˜λŠ” 방법을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

SkillboxλŠ” λ‹€μŒμ„ ꢌμž₯ν•©λ‹ˆλ‹€. μ‹€κΈ° μ½”μŠ€ "μ²˜μŒλΆ€ν„° Python 개발자".

μ•Œλ¦Ό: "Habr"의 λͺ¨λ“  λ…μžλ₯Ό μœ„ν•œ - "Habr" ν”„λ‘œλͺ¨μ…˜ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ Skillbox 과정에 등둝할 λ•Œ 10 루블 할인.

νŒ¨ν‚€μ§€

Rμ—λŠ” νŒ¨ν‚€μ§€κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

이 두 κ°€μ§€λŠ” 맀우 ν•„μš”ν•©λ‹ˆλ‹€. λ˜ν•œ 데이터λ₯Ό κ΄€λ¦¬ν•˜κ³  그에 따라 배열을 μ •λ¦¬ν•˜κ³  ν¬λ§·ν•˜λ €λ©΄ tidyverse, 관리인 및 μ €μšΈμ΄ ν•„μš”ν•©λ‹ˆλ‹€.

데이터

이 ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©ν•  원본 λ°μ΄ν„°μ„ΈνŠΈλŠ” World Bank μ›Ήμ‚¬μ΄νŠΈμ—μ„œ λ‹€μš΄λ‘œλ“œλ©λ‹ˆλ‹€. μ—¬κΈ° μžˆμŠ΅λ‹ˆλ‹€ - 세계은행 데이터. λ™μΌν•œ 데이터가 미리 λ§Œλ“€μ–΄μ Έ μžˆμ–΄μ•Ό ν•˜λŠ” 경우 λ‹€μŒμ—μ„œ λ‹€μš΄λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œμ νŠΈ 폴더.

이것은 μ–΄λ–€ μ’…λ₯˜μ˜ μ •λ³΄μž…λ‹ˆκΉŒ? μƒ˜ν”Œμ—λŠ” μˆ˜λ…„κ°„(2000λ…„λΆ€ν„° 2017λ…„κΉŒμ§€) λŒ€λΆ€λΆ„μ˜ κ΅­κ°€μ˜ GDP κ°€μΉ˜κ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

데이터 처리

μ•„λž˜μ— κ²Œμ‹œλœ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν•„μš”ν•œ 데이터 ν˜•μ‹μ„ μ€€λΉ„ν•˜κ² μŠ΅λ‹ˆλ‹€. μ—΄ 이름을 μ§€μš°κ³ , 숫자λ₯Ό 숫자 ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜κ³ , μˆ˜μ§‘() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό λ³€ν™˜ν•©λ‹ˆλ‹€. λ‚˜μ€‘μ— μ‚¬μš©ν•  수 μžˆλ„λ‘ gdp_tidy.csv에 μˆ˜μ‹ λœ λͺ¨λ“  λ‚΄μš©μ„ μ €μž₯ν•©λ‹ˆλ‹€.

library(tidyverse)
library(janitor)

GDP <- read_csv("./data/GDP_Data.csv")

#ν•„μˆ˜ μ—΄ 선택

GDP <- GDP %>% 선택(3:15)

#κ΅­κ°€ ν–‰λ§Œ 필터링

GDP <- GDP[1:217,]

GDP_정리 <- GDP %>%
mutate_at(vars(contains("YR")),as.numeric) %>%
gather(년도,κ°’,3:13) %>%
관리인::clean_names() %>%
mutate(년도 = as.numeric(stringr::str_sub(년도,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 %>%
κ·Έλ£Ήν™”(λ…„) %>%
# * 1을 μ‚¬μš©ν•˜λ©΄ μŠ¬λΌμ΄λ”©ν•˜λŠ” λ™μ•ˆ μ •μˆ˜κ°€ μ•„λ‹Œ μˆœμœ„λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
mutate(μˆœμœ„ = μˆœμœ„(-κ°’),
Value_rel = κ°’/κ°’[μˆœμœ„==1],
Value_lbl = paste0(" ",round(value/1e9))) %>%
κ΅­κ°€λͺ…별 κ·Έλ£Ήν™” %>%
ν•„ν„°(μˆœμœ„ <=10) %>%
κ·Έλ£Ή ν•΄μ œ()

정적 νžˆμŠ€ν† κ·Έλž¨ μž‘μ„±

이제 ν•„μš”ν•œ ν˜•μ‹μ˜ 데이터 νŒ¨ν‚€μ§€κ°€ μžˆμœΌλ―€λ‘œ 정적 νžˆμŠ€ν† κ·Έλž¨ 그리기λ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€. κΈ°λ³Έ 정보 - μ„ νƒν•œ κΈ°κ°„ λ™μ•ˆ μ΅œλŒ€ 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(μ• λ‹ˆλ©”μ΄μ…˜, 200, fps = 20, λ„ˆλΉ„ = 1200, 높이 = 1000,
λ Œλ”λŸ¬ = gifski_renderer("gganim.gif"))

MP4

# For MP4

animate(μ• λ‹ˆλ©”μ΄μ…˜, 200, fps = 20, λ„ˆλΉ„ = 1200, 높이 = 1000,
λ Œλ”λŸ¬ = ffmpeg_renderer()) -> for_mp4

anim_save("μ• λ‹ˆλ©”μ΄μ…˜.mp4", μ• λ‹ˆλ©”μ΄μ…˜ = for_mp4)

κ²°κ³Ό

R을 μ‚¬μš©ν•˜μ—¬ μ• λ‹ˆλ©”μ΄μ…˜ νžˆμŠ€ν† κ·Έλž¨ λ§Œλ“€κΈ°

λ³΄μ‹œλ‹€μ‹œν”Ό λ³΅μž‘ν•œ 것은 μ—†μŠ΅λ‹ˆλ‹€. 전체 ν”„λ‘œμ νŠΈλŠ” λ‹€μŒμ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄ GitHub, μ ν•©ν•˜λ‹€κ³  νŒλ‹¨λ˜λŠ” λŒ€λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

SkillboxλŠ” λ‹€μŒμ„ ꢌμž₯ν•©λ‹ˆλ‹€.

좜처 : habr.com

DDoS 보호, VPS VDS μ„œλ²„κ°€ μžˆλŠ” μ‚¬μ΄νŠΈλ₯Ό μœ„ν•œ μ•ˆμ •μ μΈ ν˜ΈμŠ€νŒ… κ΅¬μž… πŸ”₯ DDoS 곡격 λ°©μ§€ κΈ°λŠ₯이 νƒ‘μž¬λœ μ•ˆμ •μ μΈ μ›Ήμ‚¬μ΄νŠΈ ν˜ΈμŠ€νŒ…, VPS 및 VDS μ„œλ²„λ₯Ό κ΅¬λ§€ν•˜μ„Έμš” | ProHoster