Análise Exploratória dos Dados

A Análise Exploratória de Dados (EDA - Exploratory Data Analysis) é o processo de investigar os dados com estatísticas e representações gráficas para melhor compreendê-los. Utilizando técnicas para tratar valores ausentes que possam existir na base de dados, padronizar variáveis que não estão na mesma escala, identificar correlações entre elas e gerar estatísticas descritivas. A análise exploratória pode variar conforme o tipo de dados.

Na análise estatística clássica, por exemplo, há necessidade de testar hipóteses já existentes sobre o problema. Mas, em projetos de Aprendizado de Máquina raramente é conhecemos o problema por completo e hipóteses sobre ele. Como a EDA possui uma abordagem mais holística em comparação com a análise clássica, nenhuma suposição antecipada é necessária, não há perda de informação e é possível obter mais insights porque todos os dados brutos estão disponíveis para serem analisados para então começar a criar hipóteses.




1. Carregando os Dados

Tópico

1.1 Carregando Bibliotecas e Carregando os dados:

Conforme a etapa anterior, de pré-processamento dos dados, esta etapa se inicia com o conjunto de dados transformados.

Script Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as m
import seaborn as sns
%matplotlib inline
from scipy.stats import ranksums
import glob # busca os arquivos em um caminho (path)
import os
import re
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from biokit.viz import corrplot
import seaborn as sns
from sklearn.model_selection import train_test_split
import statsmodels.api as sm
from matplotlib.colors import ListedColormap
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
from PIL import Image
import pygal
df_cbo_cidadao = pd.read_csv('site/github/Dados/df_cbo_cidadao.csv')
df_prest = pd.read_csv('site/github/Dados/df_prest.csv')
%reload_ext watermark
%watermark -a "Data Scientist: Data Tree" --iversions
Author: Data Scientist: Data Tree

re : 2.2.1
biokit : 0.5.0
statsmodels: 0.12.2
PIL : 8.3.2
numpy : 1.21.2
matplotlib : 3.4.3
seaborn : 0.11.2
pandas : 1.3.3
df_cbo_cidadao.head(3)

cbo id_cidadao Cargo Carga Horária Piso Salarial Média Salarial Salário Mediana Teto Salarial Salário Hora
0 724405 0 Caldeireiro (Chapas de Cobre) 44 2224.17 2436.94 2285.8 3682.77 11.11
1 724405 657 Caldeireiro (Chapas de Cobre) 44 2224.17 2436.94 2285.8 3682.77 11.11
2 724405 1419 Caldeireiro (Chapas de Cobre) 44 2224.17 2436.94 2285.8 3682.77 11.11

Uma análise estatística das variáveis:

df_cbo_cidadao.describe()
cbo id_cidadao Carga Horária Piso Salarial Média Salarial Salário Mediana Teto Salarial Salário Hora
count 2.368206e+06 2.368206e+06 2.368206e+06 2.368206e+06 2.368206e+06 2.368206e+06 2.368206e+06 2368206.00
mean 5.662109e+05 5.538242e+04 4.318341e+01 1.520697e+03 1.666113e+03 1.499674e+03 2.517880e+03 inf
std 1.923784e+05 3.209005e+04 1.428161e+00 6.887980e+02 7.547279e+02 4.853845e+02 1.140566e+03 NaN
min 1.112200e+05 0.000000e+00 0.000000e+00 1.100000e+03 1.100000e+03 1.045000e+03 1.662350e+03 5.00
25% 4.211250e+05 2.754900e+04 4.300000e+01 1.187960e+03 1.301610e+03 1.264750e+03 1.967030e+03 6.08
50% 5.199350e+05 5.533800e+04 4.300000e+01 1.280470e+03 1.402960e+03 1.376290e+03 2.120200e+03 6.45
75% 7.711050e+05 8.308100e+04 4.400000e+01 1.589990e+03 1.742100e+03 1.538310e+03 2.632710e+03 8.01
max 9.922250e+05 1.110880e+05 4.400000e+01 2.023275e+04 2.216828e+04 2.000000e+04 3.350137e+04 inf
df_prest.head(3)
NACIONALIDADE DEFICIENCIAS BAIRRO CEP CODIGO_MUNICIPIO_IBGE NOME_MUNICIPIO UF ESCOLARIDADE ESTUDANTE CURSOS_PROFISSIONALIZANTES GRADUACOES POS_GRADUACOES IDIOMAS HABILITACAO VEICULOS DISP_VIAJAR DISP_DORMIR_EMP DISP_AUSENTAR_DOMIC PRETENSOES MUNICIPIOS_INTERESSE Estudante Veiculo Viajar Dormir_local Ausentar_Domic Nivel_esc Regiao Cidade pib percentual info Estagio Experiencia_Formal Experiencia_informal Horario
0 BRASILEIRA NaN AVENTUREIRO 89225560.0 420910 JOINVILLE SC Médio Completo N NaN NaN NaN NaN Nenhum N N N N 724405-CALDEIREIRO (CHAPAS DE COBRE)(N,6,0,Indiferente)|724435-Funileiro industrial(N,99,0,Indiferente)|731105-MONTADOR DE EQUIPAMENTOS ELETRONICOS (APARELHOS MEDICOS)(N,3,0,Comercial)|784205-Auxiliar de linha de produção(N,0,0,Indiferente) NaN 0 0 0 0 0 2 Norte joinville 30785682.0 0.064574 N,6,0,Indiferente N 6 0 Indiferente
1 BRASILEIRA NaN CENTRO 89370000.0 421220 PAPANDUVA SC Fundamental Completo N NaN NaN NaN NaN Nenhum N N N N 142305-Gerente comercial(N,166,0,Indiferente)|521110-Vendedor - no comercio de mercadorias(N,0,0,Comercial) NaN 0 0 0 0 0 1 Norte papanduva 543649.0 0.001140 N,166,0,Indiferente N 166 0 Indiferente
2 BRASILEIRA NaN BARRA DO ARIRIU 88134597.0 421190 PALHOCA SC Superior Incompleto N NaN GESTAO DE MARKETING E VENDAS NaN Espanhol Intermediário Nenhum S N S S 252525-Analista de crédito (instituições financeiras)(N,0,0,Indiferente)|421310-Assistente de cobrança(N,0,0,Indiferente)|510310-Supervisor de segurança (vigilância)(N,0,0,Indiferente)|517425-Fiscal de loja(N,30,0,Indiferente)|521110-Vendedor interno(N,56,0,Indiferente)|521115-Promotor de vendas(N,0,0,Indiferente) NaN 0 1 0 1 1 3 Grande Florianópolis palhoca 5489675.0 0.011515 N,0,0,Indiferente N 0 0 Indiferente


