Pandas를 사용한 CSV 파일의 데이터 시각화는 데이터 분석이나 의사결정을 빠르고 효율적으로 수행하기 위한 중요한 기술입니다. 데이터를 시각적으로 표현함으로써, 경향과 패턴을 쉽게 찾을 수 있어 비즈니스 분석, 과학 연구, 학술 프로젝트 등에서 널리 활용됩니다. 본 기사에서는 Pandas로 CSV 데이터를 읽는 기본 작업부터 시작하여, Matplotlib이나 Seaborn 등의 라이브러리를 사용하여 데이터를 매력적이고 이해하기 쉬운 형태로 시각화하는 방법을 설명합니다. Python을 활용한 데이터 분석 스킬 향상에 도움이 되기를 바랍니다.
CSV 파일 읽기 및 데이터 개요 확인
Pandas를 사용하여 CSV 파일을 읽으면 데이터 분석을 효율적으로 시작할 수 있습니다. 아래의 절차에 따라 CSV 파일을 읽고, 데이터 개요를 확인합니다.
CSV 파일 읽기
Pandas의 read_csv()
함수를 사용하여 CSV 파일을 읽습니다. 예를 들어, data.csv
라는 파일을 읽을 경우 아래와 같은 코드를 사용합니다.
import pandas as pd
# CSV 파일 읽기
df = pd.read_csv('data.csv')
# 데이터프레임의 앞부분 몇 행을 출력
print(df.head())
이 코드를 통해, CSV 데이터가 Pandas의 데이터프레임에 저장되고, 데이터의 앞부분 5행을 확인할 수 있습니다.
데이터 개요 확인
읽은 데이터의 구조와 기본적인 통계 정보를 파악하려면 아래 방법들을 활용합니다.
- 특정 열 확인
print(df['열명'].unique()) # 열의 고유한 값 출력
print(df['열명'].value_counts()) # 값의 출현 횟수 계산
이 방법들을 사용하여 데이터를 대략적으로 이해하고, 다음 시각화 단계로 넘어갈 준비를 합니다.
Matplotlib을 사용한 기본적인 그래프 만들기
Pandas와 Matplotlib을 조합하여 CSV 데이터를 손쉽게 시각화할 수 있습니다. 여기서는 기본적인 그래프 만들기 방법을 소개합니다.
Matplotlib 설치
먼저 Matplotlib을 임포트합니다. pyplot
모듈을 사용하면 간단하게 그래프를 만들 수 있습니다.
import matplotlib.pyplot as plt
# 데이터프레임을 읽은 df 사용
df = pd.read_csv('data.csv')
선 그래프 만들기
시계열 데이터나 연속적인 데이터를 시각화할 때는 선 그래프가 유용합니다.
# x축에 '날짜', y축에 '판매' 데이터를 플로팅
plt.plot(df['날짜'], df['판매'])
plt.title('판매의 추이')
plt.xlabel('날짜')
plt.ylabel('판매')
plt.xticks(rotation=45) # x축 라벨 회전
plt.show()
막대 그래프 만들기
카테고리별 값들을 시각화할 때는 막대 그래프가 적합합니다.
# 상품 카테고리별 판매를 집계하여 막대 그래프 만들기
category_sales = df.groupby('카테고리')['판매'].sum()
category_sales.plot(kind='bar', color='skyblue')
plt.title('카테고리별 판매')
plt.xlabel('카테고리')
plt.ylabel('판매')
plt.show()
산점도 만들기
두 변수 간의 상관 관계를 시각화할 때는 산점도가 사용됩니다.
# 가격과 판매의 관계를 플로팅
plt.scatter(df['가격'], df['판매'], alpha=0.7, color='green')
plt.title('가격과 판매의 상관')
plt.xlabel('가격')
plt.ylabel('판매')
plt.show()
히스토그램 만들기
데이터의 분포를 확인할 때는 히스토그램이 유용합니다.
# 판매 데이터의 분포를 플로팅
df['판매'].plot(kind='hist', bins=20, color='orange', edgecolor='black')
plt.title('판매의 분포')
plt.xlabel('판매')
plt.ylabel('빈도')
plt.show()
이러한 그래프를 활용하면 데이터의 특성을 시각적으로 이해할 수 있습니다. 다음은 Seaborn을 사용한 고급 시각화 방법을 배우겠습니다.
Seaborn을 이용한 고급 플로트 활용법
Seaborn은 Pandas와 Matplotlib과 연동되어 고품질의 그래프를 쉽게 만들 수 있는 라이브러리입니다. 복잡한 플로트나 스타일링을 직관적으로 할 수 있습니다. 여기서는 Seaborn을 사용한 고급 시각화 방법을 소개합니다.
Seaborn 설치
먼저 Seaborn을 임포트하고, 스타일을 설정합니다.
import seaborn as sns
# 스타일 설정
sns.set(style="whitegrid")
df = pd.read_csv('data.csv') # 데이터 읽기
카테고리 데이터 시각화: 박스 플롯
카테고리별 데이터 분포를 시각화할 때는 박스 플롯이 유용합니다.
# 카테고리별 판매의 분포를 시각화
sns.boxplot(x='카테고리', y='판매', data=df, palette='pastel')
plt.title('카테고리별 판매의 분포')
plt.xlabel('카테고리')
plt.ylabel('판매')
plt.show()
상관 관계 시각화: 산점도와 회귀 직선
Seaborn의 regplot
을 사용하면 산점도에 회귀 직선을 추가할 수 있습니다.
# 가격과 판매의 상관 관계를 플로팅
sns.regplot(x='가격', y='판매', data=df, scatter_kws={'alpha':0.6}, line_kws={'color':'red'})
plt.title('가격과 판매의 상관 관계')
plt.xlabel('가격')
plt.ylabel('판매')
plt.show()
데이터 분포 시각화: 히트맵
데이터의 상관 행렬을 시각화하려면 히트맵을 사용합니다.
# 상관 행렬 계산
correlation_matrix = df.corr()
# 히트맵 만들기
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('상관 행렬 히트맵')
plt.show()
카테고리와 숫자 관계: 바이올린 플롯
바이올린 플롯은 카테고리별 데이터 분포를 부드럽게 표현합니다.
# 카테고리별 판매 분포를 플로팅
sns.violinplot(x='카테고리', y='판매', data=df, palette='muted', inner='quartile')
plt.title('카테고리별 판매 분포 (바이올린 플롯)')
plt.xlabel('카테고리')
plt.ylabel('판매')
plt.show()
데이터 경향 강조: 카운트 플롯
카테고리 데이터의 출현 빈도를 시각화하려면 카운트 플롯이 유용합니다.
# 상품 카테고리의 출현 빈도 플로팅
sns.countplot(x='카테고리', data=df, palette='viridis')
plt.title('상품 카테고리 빈도')
plt.xlabel('카테고리')
plt.ylabel('빈도')
plt.show()
Seaborn의 세련된 그래프를 활용하면 데이터의 통찰을 더욱 깊이 이해할 수 있습니다. 다음으로 특정 칼럼을 추출하여 데이터를 시각화하는 방법을 설명합니다.
특정 칼럼을 추출한 데이터 시각화
데이터 분석에서는 관심 있는 특정 칼럼이나 조건을 기준으로 데이터를 추출하고 이를 시각화하는 것이 중요합니다. Pandas를 사용하여 데이터를 필터링하고 적합한 플롯을 만드는 방법을 소개합니다.
특정 칼럼을 추출하여 플로팅
특정 열에 주목하여 데이터를 시각화할 때는 DataFrame
의 열명을 지정하여 데이터를 추출합니다.
# 판매 데이터만 히스토그램으로 표시
df['판매'].plot(kind='hist', bins=15, color='skyblue', edgecolor='black')
plt.title('판매의 분포')
plt.xlabel('판매')
plt.ylabel('빈도')
plt.show()
여러 칼럼 조합으로 플로팅
여러 칼럼을 선택하여 상관 관계를 시각화합니다.
# 판매와 가격의 관계를 산점도로 표시
plt.scatter(df['가격'], df['판매'], color='green', alpha=0.6)
plt.title('가격과 판매의 상관')
plt.xlabel('가격')
plt.ylabel('판매')
plt.show()
조건에 따른 데이터 시각화
조건을 지정하여 데이터를 추출하고 그 결과를 시각화함으로써, 특정 데이터 군을 상세히 분석할 수 있습니다.
# 판매가 1000 이상인 데이터를 추출하여 플로팅
high_sales = df[df['판매'] >= 1000]
plt.plot(high_sales['날짜'], high_sales['판매'], marker='o', color='orange')
plt.title('판매가 1000 이상인 날짜별 추이')
plt.xlabel('날짜')
plt.ylabel('판매')
plt.xticks(rotation=45)
plt.show()
그룹화한 데이터 집계 및 시각화
카테고리나 특정 속성으로 데이터를 그룹화하여 그 결과를 시각화합니다.
# 상품 카테고리별 평균 판매를 계산
category_avg_sales = df.groupby('카테고리')['판매'].mean()
# 막대 그래프로 표시
category_avg_sales.plot(kind='bar', color='coral')
plt.title('카테고리별 평균 판매')
plt.xlabel('카테고리')
plt.ylabel('평균 판매')
plt.show()
복수 조건에 따른 데이터 추출 및 시각화
여러 조건을 지정하여 더욱 세분화된 데이터를 시각화할 수 있습니다.
# 판매가 1000 이상이고 가격이 500 미만인 데이터를 추출
filtered_data = df[(df['판매'] >= 1000) & (df['가격'] < 500)]
# 산점도로 시각화
plt.scatter(filtered_data['가격'], filtered_data['판매'], color='purple', alpha=0.7)
plt.title('판매 1000 이상이고 가격 500 미만의 관계')
plt.xlabel('가격')
plt.ylabel('판매')
plt.show()
이로 인해 특정 칼럼이나 조건에 집중한 데이터 분석이 가능하며, 중요한 패턴을 발견하는 데 도움이 됩니다. 다음은 시계열 데이터 시각화 방법을 설명합니다.
시계열 데이터 플로팅 방법
시계열 데이터는 시간에 따른 트렌드나 계절성을 분석할 때 중요합니다. Pandas와 시각화 라이브러리를 사용하여 시계열 데이터를 효과적으로 플로팅하는 방법을 소개합니다.
시계열 데이터 준비
먼저, 데이터의 시계열 칼럼을 Pandas의 datetime
형식으로 변환합니다. 이를 통해 Pandas의 시계열 기능을 사용할 수 있습니다.
# 날짜 칼럼을 datetime 형식으로 변환
df['날짜'] = pd.to_datetime(df['날짜'])
# 데이터프레임을 날짜로 정렬
df = df.sort_values('날짜')
# 날짜를 인덱스로 설정 (선택 사항)
df.set_index('날짜', inplace=True)
단일 시계열 데이터 플로팅
시계열 데이터를 선 그래프로 시각화합니다.
# 판매 데이터 플로팅
df['판매'].plot(figsize=(10, 5), color='blue', linewidth=2)
plt.title('판매의 시계열 추이')
plt.xlabel('날짜')
plt.ylabel('판매')
plt.grid(True)
plt.show()
복수 시계열 데이터 비교
여러 시계열 데이터를 동일 그래프에 겹쳐서 비교합니다.
# 판매와 이익을 동시에 플로팅
df[['판매', '이익']].plot(figsize=(10, 5), linewidth=2)
plt.title('판매와 이익의 시계열 추이')
plt.xlabel('날짜')
plt.ylabel('금액')
plt.legend(['판매', '이익'])
plt.grid(True)
plt.show()
계절성이나 트렌드 분석
시계열 데이터에 계절성이나 트렌드가 포함되어 있다면, 이를 분해하여 분석할 수 있습니다.
from statsmodels.tsa.seasonal import seasonal_decompose
# 판매 데이터의 계절성 분해
decomposition = seasonal_decompose(df['판매'], model='additive', period=12)
# 각 요소 (트렌드, 계절성, 잔차) 플로팅
decomposition.plot()
plt.show()
특정 기간에 한정한 플로팅
특정 기간을 추출하여 플로팅합니다.
# 2023년 데이터를 추출하여 플로팅
df_2023 = df['2023']
df_2023['판매'].plot(figsize=(10, 5), color='green', linewidth=2)
plt.title('2023년의 판매 추이')
plt.xlabel('날짜')
plt.ylabel('판매')
plt.grid(True)
plt.show()
시각화 커스터마이즈
시계열 그래프를 강조하기 위해 플로트에 마커나 주석을 추가합니다.
# 판매 데이터에 마커 추가
plt.plot(df.index, df['판매'], marker='o', color='red', linewidth=2)
plt.title('판매의 시계열 추이 (마커 포함)')
plt.xlabel('날짜')
plt.ylabel('판매')
plt.grid(True)
# 특정 날짜에 주석 추가
peak_date = df['판매'].idxmax() # 최대 판매 날짜
peak_value = df['판매'].max()
plt.annotate(f'최대 판매: {peak_value}', xy=(peak_date, peak_value), xytext=(peak_date, peak_value + 100),
arrowprops=dict(facecolor='black', arrowstyle='->'), fontsize=10)
plt.show()
인터랙티브 시계열 플로팅
인터랙티브한 플로트를 만들기 위해 Plotly
와 같은 라이브러리를 사용할 수 있습니다.
import plotly.express as px
# 판매 데이터의 인터랙티브 시계열 플로팅
fig = px.line(df.reset_index(), x='날짜', y='판매', title='판매의 시계열 추이')
fig.show()
이 방법들을 활용하면 시계열 데이터를 효과적으로 시각화하고 트렌드나 계절성을 파악할 수 있습니다. 다음은 여러 그래프를 동시에 플로팅하는 방법을 설명합니다.
여러 그래프를 동시에 그리는 방법
데이터 분석 시 여러 그래프를 한 번에 표시하면, 다양한 시각에서 데이터를 비교하기 쉬워집니다. 여기서는 Matplotlib과 Seaborn을 사용하여 여러 그래프를 동시에 그리는 방법을 설명합니다.
Matplotlib로 여러 그래프 그리기
Matplotlib의 subplot
을 사용하면 하나의 도표 내에 여러 그래프를 그릴 수 있습니다.
import matplotlib.pyplot as plt
# 그래프를 2행 2열로 배치
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
# 그래프 1: 매출의 시간에 따른 변화
axes[0, 0].plot(df.index, df['매출'], color='blue', linewidth=2)
axes[0, 0].set_title('매출의 시간에 따른 변화')
axes[0, 0].set_xlabel('날짜')
axes[0, 0].set_ylabel('매출')
# 그래프 2: 이익의 시간에 따른 변화
axes[0, 1].plot(df.index, df['이익'], color='green', linewidth=2)
axes[0, 1].set_title('이익의 시간에 따른 변화')
axes[0, 1].set_xlabel('날짜')
axes[0, 1].set_ylabel('이익')
# 그래프 3: 매출의 분포 (히스토그램)
axes[1, 0].hist(df['매출'], bins=15, color='orange', edgecolor='black')
axes[1, 0].set_title('매출의 분포')
axes[1, 0].set_xlabel('매출')
axes[1, 0].set_ylabel('빈도')
# 그래프 4: 가격과 매출의 상관관계 (산점도)
axes[1, 1].scatter(df['가격'], df['매출'], color='purple', alpha=0.7)
axes[1, 1].set_title('가격과 매출의 상관관계')
axes[1, 1].set_xlabel('가격')
axes[1, 1].set_ylabel('매출')
# 레이아웃 조정
plt.tight_layout()
plt.show()
Seaborn을 사용한 여러 그래프 그리기
Seaborn의 FacetGrid
를 사용하면 특정 카테고리별로 데이터를 나누어 여러 그래프를 그릴 수 있습니다.
import seaborn as sns
# 카테고리별 매출의 시간에 따른 그래프
g = sns.FacetGrid(df, col="카테고리", col_wrap=3, height=4)
g.map(sns.lineplot, "날짜", "매출")
g.set_titles("{col_name}")
g.set_axis_labels("날짜", "매출")
plt.show()
Matplotlib로 서로 다른 그래프를 하나의 도표에 겹치기
서로 다른 종류의 그래프를 하나의 도표에 겹쳐서 표시하면 데이터를 비교할 수 있습니다.
fig, ax1 = plt.subplots(figsize=(10, 6))
# 매출을 선 그래프로 그리기
ax1.plot(df.index, df['매출'], color='blue', label='매출')
ax1.set_xlabel('날짜')
ax1.set_ylabel('매출', color='blue')
ax1.tick_params(axis='y', labelcolor='blue')
# 이익을 막대 그래프로 겹치기
ax2 = ax1.twinx() # 두 번째 y축을 생성
ax2.bar(df.index, df['이익'], color='orange', alpha=0.6, label='이익')
ax2.set_ylabel('이익', color='orange')
ax2.tick_params(axis='y', labelcolor='orange')
# 제목과 범례
fig.suptitle('매출과 이익 비교')
fig.legend(loc='upper left', bbox_to_anchor=(0.1, 0.9))
plt.show()
여러 그래프를 개별적으로 저장하기
각 그래프를 개별적으로 저장하려면, 그래프마다 savefig()
를 호출합니다.
# 매출의 시간에 따른 변화 저장
df['매출'].plot()
plt.title('매출의 시간에 따른 변화')
plt.savefig('sales_trend.png')
plt.clf() # 현재 도표를 지우기
# 매출의 분포 저장
df['매출'].plot(kind='hist', bins=15, color='orange', edgecolor='black')
plt.title('매출의 분포')
plt.savefig('sales_distribution.png')
plt.clf()
인터랙티브한 여러 그래프 그리기
Plotly
를 사용하여 인터랙티브한 여러 그래프를 만듭니다.
import plotly.subplots as sp
import plotly.graph_objects as go
# 서브플롯 생성
fig = sp.make_subplots(rows=2, cols=2, subplot_titles=("매출", "이익", "매출분포", "가격과 매출의 상관관계"))
# 매출의 시간에 따른 변화
fig.add_trace(go.Scatter(x=df.index, y=df['매출'], name='매출'), row=1, col=1)
# 이익의 시간에 따른 변화
fig.add_trace(go.Scatter(x=df.index, y=df['이익'], name='이익'), row=1, col=2)
# 매출의 분포
fig.add_trace(go.Histogram(x=df['매출'], name='매출분포'), row=2, col=1)
# 가격과 매출의 상관관계
fig.add_trace(go.Scatter(x=df['가격'], y=df['매출'], mode='markers', name='가격 vs 매출'), row=2, col=2)
# 레이아웃 조정
fig.update_layout(title_text="여러 그래프 비교", showlegend=False, height=800)
fig.show()
여러 그래프를 동시에 그리면, 다양한 데이터 시각적 분석이 가능합니다. 다음은 그래프 커스터마이징 방법에 대해 설명합니다.
그래프 커스터마이징 방법 (색상, 스타일, 주석 등)
그래프를 더 보기 좋고 정보가 풍부하게 만들기 위해서는 색상, 스타일, 주석을 적절히 커스터마이징하는 것이 중요합니다. 여기서는 Matplotlib을 중심으로 그래프 커스터마이징 방법을 소개합니다.
색상과 스타일 변경
그래프의 색상과 스타일을 변경하면 가시성을 향상시킬 수 있습니다.
import matplotlib.pyplot as plt
# 기본적인 커스터마이징
plt.plot(df.index, df['매출'], color='blue', linestyle='--', linewidth=2, label='매출')
plt.plot(df.index, df['이익'], color='green', linestyle='-', linewidth=2, label='이익')
# 제목과 축 레이블
plt.title('매출과 이익의 변화', fontsize=16, fontweight='bold')
plt.xlabel('날짜', fontsize=12)
plt.ylabel('금액', fontsize=12)
# 범례 추가
plt.legend(fontsize=10, loc='upper left')
# 그리드 추가
plt.grid(color='gray', linestyle=':', linewidth=0.5)
plt.show()
글꼴과 크기 조정
그래프 내의 텍스트 크기와 글꼴 스타일을 변경하면 가시성을 높일 수 있습니다.
# 전체 글꼴 크기 변경
plt.rcParams.update({'font.size': 12})
# 특정 요소만 변경
plt.title('커스터마이즈된 제목', fontsize=16, fontweight='bold')
plt.xlabel('날짜', fontsize=12, fontstyle='italic')
plt.ylabel('매출', fontsize=12, fontstyle='italic')
주석 추가
특정 데이터 포인트를 강조하기 위해 주석을 추가합니다.
# 매출의 최고점을 주석으로 표시
peak_date = df['매출'].idxmax()
peak_value = df['매출'].max()
plt.plot(df.index, df['매출'], color='blue')
plt.annotate(f'최고점: {peak_value}',
xy=(peak_date, peak_value),
xytext=(peak_date, peak_value + 500),
arrowprops=dict(facecolor='red', arrowstyle='->'),
fontsize=10, color='darkred')
plt.title('매출 최고점을 주석으로 표시')
plt.xlabel('날짜')
plt.ylabel('매출')
plt.grid(True)
plt.show()
컬러맵 사용
컬러맵을 사용하면 값에 따라 색상을 변화시킬 수 있습니다.
# 매출 산점도에 컬러맵 적용
plt.scatter(df['가격'], df['매출'], c=df['매출'], cmap='viridis', alpha=0.8)
plt.title('가격과 매출 (컬러맵)')
plt.xlabel('가격')
plt.ylabel('매출')
plt.colorbar(label='매출')
plt.show()
서브플롯 레이아웃 조정
여러 그래프가 포함된 도표의 배치를 조정하여 보기 쉽게 만듭니다.
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
# 각 그래프 그리기
axes[0, 0].plot(df.index, df['매출'], color='blue')
axes[0, 0].set_title('매출의 변화')
axes[0, 1].plot(df.index, df['이익'], color='green')
axes[0, 1].set_title('이익의 변화')
axes[1, 0].hist(df['매출'], bins=15, color='orange')
axes[1, 0].set_title('매출의 분포')
axes[1, 1].scatter(df['가격'], df['매출'], color='purple', alpha=0.7)
axes[1, 1].set_title('가격과 매출의 상관관계')
# 레이아웃 조정
plt.tight_layout()
plt.show()
그래프의 테마 변경
Seaborn을 사용하면 테마를 변경하여 그래프 전체의 스타일을 통일할 수 있습니다.
import seaborn as sns
# 테마 설정
sns.set_theme(style="whitegrid", palette="muted")
# 매출의 시간에 따른 그래프 그리기
sns.lineplot(x=df.index, y=df['매출'], color='blue', label='매출')
sns.lineplot(x=df.index, y=df['이익'], color='green', label='이익')
plt.title('매출과 이익의 변화 (테마 적용)')
plt.xlabel('날짜')
plt.ylabel('금액')
plt.legend()
plt.show()
그래프 저장하기
작성한 그래프를 이미지로 저장합니다.
# 그래프 저장
plt.plot(df.index, df['매출'], color='blue', label='매출')
plt.title('매출의 변화')
plt.xlabel('날짜')
plt.ylabel('매출')
plt.legend()
plt.savefig('sales_trend.png', dpi=300, bbox_inches='tight') # 고해상도로 저장
plt.show()
이 방법들을 활용하여 분석 결과를 적절히 저장하고 공유하거나 발표에 활용할 수 있습니다. 다음은 기사의 요약을 설명합니다.
요약
본 기사에서는 Python의 Pandas 라이브러리를 활용하여 CSV 데이터를 시각화하는 방법을 자세히 설명했습니다. 데이터 읽기부터 기본적인 그래프 작성, 시계열 데이터의 플로팅, 여러 그래프 표시, 그리고 그래프의 커스터마이징과 저장 방법까지 폭넓게 다루었습니다.
데이터 시각화는 정보를 쉽게 전달하기 위한 중요한 기술입니다. Pandas, Matplotlib, Seaborn을 적절히 결합하면 데이터의 패턴과 트렌드를 쉽게 발견할 수 있습니다. 또한, 이미지 저장이나 인터랙티브한 플롯을 사용하여 분석 결과를 효과적으로 공유할 수 있습니다.
이 방법들을 활용하여 보다 효율적인 데이터 분석과 발표를 실현하시기 바랍니다.