파이썬 설문조사 만들기: Shiny for Python 초보자 가이드
안녕하세요, 파이썬 열정 넘치는 여러분! 오늘은 정말 흥미진진한 주제로 찾아왔습니다. 바로 ‘파이썬 설문조사 만들기’인데요. 아마도 저처럼 여러분도 한 번쯤 “내가 직접 설문조사를 만들어볼 수 있을까?”라고 생각해 보신 적 있으시죠? 오늘 이 포스트에서는 그 꿈을 현실로 만들어 드리겠습니다!
우리는 ‘Shiny for Python’이라는 강력한 도구를 사용할 건데요, 이 도구의 사용법을 자세히 알아보면서 여러분만의 멋진 설문조사 앱을 만들어 볼 거예요. 초보자 분들도 걱정 마세요. 이 포스트는 여러분을 위해 준비했습니다!
자, 이제 파이썬의 마법같은 세계로 함께 떠나볼까요? 여러분의 창의력을 마음껏 발휘할 수 있는 파이썬 설문조사 만들기, 시작해 봅시다!
1. Shiny for Python: 설문조사의 새로운 지평
Shiny for Python은 데이터 과학자들과 개발자들 사이에서 급속도로 인기를 얻고 있는 프레임워크입니다. 왜 그럴까요? 바로 복잡한 웹 기술 없이도 인터랙티브한 웹 애플리케이션을 만들 수 있기 때문이죠.
특히, 설문조사 앱을 만들 때 Shiny for Python을 사용하면, 데이터 수집부터 분석까지 한 번에 처리할 수 있어 정말 편리합니다.
Shiny for Python
Shiny for Python은 반응형 웹 애플리케이션을 Python으로 개발할 수 있게 해주는 프레임워크입니다. R 언어의 인기 있는 Shiny 패키지를 Python 환경으로 가져온 것으로, 데이터 과학자들이 복잡한 웹 개발 지식 없이도 인터랙티브한 데이터 시각화 앱을 만들 수 있게 해줍니다.
Shiny for Python은 ui와 server 부분으로 구성되며, 사용자 입력에 따라 동적으로 결과를 계산하고 표시할 수 있습니다. 또한 Shinylive를 통해 서버 없이 브라우저에서 직접 앱을 실행할 수 있는 기능도 제공합니다.
2. 시작하기 전에: 준비물 체크리스트
파이썬 설문조사 앱을 만들기 전에, 몇 가지 준비물이 필요합니다. 함께 확인해볼까요?
- Python 3.8 이상 버전. (이 버전 확인하는 방법은 여기를 클릭)
- 좋아하는 코드 에디터 (예: VS Code, PyCharm)
- 터미널 사용법 기본 지식
- 열정과 호기심 (가장 중요!)
자, 이제 준비는 끝났습니다. 설레는 마음으로 시작해볼까요?
3. Shiny for Python 설치하기
먼저 Shiny for Python을 설치해야 합니다. 터미널을 열고 다음 명령어를 입력해주세요:
pip install shiny위 명령어를 실행하면 파이썬 설문조사 만들기 첫번째 단계인 Shiny for Python이 간단히 설치됩니다. 멋지죠? (아래에서는 이미 설치된 상태에서 재설치 실행을 하다보니 already satisfied 가 보이네요.)

