일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 고전역학
- 자바
- 소프트웨어공학
- 뉴턴역학
- 코틀린
- oracle
- 역학
- NIO
- Spring boot
- 시스템
- GPT-4's answer
- Java
- android
- 자바암호
- flet
- chatGPT's answer
- JVM
- 웹 크롤링
- GIT
- 유닉스
- kotlin
- 리눅스
- 인프라
- Database
- python
- write by GPT-4
- lombok
- 파이썬
- write by chatGPT
- 자바네트워크
- Today
- Total
Akashic Records
데이터 분석 후 그래프와 시각화 본문
Jupyter Notebook에서 대화형 Matplotlib 그래프를 사용하는 것은 데이터를 시각적으로 탐색할 때 매우 유용합니다. 이를 통해 사용자는 그래프를 동적으로 조작하고, 다양한 시각적 표현을 통해 데이터에 대한 통찰을 얻을 수 있습니다.
1. 필요한 라이브러리 설치
먼저 Matplotlib를 사용하려면, 이 라이브러리가 설치되어 있어야 합니다. 아직 설치하지 않았다면, 다음 명령어로 설치할 수 있습니다:
pip install matplotlib
2. Matplotlib 설정 변경
Matplotlib의 대화형 기능을 활성화하기 위해 Jupyter Notebook에서 몇 가지 설정을 변경해야 합니다. %matplotlib
매직 명령어를 사용하여 이를 설정할 수 있습니다. 대화형 모드를 위한 가장 일반적인 백엔드는 notebook
과 widget
입니다. 다음과 같이 설정할 수 있습니다:
%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 그리드의figure
와axes
를 생성합니다.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)
함수는figure
와axes
객체의 배열을 반환하여, 서브플롯을 더 쉽게 관리할 수 있게 해줍니다. 각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'
는 그래프 주변의 불필요한 여백을 제거합니다.
저장 옵션에 대한 추가 정보
- 색상 모드 설정:
color
와facecolor
,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
: 날짜와 시간을 처리하기 위한 표준 라이브러리입니다.pandas
와matplotlib.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_xlim
과set_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()
코드 설명
- 데이터 생성 및 데이터프레임 초기화
numpy.random.rand(10, 4)
를 사용하여 10행 4열의 무작위 데이터를 생성합니다.- 이 데이터를
pandas.DataFrame
에 할당하여 컬럼명을 'A', 'B', 'C', 'D'로 지정합니다.
- 데이터 정규화
df.sum(axis=1)
은 데이터프레임의 각 행의 합을 계산합니다.axis=1
은 행을 따라 연산을 수행하라는 의미입니다.df.div(df.sum(axis=1), axis=0)
은 각 행을 그 행의 합으로 나누어 정규화합니다. 이렇게 하면 각 행의 합이 1이 됩니다.
- 그래프 그리기
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()
코드 설명
- Pairplot
sns.pairplot
은 데이터셋의 각 변수에 대한 관계를 페어별로 그래프로 표현합니다.hue='sex'
는 성별에 따라 색상을 다르게 하여 시각화합니다.markers
는 각 그룹의 데이터 포인트 마커 스타일을 정의합니다.diag_kind='kde'
는 대각선(각 변수의 분포를 보여주는)에 커널 밀도 추정을 사용합니다.
- FacetGrid
sns.FacetGrid
는 데이터를day
컬럼에 따라 여러 서브플롯으로 나누고, 각 서브플롯에 산점도를 그립니다.map
함수는 주어진 스타일에 따라 그래프를 그리는 데 사용됩니다.
- Lmplot
sns.lmplot
은 회귀선을 포함한 산점도를 그립니다. 이는total_bill
대tip
과의 관계를 성별에 따라 나타냅니다.line_kws
와scatter_kws
는 회귀선과 산점도의 스타일을 각각 지정합니다.
이 예제는 Seaborn을 사용하여 다차원 데이터를 여러 방식으로 시각화하는 방법을 보여주며, 각 변수 간의 관계를 이해하고, 데이터의 구조와 패턴을 파악하는 데 도움을 줍니다.
'Python for Beginners' 카테고리의 다른 글
시계열 데이터 다루기-datetime (0) | 2024.08.19 |
---|---|
데이터 그룹 연산(groupby) (0) | 2024.08.02 |
Pandas의 DataFrame에서 Index 활용 및 데이터 관리 (0) | 2024.07.29 |
범주형 데이터 관리 Categorical (1) | 2024.07.23 |
Anaconda 설치 및 사용법 (0) | 2024.07.16 |