Last active
January 10, 2023 13:12
-
-
Save esevan/ced4834dd72c7ab6e003090347290e99 to your computer and use it in GitHub Desktop.
MBTI chemistry
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np\n", | |
"import pandas as pd\n", | |
"import collections\n", | |
"import scipy.cluster.hierarchy as hcl\n", | |
"\n", | |
"from scipy.spatial.distance import squareform\n", | |
"\n", | |
"mbti_goodness = np.matrix([\n", | |
" [4, 4, 4, 5, 4, 5, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1],\n", | |
" [4, 4, 5, 4, 5, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1],\n", | |
" [4, 5, 4, 4, 4, 4, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1],\n", | |
" [5, 4, 4, 4, 4, 4, 4, 4, 5, 1, 1, 1, 1, 1, 1, 1],\n", | |
" [4, 5, 4, 4, 4, 4, 4, 5, 3, 3, 3, 3, 2, 2, 2, 2],\n", | |
" [5, 4, 4, 4, 4, 4, 5, 4, 3, 3, 3, 3, 3, 3, 3, 3],\n", | |
" [4, 4, 4, 4, 4, 5, 4, 4, 3, 3, 3, 3, 2, 2, 2, 5],\n", | |
" [4, 4, 5, 4, 5, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2],\n", | |
" [1, 1, 1, 5, 3, 3, 3, 3, 2, 2, 2, 2, 3, 5, 3, 5],\n", | |
" [1, 1, 1, 1, 3, 3, 3, 3, 2, 2, 2, 2, 5, 3, 5, 3],\n", | |
" [1, 1, 1, 1, 3, 3, 3, 3, 2, 2, 2, 2, 3, 5, 3, 5],\n", | |
" [1, 1, 1, 1, 3, 3, 3, 3, 2, 2, 2, 2, 5, 3, 5, 3],\n", | |
" [1, 1, 1, 1, 2, 3, 2, 2, 3, 5, 3, 5, 4, 4, 4, 4],\n", | |
" [1, 1, 1, 1, 2, 3, 2, 2, 5, 3, 5, 3, 4, 4, 4, 4],\n", | |
" [1, 1, 1, 1, 2, 3, 2, 2, 3, 5, 3, 5, 4, 4, 4, 4],\n", | |
" [1, 1, 1, 1, 2, 3, 5, 2, 5, 3, 5, 3, 4, 4, 4, 4]\n", | |
"])\n", | |
"\n", | |
"MBTI_MAP = dict(\n", | |
" INFP=0,\n", | |
" ENFP=1,\n", | |
" INFJ=2,\n", | |
" ENFJ=3,\n", | |
" INTJ=4,\n", | |
" ENTJ=5,\n", | |
" INTP=6,\n", | |
" ENTP=7,\n", | |
" ISFP=8,\n", | |
" ESFP=9,\n", | |
" ISTP=10,\n", | |
" ESTP=11,\n", | |
" ISFJ=12,\n", | |
" ESFJ=13,\n", | |
" ISTJ=14,\n", | |
" ESTJ=15\n", | |
")\n", | |
"\n", | |
"GOODNESS_DESC = [\n", | |
" '',\n", | |
" '진짜 궁합 최악! 지구 멸망의 길',\n", | |
" '뭐.. 최악은 면했지만 그닥..',\n", | |
" '안 맞는 것, 맞는 것 딱 반반',\n", | |
" '아주 좋은 관계가 될 수 있음!',\n", | |
" '우리 인연 영원히 뽀에버! 천생연분!'\n", | |
"]\n", | |
"\n", | |
"class MbtiAnalysis:\n", | |
" def __init__(self, member_mbti_dict):\n", | |
" self._mbti_dict = member_mbti_dict.copy()\n", | |
" self._member_num = [k for k in self._mbti_dict.keys()]\n", | |
" self._member_vibe = collections.defaultdict(dict)\n", | |
" self._member_score = collections.defaultdict(int)\n", | |
" self._mbti_inverted = collections.defaultdict(list)\n", | |
" self._linkage = None\n", | |
" \n", | |
" self._init_mbti_inverted()\n", | |
" self._init_vibe()\n", | |
" \n", | |
" def _init_mbti_inverted(self):\n", | |
" for key, value in self._mbti_dict.items():\n", | |
" self._mbti_inverted[value].append(key)\n", | |
" \n", | |
" self._mbti_inverted = [(k, v) for k, v in self._mbti_inverted.items()]\n", | |
" self._mbti_inverted.sort(key=lambda tup: len(tup[1]), reverse=True)\n", | |
" \n", | |
" \n", | |
" def _init_vibe(self):\n", | |
" for i in range(0, len(self._member_num)):\n", | |
" for j in range(0, len(self._member_num)):\n", | |
" first_member, first_member_mbti = self._get_member_mbti(i)\n", | |
" second_member, second_member_mbti = self._get_member_mbti(j)\n", | |
" goodness = mbti_goodness.item((MBTI_MAP[first_member_mbti], MBTI_MAP[second_member_mbti]))\n", | |
" self._member_score[first_member] += goodness\n", | |
" self._member_vibe[first_member][second_member] = goodness\n", | |
" \n", | |
"\n", | |
" def _get_member_mbti(self, idx):\n", | |
" return (self._member_num[idx], self._mbti_dict[self._member_num[idx]])\n", | |
" \n", | |
" @property\n", | |
" def member_score(self):\n", | |
" return sorted([(member, score) for member, score in self._member_score.items()], key=lambda tup: tup[1], reverse=True)\n", | |
" \n", | |
" @property\n", | |
" def mbti_inverted(self):\n", | |
" return self._mbti_inverted\n", | |
" \n", | |
" @property\n", | |
" def mbti_distance_matrix(self):\n", | |
" data = {}\n", | |
" idx = 0\n", | |
" for member, vibe in self._member_vibe.items():\n", | |
" data[idx] = [5 - goodness for _, goodness in vibe.items()]\n", | |
" data[idx][idx] = 0\n", | |
" idx += 1\n", | |
" \n", | |
" member_vibe = pd.DataFrame(data)\n", | |
" return member_vibe\n", | |
" \n", | |
" @property\n", | |
" def mbti_dict(self):\n", | |
" return self._member_vibe\n", | |
" \n", | |
" @property\n", | |
" def member(self):\n", | |
" return self._member_num\n", | |
" \n", | |
" def get_cluster_info(self, max_distance=2):\n", | |
" if self._linkage is None:\n", | |
" self._linkage = hcl.linkage(squareform(self.mbti_distance_matrix))\n", | |
" \n", | |
" cluster = hcl.fcluster(self._linkage, max_distance, criterion='distance')\n", | |
" \n", | |
" cluster_info = collections.defaultdict(list)\n", | |
" \n", | |
" for idx, cluster_no in enumerate(cluster):\n", | |
" cluster_info[cluster_no].append(self._member_num[idx])\n", | |
" \n", | |
" return cluster_info\n", | |
"\n", | |
" def print_vibe(self):\n", | |
" for member, vibe in self._member_vibe.items():\n", | |
" for another_member, goodness in vibe.items():\n", | |
" print(f'{member}({self._mbti_dict[member]})님 + {another_member}({self._mbti_dict[another_member]})님 = {GOODNESS_DESC[goodness]}')\n", | |
" \n", | |
" def print_score(self):\n", | |
" for member, score in self.member_score:\n", | |
" print(f'{member}: {score}')\n", | |
" \n", | |
" def print_mbti_inverted(self):\n", | |
" for mbti_type, members in self.mbti_inverted:\n", | |
" print(f'{mbti_type}: {members}')\n", | |
" \n", | |
" def print_cluster_info(self, max_distance=2):\n", | |
" cluster_info = self.get_cluster_info(max_distance)\n", | |
" for cluster_no, members in cluster_info.items():\n", | |
" print(f'+ {cluster_no} 조')\n", | |
" print(' + ', end='')\n", | |
" for member in members:\n", | |
" print(f'{member} ', end='')\n", | |
" print('')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"------MBTI 현황------\n", | |
"ESFJ: ['파트원3', '파트원6', '파트원8']\n", | |
"ENTP: ['파트원1']\n", | |
"INTJ: ['파트원2']\n", | |
"ENFP: ['파트원4']\n", | |
"INFP: ['파트원5']\n", | |
"ENFJ: ['파트원7']\n", | |
"INTP: ['파트원9']\n", | |
"------인싸 현황-------\n", | |
"파트원2: 32\n", | |
"파트원1: 31\n", | |
"파트원9: 30\n", | |
"파트원4: 28\n", | |
"파트원5: 28\n", | |
"파트원7: 28\n", | |
"파트원3: 21\n", | |
"파트원6: 21\n", | |
"파트원8: 21\n", | |
"------MBTI 궁합------\n", | |
"파트원1(ENTP)님 + 파트원1(ENTP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원1(ENTP)님 + 파트원2(INTJ)님 = 우리 인연 영원히 뽀에버! 천생연분!\n", | |
"파트원1(ENTP)님 + 파트원3(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원1(ENTP)님 + 파트원4(ENFP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원1(ENTP)님 + 파트원5(INFP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원1(ENTP)님 + 파트원6(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원1(ENTP)님 + 파트원7(ENFJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원1(ENTP)님 + 파트원8(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원1(ENTP)님 + 파트원9(INTP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원2(INTJ)님 + 파트원1(ENTP)님 = 우리 인연 영원히 뽀에버! 천생연분!\n", | |
"파트원2(INTJ)님 + 파트원2(INTJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원2(INTJ)님 + 파트원3(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원2(INTJ)님 + 파트원4(ENFP)님 = 우리 인연 영원히 뽀에버! 천생연분!\n", | |
"파트원2(INTJ)님 + 파트원5(INFP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원2(INTJ)님 + 파트원6(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원2(INTJ)님 + 파트원7(ENFJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원2(INTJ)님 + 파트원8(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원2(INTJ)님 + 파트원9(INTP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원3(ESFJ)님 + 파트원1(ENTP)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원3(ESFJ)님 + 파트원2(INTJ)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원3(ESFJ)님 + 파트원3(ESFJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원3(ESFJ)님 + 파트원4(ENFP)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원3(ESFJ)님 + 파트원5(INFP)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원3(ESFJ)님 + 파트원6(ESFJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원3(ESFJ)님 + 파트원7(ENFJ)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원3(ESFJ)님 + 파트원8(ESFJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원3(ESFJ)님 + 파트원9(INTP)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원4(ENFP)님 + 파트원1(ENTP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원4(ENFP)님 + 파트원2(INTJ)님 = 우리 인연 영원히 뽀에버! 천생연분!\n", | |
"파트원4(ENFP)님 + 파트원3(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원4(ENFP)님 + 파트원4(ENFP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원4(ENFP)님 + 파트원5(INFP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원4(ENFP)님 + 파트원6(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원4(ENFP)님 + 파트원7(ENFJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원4(ENFP)님 + 파트원8(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원4(ENFP)님 + 파트원9(INTP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원5(INFP)님 + 파트원1(ENTP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원5(INFP)님 + 파트원2(INTJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원5(INFP)님 + 파트원3(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원5(INFP)님 + 파트원4(ENFP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원5(INFP)님 + 파트원5(INFP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원5(INFP)님 + 파트원6(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원5(INFP)님 + 파트원7(ENFJ)님 = 우리 인연 영원히 뽀에버! 천생연분!\n", | |
"파트원5(INFP)님 + 파트원8(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원5(INFP)님 + 파트원9(INTP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원6(ESFJ)님 + 파트원1(ENTP)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원6(ESFJ)님 + 파트원2(INTJ)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원6(ESFJ)님 + 파트원3(ESFJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원6(ESFJ)님 + 파트원4(ENFP)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원6(ESFJ)님 + 파트원5(INFP)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원6(ESFJ)님 + 파트원6(ESFJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원6(ESFJ)님 + 파트원7(ENFJ)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원6(ESFJ)님 + 파트원8(ESFJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원6(ESFJ)님 + 파트원9(INTP)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원7(ENFJ)님 + 파트원1(ENTP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원7(ENFJ)님 + 파트원2(INTJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원7(ENFJ)님 + 파트원3(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원7(ENFJ)님 + 파트원4(ENFP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원7(ENFJ)님 + 파트원5(INFP)님 = 우리 인연 영원히 뽀에버! 천생연분!\n", | |
"파트원7(ENFJ)님 + 파트원6(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원7(ENFJ)님 + 파트원7(ENFJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원7(ENFJ)님 + 파트원8(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원7(ENFJ)님 + 파트원9(INTP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원8(ESFJ)님 + 파트원1(ENTP)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원8(ESFJ)님 + 파트원2(INTJ)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원8(ESFJ)님 + 파트원3(ESFJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원8(ESFJ)님 + 파트원4(ENFP)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원8(ESFJ)님 + 파트원5(INFP)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원8(ESFJ)님 + 파트원6(ESFJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원8(ESFJ)님 + 파트원7(ENFJ)님 = 진짜 궁합 최악! 지구 멸망의 길\n", | |
"파트원8(ESFJ)님 + 파트원8(ESFJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원8(ESFJ)님 + 파트원9(INTP)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원9(INTP)님 + 파트원1(ENTP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원9(INTP)님 + 파트원2(INTJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원9(INTP)님 + 파트원3(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원9(INTP)님 + 파트원4(ENFP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원9(INTP)님 + 파트원5(INFP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원9(INTP)님 + 파트원6(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원9(INTP)님 + 파트원7(ENFJ)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"파트원9(INTP)님 + 파트원8(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..\n", | |
"파트원9(INTP)님 + 파트원9(INTP)님 = 아주 좋은 관계가 될 수 있음!\n", | |
"-------조 추천 -------\n", | |
"+ 1 조\n", | |
" + 파트원1 파트원2 파트원4 파트원5 파트원7 파트원9 \n", | |
"+ 2 조\n", | |
" + 파트원3 파트원6 파트원8 \n" | |
] | |
} | |
], | |
"source": [ | |
"part_mbti = {\n", | |
" '파트원1': 'ENTP',\n", | |
" '파트원2': 'INTJ',\n", | |
" '파트원3': 'ESFJ',\n", | |
" '파트원4': 'ENFP',\n", | |
" '파트원5': 'INFP',\n", | |
" '파트원6': 'ESFJ',\n", | |
" '파트원7': 'ENFJ',\n", | |
" '파트원8': 'ESFJ',\n", | |
" '파트원9': 'INTP'\n", | |
"}\n", | |
"\n", | |
"analysis = MbtiAnalysis(part_mbti)\n", | |
"\n", | |
"print('------MBTI 현황------')\n", | |
"analysis.print_mbti_inverted()\n", | |
"print('------인싸 현황-------')\n", | |
"analysis.print_score()\n", | |
"print('------MBTI 궁합------')\n", | |
"analysis.print_vibe()\n", | |
"print('-------조 추천 -------')\n", | |
"analysis.print_cluster_info(1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.8.5" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 4 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment