PDSexo = ProbDist(
    Sexo_M=4,
    Sexo_F=1
)

PDSexo

"""
Explanation: Bayes, Bayes, baby
O conteúdo anterior apresentou conceitos fundamentais de Probabilidade e uma das principais ferramentas, o Teorema de Bayes. Esta seção vai acrescentar ao capítulo trazendo uma leitura e uma aplicação prática.
Dados
Considere um conjunto de dados com informações sobre pessoas (sexo, idade e renda familiar):
sexo;idade;rendafamiliar
F;20;2000
M;19;3000
M;19;3000
M;20;2500
M;21;3000
O conjunto de dados está no formato CSV (valores separados por vírgula -- nesse caso, ponto-e-vírgula). Cada linha do conjunto de dados representa um indivíduo (uma pessoa) no conjunto de dados. 
A partir desse conjunto de dados, vamos fazer algumas análises.
Imagine que uma nova pessoa respondeu a pesquisa, mas não se sabe nada dela, ainda. Qual a probabilidade de essa nova pessoa ser do sexo masculino? Para resolver essa questão, vamos utilizar as ferramentas anteriores. A primeira delas é a distribuição de probabilidade, enumerando o conjunto de dados e a quantidade de ocorrências de cada sexo.
End of explanation
"""


def sexo_m(r): return 'Sexo_M' in r
def sexo_f(r): return 'Sexo_F' in r

"""
Explanation: Na sequência, dois predicados:
End of explanation
"""


P(sexo_m, PDSexo)

"""
Explanation: Assim, podemos calcular a probabilidade de um novo indivíduo ser do sexo masculino.
End of explanation
"""


PDIdades = ProbDist(
    Idade_A=4,
    Idade_B=1,
    Idade_C=0,
    Idade_D=0
)

PDIdades

"""
Explanation: O que $0,8$ (ou $80\%$) quer dizer? Chamamos isso de probabilidade independente, pois estamos considerando que a variável "sexo" não depende de outra variável do conjunto de dados. Variável? Isso, esse é o termo usado, mas é uma coluna no conjunto de dados.
Outra forma de enxergar isso é perceber que a frequência (aqui diretamente relacionada à probabilidade) é $\frac{4}{5} = 0.8$.
\begin{align}
A = \mbox{conjunto das pessoas do sexo masculino} \
S = \mbox{conjunto das pessoas} \
P(Sexo=M) = P(A) = \frac{\mid A \mid}{\mid S \mid} = \frac{4}{5} = 0.8
\end{align}
Perceba que se fôssemos fazer uma manchete disso, ficaria mais interessante algo como:
8 em cada 10 pessoas são homens
Claro, a relação se mantém. Verifique.
Imagine que você continuou olhando para os dados e ficou curioso. De repente, vem a pergunta: e como fazer para a idade?. Talvez sua pergunta venha do fato de que tentou imaginar que seria pouco produtivo gerar a probabilidade de cada idade possível. Considerando idades entre 20 e 59 anos, por exemplo, não seria difícil gerar as probabilidades individuais para cada idade, mas isso não seria prático.
Nesses casos, a técnica é usar uma categorização da variável "idade". Assim:
* até 20 anos -> categoria A
* 21 a 30 anos -> categoria B
* 31 a 50 anos -> categoria C
* 51 anos ou mais -> categoria D
Isso começa a deixar a situação mais interessante, pois podemos encontrar as quantidades das idades conforme as categorias e gerar a distribuição de probabilidade.
End of explanation
"""


def idade_A(r) : return 'Idade_A' in r
def idade_B(r) : return 'Idade_B' in r
def idade_C(r) : return 'Idade_C' in r
def idade_D(r) : return 'Idade_D' in r

"""
Explanation: Alguns predicados:
End of explanation
"""


P(idade_B, PDIdades)

"""
Explanation: Por fim, podemos responder: qual a probabilidade de uma pessoa estar na categoria de idade B (faixa de 21 a 30 anos)?
End of explanation
"""


