WhatfettleOne CSV, thirty stories: 3. Minimal viable histograms

This is day 3 of One CSV, 30 stories a series of articles exploring price paid data from the Land Registry found on GOV.UK. The code for this and the other articles is available as open source from GitHub

Yesterday we counted the occurrence of values in each column and made some frequency data. Processing the files and writing up the findings took me a bit longer than I’d have liked. Today I’ve a seat on the train and aim to use my commute home to timebox some quick and dirty histograms. These are a cinch in awk for anyone who grew up playing with BASIC which in my case involved chewing up rolls of paper on my VI form college’s teletype link to a Univac 1100/60 in Teesside Polytechnic:

$ head -25 price.tsv | awk 'NR == 1 {
    width = 60
    max = $1;
}
{
    title = $2;
    size = width * ($1 / max);
    bar = "";
    for (i = 0; i < size; i++)
        bar = bar"#";
    count = sprintf("(%d)", $1);
    printf "%-10s %10s %s\n", title, count, bar;
}'

which gives:

250000            (208199) #################################################################
125000            (185912) ###########################################################
120000            (163323) ###################################################
60000             (159519) ##################################################
110000            (147645) ###############################################
150000            (145214) ##############################################
115000            (140833) ############################################
135000            (134731) ###########################################
175000            (131334) ##########################################
85000             (131223) #########################################
130000            (129597) #########################################
105000            (129336) #########################################
165000            (126161) ########################################
95000             (126004) ########################################
145000            (124379) #######################################
75000             (123968) #######################################
140000            (123893) #######################################
160000            (123451) #######################################
90000             (123340) #######################################
100000            (120306) ######################################
80000             (119776) ######################################
155000            (115309) ####################################
185000            (111410) ###################################
180000            (111090) ###################################
65000             (109939) ###################################

Putting this awk script into it’s own file histogram.awk gives us a command we can use again and again, allowing us to compare new versus old builds:

$ bin/histogram.awk < data/new.tsv
N               (17351417) ############################################################
Y                (1974154) #######

freehold (F) versus leaseholds (L) versus uncategorised (U):

$ head -10 data/duration.tsv | bin/histogram.awk 
F               (14871813) #################################################################
L                (4450166) ####################
U                   (3592) #

and the distribution of prices paid is a typical long-tail:

$ head -80 data/price.tsv | bin/histogram.awk 
250000            (208199) #################################################################
125000            (185912) ###########################################################
120000            (163323) ###################################################
60000             (159519) ##################################################
110000            (147645) ###############################################
150000            (145214) ##############################################
115000            (140833) ############################################
135000            (134731) ###########################################
175000            (131334) ##########################################
85000             (131223) #########################################
130000            (129597) #########################################
105000            (129336) #########################################
165000            (126161) ########################################
95000             (126004) ########################################
145000            (124379) #######################################
75000             (123968) #######################################
140000            (123893) #######################################
160000            (123451) #######################################
90000             (123340) #######################################
100000            (120306) ######################################
80000             (119776) ######################################
155000            (115309) ####################################
185000            (111410) ###################################
180000            (111090) ###################################
65000             (109939) ###################################
170000            (109751) ###################################
70000             (106529) ##################################
55000             (103816) #################################
200000            (100245) ################################
50000              (98030) ###############################
210000             (96644) ###############################
195000             (96202) ###############################
190000             (95358) ##############################
220000             (94951) ##############################
225000             (94851) ##############################
45000              (94356) ##############################
40000              (88038) ############################
215000             (85757) ###########################
230000             (82970) ##########################
245000             (82390) ##########################
235000             (79704) #########################
240000             (78959) #########################
205000             (76377) ########################
59950              (75494) ########################
35000              (70778) #######################
58000              (65743) #####################
30000              (64087) #####################
52000              (63009) ####################
68000              (61675) ####################
275000             (60762) ###################
78000              (60281) ###################
249950             (60125) ###################
72000              (58979) ###################
42000              (58826) ###################
48000              (58184) ###################
59000              (57247) ##################
57000              (56613) ##################
54000              (56264) ##################
118000             (56147) ##################
82000              (55993) ##################
56000              (55033) ##################
53000              (55025) ##################
38000              (54752) ##################
67000              (52000) #################
87000              (51853) #################
112000             (51682) #################
285000             (51649) #################
92000              (51467) #################
88000              (51394) #################
300000             (51274) #################
46000              (51099) ################
280000             (50749) ################
84000              (49414) ################
43000              (49405) ################
47000              (49340) ################
64000              (49208) ################
83000              (49149) ################
74000              (48966) ################
73000              (48934) ################
270000             (48631) ################

Streets are something worth exploring another day, there’s real history in them names:

$ head -20 street.tsv  | ../bin/histogram.awk 
                  (284236) #################################################################
HIGH STREET       (111407) ##########################
STATION ROAD       (61918) ###############
LONDON ROAD        (41652) ##########
CHURCH ROAD        (35596) #########
CHURCH STREET      (35022) #########
MAIN STREET        (34270) ########
PARK ROAD          (29846) #######
VICTORIA ROAD      (25819) ######
CHURCH LANE        (23414) ######
QUEENS ROAD        (21434) #####
NEW ROAD           (21423) #####
MAIN ROAD          (21308) #####
MANOR ROAD         (21069) #####
THE STREET         (21068) #####
WEST STREET        (17359) ####
GREEN LANE         (17231) ####
MILL LANE          (16908) ####
THE GREEN          (16886) ####
THE AVENUE         (16853) ####

and the other address fields are something we also need to dig into further because they’re pretty inconsistent. I assume that’s due to the longevity of this data, and differences in how the data is recorded by different people over the years:

$ head -10 data/locality.tsv | bin/histogram.awk
                 (4354411) #################################################################
LONDON            (915332) ##############
BIRMINGHAM        (112836) ##
MANCHESTER        (102982) ##
LIVERPOOL         (101127) ##
LEEDS              (90163) ##
BRISTOL            (89995) ##
SHEFFIELD          (77372) ##
BOURNEMOUTH        (61337) #
SOUTHAMPTON        (57342) #
$ head -10 town.tsv  | ../bin/histogram.awk
LONDON           (1499904) #################################################################
MANCHESTER        (312555) ##############
BRISTOL           (296232) #############
BIRMINGHAM        (285479) #############
NOTTINGHAM        (251575) ###########
LEEDS             (217870) ##########
LIVERPOOL         (190190) #########
SHEFFIELD         (183048) ########
LEICESTER         (169283) ########
SOUTHAMPTON       (161070) #######
$ head -10 district.tsv  | ../bin/histogram.awk
BIRMINGHAM        (287828) #################################################################
LEEDS             (257632) ###########################################################
BRADFORD          (173120) ########################################
SHEFFIELD         (155900) ####################################
MANCHESTER        (154451) ###################################
CITY OF BRISTOL   (149031) ##################################
WANDSWORTH        (134851) ###############################
KIRKLEES          (131368) ##############################
LIVERPOOL         (126932) #############################
EAST RIDING OF YO (125271) #############################
$ head -10 county.tsv  | ../bin/histogram.awk 
GREATER LONDON   (2520251) #################################################################
GREATER MANCHESTE (843778) ######################
WEST MIDLANDS     (739206) ####################
WEST YORKSHIRE    (733941) ###################
KENT              (544938) ###############
ESSEX             (544377) ###############
HAMPSHIRE         (516377) ##############
SURREY            (450990) ############
LANCASHIRE        (435968) ############
HERTFORDSHIRE     (426834) ############

Time’s up! Tomorrow we should make some timelines and dig more deeply into those prices.