2. Explorando as Variáveis

2.1. Quantidade de Candidatos por Nacionalidade

Tópico
Script Python
df_nacionalidade = pd.DataFrame(df_empregos['NACIONALIDADE'].value_counts())
df_nacionalidade.reset_index(inplace=True)
df_nacionalidade = df_nacionalidade.rename(columns = {'index':'Nacionalidade', 'NACIONALIDADE':'Candidatos'})
df_nacionalidade['Percentual'] = df_nacionalidade['Candidatos'] / df_nacionalidade['Candidatos'].sum()
df_nacionalidade = df_nacionalidade.style.set_table_styles(contorno)
df_nacionalidade.format("{:7.2%}", subset=["Percentual"])

print("\n {}{:^55}{}".format(color.BOLD, 'Quantidade de Candidatos por Nacionalidade', color.END))
display(df_nacionalidade)
  Nacionalidade Candidatos Percentual
0 BRASILEIRA 107777 97.66%
1 ESTRANGEIRA 2402 2.18%
2 NATURALIZADO BRASILEIRO 103 0.09%
3 BRASILEIRO NASCIDO NO EXTERIOR 72 0.07%


2.2. Quantidade de Candidatos por Município

Tópico
Script Python df_municipio = pd.DataFrame(df_empregos['NOME_MUNICIPIO'].value_counts())
df_municipio.reset_index(inplace=True)
df_municipio = df_municipio.rename(columns ={'index':'Nacionalidade', 'NOME_MUNICIPIO':'Qtd.Candidatos'})

df_municipio['Percentual'] = df_municipio['Qtd.Candidatos'] / df_municipio['Qtd.Candidatos'].sum()
df_municipio['Acumulado'] = df_municipio['Percentual'].cumsum()
df_municipio = df_municipio.head(9)
df_municipio = df_municipio.style.set_table_styles(contorno)
df_municipio.format("{:7.2%}", subset=["Percentual", "Acumulado"])
display(df_municipio)
  Nacionalidade Qtd.Candidatos Percentual Acumulado
0 JOINVILLE 11425 10.35% 10.35%
1 FLORIANOPOLIS 8126 7.36% 17.72%
2 BLUMENAU 5555 5.03% 22.75%
3 SAO JOSE 4715 4.27% 27.02%
4 ITAJAI 3712 3.36% 30.39%
5 PALHOCA 3283 2.97% 33.36%
6 CHAPECO 3275 2.97% 36.33%
7 CRICIUMA 3102 2.81% 39.14%
8 BRUSQUE 3060 2.77% 41.91%
9 JARAGUA DO SUL 2894 2.62% 44.54%
Script Python
plt.style.use('ggplot')
plt.rcdefaults()
fig, ax = plt.subplots()

y_pos = np.arange(len(df_empregos['NOME_MUNICIPIO'].value_counts().head(15)))
values = df_empregos['NOME_MUNICIPIO'].value_counts().head(15)
segmentos = df_empregos['NOME_MUNICIPIO'].value_counts().keys()[:15]

ax.barh(y_pos, values, align='center')
ax.set_yticks(y_pos)
ax.set_yticklabels(segmentos)
ax.invert_yaxis()
ax.set_xlabel('Quantidade de Cantidados')
ax.set_title('15 cidades com maiores cquantidade de \nCandidatos em Santa Catarina')
plt.show()


