File size: 3,664 Bytes
0834a93
 
 
 
 
 
 
 
 
 
 
ada5a3b
0834a93
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ada5a3b
 
 
 
 
 
 
 
 
 
 
0834a93
ada5a3b
 
a0b0d1f
 
ada5a3b
a0b0d1f
ada5a3b
a0b0d1f
 
ef055fe
0834a93
ef055fe
 
 
a0b0d1f
ef055fe
 
a0b0d1f
ef055fe
a0b0d1f
ada5a3b
a0b0d1f
 
 
ada5a3b
ef055fe
ada5a3b
 
 
ef055fe
a0b0d1f
ef055fe
 
a0b0d1f
ada5a3b
 
ef055fe
a0b0d1f
 
 
 
 
 
ef055fe
a0b0d1f
 
ada5a3b
 
 
 
 
 
ef055fe
ada5a3b
 
ef055fe
 
a0b0d1f
 
 
 
 
 
ef055fe
 
ada5a3b
ef055fe
 
 
 
 
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import gradio as gr
import numpy as np
import matplotlib.pyplot as plt

# 질문 데이터: 기존 질문 + 추가 질문
QUESTIONS = [
    "쉬운 일보다는 도전적인 일이 더 좋다.",
    "나를 좋지 않게 대했던 사람들과도 친하게 지낸다.",
    "음악을 듣거나 산책을 할 때 그 속에 빠져들어 나 자신을 잊는다.",
    "종종 실제보다 일이 더 어렵거나 위험할 것이라고 예상한다.",
    "내가 할 수 있는 한 더 잘 하고 싶기 때문에, 열심을 다해 나 자신을 몰아붙인다.",
    # 추가 질문 45개
]

# 규준 점수 데이터
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):
    # 질문 응답은 5점 척도(0~4)
    # 각 척도에 대한 점수를 계산
    scores = {"NS": 0, "HA": 0, "RD": 0, "PS": 0, "SD": 0, "CO": 0, "ST": 0}
    for i, response in enumerate(responses):
        scale = list(STANDARD_SCORES.keys())[i % len(STANDARD_SCORES)]  # 척도 순환
        scores[scale] += response  # 원점수 합계

    # 각 척도별 T 점수 및 백분위 계산
    results = {}
    for scale, raw_score in scores.items():
        mean, sd = STANDARD_SCORES[scale]["M"], STANDARD_SCORES[scale]["SD"]
        t_score = 50 + 10 * (raw_score - mean) / sd
        percentile = round((raw_score - mean + 2 * sd) / (4 * sd) * 100, 2)
        results[scale] = {
            "원점수": raw_score,
            "T점수": round(t_score, 2),
            "백분위": percentile,
        }
    return results

# 결과 시각화
def visualize_results(scores):
    scales = list(scores.keys())
    t_scores = [scores[scale]["T점수"] for scale in scales]

    plt.figure(figsize=(10, 6))
    plt.bar(scales, t_scores, color="skyblue")
    plt.axhline(50, color="gray", linestyle="--", label="평균 T 점수")
    plt.title("TCI 척도별 T 점수", fontsize=14)
    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):
    """
    설문 데이터를 처리하고 결과를 반환
    """
    scores = calculate_scores(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="나이"),
]

# 질문 항목에 대한 라디오 버튼 입력 생성
response_inputs = [
    gr.Radio(
        label=f"질문 {i+1}: {question}",
        choices=["매우 아니다", "아니다", "보통이다", "그렇다", "매우 그렇다"],
        type="index",
    )
    for i, question in enumerate(QUESTIONS)
]

inputs.extend(response_inputs)

outputs = [
    gr.Textbox(label="결과 보고서", lines=10),
    gr.Image(label="결과 그래프"),
]

# Gradio 앱 실행
app = gr.Interface(
    fn=lambda name, gender, age, *responses: tci_app(name, gender, age, responses),
    inputs=inputs,
    outputs=outputs,
    title="TCI 기질 분석기",
    description="TCI 설문을 기반으로 기질 및 성격 유형을 분석합니다.",
)
app.launch()