심심해서 하는 블로그 :: [Python] pandas plot 함수로 데이터 시각화
Untitled

1. pandas 소개

데이터 분석할 때, 정말 효자 라이브러리입니다.

Python을 이용해서 데이터를 분석하는 프로젝트에서 유용하게 사용한 라이브러리입니다.

pandas는 DataFrame 이라는 자료형을 이용하여, 데이터를 저장하고 가공합니다.

In [1]:
import pandas as pd
import numpy as np

matrix = np.matrix([[1,3], [2,5]])
print("numpy.matrix : \n", matrix)

df = pd.DataFrame([[1,3], [2,5]])
print("pandas DataFrame :\n", df)
numpy.matrix : 
 [[1 3]
 [2 5]]
pandas DataFrame :
    0  1
0  1  3
1  2  5

DataFrame은 numpy matrix에서 Matrix 행의 속성 index 와 열의 속성 column 이 적용된 형태를 합니다.

데이터베이스 테이블이나 엑셀같은 표에 데이터를 저장하는 형태와 동일합니다.

numpy.matrix를 사용하면서 불편한 점은 행렬 내부의 원소를 접근할 때 반드시 index 단위로 접근해야 했습니다.

프로그램을 혼자 짤 때는 선택한 이 원소의 의미를 이해할 수 있지만, 함께하는 프로젝트에서는 코드를 이해하는데 어렵습니다.

(거기다 난도가 있는 통계적 알고리즘 구현까지 들어가면 통계베이스 없는 저같은 개발자는 일일히 실행해야 겨우 의미를 알게 되요)

하지만 pandas는 각각의 행과 열을 지정할 수 있어서, 선택하는 데이터가 어떤 속성을 가지는지 쉽게 이해가 가능합니다.

In [2]:
matrix = np.matrix([[1,3], [2,5]])
print("A의 수학 성적 : ", matrix[0,0])

df = pd.DataFrame([[1,3], [2,5]], columns=["math", "computer"], index=["A", "B"])
print("A의 수학 성적 : ", df.loc["A", "math"])
A의 수학 성적 :  1
A의 수학 성적 :  1

또한 DataFrame 클래스안의 메소드 만으로도 프로젝트에서 사용하는 합, 평균, 분산, 표준 편차 등의 단순 통계부터

데이터를 재구성하기 위한 이동 평균, 이동 합, Resample, Groupby와 시각화까지 지원합니다.

이번 시간에는 시각화 기능을 알아 보도록 해요.




2. 시각화

DataFrame의 plot을 이용하면 다양한 형태의 그래프를 그릴 수 있습니다.

numpy Matrix를 그래프로 그린다면 matplotlib 라이브러리를 사용해서 설정을 해야한다는 것에 비해면 엄청 간단한 방법으로 그래프를 그릴 수 있어요

DataFrame.plot.bar() : 막대 그래프

DataFrame.plot.line() : 선 그래프

DataFrame.plot.scatter(x, y) : 산포도 그래프

DataFrame.plot.box() : Box 그래프

앞서 사용한 A와 B의 성적표로 막대 그래프와 선 그래프를 그려 봅시다

In [3]:
""" %matplotlib inline : 주피터 노트북 설정 때문에 사용한 거에요, """ 
%matplotlib inline 

df.plot.bar()
df.plot.line()
df.plot.box()
Out[3]:
<matplotlib.axes._subplots.AxesSubplot at 0x1e284adb9b0>

데이터 수가 많으면 숫자로 보았을 때 데이터가 어떤 분포를 가지는지 쉽게 알 수 없는데, 간단하게 그래프를 그려서 확인할 수 있어요.

산포도 그래프는 sklearn 라이브러리에 있는 샘플 데이터로 한 번 그려볼게요

sklearn 라이브러리가 없다면 아나콘다 콘솔에 pip install sklearn 명령어로 설치하시고 진행해주세요

데이터 마이닝 수업에서 단골 손님으로 언급되는 Iris 데이터를 이용해서 산포도 그래프를 그려볼게요.

