[프로그래머스 인공지능 미니 데브코스] 수업 정리 -1- [Python으로 시각화하기 - Matplotlib]

3yeong·2022년 7월 7일
0

matplotlib

파이썬의 데이터 시각화 library

라이브러리 와 프레임워크의 차이

라이브러리 : 라이브러리 내부의 코드를 조합해서 원하는 결과를 내야한다.
프레임워크 : 이미 틀이 짜여있음, 틀에 내용물을 채워가며 결과를 내야한다.

1.matplotlib 설치 및 시작 준비

pip install matplotlib

위 코드를 통해 설치하게 된다.

%matplotlib inline 을 통해 활성화 한다. (선언함으로써 시각화 할 것임을 나타낸다.)

import matplotlib.pyplot as plt

%matplotlib inline

2.Arguments

 plt.show() #plt를 확인하는 명령어
Figsize : Figure(도면)의 크기 조절
plt.figure(figsize =(,)) #plotting을 할 도면을 선언

이 때 figsize는 튜플 형태로 선언하며 1픽셀 = 72이므로 정수일 때 정수 x 72 크기가 된다.

2차 함수 그래프

plot에는 한가지 값 뿐만 아니라 두가지도 넣고 출력이 가능하다.

y = x^2의 그래프를 작성해본다면

x = np.array([1,2,3,4,5]) #정의역
y = np.array([1,4,9,16,25]) #f(x)

plt.plot(x, y)
plt.show()


이미지와 같은 그래프가 그려지며 너무 매끄럽지 못한 모습을 볼 수 있다.

그래서 두 점 사이에 많은 점을 찍기 위해 np.arange(a,b,c)를 사용하려 한다.
여기서 c는 입력하지 않으면 int로 고정되어있어 위의 이미지와 같은 결과가 나오므로 작은 수로 입력해서 작성해야 매끄러운 결과가 나올 수 있다.

x = np.arange(-20, 20,0.01)
plt.plot(x, x**2)
plt.show()

이로써 numpy로 이루어진 것도 plot를 이용하여 나타낼 수 있음을 알 수 있다.

위 이미지를 보면 x는 무엇이고 y는 무엇인지 설명이 부족함을 볼 수 있다.
이를 해결하기 위해 plt.xlabel, plt.ylabel을 사용하여 이름을 붙여준다.

x = np.arange(-20,20,0.01)

plt.xlabel("x vlaue")
plt.ylabel("y value")

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

그리고 원하는 범위 만큼 그래프를 자를 수 있다.
이는 .axis()를 이용하여 원하는 축에서 그래프를 자르게 된다.
이때 axis([x_min, x_max, y_min, y_max])의 범위가 정해지게 된다.

plt axis([-5,5,0,25])

그래프에서 x축과 y축에 원하는 크기만큼 눈금을 정하기 위해 .xticks.yticks를 사용한다.

	plt.xticks([i for i in range(-5,6,1)]) #눈금을 어디에 설정할지
	plt.yticks([i for i in range(0,27,3)])

그래프에 이름을 넣어 줄 수 있다. 이는 .title()을 이용하여 넣는다.

np.title("y = x^2 grape")

그래프 그리기의 마지막으로 범례를 쓸 수 있다. 이때 코드는 선(그래프)를 그린 후 해야하므로 거의 마지막 쯤에 작성하게 된다. .legend()를 이용하여 나타낸다.

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

위 코드와 같이 plot에 label을 작성하고 legend를 넣게 되면 아래 이미지와 같이 나타나게 된다.

3. Matplotlib Case

꺽은 선 그래프(Plot)

  • .plot()
  • 난수를 생성하고 그래프를 그려보기
x = np.arange(20)
y = np.random.randint(0,21,20)
x,y
plt.plot(x,y) #plot을 이용하여 꺽은 선 그래프를 그릴 수 있다.

plt.axis([0,20,0,20])

plt.yticks([0,5,10,15,20])


plt.show()

#Extra: y축을 20까지 보이게 하고 싶다면?, y축을 "5"단위로 보이게 하고 싶다면?
#.axis(), yticks()

코드를 통해 난수를 생성하고 plot를 그리게 되면 꺽은 선 그래프가 그려지게 된다.

산점도(Scatter Plot)

  • .scatter
  • x와 y가 별개인 변수일 때 사용함으로써 관계가 있는지 찾아보는 그래프이다.
  • 선 그래프는 시계열 데이터(x의 시간동안 y의 값)이 얼마나 변했는지 확인할 때 많이 사용한다.
plt.scatter(x,y) ## 점으로 나타냄
plt.show()

