File size: 3,202 Bytes
a0b0d1f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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()