aliceblue11 commited on
Commit
ef055fe
·
verified ·
1 Parent(s): a0b0d1f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +42 -69
app.py CHANGED
@@ -1,97 +1,70 @@
1
- import gradio as gr
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(percentile, 2),
46
  }
47
- return results
48
 
49
  # 결과 시각화
50
- def visualize_results(results):
51
- scales = list(results.keys())
52
- t_scores = [results[scale]["T점수"] for scale in scales]
53
-
54
- plt.figure(figsize=(8, 4))
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, **responses):
69
- user_responses = {scale: [responses[f"{scale}_{i}"] for i in range(len(QUESTIONS[scale]))] for scale in QUESTIONS}
70
- scores = calculate_scores(user_responses)
71
  graph_path = visualize_results(scores)
72
-
73
- report = f"이름: {name}\n성별: {gender}\n연령: {age}\n\n"
74
  report += "TCI 결과:\n"
75
- for scale, data in scores.items():
76
- report += f"{scale}: 원점수={data['원점수']}, T점수={data['T점수']}, 백분위={data['백분위']}\n"
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
- for scale, questions in QUESTIONS.items():
88
- for i, question in enumerate(questions):
89
- inputs.append(gr.Slider(0, 4, step=1, label=f"{scale}_{i+1}: {question}"))
 
 
 
 
 
 
 
 
90
 
91
  outputs = [
92
  gr.Textbox(label="결과 보고서", lines=10),
93
  gr.Image(label="결과 그래프"),
94
  ]
95
 
96
- app = gr.Interface(fn=tci_app, inputs=inputs, outputs=outputs, title="TCI 기질 분석기")
 
 
 
 
 
 
 
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()