본문 바로가기
AI/데이터 사이언스

[AI 부트캠프] DAY 23 - 파이썬 EDA 3 및 현직자 특강

by HOHHOH 2023. 8. 18.

[오늘의 일지]

오전에 현직자 특강 - 미국 월마트 현직 데이터 사이언티스트 강의

파이썬 온라인 녹화 강의 - Matplotlib과 Seaborn 정리

[상세 내용]

현직자 특강

현직자 특강의 전체적인 내용은 강사님이 어떻게 데이터 사이언스 분야를 접하게 되었는지 또 어떻게 공부하고 미국으로 떠나게 되었는지 등 여러 가지 동기부여 될 만한 주제를 가지고 강의를 해주셨습니다. 특히 미국 대학원에 들어가서 월마트에 입사에 성공한 뒤 데이터 사이언티스트의 직무에 관한 내용과 미국에서의 생활에 대한 내용이 재미있게 느껴졌던 거 같습니다. 여러 가지 많은 이야기를 해주셨는데 이번에 느낀 점은 이 분야는 열심히만 한다면 다양한 곳으로 진출할 수 있는 가능성이 큰 분야라는 것을 다시 새롭게 느꼈습니다.

 

파이썬 EDA

Matplotlib

- Matplotlib는 파이썬에서 자료를 차트(chart)나 플롯(plot)으로 시각화하는 패키지입니다. 맷플롯립은 정형화된 차트나 플롯 이외에도 저수준 API를 사용한 다양한 시각화 기능을 제공합니다.

 

- Matplotlib 기본 사용

# matplotlib.pyplot 모듈 로드하여 plt로 사용
import matplotlib.pyplot as plt

# 한 개의 리스트 입력
# 한 개의 숫자 리스트 형태로 값을 입력하면 y값으로 인식
# x값은 기본적으로 [0, 1, 2, 3]으로 설정됨
# 파이썬 튜플, 넘파이 배열 형태도 가능
# plt.show( ) 함수는 그래프를 화면에 나타나도록 함

plt.plot([2, 3, 4, 5])
plt.show()

Matplotlib 한 개의 리스트 입력

# 두 개의 숫자 리스트 입력
# 첫 번째 리스트의 값은 x값, 두 번째 리스트의 값은 y로 적용됨
# 순서쌍(x, y)으로 매칭된 값을 좌표평면 위에 그래프 시각화

plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.show()

두 개의 리스트 입력

 

- Matplotlib 축 레이블 설정

# xlabel() 함수를 사용하여 그래프의 x축에 대한 레이블 표시
# ylabel() 함수를 사용하여 그래프의 y축에 대한 레이블 표시

plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.xlabel('X-Label')
plt.ylabel('Y-Label')
plt.show()

축 레이블 설정

 

- Matplotlib 범례(Legend) 설정

# 범례(Legend)는 그래프에 데이터의 종류를 표시하기 위한 텍스트
# legend() 함수를 사용해서 그래프에 범례 표시
# plot() 함수에 label 파라미터 값으로 삽입

plt.plot([1, 2, 3, 4], [1, 4, 9, 16], label = 'Square')
plt.xlabel('X-Label')
plt.ylabel('Y-Label')
plt.legend()

plt.show()

범례 설정

 

- Matplotlib 축 범위 설정

# xlim() : X축이 표시되는 범위 지정 [xmin, xmax]
# ylim() : Y축이 표시되는 범위 지정 [ymin, ymax]
# axis() : X, Y축이 표시되는 범위 지정 [xmin, xmax, ymin, ymax]
# 입력 값이 없으면 데이터에 맞게 자동으로 범위 지정
plt.plot([1, 2, 3, 4], [3, 6, 9, 12])
plt.xlabel('X-Label')
plt.ylabel('Y-Label')
plt.xlim([0, 5])      
plt.ylim([0, 15])    

plt.show()

축 범위 설정

 

- x, y 축을 모두 하나에 설정하는 함수 axis()

# axis() : X, Y축이 표시되는 범위 지정 [xmin, xmax, ymin, ymax]
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.axis([0, 6, 0, 20])