4. 첫 번째 Shiny 앱 만들기
이제 본격적으로 파이썬 설문조사 만들기를 해 볼까요? 먼저, 가장 기본적인 Shiny 앱부터 시작해보겠습니다. 아참! 아시는 분은 알고 계시겠지만 가상환경에서 아래 코드를 실행하시는 것을 추천드립니다.
#survey_app
from shiny import App, ui
# UI 정의
app_ui = ui.page_fluid(
ui.h1("My First Shiny App"),
ui.p("Welcome to the world of Shiny for Python!")
)
# 빈 서버 함수 (추후 로직 추가 가능)
def server(input, output, session):
pass
# Shiny 앱 객체 생성
app = App(app_ui, server)코드 해설
- (위 코드는 survey_app 이름으로 저장했습니다.)
from shiny import App, ui: Shiny 라이브러리에서 필요한 클래스와 모듈을 가져옵니다.app_ui = ui.page_fluid(...): 애플리케이션의 사용자 인터페이스(UI)를 정의합니다.ui.h1(...): 페이지에 큰 제목(h1 태그)을 추가합니다.ui.p(...): 단락(p 태그)을 추가하여 환영 메시지를 표시합니다.
def server(input, output, session):: 서버 함수를 정의합니다. 현재는 빈 함수이지만, 추후 애플리케이션의 로직을 여기에 추가할 수 있습니다1.app = App(app_ui, server): UI와 서버 함수를 결합하여 Shiny 애플리케이션 객체를 생성합니다.
shiny run survey_app.py위 명령어를 터미널에 입력하고 엔터키를 누르면 아래와 같은 반응이 나타나는데 127.0.0.1:8000을 Ctrl키를 누른 상태에서 클릭하면 정말 간단한 웹 페이지가 생성됩니다. 신기하지 않나요?


5. 설문조사 폼 만들기
이제 본격적으로 설문조사 폼을 만들어 봅시다. 이름, 나이, 좋아하는 프로그래밍 언어를 물어보는 간단한 폼을 만들어 볼게요.
from shiny import App, ui, reactive
# UI 정의
app_ui = ui.page_fluid(
ui.h1("Python Programmer Survey"), # 제목 (h1 태그)
ui.input_text("name", "Enter your name"), # 텍스트 입력 필드 (이름)
ui.input_numeric("age", "Enter your age", value=20), # 숫자 입력 필드 (기본값 20)
ui.input_select(
"fav_lang",
"What is your favorite programming language?", # 선택 입력 필드
choices=["Python", "JavaScript", "Java", "C++", "Other"]
),
ui.input_action_button("submit", "Submit"), # 버튼 (제출)
ui.output_text_verbatim("result") # 출력 필드 (결과)
)
# 서버 로직 정의
def server(input, output, session):
@reactive.Effect
@reactive.event(input.submit) # 버튼 클릭 시 실행
def submit_survey():
# 입력된 데이터를 문자열로 조합하여 출력
result = f"Name: {input.name()}, Age: {input.age()}, Favorite Language: {input.fav_lang()}"
output.result.set(result) # 결과를 UI에 표시
# Shiny 앱 실행
app = App(app_ui, server)코드 해설
- UI 구성 (
app_ui)ui.h1(...): 설문조사의 제목을 표시합니다.ui.input_text(...): 사용자가 이름을 입력할 수 있도록 텍스트 필드를 제공합니다.ui.input_numeric(...): 나이를 입력할 수 있도록 숫자 필드를 제공합니다. 기본값은 20입니다.ui.input_select(...): 사용자가 좋아하는 프로그래밍 언어를 선택할 수 있도록 드롭다운 메뉴를 만듭니다.ui.input_action_button(...): 설문 제출 버튼을 추가합니다.ui.output_text_verbatim(...): 사용자가 입력한 결과를 텍스트 형태로 출력하는 공간을 만듭니다.
- 서버 로직 (
server함수)@reactive.Effect: 반응형 함수로 지정합니다.@reactive.event(input.submit): 버튼 클릭(submit) 이벤트가 발생할 때만 실행됩니다.result = f"Name: {input.name()}, Age: {input.age()}, Favorite Language: {input.fav_lang()}"
→ 사용자가 입력한 데이터를 받아 문자열을 생성합니다.output.result.set(result)
→ 결과를 UI의output_text_verbatim("result")영역에 표시합니다.
- Shiny 앱 실행 (
app = App(app_ui, server))App(app_ui, server)를 생성하여 UI와 서버를 연결합니다.app.run()을 실행하면 웹 브라우저에서 앱이 열립니다.
이렇게 하면 아래와 같이 기본적인 파이썬 설문조사 폼이 완성됩니다. 신기하지 않나요?

