Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -9,12 +9,7 @@ QUESTIONS = [
|
|
9 |
"음악을 듣거나 산책을 할 때 그 속에 빠져들어 나 자신을 잊는다.",
|
10 |
"종종 실제보다 일이 더 어렵거나 위험할 것이라고 예상한다.",
|
11 |
"내가 할 수 있는 한 더 잘 하고 싶기 때문에, 열심을 다해 나 자신을 몰아붙인다.",
|
12 |
-
|
13 |
-
"내가 가지고 있는 많은 습관들은 내가 가치 있는 목표를 달성하는 데 방해가 된다.",
|
14 |
-
"문제가 생기면 혼자서 해결하려 한다.",
|
15 |
-
"미래에 어떤 일이 잘못될까봐 자주 걱정한다.",
|
16 |
-
"별로 힘들이지 않고 하루 종일 활동할 수 있다.",
|
17 |
-
# 40개 이상의 질문을 여기에 추가
|
18 |
]
|
19 |
|
20 |
# 규준 점수 데이터
|
@@ -30,18 +25,25 @@ STANDARD_SCORES = {
|
|
30 |
|
31 |
# 점수 계산 함수
|
32 |
def calculate_scores(responses):
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
38 |
t_score = 50 + 10 * (raw_score - mean) / sd
|
39 |
-
|
|
|
40 |
"원점수": raw_score,
|
41 |
"T점수": round(t_score, 2),
|
42 |
-
"백분위":
|
43 |
}
|
44 |
-
return
|
45 |
|
46 |
# 결과 시각화
|
47 |
def visualize_results(scores):
|
@@ -55,21 +57,22 @@ def visualize_results(scores):
|
|
55 |
plt.xlabel("척도")
|
56 |
plt.ylabel("T 점수")
|
57 |
plt.legend()
|
|
|
58 |
plt.savefig("results.png")
|
59 |
return "results.png"
|
60 |
|
61 |
-
# Gradio 앱
|
62 |
def tci_app(name, gender, age, responses):
|
|
|
|
|
|
|
63 |
scores = calculate_scores(responses)
|
64 |
graph_path = visualize_results(scores)
|
65 |
|
66 |
report = f"이름: {name}\n성별: {gender}\n나이: {age}\n\n"
|
67 |
report += "TCI 결과:\n"
|
68 |
-
for scale,
|
69 |
-
report +=
|
70 |
-
f"{scale}: 원점수={score_data['원점수']}, "
|
71 |
-
f"T점수={score_data['T점수']}, 백분위={score_data['백분위']}\n"
|
72 |
-
)
|
73 |
|
74 |
return report, graph_path
|
75 |
|
@@ -80,15 +83,15 @@ inputs = [
|
|
80 |
gr.Number(label="나이"),
|
81 |
]
|
82 |
|
83 |
-
#
|
84 |
-
response_inputs = [
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
choices=["매우 아니다", "아니다", "보통이다", "그렇다", "매우 그렇다"],
|
90 |
-
)
|
91 |
)
|
|
|
|
|
92 |
|
93 |
inputs.extend(response_inputs)
|
94 |
|
@@ -99,7 +102,7 @@ outputs = [
|
|
99 |
|
100 |
# Gradio 앱 실행
|
101 |
app = gr.Interface(
|
102 |
-
fn=tci_app,
|
103 |
inputs=inputs,
|
104 |
outputs=outputs,
|
105 |
title="TCI 기질 분석기",
|
|
|
9 |
"음악을 듣거나 산책을 할 때 그 속에 빠져들어 나 자신을 잊는다.",
|
10 |
"종종 실제보다 일이 더 어렵거나 위험할 것이라고 예상한다.",
|
11 |
"내가 할 수 있는 한 더 잘 하고 싶기 때문에, 열심을 다해 나 자신을 몰아붙인다.",
|
12 |
+
# 추가 질문 45개
|
|
|
|
|
|
|
|
|
|
|
13 |
]
|
14 |
|
15 |
# 규준 점수 데이터
|
|
|
25 |
|
26 |
# 점수 계산 함수
|
27 |
def calculate_scores(responses):
|
28 |
+
# 질문 응답은 5점 척도(0~4)
|
29 |
+
# 각 척도에 대한 점수를 계산
|
30 |
+
scores = {"NS": 0, "HA": 0, "RD": 0, "PS": 0, "SD": 0, "CO": 0, "ST": 0}
|
31 |
+
for i, response in enumerate(responses):
|
32 |
+
scale = list(STANDARD_SCORES.keys())[i % len(STANDARD_SCORES)] # 척도 순환
|
33 |
+
scores[scale] += response # 원점수 합계
|
34 |
+
|
35 |
+
# 각 척도별 T 점수 및 백분위 계산
|
36 |
+
results = {}
|
37 |
+
for scale, raw_score in scores.items():
|
38 |
+
mean, sd = STANDARD_SCORES[scale]["M"], STANDARD_SCORES[scale]["SD"]
|
39 |
t_score = 50 + 10 * (raw_score - mean) / sd
|
40 |
+
percentile = round((raw_score - mean + 2 * sd) / (4 * sd) * 100, 2)
|
41 |
+
results[scale] = {
|
42 |
"원점수": raw_score,
|
43 |
"T점수": round(t_score, 2),
|
44 |
+
"백분위": percentile,
|
45 |
}
|
46 |
+
return results
|
47 |
|
48 |
# 결과 시각화
|
49 |
def visualize_results(scores):
|
|
|
57 |
plt.xlabel("척도")
|
58 |
plt.ylabel("T 점수")
|
59 |
plt.legend()
|
60 |
+
plt.tight_layout()
|
61 |
plt.savefig("results.png")
|
62 |
return "results.png"
|
63 |
|
64 |
+
# Gradio 앱 함수
|
65 |
def tci_app(name, gender, age, responses):
|
66 |
+
"""
|
67 |
+
설문 데이터를 처리하고 결과를 반환
|
68 |
+
"""
|
69 |
scores = calculate_scores(responses)
|
70 |
graph_path = visualize_results(scores)
|
71 |
|
72 |
report = f"이름: {name}\n성별: {gender}\n나이: {age}\n\n"
|
73 |
report += "TCI 결과:\n"
|
74 |
+
for scale, data in scores.items():
|
75 |
+
report += f"{scale}: 원점수={data['원점수']}, T점수={data['T점수']}, 백분위={data['백분위']}\n"
|
|
|
|
|
|
|
76 |
|
77 |
return report, graph_path
|
78 |
|
|
|
83 |
gr.Number(label="나이"),
|
84 |
]
|
85 |
|
86 |
+
# 질문 항목에 대한 라디오 버튼 입력 생성
|
87 |
+
response_inputs = [
|
88 |
+
gr.Radio(
|
89 |
+
label=f"질문 {i+1}: {question}",
|
90 |
+
choices=["매우 아니다", "아니다", "보통이다", "그렇다", "매우 그렇다"],
|
91 |
+
type="index",
|
|
|
|
|
92 |
)
|
93 |
+
for i, question in enumerate(QUESTIONS)
|
94 |
+
]
|
95 |
|
96 |
inputs.extend(response_inputs)
|
97 |
|
|
|
102 |
|
103 |
# Gradio 앱 실행
|
104 |
app = gr.Interface(
|
105 |
+
fn=lambda name, gender, age, *responses: tci_app(name, gender, age, responses),
|
106 |
inputs=inputs,
|
107 |
outputs=outputs,
|
108 |
title="TCI 기질 분석기",
|