# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

A = set([ 1, 2, 3, 3, 2])
A

B = frozenset(['H', 'T'])
B

A1 = set([1, 2, 3, 4])
A2 = set([2, 4, 6])
A3 = set([1, 2, 3])
A4 = set([2, 3, 4, 5, 6])

A1.union(A2)

A2 | A1

A1 | A2

A3.intersection(A4)

A4 & A3

A3.issubset(A1)

A3 <= A1

A3 <= A2

A3 <= A3

A3 < A3

A1.difference(A2)

A1 - A2



nullset = set([])
nullset

nullset < A1

nullset.intersection(A1)

nullset.union(A1)

all_set = set(["HH", "HT", "TH", "TT"])
all

set_2 = frozenset(set('HH'))
set_2

{frozenset(set((  ))) : 0,
frozenset(set('HH')) : 0.25,
frozenset(set('HT')) : 0.25, }

# +
{frozenset(set((  ))) : 0,
frozenset(set('HH')) : 0.3,
frozenset(set('HT')) : 0.2,
frozenset(set('TT')) : 0.3,
frozenset(set('TH')) : 0.2,
frozenset(set(['HH', 'HT'])) : 0.5,
frozenset(set(['HH', 'TT'])) : 0.5, 
frozenset(set(['HH', 'TH'])) : 0.5,
frozenset(set(['HT', 'TT'])) : 0.5,
frozenset(set(['HT', 'TH'])) : 0.5,
frozenset(set(['TT', 'TH'])) : 0.5,
frozenset(set(['HH', 'HT', 'TT'])) : 0.75,
frozenset(set(['HH', 'HT', 'TH'])) : 0.75,
frozenset(set(['HH', 'TT', 'TH'])) : 0.75,
frozenset(set(['HT', 'TT', 'TH'])) : 0.75,
frozenset(set(['HH', 'HT', 'TT', 'TH'])) : 1.0
}

print(set_1, '\n', set_2, '\n', set_3, '\n',set_4, '\n',set_5, '\n',set_6, '\n',set_7, '\n',set_8, '\n',set_9, '\n',set_10,'\n', set_11, '\n',set_12, '\n',set_13, '\n', set_14, '\n',set_15, '\n',set_16)
# -

# 연습 문제 3
#
#
#
# 1. 다음 주 친구와의 약속에서 친구가 늦을 확률
# 표본 공간 : {Y, N} 
#
# 2. 내일 아침 반찬으로 김치찌개가 나올 확률
# 표본 공간 : {"김치찌개", "부대찌개", "된장찌개"} 
#
#
# 표본의 공간 크기가 무한대인 경우
#
# 3. 다음 주 월요일 오후 1시부터 오후 2시사이에 식사를 할 확률   
# 표본 공간 :  { 1 <= x <= 2 } 사이의 실수
#
# 4. 오늘 저녁 집에 들어갔을 때, 내방 온도가 20도인 경우 
# 표본 공간 : { 5<= x <= 25 } 사이의 실수
#

{frozenset(): 0,
frozenset({2}): 0.2,
frozenset({2, 4}): 0.2,
frozenset({3}): 0.3,
frozenset({1, 2}): 0.7,
frozenset({4}): 0,
frozenset({1, 4}): 0.5,
frozenset({2, 3, 4}): 0.5,
frozenset({1, 2, 4}): 0.7,
frozenset({3, 4}): 0.3,
frozenset({2, 3}): 0.5,
frozenset({1}): 0.5,
frozenset({1, 3}): 0.8,
frozenset({1, 3, 4}): 0.8,
frozenset({1, 2, 3}): 1.0,
frozenset({1, 2, 3, 4}): 1.0}

# 시나리오 작성( = 리얼 월드를 만들어내고 있는 것.)
# 전체 12명
# 1. 남자, 23살, 긴 머리 
# 2. 여자, 15살, 짧은 머리 
# 3. 남자, 17살, 짧은 머리 
# 4. 여자, 32살, 긴 머리 
# 5. 여자, 40살, 짧은 머리
# 6. 남자, 28살, 짧은 머리
# 7. 남자, 58살, 짧은 머리
# 8. 여자, 7살, 긴 머리
# 9. 여자, 20살, 긴 머리
# 10. 남자, 11살, 짧은 머리
# 11. 남자, 21살, 긴 머리
# 12. 여자, 98살, 짧은 머리 

# $$ P(A) = \frac{6}{12} = 0.5 $$
# $$ P(B) = \frac{5}{12}$$

# #### 2. 여집합의 확률
# $$ P\{A^C\} = 1 - P\{A\} = 1 - 0.5 = 0.5,   P\{A^C\} = 0.5 $$ 
# $$ P\{B^C\} = 1 - P\{B\} = 1 - \frac{5}{12} = \frac{7}{12}, P\{B^C\} = \frac{7]{12} $$

# |  | 범인이 머리가 길다 : $P(B) = 0.5 $ | 범인이 머리가 길지 않다         |
# | :------------ | :-----------: | -------------------: |
# | 범인이 남자다 : $ P(A) = 0.6     | 2명          | 4명 |      6명 |
# | 범인이 여자다    | 3명      | 3명          | 6명
# | 계     | 5명  |   7명     | 12명    |

from pgmpy.factors.discrete import JointProbabilityDistribution as JPD

# 1. 주변확률 
#     - $ P(A) = 0.5 $
#     - $ P(B) = \frac{5}{12} $
# 2. 결합확률
#     - $ P(A, B) = \frac{2}{12} $
# 3. 조건부 확률
#     - $ P(A | B) = \frac{P(A | B)}{P(B)} = \frac{2}{5}$
# 4. 독립인가?
#     - $ P(A, B) = \frac{1}{12}, P(A)P(B) = \frac{1}{12}  $
#
# $ \therefore P(A, B)와 P(A)P(B)가 같으므로 독립이다. $

j1 = JPD(['A', 'B'], [2, 2], np.array([2, 4, 3, 3]) / 12 )
print(j1)

m1a = j1.marginal_distribution(['A'] , inplace = True)
print(m1a)

j1 = JPD(['A', 'B'], [2, 2], np.array([3, 9, 7, 1]) / 20)
print(j1)

StarcoderdataJupyterScriptsDedupFiltered