"""
# Analisando dados de sentenças criminais do TJMG
"""
"""
Os dados foram obtidos durante o [projeto de classificação de sentenças criminais utilizando aprendizado supervisionado](https://tjfacil.wordpress.com/2020/07/20/classificando-sentencas-criminais-utilizando-aprendizado-de-maquina/) e contém algumas peculiaridades:

- A classificação entre sentenças absolutórias, condenatórias e neutras foi feita utilizando aprendizado de máquinas, com um índice de acerto de 94 a 97%.
- As primeiras colunas ["total_abs", "total_con", e "total_neu"] representam o total de sentenças absolutórias, condenatórias e neutras de uma determinada vara (linha). Porém, esse número não significa a soma das demais colunas.
- As colunas relativas a crimes (por exemplo ["desacato_abs", "desacato_con" e "desacato_neu"]) referem-se à contagem do resultado de buscas textuais por aqueles crimes no banco de sentenças. Isso quer dizer, por exemplo, que as colunas referentes ao crime de desacato não contam a quantidade de sentenças em que o réu foi denunciado pelo crime de desacato, mas a quantidade de sentenças em que a palavra desacato foi encontrada.
"""
"""
Importando bibliotecas e lendo csv.
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("../input/sentencas.csv")
"""
Primeiras linhas:
"""
df.head()
"""
Primeiramente, vamos definir a coluna de varas como index, e eliminar algumas linhas de varas que estarão fora da análise. Deixaremos de analisar a 6ª e a 11ª Varas Criminais, por possuírem poucas sentenças contabilizadas no geral, e as Varas de Tóxicos, para afunilar o estudo nas Varas Criminais comuns.
"""
df.set_index("vara", drop=True, inplace=True)
df_varas = df.drop(["6", "11", "t1", "t2", "t3"])
"""
Um bom ponto de partida é analisar a distribuição geral das sentenças classificadas entre absolutórias, condenatórias e neutras. 

Como vemos, entre os dados obtidos, o índice de condenação em processos criminais que são sentenciados na comarca de Belo Horizonte é superior a 80%:
"""
df_totais = pd.DataFrame({
    "Condenações": df_varas["total_con"],
    "Absolvições": df_varas["total_abs"],
    "Neutras": df_varas["total_neu"],
})

fig, axes = plt.subplots(ncols=2, figsize=(18,6))
fig.suptitle("Condenações x Absolvições x Neutras em BH - 2014 a 2019", fontsize=16)
df_totais.sum().sort_values(ascending=False).plot.bar(ax=axes[0], rot=0)
df_totais.sum().plot.pie(ax=axes[1], autopct="%1.0f%%")
axes[1].set_ylabel("");
"""
Esse primeiro número parece exageradamente alto e cabem muitas investigações a seu respeito, que extrapolam os limites dos dados disponíveis.

Sabendo que a média geral em Belo Horizonte entre os dados obtidos é de 80%, podemos visualizar as distribuições de cada vara e compará-las com a média municipal.
"""
df_totais_normal = df_totais.div(df_totais.sum(axis=1), axis=0).multiply(100)
ax = df_totais_normal.plot.bar(figsize=(20,6), title="Condenações x Absolvições x Neutras por vara em BH - em % - 2014 a 2019", rot=0)
ax.grid("on", linewidth=.3)
ax.legend(bbox_to_anchor=(1, 1));
"""
Apesar de existir uma variação perceptível entre as varas estudadas (algumas se aproximam dos 70% de condenação enquanto outras ultrapassam os 90%), ela é insuficiente para alterar a percepção geral dos dados: o número de condenações é muito superior ao de absolvições.

Algumas varas também apresentam uma grande quantidade de sentenças neutras, o que pode indicar uma grande quantidade de casos prescritos.

Após analisar a distribuição de condenações por varas, podemos visualizar a distribuição de condenações nas sentenças que contém palavras referentes aos crimes selecionados:
"""
df_crimes = df_varas.drop(["total_abs", "total_con", "total_neu"], axis=1)
crimes = set([crime[:-4] for crime in df_crimes.columns])

df_crimes_totais = pd.DataFrame({
    crime: [df_crimes[f"{crime}_con"].sum(), df_crimes[f"{crime}_abs"].sum(), df_crimes[f"{crime}_neu"].sum()]
    for crime in crimes
}, index=["Condenações", "Absolvições", "Neutras"])

df_crimes_totais = df_crimes_totais.transpose()
df_crimes_totais = df_crimes_totais.div(df_crimes_totais.sum(axis=1), axis=0).multiply(100)
ax = df_crimes_totais.plot.bar(figsize=(20,6), rot=0, title="Condenações x Absolvições x Neutras por crime em BH - em % - 2014 a 2019")
ax.grid("on", linewidth=.3)
"""
É possível perceber que alguns crimes, como o roubo, o furto, o tráfico e a corrupão, possuem índices altíssimos de condenação, enquanto outros, como a sonegação, lavagem de dinheiro, estupro e desacato possuem índices de absolvição relativamente altos.

Os índices de condenação de crimes como furto, roubo e tráfico já são conhecidos do sistema penal brasileiro e seus clientes preferenciais. O alto índice de condenação por crimes de corrupção pode ser explicado pelos recentes episódios políticos nacionais. Ironicamente, os índices de condenação por sonegação de impostos e lavagem de dinheiros estão entre os mais baixos disponíveis.

