뮤트 개발일지

AIFFEL 아이펠 8일차 본문

AIFFEL

AIFFEL 아이펠 8일차

박뮤트 2022. 1. 5. 16:31

막대그래프 그리기

데이터 정의

%matplotlib inline: IPython에서 사용하는 매직 메서드로 이 명령어를 입력하면 그래프가 출력된다.

IPython 매직 메서드 정리

https://studymake.tistory.com/601

 

ipython 의 매직명령어들

2. 매직 명령어들  c{ipy02}  IPython에는 매직명령어라는 것들이 있는데 %로 시작하는 명령어들이다. 보통 %문자로 시작하지만 만약 사용자 변수가 선언되지 않았다면 %문자 없이도 기능을 수행한

studymake.tistory.com

 

축 그리기

fig = plt.figure(figsize=(5,2)) #도화지(그래프) 객체 생성
ax1 = fig.add_subplot(1,1,1) #figure()객체에 add_subplot 메서드를 이용해 축을 그려준다.

figsize 인자 값을 주어 그래프의 크기를 정할 수 있다.

https://matplotlib.org/stable/api/index.html

 

API Reference — Matplotlib 3.5.1 documentation

Warning Since heavily importing into the global namespace may result in unexpected behavior, the use of pylab is strongly discouraged. Use matplotlib.pyplot instead. pylab is a module that includes matplotlib.pyplot, numpy, numpy.fft, numpy.linalg, numpy.r

matplotlib.org

도화지 안에 여러 개의 축을 그릴 수 있다.(그래프 여러개 가능)

add_subplot의 인자로 조정한다. 위의 예시에서 (1, 1, 1)은 각각 nrows, ncols, index에 해당한다.

fig = plt.figure()
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,4)

그래프 그리기

bar(): 그래프를 그리는 메서드로, 인자 x, y값이 들어간다.

# 그래프 데이터 
subject = ['English', 'Math', 'Korean', 'Science', 'Computer']
points = [40, 90, 50, 60, 100]

# 축 그리기
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)

# 그래프 그리기
ax1.bar(subject,points)

그래프 요소 추가

xlabel(): x라벨 추가

ylabel(): y라벨 추가

title(): 제목 추가


선 그래프 그리기

from datetime import datetime
import pandas as pd
import os

# 그래프 데이터 
csv_path = os.getenv("HOME") + "/aiffel/data_visualization/data/AMZN.csv"
data = pd.read_csv(csv_path ,index_col=0, parse_dates=True)
price = data['Close']

# 축 그리기 및 좌표축 설정
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
price.plot(ax=ax, style='black')
plt.ylim([1600,2200])
plt.xlim(['2019-05-01','2020-03-01'])

# 주석달기
important_data = [(datetime(2019, 6, 3), "Low Price"),(datetime(2020, 2, 19), "Peak Price")]
for d, label in important_data:
    ax.annotate(label, xy=(d, price.asof(d)+10), # 주석을 달 좌표(x,y)
                xytext=(d,price.asof(d)+100), # 주석 텍스트가 위차할 좌표(x,y)
                arrowprops=dict(facecolor='red')) # 화살표 추가 및 색 설정

# 그리드, 타이틀 달기
plt.grid()
ax.set_title('StockPrice')

# 보여주기
plt.show()

pandas의 Series: price = date['Close']

price.plot(ax=ax, style='black'): 판다스의 선 그래프 그리기 기능. matplotlib에서 정의한 subplot 공간 ax를 사용함

 

좌표축 설정

plt.xlim(), plt.ylim(): x, y 좌표축의 범위 설정

주석

annotate(): 글자나 화살표 등 주석을 그림

그리드

grid(): 그리드(격자눈금) 추가


plot

plt.plot(): 인자로 x 데이터, y 데이터, 마커 옵션, 색상 등의 인자를 이용할 수 있고 서브플롯도 plt.subplot을 이용해 추가할 수 있다.

linestyle: plot()의 인자로 들어가며 다양하다.

x = np.linspace(0, 10, 100) #0에서 10까지 균등한 간격으로  100개의 숫자를 만들라는 뜻

plt.plot(x, x + 0, linestyle='solid') 
plt.plot(x, x + 1, linestyle='dashed') 
plt.plot(x, x + 2, linestyle='dashdot') 
plt.plot(x, x + 3, linestyle='dotted')
plt.plot(x, x + 0, '-g') # solid green 
plt.plot(x, x + 1, '--c') # dashed cyan 
plt.plot(x, x + 2, '-.k') # dashdot black 
plt.plot(x, x + 3, ':r'); # dotted red
plt.plot(x, x + 4, linestyle='-') # solid 
plt.plot(x, x + 5, linestyle='--') # dashed 
plt.plot(x, x + 6, linestyle='-.') # dashdot 
plt.plot(x, x + 7, linestyle=':'); # dotted

pandas.plot 인자

- label: 그래프의 범례 이름

- ax: 그래프를 그릴 matplotlib의 서브플롯 객체

- style: matplotlib에 전달할 'ko--'같은 스타일의 문자열

- alpha: 투명도(0~1)

- kind: 그래프의 종류 = line, bar, barh, kde

- logy: Y축에 대한 로그 스케일

- use_index: 객체의 색인을 눈금 이름으로 사용할지의 여부

- rot: 눈금 이름을 로테이션(0~360)

- xticks, yticks: x축, y축으로 사용할 값

- xlime, ylim: x축, y축 한계

- grid: 축의 그리드 표시할지 여부

 

pandas의 data가 DataFrame일 때 plot 메서드 인자

