EDA with Personal Email - Data Import

Page content

강의 홍보

공지

제 수업을 듣는 사람들이 계속적으로 실습할 수 있도록 강의 파일을 만들었습니다. 늘 도움이 되기를 바라며. 참고했던 교재 및 Reference는 꼭 확인하셔서 교재 구매 또는 관련 Reference를 확인하시기를 바랍니다.

I. Matplotlib & Seaborn

(1) 기본 개요

Matplotlib는 파이썬 표준 시각화 도구라고 불리워지며 파이썬 그래프의 기본 토대가 된다고 해도 무방하다. 객체지향 프로그래밍을 지원하므로 세세하게 꾸밀 수 있다.

Seaborn 그래는 파이썬 시각화 도구의 고급 버전이다. Matplotlib에 비해 비교적 단순한 인터페이스를 제공하기 때문에 초보자도 어렵지 않게 배울 수 있다.

(2) matplotlib & Seabon 설치

설치방법은 윈도우 명령 프롬프트, MacOS, Linux 터미널에서 pip install matplotlib입력하면 되지만, 간혹 여러 환경에 따라 달라질 수 있으니 관련 싸이트에서 확인하기를 바란다.

II. Loading the dataset

III. Technical Requirements

  • 본 데이터셋은 개인 Gmail 계정에서 가져온 이메일 데이터를 활용한다.
  • 개인 정보 보호 문제로 인해 데이터셋은 공유가 되지 않기에 데이터를 다룰 때 조심하시기를 바라며, 또한 관련 데이터 중 민감한 데이터를 직접 처리하는 것을 추천한다.
  • 이 장에서는 Gmail에서 직접 이메일을 다운로드하여 초기 데이터 분석을 수행하는 방법을 안내한다.

(Basic) 기본 패키지 설치

  • 주요 패키지를 설치한다.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

(2) 구글 드라이브에서 데이터 가져오기

  • 먼저 Google ColabGoogle Drive를 연동하는 작업부터 진행한다.
# Google Drive와 마운트
from google.colab import drive
ROOT = '/content/drive'
drive.mount(ROOT)
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
  • 연동이 완료되면 업로드 한 데이터셋이 있는 곳으로 이동한다.
    • PROJECT_PATH 지정하는 방법을 사용한다.
    • 아래 코드는 Linux 시스템에서 사용할 때도 매우 유용하기 때문에 꼭 참고하기를 바란다.
from os.path import join  

MY_GOOGLE_DRIVE_PATH = 'My Drive/Colab Notebooks/python_edu/05_miniProject'
PROJECT_PATH = join(ROOT, MY_GOOGLE_DRIVE_PATH)
print(PROJECT_PATH)
/content/drive/My Drive/Colab Notebooks/python_edu/05_miniProject
%cd "{PROJECT_PATH}"
/content/drive/My Drive/Colab Notebooks/python_edu/05_miniProject
  • 본인의 프로젝트로 이동이 완료된 이후에는 mail 데이터를 수집한다.
import mailbox
mboxfile = 'Mail/All mail Including Spam and Trash.mbox'
mbox = mailbox.mbox(mboxfile)
mbox
<mailbox.mbox at 0x7f113547ecf8>
  • 정상적으로 데이터가 불러온 것을 확인할 수 있다. 실제 어떤 keys들이 있는지 확인해보자.
mylist = []
for key in mbox[0].keys():
  mylist.append(key)
mylist
['X-GM-THRID',
 'X-Gmail-Labels',
 'Delivered-To',
 'Received',
 'X-Received',
 'ARC-Seal',
 'ARC-Message-Signature',
 'ARC-Authentication-Results',
 'Return-Path',
 'Received',
 'Received-SPF',
 'Authentication-Results',
 'DKIM-Signature',
 'X-Google-DKIM-Signature',
 'X-Gm-Message-State',
 'X-Google-Smtp-Source',
 'MIME-Version',
 'X-Received',
 'Date',
 'List-Id',
 'List-Unsubscribe',
 'Message-ID',
 'Subject',
 'From',
 'To',
 'Content-Type']

(3) Data Cleansing

  • 아쉽지만, .mbox 형태의 데이터를 바로 데이터프레임으로 지원하는 함수는 아직 pandas에는 없다. 그럼 어떻게 할까?
  • csv를 활용하는 방법이다.
    • 첫째, empty csv 파일을 만든다.
    • 둘째, 모든 데이터는 사실 필요가 없기 때문에 특정 column만 넣는다.
      • subject, from, date, to, label, thread의 데이터만 추가한다.
      • 각 개인의 메일 용량에 따라 달라지겠지만, For-loop가 3000이 돌면 종료시키기로 했다. (생각보다 오래 걸려서, 중간에 중단했다.)
