주제
1. matplotlib
2. 그래프 종류
3. Seaborn
Matplotlib
- 데이터를 도식화할 수 있는 파이썬 라이브러리
- matplotlib의 pyplot을 이용
- plot() - 라인 그래프(default)
- marker : 마커 종류 지정
- linestyle : 라인 종류 설정
- color : 선의 색상 설정
# 마커(marker)
# '.': point marker
# 'o': circle marker
# 'v': triangle_down marker
# '+': plus marker
# '*': star marker
plt.plot(np.arange(10), np.arange(10)*2 + 10, marker='.', markersize=10)
# 라인(line)
# '-': solid line style
# '--': dashed line style
# '-.': dash-dot line style
# ':': dotted line style
plt.plot(np.arange(10), np.arange(10)*2, marker='o', linestyle='')
# 컬러(color)
# 'b': blue
# 'g': green
# 'r': red
# 'c': cyan
# 'm': magenta
# 'y': yellow
# 'k': black
# 'w': white
# alpha를 통해 투명도를 조절할 수 있습니다.
plt.plot(np.arange(10), np.arange(10)*2 - 30, marker='*', linestyle=':', color='r', alpha=1.)
| title() | xlabel() | ylabel() | xtick() | ytick() | legend() | xlim() | ylim() |
| 플롯의 제목 | x축의 레이블 | y축의 레이블 | x tick 설정 | y tick 설정 | 범례 설정 | x 제한 설정 | y 제한 설정 |
다양한 그래프 종류
산점도
- scatter(x, y, s='점의 넓이', c='점의 색')
# Scatterplot: plt.scatter()
# x, y 좌표로 이뤄진 데이터들을 점으로 표현하는 plot입니다.
# s는 점의 넓이를 나타냅니다. 값이 커지면 당연히 넓이도 커집니다.
x = np.random.rand(50)
y = np.random.rand(50)
# 각 데이터점마다 class를 가지고 있는 경우, class를 color로도 표현할 수 있습니다.
colors = [0]*25 + [1]*25
area = x * y * 250
plt.scatter(x, y, s=area, c=colors)
plt.show()

막대 그래프
- bar(x, y, align='정렬', color='색')
# Barplot: plt.bar()
x = ['Math', 'Programming', 'Data Science', 'Art', 'English', 'Physics']
y = [66, 80, 60, 50, 80, 10]
# plt.figure(figsize=(6, 3))
plt.bar(x, y, align='center', alpha=0.7, color='red')
plt.xticks(x)
plt.ylabel('Number of Students')
plt.title('Subjects')
plt.show()
- barh() - bar 플롯의 xtick을 ytick으로 바꾼다
# Barhplot (축 변환): plt.barh()
# barh 함수에서는 xticks로 설정했던 부분을 yticks로 변경합니다.
x = ['Math', 'Programming', 'Data Science', 'Art', 'English', 'Physics']
y = [66, 80, 60, 50, 80, 10]
plt.barh(x, y, align='center', alpha=0.7, color='green')
plt.yticks(x)
plt.xlabel('Number of Students')
plt.title('Subjects')
plt.show()
히스토그램
- hist() - 도수분포표를 그래프로 나타낸 것. 가로축은 변수값, 세로축은 빈도나 비율
- bins : 막대 개수 조절
- density=True : frequency 대신 density를 y축에 나타냄
N = 10000
bins = 30
x = np.random.randn(N)
plt.hist(x, bins=bins)
plt.show()

파이차트
- 각 클래스 간의 비율을 보여주는 데 효과적인 그래프
- pie()
- explode : 파이에서 튀어져나온 비율
- autopct : 퍼센트를 자동으로 표기
- shadow : 그림자 표시
- startangle : 파이를 그리기 시작할 각도
- texts : 레이블에 대한 텍스트 효과
- autotexts : 파이 위에 그려지는 텍스트 효과
labels = ['Samsung', 'Huawei', 'Apple', 'Xiaomi', 'Oppo', 'Etc']
sizes = [20.4, 13.0, 10.5, 9, 7.6, 37.6]
explode = (0.3, 0, 0, 0, 0, 0)
# texts, autotexts 인자를 활용하여 텍스트 스타일링을 적용
patches, texts, autotexts = plt.pie(sizes,
explodes=explods,
labels=labels,
autopct='%.1f%%',
shadow=True,
startangle=90)
plt.title('Smartphone pie', fontsize=15)

