Inspiriert von Stephen Wolframs Blogbeitrag The Personal Analytics of My Life habe ich auch mal versucht, meinen Mailverkehr entsprechend darzustellen. Dazu verwende ich ein Python-Script, welches meine Thunderbird-Mailordner durchforstet, und GNU R, um die Graphiken zu plotten.

R installiert ihr per:

sudo apt-get install r-recommended

Python-Script

Meine Mailkonten sind IMAP-Konten, und diese verwalte ich mit Thunderbird. Ich habe ein Python-Script geschrieben, welches mir für jede Mail das Datum und die Uhrzeit herausfischt. So sieht es aus:

#!/usr/bin/python 
#------------------------------------------------------------------------------------------
#----- Ich mache ne Faxe wie hier:
#----- http://blog.stephenwolfram.com/2012/03/the-personal-analytics-of-my-life/
#------------------------------------------------------------------------------------------
import sys
import time
import datetime
from mailbox import mbox as MBox
from email.utils import parsedate
#---------------------------------
mailboxname = sys.argv[1] # z.B.("~/.thunderbird/foobar.default/ImapMail/imap.foo.bar/INBOX")
myfilename  = sys.argv[2] # Anhaengsel fuer Dateinamen
mbox = MBox(mailboxname)
ZIEL = ("MyMail-%s.txt") % (myfilename)
SCHREIB = open(ZIEL,"w")
#-----------------------------------
for msg in mbox:
  try:  # bei mir sind manche Mails kaputt, darum vorher testen... 
    maildate = time.strftime('%Y%m%d', parsedate(msg.get("date")))
    mailtime = time.strftime('%H%M%S', parsedate(msg.get("date")))
    print maildate, ",", mailtime
  except:
    SCHREIB.write(str('NA,NA\n')) # wenn kaputt, erzeuge NAs (missing values) fuer GNU_R
  else:
    SCHREIB.write(str("%s,%s\n") % (maildate, mailtime))
SCHREIB.close()
## END OF FILE

(für alle, bei denen der Quellcode nicht optimal dargestellt wird, gibt es alle Zeilen und Befehle in diesem Gist)

Dieses Script speichere ich unter dem Namen mailscanner.py an einen beliebigen Ort, und mache es ausführbar. Aufgerufen wird das Script in einem Terminal mit folgender Notation:

/Pfad/zu/mailscanner.py MAILBOX LABEL

Hierbei muss MAILBOX durch den Pfad zur Thunderbird-Datei der gewünschten Box (siehe weiter unten), und LABEL durch einen Dateinamenszustz ersetzt werden. Aber dazu später mehr…

Thunderbird Maildatei

In einem Terminal wechsel ich in mein Thunderbird-IMAP-Verzeichnis:

cd ~/thunderbird/PROFILNAME.default/ImapMail/imap.produnis.de

Hier interessiert mich die Datei “INBOX” (ohne Suffix!). Ich rufe nun mein Python-Script auf:

/Pfad/zu/mailscanner.py INBOX inbox

Dies erzeugt mir im selben Verzeichnis eine Textdatei mit dem Namen MyMail-inbox.txt. In dieser Datei wurden Datum und Uhrzeit aller Mails, die sich in INBOX befinden, übertragen, zB:

20120425 , 1445

Über diese Texttabelle kommt das Statistikprogramm R an unsere Maildaten.

Diesen Vorgang könnt ihr nun für alle IMAP-Ordner (z.B. Gesendet, Arbeit, Privat, oder was ihr halt so für Ordner habt) wiederholen.

R

Ihr startet R über ein Terminal, indem ihr dort “R” eingebt:

R

Jetzt werden die Texttabellen wie folgt in R eingelesen:

inbox <- read.table("/Pfad/zu/MyMail-inbox.txt", sep=",", colClasses = "character") # Tabelle einlesen
colnames(inbox) <- c("Datum","Uhrzeit") # Tabellenspalten benennen
inbox$Datum <- strptime(inbox$Datum,format="%Y%m%d") # Daten in DATUM
inbox$Uhrzeit <- strptime(inbox$Uhrzeit, format="%H%M%S") # Daten in UHRZEIT
plot(inbox$Datum, inbox$Uhrzeit) # Daten grafisch anzeigen

Weitere Mailordner könnt ihr wie folgt in das bestehende Plotfenster integrieren:

test <- read.table("/Pfad/zu/MyMail-outbox.txt", sep=",", colClasses = "character") # neue Tabelle einlesen
colnames(test) <- c("Datum","Uhrzeit")
test$Datum <- strptime(test$Datum,format="%Y%m%d")
test$Uhrzeit <- strptime(test$Uhrzeit, format="%H%M%S")
points(test$Datum, test$Uhrzeit) # weitere Daten dem Plot hinzufügen

Bei mir sieht das dann zB so aus:

Deutlich zu erkenne ist die “heiße Phase” unseres Forschungsprojekts, und dass es nach dessen Abschluss wieder ruhiger zugeht… ;)

Weiter hab ich noch nicht rumgewurschtelt, aber an sich ist das ne lustige Spielerei für nebenher. Weiterer R-Code und Krams ist herzlich willkommen. Ach, und wer möchte, kann mit meinen Beispieldaten spielen. Hierfür genügt in R der Befehl:

produnis <- read.table("http://www.produnis.de/nagut/GESAMTLISTE.TXT", sep=",", colClasses = "character") # Tabelle aus dem Internet laden

Hier noch ein R-Befehl, der jeweils die Gesamtzahl der Mails aus diesem Datensatz pro Tag anzeigt:

produnis <- read.table("http://www.produnis.de/nagut/GESAMTLISTE.TXT", sep=",") # Tabelle aus dem Internet laden
colnames(produnis) <- c("Datum","Uhrzeit")
produnis <- produnis[-19180,] # Ausreißer entfernen
plot(strptime(levels(as.factor(produnis$Datum)),format="%Y%m%d"),as.vector(table(as.factor(produnis$Datum))),type="l")

Das sieht dann so aus:

…..

Diese und weitere Codeschnipsel stelle ich auf https://gist.github.com/3004221 zusammen. Das Auslesen meiner Kalendertermine habe ich hier beschrieben.