#use a for loop over a collection
Months = ["Jan","Feb","Mar","April","May","June"]
for i, m in enumerate (Months[:3]):
	print(i,m)
0 Jan
1 Feb
2 Mar
%%timeit
import csv

with open('mailbox.csv', 'w') as outputfile:
  writer = csv.writer(outputfile)
  writer.writerow(['subject', 'from', 'date', 'to', 'label', 'thread'])
  for i, message in enumerate(mbox):
    print(i)
    if(i==3000): break
    writer.writerow([
        message['subject'], 
        message['from'], 
        message['date'], 
        message['to'], 
        message['X-Gmail-Lables'], 
        message['X-GM-THRID']
      ])
스트리밍 출력 내용이 길어서 마지막 5000줄이 삭제되었습니다.
1
2
3
.
.
.
3000
1 loop, best of 3: 21.1 s per loop
  • 먼저 with 구문은 csv파일을 생성하겠다는 소스코드다.
  • writer.wrietrow는 각 csv파일에 어떤 데이터를 추가할 것인지에 관한 내용이다.
!ls
01_eda_with_personal_email_overview.ipynb    Mail
02_eda_with_personal_email_dataImport.ipynb  mailbox.csv
  • 현재 경로에서 mailbox.csv가 있다면 정상적으로 데이터가 csv파일로 변환된 것이다.

(4) CSV 파일 불러오기

  • 이제 익숙한 csv파일을 판다스 패키지를 활용해서 데이터를 불러오도록 한다.
  • 이 때, csv파일에는 컬럼명이 없기 때문에 컬럼명을 넣도록 한다.
from IPython.core.display import display, HTML

mail_df = pd.read_csv('mailbox.csv')
display(HTML(mail_df.head().to_html()))
subject from date to label thread
0 Google Alert - google cloud platform Google Alerts <googlealerts-noreply@google.com> Wed, 27 May 2020 23:07:57 -0700 your_email@gmail.com NaN 1667913302368145359
1 =?UTF-8?B?W+uniOqwkOyehOuwlV0g7LWc6re8IOygleyngO2biOuLmOydmCDtmZzrj5kg67aE7ISd7Jy8?=\r\n\t=?UTF-8?B?66GcICjso7wp7ISc7JaR64Sk7Yq47JuN7IqkIOyxhOyaqSDqs7Xqs6DqsIAg66ek7Lmt65CY?=\r\n\t=?UTF-8?B?7JeI7Iq164uI64ukLg==?= "=?UTF-8?B?7IKs656M7J24IHwg7LaU7LKc?=" <avatar_matching@mailinfo.saramin.co.kr> Wed, 27 May 2020 16:01:54 +0900 "=?UTF-8?B?7KCV7KeA7ZuI64uY?=" <your_email@gmail.com> NaN 1667826098560542213
2 Congratulations on your 10885th Mention! "": 43 new mentions,\r\n including one in a Surgery paper "Academia.edu" <premium@academia-mail.com> Thu, 28 May 2020 07:02:26 +0000 your_email@gmail.com NaN 1667916730021083623
3 Google Alert - google cloud platform Google Alerts <googlealerts-noreply@google.com> Tue, 26 May 2020 23:04:44 -0700 your_email@gmail.com NaN 1667822503397178820
4 =?euc-kr?B?W8DMt8K8rSC/rbb3XSCi37Hbt865+r7GwMzGvMGkurix4rz6LCCx4r73waS6uLimIMiuwM7H2Lq4vLy/5C4=?= =?euc-kr?B?wOLE2riuvsY=?=<helpdesk@jobkorea.co.kr> Wed, 27 May 2020 11:32:10 +0900 =?euc-kr?B?waTB9sjG?=<your_email@gmail.com> NaN 1667809137307012300
  • 여기까지 정상적으로 출력이 된다면 데이터 수집은 완료가 된 것이다.

IV. What’s Next

  • 위 데이터는 총 3000개의 데이터만 수집한 것이었고, 생각보다 오래 걸리지 않았다.
  • 그러나, 보는 것처럼 몇몇 이슈가 존재한다.
  • 드디어 본격적인 데이터 전처리를 진행하도록 하자.

IV. Reference

Mukhiya, Uuresh Kumar. Ahmed Usman. Hands-on Exploratory Data Analysis With Python: Perform EDA Techniques to understand, Summarize, and Investigate Your Data. Packt publishing limited, 2020.