python
Shiny Python

title: "Shiny Python: 초보자를 위한 노력 없는 데이터 시각화 가이드" description: "Shiny Python은 데이터 시각화 라이브러리의 힘을 활용하여 쉽게 멋진 데이터 시각화를 만들기 위한 초보자를 위한 포괄적인 가이드입니다." date: 2024-05-04 language: ko

Shiny Python: 초보자를 위한 노력 없는 데이터 시각화 가이드

MoeNagy Dev

Shiny Python이란?

Shiny Python은 Python 프로그래밍 언어를 사용하여 대화형 웹 애플리케이션을 구축하기 위한 강력한 프레임워크입니다. 최소한의 노력으로 동적인 데이터 기반 웹 애플리케이션을 개발하기 위한 도구와 구성 요소를 제공합니다.

Shiny Python은 종종 Flask와 Django 같은 인기 있는 Python 웹 프레임워크와 비교되지만, 데이터 시각화, 분석 및 탐색을 위한 고도로 상호작용하고 반응성 있는 사용자 인터페이스(UI)를 구축하는 데 중점을 두어 돋보입니다.

Shiny Python을 사용한 웹 개발의 장점

  1. 상호작용식 UI: Shiny Python을 사용하면 사용자 입력에 응답하고 실시간으로 업데이트되는 대화형 사용자 인터페이스를 쉽게 생성할 수 있으며, 사용자 경험을 원활하게하고 매력적으로 만들어줍니다.

  2. 빠른 프로토타이핑: Shiny Python을 사용하면 웹 애플리케이션을 빠르게 구축하고 반복할 수 있어 빠른 개발 및 아이디어 테스트가 가능합니다.

  3. Python 라이브러리 통합: Shiny Python은 데이터 처리, 분석 및 시각화를 위한 Python 라이브러리와 모듈의 거대한 생태계를 활용할 수 있어 데이터 기반 애플리케이션 구축에 강력한 도구입니다.

  4. 반응형 프로그래밍: Shiny Python의 반응형 프로그래밍 모델은 애플리케이션 상태 관리 및 사용자 인터페이스와 서버 측 로직 간의 조정을 간단하게 만듭니다.

  5. 배포 및 호스팅: Shiny Python 애플리케이션은 클라우드 서비스를 포함한 다양한 호스팅 플랫폼에 쉽게 배포할 수 있어 웹 개발에 다재다능한 선택지입니다.

Shiny Python 시작하기

Shiny Python과 종속성 설치하기

Shiny Python을 시작하려면 시스템에 Python이 설치되어 있어야 합니다. Shiny Python은 Dash 프레임워크 위에서 구축되므로 필요한 종속성도 설치해야 합니다.

Python 패키지 설치 프로그램인 pip을 사용하여 Shiny Python과 종속성을 설치할 수 있습니다:

pip install shiny

위 명령을 실행하면 Shiny Python과 함께 Dash, Flask, Plotly 등의 종속성이 설치됩니다.

새로운 Shiny Python 프로젝트 설정하기

Shiny Python을 설치한 후, 응용 프로그램을 위한 디렉터리를 설정하여 새 프로젝트를 만들 수 있습니다. 이 디렉터리에서 일반적으로 다음과 같은 구조를 갖게 됩니다:

my_shiny_app/
├── app.py
├── requirements.txt
└── assets/
    ├── styles.css
    └── images/
        └── logo.png

app.py 파일은 Shiny Python 응용 프로그램의 주 진입점이며 사용자 인터페이스 및 서버 로직을 정의합니다. requirements.txt 파일에는 응용 프로그램에 필요한 Python 패키지가 나열되어 있으며, 배포를 위해 사용될 수 있습니다. assets 디렉터리는 응용 프로그램이 필요로하는 CSS 스타일시트 및 이미지와 같은 정적 파일을 저장하는 데 사용됩니다.

Shiny Python 디렉터리 구조 이해하기

