<jupyter_start><jupyter_text>Stack - Bootcamp de Data Science  Análise Exploratória de Dados.<jupyter_code>import pandas as pd
import datetime
import glob
from minio import Minio
import seaborn as sns
import matplotlib.pyplot as plt
client = Minio(
        "localhost:9000",
        access_key="minioadmin",
        secret_key="minioadmin",
        secure=False
    )<jupyter_output><empty_output><jupyter_text>Baixando o Dataset do Data Lake.<jupyter_code>client.fget_object(
            "processing",
            "employees_dataset.parquet",
            "temp_.parquet",
)
df = pd.read_parquet("temp_.parquet")
df.head()<jupyter_output><empty_output><jupyter_text>Organizando o dataset.<jupyter_code>df = df[['department', 'salary', 'mean_work_last_3_months',
       'number_projects', 'satisfaction_level', 'last_evaluation',
       'time_in_company', 'work_accident','left']]
df.head()<jupyter_output><empty_output><jupyter_text>Verificando os registros missing.<jupyter_code>df.isnull().sum()
df[df.notnull()]
df = df[:14998]<jupyter_output><empty_output><jupyter_text>Alterando os tipos de dados.<jupyter_code>df["number_projects"] = df["number_projects"].astype(int)
df["mean_work_last_3_months"] = df["mean_work_last_3_months"].astype(int)
df["time_in_company"] = df["time_in_company"].astype(int)
df["work_accident"] = df["work_accident"].astype(int)
df["left"] = df["left"].astype(int)
df.info()
df.head()<jupyter_output><empty_output><jupyter_text>Renomeando atributos<jupyter_code>df = df.rename(columns={'satisfaction_level': 'satisfaction', 
                        'last_evaluation': 'evaluation',
                        'number_projects': 'projectCount',
                        'mean_work_last_3_months': 'averageMonthlyHours',
                        'time_in_company': 'yearsAtCompany',
                        'work_accident': 'workAccident',
                        'left' : 'turnover'
                        })
df.head()<jupyter_output><empty_output><jupyter_text>Análise Estatística  Verificando o número de registros.<jupyter_code>df.shape<jupyter_output><empty_output><jupyter_text>Calculando a taxa de turnover<jupyter_code>turnover_rate = df.turnover.value_counts() / len(df)
turnover_rate<jupyter_output><empty_output><jupyter_text>Overview statistico dos dados.<jupyter_code>df.describe()<jupyter_output><empty_output><jupyter_text>Overview statistico por turnover.<jupyter_code>turnover_summary = df.groupby('turnover')
turnover_summary.mean()<jupyter_output><empty_output><jupyter_text>O conjunto de dados tem:- 14.998 observações de empregados e 9 atributos.- A empresa tem uma rotatividade de 24%.- A satisfação média dos empregados é de 61.-- A satisfação média dos empregados que deixaram a empresa é 51.  Calculando a matriz de correlação.<jupyter_code>corr = df.corr()
corr = (corr)
sns.heatmap(corr, 
            xticklabels=corr.columns.values,
            yticklabels=corr.columns.values)

corr<jupyter_output><empty_output><jupyter_text>Correlation Matrix & Heatmap*****Atributos com uma correlação moderada positiva:** - projectCount vs evaluation: 0.34- yearsCompany vs projectCount: 0.19**Atributos com uma correlação moderada negativa:** - satisfaction vs turnover:  -0.21**Questões:**- Quais atributos afetam nossa variável alvo (turnover)?- Existem atributos com alta correlação entre eles?- Como podemos aprofundar para entender as correlações?**Resumo:**Existe uma **correlação positiva** entre os atributos projectCount e Evaluation.Faz sentido que empregados que estão envolvidos em mais projetos, trabalham mais e tem melhor avaliação.Existe uma **correlação negativa** entre os atributos satisfaction e turnover.Podemos assumir que empregados que mais deixam a empresa estão menos satisfeitos.  Calculando distribuições dos atributos.<jupyter_code>f, axes = plt.subplots(ncols=3, figsize=(15, 6))

sns.distplot(df.satisfaction, kde=False, color="g", ax=axes[0]).set_title('Employee Satisfaction')
axes[0].set_ylabel('Employee Count')