2.3. Quantidade de Candidatos por Escolaridade


Tópico
Script Python
def ordem(x):
ordem_esc = {}
ordem_esc['Analfabeto'] = 1
ordem_esc['Fundamental Incompleto'] = 2
ordem_esc['Fundamental Completo'] = 3
ordem_esc['Médio Incompleto'] = 4
ordem_esc['Médio Completo'] = 5
ordem_esc['Superior Incompleto'] = 6
ordem_esc['Superior Completo'] = 7
ordem_esc['Especialização'] = 8
ordem_esc['Mestrado'] = 9
ordem_esc['Doutorado'] = 10
return ordem_esc.get(x,0)

df_escolaridade = pd.DataFrame(df_empregos['ESCOLARIDADE'].value_counts())
df_escolaridade = df_escolaridade.reset_index().rename(columns={'index':'Escolaridade', 'ESCOLARIDADE':'Qtd. Candidatos'})
df_escolaridade['ordem'] = df_escolaridade['Escolaridade'].apply(ordem)
df_escolaridade = df_escolaridade[df_escolaridade['ordem'] != 0]
df_escolaridade = df_escolaridade.sort_values('ordem')
df_escolaridade.drop('ordem', inplace=True, axis=1)
df_escolaridade = df_escolaridade.reset_index(drop=True)
print(color.BOLD+"\nRelação de escolaridade com quantidade de candidatos\n")
df_escolaridade_s = df_escolaridade.style.set_table_styles(contorno)

display(df_escolaridade_s)
  Escolaridade Qtd. Candidatos
0 Analfabeto 443
1 Fundamental Incompleto 3988
2 Fundamental Completo 13746
3 Médio Incompleto 12774
4 Médio Completo 62399
5 Superior Incompleto 7521
6 Superior Completo 8893
7 Especialização 408
8 Mestrado 80
9 Doutorado 12
Script Python eixo_x = ['Analfabeto', 'Fundamental I', 'Fundamental C', 'Médio I','Médio C','Superior I', 'Superior C',
'Especialização','Mestrado','Doutorado']
def addlabels(nivel_esc):
    for i, val in enumerate(nivel_esc):
        plt.text(i-0.25,val+2000,val)
fig = plt.figure()
ax = fig.add_axes([0,0,2,1])
ax.bar(eixo_x,df_escolaridade['Qtd. Candidatos'].tolist())
addlabels(df_escolaridade['Qtd. Candidatos'].tolist())
plt.title("Número de candidatos por Escolaridade\n")
plt.xlabel("Escolaridade")
plt.ylabel("Número de candidatos")

plt.show()


2.4. Percentual de Candidatos que são Estudantes


Tópico
Script Python
df_estudante = pd.DataFrame(df_empregos['ESTUDANTE'].value_counts()).rename(columns={'ESTUDANTE':'Estudante'})
print("\nÉ Estudante?\n")
df_estudante_s = df_estudante.style.set_table_styles(contorno)
display(df_estudante_s)
fig1, ax1 = plt.subplots()
explode = [0, 0.2]
ax1.pie(df_estudante['Estudante'], explode=explode, labels=df_estudante.index, autopct='%1.1f%%',
    shadow=True, startangle=90)
ax1.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle.

plt.show()


2.5. Quantidade de Candidatos por Quantidade de Cursos Profissionalizantes


Tópico
Script Python def cursos(x):
    if isinstance(x, str):
        n = len(x.split('|'))
        return (n if n < 8 else 8)
    else:
        return 0
df_qt_cursos = pd.DataFrame(df_empregos['CURSOS_PROFISSIONALIZANTES'].apply(cursos).value_counts()).reset_index()
df_qt_cursos = df_qt_cursos.rename(columns = {'index':'Cursos Profissionalizantes', 'CURSOS_PROFISSIONALIZANTES':'Candidatos'}).iloc[:,[1,0]]
df_qt_cursos_s = df_qt_cursos.style.set_table_styles(contorno_azul)
display(df_qt_cursos_s)
  Candidatos Cursos Profissionalizantes
0 95980 0
1 8269 1
2 2890 2
3 1499 3
4 758 4
5 427 5
6 221 6
7 191 8
8 119 7

Script Python
maior = 0
cursos_prof = []
t_pret = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
for emprego in df_empregos.values:
    aux = emprego[8]
    qtd_pret = 0
    # print(type(aux))

    if isinstance(aux, str):
        aux = aux + "|"
        ind1 = 0
        ind2 = 0
        x = len(aux)
        while ind1 < x:
            qtd_pret += 1
            ind2 = aux.find("|", ind1)
            if ind2 == 0:
                ind2 = x + 1
            cursos_prof.append(unidecode.unidecode(aux[ind1:ind2].lower()))
            ind1 = ind2 + 1

        t_pret[qtd_pret] += 1
        if qtd_pret > maior:
            maior = qtd_pret
    else:
        t_pret[0] += 1
