Ranking Whisky (theory)

I have been tasting whisky for a while, systematically, in order to make a (personal) ranking based on my preference and experience. How do I do it?

Head to head

I decided based on experience that tasting one whisky and giving it a score does not work for me. I can like something better one day and worse another day. And what I have eaten or drunk before matters much. The popular 1-100 scale (where 1-60 is rarely used at all) is not what I want to use.

Also based on experience, I find it very hard to compare 4-5 whiskies at the same time. I simply find it hard to keep them all in my head and make any sense of it.

So I decided that when I test whisky, and rank whisky, I drink them two and two, head to head. This is not so strange, it happens in many sports that two teams or players compete against each other, and in the end there is a ranking.

Many ranking systems (tennis) promote participation and punish absence. You can not be #1 in Tennis if you have not played a game in two years. However, for my purposes, if I find 5cl of an excellent whisky, it goes to the top and it should remain in the top. It is not supposed to get punished because I am out of it.

So I developed a ranking system based on the above principles and findings.

A strong assumption

Lets say I have three whiskies: Perth, Dundee and Stirling (I will use made up names for examples). I have tested twice:

  • Perth beats Dundee
  • Dundee beats Stirling

Is it then possible to make a third tasting and find that

  • Stirling beats Perth?
  • Dundee beats Perth?

In sports this can obviously happen. But I have decided that for my purposes this will never happen. How do I know? I simply never test two whiskies that already have a decided ranking order.

It is not obvious that this is a good (true) assumption. However, it is an assumption that has worked good for me – perhaps better than I expected from the beginning. However I have been making separate ranking lists for peated and unpeated whiskies.

Example

Perth beats Dundee, and we have:

  1. Perth
  2. Dundee

Dundee beats Stirling, and we have

  1. Perth
  2. Dundee
  3. Stirling

