본문으로 건너뛰기

005 데이터 로딩 - CSV, Excel, SQL 연동

키워드: 데이터 로딩, CSV, Excel

개요

머신러닝 프로젝트의 첫 단계는 데이터를 불러오는 것입니다. 실무에서는 CSV, Excel, 데이터베이스 등 다양한 형식으로 데이터가 저장되어 있습니다. 이 글에서는 각 데이터 소스에서 데이터를 로드하고 PyCaret에서 사용할 수 있는 형태로 준비하는 방법을 알아보겠습니다.

실습 환경

  • Python 버전: 3.11 권장
    • Python 3.11은 2027년 말까지 지원되며, PyCaret 호환 최신 버전입니다.
  • 필요 패키지: pycaret[full]>=3.0, pandas, matplotlib, openpyxl, sqlalchemy
pip install pycaret[full]>=3.0 pandas matplotlib openpyxl sqlalchemy

Google Colab 사용 불가 Google Colab은 2025년 8월부터 Python 3.12만 지원하여 PyCaret(3.8~3.11) 실습이 불가능합니다. 로컬 환경이나 Docker를 사용해 주세요.

1. CSV 파일 로딩

CSV(Comma-Separated Values)는 가장 일반적인 데이터 형식입니다.

기본 로딩

import pandas as pd

# 005 CSV 파일 로드
data = pd.read_csv('data.csv')

# 005 데이터 확인
print(data.shape)
print(data.head())

주요 옵션

# 005 인코딩 지정 (한글 파일)
data = pd.read_csv('korean_data.csv', encoding='utf-8')
# 005 또는
data = pd.read_csv('korean_data.csv', encoding='cp949')

# 005 구분자 지정
data = pd.read_csv('data.tsv', sep='\t') # 탭 구분
data = pd.read_csv('data.txt', sep='|') # 파이프 구분

# 005 특정 열만 로드
data = pd.read_csv('data.csv', usecols=['name', 'age', 'salary'])

# 005 행 건너뛰기
data = pd.read_csv('data.csv', skiprows=2) # 처음 2행 건너뛰기

# 005 결측치 지정
data = pd.read_csv('data.csv', na_values=['NA', 'N/A', '-', ''])

# 005 데이터 타입 지정
data = pd.read_csv('data.csv', dtype={'id': str, 'age': int})

# 005 날짜 파싱
data = pd.read_csv('data.csv', parse_dates=['date_column'])

대용량 CSV 처리

# 005 청크 단위로 로드 (메모리 효율적)
chunks = pd.read_csv('large_data.csv', chunksize=10000)

data_list = []
for chunk in chunks:
# 각 청크에 대한 처리
processed = chunk[chunk['value'] > 0]
data_list.append(processed)

data = pd.concat(data_list, ignore_index=True)

URL에서 직접 로드

# 005 웹에서 직접 CSV 로드
url = 'https://example.com/data.csv'
data = pd.read_csv(url)

2. Excel 파일 로딩

Excel 파일은 기업에서 많이 사용하는 형식입니다.

기본 로딩

# 005 openpyxl 패키지 필요
data = pd.read_excel('data.xlsx')

# 005 데이터 확인
print(data.head())

주요 옵션

# 005 특정 시트 로드
data = pd.read_excel('data.xlsx', sheet_name='Sheet2')

# 005 시트 인덱스로 로드 (0부터 시작)
data = pd.read_excel('data.xlsx', sheet_name=0)

# 005 모든 시트 로드 (딕셔너리로 반환)
all_sheets = pd.read_excel('data.xlsx', sheet_name=None)
for sheet_name, df in all_sheets.items():
print(f"{sheet_name}: {df.shape}")

# 005 특정 범위만 로드
data = pd.read_excel('data.xlsx', usecols='A:D', skiprows=2, nrows=100)

# 005 헤더가 없는 경우
data = pd.read_excel('data.xlsx', header=None)

# 005 특정 행을 헤더로 지정
data = pd.read_excel('data.xlsx', header=2) # 3번째 행을 헤더로

여러 시트 합치기

# 005 모든 시트를 하나로 합치기
all_sheets = pd.read_excel('data.xlsx', sheet_name=None)
combined = pd.concat(all_sheets.values(), ignore_index=True)

.xls 파일 (구 버전)

# 005 xlrd 패키지 필요 (pip install xlrd)
data = pd.read_excel('old_data.xls', engine='xlrd')

3. SQL 데이터베이스 연동

실무에서는 데이터베이스에서 직접 데이터를 가져오는 경우가 많습니다.

SQLite

import sqlite3

# 005 연결
conn = sqlite3.connect('database.db')

