TCI_TEST_02 / app.py
aliceblue11's picture
Update app.py
ada5a3b verified
raw
history blame
3.66 kB
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()