Python의 Pandas와 NumPy를 활용한 데이터 시각화 기초
이 가이드에서는 Python의 강력한 데이터 분석 라이브러리인 Pandas와 NumPy를 사용하여 데이터를 효과적으로 시각화하는 방법을 단계별로 안내합니다. 복잡한 데이터를 이해하기 쉬운 그래프와 차트로 변환하는 방법을 배우고, 데이터 분석 능력을 한 단계 끌어올리세요.
10결론 및 추가 학습 자료
데이터 시각화란 무엇인가?

데이터 시각화는 복잡한 데이터를 그래프, 차트, 지도 등 시각적인 형태로 표현하여 데이터 속에 숨겨진 패턴, 추세, 인사이트를 쉽고 빠르게 파악할 수 있도록 돕는 과정입니다. 방대한 양의 숫자 데이터를 눈으로 직접 확인할 수 있는 형태로 변환함으로써, 비전문가도 데이터를 직관적으로 이해하고 의사결정에 활용할 수 있게 됩니다.
정보의 홍수 속에서 데이터 시각화는 단순히 데이터를 아름답게 보여주는 것을 넘어, 데이터 기반 의사결정의 핵심적인 역할을 수행합니다. 예를 들어, 기업의 매출 데이터를 시각화하면 어떤 제품이 잘 팔리고 어떤 지역에서 판매가 부진한지 한눈에 파악하여 마케팅 전략을 수정할 수 있습니다.
데이터 시각화의 가장 큰 이점은 정보의 전달 효율성을 극대화한다는 점입니다. 복잡한 통계 보고서를 읽는 것보다 잘 디자인된 차트 하나를 보는 것이 훨씬 빠르고 정확하게 의미를 전달할 수 있습니다.
데이터 시각화의 중요성
현대의 비즈니스 환경에서는 데이터를 얼마나 잘 이해하고 활용하는지가 경쟁력의 핵심입니다. 데이터 시각화는 이러한 데이터 기반 의사결정을 지원하는 필수적인 도구로 자리 잡았습니다. 복잡한 데이터셋에서 유의미한 인사이트를 추출하고, 이를 이해관계자들에게 효과적으로 전달함으로써 더 나은 비즈니스 성과를 달성할 수 있습니다.
예를 들어, 금융 시장 분석가는 주가 변동 데이터를 시각화하여 특정 패턴을 파악하고 투자 전략을 수립합니다. 의료 연구원은 환자 데이터를 시각화하여 질병의 발병 추세를 분석하고 예방책을 마련할 수 있습니다. 이처럼 데이터 시각화는 다양한 분야에서 문제 해결과 혁신을 위한 기반을 제공합니다.
이러한 중요성 때문에 많은 기업과 연구 기관에서 데이터 시각화 전문가를 양성하고 있으며, 관련 도구와 기술의 발전도 가속화되고 있습니다. Python의 Pandas와 NumPy는 이러한 시각화 작업을 수행하는 데 있어 가장 기본적이고 강력한 도구 중 하나입니다.
포인트
데이터 시각화는 단순히 그림을 그리는 것이 아니라, 데이터를 통해 ‘이야기’를 전달하는 과정입니다. 효과적인 시각화는 복잡한 정보를 명확하고 설득력 있게 전달하여 더 나은 의사결정을 가능하게 합니다.
Pandas와 NumPy 소개

