Akashic Records

데이터 분석 후 그래프와 시각화 본문

Python for Beginners

데이터 분석 후 그래프와 시각화

Andrew's Akashic Records 2024. 7. 30. 11:14
728x90

Here is an infographic that visually represents different data visualization techniques, including pair plots, scatter plots, and linear regression lines. The image incorporates various icons related to data analysis, presented in a clean and modern style suitable for a professional data science presentation.

 

Jupyter Notebook에서 대화형 Matplotlib 그래프를 사용하는 것은 데이터를 시각적으로 탐색할 때 매우 유용합니다. 이를 통해 사용자는 그래프를 동적으로 조작하고, 다양한 시각적 표현을 통해 데이터에 대한 통찰을 얻을 수 있습니다. 

1. 필요한 라이브러리 설치

먼저 Matplotlib를 사용하려면, 이 라이브러리가 설치되어 있어야 합니다. 아직 설치하지 않았다면, 다음 명령어로 설치할 수 있습니다:

pip install matplotlib

2. Matplotlib 설정 변경

Matplotlib의 대화형 기능을 활성화하기 위해 Jupyter Notebook에서 몇 가지 설정을 변경해야 합니다. %matplotlib 매직 명령어를 사용하여 이를 설정할 수 있습니다. 대화형 모드를 위한 가장 일반적인 백엔드는 notebookwidget입니다. 다음과 같이 설정할 수 있습니다:

%matplotlib notebook
# 또는
%matplotlib widget
  • %matplotlib notebook은 기본적인 대화형 기능을 제공합니다.
  • %matplotlib widget은 더 향상된 기능을 제공하지만, ipympl 라이브러리의 설치가 필요합니다(pip install ipympl).

3. 간단한 대화형 플롯 예제

이제 설정이 완료되었으니, 간단한 예제를 통해 대화형 플롯을 만들어 보겠습니다. 다음은 기본적인 선 그래프를 생성하는 코드입니다:

import matplotlib.pyplot as plt
import numpy as np

# 데이터 생성
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 플롯 생성
plt.figure()
plt.plot(x, y, label='sin(x)')
plt.title('Simple Interactive Plot')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.legend()
plt.show()

4. 대화형 기능 활용

이제 그래프 위에 마우스를 올리면, 확대/축소, 이동과 같은 기능들을 사용할 수 있습니다. 또한, 그래프 영역에 대한 상세 정보를 살펴볼 수도 있습니다.

5. 대화형 플롯 저장

대화형 플롯을 생성한 후에는, Jupyter Notebook의 도구 모음에서 다운로드 버튼을 통해 이미지로 저장할 수 있습니다.

이러한 방식으로 Jupyter Notebook에서 Matplotlib을 활용하면, 데이터 분석 과정에서 보다 동적이고 상호 작용적인 데이터 시각화를 수행할 수 있습니다. 데이터를 더 깊이 있게 탐색하고 싶을 때 매우 유용하게 사용할 수 있습니다.

Matplotlib에서 figure

그래프의 윈도우나 캔버스를 의미합니다. 이 figure 위에 하나 이상의 axes (플롯)를 추가하고, 각각의 axes에서 다양한 그래픽을 그릴 수 있습니다. figure 객체를 사용할 때 다양한 옵션을 설정할 수 있어, 시각적으로 보다 효과적인 플롯을 만들 수 있습니다.

figure 생성

기본적으로 figure를 생성하려면 plt.figure() 함수를 사용합니다. 이 함수는 다양한 파라미터를 통해 캔버스의 크기, 해상도 및 배경색 등을 조절할 수 있습니다.

주요 파라미터:

  • num: 그림의 번호 또는 이름. 같은 num을 가진 figure가 이미 존재하면 그 figure에 플롯을 추가합니다.
  • figsize: 그림의 크기를 인치 단위로 설정. 예: (width, height)
  • dpi: 그림의 해상도(Dots Per Inch). 높을수록 더 선명하게 그림을 생성합니다.
  • facecolor: 그림의 배경색.
  • edgecolor: 그림의 테두리 색상.

사용 예시

여기에 간단한 figure 설정과 함께 선 그래프와 산점도를 그리는 예시를 보여드리겠습니다.

import matplotlib.pyplot as plt
import numpy as np

# 데이터 생성
x = np.linspace(0, 10, 50)
y1 = np.sin(x)
y2 = np.cos(x)

# figure 생성
fig = plt.figure(num='My Figure', figsize=(8, 6), dpi=80, facecolor='white', edgecolor='blue')

# 첫 번째 플롯 추가
ax1 = fig.add_subplot(2, 1, 1)  # 2행 1열의 첫 번째
ax1.plot(x, y1, marker='o', color='red', label='sin(x)')
ax1.set_title('Sine Wave')
ax1.set_xlabel('X axis')
ax1.set_ylabel('Y axis')
ax1.legend()