6. 데이터 저장하기
설문조사의 핵심은 데이터를 수집하고 저장하는 것입니다. CSV 파일에 설문조사 응답자들의 데이터를 저장하는 기능을 추가해 볼까요?
from shiny import App, ui, reactive
import pandas as pd # 필요시 pip install pandas로 해당 패키지 설치
from pathlib import Path
# UI 정의
app_ui = ui.page_fluid(
ui.h1("Python Programmer Survey"), # 제목 (h1 태그)
ui.input_text("name", "Enter your name"), # 텍스트 입력 필드 (이름)
ui.input_numeric("age", "Enter your age", value=20), # 숫자 입력 필드 (기본값 20)
ui.input_select(
"fav_lang",
"What is your favorite programming language?", # 선택 입력 필드
choices=["Python", "JavaScript", "Java", "C++", "Other"]
),
ui.input_action_button("submit", "Submit"), # 버튼 (제출)
ui.output_text_verbatim("result") # 출력 필드 (결과)
)
# 서버 로직 정의
def server(input, output, session):
@reactive.Effect
@reactive.event(input.submit) # 버튼 클릭 시 실행
def submit_survey():
# 사용자가 입력한 데이터를 딕셔너리 형태로 저장
data = {
"name": [input.name()],
"age": [input.age()],
"favorite_language": [input.fav_lang()]
}
# 데이터를 Pandas DataFrame으로 변환
df = pd.DataFrame(data)
# CSV 파일이 존재하는지 확인 후 저장
file_path = "survey_results.csv"
if not Path(file_path).exists():
df.to_csv(file_path, index=False) # 첫 번째 저장 시 헤더 포함
else:
df.to_csv(file_path, mode="a", header=False, index=False) # 기존 파일에 추가 저장
# 결과 메시지를 UI에 출력
output.result.set("Your response has been recorded. Thank you!")
# Shiny 앱 실행
app = App(app_ui, server)코드 해설
1. 데이터를 CSV 파일에 저장
- 사용자의 입력 데이터를 딕셔너리(
dict) 형태로 저장합니다. pandas.DataFrame을 이용하여 데이터프레임으로 변환합니다.- 응답 데이터를
"survey_results.csv"파일에 저장합니다.- 파일이 없으면 새로운 파일을 생성하고 헤더 포함 저장.
- 파일이 이미 존재하면 새로운 응답 데이터를 추가(Append) 모드로 저장 (헤더 제외).
2. 반응형 이벤트 처리
@reactive.event(input.submit)을 사용하여Submit버튼이 눌릴 때만 실행되도록 설정합니다.
3. 결과 메시지 표시
- 데이터를 저장한 후
"Your response has been recorded. Thank you!"메시지를 UI에 출력합니다.
파이썬 설문조사 폼에 Trump, 20세, Python으로 입력했습니다. 그리고 Submit 버튼을 누르면 이제 설문조사 응답이 CSV 파일(survey_result)에 저장됩니다. 이 파일을 클릭해보면 아래와 같이 입력했던 데이터가 확인이 됩니다!

