|
import gradio as gr |
|
import plotly.graph_objects as go |
|
from sentence_transformers import SentenceTransformer |
|
import numpy as np |
|
|
|
""" |
|
Objetivo do Usuário: |
|
Este aplicativo visa ajudar profissionais e gestores a: |
|
1. Identificar perfis comportamentais usando a metodologia DISC |
|
2. Compreender tendências naturais de comportamento em ambiente profissional |
|
3. Facilitar o autoconhecimento e desenvolvimento pessoal |
|
4. Apoiar decisões de gestão de pessoas e formação de equipes |
|
5. Melhorar a comunicação e relacionamento interpessoal no trabalho |
|
""" |
|
|
|
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2') |
|
|
|
DISC_QUESTIONS = [ |
|
{"pergunta": "Em situações de trabalho em equipe, você geralmente:", |
|
"opcoes": [("D", "Assume a liderança e toma decisões rápidas"), |
|
("I", "Motiva o grupo e mantém o ambiente animado"), |
|
("S", "Apoia os colegas e mantém a harmonia"), |
|
("C", "Analisa detalhadamente antes de agir")]}, |
|
{"pergunta": "Quando enfrenta um desafio no trabalho, você:", |
|
"opcoes": [("D", "Enfrenta diretamente e busca soluções imediatas"), |
|
("I", "Discute com outros e busca diferentes perspectivas"), |
|
("S", "Mantém a calma e segue um processo estabelecido"), |
|
("C", "Pesquisa todas as informações disponíveis primeiro")]}, |
|
{"pergunta": "Em reuniões profissionais, você costuma:", |
|
"opcoes": [("D", "Ir direto ao ponto e focar em resultados"), |
|
("I", "Participar ativamente e compartilhar ideias"), |
|
("S", "Ouvir atentamente e contribuir quando solicitado"), |
|
("C", "Tomar notas e questionar os detalhes")]}, |
|
{"pergunta": "Ao lidar com mudanças no ambiente de trabalho, você:", |
|
"opcoes": [("D", "Abraça a mudança e lidera a implementação"), |
|
("I", "Entusiasma os outros sobre as novas possibilidades"), |
|
("S", "Adapta-se gradualmente seguindo o processo"), |
|
("C", "Analisa os impactos antes de aceitar")]}, |
|
{"pergunta": "Sob pressão no trabalho, você tende a:", |
|
"opcoes": [("D", "Tornar-se mais direto e focado em resultados"), |
|
("I", "Buscar apoio e interação com a equipe"), |
|
("S", "Manter a calma e seguir metodicamente"), |
|
("C", "Concentrar-se em detalhes e procedimentos")]} |
|
] |
|
|
|
DISC_INSIGHTS = { |
|
'D': {'alto': ["Você demonstra forte capacidade de liderança e tomada de decisão - ideal para posições gerenciais", |
|
"Sua orientação para resultados é uma característica marcante - excelente para projetos com prazos curtos", |
|
"Você tende a enfrentar desafios de forma direta e decisiva - ótimo para gestão de crises"], |
|
'baixo': ["Você prefere uma abordagem mais colaborativa e consensual - valioso em trabalhos em equipe", |
|
"Sua tendência é buscar harmonia nas relações profissionais - importante para mediação de conflitos", |
|
"Você demonstra cuidado ao tomar decisões importantes - útil em análises de risco"]}, |
|
'I': {'alto': ["Seu entusiasmo e otimismo são características marcantes - ideal para vendas e networking", |
|
"Você tem grande habilidade para inspirar e motivar pessoas - excelente para liderança de equipes", |
|
"Sua comunicação expressiva é um diferencial importante - ótimo para apresentações e treinamentos"], |
|
'baixo': ["Você prefere uma comunicação mais objetiva e focada - valioso em análises técnicas", |
|
"Sua abordagem analítica favorece resultados concretos - importante em projetos estruturados", |
|
"Você valoriza dados e fatos em suas interações - útil em processos decisórios"]}, |
|
'S': {'alto': ["Sua consistência e confiabilidade são pontos fortes - ideal para gestão de processos", |
|
"Você demonstra grande habilidade para trabalho em equipe - excelente para projetos colaborativos", |
|
"Sua paciência e capacidade de escuta são diferenciais - ótimo para atendimento ao cliente"], |
|
'baixo': ["Você se adapta facilmente a mudanças e novos cenários - valioso em ambientes dinâmicos", |
|
"Sua flexibilidade é um ponto forte em ambientes dinâmicos - importante para inovação", |
|
"Você lida bem com múltiplas tarefas simultâneas - útil em gestão de projetos"]}, |
|
'C': {'alto': ["Sua precisão e atenção aos detalhes são notáveis - ideal para análise de dados", |
|
"Você tem forte capacidade analítica e organizacional - excelente para planejamento estratégico", |
|
"Sua busca por qualidade é uma característica marcante - ótimo para controle de qualidade"], |
|
'baixo': ["Você demonstra flexibilidade com regras e processos - valioso em ambientes criativos", |
|
"Sua praticidade favorece resultados rápidos - importante para entregas ágeis", |
|
"Você se adapta bem a ambientes menos estruturados - útil em startups"]} |
|
} |
|
|
|
def get_intensity_level(percentual): |
|
if percentual >= 75: return "muito alto" |
|
elif percentual >= 60: return "alto" |
|
elif percentual >= 40: return "moderado" |
|
elif percentual >= 25: return "baixo" |
|
return "muito baixo" |
|
|
|
def generate_semantic_insights(perfil, percentual): |
|
nivel = "alto" if percentual >= 50 else "baixo" |
|
insights = DISC_INSIGHTS[perfil][nivel] |
|
profile_embedding = model.encode(" ".join(insights)) |
|
similarities = np.array([np.dot(profile_embedding, model.encode(insight)) for insight in insights]) |
|
return [insights[i] for i in similarities.argsort()[-3:]] |
|
|
|
def calcular_perfil(respostas): |
|
contagem = {k: sum(1 for r in respostas if r and r.startswith(k)) for k in 'DISC'} |
|
total = sum(contagem.values()) |
|
return {k: (v/total)*100 if total > 0 else 0 for k, v in contagem.items()} |
|
|
|
def create_disc_plot(percentuais): |
|
cores = {'D': '#FF4B4B', 'I': '#FFD700', 'S': '#4CAF50', 'C': '#2196F3'} |
|
fig = go.Figure(data=[go.Bar(x=list(percentuais.keys()), |
|
y=list(percentuais.values()), |
|
marker_color=[cores[k] for k in percentuais.keys()], |
|
text=[f'{v:.1f}%' for v in percentuais.values()], |
|
textposition='auto')]) |
|
|
|
fig.update_layout( |
|
title={ |
|
'text': 'Perfil DISC', |
|
'y':0.95, |
|
'x':0.5, |
|
'xanchor': 'center', |
|
'yanchor': 'top', |
|
'font': {'size': 24, 'color': '#333333'} |
|
}, |
|
yaxis_range=[0, 100], |
|
template='plotly_white', |
|
height=400, |
|
margin=dict(l=40, r=40, t=60, b=40), |
|
paper_bgcolor='rgba(0,0,0,0)', |
|
plot_bgcolor='rgba(0,0,0,0)', |
|
yaxis_title="Percentual (%)", |
|
xaxis_title="Dimensões DISC" |
|
) |
|
|
|
return fig |
|
|
|
def analyze_profile_implications(percentuais): |
|
""" |
|
Analisa as implicações práticas do perfil DISC para desenvolvimento profissional |
|
""" |
|
perfis = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True)) |
|
principal = list(perfis.keys())[0] |
|
|
|
implications = { |
|
'D': """ |
|
Recomendações de Desenvolvimento: |
|
• Desenvolva mais paciência com processos e pessoas menos diretas |
|
• Pratique escuta ativa em reuniões e discussões |
|
• Considere diferentes perspectivas antes de tomar decisões |
|
|
|
Áreas Profissionais Favoráveis: |
|
• Gestão de projetos |
|
• Empreendedorismo |
|
• Liderança executiva |
|
""", |
|
'I': """ |
|
Recomendações de Desenvolvimento: |
|
• Desenvolva habilidades de organização e atenção a detalhes |
|
• Mantenha o foco em prazos e entregas |
|
• Equilibre socialização com produtividade |
|
|
|
Áreas Profissionais Favoráveis: |
|
• Vendas e Marketing |
|
• Relações Públicas |
|
• Treinamento e Desenvolvimento |
|
""", |
|
'S': """ |
|
Recomendações de Desenvolvimento: |
|
• Desenvolva mais assertividade em situações de conflito |
|
• Pratique adaptação a mudanças rápidas |
|
• Expresse mais suas opiniões em grupo |
|
|
|
Áreas Profissionais Favoráveis: |
|
• Recursos Humanos |
|
• Atendimento ao Cliente |
|
• Gestão de Processos |
|
""", |
|
'C': """ |
|
Recomendações de Desenvolvimento: |
|
• Desenvolva mais flexibilidade em situações ambíguas |
|
• Pratique tomada de decisão mais rápida |
|
• Equilibre análise com ação |
|
|
|
Áreas Profissionais Favoráveis: |
|
• Análise de Dados |
|
• Controle de Qualidade |
|
• Planejamento Estratégico |
|
""" |
|
} |
|
|
|
return implications.get(principal, "") |
|
|
|
def get_career_recommendations(profile): |
|
recommendations = { |
|
'D': "papéis de liderança e gestão de projetos desafiadores", |
|
'I': "funções que envolvem comunicação, vendas e trabalho com pessoas", |
|
'S': "posições que requerem consistência, suporte e trabalho em equipe", |
|
'C': "atividades que demandam precisão, análise e atenção aos detalhes" |
|
} |
|
return recommendations.get(profile, "diversos papéis profissionais") |
|
|
|
def gerar_relatorio(percentuais): |
|
perfis = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True)) |
|
principal, secundario = list(perfis.keys())[:2] |
|
insights_p = "\n".join([f"• {i}" for i in generate_semantic_insights(principal, perfis[principal])]) |
|
insights_s = "\n".join([f"• {i}" for i in generate_semantic_insights(secundario, perfis[secundario])]) |
|
implications = analyze_profile_implications(percentuais) |
|
|
|
return f"""# Análise de Perfil DISC |
|
|
|
## Visão Geral |
|
Perfil principal: {principal} ({perfis[principal]:.1f}% - {get_intensity_level(perfis[principal])}) |
|
Perfil secundário: {secundario} ({perfis[secundario]:.1f}% - {get_intensity_level(perfis[secundario])}) |
|
|
|
## Insights Principais |
|
{insights_p} |
|
|
|
## Influências Secundárias |
|
{insights_s} |
|
|
|
## Implicações Práticas |
|
{implications} |
|
|
|
## Distribuição DISC |
|
{', '.join([f'{k}: {v:.1f}%' for k, v in perfis.items()])} |
|
|
|
## Comentário do Sistema |
|
Com base no seu perfil, observamos que suas características comportamentais são mais adequadas para {get_career_recommendations(principal)}. |
|
Este resultado representa suas tendências naturais e pode ser usado para desenvolvimento pessoal e profissional. |
|
|
|
## Observações Finais |
|
• Este perfil reflete seu comportamento natural em ambiente profissional |
|
• As recomendações são sugestões para desenvolvimento contínuo |
|
• O perfil DISC não é uma medida de competência ou capacidade |
|
• Use estas informações como base para seu desenvolvimento profissional""" |
|
|
|
def process_results(*answers): |
|
if any(a is None for a in answers): |
|
gr.Warning("Por favor, responda todas as questões antes de prosseguir.") |
|
return None, None |
|
|
|
perfil = calcular_perfil(answers) |
|
plot = create_disc_plot(perfil) |
|
report = gerar_relatorio(perfil) |
|
|
|
return plot, report |
|
|
|
def create_interface(): |
|
with gr.Blocks(theme=gr.themes.Soft( |
|
primary_hue="blue", |
|
secondary_hue="purple", |
|
neutral_hue="slate", |
|
font=["Inter", "ui-sans-serif", "system-ui"] |
|
)) as iface: |
|
gr.Markdown( |
|
""" |
|
# 🎯 Análise de Perfil DISC |
|
### Descubra suas características comportamentais dominantes |
|
|
|
Este teste ajuda a identificar seu estilo comportamental baseado na metodologia DISC: |
|
- **D (Dominância)**: Foco em resultados e assertividade |
|
- **I (Influência)**: Foco em relacionamentos e comunicação |
|
- **S (Estabilidade)**: Foco em cooperação e consistência |
|
- **C (Conformidade)**: Foco em qualidade e precisão |
|
|
|
--- |
|
""") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=2): |
|
radios = [] |
|
for i, q in enumerate(DISC_QUESTIONS): |
|
radio = gr.Radio( |
|
choices=[f"{p} - {d}" for p, d in q['opcoes']], |
|
label=f"{i+1}. {q['pergunta']}", |
|
container=True, |
|
scale=2 |
|
) |
|
gr.Markdown("---") |
|
radios.append(radio) |
|
|
|
with gr.Row(): |
|
analyze_btn = gr.Button("📊 Analisar Perfil", size="lg", variant="primary") |
|
reset_btn = gr.Button("🔄 Novo Teste", size="lg", variant="secondary") |
|
|
|
with gr.Row(): |
|
plot = gr.Plot(label="Gráfico de Perfil DISC") |
|
|
|
with gr.Row(): |
|
output = gr.Markdown() |
|
|
|
analyze_btn.click( |
|
fn=process_results, |
|
inputs=radios, |
|
outputs=[plot, output], |
|
api_name="analyze" |
|
) |
|
|
|
reset_btn.click( |
|
fn=lambda: [None]*(len(radios)+2), |
|
outputs=radios+[plot, output], |
|
api_name="reset" |
|
) |
|
|
|
gr.Examples( |
|
examples=[ |
|
["D - Assume a liderança e toma decisões rápidas", |
|
"I - Discute com outros e busca diferentes perspectivas", |
|
"S - Ouvir atentamente e contribuir quando solicitado", |
|
"C - Analisa os impactos antes de aceitar", |
|
"D - Tornar-se mais direto e focado em resultados"]], |
|
inputs=radios, |
|
outputs=[plot, output], |
|
fn=process_results, |
|
label="Exemplo de Respostas" |
|
) |
|
|
|
|
|
gr.Markdown(""" |
|
--- |
|
### 📝 Informações Importantes |
|
|
|
• O teste DISC é uma ferramenta de autoconhecimento e desenvolvimento profissional |
|
• Os resultados refletem tendências comportamentais, não habilidades ou competências |
|
• Use as informações para desenvolvimento pessoal e melhor comunicação em equipe |
|
• Resultados podem variar dependendo do contexto e momento profissional |
|
|
|
© 2024 DISC Analysis Tool - Versão 2.0 |
|
""") |
|
|
|
return iface |
|
|
|
if __name__ == "__main__": |
|
iface = create_interface() |
|
iface.launch( |
|
share=True, |
|
server_name="0.0.0.0", |
|
server_port=7860 |
|
) |