PDSexoIdade = joint(PDSexo, PDIdades, ' ')
PDSexoIdade

"""
Explanation: O raciocínio é o mesmo, se usarmos a contagem, a probilidade é:
\begin{align}
A = \mbox{conjunto das pessoas com idade entre 21 e 30 anos (faixa B)} \
S = \mbox{conjunto de todas as pessoas} \
P(Idade=B) = P(A) = \frac{\mid A \mid}{\mid S \mid} = \frac{1}{5} = 0.2
\end{align}
Ou, 2 em cada 10 pessoas estão na faixa de idade B (21 a 30 anos).
Suponha que alguém tenha se questionado como responder a pergunta: dado que uma pessoa está na faixa etária B, qual a probabilidade de ser homem? Para responder isso, criamos uma distribuição de probabilidade conjunta:
End of explanation
"""


P(sexo_m, tal_que(idade_B, PDSexoIdade))

"""
Explanation: Daí respondemos a pergunta calculando:
End of explanation
"""


PA = P(sexo_m, PDSexoIdade)
PE = P(idade_B, PDSexoIdade)
Prob  = PA * PE / PE

Prob

"""
Explanation: A resposta para a pergunta anterior é $80\%$. 
Outra informação importante é que a distribuição de probabilidade conjunta (resultado da função joint()) representa a distribuição de probabilidade de dois eventos ocorrerem em sequência, por isso usamos joint(PDSexo, PDIdades). O que seria joint(PDIdades, PDSexo)? Por que os valores são iguais?
Com base nessas informações podemos interpretar o resultado da seguinte forma:
End of explanation
"""


# Evidência
PE = P(idade_B, PDSexoIdade)
print('P(E) = P(Idade=B) = %.1f%%' % (PE * 100))

# Hipótese A (Sexo = F)
PA = P(sexo_f, PDSexoIdade)
print('P(A) = P(Sexo=F) = %.1f%%' % (PA * 100))

# Hipótese B (Sexo = M)
PB = P(sexo_m, PDSexoIdade)
print('P(B) = P(Sexo=M) = %.1f%%' % (PB * 100))

# Evidência, dada Hipótese A
PEA = P(idade_B, tal_que(sexo_f, PDSexoIdade))
print('P(E|A) = P(Idade=B|Sexo=F) = %.1f%%' % (PEA * 100))

# Evidência, dada Hipótese B
PEB = P(idade_B, tal_que(sexo_m, PDSexoIdade))
print('P(E|B) = P(Idade=B|Sexo=M) = %.1f%%' % (PEB * 100))

# Outra forma de encontrar P(E)
PE2 = PEA * PA + PEB * PB
print('P(E) = P(Idade=B) = %.1f%%' % (PE2 * 100))

# probabilidade desejada (Sexo = M), dada a Evidência -> P(B|E)
PBE = P(sexo_m, tal_que(idade_B, PDSexoIdade))
print('P(B|E) = P(Sexo=M|Idade=B) = %.1f%%' % (PBE * 100))

# outra forma de encontrar P(B|E)
PBE2 = PEB * PB / PE
print('P(B|E) = P(Sexo=M|Idade=B) = %.1f%%' % (PBE2 * 100))

# outra forma de encontrar P(B|E)
PBE3 = PB * PE / PE
print('P(B|E) = P(Sexo=M|Idade=B) = %.1f%%' % (PBE3 * 100))

"""
Explanation: Perceba que há um padrão nesse tipo de pergunta: "dado que" é chamado de evidência e representa a informação dada no enunciado ("dado que uma pessoa está na faixa etária B"). 
Em outras palavras, essa técnica para encontrar a probabilidade de um evento dada a ocorrência [anterior] de uma evidência é chamada probabilidade condicional ou Teorema de Bayes.
Usando o teorema de Bayes na sua forma clássica temos:
End of explanation
"""


