Python 실전 데이터 분석 | Pandas로 데이터 분석하기
이 글의 핵심
import pandas as pd import numpy as np.
들어가며
”데이터에서 인사이트 찾기”
실전 데이터 분석은 데이터를 이해하고 의미를 찾는 과정입니다.
실무 활용 사례: 데이터 분석, 웹 개발, 자동화 프로젝트에서 실제로 사용한 패턴과 코드를 바탕으로 정리했습니다. 초보자가 흔히 겪는 오류와 해결법을 포함합니다.
1. 데이터 로드와 탐색
기본 탐색
CSV를 read_csv로 불러오면 큰 표 하나가 메모리에 올라온 상태입니다. shape로 행·열 개수를 보고, info·describe로 타입과 수치 분포를 훑은 뒤, head로 실제 값 몇 줄을 눈으로 확인합니다.
import pandas as pd
import numpy as np
# 데이터 로드
df = pd.read_csv('sales_data.csv')
# 기본 정보
print(f"데이터 크기: {df.shape}")
print(f"\n열 정보:")
print(df.info())
print(f"\n통계 요약:")
print(df.describe())
print(f"\n처음 5행:")
print(df.head())
# 결측치 확인
print(f"\n결측치:")
print(df.isnull().sum())
2. 탐색적 데이터 분석 (EDA)
분포 확인
import matplotlib.pyplot as plt
# 히스토그램
df['age'].hist(bins=20)
plt.title('나이 분포')
plt.xlabel('나이')
plt.ylabel('빈도')
plt.show()
# 박스플롯 (이상치 확인)
df.boxplot(column='salary', by='department')
plt.title('부서별 연봉 분포')
plt.show()
상관관계 분석
import seaborn as sns
# 상관계수 계산
corr_matrix = df[['age', 'salary', 'experience']].corr()
print(corr_matrix)
# 히트맵
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.title('상관관계 히트맵')
plt.show()
3. 그룹 분석
집계 분석
# 부서별 평균 연봉
dept_avg = df.groupby('department')['salary'].mean()
print(dept_avg)
# 여러 집계
result = df.groupby('department').agg({
'salary': ['mean', 'min', 'max'],
'age': 'mean',
'name': 'count'
})
print(result)
# 피벗 테이블
pivot = df.pivot_table(
values='salary',
index='department',
columns='gender',
aggfunc='mean'
)
print(pivot)
4. 시계열 분석
시계열 데이터
# 날짜 파싱
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
# 리샘플링 (일 → 월)
monthly = df.resample('M').sum()
# 이동 평균
df['ma7'] = df['sales'].rolling(window=7).mean()
df['ma30'] = df['sales'].rolling(window=30).mean()
# 시각화
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['sales'], label='일별 매출', alpha=0.5)
plt.plot(df.index, df['ma7'], label='7일 이동평균')
plt.plot(df.index, df['ma30'], label='30일 이동평균')
plt.legend()
plt.title('매출 추이')
plt.show()
5. 실전 예제
고객 분석
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 데이터 로드
customers = pd.read_csv('customers.csv')
# 1. 기본 통계
print("=== 기본 통계 ===")
print(f"총 고객 수: {len(customers)}")
print(f"평균 나이: {customers['age'].mean():.1f}세")
print(f"평균 구매액: {customers['purchase_amount'].mean():,.0f}원")
# 2. 연령대별 분석
customers['age_group'] = pd.cut(
customers['age'],
bins=[0, 20, 30, 40, 50, 100],
labels=['10대', '20대', '30대', '40대', '50대+']
)
age_analysis = customers.groupby('age_group').agg({
'purchase_amount': ['mean', 'sum', 'count']
})
print("\n=== 연령대별 분석 ===")
print(age_analysis)
# 3. 시각화
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 연령 분포
axes[0, 0].hist(customers['age'], bins=20, edgecolor='black')
axes[0, 0].set_title('연령 분포')
# 구매액 분포
axes[0, 1].hist(customers['purchase_amount'], bins=30, edgecolor='black')
axes[0, 1].set_title('구매액 분포')
# 연령대별 평균 구매액
age_group_avg = customers.groupby('age_group')['purchase_amount'].mean()
axes[1, 0].bar(age_group_avg.index, age_group_avg.values)
axes[1, 0].set_title('연령대별 평균 구매액')
axes[1, 0].tick_params(axis='x', rotation=45)
# 상관관계
numeric_cols = customers[['age', 'purchase_amount', 'visit_count']]
sns.heatmap(numeric_cols.corr(), annot=True, ax=axes[1, 1])
axes[1, 1].set_title('상관관계')
plt.tight_layout()
plt.savefig('customer_analysis.png', dpi=300)
plt.show()
# 4. 인사이트 도출
print("\n=== 인사이트 ===")
print(f"가장 많이 구매하는 연령대: {age_group_avg.idxmax()}")
print(f"평균 구매액이 가장 높은 연령대: {age_group_avg.idxmax()}")
데이터 이해 → 가설 → 검증 → 인사이트
탐색적 데이터 분석(EDA)은 질문을 세우고, 표와 그래프로 답을 찾는 과정입니다. 열 의미·타입·결측을 본 뒤 가설을 정하고, 시각화와 통계로 검증한 다음, 비즈니스에 쓸 수 있는 문장으로 정리합니다.
# 1. 데이터 이해
# - 각 열의 의미
# - 데이터 타입
# - 결측치/이상치
# 2. 가설 수립
# - "연령이 높을수록 구매액이 높을까?"
# - "주말에 매출이 높을까?"
# 3. 검증
# - 시각화
# - 통계 분석
# - 상관관계
# 4. 인사이트 도출
# - 비즈니스 의미
# - 액션 아이템
실전 심화 보강
실전 예제: 이상치 플래그 + 요약 테이블 (pandas)
아래는 수치 열에 대해 IQR 기준 이상치 행을 표시하고, 그룹별 요약을 뽑는 실행 가능한 스크립트입니다.
import numpy as np
import pandas as pd
rng = np.random.default_rng(7)
df = pd.DataFrame({
"region": rng.choice(["A", "B", "C"], size=400),
"revenue": rng.normal(100, 25, size=400),
})
def iqr_bounds(s: pd.Series, k: float = 1.5):
q1, q3 = s.quantile([0.25, 0.75])
iqr = q3 - q1
lo, hi = q1 - k * iqr, q3 + k * iqr
return lo, hi
lo, hi = iqr_bounds(df[revenue])
df[outlier] = (df[revenue] < lo) | (df[revenue] > hi)
summary = df.groupby("region")[revenue].agg(["count", "mean", "std", "median"])
print(summary)
print("이상치 비율:", df[outlier].mean())
자주 하는 실수
- 결측치를 제거하지 않은 채 평균·상관을 계산하는 경우.
- 시계열을 정렬하지 않고
rolling·diff를 적용하는 경우. - 시각화만 보고 통계적 유의성 없이 인과를 단정하는 경우.
주의사항
- IQR 규칙은 분포 가정이 약하지만 비즈니스 규칙과 함께 써야 합니다.
- 다중 검정 시 p-value 보정이 필요할 수 있습니다.
실무에서는 이렇게
- 노트북은 재현 가능한 시드와 데이터 스냅샷 버전을 명시합니다.
- 결과는 지표 정의(분자/분모)와 함께 문서화합니다.
비교 및 대안
| 도구 | 역할 |
|---|---|
| pandas | 테이블 변환·집계 |
| SQL | 대용량 집계를 DB에 가깝게 |
| Spark | 분산 배치 |
추가 리소스
내부 동작과 핵심 메커니즘
이 글의 주제는 「Python 실전 데이터 분석 | Pandas로 데이터 분석하기」입니다. 여기서는 앞선 설명을 구현·런타임 관점에서 한 번 더 압축합니다. 데이터 흐름과 실패 모드를 기준으로 생각하면, “입력이 어디서 검증되고, 핵심 연산이 어디서 일어나며, 부작용(I/O·네트워크·디스크)이 어디서 터지는가”가 한눈에 드러납니다.
처리 파이프라인(개념도)
flowchart TD A[입력·요청·이벤트] --> B[파싱·검증·디코딩] B --> C[핵심 연산·상태 전이] C --> D[부작용: I/O·네트워크·동시성] D --> E[결과·관측·저장]
알고리즘·프로토콜 관점에서의 체크포인트
- 불변 조건(Invariant): 각 단계가 만족해야 하는 조건(예: 버퍼 경계, 프로토콜 상태, 트랜잭션 격리)을 문장으로 적어 두면 디버깅 비용이 줄어듭니다.
- 결정성: 동일 입력에 동일 출력이 보장되는 순수한 층과, 시간·네트워크에 의해 달라질 수 있는 층을 분리해야 테스트와 장애 분석이 쉬워집니다.
- 경계 비용: 직렬화/역직렬화, 문자 인코딩, syscall 횟수, 락 경합처럼 “한 번의 호출이 아니라 누적되는 비용”을 의심 목록에 넣습니다.
프로덕션 운영 패턴
실서비스에서는 기능 구현과 함께 관측·배포·보안·비용이 동시에 요구됩니다. 아래는 팀에서 자주 쓰는 최소 체크리스트입니다.
| 영역 | 운영 관점에서의 질문 |
|---|---|
| 관측성 | 요청 단위 상관 ID, 에러율/지연 분위수, 주요 의존성 타임아웃이 보이는가 |
| 안전성 | 입력 검증·권한·비밀 관리가 코드 경로마다 일관적인가 |
| 신뢰성 | 재시도는 멱등한 연산에만 적용되는가, 서킷 브레이커·백오프가 있는가 |
| 성능 | 캐시 계층·배치 크기·풀링·백프레셔가 데이터 규모에 맞는가 |
| 배포 | 롤백 룬북, 카나리, 마이그레이션 호환성이 문서화되어 있는가 |
운영 환경에서는 “개발자 PC에서는 재현되지 않던 문제”가 시간·부하·데이터 크기 때문에 드러납니다. 따라서 스테이징의 데이터 양·네트워크 지연을 가능한 한 현실에 가깝게 맞추는 것이 중요합니다.
문제 해결(Troubleshooting)
| 증상 | 가능 원인 | 조치 |
|---|---|---|
| 간헐적 실패 | 레이스 컨디션, 타임아웃, 외부 의존성 불안정 | 최소 재현 스크립트 작성, 분산 트레이스·로그 상관관계 확인 |
| 성능 저하 | N+1 쿼리, 동기 I/O, 잠금 경합, 과도한 직렬화 | 프로파일러·APM으로 핫스팟 확인 후 한 가지씩 제거 |
| 메모리 증가 | 캐시 무제한, 클로저/이벤트 구독 누수, 대용량 객체의 불필요한 복사 | 상한·TTL·스냅샷 비교(힙 덤프/트레이스) |
| 빌드·배포만 실패 | 환경 변수·권한·플랫폼 차이 | CI 로그와 로컬 diff, 컨테이너/런타임 버전 핀(pin) |
권장 디버깅 순서: (1) 최소 재현 만들기 (2) 최근 변경 범위 좁히기 (3) 의존성·환경 변수 차이 확인 (4) 관측 데이터로 가설 검증 (5) 수정 후 회귀·부하 테스트.
정리
핵심 요약
- EDA: 데이터 탐색과 시각화
- 그룹 분석: groupby, pivot_table
- 시계열: resample, rolling
- 시각화: Matplotlib, Seaborn
- 인사이트: 데이터 → 의사결정
다음 단계
관련 글
자주 묻는 질문 (FAQ)
Q. 이 내용을 실무에서 언제 쓰나요?
A. Python 실전 데이터 분석 import pandas as pd import numpy as np. Python·데이터분석·EDA 중심으로 설명합니다. Start now. 실무에서는 위 본문의 예제와 선택 가이드를 참고해 적용하면 됩니다.
Q. 선행으로 읽으면 좋은 글은?
A. 각 글 하단의 이전 글 또는 관련 글 링크를 따라가면 순서대로 배울 수 있습니다. Python 시리즈 목차에서 전체 흐름을 확인할 수 있습니다.
Q. 더 깊이 공부하려면?
A. cppreference와 해당 라이브러리 공식 문서를 참고하세요. 글 말미의 참고 자료 링크도 활용하면 좋습니다.
같이 보면 좋은 글 (내부 링크)
이 주제와 연결되는 다른 글입니다.
- Pandas 기초 | Python 데이터 분석 라이브러리 완벽 정리
- NumPy 기초 | Python 수치 계산 라이브러리 완벽 정리
- Python 데이터 전처리 | 결측치, 이상치, 정규화 완벽 정리
이 글에서 다루는 키워드 (관련 검색어)
Python, 데이터분석, EDA, Pandas, 시각화, 통계 등으로 검색하시면 이 글이 도움이 됩니다.