# 두 번째 플롯 추가
ax2 = fig.add_subplot(2, 1, 2)  # 2행 1열의 두 번째
ax2.scatter(x, y2, color='green', label='cos(x)')
ax2.set_title('Cosine Wave')
ax2.set_xlabel('X axis')
ax2.set_ylabel('Y axis')
ax2.legend()

# 그래프 보여주기
plt.tight_layout()  # 플롯 간 여백 자동 조절
plt.show()

 

이 코드는 figure를 생성하고, 2개의 서브플롯(subplot)을 이용해 각각의 서브플롯에 선 그래프와 산점도를 그립니다. 여기서 tight_layout() 함수는 플롯 간의 올바른 간격을 자동으로 조절해 주어 서브플롯들이 겹치지 않도록 합니다.

추가 팁

  • plt.subplots()를 사용하면, figure와 여러 개의 axes를 한 번에 생성할 수 있어 편리합니다. 예: fig, ax = plt.subplots(2, 2)는 2x2 그리드의 figureaxes를 생성합니다.
  • plt.style.use()를 통해 미리 정의된 스타일을 적용하여 그래프의 외관을 쉽게 바꿀 수 있습니다. 예: plt.style.use('ggplot').

Matplotlib에서 subplot

Matplotlib에서 subplot은 단일 figure 내에 다수의 서브플롯(axes)을 배치할 수 있게 해줍니다. 이를 통해 여러 데이터 셋이나 다양한 종류의 정보를 하나의 그래픽 창에서 비교하고 관찰할 수 있습니다. 각 서브플롯은 독립적인 축과 타이틀을 가질 수 있으며, 각기 다른 데이터를 표현할 수 있습니다.

subplot의 기본 사용법

subplot을 추가할 때는 주로 plt.subplot 함수를 사용합니다. 이 함수는 여러 파라미터를 받아 서브플롯의 위치와 크기를 조절할 수 있습니다.

주요 파라미터:

  • nrows: 서브플롯을 배치할 행의 수
  • ncols: 서브플롯을 배치할 열의 수
  • index: 서브플롯의 위치를 지정하는 인덱스 (왼쪽에서 오른쪽, 위에서 아래 순서)

예제 코드:

import matplotlib.pyplot as plt
import numpy as np

# 데이터 생성
x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)

# 2x2 그리드의 첫 번째 위치에 서브플롯 생성
plt.subplot(2, 2, 1)
plt.plot(x, y)
plt.title('Subplot 1')

# 2x2 그리드의 두 번째 위치에 서브플롯 생성
plt.subplot(2, 2, 2)
plt.plot(x, y, 'tab:orange')
plt.title('Subplot 2')

# 2x2 그리드의 세 번째 위치에 서브플롯 생성
plt.subplot(2, 2, 3)
plt.plot(x, -y, 'tab:green')
plt.title('Subplot 3')

# 2x2 그리드의 네 번째 위치에 서브플롯 생성
plt.subplot(2, 2, 4)
plt.plot(x, -y, 'tab:red')
plt.title('Subplot 4')

# 간격 조정
plt.tight_layout()
plt.show()

추가 옵션과 팁

  • 서브플롯 간격 조정: plt.subplots_adjust() 함수를 사용하여 서브플롯 사이의 간격을 조정할 수 있습니다. 예를 들어, left, right, bottom, top, wspace, hspace 등의 파라미터를 조절하여 공간 배치를 최적화할 수 있습니다.
  • 더 쉬운 방법으로 subplots 사용하기: plt.subplots(nrows, ncols) 함수는 figureaxes 객체의 배열을 반환하여, 서브플롯을 더 쉽게 관리할 수 있게 해줍니다. 각 axes 객체를 이용하여 서브플롯을 개별적으로 조작할 수 있습니다.
  • subplot2grid 사용: 더 복잡한 서브플롯 배치가 필요한 경우 plt.subplot2grid를 사용할 수 있습니다. 이 함수는 그리드의 특정 부분을 선택하고, 서브플롯이 그리드의 여러 칸을 차지하도록 할 수 있습니다.

subplot과 관련된 기능들은 Matplotlib을 사용하여 복잡한 데이터 시각화 작업을 수행할 때 매우 유용합니다. 이를 통해 다양한 데이터를 비교 분석하고, 한 눈에 여러 결과를 쉽게 표현할 수 있습니다.

눈금(ticks), 레이블(labels), 그리고 범례(legend)

눈금(ticks), 레이블(labels), 그리고 범례(legend)를 설정하는 것은 그래프의 가독성과 정보 전달력을 높이는 중요한 요소입니다. 이 세 가지 구성요소를 잘 활용하면 데이터의 시각적 표현을 효과적으로 개선할 수 있습니다.

1. 눈금(Ticks) 설정

눈금은 그래프의 축에 표시되는 작은 표식입니다. Matplotlib에서는 이 눈금의 위치와 라벨을 쉽게 조정할 수 있습니다.

눈금 위치 설정

  • plt.xticks()plt.yticks() 함수를 사용하여 X축과 Y축의 눈금 위치를 설정할 수 있습니다.
  • 예시: plt.xticks([0, 1, 2, 3, 4, 5])는 X축에 0부터 5까지 눈금을 표시합니다.

