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
입력하면 되지만, 간혹 여러 환경에 따라 달라질 수 있으니 관련 싸이트에서 확인하기를 바란다.
- matplotlib 설치 방법: https://matplotlib.org/users/installing.html
- seaborn 설치 방법: https://seaborn.pydata.org/installing.html
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 Colab
과Google 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']
])
[1;30;43m스트리밍 출력 내용이 길어서 마지막 5000줄이 삭제되었습니다.[0m
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.