Shiny Python 디렉터리 구조는 다른 Python 웹 프레임워크와 유사한 패턴을 따르지만, Shiny Python에 특화된 몇 가지 추가 구성 요소가 있습니다:

  • app.py: Shiny Python 응용 프로그램의 주 진입점입니다. 여기에서 사용자 인터페이스와 서버 로직을 정의합니다.
  • ui.py: 이 파일에는 레이아웃, 입력 및 출력 등 사용자 인터페이스의 정의가 포함됩니다.
  • server.py: 이 파일은 사용자 입력을 처리하고 응용 프로그램 상태를 업데이트하는 서버 측 로직을 정의합니다.
  • callbacks.py: 이 파일에는 사용자 인터페이스와 서버 로직을 연결하는 콜백 함수가 포함되어 있습니다.
  • models.py: 응용 프로그램에서 데이터 모델이나 데이터베이스 상호작용을 사용하는 경우 이를 정의할 수 있습니다.
  • utils.py: 이 파일에는 응용 프로그램 전체에서 사용되는 도우미 함수나 유틸리티가 포함될 수 있습니다.
  • assets/: 이 디렉터리에는 응용 프로그램이 필요로하는 CSS, JavaScript, 이미지 등의 정적 파일이 저장됩니다.

ui.py, server.pycallbacks.py 파일 간의 역할 분담을 통해 Shiny Python 응용 프로그램을 조직화하고 유지 보수 가능한 상태로 유지할 수 있습니다.

간단한 Shiny Python 응용 프로그램 만들기

사용자가 숫자를 입력하고 해당 숫자의 제곱을 표시할 수 있는 간단한 Shiny Python 응용 프로그램을 만들어 보겠습니다.

Shiny Python 구성 요소를 사용하여 사용자 인터페이스(UI) 생성하기

ui.py 파일에서 응용 프로그램의 사용자 인터페이스를 정의합니다:

from shiny import ui
 
app_ui = ui.page_fluid(
    ui.layout_sidebar(
        ui.panel_sidebar(
            ui.input_numeric("number", "숫자를 입력하세요", value=0, min_value=0, max_value=100)
        ),
        ui.panel_main(
            ui.output_text_verbatim("output_text")
        )
    )
)

이 예제에서는 ui.page_fluid() 함수를 사용하여 유동 너비 페이지 레이아웃을 생성합니다. 페이지 내에서 ui.layout_sidebar()를 사용하여 사이드바와 메인 패널 레이아웃을 생성합니다.

사이드바 패널에는 ui.input_numeric()을 사용하여 숫자를 입력할 수 있는 입력 필드가 있습니다. 메인 패널에는 ui.output_text_verbatim()를 사용하여 사용자가 입력한 숫자의 제곱을 표시할 텍스트 영역이 있습니다.

서버 로직 정의 및 사용자 상호작용 처리하기

이제 server.py 파일을 만들어 서버 측 로직을 정의해 봅시다:

from shiny import App, Inputs, Outputs, Session
 
def server(input, output, session):
    @Outputs("output_text")
    def square_number():
        number = input.number()
        return f"{number}의 제곱은 {number ** 2}입니다."
 
app = App(server, ui)

server() 함수에서는 사용자의 입력 값을 가져와서 해당 값의 제곱을 계산하여 문자열로 반환하는 반응형 표현식 square_number()을 정의합니다. Outputs() 데코레이터는 이 서버 함수를 사용자 인터페이스의 output_text 출력과 연결하는 데 사용됩니다.

어플리케이션 렌더링 및 로컬에서 실행

Shiny Python 어플리케이션을 실행하기 위해 사용자 인터페이스와 서버 로직을 함께 가져올 app.py 파일을 생성해야 합니다:

from shiny import App, get_app, run_app
from ui import app_ui
from server import server
 
app = App(app_ui, server)
 
if __name__ == "__main__":
    run_app(app)

app.py 파일에서는 각 파일에서 app_uiserver 정의를 가져온 후, 이를 App() 생성자에 전달하여 새로운 App 인스턴스를 생성합니다.

마지막으로 run_app() 함수를 호출하여 Shiny Python 어플리케이션을 실행하고 로컬에서 개발할 수 있게 합니다.

app.py 파일을 실행하여 어플리케이션을 실행할 수 있습니다:

python app.py

이렇게 하면 Shiny Python 어플리케이션이 시작되고 기본 웹 브라우저에서 열리며, 입력한 숫자의 제곱을 볼 수 있습니다.

Shiny Python UI 구성요소

Shiny Python은 웹 어플리케이션을 구축할 수 있는 다양한 사용자 인터페이스(UI) 구성요소를 제공합니다. 이러한 구성요소에는 입력, 출력, 레이아웃 등이 포함됩니다.

사용 가능한 UI 구성요소 개요