df_x = pd.DataFrame(cursos_prof)
print(len(pd.unique(df_x[0])))
df_x.value_counts().head(15)
Quantidade
Cursos Profissionalizante
informatica basica 2398
informatica 722
vigilante 641
operador de empilhadeira 389
auxiliar administrativo 289
administracao 259
informatica avancada 210
vendas 199
secretariado 199
tecnico em administracao 173
atendente de farmacia 165
tecnico em seguranca do trabalho 156
tecnico em enfermagem 146
atendimento ao cliente 145
mopp 136


2.6. Graduações e Quantidade de Candidatos


Tópico
Script Python
import unidecode
maior = 0
graduacoes = []
t_pret = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
for emprego in df_empregos.values:
    aux = emprego[9]
    qtd_pret = 0

    if isinstance(aux, str):
        aux = aux + "|"
        ind1 = 0
        ind2 = 0
        x = len(aux)
        while ind1 < x:
            qtd_pret += 1
            ind2 = aux.find("|", ind1)
            if ind2 == 0:
                ind2 = x + 1
            graduacoes.append(unidecode.unidecode(aux[ind1:ind2].lower()))
            ind1 = ind2 + 1
        t_pret[qtd_pret] += 1
        if qtd_pret > maior:
            maior = qtd_pret
    else:
        t_pret[0] += 1

print("\n============================================\n")
print("Maior número de graduacoes por candidato: ",maior, "\n")

print("Graduações Candidatos")
for i in range(len(t_pret)):
    if t_pret[i] > 0:
        print (" ", i, "\t", " ", t_pret[i])
print("=" * 35, "\n")

print ("\nTotal de Graduacoes: ", len(graduacoes))
============================================

Maior número de graduacoes por candidato: 5

Graduações Candidatos
0 96106
1 13589
2 608
3 44
4 6
5 1
===================================
Script Python
df_x = pd.DataFrame(graduacoes)<
df_x.value_counts().head(20)
0
0
administracao 1872
direito 947
pedagogia 937
ciencias contabeis 824
educacao fisica 498
processos gerenciais 345
engenharia civil 297
psicologia 279
logistica 241
enfermagem 216
administracao de empresas 212
recursos humanos 178
adm 163
nutricao 155
gestao comercial 138
servico social 129
engenharia de producao 123
fisioterapia 120
engenharia mecanica 117
gestao financeira 113


2.7. Tipo de Habilitação


Tópico
Script Python
habilitação = df_empregos['HABILITACAO'].value_counts()
print("\nPossui que tipo de habilitação?\n")
print(habilitação)
Possui que tipo de habilitação?

Nenhum 82393
AB 15974
B 6141
AD 2087
AE 1237
AC 915
D 548
A 479
E 334
C 246
Name: HABILITACAO, dtype: int64

Script Python
habilitação = habilitação.reset_index()
hab = habilitação.copy()
hab['index'][hab['index'] != 'Nenhum'] = 'Possuem habilitação'
(hab.groupby('index')['HABILITACAO'].sum()/hab['HABILITACAO'].sum()*100).round(2)
index
Nenhum 74.66
Possuem habilitação 25.34
Name: HABILITACAO, dtype: float64
import pygal 

pie_chart = pygal.Pie(inner_radius = .5)
pie_chart.title = 'Percentual de Tipo de Carteira para \nos Candidato com habilitação'
pie_chart.add(habilitação.iloc[1,0], habilitação.iloc[1,1])
pie_chart.add(habilitação.iloc[2,0], habilitação.iloc[2,1])
pie_chart.add(habilitação.iloc[3,0], habilitação.iloc[3,1])
pie_chart.add(habilitação.iloc[4,0], habilitação.iloc[4,1])
pie_chart.add(habilitação.iloc[5,0], habilitação.iloc[5,1])
pie_chart.add(habilitação.iloc[6,0], habilitação.iloc[6,1])
pie_chart.add(habilitação.iloc[7,0], habilitação.iloc[7,1])
pie_chart.add(habilitação.iloc[8,0], habilitação.iloc[8,1])
pie_chart.add(habilitação.iloc[9,0], habilitação.iloc[9,1])

pie_chart


2.8. Em relação ao horário pretendido para trabalhar, existe diferença entre escolaridade?


Tópico
Script Python
graf = pd.DataFrame(df_prest['Horario'].value_counts().reset_index())
graf.columns = ['Horario','Quantidade']
graf1.plot(x='Horario', y='Quantidade', kind = 'bar', color = 'g')
plt.title("Opção de Horário")
plt.ylabel("Quantidade de Pessoas")
plt.xlabel("Período")


Script Python
graf2.plot(x='Horario', y='Quantidade', kind = 'bar' , color= 'g')
plt.title("Opção de Horário")
plt.ylabel("Quantidade de Pessoas")
plt.xlabel("Período")

Conforme podemos observar o gráfico acima e a tabela abaixo aproximadamente, 99.31% da população não possuem preferencia de horário de trabalho.

