import gradio as gr import numpy as np import matplotlib.pyplot as plt # 질문 데이터 QUESTIONS = { "NS": [ "쉬운 일보다는 도전적인 일이 더 좋다.", "새로운 것을 시도하는 데 흥미를 느낀다.", "변화를 즐긴다.", "계획을 세우지 않고 즉흥적으로 행동하는 경향이 있다.", ], "HA": [ "종종 실제보다 일이 더 어렵거나 위험하다고 예상한다.", "미래에 어떤 일이 잘못될까 봐 자주 걱정한다.", "낯선 사람을 만날 때, 매우 수줍어하며 위축된다.", "피로감을 쉽게 느낀다.", ], # 추가 질문 NS, HA, RD, PS, SD, CO, ST 구성 } # 규준 점수 데이터 STANDARD_SCORES = { "NS": {"M": 20, "SD": 5}, "HA": {"M": 18, "SD": 4}, "RD": {"M": 22, "SD": 6}, "PS": {"M": 19, "SD": 4}, "SD": {"M": 24, "SD": 6}, "CO": {"M": 26, "SD": 5}, "ST": {"M": 18, "SD": 5}, } # 점수 계산 함수 def calculate_scores(responses): results = {} for scale, questions in QUESTIONS.items(): raw_score = sum(responses[scale]) # 원점수 합계 mean = STANDARD_SCORES[scale]["M"] sd = STANDARD_SCORES[scale]["SD"] t_score = 50 + 10 * (raw_score - mean) / sd percentile = (raw_score - mean + 2 * sd) / (4 * sd) * 100 results[scale] = { "원점수": raw_score, "T점수": round(t_score, 2), "백분위": round(percentile, 2), } return results # 결과 시각화 def visualize_results(results): scales = list(results.keys()) t_scores = [results[scale]["T점수"] for scale in scales] plt.figure(figsize=(8, 4)) plt.bar(scales, t_scores, color="skyblue") plt.axhline(50, color="gray", linestyle="--", label="평균 T점수") plt.title("TCI 척도별 T점수") plt.xlabel("척도") plt.ylabel("T점수") plt.legend() plt.tight_layout() # 그래프를 이미지로 반환 plt.savefig("results.png") return "results.png" # Gradio 인터페이스 def tci_app(name, gender, age, **responses): user_responses = {scale: [responses[f"{scale}_{i}"] for i in range(len(QUESTIONS[scale]))] for scale in QUESTIONS} scores = calculate_scores(user_responses) graph_path = visualize_results(scores) report = f"이름: {name}\n성별: {gender}\n연령: {age}\n\n" report += "TCI 결과:\n" for scale, data in scores.items(): report += f"{scale}: 원점수={data['원점수']}, T점수={data['T점수']}, 백분위={data['백분위']}\n" return report, graph_path # Gradio UI 구성 inputs = [ gr.Textbox(label="이름"), gr.Radio(label="성별", choices=["남성", "여성"]), gr.Number(label="연령"), ] for scale, questions in QUESTIONS.items(): for i, question in enumerate(questions): inputs.append(gr.Slider(0, 4, step=1, label=f"{scale}_{i+1}: {question}")) outputs = [ gr.Textbox(label="결과 보고서", lines=10), gr.Image(label="결과 그래프"), ] app = gr.Interface(fn=tci_app, inputs=inputs, outputs=outputs, title="TCI 기질 분석기") app.launch()