간트차트 엑셀없이 만들기(feat. R & 임대차 계약 갱신)
주택임대차보호법에서 정하고 있는 계약 갱신과 해지 관련 날짜들을 텍스트만으로 파악하기란 쉽지 않습니다. 간트차트 엑셀을 이용하기도 하지만 더 쉬운 방법이 있습니다. 간트차트 만들기 소스코드 복붙 & 실행만 하시면 됩니다.
이 포스트에서는 R을 사용하여 임대차 계약 갱신 및 해지 일정을 시각화하는 방법을 알아보겠습니다. 2021년 2월 3일에 2년 계약을 체결 후 묵시적 갱신으로 계약이 연장된 경우를 가정해 보았습니다. 더불어, 집주인과 세입자가 각각 어떤 시점에 갱신 거절 통지를 해야 하는지 시각적으로 표시해 보았습니다. 여러분은 이 포스트를 통해 중요한 날짜를 명확히 파악하실 수 있을 겁니다.
간트차트 엑셀없이 만들기
시각화하려는 임대차 계약 일정은 다음과 같습니다.
- 2021년 2월 3일: 계약 시작
- 2023년 2월 2일: 계약 종료
- 2022년 8월 3일 ~ 2022년 12월 2일: 집주인/세입자가 갱신 거절 통지를 해야 하는 기간
- 2023년 5월 1일: 묵시적 갱신 이후 세입자 사유로 계약 해지 통보
- 2023년 8월 1일: 계약종료 및 보증금 내어주기
2021년 2월 3일에 2년 전세계약을 하게 되면 집주인에게 법적 인정사유 발생시 계약 종료일(2023년 2월 2일) 이전 6개월인 2022년 8월 3일부터 계약 종료일 이전 2개월인 2022년 12월 2일 사이에 갱신거절 통지를 해야 합니다. 집주인과 세입자는 개인 사정에 따라 이사를 해야 할 경우 계약 종료일 이전 2개월인 2022년 12월 2일까지는 갱신거절 통지를 해야 합니다.
이런 상황에서 묵시적 갱신으로 전세계약이 2년 더 연장되었다는 가정하에, 세입자 사유로 2023년 5월 1일에 계약해지 통보를 하게 되면 집주인은 통지를 받은 날로부터 3개월 후인 2023년 8월 1일에 보증금을 내어주어야 합니다.
이제 이 복잡한 일정에 대해서 R을 사용하여 시각화해보겠습니다.
간트차트 엑셀없이 만드는 R Code 설명
먼저, 필요한 패키지를 설치하고 로드합니다.
if (!require(ggplot2)) install.packages("ggplot2")
if (!require(dplyr)) install.packages("dplyr")
library(ggplot2)
library(dplyr)
데이터 프레임 생성
시각화할 데이터를 데이터 프레임으로 생성합니다. 각 기간과 시작 및 종료 날짜를 포함한 데이터 프레임을 만듭니다.
df <- data.frame(
Task = c("초기 계약 기간", "집주인 통지 가능 기간", "세입자 통지 가능 기간",
"갱신 계약 기간", "통보 후 3개월"),
Start = as.Date(c("2021-02-03", "2022-08-03", "2022-08-03",
"2023-02-03", "2023-05-01")),
End = as.Date(c("2023-02-02", "2022-12-02", "2022-12-02",
"2025-02-02", "2023-07-30")),
Section = c("초기 계약", "갱신 거절 통지", "갱신 거절 통지",
"갱신 계약", "계약 해지")
)
중요한 날짜 데이터 프레임 생성
중요한 날짜들을 데이터 프레임으로 만듭니다. 위에서 생성한 데이터 프레임은 틀을 잡기 위한 데이터이고 여기에 나오는 날짜들은 차트에 점선 및 날짜 레이블 표시를 위해 필요한 것입니다.
important_dates <- as.Date(c("2021-02-03", "2023-02-02", "2022-08-03", "2022-12-02",
"2023-01-02", "2023-02-03", "2025-02-02",
"2023-05-01", "2023-08-01"))
important_dates <- sort(important_dates)
날짜 레이블 위치 조정 함수 개선
날짜 레이블이 서로 겹치지 않도록 위치를 조정하는 함수를 정의합니다. 이 부분이 까다로운 부분이긴 한데, 표시하려는 날짜 레이블이 너무 가까우면 겹치게 되어서 식별에 어려움이 있기 때문에 7일 이내에 근접한 날짜를 확인해서 위아래로 분리하는 기능을 구현합니다.
adjust_label_position <- function(dates) {
n <- length(dates)
positions <- rep(0, n)
last_position <- 0
for (i in 2:n) {
if (as.numeric(dates[i] - dates[i-1]) <= 7) { # 7일 이내의 근접한 날짜 확인
positions[i] <- (last_position + 1) %% 2 # 이전 위치에 따라 상하 교대
last_position <- positions[i]
} else {
last_position <- 0
}
}
return(positions)
}
날짜 레이블 위치 조정
위에서 정의한 함수를 사용하여 날짜 레이블 위치를 조정합니다.
label_positions <- adjust_label_position(important_dates)
날짜 레이블 데이터 프레임 생성
레이블 위치를 포함한 데이터 프레임을 만듭니다.
date_labels <- data.frame(
x = important_dates,
y = length(df$Task) + 1,
label = format(important_dates, "%Y-%m-%d"),
position = label_positions
)
플롯(차트) 생성 및 출력
ggplot2를 사용하여 플롯을 생성합니다.
p <- ggplot() +
geom_segment(data = df, aes(x = Start, xend = End, y = Task, yend = Task, color = Section), size = 8) +
geom_vline(xintercept = important_dates, linetype = "dashed", color = "darkgray") +
geom_text(data = date_labels,
aes(x = x, y = y + ifelse(position == 0, -0.5, 0.5), label = label),
angle = 90, hjust = ifelse(date_labels$position == 0, 1, 0), vjust = 0.5, size = 3) +
scale_x_date(date_labels = "%Y년 %m월", date_breaks = "3 months") +
scale_y_discrete(limits = c(df$Task, "", "")) +
theme_minimal() +
labs(title = "임대차 계약 갱신 및 해지 스케쥴 (예시)",
x = "날짜", y = "") +
theme(legend.position = "bottom",
plot.title = element_text(hjust = 0.5, size = 16),
axis.text.x = element_text(angle = 45, hjust = 1),
panel.grid.minor = element_blank())
print(p)
PNG 형식으로 저장
결과 플롯을 PNG 파일로 저장합니다.
ggsave("lease_renewal_process_with_alternating_labels.png", plot = p, width = 15, height = 10, dpi = 300)
전체 소스 코드
아래는 위에서 설명한 전체 소스 코드입니다. 복붙해서 실행하시면 포스트 상단에서 보셨던 이미지를 보실 수 있습니다.
# 필요한 패키지 설치 및 로드
if (!require(ggplot2)) install.packages("ggplot2") # ggplot2 패키지가 없으면 설치
if (!require(dplyr)) install.packages("dplyr") # dplyr 패키지가 없으면 설치
library(ggplot2) # ggplot2 패키지 로드 (그래프 생성용)
library(dplyr) # dplyr 패키지 로드 (데이터 조작용)
# 데이터 프레임 생성
df <- data.frame(
Task = c("초기 계약 기간", "집주인 통지 가능 기간", "세입자 통지 가능 기간","갱신 계약 기간", "통보 후 3개월"), # 각 기간의 이름
Start = as.Date(c("2021-02-03", "2022-08-03", "2022-08-03","2023-02-03", "2023-05-01")), # 각 기간의 시작일
End = as.Date(c("2023-02-02", "2022-12-02", "2022-12-02","2025-02-02", "2023-07-30")), # 각 기간의 종료일
Section = c("초기 계약", "갱신 거절 통지", "갱신 거절 통지","갱신 계약", "계약 해지") # 각 기간의 분류
)
# 중요한 날짜 데이터 프레임 생성
important_dates <- as.Date(c("2021-02-03", "2023-02-02", "2022-08-03", "2022-12-02",
"2023-01-02", "2023-02-03", "2025-02-02",
"2023-05-01", "2023-08-01")) # 중요한 날짜들을 벡터로 정의
important_dates <- sort(important_dates) # 날짜를 오름차순으로 정렬
# 날짜 레이블 위치 조정 함수 개선
adjust_label_position <- function(dates) {
n <- length(dates)
positions <- rep(0, n) # 모든 위치를 0으로 초기화
last_position <- 0
for (i in 2:n) {
if (as.numeric(dates[i] - dates[i-1]) <= 7) { # 7일 이내의 근접한 날짜 확인
positions[i] <- (last_position + 1) %% 2 # 이전 위치에 따라 상하 교대 (0 또는 1)
last_position <- positions[i]
} else {
last_position <- 0
}
}
return(positions)
}
# 날짜 레이블 위치 조정
label_positions <- adjust_label_position(important_dates)
# 날짜 레이블 데이터 프레임 생성
date_labels <- data.frame(
x = important_dates, # x축 위치 (날짜)
y = length(df$Task) + 1, # y축 위치 (모든 Task 위에 위치)
label = format(important_dates, "%Y-%m-%d"), # 레이블 텍스트 (날짜 형식)
position = label_positions # 레이블의 상하 위치 (0 또는 1)
)
# 플롯 생성
p <- ggplot() +
geom_segment(data = df, aes(x = Start, xend = End, y = Task, yend = Task, color = Section), size = 8) +
# 각 Task에 대한 기간을 나타내는 선분. x: 시작일, xend: 종료일, y: Task 이름, color: Section으로 색상 구분
geom_vline(xintercept = important_dates, linetype = "dashed", color = "darkgray") +
# 중요한 날짜에 수직선 추가. linetype: 점선, color: 진한 회색
geom_text(data = date_labels,
aes(x = x, y = y + ifelse(position == 0, -0.5, 0.5), label = label),
angle = 90, hjust = ifelse(date_labels$position == 0, 1, 0), vjust = 0.5, size = 3) +
# 날짜 레이블 추가. x: 날짜 위치, y: Task 위 또는 아래, label: 날짜 텍스트
# angle: 90도 회전, hjust & vjust: 레이블 정렬, size: 글자 크기
scale_x_date(date_labels = "%Y년 %m월", date_breaks = "3 months") +
# x축 날짜 형식 설정. date_labels: 년월 표시 형식, date_breaks: 3개월 간격으로 눈금 표시
scale_y_discrete(limits = c(df$Task, "", "")) +
# y축 설정. limits: Task 이름들과 추가 여백 설정
theme_minimal() + # 최소한의 테마 적용
labs(title = "임대차 계약 갱신 및 해지 스케쥴 (예시)",
x = "날짜", y = "") + # 그래프 제목, x축 레이블 설정
theme(legend.position = "bottom", # 범례 위치를 아래로 설정
plot.title = element_text(hjust = 0.5, size = 16), # 제목 중앙 정렬 및 크기 설정
axis.text.x = element_text(angle = 45, hjust = 1), # x축 레이블 45도 회전
panel.grid.minor = element_blank()) # 작은 격자선 제거
# 플롯 출력
print(p)
# PNG 형식으로 저장
ggsave("lease_renewal_process_with_alternating_labels.png", plot = p, width = 15, height = 10, dpi = 300)
# 파일명, 플롯 객체, 너비, 높이, 해상도 설정
정리하기
이번 포스트에서는 R을 사용하여 임대차 계약 갱신 및 해지 일정을 시각화하는 방법을 알아보았습니다. 복잡한 계약 일정을 시각화된 스케줄 표로 표현하면 중요한 날짜를 한눈에 쉽게 파악할 수 있습니다.
먼저 필요한 패키지를 설치하고 데이터를 준비한 후, 날짜 레이블이 겹치지 않도록 조정하는 함수를 작성했습니다. 그런 다음 ggplot2를 사용하여 임대차 계약 기간과 중요한 날짜들을 포함한 시각화를 생성하고 이를 PNG 파일로 저장하는 과정을 설명했습니다.
이 시각화 기법을 활용하면 임대차 계약뿐만 아니라 다양한 일정 관리나 프로젝트 계획에서도 큰 도움을 받을 수 있습니다. 앞으로도 다양한 데이터 시각화 기법을 탐구하여 데이터의 의미를 명확하게 전달하는 방법을 연습해 보세요. 추가적으로, 시각화된 데이터를 통해 더 나은 의사결정을 할 수 있는 능력을 키워나가길 바랍니다.