박스 그림(Box Plot)

  • 수치형 데이터에 대한 정보 (Q1(25%), Q2(50%,median), Q3(75%), min, max)
  • .boxplot()
  • 단일 변수가 있을 때 변수의 전반적인 분포가 어떠한지 보기 위해 사용한다.
plt.boxplot(y)

plt.title("Box plot of y")

plt.show()

  • 두개 이상의 변수로 비교하는 경우도 많다.
plt.boxplot((x,y))

plt.title("Box plot of x, y")

plt.show()

막대 그래프(Bar Plot)

  • 범주형 데이터의 "값"과 그 값의 크기를 직사각형으로 나타낸 그림이다.
plt.bar(x, y)

plt.xticks([i for i in range(0,20,1)])
plt.show()

히스토그램(histogram)

  • 도수분포를 직사각형의 막대 형태로 나타낸다.
  • "계급(별량들을 그룹하여 나타냄)" : : 0,1,2가 아니라 0~2까지의 "범주형" 데이터로 구성 후 그림을 그림
  • 막대그래프와 다른 점 : 직사각형이 이어져 있음 서로의 범주가 연속성을 가진 경우가 많기 때문에 간격이 없다.
plt.hist(y, bins=np.arange(0,22,2))

plt.xticks(np.arange(0,22,2))

plt.show()

원형 그래프(Pie Chart)

  • 데이터에서 전체에 대한 부분의 비율을 부채꼴로 나타낸 그래프이다
  • 다른 그래프에 비해서 비율 확인에 용이하다.
  • .pie()
z = [100, 300, 200, 400]

plt.pie(z, label = ['one', 'two', 'three', 'four'])
plt.show()

4. Seaborn

Matplotlib를 기반으로 더 다양한 시각화 방법을 제공하는 라이브러리

  • 커널밀도그림
  • 카운트그림
  • 캣그림
  • 스트립그림
  • 히트맵

Seaborn Import

import seaborn as sns

커널밀도 그림(Kernel Density Plot)

  • 히스토그램과 같은 연속적인 분포를 곡선화해서 그린 그림이다.
  • sns.kdeplot()
sns.kdeplot(y, shade = True)

plt.show() 

#보이게 할 때 공유하므로 써줘야한다.
#전체를 1로 봤을 때 각부분이 어느정도의 density를 가지는 지 표현

카운트그림(Count Plot)

  • 범주형 column의 빈도수를 시각화 -> Groupby 후의 도수를 하는 것과 동일한 효과이다.
  • sns.countplot()
#data frame를 만든다
vote_df = pd.DataFrame({"name" : ['Andy', "Bob", "Cat"], "vote":[True, True, False]})

vote_df

	name	vote
0	Andy	True
1	Bob		True
2	Cat		False

vote_count = vote_df.groupby("vote").count()

vote_count

	name
vote	
False	1
True	2
#in matplotlib barplot
plt.bar(x = [False,True], height = vote_count['name'])

plt.show()

groupby로 요약 한 후 bar로 그려주었다. countplot은 좀더 편리하게 그래프를 그릴 수 있게 해준다.

#sns의 countplot

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

plt.show() #label도 있고 구분도 하기 쉽게 되어있음

캣그림(Cat Plot)

  • 숫자형 변수와 하나 이상의 범주형 변수의 관계를 보여주는 함수
  • 복잡한 데이터를 구하는데 유리하다
  • sns.catplot()
covid = pd.read_csv("./country_wise_latest.csv")

s = sns.catplot(x="WHO Region",y="Confirmed",data=covid)

s.fig.set_size_inches(10,6)

plt.show()

#범주형 데이터와 수치형 데이터를 맵핑하는데 유리하다.
#여러개의 데이터를 그리는 방법,default는 strip 형태로 보여주는 것이다.
#kind='violin' 처럼 그리는 형태를 다른 게 만들 수도 있다.

스트립그림(Strip Plot)

  • scatter plot과 유사하게 데이터의 수치를 표현하는 그래프
  • 점으로 표현
  • sns.stripplot()
sns.stripplot(x ='WHO Region' ,y='Recovered', data = covid)
plt.show()

Swarmplot

  • Strip Plot와 매우 유사하다.
  • 다른 점 : 점이 겹치는 경우 옆으로 분산한다.
  • sns.swarmplot()
sns.swarmplot(x ='WHO Region' ,y='Recovered', data = covid)
plt.show()

히트맵(Heatmap)

  • 데이터의 행렬을 생상으로 표현해주는 그래프
    -상관계수correlation에서 가장 많이 사용한다. corr이 수치로 주어지면 한눈에 알아보기가 어렵다. heatmap을 이용해 시각화 해주면 좋다.
  • sns.heatmap()
covid.corr()

sns.heatmap(covid.corr())

plt.show()

profile
초보 컴공

0개의 댓글