<jupyter_start><jupyter_text>Desafio DIOAnálise de dados com Python e PandasDataset utilizadoSerão analisados os dados públicos de Gastos dos deputados, onde o dataset está disponível em:```https://brasil.io/dataset/gastos-deputados/files/```Dicionário dos dados disponível [neste link](https://www2.camara.leg.br/transparencia/cota-para-exercicio-da-atividade-parlamentar/explicacoes-sobre-o-formato-dos-arquivos-xml).<jupyter_code>import pandas as pd
import matplotlib.pyplot as plt
# Importa do Google Drive o arquivo comprimido em GZip
origem_dataset = '/content/drive/MyDrive/datasets/cota_parlamentar.csv.gz'
df = pd.read_csv(origem_dataset, compression='gzip', sep=',', quotechar='"', error_bad_lines=False)<jupyter_output><empty_output><jupyter_text>Análises do dataset importado<jupyter_code>df.shape
df.head(3)
df.tail()
df.dtypes
# Verificar se existem colunas com dados ausentes ou NULL
df.isnull().sum()
# Filtrar quais linhas tem Vlr Documento vazio
filtro = df["vlrdocumento"].isnull()
df.loc[filtro]
#Remover colunas sem dados de DateEmissao e Vlr Documentos, pois dados ausentes não servem para a análise
df.dropna(subset=["datemissao", "vlrdocumento"], inplace=True)
# Verificar se as linhas com dados NULL foram removidas:
df[["datemissao", "vlrdocumento"]].isnull().sum()
# Padronizar nomes dos deputados
df['txnomeparlamentar'] = df['txnomeparlamentar'].str.title()
# Vamos remover algumas colunas que não vamos usar na análise
df.drop(columns=["indtipodocumento", "numressarcimento", "txtdescricaoespecificacao", "txtpassageiro", "txttrecho", "numano", "numano"], inplace=True)
df.shape
# O dataset vai até o ano de 2020, mas os dados de 2020 estão incompletos. Vamos analisar quais Anos possuem registros, através do Group By.
# Primeiro, vamos converte o campo object que contem a data para um DateTime, e desconsiderar os valores errados (Existem anos fora do padrão) através do errors="coerce"
df["datemissao"] = pd.to_datetime(df["datemissao"], errors="coerce")
# Extraindo o Mes e o Ano da datemissao
df["ano_emissao"], df["mes_emissao"] = (df["datemissao"].dt.year, df["datemissao"].dt.month)
# Comparando os anos com registros
df.groupby(df["ano_emissao"], dropna=False).size()
# Como temos dados incorretos preenchidos inclusive NaN, foi escolhido trabalhar com os anos de 2016 à 2019
# Assim, vamos remover do dataframe os valores que não serão usados.
# Também será removido valores negativos, pois significam estornos de gastos não utilizados, como de passagens áereas
filtro1 = df["ano_emissao"] >= 2016
filtro2 = df["ano_emissao"] <= 2019
filtro3 = df["vlrliquido"] > 0
df = df[filtro1 & filtro2 & filtro3]
df<jupyter_output><empty_output><jupyter_text>Trabalhando com o datafram de 2016 à 2019<jupyter_code>df.groupby(["ano_emissao", 'mes_emissao']).size()
df.groupby(df["sgpartido"])["vlrliquido"].sum().round(0).sort_values(ascending=False)
# Gastos por partido
df.groupby(df["sgpartido"])["vlrliquido"].sum().round(2).sort_values(ascending=False).plot.bar(title="Valor x Partido", color="orange")
plt.xlabel("sgpartido")
plt.style.use("seaborn")
plt.ylabel("vlrliquido")
plt.ticklabel_format(style="plain", axis="y");
# Gastos por UF
df.groupby(df["sguf"])["vlrliquido"].sum().round(2).sort_values(ascending=True).plot.barh(title="Valor x UF", color="brown")
plt.xlabel("Valor Gasto")
plt.ylabel("Estado")
plt.ticklabel_format(style="plain", axis="x");
# Analise dos gastos
df["vlrliquido"].describe().round(2)
plt.boxplot(df["vlrliquido"]);<jupyter_output><empty_output><jupyter_text>Dataset apresentou uma distribuição irregular dos valores. Pois tivemos o 3º quartil com o valor de 674, e no gráfico Box Plot, existem vários outliers, onde devido a grande variedade destes, o gráfico ficou muito poluído.A seguir, vamos filtrar o dataframe para mostrar alguns desses outliers.<jupyter_code>df_outliers = df[df["vlrliquido"] > 75000]
df_outliers[["ano_emissao", "mes_emissao", "sgpartido", "sguf", "txnomeparlamentar", "txtdescricao", "txtfornecedor", "vlrliquido"]]
# Plotar em gráfico os deputados que estão nos outliers
df_outliers.groupby(df_outliers["txnomeparlamentar"])["vlrliquido"].sum().round(2).sort_values(ascending=True).plot.barh(title="Valores Outliers", color="red")
plt.ticklabel_format(style="plain", axis="x");
# Plotar em gráfico os deputados que estão nos outliers
df_outliers.groupby(df_outliers["txtdescricao"])["vlrliquido"].sum().round(2).sort_values(ascending=True).plot.barh(title="Valores Outliers", color="green")
plt.ticklabel_format(style="plain", axis="x");<jupyter_output><empty_output><jupyter_text>Pela análise dos outliers, é possível ver que se destacam os valores gastos para propaganda dos próprios deputados...<jupyter_code># FIM<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13140687618645855, 'fraction_numerical': 0.011811854039232229, 'mean_word_length': 7.621818181818182, 'pattern_counts': {'":': 0, '<': 22, '<?xml version=': 0, '>': 24, 'https://': 2, 'lorem ipsum': 0, 'www.': 1, 'xml': 1}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '225984', 'license': 'MIT', 'n_tokens_mistral': 1834, 'n_tokens_neox': 1736, 'n_words': 404, 'path': 'DIO_AnaliseDados_Pandas.ipynb', 'repo_name': 'romiof/Dio_Pandas', 'size': '4741'}