Heatmap
- 다양한 값을 갖는 숫자 데이터를 열분포 형태와 같이 색상을 이용해서 시각화한 것
- 데이터의 빈도 분포를 보여주기에 적합
- matshow() - 다양한 값을 갖는 숫자 데이터를 열분포 형태와 같이 색상을 이용해서 시각화한 것
- cmap : 히트맵의 색 지정
arr = np.random.standard_normal((30, 40))
# 컬러별 종류 지정
cmap = plt.get_cmap('PiYG')
# cmap = plt.get_cmap('Greys')
# cmap = plt.get_cmap('BuGn')
# cmap = plt.get_cmap('bwr')
plt.matshow(arr, cmap=cmap)
plt.colorbar(shrink=0.8, aspect=10)
plt.show()

Colormap
- colorbar() - 그래프 영역에 컬러바 포함
- 컬러맵을 간편하게 설정하기 위한 함수가 존재 : plasma(), jet(), autumn() 등
# 그래프 영역에 컬러바 포함
plt.colorbar()
plt.subplot(2, 2, 2)
plt.scatter(arr[2], arr[3], c=arr[3])
plt.plasma()
plt.title('plasma')
plt.colorbar()
그래프에 text 삽입하기
- text(x, y, text, fontdict) - 그래프의 적절한 위치에 텍스트를 삽입
font1 = {
'color': 'darkred',
'weight': 'normal',
'size': 16
}
plt.text(1.0, 0.35, 'np.random.randn()', fontdict=font1)
Subplot
- subplots(행 개수, 열 개수) - 하나의 화면 안에 여러 플롯을 넣는다ㅏ
- sharex, sharey=True : 축 공유
data = np.arange(1, 51)
# 밑 그림 : 2행 3열
fig, axes = plt.subplots(2,3)
axes[0, 0].plot(data)
axes[0, 1].plot(data * data)
axes[0, 2].plot(data ** 3)
axes[1, 0].plot(data % 10)
axes[1, 1].plot(-data)
axes[1, 2].plot(data // 20)
# axes
plt.tight_layout()
plt.show()
# sharex
plt.subplots(2, 2, sharex=True, sharey=True)
이중 y축 표시하기
- twinx() - ax1과 x축을 공유하는 새로운 Axes 객체인 ax2를 만든다
plt.style.use('default')
plt.rcParams['figure.figsize'] = (4, 3)
plt.rcParams['font.size'] = 12
x = np.arange(0, 3)
y1 = x + 1
y2 = -x - 1
fig, ax1 = plt.subplots()
ax1.plot(x, y1, color='green')
# ax2 객체 생성
ax2 = ax1.twinx()
ax2.plot(x, y2, color='deeppink')
plt.show()

박스 플롯
- boxplot() - 수치 데이터의 분포를 표현
- notch=True : 중앙값의 95% 신뢰 구간을 노치 형태로 표시
- subplots와 함께 사용하면 한 그림 안에 여러 박스플롯을 그릴 수 있다
# 샘플 데이터 생성
spread = np.random.rand(50) * 100
center = np.ones(25) * 50
filter_high = np.random.rand(10) * 100 + 100
filter_low = np.random.rand(10) * -100
data = np.concatenate((spread, center, filter_high, filter_low))
# 기본 박스플롯 생성
plt.boxplot(data, notch=True)
plt.tight_layout()
plt.show()

Violinplot
- 박스플롯에 kde 곡선을 같이 그린 형태, 조금 더 세밀한 분포 확인이 가능
- violinplot()
- quantiles 옵션을 이용하여 표시할 분위수를 조절할 수 있다
fig, ax = plt.subplots()
violin = ax.violinplot([data_a, data_b, data_c], showmeans=True, showextrema=True,
# shoemedian=True,
quantiles=[[0.25, 0.75], [0.1, 0.9], [0.3, 0.7]])
plt.show()

Seaborn
- 파이썬에서 통계 그래픽을 만들기 위한 라이브러리
- matplotlib을 기반으로, 판다스 데이터 구조와 밀접하게 통합
- 판다스 데이터 프레임과 직관적으로 연계되기 때문에 쉽고 빠르게 시각화가 가능
- 3가지의 플롯군 :
- Replot (relational) : 2개 이상의 변수 간의 관계를 효과적으로 나타냄
- Displot (distributions) : 1개 이상의 변수 값의 분포를 효과적으로 나타냄
- Catplot (categorical) : 범주형 데이터의 분포를 효과적으로 나타냄
1. Replot
- 데이터 세트의 변수가 서로 어떻게 연관되어 있는지, 이 관계가 다른 변수에 어떻게 의존하는지 이해하는 데 도움을 준다
- scatter plot
- line plot
- 색상, 크기 및 스타일을 사용하여 최대 3개의 추가 변수를 사용할 수 있다
- hue : 값들이 연속형이면 색이 palette 형태로 표현됨
- size : sizes=(a,b) 옵션을 통해 점들의 크기를 조정
1. scatterplot
import seaborn as sns
tips = sns.load_dataset('tips')
# 둘 다 같은 결과를 냄 (replot을 그냥 쓰면 기본적으로 scatter 플롯이 나온다)
sns.replot(data=tips, x='total_bills', y='tip')
sns.scatterplot(data=tips, x='total_bills', y='tip')
sns.replot(data=tips, x='total_bills', y='tip', hue='smoker', style='time', size='size')
2. lineplot
- 시간과 같이 지속성을 가진 변수와 다른 변수의 관계를 나타낼 때 효과적
- x축 값 하나에 따른 y값이 다양한 값을 가질 수 있다
- 이 때, 여러 값들을 모아서 평균선으로, 95% 신뢰구간을 색으로 표현한다
- errorbar=None : 신뢰구간을 표현하지 않는다
- errorbar='sd' : 표준편차의 범위로 표시
- 변수가 많아지면 가시성이 떨어지기 때문에 여러 플롯으로 나눠서 분석하는 것이 효과적
- col이나 row 인자를 사용하여 플롯들을 나누고, height를 통해서 플롯의 크기를 조절
dowjones = sns.load_dataset('dowjones')
sns.replot(data=dowjones, x='Date', y='Price', kind='line')
sns.lineplot(data=dowjones, x='Date', y='Price')
# col
sns.replot(x='total_bill', y='tip', hue='smoker', col='time', data=tips)
2. Displot
- 변수 하나 혹은 두 개의 분포를 나타낼 때 해당 변수 값이 가지는 분포 및 범위를 효과적으로 확인할 수 있다
1. histogram
- 기본적으로 displot을 사용하면 히스토그램을 그린다
- binwidth, bins : 막대 너비 조절
- discrete=True : 변수가 이산형일 경우, x축 값 중앙에 막대가 위치하도록 한다
- shrink : 막대 간 공간 조절이 가능
- hue : 추가 변수를 조건으로 한 분포를 시각화
- 막대가 겹치는 경우 :
- element=step
- multiple=stack
- multiple=dodge

- col과 row 사용 가능
sns.displot(penguins, x='flipper_length_mm', binwidth=3)
sns.displot(tips, x='size', discrete=True, shrink=.7)
2. kdeplot
- 부드러운 곡선으로 이어진 분포 시각화
- bw_adjust : 곡선을 세밀하게 혹은 더 부드럽게 표현
- hue : 변수 간 분포를 더 세밀하게 시각화
- fill=True : 곡선 아래 부분을 색칠
- heatmap / contour : hue 대신 y에 2번째 변수를 넣어 여러 변수의 분포를 표현
- y 변수를 추가해주면 contour plot을 그린다
- thresh, levels : 선의 간격을 조절
3. joint plot
- 2개의 변수 간 분포와 각 변수의 분포를 동시에 보여준다

4. pair plot
- 각 변수 간의 pairwise 관계를 시각화
- 고려해야할 변수는 많은데 변수 간 상관관계 파악이 필요할 경우 유용

3. Catplot
- replot에서 다루고자 하는 변수가 이산형 혹은 categorical인 경우 사용
- 범주형 산점도 : strip plot, swarm plot
- 범주형 분포도 : box plot, violin plot
- 범주형 추정도표 : bar plot, point plot
sns.catplot(data=tips, x='day', y='total_bill')
1. strip plot
- 한쪽 변수가 카테고리컬 데이터인 산점도
- 한 범주에 속하는 모든 점이 범주형 변수에 해당하는 축을 따라 동일한 위치에 있게 된다
- jitter : 좌우로 퍼진 정도를 조절하거나 비활성화
2. swarm plot
- 점들의 중첩을 방지하는 알고리즘을 사용하여 시각화
- 상대적으로 데이터 수가 적은 경우에만 잘 작동, 관측치 분포를 더 잘 표현
3. boxenplot
- 분위수를 더 자세하게 표시
4. point plot
- categorical 변수에 따라 다른 변수가 어떻게 변화하는지 효과적으로 나타냄
- 점 추정치 중심으로 95% 신뢰구간이 표현
'Data Science > TIL (Today I Learned)' 카테고리의 다른 글
| 프로그래머스 데이터분석 데브코스 1기 - 35일차 (0) | 2024.01.12 |
|---|---|
| 프로그래머스 데이터분석 데브코스 1기 - 34일차 (1) | 2024.01.11 |
| 프로그래머스 데이터분석 데브코스 1기 - 32일차 (1) | 2024.01.09 |
| 프로그래머스 데이터분석 데브코스 1기 - 31일차 (1) | 2024.01.08 |
| 프로그래머스 데이터분석 데브코스 1기 - 30일차 (1) | 2024.01.05 |