눈금 라벨 설정

  • 눈금 위치와 함께 라벨을 직접 지정할 수 있습니다.
  • 예시: plt.xticks([0, 1, 2, 3, 4, 5], ['zero', 'one', 'two', 'three', 'four', 'five'])는 각 눈금에 해당하는 이름을 설정합니다.

2. 레이블(Labels) 설정

레이블은 그래프의 축이나 타이틀에 표시되는 텍스트입니다. 축 레이블과 그래프의 타이틀을 설정하여, 데이터의 내용을 명확하게 전달할 수 있습니다.

축 레이블

  • plt.xlabel()plt.ylabel() 함수를 사용하여 각 축의 이름을 설정합니다.
  • 예시: plt.xlabel('Time (s)'), plt.ylabel('Amplitude')

그래프 타이틀

  • plt.title() 함수를 사용하여 그래프의 제목을 설정합니다.
  • 예시: plt.title('Example of Sinewave')

3. 범례(Legend) 설정

범례는 그래프에 데이터 세트를 구별하기 위한 키를 제공합니다. 각 데이터 세트를 설명하는 범례를 추가하는 것은 그래프의 이해도를 크게 향상시킵니다.

범례 추가

  • plt.legend() 함수를 사용하여 범례를 추가합니다.
  • 그래프의 각 플롯 명령에 label 인자를 추가하여, 그 라벨을 범례에 표시할 수 있습니다.
  • 예시: 
  • plt.plot(x, y, label='sin(x)') plt.plot(x, z, label='cos(x)') plt.legend()

범례 위치 조정

  • 범례의 위치는 loc 인자를 사용하여 조절할 수 있습니다.
  • loc에는 'upper right', 'upper left', 'lower left', 'lower right', 'center', 'best' 등이 있습니다.
  • 예시: plt.legend(loc='upper right')

종합 예제

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y = np.sin(x)
z = np.cos(x)

plt.plot(x, y, label='sin(x)')
plt.plot(x, z, label='cos(x)')

# 눈금 설정
plt.xticks(np.arange(0, 11, 1))
plt.yticks(np.arange(-1, 2, 0.5))

# 레이블 및 타이틀 설정
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.title('Sine and Cosine Waves')

# 범례 설정
plt.legend()

plt.show()

 

이 예제에서는 눈금, 레이블, 범례를 모두 사용하여 그래프를 명확하고 이해하기 쉽게 구성하고 있습니다. 이러한 요소들은 특히 과학적 데이터를 다룰 때 그래프의 정보 전달력을 높이는 데 큰 도움이 됩니다.

주석(annotations)과 그림(artwork) 추가

주석(annotations)과 그림(artwork)을 추가하는 것은 그래프에 추가적인 정보와 시각적 요소를 제공하여 더욱 풍부하고 이해하기 쉬운 시각화를 생성할 수 있게 해줍니다. 주석은 데이터 포인트에 대한 설명을 추가하거나, 특정 부분을 강조하는 데 사용됩니다. 그림 추가는 아이콘, 로고 또는 그래프 내에 특정 시각적 이미지를 삽입하는 것을 말합니다.

1. 주석(Annotations) 추가하기

주석은 특정 데이터 포인트나 그래프의 특정 부분에 대한 텍스트 설명을 추가하는 데 사용됩니다. 주석은 plt.annotate() 함수를 사용하여 추가할 수 있습니다.

plt.annotate() 주요 파라미터:

  • text: 주석에 표시될 텍스트입니다.
  • xy: 주석이 가리킬 점의 위치입니다. (x, y) 형태로 지정합니다.
  • xytext: 텍스트의 위치입니다. 텍스트가 xy 위치와 다른 곳에 위치해야 할 때 사용합니다.
  • arrowprops: 화살표의 스타일을 딕셔너리 형태로 지정합니다. 화살표를 사용하지 않으려면 생략 가능합니다.

예제 코드:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 30)
y = np.exp(x / 3)

plt.plot(x, y, 'o')
plt.title('Exponential Growth')

# 주석 추가
plt.annotate('This is the start', xy=(0, 1), xytext=(2, 10),
             arrowprops=dict(facecolor='black', shrink=0.05))

plt.xlabel('Time')
plt.ylabel('Value')
plt.show()

이 코드에서, (0, 1) 위치에 'This is the start'라는 주석을 추가하고, 화살표로 그 위치를 가리키고 있습니다.

 

2. 그림(Artwork) 추가하기

Matplotlib에서 그래프에 이미지나 로고와 같은 그림을 추가할 수 있습니다. 이는 plt.imshow() 또는 OffsetImage를 사용하여 수행할 수 있습니다.

예제 코드 (OffsetImage 사용):

import matplotlib.pyplot as plt
from matplotlib.offsetbox import TextArea, DrawingArea, OffsetImage, AnnotationBbox
import matplotlib.image as mpimg

