프로그래머스 인공지능 데브코스 3기 수업내용 정리 #13(Matplotlib)

Clay Ryu's sound lab·2021년 12월 23일
0

Note for 2021

목록 보기
13/33
post-custom-banner

I. Matplotlib 시작하기

파이썬의 데이터 시각화 라이브러리
%matplotlib inline을 통해서 활성화

라이브러리와 프레임워크

라이브러리 : Numpy, pandas, Matplotlib 등 개발자들이 만들었을 뿐 우리는 이 라이브러리의 코드들을 조합해야한다.
프레임워크 : 프레임워크는 구조가 정해져 있기 때문에 우리는 그내용물을 채워가는 식으로 사용한다.


images from https://laboputer.github.io/machine-learning/2020/05/04/matplitlib-tutorial/

II. Matplotlib Case Study

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
#y = x + 1의 그래프
#y는 리스트 x는 인덱스값이다.
#plot은 꺾은선 그래프이다.
plt.plot([1,2,3,4,5])
plt.show() ->

하나의 팁이 있다면 plot을 이용해서 그래프를 그리는 것은 x값과 y값의 데이터만 잘 만들어준다면 내가 원하는 형태의 그래프를 손쉽게 구현하여 두 변수 x,y 사이의 상관관계를 쉽게 알 수 있다는 것이다. 아래의 코드를 참고하자.

#Titanic 데이터에서 나이에 따른 생존률을 계산하였다.
cummulate_survival_ratio = []
for i in range(1,80):
    cummulate_survival_ratio.append(df_train[df_train['Age'] < i]['Survived'].sum() / len(df_train[df_train['Age'] < i]['Survived']))
plt.plot(cummulate_survival_ratio)
plt.title('Survival rate change depending on range of Age')
plt.show()

Figsize : Figure도면의 크기를 조절

plt.figure(figsize=(6,6)) : plotting을 할 도면을 선언, 1 pixel이 72이기 때문에 6,6은 72x6, 72x6 사이즈를 만드는 것이다.

plt.figure(figsize=(6,6))
plt.plot([1,2,3,4,5])
plt.show()

2차함수 그래프

리스트 뿐만 아니라 numpy에서의 ndarray, pandas에서의 series와 dataframe 등을 사용해서 그래프를 그려줄 수 있다.

#numpy.array를 이용해서 함수 그리기
#y=x^2
x = np.array([1,2,3,4,5])
y = np.array([1,4,9,16,25])
plt.plot(x, y)

#그래프를 좀더 부드럽게하기 위해 #np.arange(a, b, c), c : 0.01
x = np.arange(-10,10,0.01)
plt.plot(x, x**2)
plt.show()

#x, y축에 설명을 추가하기
x = np.arange(-10,10,0.01)
plt.xlabel('x value')
plt.ylabel('f(x) value')
plt.plot(x, x**2)
plt.show()

#x, y축의 범위를 설정하기
x = np.arange(-10,10,0.01)
plt.xlabel('x value')
plt.ylabel('f(x) value')

plt.axis([-5,5,0,25]) #[xmin,xmax,ymin,ymax]

plt.plot(x, x**2)
plt.show()

#x, y축에 눈금 설정하기
x = np.arange(-10,10,0.01)
plt.xlabel('x value')
plt.ylabel('f(x) value')
plt.axis([-5,5,0,25]) #[xmin,xmax,ymin,ymax]

plt.xticks([i for i in range(-5,5,1)])
plt.yticks([i for i in range(0,24,3)])

plt.plot(x, x**2)
plt.show()

#그래프에 title달기
x = np.arange(-10,10,0.01)
plt.xlabel('x value')
plt.ylabel('f(x) value')
plt.axis([-5,5,0,25]) #[xmin,xmax,ymin,ymax]
plt.xticks([i for i in range(-5,5,1)])
plt.yticks([i for i in range(0,24,3)])

plt.title('y=x^2 graph') 

plt.plot(x, x**2)
plt.show()

