[Python.MatPlotLib] 그래프 꾸미기 III - 통신 데이터 분석 실습

2021. 1. 3. 05:00Python과 머신러닝/MatPlotLib 데이터 시각화

0. 지난 포스트에 이어

 

[Python.MatPlotLib] MatPlotLib으로 그래프 그리기, 시각화, subplot/axes, figure

1. MatPlotLib .plot 함수를 사용하여 데이터 시각화하기 In [1]:%matplotlib notebook import numpy as np import matplotlib.pyplot as plt In [2]:X = range(100) Y = range(100) In [3]:fig1 = plt.figure() p..

coding-grandpa.tistory.com

 

[Python.MatPlotLib] 그래프 꾸미기 I - 색깔 / 제목 / 선형태 지정하기와 latex식 표현하기

1. 실제 데이터를 기반으로 plot 그리기 In [1]:%matplotlib notebook import numpy as np import pandas as pd import matplotlib.pyplot as plt In [2]:df = pd.read_csv("./phone_data.csv") df.head() Out[2]:..

coding-grandpa.tistory.com

 

[Python.MatPlotLib] 그래프 꾸미기 II - 범례(Legend) / X,Y축 Label, 텍스트 및 화살표 / grid / ylim/ savefig

1. 지난 포스트에 이어 지난 포스트에서 MatPlotLib 기초와 그래프 꾸미기 1을 정리했다. 여기서 사용되는 phone_data.csv를 인터넷에서 다운로드하여 사용하는 코드도 다른 포스트에서 정리하여 함께

coding-grandpa.tistory.com

 

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]:

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]:

Out[4]

 

[Python.Pandas] Lambda함수와 Map함수 이해하기 - Series.map

1. Lambda란? In [1]:def f1(x,y): return x+y In [2]:f1(1,2) Out[2]:3 In [3]:f2=lambda x,y:x+y In [4]:f2(1,2) Out[4]:3 Lambda란 함수를 한 줄로 표현하는 익명 함수 기법이다. lisp 언어에서 시작된 기법으..

coding-grandpa.tistory.com

  • 결론적으로 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]:

Out[5]

In [6]:result[result['network']=='Vodafone'].head()
Out[6]:

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]:

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을 익히는 데 가장 효과적인 방법이 될 것 같다.
반응형