MAVT(Multi Attribute Value Theory)는 다기준 의사결정(Multi-Criteria Decision Analysis, MCDA)에서 다양한 기준에 대한 가치를 평가하여 대안의 우선순위를 결정하는 방법입니다. 이 튜토리얼에서는 MAVT의 다양한 알고리즘과 집계 방법을 설명합니다.
먼저, 노트북에서 자동 완성을 사용하도록 설정합니다.
%matplotlib notebook
%config Completer.use_jedi = False
MAVT 문제를 정의하려면 다음과 같은 요소가 필요합니다.
다음은 MAVT 문제의 예제로 사용되는 자동차 선택 문제입니다.
from mcda import PerformanceTable
from mcda.scales import *
from mcda.relations import *
# 대안(자동차) 목록
alternatives = [
"Peugeot 505 GR", "Opel Record 2000 LS", "Citroen Visa Super E",
"VW Golf 1300 GLS", "Citroen CX 2400 Pallas", "Mercedes 230",
"BMW 520", "Volvo 244 DL", "Peugeot 104 ZS", "Citroen Dyane"
]
# 평가 기준 목록
criteria = [
"MaximalSpeed", "ConsumptionTown", "Consumption120kmh",
"HP", "Space", "Price"
]
# 각 기준의 척도 정의
scales = {
criteria[0]: QuantitativeScale(110, 190),
criteria[1]: QuantitativeScale(7, 15, preference_direction=MIN),
criteria[2]: QuantitativeScale(6, 13, preference_direction=MIN),
criteria[3]: QuantitativeScale(3, 13),
criteria[4]: QuantitativeScale(5, 9),
criteria[5]: QuantitativeScale(20000, 80000, preference_direction=MIN)
}
# 성능 테이블 정의
performance_table = PerformanceTable(
[
[173, 11.4, 10.01, 10, 7.88, 49500],
[176, 12.3, 10.48, 11, 7.96, 46700],
[142, 8.2, 7.3, 5, 5.65, 32100],
[148, 10.5, 9.61, 7, 6.15, 39150],
[178, 14.5, 11.05, 13, 8.06, 64700],
[180, 13.6, 10.4, 13, 8.47, 75700],
[182, 12.7, 12.26, 11, 7.81, 68593],
[145, 14.3, 12.95, 11, 8.38, 55000],
[161, 8.6, 8.42, 7, 5.11, 35200],
[117, 7.2, 6.75, 3, 5.81, 24800]
],
alternatives=alternatives,
criteria=criteria,
scales=scales
)
가중 합산법은 가장 간단한 MCDA 방법 중 하나로, 각 기준에 대한 가중치를 설정하여 대안의 종합 점수를 계산합니다.
from mcda.mavt.aggregators import WeightedSum
from mcda import normalize
# 기준 가중치 설정
criteria_weights = {
criteria[0]: 1, criteria[1]: 5, criteria[2]: 2,
criteria[3]: 1, criteria[4]: 4, criteria[5]: 4
}
# 가중 합산 집계기 생성
weighted_sum = WeightedSum(criteria_weights)
# 성능 테이블을 정규화하고 가중 합산 계산
alternatives_grades = weighted_sum(normalize(performance_table))
print(alternatives_grades.data) # 결과 출력
# 대안을 점수에 따라 정렬
print(alternatives_grades.sort().data)
위 코드에서는 성능 테이블을 정규화하여 각 대안의 점수를 가중치에 따라 계산합니다. 최종적으로 대안들은 점수에 따라 정렬됩니다.
쇼케 통합은 기준 간 상호작용을 반영하는 집계 방법으로, 집합 함수를 사용해 기준의 조합에 따른 가중치를 설정합니다.
from mcda.set_functions import SetFunction
from mcda.mavt.aggregators import ChoquetIntegral
# 균등한 용량(capacity) 설정
capacity = SetFunction.uniform_capacity(criteria)
choquet_integral_capacity = ChoquetIntegral(capacity)
# 쇼케 통합 적용
alternatives_grades = choquet_integral_capacity(normalize(performance_table))
print(alternatives_grades.data)
# 점수에 따라 정렬
print(alternatives_grades.sort().data)
OWA는 각 기준의 가중치를 정렬된 순서에 따라 적용하는 방법입니다.
from mcda.mavt.aggregators import OWA
# OWA 집계기 생성
owa = OWA.and_aggregator(len(criteria))
# OWA를 사용한 성능 계산
alternatives_grades = owa(normalize(performance_table))
print(alternatives_grades.data)
# 정렬
print(alternatives_grades.sort().data)
ULOWA는 퍼지 논리 기반의 집계기입니다. 퍼지 숫자를 사용하여 불확실한 정보를 처리할 수 있습니다.
from pandas import Series
from mcda.functions import FuzzyNumber
from mcda.scales import FuzzyScale
from mcda.mavt.aggregators import ULOWA
# 퍼지 숫자와 라벨 정의
fuzzy_sets = [
FuzzyNumber([0.0, 0.0, 0.0, 2.0]),
FuzzyNumber([0.0, 2.0, 2.0, 5.0]),
FuzzyNumber([2.0, 5.0, 5.0, 6.0]),
FuzzyNumber([5.0, 6.0, 6.0, 7.0]),
FuzzyNumber([6.0, 7.0, 8.0, 9.0]),
FuzzyNumber([8.0, 9.0, 9.0, 10.0]),
FuzzyNumber([9.0, 10.0, 10.0, 10.0])
]
labels = ["VL", "L", "M", "AH", "H", "VH", "P"]
uscale = FuzzyScale(Series(fuzzy_sets, index=labels))
# 퍼지 가중치와 ULOWA 집계기 정의
uweights = [0.0, 0.0, 0.5, 0.5, 0.0]
ulowa = ULOWA(uweights, uscale)
results1 = ulowa(performance_table)
print(results1.data)
# 정렬
print(results1.sort().data)
UTA는 사용자의 선호도를 유틸리티 함수로 추정하여 각 대안을 평가하는 방법입니다.
from mcda.mavt.uta import UTA
from mcda.relations import PreferenceRelation, PreferenceStructure
# 기준별 세그먼트 수와 선호 관계 설정
criteria_segments = {
criteria[0]: 5, criteria[1]: 4, criteria[2]: 4,
criteria[3]: 5, criteria[4]: 4, criteria[5]: 5
}
relations = PreferenceStructure()
for i in range(len(alternatives)-1):
relations += PreferenceRelation(alternatives[i], alternatives[i+1])
# UTA 적용
uta = UTA(performance_table, relations, criteria_segments, delta=0.01)
value_functions = uta.disaggregate()
uta_values = value_functions(performance_table)
print(uta_values.data)
위 내용은 다기준 의사결정에서 다양한 방법을 사용해 대안을 평가하고 순위를 정하는 방법입니다.
OWA는 Ordered Weighted Averaging의 약자로, 다기준 의사결정에서 각 기준에 대해 부여된 가중치를 사용하여 대안을 평가하는 방법입니다. OWA는 주어진 기준의 값들을 정렬하고, 정렬된 값에 가중치를 부여하여 종합 점수를 계산합니다. 일반적인 가중 합산 방식과 달리, OWA는 값의 순서에 따라 가중치를 다르게 적용하여 집계합니다.
OWA는 다기준 의사결정(MCDA)에서 다음과 같은 특징을 갖습니다.
1. 정렬된 가중치 적용: 각 대안의 기준 값들을 오름차순 또는 내림차순으로 정렬한 후 가중치를 부여합니다.
2. 중간 값의 중요도 조정 가능: 최소나 최대 값을 중시할 수도 있고, 중간 값을 강조할 수도 있습니다. 예를 들어, 매우 높은 값에 가중치를 부여하거나 모든 값이 비슷한 정도로 중요하다고 할 수 있습니다.
OWA는 다기준 의사결정에서 특정 기준이 아닌 종합적인 성능을 평가하고자 할 때 주로 사용됩니다. 예를 들어:
OWA 집계기는 가중치를 정의한 후, 각 대안의 기준 값을 정렬하고 가중치를 부여하여 점수를 계산합니다.
from mcda.mavt.aggregators import OWA
from mcda import normalize
# 기준 수에 따라 'AND' 방식의 OWA 집계기를 생성합니다 (극단적인 최소값과 최대값을 중시)
owa = OWA.and_aggregator(len(criteria))
# 성능 테이블을 정규화하여 OWA 집계기를 적용합니다.
alternatives_grades = owa(normalize(performance_table))
print(alternatives_grades.data) # 대안의 점수 출력
# 점수에 따라 대안을 정렬합니다.
print(alternatives_grades.sort().data)
OWA 결과에서 높은 점수를 받은 대안이 주어진 기준에 따라 종합적인 성능이 좋은 것으로 평가됩니다. 예를 들어, 가장 높은 점수를 받은 대안이 품질 평가 기준들을 종합적으로 잘 만족하는 대안이라고 해석할 수 있습니다.
ULOWA는 Uncertain Linguistic OWA의 약자로, 퍼지 논리(Fuzzy Logic)와 불확실성을 다루는 OWA 방식입니다. 일반적인 OWA와는 다르게, 퍼지 숫자(Fuzzy Numbers)를 사용하여 각 대안에 대한 불확실한 정보를 처리할 수 있습니다.
ULOWA는 불확실한 정보가 포함된 평가가 필요할 때 적합합니다. 예를 들어:
먼저 퍼지 스케일을 정의하고, 각 기준에 대해 퍼지 숫자로 표현된 성능 테이블을 구성합니다.
from pandas import Series
from mcda.functions import FuzzyNumber
from mcda.scales import FuzzyScale
from mcda.mavt.aggregators import ULOWA
# 퍼지 숫자 정의
fuzzy_sets = [
FuzzyNumber([0.0, 0.0, 0.0, 2.0]),
FuzzyNumber([0.0, 2.0, 2.0, 5.0]),
FuzzyNumber([2.0, 5.0, 5.0, 6.0]),
FuzzyNumber([5.0, 6.0, 6.0, 7.0]),
FuzzyNumber([6.0, 7.0, 8.0, 9.0]),
FuzzyNumber([8.0, 9.0, 9.0, 10.0]),
FuzzyNumber([9.0, 10.0, 10.0, 10.0])
]
labels = ["VL", "L", "M", "AH", "H", "VH", "P"]
uscale = FuzzyScale(Series(fuzzy_sets, index=labels))
# 퍼지 가중치 설정
uweights = [0.0, 0.0, 0.5, 0.5, 0.0]
# ULOWA 집계기 생성
ulowa = ULOWA(uweights, uscale)
# ULOWA 적용
results1 = ulowa(performance_table)
print(results1.data) # 결과 출력
# 대안 정렬
print(results1.sort().data)
ULOWA 결과는 대안의 모호한 성능을 퍼지 숫자로 표현한 점수입니다. 높은 점수를 받은 대안은 주어진 퍼지 스케일 기준에서 상대적으로 좋은 성능을 보인다고 해석할 수 있습니다.
UTA는 Utility Theory Additive의 약자로, 유틸리티 이론에 기반한 다기준 의사결정 방법입니다. 이 방법은 사용자의 선호도에 따라 각 대안의 기준별 성능을 유틸리티 값으로 변환하고, 이를 기반으로 총점을 계산하여 대안들을 평가합니다.
UTA는 다기준 의사결정에서 각 대안의 기준별 성능이 유사하거나 매우 미세한 차이가 있을 때 정확하게 선호도를 평가하기에 적합합니다. 예를 들어:
UTA를 사용하려면 먼저 기준별 세그먼트 수와 대안 간의 선호 관계를 정의해야 합니다.
from mcda.mavt.uta import UTA
from mcda.relations import PreferenceRelation, PreferenceStructure
# 각 기준별 세그먼트 수 설정
criteria_segments = {
criteria[0]: 5, criteria[1]: 4, criteria[2]: 4,
criteria[3]: 5, criteria[4]: 4, criteria[5]: 5
}
# 선호 관계 정의 (대안이 이미 선호도 순으로 정렬되어 있다고 가정)
relations = PreferenceStructure()
for i in range(len(alternatives) - 1):
relations += PreferenceRelation(alternatives[i], alternatives[i + 1])
# UTA 집계기 생성
uta = UTA(performance_table, relations, criteria_segments, delta=0.01)
value_functions = uta.disaggregate()
# 대안의 유틸리티 값을 얻습니다
uta_values = value_functions(performance_table)
print(uta_values.data)
UTA 결과에서는 각 대안의 성능을 기준별로 유틸리티 함수로 환산하여 표현합니다. 높은 유틸리티 값을 가진 대안이 사용자 선호에 더 가깝다고 해석됩니다. 이를 통해 대안들의 상대적 순위를 명확하게 파악할 수 있습니다.
이 튜토리얼을 통해 OWA, ULOWA, UTA에 대해 학습하셨습니다. 각 방법은 다기준 의사결정에서 서로 다른 방식으로 대안을 평가하며, 평가의 기준에 따라 적절한 집계 방법을 선택하여 적용할 수 있습니다.