[Python.MatPlotLib] 그래프 꾸미기 III - 통신 데이터 분석 실습
2021. 1. 3. 05:00ㆍPython과 머신러닝/MatPlotLib 데이터 시각화
0. 지난 포스트에 이어
- 지난 몇 차례의 포스트에 이어 MatPlotLib 그래프 꾸미기 실습을 진행할 예정이다.
- 통신 데이터를 기반으로 날짜별/통신사별 통신량을 분석하고자 한다.
- 우선은 데이터를 pandas로 읽어들이고 데이터 전처리를 하고 나면, 그때에야 비로소 MatPlotLib의 plot 기능을 사용할 수 있다.
- 지난 포스트들은 아래에 정리해두었다.
- 2020/12/31 - [Python과 머신러닝/MatPlotLib 데이터 시각화] - [Python.MatPlotLib] MatPlotLib으로 그래프 그리기, 시각화, subplot/axes, figure
- 2021/01/01 - [Python과 머신러닝/MatPlotLib 데이터 시각화] - [Python.MatPlotLib] 그래프 꾸미기 I - 색깔 / 제목 / 선형태 지정하기와 latex식 표현하기
- 2021/01/02 - [Python과 머신러닝/MatPlotLib 데이터 시각화] - [Python.MatPlotLib] 그래프 꾸미기 II - 범례(Legend) / X,Y축 Label, 텍스트 및 화살표 / grid / ylim/ savefig
1. 데이터 읽어들이기 및 분석하기
In [1]:%matplotlib notebook
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import wget
In [2]:url = 'https://www.shanelynn.ie/wp-content/uploads/2015/06/phone_data.csv'
wget.download(url)
df = pd.read_csv('./phone_data.csv')
df
Out[2]:
- 코드의 url에서 phone_data.csv를 읽어 들여서 'date' 데이터를 확인하니 날짜별이 아니라 시간 정보까지 있다.
- 대부분의 경우는 이와 같이 전처리가 필요하기 때문에, 'date' 데이터에서 날짜만 뽑아서 'day'라는 Series를 추가해보자.
2. 'date' Series에서 날짜 정보만 추출하여 새로운 'day' Series 만들기
In [3]:def parsedate(date_info):
import datetime
return date_info[:9]
In [4]:df['day'] = df['date'].map(parsedate)
df
Out[4]:
- 기존 C나 Java를 했다면, Loop를 돌면서 각 row에서 'date' 정보를 뽑아서 가공하고 싶은 마음이 든다.
- 하지만 pandas는 Series 전체를 가공할 수 있는 map함수를 제공하기 때문에, 이를 사용하는 것이 성능에 훨씬 유리하다.
- map에 대한 자세한 내용은 다음 포스트에서 정리했다 :
2020/12/19 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] Lambda함수와 Map함수 이해하기 - Series.map
- 결론적으로 In[4]가 하는 동작은, df['date']로부터 앞의 9개의 character를 뽑아서, df['day']라는 Series에 담는 것이다.
- 그 결과 Out[4]에서 날짜 데이터만 추출된 'day' Series가 최우측에 추가된 것을 확인할 수 있다.
3. .groupby로 데이터 가공하기
In [5]:result = df.groupby(['network', 'day'])['duration'].sum().reset_index()
result.head()
Out[5]:
In [6]:result[result['network']=='Vodafone'].head()
Out[6]:
In [7]:network_list = result['network'].unique().tolist()
network_list
Out[7]:['Meteor',
'Tesco',
'Three',
'Vodafone',
'data',
'landline',
'special',
'voicemail',
'world']
- In[5]를 통해 network별 day별 통신량('duration')의 합을 구해보면 Out[5] 처럼 각각의 network/day별 통신량을 확인할 수 있다.
- In[6]를 통해 특정 network(Vodafone)의 통신량도 잘 계산되었는지 확인할 수 있다.
- 그렇다면 이제는 각각의 network를 plot을 해야 하니, network가 몇 개 있는지 확인해야 한다.
- 이를 In[7]에서 하고 있다. network의 unique 한 list를 확인해보니, 총 9개의 통신사가 있다는 것을 확인했다.
- 하나의 Figure에 9개의 데이터를 표현할 방법이 다양하지만, 이번 실습에서는 3x3 axes로 표현해보려고 한다.
4. 3x3 axes로 9개의 통신사별 통신 데이터 표현하기
In [8]:fig = plt.figure(figsize=(10,10)) #10inchx10inch 의 figure(도화지 한 장)를 새로 꺼낸다.
total_ax_count = len(network_list) # 총 axes는 9개로 지정한다.
ax = [] #각각의 axis를 담아둘 list를 지정한다.
for i in range(total_ax_count): #9개를 loop을 돌며
ax.append(fig.add_subplot(3,3,i+1)) #전체 도화지를 3x3이라고 여겼을때, 1~9번까지의 index를 지정해준다.
network_name = network_list[i] #현재 통신사 명을 network_name 변수에 담는다.
plt.title(network_name) #현 axis의 title을 통신사명으로 지정하고
X = result[result['network'] == network_name]['day'] # X값은 통신사의 날짜 데이터
Y = result[result['network'] == network_name]['duration'] # Y값은 통신사의 통신량 데이터로 지정한다
ax[i].get_xaxis().set_visible(False) # 9개의 axes를 그리다보니 X축의 데이터와 title이 겹쳐져서 가독성이 떨어진다. x-axis를 없애기 위한 코드이다.
ax[i].plot(X,Y) # X,Y값을 그려준다.
Out[8]:
- In[8] 코드는 오히려 작성하고 보니 더 복잡해 보이는데, 한 줄씩 읽어보면 지난 포스트들에서 전부 정리한 내용이다.
- 핵심만 정리하면 이렇다.
- fig.add_subplot(3,3,i+1) : 전체 도화지를 3x3으로 지정하고, 현재 통신사는 i+1 위치에 그리겠다고 지정한다.
- plt.title(network_name) : 각 axis의 title을 통신사 명으로 지정한다.
- X = result[result['network'] == network_name]['day']
Y = result[result['network'] == network_name]['duration'] : X와 Y의 데이터를 지정한다. 날짜별 통신량을 그리고 싶으니 X는 날짜, Y는 통신량 데이터로 지정한다. - ax[i].plot(X,Y) : 통신사별로 X, Y 데이터를 추출하였으니, 이를 plot 해주면 끝이다.
- 각 line별로 자세한 설명은 주석으로 달았고, plot에 대한 기본 개념이 없다면 현 포스트 상단에 지난 포스트들의 링크들을 걸어놓았으니 참고하면 쉽게 이해가 가능하다.
- 지난 포스트에서 정리했듯, 각 그래프의 색깔을 지정할 수도 있고, 범례/margin 등도 설정이 가능하니, In[8]의 코드를 이해했다면 이 예제에서 다양한 설정 값으로 plot을 실습해보는 것이 plot을 익히는 데 가장 효과적인 방법이 될 것 같다.
'Python과 머신러닝 > MatPlotLib 데이터 시각화' 카테고리의 다른 글
[Python.MatPlotLib] Histogram과 Box Plot 그리기 (0) | 2021.01.05 |
---|---|
[Python.MatPlotLib] Scatter Plot 실습 (0) | 2021.01.04 |
[Python.MatPlotLib] 그래프 꾸미기 II - 범례(Legend) / X,Y축 Label, 텍스트 및 화살표 / grid / ylim/ savefig (0) | 2021.01.02 |
[Python.MatPlotLib] 그래프 꾸미기 I - 색깔 / 제목 / 선형태 지정하기와 latex식 표현하기 (0) | 2021.01.01 |
[Python.MatPlotLib] MatPlotLib으로 그래프 그리기, 시각화, subplot/axes, figure (0) | 2020.12.31 |