오늘 LMS에서는 간단한 데이터 시각화에 대해서 진행되었다.
저번학기 기계학습 수업을 들었을때, 교수님께서 데이터 시각화가 ML/DL알고리즘을 사용하기 전에, 데이터를 한눈에 파악할 수 있게 해줘서 굉장히 중요하다고 하셨었던게 기억이 난다.
그때 공부좀 제대로 해둘걸 싶다,,,
import matplotlib.pyplot as plt
%matplotlib inline
# 그래프 데이터 
subject = ['English', 'Math', 'Korean', 'Science', 'Computer']
points = [40, 90, 50, 60, 100]
%matplotlib inline은 IPython에서 사용하는 매직 메서드이다. 주피터 노트북에서 메소드를 입력하면 그래프가 바로 출력된다.
fig = plt.figure() #도화지(그래프) 객체 생성
ax1 = fig.add_subplot(1,1,1) #figure()객체에 add_subplot 메서드를 이용해 축을 그려준다.
위 코드에서 figure()객체는 쉽게 말해 도화지이다.  이 figure()에 add_subplot을 이용하여 축을 작성해 준다.
축을 지정해야 도화지가 비로소 파이썬 출력창에 나타나게 된다!
또한, figure객체 안에 figsize라는 인자 값을 통해, 도화지의 크기를 조정할 수 있다.
그렇다면(1,1,1)은 무슨 의미일까? (1,1,1)에서 첫번째 인자는 행, 두번째 인자는 열, 세번째 인자는 위치를 의미한다. 만약(2,2,1)로 우리가 정의했다면, 도화지를 위치시킬때의 공간을 (2,2)로 정의하고 그 중, 네번째 칸 중, 왼쪽 위첫번째 공간에 도화지를 위치시킨다는 것이다.
바 그래프
ax1.bar(x축에 올 데이터,y축에 올 데이터)
아까 우리가 축을 지정해서 나타냈던 도화지에, bar(x축에 올 데이터,y축에 올 데이터)라는 메소드를 이용하여 바 그래프를 나타낼 수 있다.
그래프 요소 추가
그래프에 라벨과 제목을 추가하기 위해서는?
plt.xlabel('x축')
plt.ylabel('y축')
plt.title("제목")
위의 코드처럼 xlabel, ylabel, title 메소드를 이용하여 나타낼 수 있다.
x,y좌표축의 범위를 설정하기 위해서는?
plt.xlim()
plt.ylim()
위 코드를 통해 좌표축의 범위를 설정해줄수 있다.
또한
plt.grid()
gird를 통해 격자눈금을 추가할 수 있다.
위의 파트에서 figure()객체를 생성하고, add_subplot()으로 축을 생성해야 도화지가 나온다고 설명했다.
이 두가지 과정을 생략하는 방법이 있다. 바로 plt.plot()을 이용하는 것이다. plt.plot()을 이용하면, 가장 최근의 figure객체와 그 서브플롯을 자동으로 그려주게 된다.
import numpy as np
x = np.linspace(0, 10, 100) 
plt.plot(x, np.sin(x),'o')
plt.plot(x, np.cos(x),'--', color='black') 
plt.show()
plt.plot()의 인자로는 x,y데이터와 어떻게 점을 표기할 것인지 (위에서는 동그라미와 대쉬(-)모양)이 있다.
도화지를 여러개 사용하고 싶다면?
위에서는 add_subplot()를 이용하였지만, plt.subplot(행,열,위치)를 이용하여 도화지를 마찬가지로 추가할 수 있다.
위에서는 plt를 이용하여 plt의 인자에 데이터를 넣어주었지만, 이제 data.plot()을 이용하여 그래프를 더욱 쉽게 그릴 수 있다.
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축으로 사용할 값
xlim, ylim: x축, y축 한계
grid: 축의 그리드 표시할지 여부
범주형 변수는 주로 막대그래프를 사용하여 수치를 요약한다.
우리가 관심있는 수치에 대한 범주별 값을 막대로 나타내는 것이다.
(1). Pandas와 Matplotlib를 활용한 방법
Matplotlib에 pandas의 데이터를 바로 넣을 수는 없다. 따라서 여러 처리를 해야하는데 순서는 다음과 같다.
1.먼저 gruopby()를 통해 우리가 관심있는 수치에 대한 범주를 묶는다.
grouped = df['tip'].groupby(df['sex'])
우리는 성별에 따른 tip수치를 확인해 보고 싶다.
데이터에 성별에 따른 tip수치의 평균을 사용하고 싶다면, mean()을 통해 평균을 구한후, 데이터를 dictionary타입으로 바꿔준다.
import numpy as np
sex = dict(grouped.mean()) #평균 데이터를 딕셔너리 형태로!
sex
2.딕셔너리 형태로 변경해주면, 데이터는 {남:평균,여:평균}으로 나오게 된다. 이때 우리는 (남,여)를 x데이터로, (남평균,여평균)을 y데이터로 출력하고 싶기 때문에, 아래 코드로 데이터를 바꿔준다.
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을 이용하여 매우 간단하게 그래프를 출력할 수 있다.
sns.barplot(data=df, x='sex', y='tip')
이렇게 한줄이면 아까 했던 절차가 완료된다.... 그냥 이 방법을 기억해두자
sns.scatterplot(data=df , x='total_bill', y='tip'
sns.scatterplot()을 이용해 그려볼 수 있다.
x = np.linspace(0, 10, 100) 
plt.plot(x, np.sin(x), 'o')
plt.plot(x, np.cos(x)) 
plt.show()
sns.lineplot(x=x, y=np.sin(x))
sns.lineplot(x=x, y=np.cos(x))
선 그래프는 plt.plot과 sns.lineplot을 통해 그릴 수 있다.
sns.histplot(df['total_bill'], label = "total_bill")
히스토그램은
sns.histplot을 통해 그릴 수 있다. 히스토그램은 컬럼의 값 별로 그 값이 몇개나 있는지 y축에 나타낸 것이다.
히트맵은 데이터를 수치에 따른 색상으로 나타내는 것을 말한다.
히트맵을 나타내기 전에, 먼저 데이터를 pivot해줘야한다.
pivot = DataFrame.pivot(index='year', columns='month', values='passengers')
위 코드는 DataFrame의 탑승객 수를 year과 month로 피벗하는 코드이다.
피벗을 통해 표 형식으로 나타낸 다음,
sns.heatmap(pivot)
sns.heatmap(pivot)을 통해 히트맵으로 나타낼 수 있다.
데이터 시각화가 참 헷갈리는것 같다.
패키지도 다양하고, 메소드도 비슷비슷하고,,, 진짜 데이터 전처리는 많이 다뤄봐야 실력이 느는것 같다.
오늘부터 백준 하나씩 풀어보는데 쉬운문제여도 다 알지 않나? 라는 생각으로 넘어가지 않고, 매일 꾸준히 풀어보는 연습을 해보자.