일반적으로 사용되는 Shiny Python UI 구성요소 중 일부는 다음과 같습니다:

  • Inputs: ui.input_text(), ui.input_numeric(), ui.input_slider(), ui.input_checkbox(), ui.input_date()
  • Outputs: ui.output_text(), ui.output_table(), ui.output_plot(), ui.output_download()
  • Layouts: ui.layout_sidebar(), ui.layout_grid(), ui.layout_row(), ui.layout_column()
  • Containers: ui.panel_sidebar(), ui.panel_main(), ui.tab_panel(), ui.accordion_panel()

각 구성요소는 고유한 속성과 옵션을 가지고 있으며, 이를 사용하여 어플리케이션의 외형과 동작을 사용자 정의할 수 있습니다.

UI 구성요소의 외형과 동작 사용자 정의하기

UI 구성요소의 외형과 동작을 사용자 정의하기 위해 다양한 속성을 설정할 수 있습니다. 예를 들어, ui.input_text() 구성요소에서는 label, value, placeholder 등의 속성을 설정하여 입력 필드의 외형과 기능을 제어할 수 있습니다.

다음은 텍스트 입력 필드의 외형을 사용자 정의하는 예시입니다:

ui.input_text(
    "name",
    "이름을 입력하세요",
    value="홍길동",
    placeholder="여기에 이름을 입력하세요",
    style={"width": "300px", "font-size": "16px"}
)

이 예시에서 ui.input_text() 구성요소의 label, value, placeholder, style 속성을 설정하여 외형을 사용자 정의합니다.

복잡한 어플리케이션을 위한 UI의 조직화 및 구조화

Shiny Python 어플리케이션이 복잡해짐에 따라, UI를 조직화하고 구조화하여 관리와 유지보수가 용이하도록 하는 것이 중요합니다.

일반적인 접근 방식은 ui.layout_sidebar(), ui.layout_grid(), ui.tab_panel()과 같은 레이아웃 구성요소를 사용하여 구조화된 직관적인 UI를 생성하는 것입니다. 또한 ui.panel_sidebar()ui.panel_main()과 같은 컨테이너 구성요소를 사용하여 관련된 UI 요소를 함께 그룹화할 수 있습니다.

다음은 보다 복잡한 UI 구조의 예시입니다:

app_ui = ui.page_fluid(
    ui.layout_sidebar(
        ui.panel_sidebar(
            ui.input_text("name", "이름을 입력하세요"),
            ui.input_numeric("age", "나이를 입력하세요", min_value=0, max_value=120)
        ),
        ui.panel_main(
            ui.tab_panel(
                ui.tab("개요", ui.output_text_verbatim("overview_text")),
                ui.tab("차트",
                    ui.layout_grid(
                        ui.output_plot("plot1"),
                        ui.output_plot("plot2")
                    )
                ),
                ui.tab("다운로드", ui.output_download("download_button"))
            )
        )
    )
)

이 예시에서는 사이드바 레이아웃을 사용하여 사이드바 패널에 입력 필드를 배치하고, 메인 패널에 탭 레이아웃을 사용합니다. 탭 레이아웃에는 "개요", "차트", "다운로드"와 같이 각각의 출력을 위한 탭이 있습니다.

이러한 방식으로 UI를 조직화함으로써, 탐색과 유지보수가 용이한 복잡하고 직관적인 어플리케이션을 만들 수 있습니다.

Shiny Python 서버 함수

Shiny Python 어플리케이션의 서버 사이드 로직은 server.py 파일에서 정의됩니다. 여기서는 사용자 입력을 처리하고 데이터 처리 및 분석을 수행하며, 어플리케이션 상태를 업데이트합니다.

사용자 입력 처리 및 어플리케이션 상태 업데이트하기

서버 사이드 로직에서는 사용자 입력에 응답하고 이에 따라 어플리케이션 상태를 업데이트하는 함수를 정의할 수 있습니다. 이러한 함수들은 일반적으로 Inputs() 데코레이터로 꾸며지며, 이를 통해 사용자 인터페이스의 대응하는 입력 구성요소와 연결됩니다.

다음은 텍스트 입력을 처리하고 어플리케이션 상태를 업데이트하는 서버 함수의 예시입니다:

from shiny import Inputs, Outputs
 
