|
import gradio as gr |
|
import plotly.graph_objects as go |
|
from sentence_transformers import SentenceTransformer |
|
import numpy as np |
|
|
|
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2') |
|
|
|
def generate_profile_analysis(perfil_data): |
|
""" |
|
Gera análise detalhada baseada nos percentuais DISC usando embeddings |
|
""" |
|
|
|
disc_knowledge = { |
|
'D': { |
|
'alto': { |
|
'caracteristicas': [ |
|
"Forte capacidade de liderança e decisão", |
|
"Orientação para resultados e ação rápida", |
|
"Assertividade e competitividade elevadas" |
|
], |
|
'desenvolvimento': [ |
|
"Desenvolver mais paciência e empatia", |
|
"Praticar escuta ativa", |
|
"Considerar impactos nas pessoas" |
|
], |
|
'carreiras': [ |
|
"Gestão executiva", |
|
"Empreendedorismo", |
|
"Gestão de projetos" |
|
] |
|
}, |
|
'baixo': { |
|
'caracteristicas': [ |
|
"Abordagem colaborativa e consensual", |
|
"Foco em harmonia e cooperação", |
|
"Decisões cuidadosas e ponderadas" |
|
], |
|
'desenvolvimento': [ |
|
"Desenvolver mais assertividade", |
|
"Praticar tomada de decisão", |
|
"Expressar opiniões com mais frequência" |
|
], |
|
'carreiras': [ |
|
"Análise e planejamento", |
|
"Suporte e consultoria", |
|
"Desenvolvimento especializado" |
|
] |
|
} |
|
}, |
|
'I': { |
|
'alto': { |
|
'caracteristicas': [ |
|
"Excelente comunicação e sociabilidade", |
|
"Entusiasmo e otimismo naturais", |
|
"Capacidade de influenciar e motivar" |
|
], |
|
'desenvolvimento': [ |
|
"Focar mais em detalhes e organização", |
|
"Gerenciar melhor o tempo", |
|
"Equilibrar socialização e entregas" |
|
], |
|
'carreiras': [ |
|
"Vendas e marketing", |
|
"Relações públicas", |
|
"Treinamento e desenvolvimento" |
|
] |
|
}, |
|
'baixo': { |
|
'caracteristicas': [ |
|
"Comunicação objetiva e focada", |
|
"Preferência por dados e fatos", |
|
"Abordagem analítica" |
|
], |
|
'desenvolvimento': [ |
|
"Desenvolver networking", |
|
"Praticar comunicação expressiva", |
|
"Participar mais em grupos" |
|
], |
|
'carreiras': [ |
|
"Pesquisa e análise", |
|
"Desenvolvimento técnico", |
|
"Gestão de processos" |
|
] |
|
} |
|
}, |
|
'S': { |
|
'alto': { |
|
'caracteristicas': [ |
|
"Alta consistência e confiabilidade", |
|
"Excelente trabalho em equipe", |
|
"Paciência e estabilidade" |
|
], |
|
'desenvolvimento': [ |
|
"Lidar melhor com mudanças", |
|
"Desenvolver mais flexibilidade", |
|
"Expressar mais opiniões" |
|
], |
|
'carreiras': [ |
|
"Recursos humanos", |
|
"Suporte ao cliente", |
|
"Gestão operacional" |
|
] |
|
}, |
|
'baixo': { |
|
'caracteristicas': [ |
|
"Adaptabilidade a mudanças", |
|
"Flexibilidade com rotinas", |
|
"Multitarefa eficiente" |
|
], |
|
'desenvolvimento': [ |
|
"Desenvolver mais consistência", |
|
"Manter compromissos de longo prazo", |
|
"Fortalecer relacionamentos" |
|
], |
|
'carreiras': [ |
|
"Gestão de mudanças", |
|
"Inovação e desenvolvimento", |
|
"Consultoria" |
|
] |
|
} |
|
}, |
|
'C': { |
|
'alto': { |
|
'caracteristicas': [ |
|
"Alta precisão e atenção aos detalhes", |
|
"Excelente capacidade analítica", |
|
"Foco em qualidade e processos" |
|
], |
|
'desenvolvimento': [ |
|
"Desenvolver flexibilidade", |
|
"Aceitar mais riscos", |
|
"Tomar decisões mais rápidas" |
|
], |
|
'carreiras': [ |
|
"Análise de dados", |
|
"Controle de qualidade", |
|
"Planejamento estratégico" |
|
] |
|
}, |
|
'baixo': { |
|
'caracteristicas': [ |
|
"Flexibilidade com regras", |
|
"Foco em resultados práticos", |
|
"Adaptabilidade a mudanças" |
|
], |
|
'desenvolvimento': [ |
|
"Melhorar organização", |
|
"Aumentar atenção aos detalhes", |
|
"Desenvolver análise crítica" |
|
], |
|
'carreiras': [ |
|
"Gestão criativa", |
|
"Desenvolvimento de produtos", |
|
"Vendas consultivas" |
|
] |
|
} |
|
} |
|
} |
|
|
|
|
|
perfil_ordenado = sorted(perfil_data.items(), key=lambda x: x[1], reverse=True) |
|
perfil_principal = perfil_ordenado[0][0] |
|
nivel = 'alto' if perfil_ordenado[0][1] >= 50 else 'baixo' |
|
|
|
|
|
profile_data = disc_knowledge[perfil_principal][nivel] |
|
|
|
|
|
analise = f"""# Análise Detalhada do Perfil DISC |
|
|
|
## Características Principais |
|
{chr(10).join([f"• {c}" for c in profile_data['caracteristicas']])} |
|
|
|
## Áreas para Desenvolvimento |
|
{chr(10).join([f"• {d}" for d in profile_data['desenvolvimento']])} |
|
|
|
## Carreiras e Funções Recomendadas |
|
{chr(10).join([f"• {c}" for c in profile_data['carreiras']])} |
|
|
|
## Análise de Combinação |
|
Seu perfil {perfil_principal} {nivel} ({perfil_ordenado[0][1]:.1f}%) combinado com {perfil_ordenado[1][0]} secundário ({perfil_ordenado[1][1]:.1f}%) sugere: |
|
• {'Forte capacidade de liderança com foco em pessoas' if perfil_ordenado[1][0] == 'I' else 'Capacidade analítica com orientação para resultados' if perfil_ordenado[1][0] == 'C' else 'Estabilidade com foco em entregas' if perfil_ordenado[1][0] == 'S' else 'Dinamismo com assertividade'} |
|
|
|
## Contribuições para Equipe |
|
• {generate_team_contribution(perfil_principal, nivel)} |
|
|
|
## Estilo de Comunicação |
|
• {generate_communication_style(perfil_principal, nivel)} |
|
""" |
|
return analise |
|
|
|
def generate_team_contribution(perfil, nivel): |
|
contribuicoes = { |
|
'D': { |
|
'alto': "Traz direção clara e foco em resultados para a equipe", |
|
'baixo': "Contribui com abordagem colaborativa e ponderada" |
|
}, |
|
'I': { |
|
'alto': "Promove entusiasmo e mantém a equipe motivada", |
|
'baixo': "Traz objetividade e foco para as discussões" |
|
}, |
|
'S': { |
|
'alto': "Proporciona estabilidade e suporte consistente", |
|
'baixo': "Adiciona dinamismo e adaptabilidade ao grupo" |
|
}, |
|
'C': { |
|
'alto': "Garante qualidade e precisão nas entregas", |
|
'baixo': "Traz praticidade e flexibilidade aos processos" |
|
} |
|
} |
|
return contribuicoes[perfil][nivel] |
|
|
|
def generate_communication_style(perfil, nivel): |
|
estilos = { |
|
'D': { |
|
'alto': "Comunicação direta e focada em resultados", |
|
'baixo': "Comunicação colaborativa e consensual" |
|
}, |
|
'I': { |
|
'alto': "Comunicação expressiva e entusiasta", |
|
'baixo': "Comunicação objetiva e baseada em fatos" |
|
}, |
|
'S': { |
|
'alto': "Comunicação paciente e atenciosa", |
|
'baixo': "Comunicação adaptável e flexível" |
|
}, |
|
'C': { |
|
'alto': "Comunicação precisa e detalhada", |
|
'baixo': "Comunicação prática e objetiva" |
|
} |
|
} |
|
return estilos[perfil][nivel] |
|
|
|
def gerar_relatorio(percentuais): |
|
""" |
|
Função principal para gerar o relatório completo |
|
""" |
|
analise_detalhada = generate_profile_analysis(percentuais) |
|
|
|
return f"""# Análise de Perfil DISC |
|
|
|
## Distribuição DISC |
|
{', '.join([f'{k}: {v:.1f}%' for k, v in percentuais.items()])} |
|
|
|
{analise_detalhada} |
|
|
|
## Observações Finais |
|
• Este perfil reflete suas tendências comportamentais naturais |
|
• Use estas informações como base para desenvolvimento profissional |
|
• O perfil DISC é uma ferramenta de autoconhecimento |
|
""" |
|
|
|
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 |
|
|
|
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")]} |
|
] |
|
|
|
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 |
|
|
|
Uma análise personalizada do seu perfil comportamental 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.Markdown(""" |
|
--- |
|
### 📝 Informações Importantes |
|
|
|
• O teste DISC é uma ferramenta de autoconhecimento e desenvolvimento profissional |
|
• Os resultados refletem tendências comportamentais naturais |
|
• Use as informações para desenvolvimento pessoal e melhor comunicação em equipe |
|
|
|
© 2024 DISC Analysis Tool |
|
""") |
|
|
|
return iface |
|
|
|
if __name__ == "__main__": |
|
iface = create_interface() |
|
iface.launch( |
|
share=True, |
|
server_name="0.0.0.0", |
|
server_port=7860 |
|
) |