파이썬의 데이터 시각화 라이브러리
%matplotlib inline을 통해서 활성화
라이브러리 : Numpy, pandas, Matplotlib 등 개발자들이 만들었을 뿐 우리는 이 라이브러리의 코드들을 조합해야한다.
프레임워크 : 프레임워크는 구조가 정해져 있기 때문에 우리는 그내용물을 채워가는 식으로 사용한다.
images from https://laboputer.github.io/machine-learning/2020/05/04/matplitlib-tutorial/
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()
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()
리스트 뿐만 아니라 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()
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()
x = np.arange(20)
y = np.random.randint(0,20,20)
plt.scatter(x, y)
plt.show()
plot은 시계열 데이터(시간과 관계하는)에서 많이 사용하고 scatter 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()
범주형(남여, 점수) 데이터의 '값'과 그 값의 크기를 직사각형으로 나타낸 그림
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()
도수분포를 직사각형의 막대 형태로 나타냈다.
'계급'으로 나타낸 것이 특징, 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()
히스토그램은 서로 막대의 사이가 연속성을 가지기 때문에 막대그래프와 다르게 막대들이 이어져 있다.
데이터에서 전체에 대한 부분의 비율을 부채꼴로 나타낸 그래프이다.
다른 그래프에 비해서 비율 확인에 용이하다.
z = [100,300,200,400]
plt.pie(z, labels=['one','two','three','four'])
plt.show()
같은 차트에 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()
같은 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()을 이용합니다. 세 가지(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()
Seaborn : Matplotlib를 기반으로 더 다양한 시각화 방법을 제공하는 라이브러리
커널밀도그림, 카운트 그림, 캣그림, 스트립그림, 히트맵
히스토그램과 같은 연속적인 분포를 곡선화해서 그린 그림
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()
막대그래프와 관련이 있다.
범주형 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()
숫자형 변수와 하나 이상의 범주형 변수의 관계를 보여주는 함수, 복잡한 데이터를 다루는데 유리하다. 범주형 데이터와 수치형 데이터를 정리하는 데에 유리하다.
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()
산점도Scatter plot과 유사하게 데이터의 수치를 표현하는 그래프
sns.stripplot(x='WHO Region',y='Recovered',data=covid)
plt.show()
스트립그림과 유사하지만 동일한 값들이 뭉쳐져 있을때 그 값들을 분산해준다.
sns.swarmplot(x='WHO Region',y='Recovered',data=covid)
plt.show()
데이터의 행렬을 색상으로 표현해주는 그래프
상관계수correlation에서 가장 많이 사용한다. corr이 수치로 주어지면 한눈에 알아보기가 어렵다. 따라서 이 수치를 시각화 해주면 좋다.
covid.corr().head(5) ->
sns.heatmap(covid.corr())
plt.show()
행렬꼴의 데이터의 상관관계를 시작적으로 볼 수 있게 된다.