plt.show()

axis() 활용 범위 설정

 

- Matplotlib 선 종류 설정

# plot() 함수의 포맷 문자열 사용
# '-' (Solid), '- -' (Dashed), ' : ' (Dotted), ' -. ' (Dash-dot)
# plot() 함수의 linestyle 파라미터 값으로 삽입
# '-' (solid), '- -' (dashed), ' : ' (dotted), ' -. ' (dashdot)
# 튜플을 사용하여 선의 종류 커스터마이즈
# (0, (1, 1)) [dotted], (0, (5, 5)) [dashed], (0, (3, 5, 1, 5)) [dashdotted]
plt.plot([1, 2, 3], [4, 4, 4], '-', color='C0', label='Solid')
plt.plot([1, 2, 3], [3, 3, 3], '--', color='C0', label='Dashed')
plt.plot([1, 2, 3], [2, 2, 2], linestyle='dotted', color='C0', label='Dotted')
plt.plot([1, 2, 3], [1, 1, 1], linestyle='dashdot', color='C0', label='Dash-dot')

plt.xlabel('X-Label')
plt.ylabel('Y-Label')
plt.axis([0.8, 3.2, 0.5, 5.0])
plt.legend(loc='upper right', ncol=4)

plt.show()

선 종류 예시

 

- Matplotlib 마커 설정

# 기본적으로는 실선 마커
# plot() 함수의 포맷 문자열 (Format string)을 사용해서 마커 지정
# 'ro’는 빨간색 (‘red’)의 원형 (‘circle’) 마커를 의미
# 'k^’는 검정색 (‘black’)의 삼각형 (‘triangle’) 마커를 의미
# plot() 함수의 marker 파라미터 값으로 삽입
# 's'(square), 'D'(diamond)
# '$문자$' 문자 마커
plt.plot([4, 5, 6], "b")
plt.plot([3, 4, 5], "ro")
plt.plot([2, 3, 4], marker="s")
plt.plot([1, 2, 3], marker="D")
plt.plot([0, 1, 2], marker='$A$')
plt.show()

마커 설정 예시

 

- Matplotlib 색상 설정 (아래 링크에서 많은 종류의 색상 코드를 알 수 있다.)

 

List of named colors — Matplotlib 3.7.2 documentation

List of named colors This plots a list of the named colors supported in matplotlib. For more information on colors in matplotlib see Helper Function for Plotting First we define a helper function for making a table of colors, then we use it on some common

matplotlib.org

# plot() 함수의 포맷 문자열 (Format string)을 사용해서 색상 지정
# plot() 함수의 color 파라미터 값으로 삽입
# 'r' red, 'violet', 'dodgerblue' 
plt.plot([1, 2, 3, 4], [2.0, 3.0, 5.0, 10.0], 'r')
plt.plot([1, 2, 3, 4], [2.0, 2.8, 4.3, 6.5], color = 'violet')
plt.plot([1, 2, 3, 4], [2.0, 2.5, 3.3, 4.5], color = 'dodgerblue')

plt.xlabel('X-Label')
plt.ylabel('Y-Label')

plt.show()

 

- Matplotlib 타이틀 설정

# title() 함수를 이용하여 타이틀 설정
# title() 함수의 loc 파라미터 값으로 위치 설정
# loc 파라미터 : {‘left’, ‘center’, ‘right’}
# title() 함수의 pad 파라미터 값으로 타이틀과 그래프와의 간격(포인트 단위) 설정
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.xlabel('X-Label')
plt.ylabel('Y-Label')
plt.title('Graph Title', loc='center', pad=100)

타이틀 예시인데 pad가 간격을 의미하는 것을 알수 있다

 

- Matplotlib 막대그래프(사용 시 x축, y축 눈금 설정 xticks(), yticks() 사용) 

# Matplotlib 눈금 표시
# xticks(), yticks() 함수는 각각 X축, Y축에 눈금 설정
# xticks(), yticks() 함수의 label 파라미터 값으로 눈금 레이블 설정

