본문 바로가기
데이터

파이썬 Python과 Pandas를 이용한 MS SQL 데이터 연동 및 막대그래프 시각화

by 웨더맨 2025. 7. 9.
반응형

파이썬 Python과 Pandas를 이용한 MS SQL 데이터 연동 및 막대그래프 시각화

안녕하세요! MS SQL Server의 데이터를 Python으로 연동하여 Pandas로 데이터를 처리하고, Matplotlib 라이브러리를 사용해 간단한 막대그래프로 시각화하는 전체 과정과 소스 코드를 상세히 설명해 드리겠습니다.

전체 프로세스 요약

  1. 환경 설정: 필요한 Python 라이브러리를 설치합니다.
  2. DB 연결 정보 설정: Python이 MS SQL Server에 접속할 수 있도록 연결 정보를 설정합니다.
  3. 데이터 가져오기: '아빠를 사용하여 SQL 쿼리를 실행하고, 결과를 DataFrame 객체로 불러옵니다.팬더
  4. 데이터 가공 (필요시): 시각화에 적합한 형태로 데이터를 집계하거나 가공합니다.
  5. 시각화: '마을 사용하여 가공된 데이터를 막대그래프로 그립니다.매트플롯립

1단계: 환경 설정 및 라이브러리 설치

가장 먼저, 데이터베이스 연동, 데이터 처리, 시각화에 필요한 라이브러리들을 설치해야 합니다. 터미널(CMD, PowerShell 등)을 열고 아래 명령어를 실행하세요.

  • 팬더: 데이터를 표(DataFrame) 형태로 다루기 위한 필수 라이브러리입니다.
  • 파이오드비씨: Python이 MS SQL Server와 통신할 수 있도록 해주는 ODBC 드라이버 연결 라이브러리입니다.
  • 매트플롯립: 데이터를 그래프로 시각화하는 라이브러리입니다.

생성된 bash

pip install pandas pyodbc matplotlib

※ 참고: 파이오드비씨를 사용하려면 시스템에 가 설치되어 있어야 합니다. 최신 Windows 환경에는 대부분 기본적으로 포함되어 있지만, 만약 연결 오류가 발생한다면 SQL Server용 ODBC 드라이버Microsoft ODBC Driver for SQL Server 다운로드 페이지에서 직접 설치해주세요.


2단계: 소스 코드 작성 (연결부터 시각화까지)

이제 전체 과정을 하나의 Python 스크립트로 작성해 보겠습니다.

아래 예제는 가상의 테이블에서 **제품 카테고리(ProductCategory)별 매출 합계(SalesAmount)**를 계산하여 막대그래프로 보여주는 시나리오를 기반으로 합니다.영업

예시 테이블 구조 (dbo입니다. 영업)

주문 ID 제품 카테고리 판매 금액 주문 날짜
1 전자제품 1200000 2023-01-05
2 의류 85000 2023-01-06
3 전자제품 850000 2023-01-07
4 도서 25000 2023-01-08
5 의류 150000 2023-01-09

전체 Python 소스 코드

생성된 파이썬

import pandas as pd
import pyodbc
import matplotlib.pyplot as plt
import platform

# -------------------------------------------------------------
# 1. DB 연결 정보 설정 (사용자 환경에 맞게 수정해주세요)
# -------------------------------------------------------------
# Windows 인증을 사용하는 경우
# conn_str = (
#     r'DRIVER={ODBC Driver 17 for SQL Server};'
#     r'SERVER=your_server_name;' # 예: DESKTOP-12345\SQLEXPRESS 또는 IP주소
#     r'DATABASE=your_database_name;'
#     r'Trusted_Connection=yes;'
# )

# SQL Server 인증을 사용하는 경우
conn_str = (
    r'DRIVER={ODBC Driver 17 for SQL Server};'
    r'SERVER=your_server_name_or_ip;'  # 예: 192.168.0.100 or SERVER_NAME
    r'DATABASE=your_database_name;' # 예: MyDatabase
    r'UID=your_username;'           # 예: sa
    r'PWD=your_password;'           # 예: 1234
)

# -------------------------------------------------------------
# 2. DB 연결 및 데이터 가져오기
# -------------------------------------------------------------
conn = None # 연결 객체 초기화
try:
    # 데이터베이스에 연결
    conn = pyodbc.connect(conn_str)
    print("MS SQL 데이터베이스 연결 성공!")

    # 실행할 SQL 쿼리 작성
    # 제품 카테고리별로 매출(SalesAmount)의 합계를 구하는 쿼리
    sql_query = """
    SELECT 
        ProductCategory, 
        SUM(SalesAmount) AS TotalSales
    FROM 
        dbo.Sales
    GROUP BY 
        ProductCategory
    ORDER BY 
        TotalSales DESC;
    """

    # pandas의 read_sql_query 함수로 쿼리 결과를 바로 DataFrame으로 로드
    df = pd.read_sql_query(sql_query, conn)

    print("\n--- 불러온 데이터 (DataFrame) ---")
    print(df)

# 예외 처리
except pyodbc.Error as ex:
    sqlstate = ex.args[0]
    print(f"데이터베이스 연결 또는 쿼리 실행 중 오류 발생: {sqlstate}")
    df = pd.DataFrame() # 오류 발생 시 빈 데이터프레임 생성

# finally 블록을 사용하여 연결이 성공했든 실패했든 항상 연결을 닫도록 보장
finally:
    if conn:
        conn.close()
        print("\n데이터베이스 연결이 종료되었습니다.")