#그래프에 title달기2
x = np.arange(-10,10,0.01)
plt.xlabel('x value')
plt.ylabel('f(x) value')
plt.axis([-5,5,0,25]) #[xmin,xmax,ymin,ymax]
plt.xticks([i for i in range(-5,5,1)])
plt.yticks([i for i in range(0,24,3)])
plt.title('y=x^2 graph') 

plt.plot(x, x**2, label ='trend')
plt.legend()

plt.show()

III. Matplotlib Case Study

꺾은선 그래프(Plot)

x = np.arange(20)
y = np.random.randint(0,20,20)
plt.plot(x, y)
plt.show()

x = np.arange(20)
y = np.random.randint(0,20,20)
#축의 최소 최대 크기를 조정
plt.axis([0,20,0,20])
#y축의 단위를 조정
plt.yticks([i for i in range(0,20,5)])
plt.plot(x, y)
plt.show()

산점도(Scatter Plot)

x = np.arange(20)
y = np.random.randint(0,20,20)
plt.scatter(x, y)
plt.show()

plot은 시계열 데이터(시간과 관계하는)에서 많이 사용하고 scatter plot은 두 변수가 완전히 별개일 때 두 변수 사이의 상관관계를 알기 위해 사용한다.

박스 그림(Box Plot)

수치형 데이터에 대한 정보(Q1, Q2, Q2, min, max)

x = np.arange(20)
y = np.random.randint(0,20,20)
#plt.title('Box plot of y') 
plt.boxplot(y)
plt.show()

T의 아래값이 최소값 윗값이 최대값이다. 박스의 3가지 선 중에서 가장 밑에 있는 박스 선이 Q1 주황선이 Q2 박스 가장 윗선이 Q3이다.

x = np.arange(20)
y = np.random.randint(0,20,20)
plt.title('Box plot of x, y') 
plt.boxplot(x, y)
plt.show()

막대 그래프(Bar Plot)

범주형(남여, 점수) 데이터의 '값'과 그 값의 크기를 직사각형으로 나타낸 그림

x = np.arange(20)
y = np.random.randint(0,20,20)
plt.xticks([i for i in range(0,20,1)])
plt.bar(x,y)
plt.show()

히스토그램(Histogram)

도수분포를 직사각형의 막대 형태로 나타냈다.
'계급'으로 나타낸 것이 특징, 0,1,2가 아니라 0~2까지의 범주형 데이터로 구성후 그림을 그린다.

plt.hist(y, bins=np.arange(0,22,2))
plt.xticks([i for i in range(0,20,2)])
plt.show()

히스토그램은 서로 막대의 사이가 연속성을 가지기 때문에 막대그래프와 다르게 막대들이 이어져 있다.

원형 그래프(Pie Chart)

데이터에서 전체에 대한 부분의 비율을 부채꼴로 나타낸 그래프이다.
다른 그래프에 비해서 비율 확인에 용이하다.

z = [100,300,200,400]
plt.pie(z, labels=['one','two','three','four'])
plt.show()

중복데이터 그리기

plot()으로 해결하기

같은 차트에 2개 이상의 그래프를 동시에 그리고 싶을 때는 plot()에 데이터를 추가로 넣으면 하나의 차트에 여러개의 데이터를 보여줄 수 있다.
여러번의 plot()을 입력해도 동일한 결과가 나타난다.

x = np.linspace(0, 2*np.pi, 50)
plt.plot(x, np.sin(x), x, np.cos(x))

plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x))

plt.show()

twinx()를 사용하기

같은 plot()으로 x축은 공유하되, y축의 스케일을 다르게 하고 싶을 때는 twinx() 를 이용한다. 첫번째 plot()은 차트 왼쪽에 y축 스케일이, 두번째 plot()은 우측에 y축 스케일이 보이는 것을 확인할 수 있다.

x = np.linspace(0, 2*np.pi, 50)

ax1 = plt.gca()
ax2 = plt.gca().twinx()

ax1.plot(x, np.sin(x))
ax2.plot(x, np.cos(x), color='y')

plt.show()

subplot()로 차트 나누기