# 이미지 로드
image = mpimg.imread('path_to_image.png')  # 이미지 파일 경로
imagebox = OffsetImage(image, zoom=0.1)  # 이미지 크기 조절

fig, ax = plt.subplots()
ax.plot([1, 2, 3], [3, 2, 1], 'o-')

# 이미지 추가
ab = AnnotationBbox(imagebox, (2, 2), frameon=False)
ax.add_artist(ab)

plt.title('Graph with Image')
plt.show()

이 코드는 그래프에 이미지를 추가하고 있습니다. 이미지의 위치와 크기는 조절 가능합니다.

 

결론

주석과 그림을 그래프에 추가하는 기능은 Matplotlib의 유연성을 크게 향상시킵니다. 데이터의 특정 부분을 강조하거나 시각적 매력을 추가하려는 경우 유용하게 사용될 수 있습니다.

그래프 파일로 저장

Matplotlib를 사용하여 생성한 그래프를 파일로 저장하는 기능은 데이터 분석 결과를 문서화하거나 발표 자료로 공유할 때 매우 유용합니다. Matplotlib는 plt.savefig() 함수를 통해 다양한 형식의 그래픽 파일로 그래프를 저장할 수 있습니다.

plt.savefig() 사용법

주요 파라미터:

  • fname: 파일 이름 또는 경로입니다. 확장자를 포함하여 파일 형식을 지정할 수 있습니다 (예: 'plot.png', 'plot.pdf').
  • dpi: 파일의 해상도를 지정합니다. 더 높은 dpi 값은 더 높은 해상도의 이미지를 생성합니다.
  • format: 파일 형식을 명시적으로 지정합니다 (예: 'png', 'pdf', 'svg', 'eps'). fname에 확장자가 포함되어 있으면 이 파라미터는 선택적입니다.
  • bbox_inches: 그래프에서 저장할 범위를 지정합니다. 'tight' 옵션은 자동으로 그래프 주변의 공백을 최소화합니다.
  • transparent: 배경을 투명하게 할 것인지 여부입니다. True 또는 False.
  • quality: JPEG 파일을 저장할 때 이미지 품질을 설정합니다 (1에서 95까지). 높을수록 더 좋은 품질입니다.

예제 코드:

import matplotlib.pyplot as plt
import numpy as np

# 데이터 생성
x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.plot(x, y)
plt.title('Sine Wave Example')
plt.xlabel('Time')
plt.ylabel('Amplitude')

# 그래프 저장
plt.savefig('sine_wave.png', dpi=300, bbox_inches='tight', transparent=True)
plt.savefig('sine_wave.pdf', format='pdf', bbox_inches='tight')

plt.show()

 

이 예제에서는 PNG 형식으로 그래프를 고해상도로 저장하고, PDF 형식으로도 저장하고 있습니다. bbox_inches='tight'는 그래프 주변의 불필요한 여백을 제거합니다.

저장 옵션에 대한 추가 정보

  • 색상 모드 설정: colorfacecolor, edgecolor를 사용하여 그래프의 전경 및 배경 색상을 설정할 수 있습니다. 예를 들어, 배경을 흰색으로 설정하려면 facecolor='white'를 사용합니다.
  • 파일 형식: Matplotlib는 PNG, PDF, SVG, EPS 등 다양한 파일 형식을 지원합니다. 형식 선택은 용도에 따라 달라질 수 있습니다. 예를 들어, 웹 사용을 위해서는 PNG, 출판용으로는 PDF나 SVG가 적합합니다.
  • 파일 사이즈와 비율 조절: 그래프의 크기와 비율은 figsize 파라미터를 plt.figure()에서 설정할 수 있습니다. 이 설정은 savefig()에서 그대로 적용됩니다.

Matplotlib의 파일 저장 기능을 이용하면 연구 결과를 공유하거나, 보고서를 작성하는 등의 다양한 목적으로 그래프를 활용할 수 있습니다. 그래프의 저장 옵션을 적절히 조정함으로써 원하는 형태와 품질의 결과물을 얻을 수 있습니다.

 

예시코드 분석(금융 위기 S&P 500 지수의 변화)

이 파이썬 코드는 Matplotlib을 사용하여 특정 데이터 세트에서 중요한 이벤트를 주석과 함께 시각화하는 방법을 보여줍니다. 여기서 데이터는 주식 시장의 지수인 S&P 500 지수의 변화를 표현하며, 2007년부터 2010년 사이의 금융 위기와 관련된 중요한 날짜들이 주석으로 추가되었습니다. 코드를 단계별로 살펴보겠습니다.

# 코드분석 필요

from datetime import datetime

fig, ax = plt.subplots()

data = pd.read_csv("examples/spx.csv", index_col=0, parse_dates=True)
spx = data["SPX"]

spx.plot(ax=ax, color="black")

crisis_data = [
    (datetime(2007, 10, 11), "Peak of bull market"),
    (datetime(2008, 3, 12), "Bear Stearns Fails"),
    (datetime(2008, 9, 15), "Lehman Bankruptcy")
]