# 005 쿼리 실행
data = pd.read_sql('SELECT * FROM customers', conn)

# 005 연결 종료
conn.close()

# 005 또는 with 문 사용
with sqlite3.connect('database.db') as conn:
data = pd.read_sql('SELECT * FROM customers WHERE age > 30', conn)

MySQL

from sqlalchemy import create_engine

# 005 연결 문자열
engine = create_engine('mysql+pymysql://user:password@host:3306/database')

# 005 데이터 로드
data = pd.read_sql('SELECT * FROM orders', engine)

# 005 조건부 쿼리
query = """
SELECT
customer_id,
SUM(amount) as total_amount,
COUNT(*) as order_count
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
"""
data = pd.read_sql(query, engine)

PostgreSQL

from sqlalchemy import create_engine

engine = create_engine('postgresql://user:password@host:5432/database')
data = pd.read_sql('SELECT * FROM products', engine)

SQL Server

from sqlalchemy import create_engine

# 005 Windows 인증
engine = create_engine('mssql+pyodbc://server/database?driver=SQL+Server')

# 005 SQL 인증
engine = create_engine('mssql+pymssql://user:password@server/database')

data = pd.read_sql('SELECT * FROM sales', engine)

4. 기타 데이터 형식

JSON

# 005 JSON 파일 로드
data = pd.read_json('data.json')

# 005 중첩 JSON 처리
import json

with open('nested_data.json') as f:
raw = json.load(f)

# 005 중첩 구조 평탄화
data = pd.json_normalize(raw, record_path='items')

Parquet (대용량 데이터에 효율적)

# 005 Parquet 파일 로드 (pyarrow 필요)
data = pd.read_parquet('data.parquet')

# 005 Parquet으로 저장
data.to_parquet('output.parquet')

Pickle (Python 객체)

# 005 Pickle 로드
data = pd.read_pickle('data.pkl')

# 005 Pickle 저장
data.to_pickle('output.pkl')

5. PyCaret에서 데이터 사용하기

로드한 데이터를 PyCaret에서 바로 사용할 수 있습니다.

import pandas as pd
from pycaret.classification import *

# 005 데이터 로드
data = pd.read_csv('customer_churn.csv')

# 005 데이터 확인
print(f"데이터 크기: {data.shape}")
print(f"컬럼: {data.columns.tolist()}")
print(f"타겟 분포:\n{data['churn'].value_counts()}")

# 005 PyCaret 환경 설정
clf = setup(
data=data,
target='churn',
session_id=42
)

# 005 모델 학습 진행
best = compare_models()

데이터 품질 체크

def check_data_quality(df):
"""데이터 품질 체크 함수"""
print("=" * 50)
print("데이터 품질 리포트")
print("=" * 50)

# 기본 정보
print(f"\n1. 기본 정보")
print(f" - 행 수: {len(df):,}")
print(f" - 열 수: {len(df.columns)}")

# 결측치
print(f"\n2. 결측치")
missing = df.isnull().sum()
missing_pct = (missing / len(df) * 100).round(2)
for col in df.columns:
if missing[col] > 0:
print(f" - {col}: {missing[col]:,} ({missing_pct[col]}%)")

# 데이터 타입
print(f"\n3. 데이터 타입")
print(f" - 수치형: {df.select_dtypes(include=['number']).columns.tolist()}")
print(f" - 범주형: {df.select_dtypes(include=['object']).columns.tolist()}")

# 중복
print(f"\n4. 중복 행: {df.duplicated().sum():,}")

return None

# 005 사용 예
data = pd.read_csv('data.csv')
check_data_quality(data)

실행 결과

==================================================
데이터 품질 리포트
==================================================

1. 기본 정보
- 행 수: 10,000
- 열 수: 15

2. 결측치
- age: 50 (0.5%)
- income: 120 (1.2%)

3. 데이터 타입
- 수치형: ['age', 'income', 'balance']
- 범주형: ['gender', 'region', 'product']

4. 중복 행: 0

정리

  • CSV: pd.read_csv() - 가장 범용적인 형식
  • Excel: pd.read_excel() - 기업 데이터에 많이 사용
  • SQL: pd.read_sql() - 데이터베이스 직접 연동
  • JSON: pd.read_json() - API 응답 데이터
  • Parquet: pd.read_parquet() - 대용량 데이터에 효율적
  • 데이터 로드 후 품질 체크를 습관화하세요.

다음 글 예고

다음 글에서는 PyCaret 내장 데이터세트 활용하기에 대해 알아보겠습니다. PyCaret이 제공하는 학습용 데이터세트를 활용하여 빠르게 실습하는 방법을 다룹니다.


PyCaret 머신러닝 마스터 시리즈 #005