12 Jun 2013

Hvilken dag tvitrer du oftest på?

Jeg har brukt Twitter i over fem år (siden 2008) og det har blitt mange tweets i løpet av disse årene. Jeg har ikke full oversikt over hva jeg har tvitret ("Å tvitre" ble årets nyord i Norge i 2009), men i 2012 lanserte Twitter verktøyet for å laste ned hele Twitter-arkivet ditt.


Det var ikke før nylig at jeg tok den muligheten i bruk, men jeg fulgte henvisningen fra Twitter bloggen og fikk nedlastingslenken på e-post.
Slik fikk jeg altså alle tweetene mine i en CSV-fil. (Comma separert).

Filen inneholdt en del ekstra informasjon relatert til hver enkelt tweet, blant annet tidsstempel. Jeg brukte dette arkivet og skrev et Python script som tar CSV-filen som argument og spyr ut litt enkel statistikk. Her er det rom for mye forbedringer, men koden ser slik ut:

#!/usr/bin/env python
"""
    A python script that takes the Twitter archive export file as input
    and from it extract some usage statistics that might be useful.

        1. Request your Twitter archive here in your Twitter settings:
            - https://twitter.com/settings/account
        2. Once downloaded, store in the same folder as this script
        3. Run script like this: 
            $ python twitter_stat.py tweets.csv
    Written by Orjan Vollestad (orjanv@gmail.com)
"""
from __future__ import division
import csv
import datetime
import sys
import calendar
from collections import defaultdict
FILENAME = sys.argv[-1]


def csvtodict(_dict):
    """Function to convert CSV file from input to a Python dictionary"""
    with open(FILENAME) as _file:
        reader = csv.DictReader(_file)
        for row in reader:
            # Go over each column name and value
            for (keys, values) in row.items():
                _dict[keys].append(values)
    return _dict


def daycount(_dict):
    """Function to get count of tweets grouped on weekday"""
    weekdays = []
    for weekday in _dict['timestamp']:
        wdate = weekday[:10]
        date = datetime.datetime.strptime(wdate, '%Y-%m-%d')
        day = datetime.datetime.isoweekday(date)
        weekdays.append(day)

    # Build a dictionary to store the number of tweets per day
    daynumbers = {1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0}
    for day in range(1, 8):
        daynumbers[day] = weekdays.count(day)
    tday = maxdictvalue(daynumbers)-1
    print "You have tweeted most often on a %s" % (calendar.day_name[tday])
    

def generic_stat(_dict):
    """Function to generate some generic Twitter stats  """
    weekdays = []
    for weekday in _dict['timestamp']:
        day = weekday[:10]
        weekdays.append(day)
    date_first_tweet = datetime.datetime.strptime(weekdays[0], '%Y-%m-%d')
    date_last_tweet = datetime.datetime.strptime(weekdays[-1], '%Y-%m-%d')
    # Do some calculations
    twitter_length = date_first_tweet - date_last_tweet
    years, remainder = divmod(twitter_length.days, 365)
    average = len(weekdays) / twitter_length.days
    # Print the results
    print "You have been tweeting for %s years and %s day(s)" % \
        (years, remainder)
    print "Total number of tweets in archive: %s" % (len(weekdays))
    print "On an average, you have tweeted %.2f tweets each day" % \
        (round(average, 2))

    
def maxdictvalue(_dict):
    """Return key of dict that has the biggest value"""
    values = list(_dict.values())
    keys = list(_dict.keys())
    return keys[values.index(max(values))]


def main():
    # Create the dict with a list as value"""
    _dict = defaultdict(list)
    csvtodict(_dict)
    generic_stat(_dict)
    daycount(_dict)


if __name__ == "__main__":
    main()


Det er standardbibliotek som er brukt, så om du har installert Python skal du ikke trenge å hente inn flere. Jeg er ingen dyktig programmerer, og har akkurat begynt å se på Python som verktøy for å behandle data på mange ulike måter. Jeg ble nyskjerrig på hvilken dag jeg har tvitret oftest på i løpet av min tid som Twitter bruker og det fikk jeg svar på med koden min over: Tirsdag. Jeg fant også ut at jeg tvitrert i gjennomsnitt litt under 3 tweets daglig, noe som ikke er fryktelig mye tror jeg? 

"Surest sign of intelligence is curiosity" – Oliver Jeffries

Prøv selv og se hvilken dag du tvitrer oftest på og utvid gjerne koden til å finne andre interessante fakta og statistikker. 

Som sagt, det finnes mye rom for forbedringer i koden over som også ligger på Github.

9 Jun 2013

Hvor vanlig er din fødselsdag?

Inspirert av en artikkel og fargekart på io9 nylig, søkte jeg etter tilsvarende data for Norge på ssb.no.
Jeg fant følgende side og en rask behandling i LibreOffice med betingelsesformatering endte jeg opp med følgende fargekart:



Så, tallene om at 1. april og 1. juli er datoene det oftest fødes på i Norge. Det bekreftes visuelt her og vi ser det markert her med mørkest gråtone.

Jeg brukte en inndeling som følgende og endres bakgrunnsfarger med seks forskjellige gråtoner, hvor mørkest gråtone betyr større tallverdi. Fra lys til mørk:

00000-10000
10001-11000
11001-12000
12001-13000
13001-14000
14001-15000

Data fra SSB er datert 1. januar 2004 og samlet sum i matrisen er 4 577 457. Dette var på det tidspunktet antall mennesker i Norge, men i dag er vi passert 5 millioner (data fra 1. april 2013 morsomt nok), men trenden er nok den samme ennå vil jeg tro. 2004 er ganske lenge siden, kanskje SSB kunne publisert nyere data?