sns.distplot(df.evaluation, kde=False, color="r", ax=axes[1]).set_title('Employee Evaluation')
axes[1].set_ylabel('Employee Count')

sns.distplot(df.averageMonthlyHours, kde=False, color="b", ax=axes[2]).set_title('Employee Average Monthly Hours')
axes[2].set_ylabel('Employee Count')
plt.show()<jupyter_output>/home/derpy/.local/lib/python3.8/site-packages/seaborn/distributions.py:2551: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms).
  warnings.warn(msg, FutureWarning)<jupyter_text>Distribuiçöes (Satisfaction - Evaluation - AverageMonthlyHours)*****Summary:** Examinando a distribuição de alguns atributos do conjunto de dados: - **Satisfaction** - Existe um pico de empregados com baixa satisfação mas a maior concentração está em 60 a 80. - **Evaluation** - Temos uma distribuição bimodal de empregados com avaliações baixas, menor que de 60 e altas, maior que 80. - **AverageMonthlyHours** - A concentração da quantidade de horas trabalhadas nos últimos 3 meses está ao redor da média em 275 horas. **Questões:**  - Existe uma razão para o pico de empregados insatisfeitos?  Verificando o turnover em relação ao salário.<jupyter_code>f, ax = plt.subplots(figsize=(15, 4))
sns.countplot(y="salary", hue='turnover', data=df).set_title('Employee Salary Turnover');<jupyter_output><empty_output><jupyter_text>Salary V.S. Turnover*****Summary:** This is not unusual. Here's what I found: - A maioria dos empregados que saíram tinha salário **baixo** ou **médio**. - Quase nenhum empregado com alto salário deixou a empresa. **Questões:**  - Como é o ambiente de trabalho? Isso se difere por salário? - O que faz empregados com alto salário sairem da empresa.  Verificando o turnover em relação departamento.<jupyter_code>f, ax = plt.subplots(figsize=(15, 5))
color_types = ['#78C850','#F08030','#6890F0','#A8B820','#A8A878','#A040A0','#F8D030',  
                '#E0C068','#EE99AC','#C03028','#F85888','#B8A038','#705898','#98D8D8','#7038F8']
plt.xticks(rotation=-45)

