Spaces:
Sleeping
Sleeping
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()
|