Uma consideração a ser feita é que boa parte dos casos de sonegação e lavagem de dinheiro é julgada pela Justiça Federal, onde os dados podem ensejar análise diferentes. No TJMG, entretanto, a ironia permanece.

Em se falando dos clientes preferenciais do sistema penal, podemos visualizar a quantidade de sentenças que contém palavras referentes a cada crime estudado, para verificar quais crimes são mais frequentes nos tribunais de Minas Gerais.
"""
crimes_count = pd.Series({
    crime: df_crimes.loc[:,df_crimes.columns.str.startswith(crime)].transpose().sum().sum()
    for crime in crimes
})

crimes_count = crimes_count.div(crimes_count.sum()).multiply(100)
ax = crimes_count.sort_values(ascending=False).plot.bar(figsize=(12,6), rot=0, title="Sentenças por crime em BH - em % - 2014 a 2019")
ax.grid("on", linewidth=.3)
"""
Como esperado, processos referentes aos crimes de roubo e furto representam a maior parte dos casos julgados pela Justiça Estadual. Aqui, como antes, cabe explicar que os crimes de tráfico de drogas, e outros correlatos, são julgados em Belo Horizonte pelas Varas Especializadas em Tóxicos, que não são objeto de nossa análise nesse momento.

Prosseguindo para uma análise mais detalhada, é possível visualizar, para cada vara, a distribuição de condenações e absolvições para cada um dos crimes estudados, o que permite embasar investigações sobre as inclinações de cada juízo sobre determinados assuntos.
"""
def plot_crimes_vara_ax(vara, ax):
    df_crimes = df_varas.drop(["total_abs", "total_con", "total_neu"], axis=1)
    crimes = set([crime[:-4] for crime in df_crimes.columns])
    df_vara = df_crimes.filter(vara, axis=0)
    df_crimes_vara = pd.DataFrame({
        crime: [df_vara[f"{crime}_con"].sum(), df_vara[f"{crime}_abs"].sum(), df_vara[f"{crime}_neu"].sum()]
        for crime in crimes
    }, index=["Condenações", "Absolvições", "Neutras"])                      
    df_crimes_vara = df_crimes_vara.div(df_crimes_vara.sum()).multiply(100)
    _ax = df_crimes_vara.transpose().plot.bar(ax=ax, rot=0, title=vara)
    ax.legend(bbox_to_anchor=(1, 1))
    _ax.grid("on", linewidth=.3)
_varas = ["1", "4", "8", "9"]
fig, axes = plt.subplots(nrows=len(_varas), figsize=(20,13))
for i, vara in enumerate(_varas):
    plot_crimes_vara_ax(vara, axes[i])
"""
Com esses gráficos pode-se propor, por exemplo, que o juízo da Primeira Vara Criminal possui uma tendência a absolver os acusados em casos de desacato, lavagem de dinheiro e sonegação, enquanto o juízo da Oitava Vara Criminal mantém indíces de condenação altíssimos em todos os crimes, sendo o seu maior índice de absolvições em casos de estupro. 

Aqui ainda cabe outra observação. Como as categorias de cada crime apresentadas na verdade significam a quantidade de sentenças entre as disponíveis nas quais foram encontradas palavras sobre aquele crime, podemos atribuir significado aos números apresentados sob o título de homício, ainda que as varas estudadas não possuam competência para o julgamento de crimes culposos contra a vida. Nesse sentido, por exemplo, a palavra homicídio pode aparecer nas sentenças ao se analisar a vida pregressa do acusado, o que indica que, nesses casos, há um altíssimo grau de condenação entre todas as varas apresentadas.

Assim como fizemos acima, também é possível apresentar agrupadamente a distribuição de condenações de cada vara para os crimes estudados:
"""
def plot_varas_crime_ax(crime, ax):
    df_crime = df_crimes.loc[:, df_crimes.columns.str.startswith(crime)]
    df_crime = df_crime[[f"{crime}_con", f"{crime}_abs", f"{crime}_neu"]]
    df_crime = df_crime.rename({f"{crime}_con": "Condenações", f"{crime}_abs": "Absolvições", f"{crime}_neu": "Neutras"}, axis=1)
    df_crime = df_crime.div(df_crime.sum(axis=1), axis=0).multiply(100)
    ax = df_crime.plot.bar(ax=ax, rot=0, title=crime)
    ax.grid("on", linewidth=.3)
    ax.legend(bbox_to_anchor=(1, 1))
    ax.axes.get_xaxis().get_label().set_visible(False)
_crimes = ["corrupcao", "estelionato", "estupro", "desacato"]
fig, axes = plt.subplots(nrows=len(_crimes), figsize=(20,13))
fig.suptitle("Condenações x Absolvições x Neutras por vara - em % - 2014 a 2019", fontsize=16)
for i, crime in enumerate(_crimes):
    plot_varas_crime_ax(crime, axes[i])
"""
Com esses gráficos, visualiza-se por exemplo que a Primeira, a Quinta e a Sétima Varas Criminais possuem uma tendência maior que as demais de absolver casos de desacato, enquanto a Quinta Vara Criminal lidera as absolvições em casos que se referem ao crime de estupro.

Os dados apresentados e outros decorrentes dessa espécie de análise podem servir tanto para embasar a tomada de decisão estratégica de advogados, como também para o estudo mais aprofundado do judiciário.


"""