다음은 PyMCDA 패키지에서 집합과 집합 함수를 다루는 튜토리얼입니다. 코드 한 줄마다 중학생도 이해할 수 있도록 최대한 친절하게 설명했습니다.
이 튜토리얼에서는 PyMCDA에서 제공하는 집합과 집합 함수를 다루는 기능을 배우고, 해시 가능한 집합(HashableSet)과 집합 함수(SetFunction) 사용 방법을 알아봅니다.
먼저, 자동 완성 기능을 사용할 수 있도록 노트북을 설정합니다.
%config Completer.use_jedi = False
mcda.set_functions 모듈에서 필요한 함수들을 불러옵니다.
from mcda.set_functions import *
해시 가능한 집합은 일반적인 파이썬 집합과 비슷하지만, hash 메서드가 정의되어 있어 사전의 키(key)로 사용할 수 있습니다.
HashableSet({"c01", "c02", "c03"})
출력:
{'c01', 'c02', 'c03'}
{ "c01", "c02", "c03" }라는 요소를 가진 HashableSet을 생성합니다. 이 집합은 키로 사용할 수 있습니다.파이썬 집합의 메서드도 동일하게 사용 가능합니다.
HashableSet({"c01", "c02", "c03"}).difference({"c02"})
출력:
{'c01', 'c03'}
difference 메서드를 사용하여 "c02" 요소를 제외한 집합을 만듭니다.HashableSet은 사전의 키로 사용할 수 있습니다.
d = {
HashableSet(): 0,
HashableSet({"c01", "c02"}): 1,
HashableSet({"c03"}): 2,
HashableSet({"c03", "c01"}): 3
}
d[HashableSet()]
출력:
0
HashableSet()으로 사전에서 값을 불러옵니다.집합 함수는 특정 집합의 모든 부분 집합에 대해 값을 정의하는 함수입니다. 예를 들어, 여러 기준(criteria)을 평가할 때, 각 기준 조합에 대해 특정 값을 할당할 수 있습니다.
다음과 같은 SetFunction을 정의합니다:
criteria = ["c01", "c02", "c03"]
f = SetFunction(
{
(): 0,
("c01",): 0.1,
("c02",): 0.2,
("c01", "c02"): 0.2,
("c03",): 0.1,
("c01", "c03"): 0.25,
("c03", "c02"): 0.5,
tuple(criteria): 1
}
)
criteria라는 리스트로 기준을 정의합니다.()는 빈 집합을 의미하고, ("c01", "c03")처럼 튜플 형태로 기준 조합을 표현합니다.f.ensemble
출력:
['c03', 'c02', 'c01']
리스트로 값을 지정하여 집합 함수를 초기화할 수도 있습니다.
f2 = SetFunction([0, 0.1, 0.2, 0.2, 0.1, 0.2, 0.5, 1], criteria)
f2
출력:
<class 'mcda.core.set_functions.SetFunction'>({...})
[0, 0.1, ... , 1]로 값을 지정하며, 각 요소는 criteria에 맞춰 자동으로 조합됩니다.집합 함수를 정의하면 사전 형식으로 값을 확인할 수 있습니다.
f2.values
출력:
{HashableSet(): 0, {0}: 0.1, {1}: 0.2, {0, 1}: 0.2, ...}
특정 기준 조합에 대한 값을 확인하고 싶을 때, f() 형태로 집합 함수를 호출할 수 있습니다.
f() # 빈 집합에 대한 값
출력:
0
f("c02")
출력:
0.2
("c02")에 해당하는 값인 0.2를 출력합니다.집합 함수는 다양한 분석에 사용됩니다. 예를 들어, 특정 조건에 따라 정의된 용량(capacity) 함수를 생성할 수 있습니다.
l = [i / 13 for i in range(14)] + [1, 1]
capacity = [0 for _ in range(len(l))]
for i, index in enumerate(HashableSet.cardinal_range(len(l))):
capacity[index] = l[i]
capacity = SetFunction(capacity)
l은 용량 값을 저장하는 리스트입니다.capacity는 집합 함수를 정의하는데 사용됩니다.집합 함수에 대한 다양한 제약 조건을 확인할 수 있습니다.
capacity.is_powerset_function
capacity.is_game
capacity.is_monotonous
capacity.is_additive
capacity.is_cardinality_based
출력:
True, True, True, False, False
is_monotonous: 함수가 단조 함수인지 여부 확인.is_additive: 함수가 가법성(additive)을 가지는지 여부 확인.현재 패키지에서는 모비우스 변환과 역 변환 기능을 지원합니다.
mobius = capacity.mobius
mobius
출력:
<class 'mcda.core.set_functions.Mobius'>({...})
mobius는 집합 함수의 모비우스 표현을 나타냅니다.모비우스 변환을 통해 집합 함수의 형태를 변환할 수 있으며, 변환의 정확도를 확인할 수 있습니다.
c = mobius.set_function
for k in capacity._values.keys():
print(f"{capacity(*k)} -> {c(*k)}")
출력:
0.0 -> 0.0
0.07692307692307693 -> 0.07692307692307693
...
모비우스 변환을 이용하여 셰이플리 값(Shapley values) 및 상호작용 지수(interaction index)와 같은 다양한 분석 지표를 계산할 수 있습니다.
mobius.shapley
mobius.interaction_index
출력:
0 0.134615
1 0.211538
...
shapley: 각 기준의 중요도를 계산하는 Shapley 값을 나타냅니다.interaction_index: 기준 간의 상호작용을 나타냅니다.이 튜토리얼에서는 PyMCDA의 집합 및 집합 함수를 사용하여 복잡한 조건과 기준을 다루는 방법을 설명했습니다. HashableSet과 SetFunction을 사용해 사전의 키로 집합을 활용하고, 집합 함수의 다양한 분석 지표를 계산하는 법을 익혔습니다.