for date, label in crisis_data:
    ax.annotate(label, xy=(date, spx.asof(date) + 75),
                xytext=(date, spx.asof(date) + 225),
                arrowprops=dict(facecolor="black", headwidth=4, width=2,
                                headlength=4),
                horizontalalignment="left", verticalalignment="top")

# Zoom in on 2007-2010
ax.set_xlim(["1/1/2007", "1/1/2011"])
ax.set_ylim([600, 1800])

ax.set_title("Important dates in the 2008–2009 financial crisis")

1. 라이브러리 및 데이터 로딩

from datetime import datetime
import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv("examples/spx.csv", index_col=0, parse_dates=True)
spx = data["SPX"]
  • datetime: 날짜와 시간을 처리하기 위한 표준 라이브러리입니다.
  • pandasmatplotlib.pyplot: 데이터 분석과 시각화에 널리 사용되는 라이브러리입니다.
  • pd.read_csv(): CSV 파일을 읽어서 DataFrame 객체로 변환합니다. 여기서 index_col=0는 첫 번째 열을 인덱스로 사용하고, parse_dates=True는 인덱스 열의 데이터를 날짜로 파싱합니다.
  • spx: DataFrame에서 "SPX"라는 열을 추출하여 시리즈 형태로 저장합니다. 이 시리즈는 S&P 500 지수의 값들을 포함합니다.

2. 그래프 초기 설정

fig, ax = plt.subplots()
spx.plot(ax=ax, color="black")
  • plt.subplots(): 그래프를 그릴 기본 틀인 fig와 이를 조작할 축 ax를 생성합니다.
  • spx.plot(): spx 시리즈를 사용해 선 그래프를 그립니다. ax=ax는 이 그래프를 위에서 생성된 축에 그리라는 의미이며, color="black"은 선의 색깔을 검정색으로 설정합니다.

3. 위기 관련 중요 날짜 주석 추가

crisis_data = [
    (datetime(2007, 10, 11), "Peak of bull market"),
    (datetime(2008, 3, 12), "Bear Stearns Fails"),
    (datetime(2008, 9, 15), "Lehman Bankruptcy")
]

for date, label in crisis_data:
    ax.annotate(label, xy=(date, spx.asof(date) + 75),
                xytext=(date, spx.asof(date) + 225),
                arrowprops=dict(facecolor="black", headwidth=4, width=2,
                                headlength=4),
                horizontalalignment="left", verticalalignment="top")
  • crisis_data: 중요 이벤트의 날짜와 라벨을 튜플로 구성한 리스트입니다.
  • ax.annotate(): 주석을 추가합니다. xy는 주석이 가리킬 점의 좌표, xytext는 주석 텍스트의 위치를 지정합니다. arrowprops는 화살표의 스타일을 설정합니다.
  • spx.asof(date): 주어진 date에 대한 S&P 500 지수의 값을 반환합니다.

4. 그래프의 시간 및 Y축 범위 설정

ax.set_xlim(["1/1/2007", "1/1/2011"])
ax.set_ylim([600, 1800])
  • set_xlimset_ylim: X축과 Y축의 범위를 각각 설정합니다. 이는 그래프에서 2007년부터 2011년까지의 데이터와 특정 수치 범위를 보여줍니다.

5. 그래프 타이틀 설정

ax.set_title("Important dates in the 2008–2009 financial crisis")
  • set_title: 그래프의 제목을 설정합니다.

이 코드는 금융 위기 기간 동안의 주요 이벤트를 시각적으로 강조하여 보여주는 효과적인 방법을 제공합니다. 주석과 시간 범위 지정을 통해 이벤트의 시간적 맥락을 강조하며, S&P 500 지수의 중요 변동 사항을 일목요연하게 파악할 수 있습니다.

Matplotlib의 Series.plot

Matplotlib의 Series.plot() 메서드는 pandas 시리즈의 데이터를 시각화하는 데 사용되며, 다양한 매개변수를 통해 그래프의 스타일, 색상, 범위 등을 세밀하게 조정할 수 있습니다. 이 메서드는 내부적으로 Matplotlib을 사용하기 때문에 Matplotlib의 스타일링 옵션을 대부분 지원합니다. 여기서는 pandas의 Series.plot() 메서드에 대해 자세히 살펴보겠습니다.