아래의 함수를 실행하여, 데이터를 적재합니다.

In [4]:
from sklearn.datasets import load_iris
iris = load_iris()
data = iris['data']
feature = iris['feature_names']
label = iris['target']

print("data의 타입 : ", type(data))

# numpy.ndarray데이터도 pandas DataFramed의 데이터로 적용이 가능합니다.
iris_df = pd.DataFrame(data, columns=feature)

# label 컬럼을 추가해줍니다.
iris_df.loc[:, "label"] = label
print(iris_df.head())
data의 타입 :  <class 'numpy.ndarray'>
   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \
0                5.1               3.5                1.4               0.2   
1                4.9               3.0                1.4               0.2   
2                4.7               3.2                1.3               0.2   
3                4.6               3.1                1.5               0.2   
4                5.0               3.6                1.4               0.2   

   label  
0      0  
1      0  
2      0  
3      0  
4      0  

sklearn 라이브러리는 통계 알고리즘을 담고 있는 라이브러리인데요.

샘플로 데이터를 담고 있어서 데이터를 수집하는데 신경을 덜 쓸 수 있어요.

numpy.ndarraypandas.DataFrame 간의 호환성도 좋아서 여러분이 작성한 알고리즘의 결과가 numpy.ndarray 형태라 하여도,

pandas DataFrame으로 변환하여 사용할 수 있답니다.

이제 scatter 함수로 산포도를 그러볼게요. x축과 y축으로 사용할 컬럼명을 매개변수로 반드시 넣어주셔야 합니다.

In [5]:
iris_df.plot.scatter(x="sepal length (cm)", y="label")
Out[5]:
<matplotlib.axes._subplots.AxesSubplot at 0x1e2829fa5c0>

그려 놓고 보니까 각각이 무엇을 의미하는지 해석하기가 힘드네요. 서로 구분할 수 있도록 색을 넣어 줍시다.

label에 따라 색을 적용하기위해 color라는 컬럼을 새로 만들었습니다.

In [6]:
# iris 컬럼의 label은 0과 1, 2로 구성되어 있습니다. 
# label 중에 0, 1, 2 값을 같는 index를 찾아 줍니다.
zero = iris_df[iris_df["label"] == 0].index
one = iris_df[iris_df["label"] == 1].index
two = iris_df[iris_df["label"] == 2].index

# 그리고 각각의 index에 따라서 색깔 데이터를 넣어 줍니다.
iris_df.loc[zero, "color"] = "r"
iris_df.loc[one, "color"] = "g"
iris_df.loc[two, "color"] = "b"

iris_df.plot.scatter(x="sepal length (cm)", y="label", c=iris_df['color'])
Out[6]:
<matplotlib.axes._subplots.AxesSubplot at 0x1e286a6f828>

pandas.DataFrame으로 간단하게 데이터 가시화를 해보았습니다.

마지막으로 여러 종류의 그래프를 한 곳에 그리는 방법도 공유해드릴게요.

In [7]:
ax = iris_df["sepal length (cm)"].plot.line(color='green')
ax_2 = iris_df["petal length (cm)"].plot.bar(ax=ax, color='red')

# x축에 사용할 라벨
ax_2.set_xticks(iris_df.index[0::10])
ax_2.set_xticklabels(iris_df.index[0::10], rotation=45)

# y축에 사용할 라벨을 지정합니다.
ax_2.set_ylabel("length(cm)")

ax_2.legend()
Out[7]:
<matplotlib.legend.Legend at 0x1e284aa0f28>

plot 메소드들은 Axes라는 좌표축 객체를 반환합니다.

ax.set_xticks() : x축의 간격을 지정합니다.

ax.set_xticklabels() : x축의 간격에 라벨을 지정합니다.

ax.set_ylabel() : y축의 라벨을 지정합니다.

ax.legend() : 범례를 그래프에 넣어줍니다.

긴글 읽어 주셔서 감사합니다.

도움이 되셨으면 공감 버튼 꼭 눌러주세요.


,