DISC.ai / app.py
DHEIVER's picture
Update app.py
b461ce1 verified
raw
history blame
14.7 kB
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("---") # Separator between questions
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"
)
# Add footer with information
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
)