주요 인수들

  • label: 범례에 사용될 라벨을 지정합니다. 이 값은 plt.legend() 호출 시 범례에 표시됩니다.
  • ax: 그래프를 그릴 matplotlib의 축 객체를 지정합니다. 이를 통해 동일한 축에 여러 데이터를 표시할 수 있습니다.
  • style: 선의 스타일을 문자열로 지정합니다. 예를 들어, '-.'은 점선과 일반 선을 번갈아 표시합니다.
  • alpha: 그래프의 투명도를 설정합니다. 0.0에서 1.0 사이의 값이며, 0은 완전 투명, 1은 완전 불투명을 의미합니다.
  • kind: 그래프의 종류를 지정합니다. 예를 들어 'line', 'bar', 'barh', 'hist', 'box', 'kde', 'area', 'pie', 'scatter', 'hexbin' 등이 있습니다.
  • color: 그래프의 색상을 지정합니다. 색상 코드나 이름을 사용할 수 있습니다.
  • figsize: 그래프의 크기를 (너비, 높이) 형태의 튜플로 지정합니다.
  • title: 그래프의 제목을 문자열로 지정합니다.
  • grid: 그리드의 표시 여부를 불리언 값으로 지정합니다. True는 그리드를 표시하고, False는 숨깁니다.
  • xlim: X축의 범위를 지정합니다. (최소값, 최대값) 형태의 튜플로 설정할 수 있습니다.
  • ylim: Y축의 범위를 지정합니다. 이 역시 (최소값, 최대값) 형태의 튜플로 설정합니다.
  • logx: X축을 로그 스케일로 표시할지 여부를 지정합니다. True로 설정하면 로그 스케일이 적용됩니다.
  • logy: Y축을 로그 스케일로 표시할지의 여부를 지정합니다. 이것도 True로 설정하면 로그 스케일이 적용됩니다.
  • xticks: X축에 표시될 눈금의 위치를 배열로 지정합니다.
  • yticks: Y축에 표시될 눈금의 위치를 배열로 지정합니다.
  • rot: 눈금 라벨의 회전 각도를 지정합니다. 숫자로 각도를 지정하면, 해당 각도만큼 라벨이 회전됩니다.

예제 코드

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 데이터 생성
data = pd.Series(np.random.randn(50).cumsum())

# 그래프 그리기
data.plot(kind='line', style='--', color='green', alpha=0.7, grid=True,
          title='Random Walk', figsize=(10, 5), ylim=(-10, 10))
plt.show()

 

이 예제에서는 pandas 시리즈를 생성하고, 선 그래프(line)를 점선 스타일(--)과 녹색(green)으로, 그리고 약간 투명하게(alpha=0.7) 그렸습니다. 또한 그리드를 활성화하고, 그래프의 크기 및 Y축의 범위를 지정했습니다.

Series.plot() 메서드는 데이터의 시각화를 위한 간편하지만 강력한 방법을 제공하며, 이를 통해 데이터의 분포와 패턴을 쉽게 파악할 수 있습니다.

Matplotlib의 DataFrame.plot

데이터프레임의 각 컬럼을 다양한 방식으로 시각화할 수 있게 도와주는 유용한 함수입니다. 이 메서드는 Matplotlib를 기반으로 하여 다양한 그래프 유형을 지원하며, 여러 매개변수를 통해 그래프의 외관을 세밀하게 조절할 수 있습니다.

주요 인수

  • kind: 그래프의 종류를 지정합니다. 'line' (기본값), 'bar', 'barh', 'hist', 'box', 'kde', 'density', 'area', 'pie', 'scatter', 'hexbin' 등이 있습니다.
  • ax: 그래프를 그릴 matplotlib의 축 객체입니다. 이를 지정하면 여러 데이터프레임을 동일한 축에 표시할 수 있습니다.
  • figsize: 그래프의 크기를 (너비, 높이)로 지정합니다.
  • use_index: 인덱스를 x축 눈금으로 사용할지 여부를 결정합니다. 기본값은 True입니다.
  • title: 그래프의 제목을 설정합니다.
  • grid: 그리드 표시 여부를 결정합니다.
  • legend: 범례 표시 여부입니다. 기본값은 True입니다.
  • style: 각 컬럼에 적용할 스타일을 문자열이나 문자열의 리스트로 지정합니다.
  • color: 각 컬럼의 색상을 지정합니다. 색상 코드 또는 색상 이름을 리스트로 제공할 수 있습니다.
  • logx: X축을 로그 스케일로 표시할지 여부입니다.
  • logy: Y축을 로그 스케일로 표시할지 여부입니다.
  • xlabel: X축의 레이블을 설정합니다.
  • ylabel: Y축의 레이블을 설정합니다.
  • xlim: X축의 범위를 (최소, 최대)로 설정합니다.
  • ylim: Y축의 범위를 (최소, 최대)로 설정합니다.
  • xticks: X축에 표시할 눈금의 위치입니다.
  • yticks: Y축에 표시할 눈금의 위치입니다.
  • rot: 눈금 라벨의 회전 각도입니다.
  • secondary_y: 한 축에 두 개의 Y축을 사용할 경우, 두 번째 Y축에 해당 데이터를 표시할지 결정합니다.

예제 코드

import pandas as pd
import numpy as np

# 데이터 생성
df = pd.DataFrame({
    'A': np.random.randn(50).cumsum(),
    'B': np.random.randn(50).cumsum(),
    'C': np.random.randn(50).cumsum()
})

# 데이터프레임 그래프 그리기
plot = df.plot(kind='line', figsize=(10, 5), 
    title='Random Walk Example', 
    grid=True, style=['-', '--', '-.'], legend=True)