Glasgow beats Stirling and it gets more complicated

  1. Perth
  2. Dundee
  3. Glasgow (could have been #1 or #2, but keep close to Stirling)
  4. Stirling

Glasgow beats Perth, and we have

  1. Glasgow
  2. Perth
  3. Dundee
  4. Stirling

Glasgow beats Edinburgh, and Edinburgh beats Stirling, and we have

  1. Glasgow
  2. Perth
  3. Edinburgh (could have been – and can become – #2 or #4 – but keep it in the middle for now)
  4. Dundee
  5. Stirling

In principle, this is all there is to it. If I get a new cheap blend I probably try it against Stirling. If it loses to Stirling it is now #6. If it wins to Stirling I compare it against a better whisky “hoping” it will lose, and I get an interval. Lets say that Aberdeen beats Stirling and loses to Perth, I would get something like

  1. Glasgow
  2. Perth (could be anywhere from #2 to #4)
  3. Edinburgh (could be anywhere from #2 to #5)
  4. Dundee (could be anywhere from #3 to #5)
  5. Aberdeen (could be anywhere from #3 to #5)
  6. Stirling

This is a ranking based on the information I have. Aberdeen may beat Edinburgh, or not. At this point, this is far from obvious or trivial. If you look through the “tastings” above one by one you shall find that all the results are respected in the list. However, I have written a little computer program to help with the ranking.

Data and Code

The data of the above tastings is represented as JavaScript code as this (ignore price for now):

exports.whiskies = () => { return [{
   name  : 'Perth',  // 0
   win   : [1,5],
   price : 3.0
 },{
   name  : 'Dundee', // #1
   win   : [2],
   price : 2.0
 },{
   name  : 'Stirling', // #2
   win   : [],
   price : 2.5
 },{
   name  : 'Glasgow',  // #3
   win   : [0,2,4],
   price : 3.5
 },{
   name  : 'Edinburgh',  // #4
   win   : [2,5],
   price : 4.0
 },{
   name  : 'Aberdeen',  // #5
   win   : [2],
   price : 3.0
 }]};

This should be understood as (for example) Aberdeen is #5 in the list, it has beaten only one whisky, #2 Stirling. And if you browse through the data you can see that both Perth and Edinburgh has beaten #5 (Aberdeen). As I test more whiskies I just add them to the end of the list, and add more entries in the “win”-lists.

Let us say I get a great whisky, Port Ellen, I try it against the best of the list (Glasgow) and it wins. Then I add to the end of the list:

   name  : 'Port Ellen',  // #6
   win   : [3],
   price : 5.0

Get Ranking

I can run my program like this:

Documents/Programming/whisky$ node whisky.js example.js -r
   1   6-0      1-0       :2   100%  Port Ellen
   2   5-1      3-1      1:3   100%  Glasgow
   3   3-2      2-1      2:5    86%  Perth
   4   2-2      2-1      2:6    71%  Edinburgh
   5   1-3      1-1      3:7    71%  Dundee
   6   1-4      1-2      4:7    86%  Aberdeen
   7   0-6      0-4      6:    100%  Stirling

So the output columns are:

  1. Rank
  2. Extended won and lost tastings. Port Ellen has just beaten Glasgow. But Glasgow has beaten 5 whiskies (using the same extended logic), so Port Ellen is considered to have beaten all those 5 plus Glasgow, which makes it 6.
  3. Won and Lost tastings
  4. Nearest whiskies in the list that it has lost against and won against
  5. 100% means that it won and lost against it neighbors. A lower value means that the nearest winners and losers are more far away. So a low value is an indication that this whisky needs to be tested more.
  6. Name of whisky

Get Suggestions

The program can suggest what I should try next:

Documents/Programming/whisky$ node whisky.js example.js -s
Dundee     - Edinburgh   1 77%
Edinburgh  - Perth       1 66%
Aberdeen   - Dundee      1 66%

Without going into details, this indicates that testing Dundee vs Edinburgh will be the most useful thing to stabilize the list. As you see, even though Port Ellen is just tested once it gets no suggestions. It will remain like that until some (new, not on the list) whisky beats Glasgow. As long as I only test whiskies from this suggested list I will not end up with circles of A beats B beats C beats A.

Pricing

I do not consider price when I compare whiskies. Nevertheless it is interesting to compare value for money. How do you make sense of adding prices to a list of whiskies given different currencies, markets, stores, auction prices, bottling sizes and cask strength whiskies? Well, it is not going to be exact, but I came up with a Johnny Walker equivalent:

  1. Red Label
  2. Black Label
  3. Gold Label
  4. 18 YO (Platinum Label)
  5. Blue Label
  6. The most expensive whisky in my collection

So when set my price value (1.0 to 6.0) for any whisky, I try to compensate for ABV and bottle size, and then give it a price value from the table above. So if Black Label is $30 and Gold Label is $50, a $40 whisky will get a price of 2.5.

I can run my program:

Documents/Programming/whisky$ node whisky.js example.js -v
   1  1.303  3.500     75  Glasgow
   2  1.267  3.000     50  Perth
   3  1.167  2.000     30  Dundee
   4  1.143  5.000    200  Port Ellen
   5  0.917  4.000    100  Edinburgh
   6  0.767  3.000     50  Aberdeen
   7  0.667  2.500     40  Stirling

The columns are:

  1. Ranking in value for money
  2. A value for money quote
  3. The price value in JW-scale
  4. The price in $ based on the JS-scale
  5. Name of whisky

Finally I can do a price-quality-plot:

Documents/Programming/whisky$ node whisky.js example.js -c
 |                                         
 |                                         
 |                                        .
 |                                         
 |                                         
 |                    .                    
 |                                  .      
 |       .                   .             
 P .                                       
 R                                         
 I              .                          
 C                                         
 E                                         
 |                                         
 |                                         
  ===== QUALITY ==== correlation : 0.7373 ==================

This obviously makes more sense with more than 7 whiskies.

Code

For anyone interested in running this code themselves here are download links.

  • whisky.js (run this with node.js on the command line)
  • example.js (data file with above 7 fake whiskies)
  • peat.js (data file with my peated list 2021-05-01)
  • std.js (data file with my standard list 2021-05-01)

Do not expect my data files to be regularly updated. The price data is a quite new feature so some prices may be quite off and I am considering to remove prices entirely for whisky that can not be bought or where price is not known.

Final words

I keep working on the ranking (testing more whiskies) and sometimes improving the ranking program.

I am obviously thinking about making this available for other people (you) in a simple way. I am not sure how to do it though. I think it should be a web page. But I do not know if you should:

  • enter your tastings in my webpage and save it there
  • enter your tastings in an Excel-sheet or something, and upload it to my page just when you want to run it

Perhaps there is something even smarter?

Let me know if you would like me to make this available in some other way than just sharing the source code above (which obviously mostly appeals to programmers).

  1. Whisky Head to Head | TechFindings - pingback on 2021/05/01 at 13:29

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Time limit is exhausted. Please reload CAPTCHA.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Trackbacks and Pingbacks: