매주 기부로 1500만 원 달성하기 – R 시계열 그래프로 목표 추적하기
2022년 11월 20일부터 매주 2만 원씩, 그리고 매달 한 번은 5만 원(2만 원 대신)을 기부하기로 결심했고 계속해서 이어오고 있습니다. 그리고 목표금액 1500만 원을 달성하는 시점을 시계열 그래프로 확인하고 싶습니다.
오늘은 이러한 기부 계획을 어떻게 시계열로 추적하고 목표 달성 시점을 R 그래프로 시각화할 수 있는지, R 코드를 통해 살펴보겠습니다. 매달, 매주 기부할 때 누적 금액이 어떻게 증가하는지 시계열 그래프로 확인해 볼 수 있어요.
1. 기부 계획과 목표 설정
제가 계획한 기부 목표는 다음과 같습니다. 아래의 기부 계획에 따라 목표를 언제 달성할 수 있을지 계산해보겠습니다.
- 매주 2만 원씩 기부.
- 한 달에 한 번은 5만 원 기부.
- 목표 금액은 1500만 원입니다.
2. 필요한 패키지 로드
먼저, 날짜 계산을 위한 lubridate
패키지와 그래프 생성을 위한 ggplot2
패키지를 로드합니다.
# 필요한 패키지 로드
library(lubridate)
library(ggplot2)
설명: lubridate
패키지는 날짜 계산을 편리하게 해주며, ggplot2
는 데이터 시각화를 위한 패키지입니다.
3. 변수 초기화
기부 시작일, 목표 금액, 매주 기부 금액, 매달 기부 금액, 그리고 오늘 날짜를 변수로 정의합니다.
# 변수 초기화
start_date <- as.Date("2022-11-20")
end_goal <- 15000000 # 1500만 원 목표
weekly_donation <- 20000 # 매주 2만 원
monthly_donation <- 50000 # 매달 5만 원
today <- as.Date("2024-11-10")
설명:
start_date
: 기부 시작 날짜입니다.end_goal
: 목표 금액(15,000,000원)입니다.weekly_donation
: 매주 기부하는 금액(20,000원)입니다.monthly_donation
: 매달 추가로 기부하는 금액(50,000원)입니다.today
: 현재 날짜를 기준으로 기부 진행 상황을 확인하기 위해 설정한 날짜입니다.
4. 날짜와 누적 금액을 저장할 데이터 프레임 생성
2022년 11월 20일부터 매주 기부일이 되는 날짜를 생성하여 dates
변수에 저장하고, 이를 데이터 프레임 donations
에 저장합니다.
# 날짜와 누적 금액을 저장할 데이터 프레임 생성
dates <- seq(from = start_date, by = "week", length.out = 520) # 2032년 12월 31일까지
donations <- data.frame(Date = dates, Donation = 0)
설명:
dates
: 매주 기부일에 해당하는 날짜 리스트입니다. 최대 길이를 520주로 설정해 2032년 말까지 날짜를 생성합니다.donations
: 각 날짜와 해당 날짜의 누적 기부 금액을 기록할 데이터 프레임입니다.
5. 기부 누적 계산
반복문을 통해 매주 기부 금액을 누적하며, 매달 네 번째 주에는 추가로 5만 원을 더해 총 기부 금액을 누적합니다. 목표 금액에 도달하는 시점에서 반복을 종료합니다.
# 기부 누적 계산
total_donation <- 0
for (i in 1:nrow(donations)) {
if (i %% 4 == 0) { # 매달 5만 원 추가
total_donation <- total_donation + weekly_donation + monthly_donation
} else {
total_donation <- total_donation + weekly_donation
}
donations$Donation[i] <- total_donation
if (total_donation >= end_goal) {
# 목표 달성일 계산
goal_date <- donations$Date[i]
break
}
}
설명:
for
루프를 통해 매주weekly_donation
금액을 누적합니다.if (i %% 4 == 0)
: 매달 네 번째 주차마다monthly_donation
을 추가합니다.donations$Donation[i] <- total_donation
: 각 날짜의 누적 기부 금액을 기록합니다.- 목표 금액에 도달하면
goal_date
변수에 목표 달성 날짜를 저장하고 반복을 종료합니다.
6. 현재 누적 기부 금액 확인
설정한 날짜(today
)까지의 누적 기부 금액을 확인합니다.
# 현재 누적 금액 확인
current_donation <- donations$Donation[which(donations$Date <= today)]
current_donation <- tail(current_donation, 1)
설명: current_donation
은 today
날짜를 기준으로 누적 기부 금액을 확인하며, 최신 값만 저장해 현재 누적 금액을 나타냅니다.
7. R 그래프 생성
누적 기부 금액을 시각화하여 목표 금액과 목표 달성 날짜를 포함한 시계열 그래프를 생성합니다.
# R 그래프 생성
p <- ggplot(donations, aes(x = Date, y = Donation)) +
geom_line(color = "blue") +
geom_hline(yintercept = end_goal, linetype = "dashed", color = "red") +
geom_vline(xintercept = as.numeric(goal_date), linetype = "dotted", color = "green") +
labs(
title = "Cumulative Donation Time Series Graph",
subtitle = paste("Estimated Goal Achievement Date:", format(goal_date, "%Y-%m-%d")),
x = "Date",
y = "Cumulative Donation (won)"
) +
annotate("text", x = goal_date, y = end_goal, label = "Goal Achieved", vjust = -1.5, color = "green") +
theme_minimal() +
scale_x_date(limits = c(start_date, as.Date("2032-12-31")))
print(p)
설명:
geom_line(color = "blue")
: 기부 금액의 누적 증가를 파란색 선으로 시각화합니다.geom_hline(yintercept = end_goal, linetype = "dashed", color = "red")
: 목표 금액을 빨간색 점선으로 표시합니다.geom_vline(xintercept = as.numeric(goal_date), linetype = "dotted", color = "green")
: 목표 달성 날짜를 초록색 점선으로 표시합니다.labs()
: 그래프 제목, 부제목, 축 라벨을 지정합니다. 부제목에는 목표 달성 예상 날짜를 표시합니다.annotate("text")
: 목표 달성 날짜에 “Goal Achieved” 라벨을 추가하여 달성 지점을 강조합니다.theme_minimal()
: 그래프 테마를 단순화하여 데이터가 강조되도록 설정합니다.scale_x_date(limits = c(start_date, as.Date("2032-12-31")))
: x축의 범위를 시작일과 2032년 12월 31일 사이로 제한하여 시각화 범위를 조절합니다.
마무리: 목표 달성 시점과 누적 기부금 시계열 그래프 시각화
이번 포스트에서는 매주와 매달 기부하는 계획을 시계열 그래프로 표현하여 목표 달성 시점을 확인해 보았습니다. 이러한 시각화를 통해 기부 목표 달성 여부를 직관적으로 파악할 수 있으며, 앞으로도 기부 목표를 추적하는 데 큰 도움이 됩니다. 여러분도 이 코드를 통해 자신의 기부 계획을 추적해 보세요!
시계열 그래프와 비슷한 주제로 목표 대비 실적을 한번에 알아볼 수 있도록 시각화 하는 것도 필요한데요. 목표 대비 실적 그래프를 어떻게 그리면 좋을까? 포스트를 통해서 그 작업을 하는 방법을 알아보세요!
# 전체 코드
# 필요한 패키지 로드
library(lubridate)
library(ggplot2)
# 변수 초기화
start_date <- as.Date("2022-11-20")
end_goal <- 15000000 # 1500만 원 목표
weekly_donation <- 20000 # 매주 2만 원
monthly_donation <- 50000 # 매달 5만 원
today <- as.Date("2024-11-10")
# 날짜와 누적 금액을 저장할 데이터 프레임 생성
dates <- seq(from = start_date, by = "week", length.out = 520) # 2032년 12월 31일까지
donations <- data.frame(Date = dates, Donation = 0)
# 기부 누적 계산
total_donation <- 0
for (i in 1:nrow(donations)) {
if (i %% 4 == 0) { # 매달 5만 원 추가
total_donation <- total_donation + weekly_donation + monthly_donation
} else {
total_donation <- total_donation + weekly_donation
}
donations$Donation[i] <- total_donation
if (total_donation >= end_goal) {
# 목표 달성일 계산
goal_date <- donations$Date[i]
break
}
}
# 현재 누적 금액 확인
current_donation <- donations$Donation[which(donations$Date <= today)]
current_donation <- tail(current_donation, 1)
# R 그래프 생성
p <- ggplot(donations, aes(x = Date, y = Donation)) +
geom_line(color = "blue") +
geom_hline(yintercept = end_goal, linetype = "dashed", color = "red") +
geom_vline(xintercept = as.numeric(goal_date), linetype = "dotted", color = "green") +
labs(
title = "Cumulative Donation Time Series Graph",
subtitle = paste("Estimated Goal Achievement Date:", format(goal_date, "%Y-%m-%d")),
x = "Date",
y = "Cumulative Donation (won)"
) +
annotate("text", x = goal_date, y = end_goal, label = "Goal Achieved", vjust = -1.5, color = "green") +
theme_minimal() +
scale_x_date(limits = c(start_date, as.Date("2032-12-31")))
print(p)