plot.set_xlabel('Time')
plot.set_ylabel('Value')
plot.figure.savefig("output.png")  # 그래프를 파일로 저장

 

이 예제에서는 세 개의 컬럼 'A', 'B', 'C'를 가진 데이터프레임을 생성하고, 선형 그래프로 각각 다른 스타일의 선 ('-', '--', '-.')을 사용하여 표시합니다. 그래프의 크기, 제목, 그리드를 설정하고, x축과 y축의 레이블을 명시적으로 지정했습니다. 마지막으로 plot.figure.savefig()를 사용하여 그래프를 이미지 파일로 저장합니다.

DataFrame.plot() 메서드는 데이터의 시각적 탐색을 간편하게 해주며, 복잡한 데이터셋을 이해하기 쉬운 형태로 표현할 수 있도록 도와줍니다. 이 메서드를 사용하면, 데이터 패턴 파악, 이상치 탐지, 추세 분석 등 다양한 분석 작업을 효과적으로 수행할 수 있습니다.

정규화된 그래프 그리기

행의 합이 1이 되도록 데이터를 정규화하는 과정은 데이터를 특정 범위 내에서 비교하기 위해 주로 사용됩니다. 이를 '행별로 정규화'라고 하며, 각 행의 합을 1로 만드는 것입니다. 여기서는 pandas와 Matplotlib를 사용하여 이러한 데이터 정규화를 수행하고 결과를 선 그래프로 시각화하는 예제를 제공하겠습니다.

데이터 정규화 및 그래프 그리기 예제 코드

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 임의의 데이터 생성
np.random.seed(0)
data = np.random.rand(10, 4)
df = pd.DataFrame(data, columns=['A', 'B', 'C', 'D'])

# 행별로 정규화: 각 행의 합을 1로 만듦
df_normalized = df.div(df.sum(axis=1), axis=0)

# 정규화된 데이터프레임 그래프 그리기
ax = df_normalized.plot(kind='line', figsize=(10, 5), style='-o')
ax.set_title('Normalized Data by Row')
ax.set_xlabel('Index')
ax.set_ylabel('Normalized Values')
ax.grid(True)
plt.show()

코드 설명

  1. 데이터 생성 및 데이터프레임 초기화
    • numpy.random.rand(10, 4)를 사용하여 10행 4열의 무작위 데이터를 생성합니다.
    • 이 데이터를 pandas.DataFrame에 할당하여 컬럼명을 'A', 'B', 'C', 'D'로 지정합니다.
  2. 데이터 정규화
    • df.sum(axis=1)은 데이터프레임의 각 행의 합을 계산합니다. axis=1은 행을 따라 연산을 수행하라는 의미입니다.
    • df.div(df.sum(axis=1), axis=0)은 각 행을 그 행의 합으로 나누어 정규화합니다. 이렇게 하면 각 행의 합이 1이 됩니다.
  3. 그래프 그리기
    • df_normalized.plot() 메서드를 사용하여 정규화된 데이터의 선 그래프를 생성합니다. kind='line'은 선 그래프를 그리겠다는 옵션이고, style='-o'는 선 스타일을 지정합니다.
    • set_title, set_xlabel, set_ylabel 메서드를 사용하여 그래프의 제목, x축 라벨, y축 라벨을 설정합니다.
    • ax.grid(True)는 그리드를 표시하여 그래프의 가독성을 높입니다.

이 예제를 통해 각 행의 데이터가 전체적으로 어떻게 분포하는지 비교할 수 있으며, 정규화를 통해 데이터의 상대적 크기를 보다 명확하게 비교할 수 있습니다.

시본(Seaborn) 모듈

Seaborn은 Matplotlib 기반으로 만들어진 데이터 시각화 라이브러리로, 통계적 그래프를 더 쉽고 아름답게 그릴 수 있도록 설계되었습니다. Seaborn의 주요 장점은 다음과 같습니다:

1. 아름다운 그래프 스타일

Seaborn은 Matplotlib의 기본 그래프 스타일을 개선하여 보다 현대적이고 시각적으로 매력적인 그래프를 기본 설정으로 제공합니다. 또한, set_style 함수를 통해 배경, 격자 등의 그래프 스타일을 쉽게 변경할 수 있어 전문적인 품질의 그래프를 생성할 수 있습니다.

2. 통계적 데이터 시각화에 최적화

Seaborn은 통계적 데이터 탐색에 유용한 그래프 유형들을 많이 제공합니다. 예를 들어, boxplot, violinplot, pairplot, jointplot 등 데이터의 분포와 관계를 분석하기 좋은 다양한 플롯을 쉽게 그릴 수 있습니다.

3. 데이터 집합 구조에 맞춘 API

Seaborn의 API는 pandas 데이터프레임과 완벽하게 통합되어 있어, 데이터프레임의 컬럼명을 직접 참조하여 강력하고 다양한 형태의 그래프를 간단하게 그릴 수 있습니다. 이는 데이터의 컬럼 구조를 이용해 다차원 데이터를 쉽게 시각화할 수 있게 해줍니다.