Script Python
hora_trab = pd.DataFrame(df_prest[['Horario']].value_counts()/df_prest.shape[0]*100).round(4)
hora_trab = hora_trab.reset_index().sort_values(by = 0, ascending = False)
hora_trab.columns = ['Hora de trabalho', 'Perc.']
hora_trab

Hora de trabalho Perc.
0 Indiferente 90.7336
1 Comercial 8.5787
2 Manhã 0.3826
3 Tarde 0.2277
4 Noite 0.0666
5 Madrugada 0.0108


2.9 Proporção Em relação ao Idiomas


Tópico
Script Python
# Idiomas

maior = 0
idiomas = []
t_pret = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
for emprego in df_prest.values:
    aux = emprego[12]
    qtd_pret = 0

    if isinstance(aux, str):
        aux = aux + "|"
        ind1 = 0
        ind2 = 0
        x = len(aux)
        while ind1 < x:
            qtd_pret += 1
            ind2 = aux.find("|", ind1)
            if ind2 == 0:
                ind2 = x + 1
            idiomas.append(unidecode.unidecode(aux[ind1:ind2].lower()))
            ind1 = ind2 + 1

        t_pret[qtd_pret] += 1
        if qtd_pret > maior:
            maior = qtd_pret
    else:
        t_pret[0] += 1

print("\n============================================\n")
print("Maior número de idiomas por candidato: ",maior, "\n")

print("Idiomas Candidatos")
for i in range(len(t_pret)):
    if t_pret[i] > 0:
        print (" ", i, "\t", " ", t_pret[i])
print("=" * 35, "\n")

print ("\nTotal de idiomas: ", len(idiomas))

============================================

Maior número de idiomas por candidato: 5

Idiomas Candidatos
0 108482
1 1886
2 623
3 87
4 7
5 4
===================================

Entendendo o nível de cada idioma.


Script Python
df_x = pd.DataFrame(idiomas)
valores = list(df_x.value_counts())
Idioma = list(df_x[0].unique())
df_idioma = pd.DataFrame({'Idioma': Idioma,
                    "Qtd": valores})
df_idioma['Nível'] = ""
for i in range(df_idioma.shape[0]):
    n = df_idioma.loc[i,'Idioma'].find(' ')
    df_idioma.loc[i,'Nível'] = df_idioma.loc[i,'Idioma'][n+1:]
    df_idioma.loc[i,'Idioma'] = df_idioma.loc[i,'Idioma'][:n]

df2 = df_idioma.groupby(['Idioma', 'Nível'])['Qtd'].sum().unstack('Nível').fillna(0)
df2.plot(kind='bar', stacked=True,
        title = 'Nível de Idiomas',
        mark_right = True)


Script Python
colunas = str(df_x.index)
colunas = colunas.replace('MultiIndex([(',"").replace(')','').replace('"','').replace('\n','').replace('(','').replace(']','').replace("'",'').replace(",,",',')
colunas = colunas.strip()
valores = list(df_x.value_counts())
Idioma = list(df_x[0].unique())
df_idioma = pd.DataFrame({'Idioma': Idioma,
                                "Qtd. Pessoas": valores})
df_idioma['Qtd. Pessoas'] = (df_idioma['Qtd. Pessoas']/df_idioma['Qtd. Pessoas'].sum()*100).round(2)
df_idioma.set_index('Idioma', inplace = True)
quantidade = []

for i in df_idioma['Qtd. Pessoas']:
    quantidade.append(i)
posicao = []
for i in range(0,10,1):
    posicao.append(i)

#criando uma figure, axes, alterando tamanho
fig, ax = plt.subplots(figsize=(15,10))
#criando o gráfico de barras
sns.barplot(y= df_idioma.index, x= df_idioma['Qtd. Pessoas'], ax=ax, data=df_idioma, palette='RdPu')
#adicionando título
ax.set_title("Quantidade de Pessoas e idiomas", fontdict={'fontsize':15})
#mudando e nome e tamanho do label x
ax.set_xlabel('Idiomas', fontdict={'fontsize':14})
#mudando tamanho do label eixo y
ax.set_ylabel('')
#mudando tamanho dos labels dos ticks
ax.tick_params(labelsize=14)
#aumentando espessura linha inferior
ax.spines['bottom'].set_linewidth(2.5)

#remoção dos outros três axis
for axis in ['top', 'right', 'left']:
    ax.spines[axis].set_color(None)

#remoção dos ticks
ax.tick_params(axis='x', labelleft=False, left=None)

#Colocando a quantidade em cada barra
for i in range(15):
    ax.text(y=posicao[i]+0.2, x=quantidade[i]+1, s=str(quantidade[i]),
            fontsize=15)

#otimizar espaço da figure
fig.tight_layout();



2.10 Qual Região mais representativo em relação ao PIB?


Tópico
Script Python
pd_reg_pib = pd.DataFrame((df_prest.groupby('Regiao')['pib'].sum()/(df_prest['pib'].sum())*100).round(2)).reset_index()