- subplots: 각 DataFrame의 칼럼을 독립된 서브플롯에 그린다.

- sharex: subplots=True면 같은 X축을 공유하고 눈금과 한계를 연결한다.

- sharey: subplots=True면 같은 Y축을 공유한다.

- figsize: 그래프의 크기, 튜플로 지정

- title: 그래프의 제목을 문자열로 지정

- sort_columns: 칼럼을 알파벳 순서로 그린다.


범주형 데이터 그래프로 나타내기 - 막대 그래프

pandas와 matplotlib 사용하기

1. matplotlib에 데이터를 인자로 넣기 위해서는 pandas 데이터를 바로 이용할 수 없다. 데이터를 x에 series 또는 list, y에 list 형태로 각각 나눠주어야 한다.

2. df['tip']컬럼을 groupby() 한다. groupby()인자로 sex를 넣어주면 각 성별 그룹에 대한 정보(총합, 평균, 데이터량 등)가 grouped에 저장된다.

grouped = df['tip'].groupby(df['sex'])

3. 성별에 따른 팁 액수 평균을 막대그래프로 나타내기

import numpy as np
sex = dict(grouped.mean()) #평균 데이터를 딕셔너리 형태로 바꿔줍니다.

x = list(sex.keys())  
y = list(sex.values())

import matplotlib.pyplot as plt

plt.bar(x = x, height = y)
plt.ylabel('tip[$]')
plt.title('Tip by Sex')

Seaborn과 matplotlib 사용하기

sns.barplot(data=df, x='sex', y='tip')

sns.barplot의 인자로 df를 넣고 원하는 컬럼을 지정해주면 성별에 대한 팁 평균이 나온다.

plt.figure(figsize=(10,6)) # 도화지 사이즈를 정합니다.
sns.barplot(data=df, x='sex', y='tip')
plt.ylim(0, 4) # y값의 범위를 정합니다.
plt.title('Tip by sex') # 그래프 제목을 정합니다.

matplot과 함께 사용하면 다양한 옵션을 추가할 수 있다.


수치형 데이터 - 산점도 or 선 그래프

산점도scatter plot

sns.scatterplot(data=df , x='total_bill', y='tip', hue='day')

선 그래프 line graph

sns.lineplot(x=x, y=np.sin(x))
sns.lineplot(x=x, y=np.cos(x))

히스토그램

도수분포표를 그래프로 나타낸 것

 

용어

- 가로축: 계급 = 변수의 구간, bin(or bucket)

- 세로축: 도수 = 빈도수, frequency

- 전체 총량: n

 

그래프 만들기

1. x1: 평균은 100이고 표준편차는 15인 정규분포를 따른다.

2. x2: 평균은 130이고 표준편차는 15인 정규분포를 따른다.

3. 도수를 50개 구간으로 표시하며, 확률 밀도가 아닌 빈도로 표기한다.

#그래프 데이터 
mu1, mu2, sigma = 100, 130, 15
x1 = mu1 + sigma*np.random.randn(10000)
x2 = mu2 + sigma*np.random.randn(10000)

# 축 그리기
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)

# 그래프 그리기
patches = ax1.hist(x1, bins=50, density=False) #bins는 x값을 총 50개 구간으로 나눈다는 뜻입니다.
patches = ax1.hist(x2, bins=50, density=False, alpha=0.5)
ax1.xaxis.set_ticks_position('bottom') # x축의 눈금을 아래 표시 
ax1.yaxis.set_ticks_position('left') #y축의 눈금을 왼쪽에 표시

# 라벨, 타이틀 달기
plt.xlabel('Bins')
plt.ylabel('Number of Values in Bin')
ax1.set_title('Two Frequency Distributions')

# 보여주기
plt.show()

*hist() 인자로 x변수의 데이터와 bin의 개수를 입력한다.

 

---

df['tip_pct'].plot(kind='kde')

kind='kde'로 확률 밀도 그래프를 나타낼 수 있다.

 

밀도 그래프: 연속된 확률분포를 나타낸다.

- 일반적으로 kernels 메서드를 섞어 이 분포를 근사하는 식으로 그린다.

- 좀 더 단순하고 친숙한 정규분포(가우시안)로 나타낼 수 있다.

- 위 밀도 그래프는 KDE(Kermel Density Estimate) 커널 밀도 추정 그래프이다.

https://darkpgmr.tistory.com/147

 

Kernel Density Estimation(커널밀도추정)에 대한 이해

얼마전 한 친구가 KDE라는 용어를 사용하기에 KDE가 뭐냐고 물어보니 Kernel Density Estimation이라 한다. 순간, Kernel Density Estimation이 뭐지? 하는 의구심이 생겨서 그 친구에게 물어보니 자기도 잘 모른.

darkpgmr.tistory.com

(정신날 때 위 페이지 읽고 정리하기)


시계열 데이터 시각화하기

데이터로 연습해보기


Heatmap

방대한 양의 데이터와 현상을 수치에 따른 색상으로 나타내는 것

데이터 차원에 대한 제한은 없으나 2차원으로 시각화하여 표현한다.

예제) 데이터의 연도와 달에 대한 탑승객 수를 heatmap으로 표현하기
* pivot: 어떤 축, 점을 기준으로 바꾸다. 데이터 표를 재배치 할 때도 pivot이라는 단어를 사용한다.

pivot = flights.pivot(index='year', columns='month', values='passengers')
sns.heatmap(pivot)

옵션주기

sns.heatmap(pivot, linewidths=.2, annot=True, fmt="d")