다음은 PyMCDA 패키지의 Preference 구조와 관련된 기능을 다루는 튜토리얼입니다. 각 코드에 상세한 설명을 추가하여 이해를 돕습니다.
이 튜토리얼에서는 Preference 구조 설정 및 관계 비교와 같은 기능을 다룹니다.
먼저, 자동 완성 기능을 사용할 수 있도록 노트북을 설정합니다.
%config Completer.use_jedi = False
관계 생성 및 사용에 필요한 라이브러리를 불러옵니다.
from pandas import Series
from mcda.relations import *
from mcda.matrices import *
from mcda.values import CommensurableValues
패키지에서는 aXb와 같은 관계를 정의하는 Relation 클래스가 있습니다. 여기서 a와 b는 비교되는 요소이며, X는 관계 유형(P: 선호, I: 무관, R: 비교 불가)을 의미합니다.
# 여러 관계를 리스트로 묶어 정의합니다.
relations0 = [P(0, 1), R(0, 1), I(0, 0)]
관계의 유효성은 생성 시 자동으로 확인되며, 잘못된 관계는 오류를 발생시킵니다.
try:
P(0, 0) # P는 irreflexive여야 하므로 오류 발생
except ValueError as e:
print(repr(e)) # 출력: ValueError('Preference relations are irreflexive: 0 == 0')
관계 간의 비교는 same_elements 메서드를 통해 가능합니다.
relations0[0].same_elements(relations0[1]) # True
같은 관계 유형과 대칭적 의미를 가진 두 관계는 동등합니다.
# 선호 관계 P는 같은 방향일 때만 동등
P(1, 0) == P(1, 0) # True
I(1, 0) == I(0, 1) # True, 무관 관계는 대칭
R(1, 0) == R(0, 1) # True, 비교 불가 관계는 대칭
P(1, 0) == P(0, 1) # False, 선호 관계는 비대칭
두 관계가 호환 가능한지 compatible 메서드로 확인할 수 있습니다.
P(0, 1).compatible(P(0, 2)) # True, 다른 요소 비교
P(0, 1).compatible(P(0, 1)) # True, 중복이지만 호환됨
P(0, 1).compatible(I(1, 0)) # False, 동일 요소에 대해 다른 관계
모든 관계를 하나의 Preference 구조로 묶을 수 있습니다.
relations = PreferenceStructure([
I(1, 0),
P(0, 2),
P(2, 4),
I(4, 3),
P(4, 5),
R(5, 6),
])
관계를 추가하여 Preference 구조를 만들 수도 있습니다.
relations1 = I(1, 0)
relations1 += P(0, 2)
relations1 += P(2, 4)
relations1 += I(4, 3)
relations1 += P(4, 5)
relations1 += I(5, 6)
잘못된 Preference 구조는 오류를 발생시킵니다.
try:
PreferenceStructure([
I(1, 0),
P(0, 2),
P(2, 4),
I(4, 3),
P(4, 5),
R(0, 1),
])
except ValueError as e:
print(repr(e)) # 출력: ValueError('incompatible relations: 1 I 0, 0 R 1')
Preference 구조 내 모든 관계를 반복할 수 있습니다.
for r in relations:
print(r)
# 출력:
# 1 I 0
# 0 P 2
# 2 P 4
# 4 I 3
# 4 P 5
# 5 R 6
관계 구조를 플로팅하여 시각적으로 확인할 수 있습니다.
relations.plot()
특정 유형(P)에 대해서만 플로팅할 수도 있습니다.
relations.typed_structures[P].plot()
구조에 포함된 요소와 관계를 확인할 수 있습니다.
relations.elements # [0, 1, 2, 3, 4, 5, 6]
relations.elements_pairs_relations[(0, 2)] # PreferenceRelation(0, 2)
Preference 구조에 전이적 관계를 추가하거나 제거할 수 있습니다.
res = relations.transitive_closure
res.transitive_reduction
관계 리스트를 outranking 행렬로 변환할 수 있습니다.
mat = relations.outranking_matrix
mat.data
mat.plot()
다시 Preference 구조로 변환할 수도 있습니다.
PreferenceStructure.from_outranking_matrix(mat)
주어진 순위를 기반으로 Preference 구조를 만들 수 있습니다.
PreferenceStructure.from_ranking(
CommensurableValues(
Series({
0: 1,
1: 1,
2: 2,
3: 3
})
)
)
이 튜토리얼은 PyMCDA의 관계 생성, 비교, 호환성 확인, 전이적 관계 계산, outranking 행렬 생성 등 기본적인 Preference 구조 설정과 관련된 기능을 다루었습니다. 각 예제를 통해 PyMCDA 패키지를 효과적으로 활용할 수 있기를 바랍니다.