하나의 이미지에서 여러 부분으로 나누어 각각의 차트를 만들 수도 있다. 이것은 subplot()을 이용합니다. 세 가지(nrows, ncols, index)를 입력을 받으면 nrows는 행의 개수, ncols는 열의 개수, index는 보여줄 위치로 1부터 지정하고 왼쪽 위부터 오른쪽 아래로 하나씩 지정된다. 세 개의 인수 (2,2,3)을 넣고 싶다면 숫자 223을 넣어도 동작합니다.

x1 = np.linspace(0, 2*np.pi, 50)
y1 = np.sin(x1)

x2 = np.linspace(0.0, 2*np.pi, 50)
y2 = np.tan(x2)

# 1x2구간으로 나누고 1번째에 그리기
plt.subplot(1, 2, 1)
plt.plot(x1, y1)

# 1x2구간으로 나누고 2번째에 그리기
plt.subplot(1, 2, 2)
plt.plot(x2, y2)

plt.show()

IV. The 멋진 그래프, Seaborn Case Study

Seaborn : Matplotlib를 기반으로 더 다양한 시각화 방법을 제공하는 라이브러리
커널밀도그림, 카운트 그림, 캣그림, 스트립그림, 히트맵

커널밀도그림 Kernal Density Plot

히스토그램과 같은 연속적인 분포를 곡선화해서 그린 그림

x = np.arange(0, 22, 2)
y = np.random.randint(0, 20, 20)
plt.hist(y, bins= x)
plt.show()

#kdeplot
x = np.arange(0, 22, 2)
y = np.random.randint(0, 20, 20)
sns.keplot(y)
plt.show()


전체를 1로 보았을 때 각 부분이 얼마만큼의 density를 가지는 지를 보여준다.

#kdeplot
x = np.arange(0, 22, 2)
y = np.random.randint(0, 20, 20)
sns.keplot(y, shade=True)
plt.show()

카운트그림(Count Plot)

막대그래프와 관련이 있다.
범주형 column의 빈도수를 시각화 -> Groupby 후의 도수를 하는 것과 동일한 효과

#Dataframe을 만들어준다.
vote_df = pd.DataFrame({'name':['Andy','Bob','Cat'], 'vote':[True, True, False]})
vote_count = vote_df.groupby('vote').count()
vote_count ->
	name
vote	
False	1
True	2
plt.bar(x=[False, True],height=vote_count['name'])
plt.show()

groupby로 한번 요약 해준후 bar로 그려주었다. 이를 countplot을 이용하면 바로 그려줄 수 있다. countplot은 좀더 편리하게 좋은 그래프를 얻을 수 있다.

sns.countplot(x=vote_df['vote'])
plt.show()

캣그림(Cat Plot)

숫자형 변수와 하나 이상의 범주형 변수의 관계를 보여주는 함수, 복잡한 데이터를 다루는데 유리하다. 범주형 데이터와 수치형 데이터를 정리하는 데에 유리하다.

covid = pd.read_csv("./country_wise_latest.csv")
sns.catplot(x='WHO Region',y='Confirmed',data=covid)
plt.show()

s=sns.catplot(x='WHO Region',y='Confirmed',data=covid, kind='strip')
s.fig.set_size_inches(10,6)
plt.show()

s=sns.catplot(x='WHO Region',y='Confirmed',data=covid, kind='violin')
s.fig.set_size_inches(10,6)
plt.show()

스트립그림(Strip Plot)

산점도Scatter plot과 유사하게 데이터의 수치를 표현하는 그래프

sns.stripplot(x='WHO Region',y='Recovered',data=covid)
plt.show()

swarmplot

스트립그림과 유사하지만 동일한 값들이 뭉쳐져 있을때 그 값들을 분산해준다.

sns.swarmplot(x='WHO Region',y='Recovered',data=covid)
plt.show()

히트맵(Heatmap)

데이터의 행렬을 색상으로 표현해주는 그래프
상관계수correlation에서 가장 많이 사용한다. corr이 수치로 주어지면 한눈에 알아보기가 어렵다. 따라서 이 수치를 시각화 해주면 좋다.

covid.corr().head(5) ->

sns.heatmap(covid.corr())
plt.show()

행렬꼴의 데이터의 상관관계를 시작적으로 볼 수 있게 된다.

profile
chords & code // harmony with structure
post-custom-banner

0개의 댓글