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