pandas로 bar,hist,density 그리기

반응형
반응형

matplotlib에서 특징이 있는 그래프를 그리곤 했었는데 pandas만으로도 여러가지 그래프를 그릴 수 있습니다.
이번 포스팅에서 다룰 그래프는 막대 그래프 종류만으로 구성해보았습니다.

bar, histogram, density 세가지에 대해서 다루어 보겠습니다.

bar plot

시리즈(Series)

-0.5~0.5 사이의 랜덤한 숫자 10개를 bar plot으로 그려보겠습니다.
plot 파라미터로 kind='bar' 를 입력합니다.

np.random.seed(222)
s = pd.Series(np.random.rand(10)-0.5)
s.plot(kind='bar')

판다스에서 하는 것이기 때문에 시리즈나 데이터프레임만 가능합니다.
numpy나 리스트는 matplotlib로 할 수 있습니다.

데이터프레임(DataFrame)

데이터프레임일때도 가능합니다.

df = pd.DataFrame(np.random.rand(10,3),columns=['x','y','z'])
df.plot(kind='bar')

쌓는 bar plot도 가능합니다.
stacked=True를 추가로 입력합니다.

df.plot(kind='bar',stacked=True)

축을 바꾸려면 kind='barh'으로 입력합니다.

df.plot(kind='barh',stacked=True)

히스토그램(histogram)

히스토그램을 그릴려면 판다스에 내장되어있는 hist()를 사용합니다.
hist 안의 파라미터는 matplotlib와는 다르니 주의해야 합니다.
디폴트값으로 히스토그램은 10개 구간으로 나눠집니다.

컬럼이 하나일때

np.random.seed(222)
df = pd.DataFrame(np.random.randn(1000))
df.hist()

구간을 나눌려면 bins를 사용합니다

df.hist(bins=100)

컬럼이 여러개일때

컬럼이 여러개인 데이터프레임을 히스토그램으로 그리면 기본적으로 나눠져서 그려집니다. 즉, subplot으로 나옵니다.

df = pd.DataFrame(np.random.randn(1000,4),columns=['a','b','c','d'])
df.hist()

지정된 컬럼만 히스토그램으로 그리기

컬럼을 지정하면 지정된 컬럼에 한해서 히스토그램을 그립니다. 하지만 hist 메쏘드에서는 여러 컬럼은 안되고 한개의 컬럼에 대해서만 가능합니다.

df.hist(column='a')

지정 컬럼을 정하고 싶다면 plot으로 돌아와 그려냅니다.

한꺼번에 그리고 싶다면 plot으로 돌아와 그려냅니다.
현재의 df는 겹쳐있으므로 약간 위치를 조정하고 그려보겠습니다.

df2 = pd.DataFrame(
    {'a': np.random.randn(1000) + 1,
     'b': np.random.randn(1000),
     'c': np.random.randn(1000) - 1,
     'd': np.random.randn(1000)+2
    },
    columns=['a', 'b', 'c','d'],
)
df2.plot(kind='hist',alpha=0.5)

stacked도 가능합니다.

df.plot(kind='hist',stacked=True)

그룹별로 그리기

해당 데이터프레임이 그룹별로 나눌 수 있을때, 그룹 별로 히스토그램을 따로 그릴 수 있습니다.

df를 4개의 그룹으로 나누겠습니다.

df

Q컬럼을 보면 4개의 그룹으로 나눠진 것을 볼 수 있습니다.
이런 경우 hist에 by='Q' 를 입력하면 그룹별로 히스토그램을 그려줍니다.

df.hist(by='Q')

특정 컬럼에 대해 그룹별로 그리고 싶다면 컬럼을 지정합니다.

df.hist(column='a',by='Q')

축 바꾸기

축을 바꾸고 싶다면 orientation='horizontal' 를 넣어줍니다.

컬럼이 하나더라도 똑같습니다. 

여러 컬럼에 대해서만 보이겠습니다.

df.hist(orientation='horizontal')

density plot

히스토그램에서 추정한 선을 그려넣는 density plot입니다.
hist에서 density=True로 density를 허용한 상태로 만든 후 plot에 kind='kde' 를 넣습니다.

정규분포를 그려보겠습니다.

s = pd.Series(np.random.randn(1000))
s.hist(density=True)
s.plot(kind='kde')

정규분포가 아니더라도 density plot이 가능합니다.

s = pd.Series(np.random.rand(1000))
s.hist(density=True)
s.plot(kind='kde')

마치며

보시는 것처럼 히스토그램은 matplotlib와는 약간 다릅니다. 약간의 지식이 필요해보입니다.
각자의 장단점이 있으니 참고하시고 자신에게 더 맞는 툴을 쓰면 될 것 같습니다.
더 다채롭고 싶다면 matplotlib로 하는 게 낫습니다.
그렇지만 hist, plot 을 쓰면 간단한 코드로 그래프를 그려낼 수 있는 부분에서는 판다스가 더 괜찮습니다.

 

pandas로 그릴 수 있는 그래프가 아직 남았습니다.
나머지는 다음 포스팅에 작성하도록 하겠습니다.

 

관련 포스팅
ndarray 랜덤한값 생성

[matplotlib] 히스토그램 그리기 plt.hist()

데이터목장님의
글이 좋았다면 응원을 보내주세요!

Designed by JB FACTORY