005 데이터 로딩 - CSV, Excel, SQL 연동
키워드: 데이터 로딩, CSV, Excel
개요
머신러닝의 시작은 데이터 로딩입니다. 실무에서는 CSV 파일, Excel 스프레드시트, SQL 데이터베이스 등 다양한 소스에서 데이터를 가져옵니다.
이 글에서는 pandas를 활용해 다양한 형식의 데이터를 불러오고, FLAML에 적용하는 방법을 알아보겠습니다.
실습 환경
- Python 버전: 3.11 권장
- 필요 패키지:
flaml[automl], pandas, openpyxl, sqlalchemy
pip install flaml[automl] pandas openpyxl sqlalchemy
CSV 파일 로딩
CSV(Comma-Separated Values)는 가장 일반적인 데이터 형식입니다.
기본 CSV 로딩
import pandas as pd
# 005 CSV 파일 읽기
df = pd.read_csv('data.csv')
# 005 데이터 확인
print(df.head())
print(df.shape)
print(df.dtypes)
CSV 로딩 옵션
# 005 다양한 옵션 사용
df = pd.read_csv(
'data.csv',
encoding='utf-8', # 인코딩 지정
sep=',', # 구분자 (기본값: 콤마)
header=0, # 헤더 행 위치
index_col=None, # 인덱스로 사용할 열
usecols=['col1', 'col2'], # 특정 열만 로드
nrows=1000, # 처음 N행만 로드
na_values=['NA', 'N/A'], # 결측치로 처리할 값
dtype={'col1': 'int32'} # 데이터 타입 지정
)
한글 CSV 처리
# 005 한글이 포함된 CSV
df = pd.read_csv('korean_data.csv', encoding='cp949') # Windows
df = pd.read_csv('korean_data.csv', encoding='utf-8-sig') # Mac/Linux
대용량 CSV 처리
# 005 청크 단위로 읽기
chunks = pd.read_csv('large_data.csv', chunksize=10000)
df_list = []
for chunk in chunks:
# 청크별 처리
processed = chunk[chunk['value'] > 0]
df_list.append(processed)
df = pd.concat(df_list, ignore_index=True)
Excel 파일 로딩
Excel 파일(.xlsx, .xls)은 비즈니스 환경에서 흔히 사용됩니다.
기본 Excel 로딩
# 005 Excel 파일 읽기 (openpyxl 필요)
df = pd.read_excel('data.xlsx')
# 005 특정 시트 읽기
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 005 여러 시트 읽기
sheets = pd.read_excel('data.xlsx', sheet_name=None) # 딕셔너리로 반환
for sheet_name, sheet_df in sheets.items():
print(f"{sheet_name}: {sheet_df.shape}")
Excel 로딩 옵션
df = pd.read_excel(
'data.xlsx',
sheet_name=0, # 첫 번째 시트
header=0, # 헤더 행
skiprows=2, # 처음 2행 건너뛰기
usecols='A:D', # A~D 열만 로드
nrows=100 # 처음 100행만 로드
)
구버전 Excel (.xls)
# 005 xlrd 패키지 필요
pip install xlrd
df = pd.read_excel('old_data.xls', engine='xlrd')
SQL 데이터베이스 연동
SQLite 연동
import sqlite3
import pandas as pd
# 005 SQLite 연결
conn = sqlite3.connect('database.db')
# 005 SQL 쿼리로 데이터 로드
df = pd.read_sql_query("SELECT * FROM customers", conn)
# 005 연결 종료
conn.close()
SQLAlchemy 사용 (권장)
from sqlalchemy import create_engine
import pandas as pd
# 005 데이터베이스 엔진 생성
engine = create_engine('sqlite:///database.db')
# 005 테이블 전체 로드
df = pd.read_sql_table('customers', engine)
# 005 SQL 쿼리 실행
df = pd.read_sql_query("""
SELECT customer_id, name, purchase_amount
FROM customers
WHERE purchase_amount > 1000
ORDER BY purchase_amount DESC
LIMIT 1000
""", engine)
MySQL 연동
from sqlalchemy import create_engine
# 005 MySQL 연결 문자열
engine = create_engine('mysql+pymysql://user:password@host:3306/database')
df = pd.read_sql_query("SELECT * FROM sales", engine)
PostgreSQL 연동
from sqlalchemy import create_engine
# 005 PostgreSQL 연결 문자열
engine = create_engine('postgresql://user:password@host:5432/database')
df = pd.read_sql_query("SELECT * FROM transactions", engine)
URL에서 데이터 로딩
웹 URL의 CSV
url = 'https://raw.githubusercontent.com/datasets/iris/master/data/iris.csv'
df = pd.read_csv(url)
Google Sheets 데이터
# 005 Google Sheets를 CSV로 내보내기 URL
sheet_id = 'your_sheet_id'
url = f'https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=csv'
df = pd.read_csv(url)
데이터 로딩 후 FLAML 적용
완전한 워크플로우 예제
import pandas as pd
from flaml import AutoML
from sklearn.model_selection import train_test_split
# 1. 데이터 로딩
df = pd.read_csv('customer_churn.csv')
# 2. 데이터 확인
print("데이터 크기:", df.shape)
print("\n컬럼 정보:")
print(df.dtypes)
print("\n결측치:")
print(df.isnull().sum())
# 3. 특성(X)과 타겟(y) 분리
target_col = 'churn'
X = df.drop(columns=[target_col])
y = df[target_col]
# 4. 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# 5. FLAML AutoML 실행
automl = AutoML()
automl.fit(
X_train, y_train,
task="classification",
time_budget=60,
metric="accuracy"
)
# 6. 결과 확인
print(f"\n최적 모델: {automl.best_estimator}")
print(f"검증 정확도: {1 - automl.best_loss:.4f}")
# 7. 테스트 평가
from sklearn.metrics import accuracy_score
predictions = automl.predict(X_test)
print(f"테스트 정확도: {accuracy_score(y_test, predictions):.4f}")
실행 결과
데이터 크기: (7043, 21)
컬럼 정보:
customerID object
gender object
SeniorCitizen int64
...
결측치:
TotalCharges 11
dtype: int64
최적 모델: lgbm
검증 정확도: 0.8021
테스트 정확도: 0.7958
데이터 로딩 팁
팁 1: 메모리 최적화
# 005 데이터 타입 최적화
df = pd.read_csv('data.csv')
# 005 메모리 사용량 확인
print(f"최적화 전: {df.memory_usage().sum() / 1024**2:.2f} MB")
# 005 숫자형 최적화
for col in df.select_dtypes(include=['int64']).columns:
df[col] = pd.to_numeric(df[col], downcast='integer')
for col in df.select_dtypes(include=['float64']).columns:
df[col] = pd.to_numeric(df[col], downcast='float')
print(f"최적화 후: {df.memory_usage().sum() / 1024**2:.2f} MB")
팁 2: 범주형 변환
# 005 문자열을 범주형으로 변환 (메모리 절약)
for col in df.select_dtypes(include=['object']).columns:
if df[col].nunique() < 50: # 고유값이 50개 미만이면
df[col] = df[col].astype('category')
팁 3: 데이터 검증
def validate_data(df, target_col):
"""데이터 검증 함수"""
print("="*50)
print("데이터 검증 리포트")
print("="*50)
# 기본 정보
print(f"\n행 수: {len(df):,}")
print(f"열 수: {len(df.columns)}")
# 결측치
missing = df.isnull().sum()
if missing.sum() > 0:
print(f"\n결측치 있는 열:")
print(missing[missing > 0])
else:
print("\n결측치 없음")
# 중복
duplicates = df.duplicated().sum()
print(f"\n중복 행: {duplicates:,}")
# 타겟 분포
print(f"\n타겟({target_col}) 분포:")
print(df[target_col].value_counts())
return df
# 005 사용
df = pd.read_csv('data.csv')
df = validate_data(df, 'target')
정리
- CSV:
pd.read_csv()로 로드, 인코딩과 구분자 주의 - Excel:
pd.read_excel()로 로드, openpyxl 패키지 필요 - SQL: SQLAlchemy 엔진으로 연결,
pd.read_sql_query()사용 - 대용량 데이터는 청크 단위로 처리하거나 데이터 타입 최적화 적용
- 데이터 로딩 후 검증 단계를 거쳐 품질 확인
- X(특성)와 y(타겟) 분리 후 FLAML에 적용
다음 글 예고
다음 글에서는 FLAML 기본 워크플로우 이해하기에 대해 알아보겠습니다. 데이터 준비부터 모델 학습, 평가까지 전체 과정을 단계별로 살펴봅니다.
FLAML AutoML 마스터 시리즈 #005