Skip to content

Instantly share code, notes, and snippets.

@esevan
Last active January 10, 2023 13:12
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save esevan/ced4834dd72c7ab6e003090347290e99 to your computer and use it in GitHub Desktop.
Save esevan/ced4834dd72c7ab6e003090347290e99 to your computer and use it in GitHub Desktop.
MBTI chemistry
Display the source blob
Display the rendered blob
Raw
{
"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