Regiao pib
0 Grande Florianópolis 19.82
1 Norte 32.48
2 Oeste 3.91
3 Serrana 1.18
4 Sul 3.44
5 Vale do Iajaí 39.17

Script Python
lebels = list(pd_reg_pib['Regiao'])
pib = list(pd_reg_pib['pib'])
pie_chart = pygal.Pie(inner_radius = .5)
pie_chart.title = 'Participação do PIB por região de Santa Catarina'
pie_chart.add(lebels[0], pib[0])
pie_chart.add(lebels[1], pib[1])
pie_chart.add(lebels[2], pib[2])
pie_chart.add(lebels[3], pib[3])
pie_chart.add(lebels[4], pib[4])
pie_chart.add(lebels[5], pib[5])

pie_chart



3. Teste de Hipótese

3.1 O salário médio de quem pretende estágio, é menor do que de quem não aceita estágio?


Tópico

Observar-se como estão distribuido o salário médio em relação as profissões:

Script Python
sal_media = df_cbo_cidadao.groupby('id_cidadao')[['Média Salarial']].agg(['min','mean','max','std'])
sal_media = sal_media.stack(level = 0)
sal_media.reset_index(inplace = True)
sal_media = sal_media[['min','mean','max','std']]
sal_media.describe()

min mean max std
count 110830.000000 110830.000000 110830.000000 109104.000000
mean 1469.924951 1675.268167 1970.384931 197.263764
std 533.645633 687.064514 1116.369441 383.647013
min 1100.000000 1115.820000 1115.820000 0.000000
25% 1273.910000 1343.815455 1402.960000 10.021851
50% 1329.950000 1444.379250 1620.670000 69.324050
75% 1446.800000 1728.010000 1961.380000 200.643891
max 22168.280000 22168.280000 22168.280000 10072.421064

Script Python
sal_media = df_prest.join(sal_media)
sal_media['mean'].dropna(inplace = True)
sns.kdeplot(sal_media['mean'], shade=True)
plt.suptitle('Histograma do salário Médio por Profissão')
plt.xlabel('Média Salarial')
bplt.show()
Script Python
sal_media['mean'].describe()

count    110830.000000
mean 1675.268167
std 687.064514
min 1115.820000
25% 1343.815455
50% 1444.379250
75% 1728.010000
max 22168.280000
Name: mean, dtype: float64

Script Python
grafic2 = sal_media[(sal_media['mean']>2000) & (sal_media['mean']<10000)]
sns.distplot(grafic2['mean'])
plt.title('Selário Médio a parti de R$ 2.000,00')

plt.show()


Script Python
salario = pd.DataFrame(
    [sal_media[sal_media['mean']<2000].shape[0]/sal_media.shape[0]*100,sal_media[sal_media['mean']>=2000].shape[0]/sal_media.shape[0]*100],
        ['Abaixo','Acima']).reset_index()
salario.columns = ['Salário (R$ 2.000,00)','Percentual']
salario.Percentual = salario.Percentual.round(2)
salario
Salário (R$ 2.000,00) Percentual
0 Abaixo 86.28
1 Acima 13.72

Script Python df_sal_media = df_prest.join(sal_media)
df_sal_media['mean'].dropna(inplace = True)
c_estagio = sal_media[sal_media['Estagio'] == "S"]
s_estagio = sal_media[sal_media['Estagio'] == "N"]
sal_media.groupby('Estagio')[['min','mean','max','std']].mean()

min mean max std
Estagio
N 1469.847048 1675.033252 1969.956665 197.102298
S 1474.869738 1690.179022 1997.568470 207.495582

Script Python
ax = sns.boxplot(x = 'max', data = c_estagio[(c_estagio['mean']< 5000)], orient = 'h')
ax.figure.set_size_inches(12, 4)
ax.set_title('Salário Médio para aquele que aceitam estágio', fontsize=18)
ax.set_xlabel('Valores Reais', fontsize=14)
ax


Script Python
ax = sns.boxplot(x = 'max', data = s_estagio[(s_estagio['mean']< 5000)], orient = 'h')
ax.figure.set_size_inches(12, 4)
ax.set_title('Salário Médio para aquele que aceitam estágio', fontsize=18)
ax.set_xlabel('Valores Reais', fontsize=14)
ax


Script Python
sns.boxplot(x='Estagio', y='max', data=df_sal_media[df_sal_media['max'] < 2000])
plt.title('Boxplot do salário Máximo pretendido\na categoria de estágio', fontsize=18)


Script Python
r = ranksums(c_estagio['mean'], s_estagio['mean'])
print('O valor do p-value é {}'.format(r.pvalue))

O valor do p-value é 0.23756193939961712

Como o teste deu um valor p-value maior que 0.05, podemos rejeitar a hipótese nula e aceitar a hipótese que o salário médio das pretenções salariais em relação a média de salário da profissão pretendida é igual para as pessoas que aceitam e rejeitam estagiar.