자! 이제 여러분은 파이썬 설문조사 만들기를 통해 데이터 분석의 첫 걸음을 내딛은 놀라운 일을 해내셨습니다.
7. 설문조사 결과 시각화하기
데이터를 모았으니, 이제 그 결과를 시각화해볼까요? Shiny for Python과 matplotlib을 사용해서 간단한 차트를 만들어 봅시다.
from shiny import App, ui, reactive, render
import pandas as pd
import matplotlib.pyplot as plt
from pathlib import Path
# UI 정의
app_ui = ui.page_fluid(
ui.h1("Python Programmer Survey"), # 제목
ui.input_text("name", "Enter your name"), # 이름 입력 필드
ui.input_numeric("age", "Enter your age", value=20), # 나이 입력 필드
ui.input_select(
"fav_lang",
"What is your favorite programming language?", # 좋아하는 프로그래밍 언어 선택
choices=["Python", "JavaScript", "Java", "C++", "Other"]
),
ui.input_action_button("submit", "Submit"), # 제출 버튼
ui.output_text_verbatim("result"), # 결과 출력
ui.output_plot("age_histogram") # 연령 분포 히스토그램 출력
)
# 서버 로직 정의
def server(input, output, session):
@reactive.Effect
@reactive.event(input.submit) # 버튼 클릭 시 실행
def submit_survey():
# 사용자 입력 데이터를 딕셔너리로 저장
data = {
"name": [input.name()],
"age": [input.age()],
"favorite_language": [input.fav_lang()]
}
# 데이터를 DataFrame으로 변환
df = pd.DataFrame(data)
# 파일 경로 설정
file_path = "survey_results.csv"
# CSV 파일이 없으면 헤더 포함하여 생성, 있으면 추가 (Append)
if not Path(file_path).exists():
df.to_csv(file_path, index=False)
else:
df.to_csv(file_path, mode="a", header=False, index=False)
# 저장 완료 메시지 출력
output.result.set("Your response has been recorded. Thank you!")
@output
@render.plot
def age_histogram():
# 설문조사 데이터 불러오기
file_path = "survey_results.csv"
if not Path(file_path).exists():
return # 데이터가 없으면 그래프를 그리지 않음
df = pd.read_csv(file_path)
# 연령 분포 히스토그램 생성
fig, ax = plt.subplots(figsize=(10, 6)) # 새로운 figure 생성
ax.hist(df['age'], bins=10, edgecolor='black', alpha=0.7) # 히스토그램
ax.set_title('Age Distribution')
ax.set_xlabel('Age')
ax.set_ylabel('Response Count')
return fig # `plt.gcf()` 대신 `fig` 반환
# Shiny 앱 실행
app = App(app_ui, server)코드 해설
1. 연령 분포 히스토그램 (age_histogram 추가)
ui.output_plot("age_histogram")을 추가하여 UI에 그래프를 표시할 공간을 만듦.@output @render.plot데코레이터를 사용하여age_histogram()함수를 정의.survey_results.csv에서 데이터를 불러와matplotlib을 사용해 히스토그램을 생성.- 연령(
age) 필드를 기준으로 응답 수를 시각화.
2. 데이터가 없는 경우 예외 처리
if not Path(file_path).exists(): return조건을 추가하여 설문조사 데이터가 없을 경우 그래프를 표시하지 않도록 처리.
3. UI 업데이트
ui.output_plot("age_histogram")을 추가하여 응답자의 나이 분포를 실시간으로 시각화.
이렇게 하면 응답자들의 나이 분포를 한눈에 볼 수 있는 히스토그램이 생성됩니다. 데이터가 살아 움직이는 것 같지 않나요? (현재는 4건만 임의로 입력을 해서 제대로 된 히스토그램이 나오지는 않네요.)

8. 마무리: Shiny for Python의 무한한 가능성
지금까지 우리는 Shiny for Python을 사용하여 간단한 파이썬 설문조사 앱을 만들어보았습니다. 이것은 시작에 불과합니다! Shiny for Python을 사용하면 더 복잡하고 인터랙티브한 앱을 만들 수 있어요. 예를 들면 아래와 같습니다.
- 실시간으로 업데이트되는 대시보드
- 머신러닝 모델을 적용한 예측 앱
- 대규모 데이터 시각화 도구
여러분의 상상력이 곧 한계입니다!
파이썬 설문조사 만들기, 어떠셨나요? Shiny for Python의 사용법을 익히면서 데이터 수집부터 분석, 시각화까지 한 번에 할 수 있다는 게 정말 매력적이지 않나요? 이제 여러분도 자신만의 설문조사 앱을 만들 수 있는 기초 지식을 갖추셨습니다.
더 깊이 있는 학습을 원하신다면, Shiny for Python의 공식 문서를 참고해보세요. 그리고 무엇보다, 직접 만들어보는 것이 가장 좋은 학습 방법입니다. 여러분만의 독특한 설문조사 앱을 만들어보세요!
자, 이제 여러분의 차례입니다. 파이썬과 Shiny for Python으로 어떤 멋진 앱을 만들어보고 싶으신가요? 댓글로 여러분의 아이디어를 공유해주세요. 함께 성장하는 즐거움을 나눠봐요!