# Matplotlib 막대 그래프
# bar() 함수 이용하여 막대 그래프 시각화
# bar() 함수의 color 파라미터 값으로 색상 설정
# bar() 함수의 width 파라미터 값으로 막대 폭 설정

# years는 X축에 표시될 연도이고, values는 막대 그래프의 y 값 
# xticks(x, years) : x축의 눈금 레이블에 '2022', '2023', '2024' 순서대로 설정
# color와 width로 막대 그래프 파라미터 설정
x = [1, 2, 3]
years = ['2022', '2023', '2024']
values = [300, 100, 700]

plt.bar(x, values, color=['r', 'g', 'b'], width=0.4)
#plt.bar(x, values, color=['r', 'g', 'b'], width=0.8)

plt.xticks(x, years)

plt.show()

막대그래프 사용 예시 (x축 년도 설정)

 

- Matplotlib 산점도

# Matplotlib 산점도
# scatter() 함수 이용하여 산점도 시각화
# scatter() 함수의 color 파라미터 값으로 마커의 색상 설정
# scatter() 함수의 size 파라미터 값으로 마커의 크기 설정

# numpy의 random 모듈의 rand 함수를 통해 숫자 랜덤하게 생성
# color와 size로 산점도 파라미터 설정
import numpy as np

np.random.seed(0)

n = 50
x = np.random.rand(n)
y = np.random.rand(n)
size = (np.random.rand(n) * 20)**2
colors = np.random.rand(n)

plt.scatter(x, y, s=size, c=colors)
plt.show()

랜덤으로 산점도 만들기 예시

 

- 참고 자료(다양한 그래프 함수, 여러 가지 시각화 함수)

# Matplotlib 다양한 그래프 종류
# matplotlib.pyplot.bar( ) : 막대 그래프
# matplotlib.pyplot.barh( ) : 수평 막대 그래프
# matplotlib.pyplot.scatter( ) : 산점도
# matplotlib.pyplot.hist( ) : 히스토그램
# matplotlib.pyplot.errorbar( ) : 에러바
# matplotlib.pyplot.pie( ) : 파이 차트
# matplotlib.pyplot.matshow( ) : 히트맵

# Matplotlib subplot 이용한 여러 개 그래프 시각화
# subplot() 함수는 영역을 나눠 여러 개의 그래프 시각화
# plt.subplot(row, column, index)
# tight_layout() 함수는 모서리와 서브플롯의 모서리 사이의 여백(padding)을 설정

# Matplotlib 한 좌표 평면 위에 다른 종류의 그래프 시각화
# plt.subplots() 함수는 여러 개 그래프를 한 번에 가능

# plt.subplots() 함수의 디폴트 파라미터는 1이며 즉 plt.subplots(nrows=1, ncols=1) 의미

# plt.subplots() 함수는 figure와 axes 값을 반환

# figure

# 전체 subplot 의미
# 서브플롯 안에 몇 개의 그래프가 있던지 상관없이 그걸 담는 전체 사이즈를 의미
# axe

# 전체 중 낱낱개 의미
# ex) 서브플롯 안에 2개(a1,a2)의 그래프가 있다면 a1, a2 를 일컬음
# .twinx() 함수는 ax1과 축을 공유하는 새로운 Axes 객체 생성​

 

Seaborn

- Seaborn은 Matplotlib을 기반으로 다양한 색상 테마와 통계용 차트 등의 기능을 추가한 시각화 라이브러리라고 합니다. 기본적인 시각화 기능은 Matplotlib 패키지에 의존하며 통계 기능은 Statsmodels 패키지에 의존하고 있기 때문에 연계를 통한 활용을 특징으로 가지고 있는 라이브러리라고 할 수 있습니다.

 

- Seaborn 이용해 보기(Seanborn 라이브러리에는 타이타닉 데이터를 기본으로 가지고 있다)

# seaborn 불러와서 sns로 사용
import seaborn as sns