sns.countplot(x='department', data=df, palette=color_types).set_title('Distribuição de Departamentos');
f, ax = plt.subplots(figsize=(15, 5))
sns.countplot(y="department", hue='turnover', data=df).set_title('Departamento vs Turnover');<jupyter_output><empty_output><jupyter_text>Department V.S. Turnover *****Resumo:** Vamos ver mais informações sobre os departamentos da empresa. - Os departamentos de vendas, técnico e suporte são top 3 departamentos com maior índice de turnover. - O departamento management tem o menor volume de turnover.**Questões:**  - Será que examinar em profundidade os departamentos que tem maior índice de turnover e o menor pode nos revelar mais    informações importantes? - Qual o salário nestes departamentos?  Verificando o turnover em relação ao número de projetos.<jupyter_code>fig = plt.figure(figsize=(8,4),)
ax = sns.barplot(x="projectCount", y="projectCount", hue="turnover", data=df, estimator=lambda x: len(x) / len(df) * 100)
ax.set(ylabel="Percent")
plt.title('Turnover vs número de projetos')
plt.plot()<jupyter_output><empty_output><jupyter_text>Turnover V.S. ProjectCount *****Resumo:** Insights interessantes que encontramos aqui: - Mais da metade dos empregados com **2,6 e 7 projetos** deixam a empresa. - A maioria dos empregados que permancem na empresa estão envolvidos de **3 à 5 projetos**. - Todos os empregados que estavam inseridos **7 projetos** deixaram a empresa. - Existe uma pequena **tendência de crescimento no índice de turnover** em relação à quantidade de projetos. **Questões:** - Porque os empregados estão deixando a empresa em relação a quantidade de projetos ? - Será que faz sentido pensar que empregados envolvidos em 2 ou menos projetos estão desmotivados e por isso deixam a empresa? - Será que empregados envolvidos em mais que 6 projetos se sintam sobrecarregados e deixam a empresa?  Verificando o turnover em relação a nota de avaliação.<jupyter_code>fig = plt.figure(figsize=(15,4),)
ax=sns.kdeplot(df.loc[(df['turnover'] == 0),'evaluation'] , color='b',shade=True,label='no turnover')
ax=sns.kdeplot(df.loc[(df['turnover'] == 1),'evaluation'] , color='r',shade=True, label='turnover')
ax.set(xlabel='Employee Evaluation', ylabel='Frequency')
plt.title('Distribuição da Nota de Avaliação do Empregado - Turnover V.S. No Turnover')
plt.plot()<jupyter_output><empty_output><jupyter_text>Turnover V.S. Evaluation *****Resumo:**  - Temos uma distribuição bimodal para o conjunto que deixou a empresa. - Colaboradores com **baixa performance** tendem a deixar a empresa. - Colaboradores com **alta performance** tendem a deixar a empresa. - O **ponto ideal** para os funcionários que permaneceram está dentro da avaliação de 60 à 80.  Verificando o turnover em relação a satisfação do empregado.<jupyter_code>fig = plt.figure(figsize=(15,4))
ax=sns.kdeplot(df.loc[(df['turnover'] == 0),'satisfaction'] , color='b',shade=True, label='no turnover')
ax=sns.kdeplot(df.loc[(df['turnover'] == 1),'satisfaction'] , color='r',shade=True, label='turnover')
plt.title('Distribuição da Satisfação do Empregado - Turnover V.S. No Turnover')
plt.plot()<jupyter_output><empty_output><jupyter_text>Turnover V.S. Satisfaction *****Resumo:**  - Empregados com o nível de satisfação em 20 ou menos tendem a deixar a empresa. - Empregados com o nível de satisfação em até 50 tem maior probabilidade de deixar a empresa.  Verificando a relação entre número de projetos e a nota de avaliação do empregado.<jupyter_code>fig = plt.figure(figsize=(12, 8))
import seaborn as sns
sns.boxplot(x="projectCount", y="evaluation", hue="turnover", data=df)
plt.title("Número de projetos e Nota de Avaliação")
plt.show()<jupyter_output><empty_output><jupyter_text>ProjectCount VS Evaluation*****Resumo:** - Há um **aumento na avaliação** para os funcionários que realizaram mais projetos dentro do grupo de quem deixou a empresa. - Para o grupo de pessoas que permaneceram na empresa, os empregados tiveram uma **pontuação de avaliação consistente**, apesar do aumento nas contagens de projetos.- Empregados que permaneceram na empresa tiveram uma **avaliação média em torno de 70%**, mesmo com o número de projetos crescendo.- Esta relação muda drasticamente entre os empregados que deixaram a empresa. A partir de 3 projetos, as **médias de avaliação aumentam consideravelmente**.- Empregados que tinham **dois projetos e uma péssima avaliação** saíram.- Empregados com **mais de 3 projetos e avaliações altas** deixaram a empresa.**Questões:**  - Por que será que os funcionários que saíram tiveram em média uma avaliação superior aos funcionários que não saíram, mesmo com um aumento no número de projetos?  - Os funcionários com avaliações mais baixas não deveriam ter tendência a sair mais da empresa?  Verificando a relação entre a satisfação do empregado e a sua avaliação.<jupyter_code>sns.lmplot(x = 'satisfaction', 
           y = 'evaluation', 
           data = df,
           fit_reg = False,
           hue='turnover')<jupyter_output><empty_output><jupyter_text>Satisfaction VS Evaluation*****Resumo:**: Temos aqui 3 grupos distintos de empregados. **Cluster 1 (Empregados insatisfeitos e trabalhadores):** A satisfação foi inferior a 20 e as avaliações foram superiores a 75. - O que pode ser uma boa indicação de que os funcionários que deixaram a empresa eram bons trabalhadores, mas se sentiam péssimos no trabalho.Questões:  - Qual poderia ser o motivo de se sentir tão mal quando você é altamente avaliado?  - Será que está trabalhando muito?  - Esse cluster poderia significar funcionários que estão "sobrecarregados"?  **Cluster 2 (Empregados ruins e insatisfeitos):** Satisfação entre 35 à 50 e as suas avaliações abaixo de ~ 58. Questões:- Isso pode ser visto como funcionários que foram mal avaliados e se sentiram mal no trabalho.- Podemos chamar esse grupo de baixo desempenho?**Cluster 3 (Empregados satisfeitos e trabalhadores):** Satisfação entre 75 à 90 e avaliações superiores a 80. - O que poderia significar que os funcionários neste grupo eram "ideais". - Eles amavam seu trabalho e eram altamente avaliados por seu desempenho.Questões: - Este grupo pode representar os empregados que deixaram a empresa porque encontraram outra oportunidade de trabalho?- Poderiamos ter mais do que 3 clusters?  Computando os clusters  Importando a biblioteca Scikit-learn<jupyter_code>from sklearn.cluster import KMeans<jupyter_output><empty_output><jupyter_text>Inicializando os clusters.<jupyter_code>kmeans = KMeans(n_clusters=3,random_state=2)<jupyter_output><empty_output><jupyter_text>Definindo o conjunto de dados.<jupyter_code>df_turnover = df[df.turnover==1][["satisfaction","evaluation"]]<jupyter_output><empty_output><jupyter_text>Computando os clusters.<jupyter_code>kmeans.fit(df_turnover)
