Link
Recent Posts
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 빅데이터분석기사
- csv병합
- 파이썬셋
- 딕셔너리
- 파이썬딕셔너리
- 빅분기
- 실기
- 행별속성합계
- konlpy
- 컨테이너
- 백준 2164
- 작업형2
- 셋
- 공빅데
- 파이썬AHP
- 파이썬입출력
- 튜플
- 리스트
- 공공빅데이터청년인턴
- 파이썬튜플
- 태블로
- 워드클라우드
- dataq
- 파이썬
- 예측모델링
- 백준1920
- 2회기출
- set시간복잡도
- 공빅데기관매칭
- 빅분기실기
- Today
- Total
Data Science
파이썬 AHP 분석 본문
AHP 값 산출¶
AHP 분석?
대안들을 두고 어느 목표에 따라 선택의 기준을 부여 할 수 있는 의사결정방법이다.
이해를 위해 간단한 예를 들어 '어떤 종류의 김밥을 먹을까?' 라는 고민이 생긴다고 해보자
만약 참치김밥, 김치김밥 두가지 선택지 뿐이라면
둘 중에 하나 고르기만 하면 되기 때문에 고민이 크게 되지 않는다.
그러나 참치김밥, 김치김밥, 야채김밥, 고추김밥, 돈까스김밥 등등.. 선택지가 많아지면 머리가 아파질 것이다.
메뉴 세가지만 한번 보자
'나는 참치보다 김치가 좋고, 김치보다 야채가 좋아, 근데 야채보단 참치가 좋은데?'라고 생각한다면 무한 선택 장애 발생의 요인이 된다.
그래서 이를 해결하기 위해
참치와 김치를 서로 두개씩만 비교한 것처럼
두개씩 짝지어 누가 얼만큼 더 좋은지 비교하여 점수 준 다음(쌍대비교)
이를 특정한 계산식을 통해서 어떤 김밥을 구매할지 결정하는 의사결정방법이라고 볼 수 있다.
In [1]:
# 필요한 라이브러리, 모듈 import
import pandas as pd
from scipy.stats.mstats import gmean
import matplotlib.pyplot as plt
쌍대비교행렬을 불러온다¶
쌍대비교행렬 : 대각의 값들이 1이다. 쌍대 비교한 a,b 와 b,a 는 서로 역수 관계로 나타내진다.
In [2]:
# 액셀을 불러와 데이터프레임으로 변환
file_name = 'AHP.xlsx'
ahp_df = pd.read_excel(file_name, index_col = 0)
ahp_df
Out[2]:
복지 | 요양 | 경로 | 대학 | 지하철 | 버스 | |
---|---|---|---|---|---|---|
복지 | 1.000000 | 1.708333 | 1.475309 | 0.195513 | 1.326923 | 1.397436 |
요양 | 0.585366 | 1.000000 | 2.665672 | 0.185410 | 1.256098 | 1.332317 |
경로 | 0.677824 | 0.375140 | 1.000000 | 0.127083 | 0.874477 | 0.914046 |
대학 | 5.114754 | 5.393443 | 7.868852 | 1.000000 | 6.754098 | 7.147541 |
지하철 | 0.753623 | 0.796117 | 1.143541 | 0.148058 | 1.000000 | 1.119159 |
버스 | 0.715596 | 0.750572 | 1.094037 | 0.139908 | 0.893528 | 1.000000 |
In [3]:
# 데이터프레임의 컬럼수 파악
colums_cnt = len(ahp_df.columns)
colums_cnt
Out[3]:
6
각 속성(컬럼)별 기하평균을 계산한다.¶
In [4]:
# 각 컬럼의 기하평균을 계산하여 리스트에 저장
geo_mean_list = []
for i in ahp_df:
geo_mean_list.append(gmean(ahp_df[i]))
In [5]:
# 기하평균 출력
print('기하평균 (Geometric mean)\n')
for i,j in zip(ahp_df, geo_mean_list):
print('{} : {}'.format(i, j))
#print('{} : {}'.format(i, round(j,3))) # 소수점 3 자리수
기하평균 (Geometric mean) 복지 : 1.015154013245876 요양 : 1.1284963968119786 경로 : 1.8392781327712266 대학 : 0.2137694418984526 지하철 : 1.4367532566196224 버스 : 1.5452283456293898
데이터프레임에 리스트를 추가¶
In [6]:
# 데이터프레임에 기하평균값 추가
ahp_df = ahp_df.append(pd.Series(geo_mean_list, index=ahp_df.columns),ignore_index=True)
ahp_df
Out[6]:
복지 | 요양 | 경로 | 대학 | 지하철 | 버스 | |
---|---|---|---|---|---|---|
0 | 1.000000 | 1.708333 | 1.475309 | 0.195513 | 1.326923 | 1.397436 |
1 | 0.585366 | 1.000000 | 2.665672 | 0.185410 | 1.256098 | 1.332317 |
2 | 0.677824 | 0.375140 | 1.000000 | 0.127083 | 0.874477 | 0.914046 |
3 | 5.114754 | 5.393443 | 7.868852 | 1.000000 | 6.754098 | 7.147541 |
4 | 0.753623 | 0.796117 | 1.143541 | 0.148058 | 1.000000 | 1.119159 |
5 | 0.715596 | 0.750572 | 1.094037 | 0.139908 | 0.893528 | 1.000000 |
6 | 1.015154 | 1.128496 | 1.839278 | 0.213769 | 1.436753 | 1.545228 |
가중치를 계산한다.¶
In [7]:
# 가중치 계산을 위하여 기하평균의 합을 구함
geo_mean_sum = sum(geo_mean_list)
geo_mean_sum
Out[7]:
7.178679586976546
In [8]:
# 각 컬럼의 가중치를 계산하여 리스트에 저장
weights_list = []
for i in range(colums_cnt):
weights_list.append(geo_mean_list[i]/geo_mean_sum)
In [9]:
# 기하평균 출력
print('가중치 (Weights)\n')
for i,j in zip(ahp_df, weights_list):
print('{} : {}'.format(i, j))
#print('{} : {}'.format(i, round(j,3))) # 소수점 3 자리수
가중치 (Weights) 복지 : 0.14141235876964803 요양 : 0.1572011096385023 경로 : 0.25621398900544573 대학 : 0.02977837906100029 지하철 : 0.20014171676169512 버스 : 0.21525244676370847
In [10]:
# 가중치 합 확인
su_ = sum(list(weights_list))
print(su_)
1.0
In [11]:
# 데이터프레임에 가중치 값 추가
ahp_df = ahp_df.append(pd.Series(weights_list, index=ahp_df.columns),ignore_index=True)
ahp_df
Out[11]:
복지 | 요양 | 경로 | 대학 | 지하철 | 버스 | |
---|---|---|---|---|---|---|
0 | 1.000000 | 1.708333 | 1.475309 | 0.195513 | 1.326923 | 1.397436 |
1 | 0.585366 | 1.000000 | 2.665672 | 0.185410 | 1.256098 | 1.332317 |
2 | 0.677824 | 0.375140 | 1.000000 | 0.127083 | 0.874477 | 0.914046 |
3 | 5.114754 | 5.393443 | 7.868852 | 1.000000 | 6.754098 | 7.147541 |
4 | 0.753623 | 0.796117 | 1.143541 | 0.148058 | 1.000000 | 1.119159 |
5 | 0.715596 | 0.750572 | 1.094037 | 0.139908 | 0.893528 | 1.000000 |
6 | 1.015154 | 1.128496 | 1.839278 | 0.213769 | 1.436753 | 1.545228 |
7 | 0.141412 | 0.157201 | 0.256214 | 0.029778 | 0.200142 | 0.215252 |
In [12]:
# 인덱스명 변경
ahp_df_result = ahp_df.rename({0:'복지', 1:'요양', 2:'경로', 3:'대학', 4:'지하철', 5:'버스',6:'기하평균',7:'가중치'}, axis=0)
ahp_df_result
Out[12]:
복지 | 요양 | 경로 | 대학 | 지하철 | 버스 | |
---|---|---|---|---|---|---|
복지 | 1.000000 | 1.708333 | 1.475309 | 0.195513 | 1.326923 | 1.397436 |
요양 | 0.585366 | 1.000000 | 2.665672 | 0.185410 | 1.256098 | 1.332317 |
경로 | 0.677824 | 0.375140 | 1.000000 | 0.127083 | 0.874477 | 0.914046 |
대학 | 5.114754 | 5.393443 | 7.868852 | 1.000000 | 6.754098 | 7.147541 |
지하철 | 0.753623 | 0.796117 | 1.143541 | 0.148058 | 1.000000 | 1.119159 |
버스 | 0.715596 | 0.750572 | 1.094037 | 0.139908 | 0.893528 | 1.000000 |
기하평균 | 1.015154 | 1.128496 | 1.839278 | 0.213769 | 1.436753 | 1.545228 |
가중치 | 0.141412 | 0.157201 | 0.256214 | 0.029778 | 0.200142 | 0.215252 |
In [13]:
# 데이터프레임을 csv로 저장
ahp_df_result.to_csv('AHP_가중치산정_결과.csv',index=True , sep=',', encoding='cp949')
In [ ]:
In [14]:
# 가중치 결과만 가지고 있는 데이터프레임 생성
ahp_df_result_weights = ahp_df_result.loc[['가중치'],['복지','요양','경로','대학','지하철','버스']]
ahp_df_result_weights
Out[14]:
복지 | 요양 | 경로 | 대학 | 지하철 | 버스 | |
---|---|---|---|---|---|---|
가중치 | 0.141412 | 0.157201 | 0.256214 | 0.029778 | 0.200142 | 0.215252 |
In [15]:
ahp_df_result_weights.T
Out[15]:
가중치 | |
---|---|
복지 | 0.141412 |
요양 | 0.157201 |
경로 | 0.256214 |
대학 | 0.029778 |
지하철 | 0.200142 |
버스 | 0.215252 |
리스트를 matplotlib으로 막대그래프를 생성¶
가중치를 변수별로 보고싶다
In [16]:
x = list(ahp_df_result_weights.columns)
y = weights_list
In [17]:
# 그래프 한글 출력을 위함
plt.rcParams['font.family'] = 'Malgun Gothic'
In [28]:
plt.bar(x, y, color=['black','black','cornflowerblue','black','cornflowerblue','black'])
plt.xlabel('시설')
plt.ylabel('가중치')
for i, v in enumerate(x):
plt.text(v, y[i],round(y[i],3), # 좌표 (x축 = v, y축 = y[0]..y[1], 표시 = y[0]..y[1])
fontsize = 9,
color='black',
horizontalalignment='center', # horizontalalignment (left, center, right)
verticalalignment='bottom', # verticalalignment (top, center, bottom)
)
plt.savefig('AHP_막대그래프',dpi=300) # 막대그래프 결과를 저장
plt.show()
In [ ]:
In [ ]:
In [ ]:
'데이터분석' 카테고리의 다른 글
SNS 텍스트 분석(konlpy) 및 워드클라우드 - 랜덤표본 (0) | 2021.10.15 |
---|---|
형태소 분석 참고 링크 (0) | 2021.09.14 |
판다스 조건에 따라 행 삭제하기 (0) | 2021.08.28 |
가중치 적용, 총점, 순위 산정, folium 으로 지도에 나타내기 (0) | 2021.08.28 |
파이썬 조건에 따라 계산된 컬럼 생성하기 (0) | 2021.08.14 |
Comments