Pandas와 NumPy는 Python에서 데이터 과학 및 분석 작업을 수행하는 데 있어 핵심적인 라이브러리입니다. 이 두 라이브러리를 함께 사용하면 데이터를 효율적으로 처리, 조작, 분석하고 시각화하는 모든 과정을 매끄럽게 진행할 수 있습니다.
NumPy는 다차원 배열 객체와 이를 다루는 수학적 함수들을 제공하며, Pandas는 NumPy를 기반으로 하여 DataFrame이라는 강력한 데이터 구조를 제공합니다. DataFrame은 행과 열로 구성된 표 형태의 데이터를 다루는 데 최적화되어 있어, 데이터를 테이블 형태로 불러오거나 생성하고, 특정 열이나 행을 선택하거나 필터링하는 등의 작업을 매우 편리하게 수행할 수 있습니다.
Pandas의 DataFrame은 데이터베이스 테이블이나 스프레드시트와 유사한 구조를 가지며, 데이터 분석 작업을 위한 다양한 기능을 내장하고 있습니다. 이를 통해 복잡한 데이터 전처리 과정을 간소화할 수 있습니다.
NumPy: 과학 계산의 기초
NumPy(Numerical Python)는 Python에서 과학 계산을 위한 핵심 라이브러리로, 특히 고성능 다차원 배열 객체(ndarray)와 배열 연산을 위한 도구를 제공합니다. NumPy 배열은 Python의 기본 리스트보다 훨씬 효율적이며, 대규모 데이터셋을 다룰 때 성능상의 이점을 제공합니다. 벡터화된 연산을 통해 반복문을 사용하지 않고도 배열 전체에 대한 연산을 빠르게 수행할 수 있습니다.
NumPy는 선형대수, 푸리에 변환, 난수 생성 등 다양한 수학적 연산을 지원하여 복잡한 과학 및 공학 문제 해결에 필수적입니다.
코드 설명
NumPy 배열을 생성하고 기본적인 연산을 수행하는 예시입니다. np.array() 함수로 배열을 만들고, 사칙연산은 배열 전체에 적용됩니다.
import numpy as np
# NumPy 배열 생성
a = np.array([1, 2, 3, 4, 5])
b = np.array([6, 7, 8, 9, 10])
# 배열 덧셈 (벡터화된 연산)
c = a + b
print(f"a + b = {c}")
# 배열 곱셈 (스칼라 곱)
d = a * 2
print(f"a * 2 = {d}")
# 배열의 평균 계산
mean_a = np.mean(a)
print(f"Mean of a: {mean_a}")
Pandas: 데이터 분석의 핵심 도구
Pandas는 데이터 조작 및 분석을 위한 강력하고 유연한 도구입니다. 핵심 데이터 구조인 DataFrame과 Series를 통해 다양한 형식의 데이터를 쉽게 불러오고, 정제하고, 변환할 수 있습니다. CSV, Excel, SQL 데이터베이스 등 다양한 소스에서 데이터를 읽어오는 기능을 제공하며, 결측치 처리, 데이터 필터링, 그룹화, 병합 등 복잡한 데이터 전처리 작업을 간편하게 수행할 수 있습니다.
Pandas는 NumPy를 기반으로 구축되었기 때문에, NumPy의 효율적인 배열 연산을 활용할 수 있으며, Matplotlib과 같은 다른 시각화 라이브러리와도 쉽게 통합됩니다.
코드 설명
Pandas DataFrame을 생성하고 기본적인 정보를 확인하는 예시입니다. pd.DataFrame()으로 생성하며, .info()와 .describe() 메서드는 데이터의 구조와 통계적 요약을 제공합니다.
import pandas as pd
import numpy as np
# DataFrame 생성
data = {
'이름': ['김철수', '박영희', '이민준', '최서연'],
'나이': [25, 31, 22, 28],
'점수': [85.5, 92.0, 78.5, 88.0]
}
df = pd.DataFrame(data)
# DataFrame 정보 확인
print("DataFrame 정보:")
df.info()
# 기술 통계량 확인
print("\n기술 통계량:")
print(df.describe())
# 특정 열 선택
print("\n이름 열:")
print(df['이름'])
Pandas와 NumPy의 조합은 데이터 과학 워크플로우에서 데이터 로딩, 정제, 변환, 분석, 시각화의 전 과정을 효율적으로 지원합니다.
포인트
NumPy는 수치 연산의 기반을 제공하고, Pandas는 이를 활용하여 테이블 형태의 데이터를 다루는 데 특화되어 있습니다. 이 두 라이브러리를 능숙하게 사용하면 데이터 분석 작업의 효율성을 크게 높일 수 있습니다.
기본 시각화: 선 그래프
선 그래프(Line Plot)는 시간 경과에 따른 데이터의 변화 추세를 보여주는 데 가장 효과적인 시각화 방법 중 하나입니다. X축에는 일반적으로 시간이나 순서를 나타내는 변수를, Y축에는 해당 시점의 값을 나타내는 변수를 배치합니다. 여러 개의 선을 사용하여 서로 다른 데이터 시리즈 간의 추세를 비교할 수도 있습니다.
Pandas는 Matplotlib 라이브러리를 기반으로 DataFrame 객체에서 직접 선 그래프를 쉽게 그릴 수 있는 기능을 제공합니다. .plot() 메서드를 사용하면 별도의 Matplotlib 코드를 작성하지 않고도 기본적인 선 그래프를 빠르게 생성할 수 있습니다.
선 그래프는 주가 변동, 온도 변화, 웹사이트 트래픽 증가 추이 등 시간에 따라 값이 변하는 데이터를 표현하는 데 매우 유용합니다.
Pandas를 이용한 선 그래프 그리기
Pandas의 .plot() 메서드는 다양한 종류의 그래프를 그릴 수 있으며, 기본값으로 선 그래프를 생성합니다. DataFrame의 인덱스가 X축으로 사용되고, 지정된 열의 값이 Y축으로 사용됩니다.
코드 설명
먼저 NumPy를 사용하여 시간 순서 데이터를 생성하고, Pandas DataFrame으로 변환합니다. 이후 .plot() 메서드를 호출하여 간단한 선 그래프를 생성합니다. kind='line'은 기본값이므로 생략 가능합니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt # 그래프 표시를 위해 필요
# 시계열 데이터 생성
dates = pd.date_range(start='2023-01-01', periods=100, freq='D')
values = np.random.randn(100).cumsum() + 50 # 누적 합계를 이용한 임의의 시계열 데이터
# DataFrame 생성
ts_df = pd.DataFrame({'Date': dates, 'Value': values})
ts_df = ts_df.set_index('Date') # 날짜를 인덱스로 설정
# 선 그래프 그리기
ts_df['Value'].plot(kind='line', figsize=(10, 6), title='시간에 따른 값 변화 추이')
plt.xlabel('날짜')
plt.ylabel('값')
plt.grid(True)
plt.show()
위 코드는 100일간의 임의의 시계열 데이터를 생성하고, 이를 DataFrame으로 만들어 날짜를 인덱스로 설정한 후, 해당 데이터의 변화 추이를 보여주는 선 그래프를 그립니다. figsize는 그래프의 크기를, title은 그래프의 제목을 설정합니다.
포인트
선 그래프는 데이터의 ‘흐름’을 보여주는 데 최적화되어 있습니다. 시간에 따른 변화를 시각적으로 파악하고 싶을 때 가장 먼저 고려해야 할 그래프 유형입니다.
분포 확인: 히스토그램
히스토그램(Histogram)은 데이터셋의 값들이 어떻게 분포되어 있는지를 보여주는 그래프입니다. 연속적인 데이터를 여러 구간(bin)으로 나누고, 각 구간에 해당하는 데이터의 개수(빈도)를 막대로 표현합니다. 히스토그램을 통해 데이터의 중심 경향, 산포도, 왜도(skewness), 첨도(kurtosis) 등 분포의 특징을 파악할 수 있습니다.
데이터의 분포를 이해하는 것은 통계 분석 및 모델링의 첫걸음입니다. 예를 들어, 정규 분포를 따르는지, 아니면 특정 값에 치우쳐 있는지 등을 히스토그램으로 쉽게 확인할 수 있습니다.
히스토그램은 데이터의 전반적인 형태와 특성을 빠르게 파악하는 데 매우 효과적입니다.
Pandas로 히스토그램 생성하기
Pandas의 .plot() 메서드는 kind='hist' 옵션을 통해 히스토그램을 쉽게 생성할 수 있도록 지원합니다. 또한, Matplotlib의 hist() 함수를 직접 사용할 수도 있으며, 이는 더 많은 사용자 정의 옵션을 제공합니다.
코드 설명
NumPy를 사용하여 임의의 정규 분포 데이터를 생성하고, 이를 Pandas Series로 만듭니다. 이후 Series 객체의 .plot(kind='hist') 메서드를 호출하여 히스토그램을 생성합니다. bins 매개변수는 막대의 개수를 조절합니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 정규 분포를 따르는 임의의 데이터 생성 (평균 70, 표준편차 10)
data_values = np.random.normal(loc=70, scale=10, size=1000)
# Pandas Series 생성
data_series = pd.Series(data_values)
# 히스토그램 그리기
data_series.plot(kind='hist', bins=30, title='데이터 분포 히스토그램', color='#5B7FE4')
plt.xlabel('값')
plt.ylabel('빈도')
plt.grid(axis='y', alpha=0.75)
plt.show()
생성된 히스토그램을 통해 데이터가 평균 70 근처에 가장 많이 분포하며, 양쪽으로 갈수록 빈도가 줄어드는 종 모양의 정규 분포 형태를 띠고 있음을 확인할 수 있습니다. bins 값을 조정하여 데이터의 구간을 더 세밀하게 또는 더 넓게 볼 수 있습니다.
포인트
히스토그램은 데이터의 ‘모양’을 파악하는 데 탁월합니다. 데이터가 특정 구간에 집중되어 있는지, 아니면 넓게 퍼져 있는지 등을 직관적으로 이해할 수 있습니다.
관계 파악: 산점도
산점도(Scatter Plot)는 두 변수 간의 관계를 시각화하는 데 사용됩니다. 각 데이터 포인트를 X축과 Y축에 해당하는 값에 따라 점으로 표시하며, 이를 통해 두 변수 사이에 양의 상관관계, 음의 상관관계, 또는 상관관계가 없는지 등을 파악할 수 있습니다. 또한, 데이터 포인트들의 밀집도나 이상치(outlier)를 발견하는 데도 유용합니다.
예를 들어, 광고비 지출과 매출액 간의 관계, 공부 시간과 시험 점수 간의 관계 등을 산점도를 통해 분석할 수 있습니다. 데이터 포인트들이 오른쪽 위로 갈수록 많아지면 양의 상관관계, 왼쪽 위로 갈수록 많아지면 음의 상관관계를 의심해 볼 수 있습니다.
산점도는 두 변수 간의 선형적 또는 비선형적 관계의 패턴을 탐색하는 데 필수적인 도구입니다.
Pandas와 Matplotlib를 이용한 산점도 생성
Pandas DataFrame의 .plot() 메서드에서 kind='scatter' 옵션을 사용하거나, Matplotlib의 scatter() 함수를 직접 사용하여 산점도를 그릴 수 있습니다. Pandas를 사용하면 DataFrame에서 바로 X축과 Y축으로 사용할 열을 지정하기 편리합니다.
코드 설명
먼저, NumPy를 사용하여 두 개의 연관된 변수(예: 광고비와 매출)에 대한 임의의 데이터를 생성합니다. 이 데이터를 Pandas DataFrame으로 만들고, .plot(kind='scatter', x='광고비', y='매출')을 사용하여 산점도를 그립니다. x와 y 매개변수로 사용할 열 이름을 지정합니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 광고비와 매출에 대한 임의의 데이터 생성
np.random.seed(42) # 재현성을 위한 시드 설정
advertising_cost = np.random.rand(100) * 1000 # 0~1000 사이 광고비
sales = advertising_cost * 1.5 + np.random.normal(0, 150, 100) + 500 # 광고비와 비례, 약간의 노이즈 추가
# DataFrame 생성
df_ads = pd.DataFrame({'광고비': advertising_cost, '매출': sales})
# 산점도 그리기
df_ads.plot(kind='scatter', x='광고비', y='매출', figsize=(10, 6), title='광고비와 매출의 관계', color='#5B7FE4', alpha=0.7)
plt.xlabel('광고비 (단위: 백만원)')
plt.ylabel('매출 (단위: 백만원)')
plt.grid(True)
plt.show()
그래프를 보면 광고비가 증가함에 따라 매출도 대체로 증가하는 양의 상관관계가 나타남을 확인할 수 있습니다. 점들이 오른쪽 위로 향하는 패턴을 보입니다. alpha 매개변수는 점의 투명도를 조절하여 데이터가 밀집된 영역을 더 잘 볼 수 있게 합니다.
포인트
산점도는 두 변수 간의 ‘연결고리’를 찾는 데 탁월합니다. 변수들 사이에 어떤 관계가 있는지, 그 관계가 얼마나 강한지 시각적으로 탐색할 수 있습니다.
범주 비교: 막대 그래프
막대 그래프(Bar Chart)는 서로 다른 범주(category) 간의 값을 비교하는 데 가장 널리 사용되는 시각화 방법입니다. 각 범주를 나타내는 막대의 길이 또는 높이로 해당 값을 표현하며, 이를 통해 어떤 범주의 값이 가장 크거나 작은지 쉽게 파악할 수 있습니다. 막대 그래프는 수직 막대 그래프와 수평 막대 그래프로 나눌 수 있습니다.
예를 들어, 여러 국가의 GDP 비교, 여러 제품의 판매량 비교, 월별 수익 비교 등 범주형 데이터의 값을 비교하는 데 매우 효과적입니다. 막대 그래프는 직관적이고 이해하기 쉬워 다양한 프레젠테이션과 보고서에서 활용됩니다.
막대 그래프는 여러 항목의 크기나 빈도를 쉽고 명확하게 비교할 수 있게 해줍니다.
Pandas로 막대 그래프 그리기
Pandas DataFrame의 .plot() 메서드에서 kind='bar' 또는 kind='barh' 옵션을 사용하여 막대 그래프를 생성할 수 있습니다. 'bar'는 수직 막대 그래프, 'barh'는 수평 막대 그래프를 그립니다. DataFrame의 인덱스가 범주를 나타내고, 각 열의 값이 해당 범주의 막대 높이가 됩니다.
코드 설명
도시별 인구 데이터를 Pandas DataFrame으로 생성합니다. 이후 .plot(kind='bar') 메서드를 사용하여 각 도시의 인구를 나타내는 수직 막대 그래프를 그립니다. rot=45는 X축 레이블이 겹치지 않도록 45도 회전시킵니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 도시별 인구 데이터 (예시)
population_data = {
'서울': 9700000,
'부산': 3400000,
'인천': 2950000,
'대구': 2400000,
'대전': 1470000
}
city_population_df = pd.DataFrame.from_dict(population_data, orient='index', columns=['인구'])
# 수직 막대 그래프 그리기
city_population_df.plot(kind='bar', figsize=(10, 6), title='도시별 인구 비교', color='#5B7FE4', rot=45)
plt.xlabel('도시')
plt.ylabel('인구 수')
plt.grid(axis='y', alpha=0.75)
plt.show()
# 수평 막대 그래프 그리기 (참고)
# city_population_df.plot(kind='barh', figsize=(10, 6), title='도시별 인구 비교', color='#5B7FE4')
# plt.xlabel('인구 수')
# plt.ylabel('도시')
# plt.grid(axis='x', alpha=0.75)
# plt.show()
그래프를 통해 서울의 인구가 다른 도시들에 비해 월등히 많음을 명확하게 알 수 있습니다. 수평 막대 그래프는 범주 이름이 길거나 항목이 많을 때 가독성을 높여줍니다.
포인트
막대 그래프는 ‘비교’의 강력한 도구입니다. 여러 범주 간의 값을 빠르고 직관적으로 비교해야 할 때 가장 효과적인 선택입니다.
실제 데이터셋 적용 예시
이론적인 예시를 넘어, 실제와 유사한 데이터셋을 사용하여 Pandas와 NumPy를 이용한 데이터 시각화 과정을 살펴보겠습니다. 여기서는 가상의 고객 구매 데이터를 사용하며, 이를 통해 고객 행동 패턴을 분석하고 시각화하는 단계를 진행합니다. 실제 데이터를 다룰 때는 데이터 정제 및 전처리 과정이 필수적입니다.
이 예시에서는 고객의 구매 금액과 구매 빈도를 바탕으로 시각화를 수행합니다. Pandas의 DataFrame 기능을 활용하여 데이터를 로드하고, Matplotlib를 이용해 다양한 그래프를 그려 인사이트를 도출하는 과정을 실습합니다.
실제 데이터셋을 다루는 것은 이론을 실제 문제에 적용하는 능력을 키우는 데 중요합니다.
가상 고객 구매 데이터 생성 및 분석
먼저, NumPy를 사용하여 가상의 고객 구매 데이터를 생성합니다. 각 고객별로 구매 횟수와 총 구매 금액을 포함하는 데이터를 만들고, 이를 Pandas DataFrame으로 변환합니다. 데이터 생성 시, 실제 데이터에서 나타날 수 있는 다양한 패턴(예: 소수의 고객이 많은 금액을 구매하는 현상)을 반영하도록 합니다.
코드 설명
NumPy를 사용하여 100명의 고객에 대한 임의의 구매 횟수와 평균 구매 금액을 생성합니다. 총 구매 금액은 구매 횟수와 평균 구매 금액의 곱으로 계산됩니다. 이 데이터를 Pandas DataFrame으로 구성합니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0) # 재현성 확보
num_customers = 100
# 구매 횟수 생성 (예: 1~20회 사이)
purchase_count = np.random.randint(1, 21, num_customers)
# 평균 구매 금액 생성 (예: 10000 ~ 50000 사이, 일부 고액 구매자 포함)
avg_purchase_amount = np.random.normal(loc=25000, scale=8000, size=num_customers)
avg_purchase_amount = np.clip(avg_purchase_amount, 10000, 50000) # 최소/최대 금액 제한
# 총 구매 금액 계산
total_purchase_amount = purchase_count * avg_purchase_amount
# DataFrame 생성
customer_df = pd.DataFrame({
'CustomerID': range(1, num_customers + 1),
'PurchaseCount': purchase_count,
'TotalAmount': total_purchase_amount
})
print("생성된 고객 구매 데이터 (상위 5개):")
print(customer_df.head())
print("\n데이터 정보:")
customer_df.info()
생성된 DataFrame은 각 고객의 ID, 구매 횟수, 총 구매 금액 정보를 담고 있습니다. 이 데이터를 기반으로 고객 세분화나 구매 패턴 분석을 위한 시각화를 진행할 수 있습니다.
구매 빈도와 총 구매 금액 간의 관계 시각화
고객의 구매 빈도와 총 구매 금액 사이에 어떤 관계가 있는지 산점도를 통해 살펴보겠습니다. 이를 통해 자주 구매하는 고객이 더 많은 금액을 지출하는 경향이 있는지, 또는 그 반대인지 등을 파악할 수 있습니다.
코드 설명
앞서 생성한 customer_df DataFrame을 사용하여 PurchaseCount(구매 횟수)를 X축으로, TotalAmount(총 구매 금액)를 Y축으로 하는 산점도를 그립니다. 이를 통해 두 변수 간의 상관 관계를 시각적으로 확인할 수 있습니다.
# 산점도 그리기: 구매 횟수 vs 총 구매 금액
customer_df.plot(kind='scatter', x='PurchaseCount', y='TotalAmount', figsize=(10, 6), title='구매 횟수 vs 총 구매 금액', color='#5B7FE4', alpha=0.7)
plt.xlabel('구매 횟수')
plt.ylabel('총 구매 금액')
plt.grid(True)
plt.show()
이 산점도를 통해 일반적으로 구매 횟수가 많을수록 총 구매 금액도 증가하는 경향을 보임을 확인할 수 있습니다. 하지만 모든 고객이 동일한 패턴을 따르는 것은 아니며, 일부 고객은 적은 횟수로도 많은 금액을 지출하거나, 반대의 경우도 있을 수 있습니다. 이러한 이상치나 특정 그룹의 패턴을 더 깊이 분석할 수 있습니다.
고객별 총 구매 금액 분포 확인
고객들의 총 구매 금액이 어떻게 분포되어 있는지 히스토그램으로 확인해 보겠습니다. 이를 통해 대부분의 고객이 어느 정도 금액을 지출하는지, 극단적으로 높은 금액을 지출하는 고객이 얼마나 되는지 등을 파악할 수 있습니다.
코드 설명
customer_df의 TotalAmount 열을 사용하여 히스토그램을 생성합니다. bins 값을 적절히 설정하여 분포의 형태를 잘 나타내도록 합니다. 이 분포는 고객 세분화 전략 수립에 중요한 정보를 제공합니다.
# 총 구매 금액 분포 히스토그램 그리기
customer_df['TotalAmount'].plot(kind='hist', bins=15, title='고객별 총 구매 금액 분포', color='#5B7FE4', alpha=0.7)
plt.xlabel('총 구매 금액')
plt.ylabel('고객 수')
plt.grid(axis='y', alpha=0.75)
plt.show()
이 히스토그램은 대부분의 고객이 중간 정도의 구매 금액을 지출하고 있으며, 매우 높은 금액을 지출하는 고객은 상대적으로 적다는 것을 보여줍니다. 이러한 정보는 VIP 고객 관리 전략이나 마케팅 메시지 타겟팅에 활용될 수 있습니다.
포인트
실제 데이터셋을 다룰 때는 데이터의 특성을 이해하고, 목적에 맞는 시각화 기법을 선택하는 것이 중요합니다. Pandas와 NumPy는 이러한 과정을 효율적으로 지원하는 강력한 도구입니다.
고급 시각화 기법 (Matplotlib, Seaborn 활용)
Pandas의 기본 .plot() 메서드는 빠르고 간단한 시각화에 유용하지만, 더 복잡하고 미려한 그래프를 위해서는 Matplotlib와 Seaborn 라이브러리를 함께 사용하는 것이 일반적입니다. Matplotlib는 시각화의 거의 모든 요소를 제어할 수 있는 강력한 기능을 제공하며, Seaborn은 Matplotlib를 기반으로 하여 더욱 세련되고 통계적인 시각화를 쉽게 생성할 수 있도록 돕습니다.
이 섹션에서는 Matplotlib와 Seaborn을 활용하여 조금 더 전문적인 시각화를 구현하는 방법을 간략히 소개합니다. Pandas DataFrame에서 데이터를 가져와 이 라이브러리들을 사용하여 다양한 그래프를 그려볼 것입니다.
Matplotlib와 Seaborn은 데이터의 숨겨진 패턴을 더 깊이 탐색하고, 분석 결과를 효과적으로 전달할 수 있게 해줍니다.
Matplotlib: 시각화의 모든 것 제어하기
Matplotlib는 Python의 대표적인 시각화 라이브러리로, 그래프의 모든 측면을 세밀하게 제어할 수 있습니다. Figure, Axes 객체를 사용하여 그래프의 크기, 제목, 축 레이블, 폰트, 색상, 선 스타일 등 거의 모든 요소를 사용자가 원하는 대로 커스터마이징할 수 있습니다. Pandas의 plot() 메서드 역시 내부적으로 Matplotlib를 사용합니다.
코드 설명
Pandas DataFrame에서 두 개의 열을 선택하여 Matplotlib의 scatter() 함수를 직접 사용하는 예시입니다. plt.figure()로 Figure 객체를 생성하고, plt.scatter()로 산점도를 그린 후, plt.title(), plt.xlabel(), plt.ylabel() 등으로 세부적인 속성을 설정합니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 예시 데이터 생성 (이전 예시의 customer_df 사용)
np.random.seed(0)
num_customers = 100
purchase_count = np.random.randint(1, 21, num_customers)
avg_purchase_amount = np.random.normal(loc=25000, scale=8000, size=num_customers)
avg_purchase_amount = np.clip(avg_purchase_amount, 10000, 50000)
total_purchase_amount = purchase_count * avg_purchase_amount
customer_df = pd.DataFrame({
'CustomerID': range(1, num_customers + 1),
'PurchaseCount': purchase_count,
'TotalAmount': total_purchase_amount
})
# Matplotlib 직접 사용: 산점도
plt.figure(figsize=(10, 6)) # Figure 크기 설정
plt.scatter(customer_df['PurchaseCount'], customer_df['TotalAmount'],
color='#2944A6', alpha=0.6, edgecolors='w', linewidth=0.5) # 점의 색상, 투명도, 테두리 설정
plt.title('구매 횟수 vs 총 구매 금액 (Matplotlib 직접 사용)', fontsize=16)
plt.xlabel('구매 횟수', fontsize=12)
plt.ylabel('총 구매 금액', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
Matplotlib를 사용하면 점의 크기, 모양, 색상, 테두리 등 세부적인 요소를 제어할 수 있어 더욱 정교한 시각화가 가능합니다. edgecolors와 linewidth를 사용하여 점의 테두리를 설정하는 것도 좋은 예시입니다.
Seaborn: 통계적 시각화의 간편화
Seaborn은 Matplotlib를 기반으로 구축되었으며, 통계 모델링 및 데이터 분석을 위한 데이터셋을 시각적으로 표현하는 데 특화되어 있습니다. Seaborn은 복잡한 통계 그래프(예: 회귀선이 포함된 산점도, 바이올린 플롯, 히트맵 등)를 몇 줄의 코드로 쉽게 생성할 수 있게 해줍니다. 또한, Matplotlib보다 미려한 기본 스타일과 컬러 팔레트를 제공합니다.
Seaborn은 Pandas DataFrame을 직접 입력으로 받아 사용하기 편리하며, 여러 변수 간의 관계를 탐색하는 데 유용한 함수들을 많이 제공합니다. 예를 들어, pairplot 함수는 DataFrame의 모든 숫자형 변수 쌍에 대한 산점도와 각 변수의 히스토그램을 한 번에 그려줍니다.
코드 설명
Seaborn의 regplot 함수를 사용하여 산점도와 함께 선형 회귀선을 그립니다. 이는 두 변수 간의 선형 관계를 시각적으로 명확하게 보여주며, 회귀선의 기울기와 신뢰 구간을 통해 관계의 강도와 불확실성을 파악하는 데 도움을 줍니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 예시 데이터 생성 (이전 예시의 customer_df 사용)
np.random.seed(0)
num_customers = 100
purchase_count = np.random.randint(1, 21, num_customers)
avg_purchase_amount = np.random.normal(loc=25000, scale=8000, size=num_customers)
avg_purchase_amount = np.clip(avg_purchase_amount, 10000, 50000)
total_purchase_amount = purchase_count * avg_purchase_amount
customer_df = pd.DataFrame({
'CustomerID': range(1, num_customers + 1),
'PurchaseCount': purchase_count,
'TotalAmount': total_purchase_amount
})
# Seaborn 사용: 회귀선이 포함된 산점도 (regplot)
plt.figure(figsize=(10, 6))
sns.regplot(x='PurchaseCount', y='TotalAmount', data=customer_df,
scatter_kws={'alpha':0.6, 'color': '#2944A6'}, # 산점도 설정
line_kws={'color': '#5B7FE4'}) # 회귀선 설정
plt.title('구매 횟수 vs 총 구매 금액 (Seaborn regplot)', fontsize=16)
plt.xlabel('구매 횟수', fontsize=12)
plt.ylabel('총 구매 금액', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
Seaborn의 regplot은 Matplotlib의 scatter와 regress 기능을 합친 것으로, 데이터의 추세를 더 명확하게 파악하는 데 유용합니다. Seaborn은 이 외에도 다양한 통계적 시각화 함수를 제공하므로, 데이터 분석에 깊이를 더하고 싶다면 Seaborn을 적극적으로 활용하는 것이 좋습니다.
포인트
Matplotlib는 세밀한 제어를, Seaborn은 통계적 인사이트와 미려한 디자인을 제공합니다. 이 두 라이브러리를 조합하면 거의 모든 종류의 데이터 시각화 요구사항을 충족시킬 수 있습니다.
주의사항 및 팁
데이터 시각화를 효과적으로 수행하기 위해서는 몇 가지 주의사항을 염두에 두어야 합니다. 잘못된 시각화는 데이터를 왜곡하거나 잘못된 해석을 유도할 수 있으므로, 신중하게 접근해야 합니다. 또한, 몇 가지 팁을 활용하면 시각화의 질을 크게 향상시킬 수 있습니다.
가장 중요한 것은 ‘누구를 위한 시각화인가’를 명확히 하는 것입니다. 대상 독자의 수준과 목적에 맞춰 그래프의 복잡성과 표현 방식을 조절해야 합니다. 또한, 그래프의 가독성을 높이기 위한 디자인 원칙을 따르는 것이 중요합니다.
효과적인 시각화는 데이터의 진실성을 유지하면서도 명확하고 설득력 있게 정보를 전달하는 데 초점을 맞춰야 합니다.
데이터 왜곡을 피하는 방법
데이터 시각화에서 가장 흔한 오류 중 하나는 Y축을 의도적으로 잘라내어 변화를 과장하는 것입니다. 예를 들어, Y축의 최솟값을 0이 아닌 다른 값으로 설정하면 미미한 변화도 크게 보이게 만들 수 있습니다. 항상 Y축의 시작점을 0으로 설정하는 것이 일반적이며, 특수한 경우가 아니라면 이를 임의로 변경해서는 안 됩니다.
또한, 3D 그래프는 종종 데이터의 실제 크기를 왜곡하거나 특정 부분을 강조하는 데 사용될 수 있습니다. 3D 그래프는 시각적으로 흥미로울 수 있지만, 데이터의 정확한 비교를 위해서는 2D 그래프가 더 적합한 경우가 많습니다. 색상 사용 또한 주의해야 합니다. 너무 많은 색상이나 부적절한 색상 조합은 오히려 가독성을 해칠 수 있습니다.
경고
Y축을 0이 아닌 값에서 시작하거나, 3D 그래프를 남용하는 것은 데이터를 오해하게 만들 수 있는 주요 원인입니다. 항상 그래프가 전달하는 메시지가 데이터의 실제를 정확히 반영하는지 검토해야 합니다.
그래프의 제목, 축 레이블, 범례 등은 명확하고 간결해야 합니다. 독자가 그래프를 보고 즉시 무엇을 의미하는지 이해할 수 있도록 충분한 정보를 제공해야 합니다.
가독성을 높이는 팁
1. 명확한 제목과 레이블 사용: 그래프의 목적과 각 축이 나타내는 것을 명확히 설명하는 제목과 레이블을 사용하세요.
2. 적절한 그래프 유형 선택: 데이터의 특성과 전달하고자 하는 메시지에 가장 적합한 그래프 유형을 선택하는 것이 중요합니다. (예: 추