Python

Python - Matplotlib을 이용해서 데이터 시각화 하는 방법

electronicprogrammer 2020. 11. 5. 15:03

github 주소 : github.com/sangHa0411/DataScience/blob/main/Amazon_BestSellers_Matplotlib.ipynb

 

sangHa0411/DataScience

Contribute to sangHa0411/DataScience development by creating an account on GitHub.

github.com

 

이번 포스팅에서는 matplotlib을 이용하는 방법을 자세하게 정리하여서 데이터를 시각화하면서 matplotlib을 사용할 때 어떻게 해야하는지에 대해서 정리해보도록 하겠습니다.

 

먼저 Pandas를 이용해서 데이터를 불러오겠습니다

 

1. 막대그래프

author_List = df['Author'].value_counts()[:10]

keys = author_List.keys()
values = list(author_List)

plt.figure(figsize = (15 , 6))

plt.bar(keys , values , alpha = 0.5 , color = 'lightblue')

plt.title('Top 10 Most Bestselleres' , fontsize = 15)
plt.xticks(rotation = -45 , fontsize = 10)
plt.xlabel('Author' , fontsize = 12)
plt.ylabel('Counts (book)' , fontsize = 12)

plt.show()

 

key에는 이산적인 속성의 값들이 , values에는 각 속성에 대한 수치적 값이 (위에는 갯수) 로 리스트 자료구조를 만들어서 plt.bar함수에 입력합니다. plt.bar의 다른 인자인 alpha는 막대의 색깔 농도를 의미하고 color = '' 을 함으로써 색상도 정할 수 있습니다.

 

2. 원 그래프

plt.figure(figsize = (15 , 8))

plt.title('Genre Distribution Rate' , fontsize = 20)

keys = list(df['Genre'].value_counts().keys())
values = list(df['Genre'].value_counts())

plt.pie( values , 
         labels = keys,
         autopct = '%.2f%%' , 
         colors = ['lightblue' , 'tomato'], 
         explode = [0.01 , 0.01] , 
         textprops = {'fontsize' : 15 , 'weight' : 'bold'})

plt.ylabel('')


plt.show()

 

plt.pie가 핵심 함수이며 plt.bar와는 다르게 먼저 수치를 저장한 리스트 자료구조를 인자로 입력합니다. 그리고 나서 labels = [] 에 각 속성의 이름 혹은 의미가 무엇인지를 말해주도록 이산적인 속성의 리스트를  (위와 같은 경우에는 ['Non Fiction' , 'Fiction'] ) 를 입력합니다.

그리고 나서 autopct를 이용해서 퍼센트 출력을 정하고 colors로 각 부분에 대한 색상을 정합니다.

explode는 벌어지는 정도를 의미하며 textprops으로 글자의 크기 및 스타일을 정해줄 수 있습니다.

 

3. 히스토그램

plt.figure(figsize = (12 , 5))

plt.title('Bestseller Rating Histogram' , fontsize = 15)

plt.hist(df['User Rating'] , 
         facecolor = 'lightgreen' , 
         edgecolor = 'green' , 
         bins = 100)

plt.xlabel('Rating' , fontsize = 12)
plt.ylabel('Counts' , fontsize = 12)

plt.show()

 

1차원 히스토그램은 1변량의 리스트 데이터만 입력해주면 됩니다. 그러면 거기에 있는 값과 해당 값의 갯수를 파악해서 히스토그램을 그려줍니다. facecolor로 막대의 색깔, edgecolor로 경계선의 색깔을 정해줄 수 있습니다.

 

4. 선 그래프

year_Reviews = df.groupby('Year').sum()['Reviews']

keys = year_Reviews.keys()
values = list(year_Reviews)

plt.figure(figsize = (14 , 6))

plt.title('Year & Reviews Line Graph' , fontsize = 20)

plt.plot(keys , values , color = 'tomato' , label = 'Reviews')

plt.xlabel('Year' , fontsize = 15)
plt.ylabel('Sum of Reviews' , fontsize = 15)

plt.legend()

plt.show()

 

plt.plot으로 선그래프를 그릴 수 있는데 plt.bar와 같이 이산적인 속성을 저장한 리스트 그리고 각 이산적인 속성에 대한 수치를 저장한 리스트를 순서대로 입력함으로써 그려볼 수 있습니다.

예시로 위에 있는 keys , 그리고 values에 대한 정보는 아래와 같습니다.

 

5. 박스 그래프

박스 그래프를 그리기 위해서는 먼저 2차원 array가 필요합니다.

각 이산적인 속성을 0 , 1.  2 등으로 매핑하고 각 속성에 대한 1변량 데이터 즉 히스토그램을 만들 때 입력했던 리스트 같은 것들을 모아서 최종적으로 2차원 array를 만들어주어야 합니다.

각 년도에 따른 리뷰 갯수에 대한 데이터를 추출해서 리스트를 만들고 이를 순차적으로 리스트에 넣어줌으로써 다중 리스트 자료구조를 최종적으로 2차원 배열을 만들어줍니다.

plt.figure(figsize = (15 , 7))

idx_List = list(range(1 , len(keys) + 1))

plt.title('Year & Reviews Box Plot' , fontsize = 20)
plt.boxplot(values.T)

plt.xlabel('Year' , fontsize = 15)
plt.ylabel('Reviews' , fontsize = 15)

plt.xticks(idx_List , keys)

plt.show()

주의할 것은 이렇게 만든 2차원 배열의 전치행렬을 plt.boxplot에 입력을 해주어야 한다는 것입니다.

 

그리고 처음에 0.  1.  2 로 매핑했던 것을 다시 년도로 바꾸어주기 위해서 plt.xticks를 이용하였습니다.

6. 점 그래프

저희는 2가치 연속적인 속성을 가지고 서 각 위치에 점을 찍어서 어디에 데이터가 많이 분포하는 가를 알 수 있는 점 그래프를 그려볼 수 있습니다.

fictions = getSubDF(df , 'Genre' , 'Fiction')
non_fictions = getSubDF(df , 'Genre' , 'Non Fiction')


plt.figure(figsize = (12 , 7))

x1 = fictions['Price']
y1 = fictions['Reviews']

x2 = non_fictions['Price']
y2 = non_fictions['Reviews']

plt.title('')

plt.title('Reviews , Price Graph' , fontsize = 20)

plt.scatter(x1 , y1 , alpha = 0.5 , color = 'lightblue' , label = 'fiction')
plt.scatter(x2 , y2 , alpha = 0.5 , color = 'tomato' , label = 'non fiction')

plt.xlabel('Price' , fontsize = 15)
plt.ylabel('Reviews' , fontsize = 15)

plt.legend()

plt.show()

아래와 같이 하나의 plt.figure에 2개의 점 그래프를 같이 그릴 수 있으며 각 plt.scatter의 인자로 입력한 label 값을 

마지막에 plt.legend()를 함으로써 어떤 항목을 의미하는지 표시를 할 수도 있습니다.

plt.scatter(x1 , y1 , alpha = 0.5 , color = 'lightblue' , label = 'fiction')
plt.scatter(x2 , y2 , alpha = 0.5 , color = 'tomato' , label = 'non fiction')

plt.legend()

각각의 plt.scatter에 x에는 가격정보 , y에는 리뷰 정보가 들어있으며 둘다 연속적인 속성입니다.

 

참고자료 : towardsdatascience.com/data-visualization-using-matplotlib-16f1aae5ce70

 

Data Visualization using Matplotlib

Data Visualization is an important part of business activities as organizations nowadays collect a huge amount of data. Sensors all over…

towardsdatascience.com