# titanic 데이터 불러오기
titanic = sns.load_dataset('titanic')
# titanic 데이터 내용 확인
# .head() : 데이터의 상단 5개 행 출력
titanic.head()
>>>
	survived	pclass	sex	age	sibsp	parch	fare	embarked	class	who	adult_male	deck	embark_town	alive	alone
0	0	3	male	22.0	1	0	7.2500	S	Third	man	True	NaN	Southampton	no	False
1	1	1	female	38.0	1	0	71.2833	C	First	woman	False	C	Cherbourg	yes	False
2	1	3	female	26.0	0	0	7.9250	S	Third	woman	False	NaN	Southampton	yes	True
3	1	1	female	35.0	1	0	53.1000	S	First	woman	False	C	Southampton	yes	False
4	0	3	male	35.0	0	0	8.0500	S	Third	man	True	NaN	Southampton	no	True

 

- Seaborn의 선형 회귀선이 있는 산점도 함수(regplot())

# Seaborn 선형 회귀선 있는 산점도
# regplot() 함수 : 선형 회귀선이 있는 산점도
# x축 변수
# y축 변수
# 데이터 셋
# axe 객체
# fit_reg : 선형회귀선 표시 여부
# 선형 회귀선
# 간단한 선형 데이터 집합에 사용되는 가장 적합한 직선(= 추세선)
# 데이터를 시간 축으로 봤을 때, 데이터의 값이 장기적으로 어떻게 변하는지 직선으로 표현한 것

import matplotlib.pyplot as plt

# 그래프 객체 생성 (figure에 2개의 서브 플롯을 생성)
fig = plt.figure(figsize=(15,5))
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)
 
# 산점도에 선형회귀선 표시(fit_reg=True)
# x축 변수, y축 변수, 데이터 셋, axe 객체(1번째 그래프) 
sns.regplot(x='age', y='fare', data=titanic, ax=ax1)        

# 산점도에 선형회귀선 미표시(fit_reg=False)
# x축 변수, y축 변수, 데이터 셋, axe 객체(2번째 그래프) 
sns.regplot(x='age', y='fare', data=titanic, ax=ax2, fit_reg=False)

plt.show()

선형 회귀선이 있는 산점도 예시(fit_reg를 사용하면 산점도를 사라지게 할 수 있다)

 

- Seaborn 히스토그램과 커널 밀도 그래프(distplot(), histplot(), kdeplot())

# Seaborn 히스토그램과 커널 밀도 그래프
# distplot( ) 함수 : 히스토그램과 커널 밀도 그래프
# 분포를 그릴 데이터 변수
# hist : True는 히스토그램 표시, False는 히스토그램 표시 안 함
# kde : True는 커널 밀도 그래프 표시, False는 커널 밀도 그래프 표시 안 함
# axe 객체
# histplot( ) 함수 : 히스토그램(하나의 변수 데이터의 분포를 확인할 때 사용하는 함수)
# kdeplot( ) 함수 : 커널 밀도 그래프(그래프와 x축 사이의 면적이 1이 되도록 그리는 밀도 함수)

# 그래프 객체 생성 (figure에 3개의 서브 플롯을 생성)
fig = plt.figure(figsize=(15, 5))   
ax1 = fig.add_subplot(1, 3, 1)
ax2 = fig.add_subplot(1, 3, 2)
ax3 = fig.add_subplot(1, 3, 3)
 
# distplot
# 히스토그램과 커널 밀도 그래프 표시
# 분포를 그릴 데이터 변수, axe 객체(1번째 그래프) 
sns.distplot(titanic['fare'], ax=ax1) 

# histplot
# 분포를 그릴 데이터 변수, 커널 밀도 그래프 표시 안 함, axe 객체(2번째 그래프) 
#sns.histplot(x='fare', data=titanic,  ax=ax2)       
sns.distplot(titanic['fare'], kde=False, ax=ax2)  

# kdeplot
# 분포를 그릴 데이터 변수, 히스토그램 표시 안 함, axe 객체(3번째 그래프) 
#sns.kdeplot(x='fare', data=titanic, ax=ax3) 
sns.distplot(titanic['fare'], hist=False, ax=ax3) 