3.2 Em relação ao piso salarial máximo é igual para quem aceita e não aceita estágio?


Tópico
Script Python
piso_salarial = df_cbo_cidadao.groupby('id_cidadao')['Piso Salarial'].agg(['min','median','mean','max','std'])
piso_salarial = df_prest.join(piso_salarial)
c_estagio = piso_salarial[piso_salarial['Estagio'] == "S"]
s_estagio = piso_salarial[piso_salarial['Estagio'] == "N"]
r = ranksums(c_estagio['max'], s_estagio['max'])
print('O valor do p-value é {}'.format(r.pvalue))

O valor do p-value é 0.0001815241562979713



Conclusão: Conforme podemos observar no teste de hipótese, podemos rejeitar a hipótese nula e aceitar que nesta amostragem o salário médio dos pretendente que aceita estagiar seja diferente dos candidatos que não aceitam. Porém podemos aceitar a hipótese nula e considerar que o piso salarial máximo, para quem não aceita estagiar é maior em relação a participante amostral dos candidados que aceitam estagiar



3.3 O teto salarial para quem tem nível de escolaridade de superior para cima, é maior do que para quem não tem curso superior completo?


Tópico
Script Python
sal_teto = df_cbo_cidadao.groupby('id_cidadao')[['Teto Salarial']].agg(['max','std'])
sal_teto = sal_teto.stack(level = 0)
sal_teto.reset_index(inplace = True)
sal_teto = sal_teto[['max','std']]
sal_teto = df_prest.join(sal_teto)
sns.boxplot(x='Nivel_esc', y='max', data=piso_salarial[piso_salarial['max']<10000])


Script Python
pd.DataFrame(piso_salarial[['ESCOLARIDADE','Nivel_esc']].value_counts())

0
ESCOLARIDADE Nivel_esc
Médio Completo 2 62794
Fundamental Completo 1 13838
Médio Incompleto 2 12853
Superior Completo 3 8945
Superior Incompleto 3 7576
Fundamental Incompleto 1 4041
Analfabeto 0 446
Especialização 3 411
Nenhum 0 93
Mestrado 3 80
Doutorado 3 12

Script Python
classe = pd.DataFrame(piso_salarial['Nivel_esc'].value_counts()/piso_salarial.shape[0]*100).round(2).reset_index().sort_values(by = 'index', ascending = False)
classe.columns = ['Classificação Escolaridade','Percentual da População']
classe

Classificação Escolaridade Percentual da População
2 3 15.32
0 2 68.10
1 1 16.09
3 0 0.49

Teste de Hipótese entre os candidatos que possuem ensino superior e os candidade que posuuem até o ensino médio

O valor do p-value é 0.0


Script Python
c_superior = piso_salarial[piso_salarial['Nivel_esc'] == 3]
s_superior = piso_salarial[piso_salarial['Nivel_esc'] != 3]
r = ranksums(c_superior['max'], s_superior['max'])
print('O valor do p-value é {}'.format(r.pvalue))

Conforme podemos observar o teste de hipótese o resultado do p-value, não podemos rejeitar a hipótese nula, e em relação a amostra trabalhada, o salário máximo, para que possue salário superior ou acima, é maior do que os candidatos que não possuem ensino superior.



3.4 A média salarial por região e por nível de escolaridade são igual ou estatísticamente são diferentes?


Tópico
Script Python
pd.DataFrame(piso_salarial[['Regiao','Nivel_esc']].value_counts()/piso_salarial.shape[0]*100).round(2).sort_values(by = [0,'Nivel_esc'], ascending = False)

Percentual
Regiao Nivel_esc
Vale do Iajaí 2 18.87
Norte 2 15.23
Grande Florianópolis 2 12.70
Sul 2 9.96
Oeste 2 8.43
Vale do Iajaí 1 4.30
3 3.88
Norte 1 3.81
Grande Florianópolis 3 3.48
Norte 3 3.21
Serrana 2 2.90
Oeste 1 2.90
3 2.29
Grande Florianópolis 1 2.06
Sul 1 2.04
3 1.85
Serrana 1 0.98
3 0.62
Vale do Iajaí 0 0.14
Oeste 0 0.13
Norte 0 0.08
Grande Florianópolis 0 0.06
Sul 0 0.05
Serrana 0 0.02

Script Python
classes = [0,1300, 1400,1600,1800,50000]
		labels = ['Até R$ 1300,00','De R$1.300,00 a R$ 1.400,00', 
				  'De R$1.400,00 a R$ 1.600,00', 'De R$1.600,00 a R$ 1.800,00', 'Acima de 2 s.m']
		
		classe = pd.cut(x = sal_media['mean'], bins = classes, labels = labels)
		sal_media['Classificação'] = classe
		sal_media['Classificação'].value_counts(sort = False)

Até R$ 1300,00                  9185
De R$1.300,00 a R$ 1.400,00 36853
De R$1.400,00 a R$ 1.600,00 28174
De R$1.600,00 a R$ 1.800,00 13819
Acima de 2 s.m 22799
Name: Classificação, dtype: int64