kmeans_colors = ['green' if c == 0 else 'red' if c == 1 else 'blue' for c in kmeans.labels_]
fig = plt.figure(figsize=(10, 6))
plt.scatter( x="satisfaction"
            ,y="evaluation"
            ,data=df_turnover,
            alpha=0.25,color = kmeans_colors)

plt.xlabel("Satisfaction")
plt.ylabel("Evaluation")

plt.scatter( x=kmeans.cluster_centers_[:,0]
            ,y=kmeans.cluster_centers_[:,1]
            ,color="black"
            ,marker="X",s=100)

plt.title("Grupos de Empregados - Satisfação vs Avaliação.")
plt.show()<jupyter_output><empty_output><jupyter_text>K-Means Grupos*****Cluster 0 (Verde):** Empregados trabalhadores e satisfeitos.**Cluster 1 (Vermelho):** Empregados ruins e insatisfeitos. **Cluster 2 (Azul):** Empregados trabalhadores e tristes.  Verificando a relação entre o tempo de empresa e o turnover.<jupyter_code>fig = plt.figure(figsize=(10, 6))
ax = sns.barplot(x="yearsAtCompany", y="yearsAtCompany", hue="turnover", data=df, estimator=lambda x: len(x) / len(df) * 100)
ax.set(ylabel="Percent")
plt.title("Turnover V.S. YearsAtCompany")
plt.show()<jupyter_output><empty_output><jupyter_text>Turnover V.S. YearsAtCompany *****Resumo:** Vamos ver mais alguns pontos para entender o porque os empregados deixam a empresa. - Empregados com **4 e 5 anos de casa** deixaram a empresa. - Empregados acima de **5 anos de casa** devem ser examinados. **Questões:**  - Por que os Empregados estão saindo principalmente na faixa de 3-5 anos?  - Quem são esses Empregados que saíram?  Carrega os artefatos para o Data Lake.<jupyter_code>import joblib<jupyter_output><empty_output><jupyter_text>Persistindo o objeto cluster para o disco.<jupyter_code>joblib.dump(kmeans, "cluster.joblib")<jupyter_output><empty_output><jupyter_text>Transferindo o arquivo para o Data Lake.<jupyter_code>client.fput_object(
    "curated",
    "cluster.joblib",
    "cluster.joblib"
)<jupyter_output><empty_output><jupyter_text>Sweetviz<jupyter_code>pip install sweetviz
import sweetviz as sv

my_report = sv.analyze(df,"turnover")
my_report.show_html()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11065983088088421, 'fraction_numerical': 0.015247353352420268, 'mean_word_length': 5.521927920104212, 'pattern_counts': {'":': 0, '<': 112, '<?xml version=': 0, '>': 112, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, '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': '28', 'dir': 'jupyter-structured-clean-dedup', 'id': '403352', 'license': 'MIT', 'n_tokens_mistral': 5383, 'n_tokens_neox': 5069, 'n_words': 1429, 'path': 'notebooks/analise.ipynb', 'repo_name': 'MieleSantos/bootcamp_ds', 'size': '15019'}