def server(input, output, session):
    @Inputs("name")
    def greet_user():
        name = input.name()
        return f"안녕하세요, {name}님!"
 
    @Outputs("greeting")
    def display_greeting():
        return greet_user()

이 예시에서 greet_user() 함수는 Inputs("name")로 꾸며져 있으며, 이는 "name" 입력의 값이 변경될 때마다 함수가 호출됨을 의미합니다. 해당 함수는 사용자 이름을 가져와서 인사말과 함께 반환합니다.

display_greeting() 함수는 Outputs("greeting")로 꾸며져 있으며, 이는 해당 함수의 반환 값이 사용자 인터페이스의 "greeting" 출력을 업데이트하는 데 사용됨을 의미합니다.

서버에서 데이터 처리 및 분석 수행하기

Shiny Python은 데이터 처리, 분석 및 시각화를 위한 다양한 Python 라이브러리와 모듈과 애플리케이션을 통합할 수 있게 해줍니다. 이는 서버 측 로직 내에서 수행할 수 있습니다.

다음은 간단한 데이터 분석을 수행하고 플롯을 생성하는 서버 함수의 예입니다:

import pandas as pd
from shiny import Inputs, Outputs, session
 
def server(input, output, session):
    @Inputs("dataset")
    def analyze_dataset(dataset):
        df = pd.read_csv(dataset)
        summary = df.describe()
        return summary
 
    @Outputs("dataset_summary")
    def display_dataset_summary():
        summary = analyze_dataset(session.userData.get("dataset", None))
        return summary.to_html()
 
    @Outputs("dataset_plot")
    def plot_dataset():
        df = pd.read_csv(session.userData.get("dataset", None))
        return df.plot()

이 예에서 analyze_datasetdisplay_dataset_summary 함수는 주어진 데이터셋을 분석하고 데이터셋 요약을 반환하는 입력 및 출력 함수입니다. plot_dataset 함수는 데이터셋을 플롯으로 반환합니다.

데이터 구조

리스트

리스트는 파이썬에서 가장 기본적인 데이터 구조 중 하나입니다. 이들은 서로 다른 데이터 유형의 순서가 있는 항목의 컬렉션입니다. 다음은 예입니다:

fruits = ['apple', 'banana', 'cherry']
print(fruits)  # 출력: ['apple', 'banana', 'cherry']

리스트의 각 요소에는 0부터 시작하는 인덱스를 사용하여 개별적으로 액세스할 수 있습니다:

print(fruits[0])  # 출력: 'apple'
print(fruits[1])  # 출력: 'banana'

리스트의 요소를 수정할 수도 있습니다:

fruits[1] = 'orange'
print(fruits)  # 출력: ['apple', 'orange', 'cherry']

리스트에는 추가, 제거, 정렬 등 다양한 작업을 수행하는 데 사용할 수 있는 많은 내장 메서드가 있습니다.

튜플

튜플은 리스트와 비슷하지만, 생성된 후에 요소를 수정할 수 없다는 점이 다릅니다. 튜플은 대괄호 대신 괄호를 사용하여 정의됩니다:

point = (3, 4)
print(point)  # 출력: (3, 4)

튜플은 점의 좌표나 직사각형의 차원과 같은 고정된 값 집합을 저장하는 데 유용할 수 있습니다.

사전

사전은 키-값 쌍의 비순서 컬렉션입니다. 고유한 키를 사용하여 데이터를 빠르게 저장하고 검색하는 데 사용할 수 있습니다. 다음은 예입니다:

person = {
    'name': 'John Doe',
    'age': 30,
    'city': 'New York'
}
print(person['name'])  # 출력: 'John Doe'
print(person['age'])  # 출력: 30

사전에서 키-값 쌍을 추가, 수정, 제거할 수 있습니다:

person['email'] = 'john.doe@example.com'
person['age'] = 31
del person['city']
print(person)  # 출력: {'name': 'John Doe', 'age': 31, 'email': 'john.doe@example.com'}

사전은 간단한 키-값 저장소부터 복잡한 중첩된 구조까지 다양한 데이터 구조를 나타내는 데 사용할 수 있습니다.

집합

집합은 고유한 요소의 비순서 컬렉션입니다. 데이터 컬렉션에 대해 합집합, 교집합, 차집합과 같은 작업을 수행하는 데 유용합니다. 다음은 예입니다:

colors = {'red', 'green', 'blue'}
print(colors)  # 출력: {'red', 'green', 'blue'}
 