# 차트 제목 표시
ax1.set_title('titanic fare - distplot')
ax2.set_title('titanic fare - histplot')
ax3.set_title('titanic fare - kedplot')


plt.show()

distplot()은 히스토그램과 커널 밀도 그래프 두개를 표현하는 함수이다

 

- Seaborn의 범주형 데이터 산점도(stripplot(), swarmplot())

# Seaborn 범주형 데이터의 산점도
# stripplot( ) 함수 : 데이터 포인트가 중복되어 범주별 분포를 시각화
# x축 변수
# y축 변수
# 데이터 셋
# axe 객체
# hue : 특정 열 데이터로 색상을 구분하여 출력
# swarmplot( ) 함수 : 데이터의 분산까지 고려하여 데이터 포인트가 서로 중복되지 않도록 시각화. 즉, 데이터가 퍼져 있는 정도를 입체적으로 파악 가능
# x축 변수
# y축 변수
# 데이터 셋
# axe 객체
# hue : 특정 열 데이터로 색상을 구분하여 출력

# 그래프 객체 생성 (figure에 2개의 서브 플롯을 생성)
fig = plt.figure(figsize=(15, 5))   
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)
 
# 이산형 변수의 분포 - 데이터 분산 미고려
# x축 변수, y축 변수, 데이터 셋, axe 객체(1번째 그래프) 
sns.stripplot(x='class', y='age', data=titanic, ax=ax1)  

# 이산형 변수의 분포 - 데이터 분산 고려 (중복 X) 
# x축 변수, y축 변수, 데이터 셋, axe 객체(2번째 그래프), 성별로 색상 구분
sns.swarmplot(x='class', y='age', data=titanic, ax=ax2, hue='sex')       

# 차트 제목 표시
ax1.set_title('Strip Plot')
ax2.set_title('Swarm Plot')

plt.show()

범주형 데이터 산점도 예시

- 그 밖의 그래프

# Seaborn 빈도 그래프
# countplot( ) 함수 : 각 범주에 속하는 데이터의 개수를 막대 그래프 시각화
# x축 변수
# palette
# 데이터 셋
# axe 객체
# hue : 특정 열 데이터로 색상을 구분하여 출력

# Seaborn 조인트 그래프
# jointplot( ) 함수 : 산점도를 기본으로 표시, x-y축에 각 변수에 대한 히스토그램을 동시에 시각화
# x축 변수
# y축 변수
# 데이터 셋
# kind = 'reg' : 선형 회귀선 추가
# kind = 'hex' : 육각 산점도 추가
# kind = 'kde' : 커널 밀집 그래프 추가

# Seaborn 관계 그래프
# pairplot( ) 함수
# 인자로 전달되는 데이터프레임의 열(변수)을 두 개씩 짝 지을 수 있는 모든 조합에 대해서 표현
# 열은 정수/실수형이어야 함
# 3개의 열이라면 3행 x 3열의 크기로 모두 9개의 그리드 생성
# 각 그리드의 두 변수 간의 관계를 나타내는 그래프를 하나씩 그림
# 같은 변수끼리 짝을 이루는 대각선 방향으로는 히스토그램 시각화
# 서로 다른 변수 간에는 산점도 시각화

빈도 그래프의 예
조인트 그래프의 예시 (타이타닉 데이터 이용)
관계 그래프의 예시 (타이타닉 데이터 이용)

 

[마무리]

 오늘은 Matplotlib과 Seaborn을 이용한 다양한 그래프들의 예시를 살펴봤습니다. 사실 대부분 수업 내용의 예시를 가져왔고 아직 어떤 식으로 코드를 짜서 이용해야 되는지는 대략적인 부분만 이해한 것 같습니다. 아마도 이 부분은 프로젝트를 통해서 데이터를 가져오고 자료를 만들 때 많이 활용되고 익숙해질 것으로 예상됩니다. 이제는 진짜로 데이터를 다루고 있다는 느낌을 받고 있고 흥미가 점점 더 커진 다는 것을 말하고 싶습니다.

반응형

댓글