Multi Attribute Value Theory, MAVT

Sylen·2024년 11월 3일

Dive to MCDA

목록 보기
6/7

다속성 가치 이론 (Multi Attribute Value Theory, MAVT) 튜토리얼

MAVT(Multi Attribute Value Theory)는 다기준 의사결정(Multi-Criteria Decision Analysis, MCDA)에서 다양한 기준에 대한 가치를 평가하여 대안의 우선순위를 결정하는 방법입니다. 이 튜토리얼에서는 MAVT의 다양한 알고리즘과 집계 방법을 설명합니다.

기본 설정

먼저, 노트북에서 자동 완성을 사용하도록 설정합니다.

%matplotlib notebook
%config Completer.use_jedi = False

MAVT 문제 정의

MAVT 문제를 정의하려면 다음과 같은 요소가 필요합니다.

  1. 대안(Alternatives): 선택 가능한 항목들입니다.
  2. 기준(Criteria): 각 대안을 평가하는 기준입니다.
  3. 성능 테이블(Performance Table): 각 대안이 기준에 따라 어느 정도 성능을 보이는지 나타내는 표입니다.
  4. 기준 척도(Scale): 각 기준의 범위와 선호 방향을 정의합니다.

다음은 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
)

1. 가중 합산 (Weighted Sum) 집계기

가중 합산법은 가장 간단한 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)

위 코드에서는 성능 테이블을 정규화하여 각 대안의 점수를 가중치에 따라 계산합니다. 최종적으로 대안들은 점수에 따라 정렬됩니다.

2. 쇼케 통합 (Choquet Integral) 집계기

쇼케 통합은 기준 간 상호작용을 반영하는 집계 방법으로, 집합 함수를 사용해 기준의 조합에 따른 가중치를 설정합니다.

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)

3. OWA (Ordered Weighted Averaging) 집계기

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)

4. ULOWA (Uncertain Linguistic OWA)

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)

5. UTA(Utility Theory Additive)

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)

위 내용은 다기준 의사결정에서 다양한 방법을 사용해 대안을 평가하고 순위를 정하는 방법입니다.

3. OWA (Ordered Weighted Averaging) 집계기

OWA는 Ordered Weighted Averaging의 약자로, 다기준 의사결정에서 각 기준에 대해 부여된 가중치를 사용하여 대안을 평가하는 방법입니다. OWA는 주어진 기준의 값들을 정렬하고, 정렬된 값에 가중치를 부여하여 종합 점수를 계산합니다. 일반적인 가중 합산 방식과 달리, OWA는 값의 순서에 따라 가중치를 다르게 적용하여 집계합니다.

OWA의 특징

OWA는 다기준 의사결정(MCDA)에서 다음과 같은 특징을 갖습니다.
1. 정렬된 가중치 적용: 각 대안의 기준 값들을 오름차순 또는 내림차순으로 정렬한 후 가중치를 부여합니다.
2. 중간 값의 중요도 조정 가능: 최소나 최대 값을 중시할 수도 있고, 중간 값을 강조할 수도 있습니다. 예를 들어, 매우 높은 값에 가중치를 부여하거나 모든 값이 비슷한 정도로 중요하다고 할 수 있습니다.

OWA의 사용 사례

OWA는 다기준 의사결정에서 특정 기준이 아닌 종합적인 성능을 평가하고자 할 때 주로 사용됩니다. 예를 들어:

  • 주식 포트폴리오 선택: 리스크와 수익을 종합적으로 고려해 가장 안정적인 포트폴리오를 선택할 때.
  • 품질 평가: 품질 기준들을 종합적으로 평가하여 제품의 전체 품질을 평가할 때.

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 결과에서 높은 점수를 받은 대안이 주어진 기준에 따라 종합적인 성능이 좋은 것으로 평가됩니다. 예를 들어, 가장 높은 점수를 받은 대안이 품질 평가 기준들을 종합적으로 잘 만족하는 대안이라고 해석할 수 있습니다.


4. ULOWA (Uncertain Linguistic OWA)

ULOWA는 Uncertain Linguistic OWA의 약자로, 퍼지 논리(Fuzzy Logic)불확실성을 다루는 OWA 방식입니다. 일반적인 OWA와는 다르게, 퍼지 숫자(Fuzzy Numbers)를 사용하여 각 대안에 대한 불확실한 정보를 처리할 수 있습니다.

ULOWA의 특징

  1. 퍼지 숫자 기반: 각 대안의 기준 값을 퍼지 숫자로 표현하여, 모호하거나 불확실한 정보를 더 잘 반영할 수 있습니다.
  2. 퍼지 가중치 적용: 퍼지 스케일을 사용해 각 기준에 대해 가중치를 다르게 적용하고, 기준 간의 불확실한 정보도 반영하여 점수를 계산합니다.

ULOWA의 사용 사례

ULOWA는 불확실한 정보가 포함된 평가가 필요할 때 적합합니다. 예를 들어:

  • 고객 만족도 조사: 만족도 점수가 '매우 높음', '높음'처럼 명확하지 않을 때.
  • 질적 평가: 숫자로 측정하기 어려운 질적 데이터를 퍼지 숫자로 다룰 때.

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 결과는 대안의 모호한 성능을 퍼지 숫자로 표현한 점수입니다. 높은 점수를 받은 대안은 주어진 퍼지 스케일 기준에서 상대적으로 좋은 성능을 보인다고 해석할 수 있습니다.


5. UTA (Utility Theory Additive)

UTA는 Utility Theory Additive의 약자로, 유틸리티 이론에 기반한 다기준 의사결정 방법입니다. 이 방법은 사용자의 선호도에 따라 각 대안의 기준별 성능을 유틸리티 값으로 변환하고, 이를 기반으로 총점을 계산하여 대안들을 평가합니다.

UTA의 특징

  1. 유틸리티 함수: 각 기준에 대해 사용자가 선호하는 유틸리티 함수를 정의하여, 점수로 환산합니다.
  2. 순위 부여: 모든 대안을 일정한 기준에 따라 평가하고, 각 대안에 대한 선호도를 직접적인 수치로 표현합니다.

UTA의 사용 사례

UTA는 다기준 의사결정에서 각 대안의 기준별 성능이 유사하거나 매우 미세한 차이가 있을 때 정확하게 선호도를 평가하기에 적합합니다. 예를 들어:

  • 다양한 상품 비교: 가격과 성능 등 여러 기준을 통해 최적의 상품을 찾을 때.
  • 투자 포트폴리오 평가: 여러 금융 상품의 기대 수익과 리스크를 종합적으로 평가할 때.

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에 대해 학습하셨습니다. 각 방법은 다기준 의사결정에서 서로 다른 방식으로 대안을 평가하며, 평가의 기준에 따라 적절한 집계 방법을 선택하여 적용할 수 있습니다.

profile
AI가 재밌는 걸

0개의 댓글