# -------------------------------------------------------------
# 3. 데이터 시각화 (막대 그래프)
# -------------------------------------------------------------
if not df.empty:
    # 한글 폰트 설정 (Windows, Mac 환경에 맞게)
    if platform.system() == 'Windows':
        plt.rc('font', family='Malgun Gothic')
    elif platform.system() == 'Darwin': # Mac OS
        plt.rc('font', family='AppleGothic')
    else: # Linux
        # 리눅스의 경우 나눔고딕 등 설치된 폰트를 지정해야 합니다.
        plt.rc('font', family='NanumGothic')

    # 마이너스 부호 깨짐 방지
    plt.rcParams['axes.unicode_minus'] = False

    # 그래프 그리기
    plt.figure(figsize=(10, 6)) # 그래프 크기 설정
    
    # 막대 그래프 생성
    # x축에는 'ProductCategory', y축에는 'TotalSales' 데이터를 사용
    plt.bar(df['ProductCategory'], df['TotalSales'], color='skyblue')

    # 그래프 제목 및 축 레이블 설정
    plt.title('카테고리별 총 매출', fontsize=16)
    plt.xlabel('제품 카테고리', fontsize=12)
    plt.ylabel('총 매출액 (원)', fontsize=12)
    
    # x축 레이블이 길 경우 45도 회전하여 겹치지 않게 함
    plt.xticks(rotation=45)

    # 그래프 레이아웃을 깔끔하게 조정
    plt.tight_layout()

    # 그래프 보여주기
    plt.show()
else:
    print("\n시각화할 데이터가 없습니다.")

코드 단계별 상세 설명

1. DB 연결정보 설정 (conn_str)

  • 운전사: 사용할 ODBC 드라이버를 지정합니다. 가 가장 최신이며 안정적입니다.{SQL Server용 ODBC 드라이버 17}
  • 서버: 연결할 MS SQL Server의 이름이나 IP 주소를 입력합니다. (예: , , localhost192.168.1.5PC이름\SQLEXPRESS)
  • 데이터베이스: 접속할 데이터베이스의 이름을 입력합니다.
  • 사용자 정의 / 증권 시세 표시기: SQL Server 인증 방식일 경우 사용자 아이디와 비밀번호를 입력합니다.
  • Trusted_Connection=예;: Windows 인증(현재 로그인한 Windows 계정으로 인증)을 사용할 경우 / 대신 이 옵션을 사용합니다.사용자 정의증권 시세 표시기

⚠️ 보안 경고: 실제 프로젝트에서는 위 코드처럼 소스에 직접 비밀번호를 적는 것은 위험합니다. 환경 변수나 별도의 설정 파일을 사용하여 관리하는 것이 좋습니다.

2. DB 연결 및 데이터 가져오기 (노력하다... 제외한... 마침내)

  • pyodbc.connect(conn_str): 위에서 정의한 연결 문자열을 사용해 데이터베이스에 접속합니다.
  • sql_query: 실행하고 싶은 SQL 문을 문자열로 작성합니다. 이 예제에서는 카테고리별로 매출 합계를 구하는 집계 쿼리를 사용했습니다. 를 사용하여 데이터를 시각화하기 좋은 형태로 미리 가공하는 것이 효율적입니다.그룹화 기준
  • pd.read_sql_query(sql_query, 코네티컷): 이 함수는 데이터베이스 연결()과 SQL 쿼리()를 인자로 받아, 쿼리 실행 결과를 즉시 Pandas DataFrame 객체로 만들어 반환합니다. 이 함수 덕분에 커서(cursor)를 생성하고 데이터를 하나씩 가져오는 복잡한 과정 없이 코드를 매우 간결하게 작성할 수 있습니다.가장 핵심적인 부분입니다.코네티컷sql_query
  • 노력하다... 마침내: 데이터베이스 작업 시에는 구문을 사용하여, 프로그램 실행 중 오류가 발생하더라도 노력하다... 마침내마침내 블록의 가 반드시 실행되도록 하여 안전하게 데이터베이스 연결을 종료하는 것이 좋습니다.conn.close()

3. 데이터 시각화 (matplotlib.pyplot)

  • 한글 폰트 설정: Matplotlib의 기본 폰트는 한글을 지원하지 않아 글자가 깨져 보입니다. 따라서 운영체제에 맞는 한글 폰트를 명시적으로 설정해주어야 합니다. 으로 현재 운영체제를 확인하여 자동으로 폰트를 지정하도록 했습니다.플랫폼.system()
  • plt.figure(figsize=(10, 6)): 그래프가 그려질 도화지(Figure)의 크기를 정합니다.
  • plt.bar(x, y): 막대그래프를 그리는 함수입니다.
    • 첫 번째 인자 는 x축에 표시될 항목들입니다.df['제품 카테고리']
    • 두 번째 인자 는 y축에 표시될 값(막대의 높이)입니다.df['총 판매량']
  • plt.title(), , : 그래프의 제목과 각 축의 이름을 지정하여 그래프의 가독성을 높입니다.plt.xlabel()을 참조하십시오.plt.ylabel()
  • plt.xticks(회전=45): x축의 라벨(카테고리 이름)이 길어서 서로 겹칠 때, 45도 기울여서 잘 보이게 만듭니다.
  • plt.tight_layout(): 제목, 라벨 등이 그래프 영역 밖으로 나가지 않도록 자동으로 여백을 조절해줍니다.
  • plt.show()를 참조하십시오.: 위에서 설정한 모든 내용으로 그래프를 화면에 최종적으로 출력합니다.

이 과정을 통해 MS SQL Server의 데이터를 손쉽게 Python으로 분석하고 시각화할 수 있습니다. SQL 쿼리만 변경하면 얼마든지 다른 데이터를 가져와 다양한 그래프로 표현할 수 있습니다.

728x90
반응형

댓글