R로 복잡한 관계도 디자인 하기(feat. DiagrammeR)
복잡한 관계를 한눈에 파악하고 싶으신가요? R의 DiagrammeR 패키지를 사용하면 전문가 수준의 관계도 디자인을 할 수 있습니다. 이 글에서는 R을 이용하여 법적 분쟁상황을 예를 들어서 아래와 같은 관계도 디자인 과정을 상세히 알아보겠습니다.
이 가이드를 통해 여러분은 R 프로그래밍의 강력함과 DiagrammeR의 유연성을 경험하게 될 것입니다. 단계별 설명과 실제 코드 예제를 통해, 데이터 시각화의 새로운 차원을 발견하실 수 있습니다. 복잡한 관계를 명확하게 표현하는 방법, 코드 최적화 팁, 그리고 전문가 수준의 그래프 생성 비결까지 이 포스트에 모두 담았습니다.
법적 소송에서 복잡한 관계에 대한 정리
우선, 어떤 상황에 대해서 관계도 디자인을 하려고 하는지 살펴보겠습니다. 자세한 이야기는 여기를 참고해 주시기 바랍니다.
- 원고(한전): 피고보조참가인(임대인)으로부터 아파트를 임차하여 임대차보증금을 반환받지 못해 소송을 제기한 당사자입니다.
- 피고(서울보증보험): 원고와 전세금보장신용보험계약을 체결했지만, 원고가 임대차보증금을 돌려받지 못하자 보험금을 지급하지 않은 당사자입니다.
- 피고보조참가인(임대인): 원고에게 아파트를 임대하였으며, 이후 소외 1에게 아파트를 매도한 당사자입니다.
- 소외 1(매수인): 피고보조참가인으로부터 아파트를 매수하고 임대인의 지위를 승계한 당사자입니다.
관계도 디자인을 위한 DiagrammeR 시작하기
DiagrammeR 패키지 설치 및 로드
R에서 관계도를 그리기 위한 첫 단계는 DiagrammeR 패키지를 설치하고 로드하는 것입니다. 다음 코드를 실행해 시작해봅시다.
# DiagrammeR 패키지를 설치합니다.
install.packages("DiagrammeR")
# 패키지를 로드합니다.
library(DiagrammeR)
관계도 구조 설정하기
기본 그래프 구조 정의
DiagrammeR에서는 DOT 언어를 사용해 그래프 구조를 정의합니다. 다음 코드로 시작해보겠습니다. 이 코드는 위에서 아래로(TB, Top to Bottom) 방향의 기본 그래프 구조를 설정합니다.
grViz("
digraph hierarchy {
graph [rankdir = TB]
node [shape = rectangle]
# 여기에 노드와 엣지를 추가할 예정입니다.
}
")
노드 정의하기
이제 그래프에 노드를 추가해 봅시다. 각 노드는 관계도의 한 요소를 나타냅니다.
#관계도의 각 요소 추가
Korean_Electric_Power_Corporation [label = '원고(임차인)\n한전']
Seoul_Guarantee_Insurance [label = '피고\n서울보증보험']
Landlord [label = '피고보조참가인\n임대인']
Buyer [label = '소외 1\n매수인']
Lease_Contract [label = '임대차계약\n보증금 미반환']
Lawsuit [label = '피고를 상대로\n소송 제기']
Contract_Succession [label = '소외 1에게\n임대차계약 승계']
Insurance_Contract [label = '보증보험계약 체결']
Insurance_Denial [label = '보험금 지급 거부']
Sale_Contract [label = '매도 계약 체결']
엣지(연결선) 정의하기
노드 간의 관계를 나타내는 엣지를 추가합니다.
#노드 간 관계 설정
Korean_Electric_Power_Corporation -> Seoul_Guarantee_Insurance [label = '전세금보장\n신용보험계약']
Korean_Electric_Power_Corporation -> Lease_Contract
Seoul_Guarantee_Insurance -> Insurance_Denial
Korean_Electric_Power_Corporation -> Lawsuit
Landlord -> Sale_Contract
Buyer -> Contract_Succession
Lease_Contract -> Lawsuit
Lawsuit -> Seoul_Guarantee_Insurance
Sale_Contract -> Buyer
Contract_Succession -> Landlord
레이아웃 최적화하기
그래프의 레이아웃을 개선하기 위해 보이지 않는 엣지를 추가합니다.
#보이지 않는 엣지로 배치 조정
edge [style = invis]
Lease_Contract -> Insurance_Contract -> Insurance_Denial -> Lawsuit -> Contract_Succession -> Sale_Contract
최종 코드 및 결과
모든 요소를 조합한 완성된 코드는 다음과 같습니다. 이 코드를 실행하면 복잡한 법적 분쟁 관계를 명확하게 보여주는 관계도가 생성됩니다.
grViz("
digraph hierarchy {
graph [rankdir = TB]
node [shape = rectangle]
Korean_Electric_Power_Corporation [label = '원고(임차인)\n한국전력공사']
Seoul_Guarantee_Insurance [label = '피고\n서울보증보험']
Landlord [label = '피고보조참가인\n임대인']
Buyer [label = '소외 1\n매수인']
Lease_Contract [label = '임대차계약\n보증금 미반환']
Lawsuit [label = '피고를 상대로\n소송 제기']
Contract_Succession [label = '소외 1에게\n임대차계약 승계']
Insurance_Contract [label = '보증보험계약 체결']
Insurance_Denial [label = '보험금 지급 거부']
Sale_Contract [label = '매도 계약 체결']
Korean_Electric_Power_Corporation -> Seoul_Guarantee_Insurance [label = '전세금보장\n신용보험계약']
Korean_Electric_Power_Corporation -> Lease_Contract
Seoul_Guarantee_Insurance -> Insurance_Denial
Korean_Electric_Power_Corporation -> Lawsuit
Landlord -> Sale_Contract
Buyer -> Contract_Succession
Lease_Contract -> Lawsuit
Lawsuit -> Seoul_Guarantee_Insurance
Sale_Contract -> Buyer
Contract_Succession -> Landlord
edge [style = invis]
Lease_Contract -> Insurance_Contract -> Insurance_Denial -> Lawsuit -> Contract_Succession -> Sale_Contract
}
")
DiagrammeR 활용 팁
코드 커스터마이징
- 노드와 엣지의 색상, 폰트, 스타일을 변경해 보세요.
- 조건부 스타일링을 적용해 특정 관계를 강조할 수 있습니다.
고급 기능 탐험
- 서브그래프를 사용해 복잡한 구조를 단순화 할 수 있습니다.
- 동적 데이터를 활용해 자동으로 업데이트되는 그래프를 만들 수 있어요.
이러한 활용 팁은 별도의 포스트를 작성해서 소개하도록 하겠습니다.
정리하기
R과 DiagrammeR 패키지를 사용해서 복잡한 관계도를 쉽고 효과적으로 만들어 보았습니다. 이 가이드를 통해 기본적인 그래프 생성부터 레이아웃 최적화까지 알 수 있었습니다.
이제 여러분만의 독특한 관계도를 만들어볼 차례입니다. 어떤 프로젝트에 DiagrammeR을 활용해보고 싶으신가요? 더 자세한 사항은 Graph/Network Visualization • DiagrammeR에서 확인해 보세요.
#전체 소스코드
R, RStudio 설치하기 – 윈도우 기준 포스트를 보시고 R의 세계로 들어와 보시기 바랍니다. 그리고 아래 코드를 복붙해서 실제로 소스코드를 실행해 보시기 바랍니다.
# DiagrammeR 패키지를 로드합니다.
library(DiagrammeR)
# grViz 함수를 사용하여 그래프를 생성합니다.
# 이 함수는 DOT 언어로 작성된 그래프 명세를 받아 시각화합니다.
grViz("
# digraph는 방향이 있는 그래프를 의미합니다.
# hierarchy는 그래프의 이름입니다.
digraph hierarchy {
# graph 속성을 설정합니다.
# rankdir = TB는 그래프의 방향을 위에서 아래로 설정합니다.
graph [rankdir = TB]
# 노드의 기본 모양을 사각형으로 설정합니다.
node [shape = rectangle]
# 각 노드를 정의합니다.
# [label = '...']는 노드에 표시될 텍스트를 지정합니다.
# \n은 줄바꿈을 의미합니다.
Korean_Electric_Power_Corporation [label = '원고(임차인)\n한국전력공사']
Seoul_Guarantee_Insurance [label = '피고\n서울보증보험']
Landlord [label = '피고보조참가인\n임대인']
Buyer [label = '소외 1\n매수인']
Lease_Contract [label = '임대차계약\n보증금 미반환']
Lawsuit [label = '피고를 상대로\n소송 제기']
Contract_Succession [label = '소외 1에게\n임대차계약 승계']
Insurance_Contract [label = '보증보험계약 체결']
Insurance_Denial [label = '보험금 지급 거부']
Sale_Contract [label = '매도 계약 체결']
# 노드 간의 관계(엣지)를 정의합니다.
# A -> B는 A에서 B로 향하는 화살표를 그립니다.
# [label = '...']는 화살표에 표시될 텍스트를 지정합니다.
Korean_Electric_Power_Corporation -> Seoul_Guarantee_Insurance [label = '전세금보장\n신용보험계약']
Korean_Electric_Power_Corporation -> Lease_Contract
Seoul_Guarantee_Insurance -> Insurance_Denial
Korean_Electric_Power_Corporation -> Lawsuit
Landlord -> Sale_Contract
Buyer -> Contract_Succession
Lease_Contract -> Lawsuit
Lawsuit -> Seoul_Guarantee_Insurance
Sale_Contract -> Buyer
Contract_Succession -> Landlord
# 보이지 않는 엣지를 추가하여 레이아웃을 조정합니다.
# style = invis는 엣지를 보이지 않게 만듭니다.
edge [style = invis]
Lease_Contract -> Insurance_Contract -> Insurance_Denial -> Lawsuit -> Contract_Succession -> Sale_Contract
}
")