Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,97 +1,70 @@
|
|
1 |
-
|
2 |
-
import numpy as np
|
3 |
-
import matplotlib.pyplot as plt
|
4 |
-
|
5 |
-
# 질문 데이터
|
6 |
-
QUESTIONS = {
|
7 |
-
"NS": [
|
8 |
-
"쉬운 일보다는 도전적인 일이 더 좋다.",
|
9 |
-
"새로운 것을 시도하는 데 흥미를 느낀다.",
|
10 |
-
"변화를 즐긴다.",
|
11 |
-
"계획을 세우지 않고 즉흥적으로 행동하는 경향이 있다.",
|
12 |
-
],
|
13 |
-
"HA": [
|
14 |
-
"종종 실제보다 일이 더 어렵거나 위험하다고 예상한다.",
|
15 |
-
"미래에 어떤 일이 잘못될까 봐 자주 걱정한다.",
|
16 |
-
"낯선 사람을 만날 때, 매우 수줍어하며 위축된다.",
|
17 |
-
"피로감을 쉽게 느낀다.",
|
18 |
-
],
|
19 |
-
# 추가 질문 NS, HA, RD, PS, SD, CO, ST 구성
|
20 |
-
}
|
21 |
-
|
22 |
-
# 규준 점수 데이터
|
23 |
-
STANDARD_SCORES = {
|
24 |
-
"NS": {"M": 20, "SD": 5},
|
25 |
-
"HA": {"M": 18, "SD": 4},
|
26 |
-
"RD": {"M": 22, "SD": 6},
|
27 |
-
"PS": {"M": 19, "SD": 4},
|
28 |
-
"SD": {"M": 24, "SD": 6},
|
29 |
-
"CO": {"M": 26, "SD": 5},
|
30 |
-
"ST": {"M": 18, "SD": 5},
|
31 |
-
}
|
32 |
-
|
33 |
-
# 점수 계산 함수
|
34 |
-
def calculate_scores(responses):
|
35 |
-
results = {}
|
36 |
-
for scale, questions in QUESTIONS.items():
|
37 |
-
raw_score = sum(responses[scale]) # 원점수 합계
|
38 |
-
mean = STANDARD_SCORES[scale]["M"]
|
39 |
-
sd = STANDARD_SCORES[scale]["SD"]
|
40 |
-
t_score = 50 + 10 * (raw_score - mean) / sd
|
41 |
-
percentile = (raw_score - mean + 2 * sd) / (4 * sd) * 100
|
42 |
-
results[scale] = {
|
43 |
"원점수": raw_score,
|
44 |
"T점수": round(t_score, 2),
|
45 |
-
"백분위": round(
|
46 |
}
|
47 |
-
return
|
48 |
|
49 |
# 결과 시각화
|
50 |
-
def visualize_results(
|
51 |
-
scales =
|
52 |
-
t_scores = [
|
53 |
-
|
54 |
-
plt.figure(figsize=(
|
55 |
plt.bar(scales, t_scores, color="skyblue")
|
56 |
-
plt.axhline(50, color="gray", linestyle="--", label="평균 T점수")
|
57 |
-
plt.title("TCI 척도별 T점수")
|
58 |
plt.xlabel("척도")
|
59 |
-
plt.ylabel("T점수")
|
60 |
plt.legend()
|
61 |
-
plt.tight_layout()
|
62 |
-
|
63 |
-
# 그래프를 이미지로 반환
|
64 |
plt.savefig("results.png")
|
65 |
return "results.png"
|
66 |
|
67 |
-
# Gradio 인터페이스
|
68 |
-
def tci_app(name, gender, age,
|
69 |
-
|
70 |
-
scores = calculate_scores(user_responses)
|
71 |
graph_path = visualize_results(scores)
|
72 |
-
|
73 |
-
report = f"이름: {name}\n성별: {gender}\n
|
74 |
report += "TCI 결과:\n"
|
75 |
-
for scale,
|
76 |
-
report +=
|
77 |
-
|
|
|
|
|
|
|
78 |
return report, graph_path
|
79 |
|
80 |
# Gradio UI 구성
|
81 |
inputs = [
|
82 |
gr.Textbox(label="이름"),
|
83 |
gr.Radio(label="성별", choices=["남성", "여성"]),
|
84 |
-
gr.Number(label="
|
85 |
]
|
86 |
|
87 |
-
|
88 |
-
|
89 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
|
91 |
outputs = [
|
92 |
gr.Textbox(label="결과 보고서", lines=10),
|
93 |
gr.Image(label="결과 그래프"),
|
94 |
]
|
95 |
|
96 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
97 |
app.launch()
|
|
|
1 |
+
scores[scale] = {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
"원점수": raw_score,
|
3 |
"T점수": round(t_score, 2),
|
4 |
+
"백분위": round((raw_score - mean + 2 * sd) / (4 * sd) * 100, 2),
|
5 |
}
|
6 |
+
return scores
|
7 |
|
8 |
# 결과 시각화
|
9 |
+
def visualize_results(scores):
|
10 |
+
scales = scores.keys()
|
11 |
+
t_scores = [scores[scale]["T점수"] for scale in scales]
|
12 |
+
|
13 |
+
plt.figure(figsize=(10, 6))
|
14 |
plt.bar(scales, t_scores, color="skyblue")
|
15 |
+
plt.axhline(50, color="gray", linestyle="--", label="평균 T 점수")
|
16 |
+
plt.title("TCI 척도별 T 점수", fontsize=14)
|
17 |
plt.xlabel("척도")
|
18 |
+
plt.ylabel("T 점수")
|
19 |
plt.legend()
|
|
|
|
|
|
|
20 |
plt.savefig("results.png")
|
21 |
return "results.png"
|
22 |
|
23 |
+
# Gradio 앱 인터페이스 정의
|
24 |
+
def tci_app(name, gender, age, responses):
|
25 |
+
scores = calculate_scores(responses)
|
|
|
26 |
graph_path = visualize_results(scores)
|
27 |
+
|
28 |
+
report = f"이름: {name}\n성별: {gender}\n나이: {age}\n\n"
|
29 |
report += "TCI 결과:\n"
|
30 |
+
for scale, score_data in scores.items():
|
31 |
+
report += (
|
32 |
+
f"{scale}: 원점수={score_data['원점수']}, "
|
33 |
+
f"T점수={score_data['T점수']}, 백분위={score_data['백분위']}\n"
|
34 |
+
)
|
35 |
+
|
36 |
return report, graph_path
|
37 |
|
38 |
# Gradio UI 구성
|
39 |
inputs = [
|
40 |
gr.Textbox(label="이름"),
|
41 |
gr.Radio(label="성별", choices=["남성", "여성"]),
|
42 |
+
gr.Number(label="나이"),
|
43 |
]
|
44 |
|
45 |
+
# 설문 항목을 라디오 버튼으로 추가
|
46 |
+
response_inputs = []
|
47 |
+
for i, question in enumerate(QUESTIONS):
|
48 |
+
response_inputs.append(
|
49 |
+
gr.Radio(
|
50 |
+
label=f"질문 {i+1}: {question}",
|
51 |
+
choices=["매우 아니다", "아니다", "보통이다", "그렇다", "매우 그렇다"],
|
52 |
+
)
|
53 |
+
)
|
54 |
+
|
55 |
+
inputs.extend(response_inputs)
|
56 |
|
57 |
outputs = [
|
58 |
gr.Textbox(label="결과 보고서", lines=10),
|
59 |
gr.Image(label="결과 그래프"),
|
60 |
]
|
61 |
|
62 |
+
# Gradio 앱 실행
|
63 |
+
app = gr.Interface(
|
64 |
+
fn=tci_app,
|
65 |
+
inputs=inputs,
|
66 |
+
outputs=outputs,
|
67 |
+
title="TCI 기질 분석기",
|
68 |
+
description="TCI 설문을 기반으로 기질 및 성격 유형을 분석합니다.",
|
69 |
+
)
|
70 |
app.launch()
|