목표 대비 실적 그래프를 어떻게 그리면 좋을까?
한 해 동안 달성하고자 하는 매출 목표가 있다면, 매월 실적이 목표 대비 얼마나 달성되고 있는지 시각화하는 것이 매우 중요합니다. 목표 대비 실적 그래프를 통해 매월 성과를 확인하고, 연말에 얼마나 초과 달성했는지도 한눈에 파악할 수 있어요.
오늘은 R을 사용해 매출 목표와 실적을 매월 시각화하고, 최종적으로 목표를 10% 초과 달성한 사례를 만들어 보겠습니다. 포스트 제일 하단에 전체 코드가 있으니 위 그림을 바로 확인해 보시려는 분은 복붙해서 실행해보시면 됩니다.
1. 목표와 실적 데이터를 생성하기
우선, 매월 목표와 실적 데이터를 생성합니다. 목표는 매달 일정하게 증가하는 형태로 설정하고, 실적은 목표보다 약간씩 초과 달성하여 최종적으로 연간 목표를 10% 초과 달성하는 데이터를 만들어 보겠습니다.
# 필요한 패키지 로드
library(ggplot2) # ggplot2 패키지를 로드하여 그래프를 그리기 위한 함수들을 사용합니다.
library(scales) # scales 패키지를 로드하여 숫자 형식 (예: 쉼표 추가)과 같은 축 설정을 쉽게 할 수 있습니다.
# 데이터 생성
set.seed(123) # set.seed() 함수를 통해 난수의 시드를 고정하여 실행할 때마다 같은 난수 결과를 얻도록 합니다.
months <- 1:12 # 1부터 12까지 숫자를 months 변수에 저장하여 12개월을 나타냅니다.
monthly_goal <- 1000000 # 월별 매출 목표를 1,000,000 KRW로 설정합니다.
goals <- cumsum(rep(monthly_goal, 12)) # 목표를 누적 합계로 산정하여 연간 목표를 월별 누적으로 표현합니다.
# 실적을 목표보다 5%~15% 초과하는 난수를 곱하여 누적 합계로 산정합니다.
achievements <- cumsum(goals * runif(12, min = 1.05, max = 1.15))
# 데이터 프레임 생성
data <- data.frame(
Month = factor(months, levels = months, labels = month.name), # 1부터 12까지의 값을 월 이름(예: January, February)으로 변환하여 Month 열을 생성합니다.
Goal = goals, # 월별 누적 목표를 Goal 열에 저장합니다.
Achievement = achievements # 월별 누적 실적을 Achievement 열에 저장합니다.
)
# 연간 목표와 실적 합계 계산
annual_goal <- tail(goals, 1)[[1]] # 연간 목표를 goals의 마지막 값으로 설정합니다 (즉, 누적합계의 최종값).
annual_achievement <- tail(achievements, 1)[[1]] # 연간 실적을 achievements의 마지막 값으로 설정합니다 (즉, 누적합계의 최종값).
achievement_rate <- (annual_achievement / annual_goal) * 100 # 목표 대비 실적 달성률을 계산하여 백분율로 나타냅니다.
코드 설명:
- set.seed(123): 난수를 고정하여 실행할 때마다 동일한 결과를 얻기 위함입니다.
- goals: 매월 목표 금액을 누적하여 연간 목표를 산정합니다.
- achievements: 매월 목표를 약간 초과하는 랜덤 값으로 실적을 계산하여 누적합니다.
- data.frame(): 목표와 실적 데이터를
data
라는 데이터 프레임으로 생성하여 그래프 작성에 사용됩니다. - annual_goal, annual_achievement: 연간 목표와 실적의 최종 누적값을 계산하여 저장합니다.
- achievement_rate: 목표 대비 실적 달성률을 백분율로 계산합니다.
2. 목표 대비 실적 R 그래프 생성하기
이제 목표와 실적을 한 그래프에 시각화하여 비교해 보겠습니다. 목표는 빨간색 점선으로, 실적은 파란색 선으로 표시하여 한눈에 차이를 확인할 수 있도록 하겠습니다.
# 목표 대비 실적 그래프 생성
ggplot(data, aes(x = Month)) +
geom_line(aes(y = Goal), color = "red", linetype = "dashed", size = 1, label = "Goal") +
geom_line(aes(y = Achievement), color = "blue", size = 1, label = "실적") +
labs(title = "목표 대비 실적 그래프",
subtitle = paste("연간 목표:", annual_goal, "원, 연간 실적:", round(annual_achievement), "원\n달성률:", round(achievement_rate, 2), "%"),
x = "월", y = "누적 매출 (원)") +
annotate("text", x = 12, y = max(data$Achievement), label = paste("연간 초과 달성:", round(achievement_rate - 100, 2), "%"), vjust = -1, color = "blue") +
theme_minimal()
코드 설명:
- geom_line(aes(y = Goal)): 매월 목표 매출을 빨간색 점선으로 표시합니다.
- geom_line(aes(y = Achievement)): 매월 실적을 파란색 실선으로 표시하여, 목표 대비 실적을 쉽게 비교할 수 있습니다.
- labs(): 그래프 제목과 연간 목표 및 실적, 그리고 달성률을 자막으로 표시합니다.
- annotate(): 그래프에 연간 초과 달성률을 추가하여, 목표 대비 어느 정도 초과 달성했는지 시각적으로 보여줍니다.
3. 목표 대비 실적 그래프를 더욱 세련되게 시각화하기
기본적인 목표 대비 실적 R 그래프를 생성했다면, 이제 그래프를 조금 더 세련되게 시각화해 봅시다. 색상, 배경, 강조 요소 등을 추가하여 그래프를 보다 시각적으로 풍부하게 만들어 보겠습니다. 이를 통해 그래프의 가독성을 높이고, 메시지를 더욱 강렬하게 전달할 수 있습니다.
아래는 그래프를 세련되게 꾸미기 위한 몇 가지 추가 코드와 설명입니다.
# 목표 대비 실적 그래프 생성
ggplot(data, aes(x = Month)) +
geom_line(aes(y = Goal, group = 1), color = "red", linetype = "dashed", size = 1.5) + # 목표선을 빨간색 점선으로 표시, 굵기 1.5
geom_line(aes(y = Achievement, group = 1), color = "blue", size = 1.5) + # 실적선을 파란색 실선으로 표시, 굵기 1.5
labs(title = "Performance vs. Goal Graph", # 그래프 제목 설정
subtitle = paste("Annual Goal:", comma(annual_goal), "KRW, Annual Achievement:", comma(round(annual_achievement)), "KRW\nAchievement Rate:", round(achievement_rate, 2), "%"),
# 그래프 부제목 설정: 연간 목표와 실적, 달성률을 표시
x = "Month", y = "Cumulative Sales (KRW)") + # x축과 y축 레이블 설정
scale_y_continuous(labels = comma, limits = c(0, max(c(annual_goal, annual_achievement)) * 1.2)) + # y축을 쉼표 형식으로 표시하고 범위를 최대값의 120%로 설정
annotate("text", x = 12, y = max(achievements) * 1.1, label = paste("Annual Exceedance:", round(achievement_rate - 100, 2), "%"),
vjust = -1, hjust = 1, color = "blue") + # 연간 초과 달성률을 텍스트로 표시하고 위치 조정
theme_minimal() # 최소한의 테마 적용
코드 설명:
- geom_line(): 목표와 실적을 각각 빨간색 점선과 파란색 실선으로 표시합니다.
- labs(): 그래프 제목과 부제목을 설정합니다. 부제목에는 연간 목표, 연간 실적, 달성률이 포함됩니다.
- scale_y_continuous(): y축을 쉼표 형식으로 표시하며, 최대값의 120%로 y축 범위를 설정하여 그래프가 여유 있게 보이도록 합니다.
- annotate(“text”, …): 그래프의 우측 상단에 초과 달성률 텍스트를 표시하며, 위치를 조정합니다.
theme_min
imal()
: 최소한의 테마를 적용하여 그래프가 깔끔하게 보이도록 합니다.
마무리: 목표 대비 실적 그래프를 통해 성과 분석하기
이 그래프를 통해 매월 목표와 실적을 비교하여 성과를 쉽게 확인할 수 있습니다. 연말에 목표를 초과 달성한 비율을 표시해 성과를 강조할 수 있으며, 이를 통해 연간 성과 분석에 큰 도움이 됩니다. 여러분도 이 코드를 활용해 자신의 목표와 실적을 시각화하고, 목표 대비 성과를 추적해 보세요!
#전체 코드
# 필요한 패키지 로드
library(ggplot2)
library(scales)
# 데이터 생성
set.seed(123)
months <- 1:12
monthly_goal <- 1000000 # 월별 매출 목표
goals <- cumsum(rep(monthly_goal, 12)) # 목표를 누적합계로 산정
achievements <- cumsum(goals * runif(12, min = 1.05, max = 1.15)) # 실적을 누적합계로 산정
# 데이터 프레임 생성
data <- data.frame(
Month = factor(months, levels = months, labels = month.name),
Goal = goals,
Achievement = achievements
)
# 연간 목표와 실적 합계 계산
annual_goal <- tail(goals, 1)[[1]]
annual_achievement <- tail(achievements, 1)[[1]]
achievement_rate <- (annual_achievement / annual_goal) * 100
# 목표 대비 실적 그래프 생성
ggplot(data, aes(x = Month)) +
geom_line(aes(y = Goal, group = 1), color = "red", linetype = "dashed", size = 1.5) +
geom_line(aes(y = Achievement, group = 1), color = "blue", size = 1.5) +
labs(title = "Performance vs. Goal Graph",
subtitle = paste("Annual Goal:", comma(annual_goal), "KRW, Annual Achievement:", comma(round(annual_achievement)), "KRW\nAchievement Rate:", round(achievement_rate, 2), "%"),
x = "Month", y = "Cumulative Sales (KRW)") +
scale_y_continuous(labels = comma, limits = c(0, max(c(annual_goal, annual_achievement)) * 1.2)) +
annotate("text", x = 12, y = max(achievements) * 1.1, label = paste("Annual Exceedance:", round(achievement_rate - 100, 2), "%"), vjust = -1, hjust = 1, color = "blue") +
theme_minimal()
# 추가설명
Scales 패키지: 숫자 형식과 축 설정을 간편하게!
scales
패키지는 ggplot2
와 함께 사용되며, 그래프의 숫자 형식과 축을 더 직관적으로 설정할 수 있는 다양한 함수들을 제공합니다. 이번 섹션에서는 scales 패키지의 주요 기능과, 이 패키지가 어떻게 숫자 데이터를 더 깔끔하고 가독성 높게 표현해 주는지에 대해 설명하겠습니다.
1. Scales 패키지를 사용하는 이유
일반적으로, 수백만 단위 이상의 큰 숫자는 쉼표로 구분되지 않으면 가독성이 떨어집니다. 특히 매출이나 재무 데이터처럼 큰 숫자가 많이 포함된 경우, 숫자를 쉼표로 구분하여 보이게 하면 데이터를 더 직관적으로 이해할 수 있습니다. 예를 들어, 1000000
보다는 1,000,000
으로 표시된 숫자가 더 읽기 쉽겠죠?
scales
패키지의 comma()
함수는 이러한 숫자 가독성을 개선하는 데 큰 도움이 됩니다. 코드에 comma()
를 적용하면 큰 숫자가 자동으로 쉼표로 구분되어 표시됩니다.
2. 코드에서의 사용 예시
이 포스트에서 제공한 예제 코드에서도 scales
패키지를 사용하여 그래프의 축과 레이블을 더 읽기 쉽게 만들었습니다.
# 연간 목표와 실적을 쉼표로 구분된 형식으로 표시
labs(title = "Performance vs. Goal Graph",
subtitle = paste("Annual Goal:", comma(annual_goal), "KRW, Annual Achievement:", comma(round(annual_achievement)), "KRW\nAchievement Rate:", round(achievement_rate, 2), "%"),
x = "Month", y = "Cumulative Sales (KRW)")
이 코드에서 comma(annual_goal)
와 comma(round(annual_achievement))
를 사용하여 연간 목표와 실적 값이 쉼표로 구분된 형식으로 출력되도록 했습니다.
또한, y축의 숫자도 comma()
를 사용해 쉼표로 구분된 형식으로 표시했습니다:
scale_y_continuous(labels = comma, limits = c(0, max(c(annual_goal, annual_achievement)) * 1.2))
이렇게 하면 y축에 표시되는 모든 숫자가 쉼표 형식으로 출력되어 가독성이 크게 향상됩니다.
3. Scales 패키지의 장점 요약
- 가독성 향상: 큰 숫자를 쉼표로 구분하여 더 쉽게 읽을 수 있게 해줍니다.
- 코드 간결화:
comma()
함수 하나로 큰 숫자 형식을 쉽게 설정할 수 있습니다. - 데이터 직관성 증가: 숫자 형식을 일관되게 지정하여 데이터를 직관적으로 이해할 수 있습니다.