4. 다변량 데이터 시각화

Seaborn은 다변량 데이터를 시각화하기 위한 탁월한 기능을 제공합니다. 여러 변수 간의 관계를 한눈에 볼 수 있는 pairplot과 같은 함수는 데이터 간의 상호 작용을 탐색하는 데 매우 유용합니다.

5. 쉬운 통계적 추론 지원

Seaborn은 회귀선을 쉽게 추가할 수 있는 regplot, lmplot과 같은 함수를 포함하여, 데이터에 대한 통계적 추론을 시각적으로 보여줍니다. 이를 통해 데이터의 경향성과 패턴을 더 명확하게 이해할 수 있습니다.

6. 쉬운 테마 설정

Seaborn은 set() 함수를 통해 여러 가지 테마를 적용할 수 있으며, 이는 전체 그래프에 일관된 스타일을 적용하고자 할 때 유용합니다. 또한, context() 함수를 통해 그래프의 크기와 스케일을 조절할 수 있어 발표나 출판용 그래프를 만들기에 적합합니다.

7. 색상 팔레트 관리

Seaborn은 다양하고 아름다운 색상 팔레트를 제공하고, 이를 쉽게 적용할 수 있는 기능을 갖추고 있습니다. color_palette() 함수를 사용하여 데이터의 차원에 따라 색상을 조정하고, 데이터의 계층이나 그룹을 명확히 구분할 수 있습니다.

이러한 장점들 덕분에 Seaborn은 데이터 과학자들 사이에서 데이터를 시각화하고 통계적 인사이트를 추출하는 데 널리 사용되고 있습니다. 데이터의 시각화를 더 풍부하고 정보적으로 표현하고 싶을 때 Seaborn은 매우 좋은 선택이 될 수 있습니다.

 

Seaborn 라이브러리를 사용하여 다차원 데이터를 시각화하는 좀 더 고급적인 예제를 제공하겠습니다. 이 예제에서는 pairplot을 사용하여 데이터셋의 여러 변수 간의 상관 관계를 파악하고, FacetGrid를 사용하여 조건별로 데이터를 분할하여 시각화합니다. 또한 lmplot을 사용하여 데이터의 회귀선과 함께 분포를 나타내 보겠습니다.

데이터셋

이 예제에서는 Seaborn에 내장된 tips 데이터셋을 사용합니다. 이 데이터셋은 식당에서 팁을 받은 금액과 관련된 정보를 포함하고 있습니다.

예제 코드

import seaborn as sns
import matplotlib.pyplot as plt

# Seaborn 내장 데이터셋 로드
tips = sns.load_dataset('tips')

# Pairplot으로 다변량 분석
sns.pairplot(tips, hue='sex', palette='coolwarm', markers=["o", "s"], 
             plot_kws={'alpha': 0.5}, diag_kind='kde')
plt.suptitle('Pairplot of the Tips Dataset, Colored by Sex', y=1.02)

# FacetGrid를 사용하여 요일별로 데이터 분할 및 시각화
g = sns.FacetGrid(tips, col='day', hue='sex', palette='coolwarm', height=4, aspect=0.5)
g.map(sns.scatterplot, 'total_bill', 'tip')
g.add_legend()
g.fig.suptitle('Tips by Day and Sex', y=1.03)

# lmplot으로 회귀선과 함께 시각화
sns.lmplot(x='total_bill', y='tip', data=tips, hue='sex', palette='coolwarm', markers=["o", "s"], 
           scatter_kws={'alpha':0.5}, line_kws={'linewidth':2})
plt.title('Regression of Tips on Total Bill by Sex')

plt.show()

코드 설명

  1. Pairplot
    • sns.pairplot은 데이터셋의 각 변수에 대한 관계를 페어별로 그래프로 표현합니다.
    • hue='sex'는 성별에 따라 색상을 다르게 하여 시각화합니다.
    • markers는 각 그룹의 데이터 포인트 마커 스타일을 정의합니다.
    • diag_kind='kde'는 대각선(각 변수의 분포를 보여주는)에 커널 밀도 추정을 사용합니다.
  2. FacetGrid
    • sns.FacetGrid는 데이터를 day 컬럼에 따라 여러 서브플롯으로 나누고, 각 서브플롯에 산점도를 그립니다.
    • map 함수는 주어진 스타일에 따라 그래프를 그리는 데 사용됩니다.
  3. Lmplot
    • sns.lmplot은 회귀선을 포함한 산점도를 그립니다. 이는 total_billtip과의 관계를 성별에 따라 나타냅니다.
    • line_kwsscatter_kws는 회귀선과 산점도의 스타일을 각각 지정합니다.

이 예제는 Seaborn을 사용하여 다차원 데이터를 여러 방식으로 시각화하는 방법을 보여주며, 각 변수 간의 관계를 이해하고, 데이터의 구조와 패턴을 파악하는 데 도움을 줍니다.

728x90
Comments