Script Python labels = ['Vale do Iajaí', 'Norte', 'Sul', 'Serrana', 'Oeste',
    'Grande Florianópolis']
mapping = {Região: i for i, Região in enumerate(labels)}
key = cid_claf['Região'].map(mapping)
cid_claf = cid_claf.iloc[key.argsort()]

cid_claf.plot(kind='bar', x = 'Região')
plt.ylabel('Quantidade de Pessoas')
plt.xlabel('Região')
plt.title("Pretenção salarial por Salário mínimo e \npor Região de Santa Catarina")
plt.show()


Abaixo podemos observar o salário médio por Região:


Script Python
piso_salarial.groupby('Regiao')['mean'].mean().round(2)

Regiao
Grande Florianópolis 1545.81
Norte 1543.43
Oeste 1495.24
Serrana 1467.28
Sul 1513.60
Vale do Iajaí 1541.30
Name: mean, dtype: float64

E abaixo os resultados dos teste de hipótese de média salarial entre as regiões:


Script Python
reg_g = piso_salarial[piso_salarial['Regiao'] == 'Grande Florianópolis']
reg_n = piso_salarial[piso_salarial['Regiao'] == 'Norte']
reg_o = piso_salarial[piso_salarial['Regiao'] == 'Oeste']
reg_se = piso_salarial[piso_salarial['Regiao'] == 'Serrana']
reg_su = piso_salarial[piso_salarial['Regiao'] == 'Sul']
reg_vi = piso_salarial[piso_salarial['Regiao'] == 'Vale do Iajaí']
print("Comparando o Salário Médio entre as Regiões")
print("===========================================\n")

r = ranksums(reg_g['mean'], reg_n['mean'])
print('Entre Grande Florianópolies e a Reigão Norte \n* O valor do p-value é {}\n'.format(r.pvalue))
print("--------------------------------------------\n")

r = ranksums(reg_o['mean'], reg_se['mean'])
print('Entre Região Oeste e a Reigão Serrana \n* O valor do p-value é {}'.format(r.pvalue))
print("--------------------------------------------\n")

r = ranksums(reg_su['mean'], reg_vi['mean'])
print('Entre Região Sul e a Reigão do Vale de Itajaí \n* O valor do p-value é {}'.format(r.pvalue))
print("===========================================")

Comparando o Salário Médio entre as Regiões
===========================================

Entre Grande Florianópolies e a Reigão Norte
* O valor do p-value é 7.504534489971003e-35

--------------------------------------------

Entre Região Oeste e a Reigão Serrana
* O valor do p-value é 4.112682802233225e-12
--------------------------------------------

Entre Região Sul e a Reigão do Vale de Itajaí
* O valor do p-value é 3.5568721380093584e-14
===========================================

Devemos rejeitar a hipótese nula, não podendo afirmar que a média do piso salarial das prentenção são diferente por Região dentro do Estado de Santa Catarina, conforme nossa amostragem.


Script Python
fig = px.treemap(prest_media_salarial, path=[px.Constant("Mapeamento por: Região, Escolaridade, e Disponibilidade de Horário para trabalho"),
'Regiao_y', 'ESCOLARIDADE','Horario'], values='max')
fig.update_traces(root_color="lightgrey")
fig.update_layout(margin = dict(t=50, l=25, r=25, b=25))
fig.show()


4. Os cargos mais procurados no Estado de Santa Catarina


Script Python
prof = list(df_cbo_cidadao['Cargo'].value_counts().head(50).index)
quantidade = list(df_cbo_cidadao['Cargo'].value_counts().head(50).values)
plt.figure(figsize = (20,25))

plt.barh(prof, quantidade, color = 'green')
plt.title('50 Profissões mais escolhidas', fontsize=24)
plt.yticks(fontsize=18)
plt.xticks(fontsize=28)
plt.xlabel('Quantidade', fontsize=28)
plt.ylabel('Profissão', fontsize=28)
plt.show()


Uma outra forma de demonstrar os empregos mais procurados.


Script Python
df_cbo_cidadao['Cargo'] = df_cbo_cidadao['Cargo'].replace(" ",'_')

emprego = []

for num in range(df_cbo_cidadao.shape[0]):
    name = df_cbo_cidadao.loc[num,'Cargo'].replace(" ",'_')
    emprego.append(name)
words = emprego

all_words = ','.join(w for w in words)

stopwords = set(STOPWORDS)

wordcloud = WordCloud(stopwords=stopwords,
                        background_color='white', width=1600, #mask=mask1,
                        height=800, max_words=500, max_font_size=1000,
                        min_font_size=1).generate(all_words)

#configurando forma de apresentação do gráfico e apresentando no notebook.
fig, ax = plt.subplots(figsize=(16,8))
ax.imshow(wordcloud, interpolation='bilinear')
ax.set_axis_off()
plt.imshow(wordcloud);