# 집합에 요소 추가
colors.add('yellow')
print(colors)  # 출력: {'red', 'green', 'blue', 'yellow'}
 
# 집합에서 요소 제거
colors.remove('green')
print(colors)  # 출력: {'red', 'blue', 'yellow'}

집합은 컬렉션의 중복 값을 제거하는 데 특히 유용하거나 집합을 기반으로 한 작업을 수행하는 데 유용합니다.

흐름 제어

조건문

파이썬의 조건문을 사용하면 특정 조건에 따라 다른 코드를 실행할 수 있습니다. 가장 일반적인 조건문은 if-elif-else 문입니다:

x = 10
if x > 0:
    print("x는 양수입니다")
elif x < 0:
    print("x는 음수입니다")
else:
    print("x는 0입니다")

또한 삼항 연산자를 사용할 수 있으며, 이는 간단한 if-else 문을 더 간결하게 작성하는 방법을 제공합니다:

age = 18
is_adult = "예" if age >= 18 else "아니오"
print(is_adult)  # 출력: "예"

반복문

파이썬의 반복문을 사용하면 코드 블록을 반복해서 실행할 수 있습니다. 가장 일반적인 두 종류의 반복문은 for 루프와 while 루프입니다.

for 루프는 시퀀스(리스트, 튜플, 문자열과 같은)를 반복하는 데 사용됩니다:

fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
    print(fruit)

while 루프는 특정 조건이 참인 경우에 지정된 코드 블록을 반복해서 실행하는 데 사용됩니다:

count = 0
while count < 5:
    print(count)
    count += 1

breakcontinue 문을 사용하여 반복문의 흐름을 제어할 수도 있습니다:

for i in range(10):
    if i == 5:
        break  # i가 5일 때 루프를 종료합니다
    if i % 2 == 0:
        continue  # i가 짝수인 경우 현재 반복을 건너뜁니다
    print(i)  # 출력: 1, 3, 7, 9

함수

파이썬에서 함수는 특정 작업을 수행하는 재사용 가능한 코드 블록입니다. 인수를 가져오고 값을 반환할 수도 있습니다. 다음은 간단한 예입니다:

def greet(name):
    print(f"안녕하세요, {name}!")
 
greet("Alice")  # 출력: "안녕하세요, Alice!"

기본 인수와 가변 인수를 가진 함수를 정의할 수도 있습니다:

def calculate_area(length, width, height=1):
    return length * width * height
 
print(calculate_area(2, 3))  # 출력: 6
print(calculate_area(2, 3, 4))  # 출력: 24

함수는 재귀적으로 정의될 수도 있으며, 이는 문제를 해결하기 위해 자기 자신을 호출할 수 있음을 의미합니다:

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)
 
print(factorial(5))  # 출력: 120

모듈과 패키지

파이썬의 풍부한 표준 라이브러리와 타사 패키지는 프로그램에서 사용할 수 있는 다양한 기능을 제공합니다. 모듈이나 패키지를 사용하려면 해당 모듈이나 패키지를 가져와야 합니다.

다음은 math 모듈을 가져와서 해당 함수를 사용하는 예시입니다:

import math
 
print(math.pi)  # 출력: 3.141592653589793
print(math.sqrt(16))  # 출력: 4.0

특정 함수나 속성을 모듈로부터 가져올 수도 있습니다:

수학에서 파이와 제곱근을 사용하기 위해 다음과 같이 math 모듈을 가져옵니다.
 
print(pi)  # 출력: 3.141592653589793
print(sqrt(16))  # 출력: 4.0
 
또한, 자신만의 모듈과 패키지를 생성하여 코드를 구성하고 재사용성을 높일 수도 있습니다.
 
## 결론
이 튜토리얼에서는 Python에서 다양한 데이터 구조, 제어문, 함수 및 모듈에 대해 배웠습니다. 이것들은 Python 프로그램의 기본적인 구성 요소입니다. 이 지식을 활용하여 더 복잡하고 강력한 응용 프로그램을 작성할 수 있습니다. 기억하세요, 능숙한 Python 프로그래머가 되기 위한 핵심은 계속해서 연습하고 실험하며 학습하는 것입니다. 행운을 빕니다!
 
[![MoeNagy Dev](https://raw.githubusercontent.com/lynn-mikami/Images/main/moenagy-dev.png)](/)