03-130. 정형데이터 분석
정형데이터 분석
데이터를 표 형태로 사용할 수 있게 구조화해서 저장해두었는지 아닌지에 따라 데이터를 정형데이터, 비정형데이터, 반정형데이터로 구분한다. 데이터 분석을 하려면 데이터를 모두 정형데이터로 바꿔야 하는데 세상의 모든 데이터가 정형데이터로 관리되고 있지 않으며 데이터의 많은 부분은 비정형상태이다. 비정형데이터를 정형데이터로 변환하는 작업에는 많은 컴퓨터 계산이 필요하고 시간도 오래걸린다.
이 책에서는 비정형 데이터와 반정형 데이터를 다루는 방법을 다루지는 않지만 여기에서 정형데이터와 비정형데이터, 반정형데이터의 차이에 대해서 간단히 설명한다.
정형데이터(Structured Data)란?
정형데이터는 **행(row)과 열(column)**로 구성된 표 형태의 데이터로 각 데이터의 구조와 형식이 미리 정해져 있는 데이터를 말한다. 표 형태의 데이터는 테뷸라 데이터(Tabular data) 라고도 한다. 주로 데이터베이스(관계형 DB, RDBMS)에서 테이블(table), 뷰(view)같은 것이고 엑셀 파일, CSV 파일과 같은 것이다.
정형데이터의 특징
- 데이터의 스키마(구조)가 명확하게 정의되어 있다.
- 각 열(필드)의 데이터 타입(숫자, 문자, 날짜 등)이 정해져 있다.
- 검색, 집계, 분석이 용이하다.
- SQL 쿼리나 데이터프레임 연산으로 쉽게 처리 가능하다.
- 데이터 무결성 검증이 용이하다.
- 예시: 고객명단, 매출기록, 설문조사 결과, 재고목록, 금융거래내역 등
정형데이터의 예시
다음은 정형데이터(테이블 데이터, Tabular data)의 예시다.
고객ID | 이름 | 나이 | 가입일 | 구매금액 |
---|---|---|---|---|
1001 | 김철수 | 35 | 2022-01-15 | 120,000 |
1002 | 이영희 | 28 | 2022-03-22 | 85,000 |
1003 | 박민수 | 42 | 2021-11-08 | 230,000 |
정형데이터의 저장 형태
1. 엑셀 파일 (.xlsx, .xls) 위와 같은 표 형태로 저장된 데이터로, 일반 사용자들이 가장 많이 사용하는 형태
2. CSV 파일 (.csv) 쉼표로 구분된 값들로 이루어진 텍스트 파일:
고객ID,이름,나이,가입일,구매금액
1001,김철수,35,2022-01-15,120000
1002,이영희,28,2022-03-22,85000
1003,박민수,42,2021-11-08,230000
3. 관계형 데이터베이스(RDBMS) 테이블 MySQL, PostgreSQL, Oracle 등의 데이터베이스에 저장된 테이블 형태의 데이터
4. TSV 파일 (.tsv) 탭으로 구분된 값들로 이루어진 파일
Python으로 정형데이터 다루기
CSV 파일 읽기와 기본 분석
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# CSV 파일 읽기
df = pd.read_csv('customer_data.csv', encoding='utf-8')
# 데이터 기본 정보 확인
print("데이터 형태:", df.shape)
print("\n데이터 타입:")
print(df.dtypes)
print("\n기본 통계:")
print(df.describe())
# 첫 5행 확인
print("\n데이터 미리보기:")
print(df.head())
데이터 전처리 예제
# 결측값 확인
print("결측값 개수:")
print(df.isnull().sum())
# 결측값 처리
df['나이'].fillna(df['나이'].mean(), inplace=True) # 평균값으로 채우기
df.dropna(subset=['이름'], inplace=True) # 이름이 없는 행 삭제
# 데이터 타입 변환
df['가입일'] = pd.to_datetime(df['가입일'])
df['구매금액'] = df['구매금액'].astype(int)
# 새로운 컬럼 생성
df['가입년도'] = df['가입일'].dt.year
df['연령대'] = pd.cut(df['나이'], bins=[0, 30, 40, 50, 100],
labels=['20대', '30대', '40대', '50대+'])
데이터 분석 예제
# 기본 집계 분석
print("연령대별 평균 구매금액:")
age_group_analysis = df.groupby('연령대')['구매금액'].agg(['mean', 'count', 'sum'])
print(age_group_analysis)
# 상관관계 분석
correlation = df[['나이', '구매금액']].corr()
print("\n나이와 구매금액 상관관계:")
print(correlation)
# 시각화
plt.figure(figsize=(12, 4))
# 연령대별 구매금액 분포
plt.subplot(1, 3, 1)
sns.boxplot(data=df, x='연령대', y='구매금액')
plt.title('연령대별 구매금액 분포')
plt.xticks(rotation=45)
# 나이와 구매금액 산점도
plt.subplot(1, 3, 2)
plt.scatter(df['나이'], df['구매금액'], alpha=0.6)
plt.xlabel('나이')
plt.ylabel('구매금액')
plt.title('나이 vs 구매금액')
# 월별 가입자 수
plt.subplot(1, 3, 3)
monthly_signup = df.groupby(df['가입일'].dt.to_period('M')).size()
monthly_signup.plot(kind='line')
plt.title('월별 가입자 수')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
데이터베이스 연결 예제
import sqlite3
from sqlalchemy import create_engine
# SQLite 데이터베이스 연결
conn = sqlite3.connect('customer_database.db')
# 데이터프레임을 데이터베이스에 저장
df.to_sql('customers', conn, if_exists='replace', index=False)
# SQL 쿼리로 데이터 조회
query = """
SELECT 연령대,
COUNT(*) as 고객수,
AVG(구매금액) as 평균구매금액,
SUM(구매금액) as 총구매금액
FROM customers
GROUP BY 연령대
ORDER BY 평균구매금액 DESC
"""
result = pd.read_sql_query(query, conn)
print("SQL 쿼리 결과:")
print(result)
conn.close()
이처럼 정형데이터는 각 열(필드)의 의미와 데이터 타입이 명확하게 정해져 있어, 데이터 검색, 집계, 분석이 쉽다. 일반적인 데이터 분석은 대부분 정형데이터를 대상으로 한다.
마무리
정형데이터 분석은 다음과 같은 장점을 가지고 있다.
장점
- 구조화된 형태: 행과 열로 구성되어 데이터의 구조가 명확함
- 일관성: 각 열의 데이터 타입과 형식이 일정함
- 분석 용이성: SQL, 판다스 등 다양한 도구로 쉽게 분석 가능
- 시각화 편의성: 차트와 그래프로 표현하기 용이함
- 통계 분석: 평균, 분산, 상관관계 등 통계적 분석에 적합
주요 활용 분야
- 비즈니스 인텔리전스: 매출, 고객, 재고 데이터 분석
- 금융 분석: 주가, 거래량, 재무제표 분석
- 마케팅 분석: 고객 세분화, 구매 패턴 분석
- 운영 분석: 생산성, 품질, 효율성 측정
- 학술 연구: 실험 데이터, 설문조사 결과 분석
정형데이터는 데이터 분석의 기본이 되는 중요한 형태다.