<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>Random actuarial/R related posts, updated very infrequently.
&amp;ltemail at mattmalin.co.uk&amp;gt
Google</description><title>Actuarially (Matt Malin)</title><generator>Tumblr (3.0; @actuarially)</generator><link>http://www.actuarially.co.uk/</link><item><title>R-bloggers</title><description>&lt;p&gt;Just a random post to suggest to all to use R-bloggers: &lt;a href="http://www.r-bloggers.com"&gt;http://www.r-bloggers.com&lt;/a&gt; as a useful source of R related news and tips, etc, a site aggregating many of the main R related blogs on the web.&lt;/p&gt;</description><link>http://www.actuarially.co.uk/post/28836301662</link><guid>http://www.actuarially.co.uk/post/28836301662</guid><pubDate>Mon, 06 Aug 2012 15:21:00 +0100</pubDate><category>actuarially</category></item><item><title>2012 Olympics Swimming - 100m Butterfly Men Finals prediction</title><description>&lt;h1 id="olympics-swimming---100m-butterfly-men-finals-prediction"&gt;2012 Olympics Swimming - 100m Butterfly Men Finals prediction&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Author: Matt Malin&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Inspired by &lt;a href="http://lamages.blogspot.co.uk/2012/07/london-olympics-and-prediction-for-100m.html"&gt;mages&amp;#8217; blog&lt;/a&gt; with predictions for 100m running times, I&amp;#8217;ve decided to perform some basic modelling (loess and linear modelling) on previous Olympic results for the 100m Butterfly Men&amp;#8217;s medal winning results.&lt;/p&gt;
&lt;h2 id="code-setup"&gt;Code setup&lt;/h2&gt;
&lt;pre class="sourceCode r"&gt;&lt;code class="sourceCode r"&gt;&lt;span class="kw"&gt;library&lt;/span&gt;(XML)
&lt;span class="kw"&gt;library&lt;/span&gt;(ggplot2)

swimming_path &amp;lt;- &lt;span class="st"&gt;"http://www.databasesports.com/olympics/sport/sportevent.htm?sp=SWI&amp;amp;enum=200"&lt;/span&gt;

swimming_data &amp;lt;- &lt;span class="kw"&gt;readHTMLTable&lt;/span&gt;(
  &lt;span class="kw"&gt;readLines&lt;/span&gt;(swimming_path), 
  &lt;span class="dt"&gt;which =&lt;/span&gt; &lt;span class="dv"&gt;3&lt;/span&gt;, 
  &lt;span class="dt"&gt;stringsAsFactors =&lt;/span&gt; &lt;span class="ot"&gt;FALSE&lt;/span&gt;)

&lt;span class="co"&gt;# due to some potential errors in passing header = TRUE:&lt;/span&gt;
&lt;span class="kw"&gt;names&lt;/span&gt;(swimming_data) &amp;lt;- swimming_data[&lt;span class="dv"&gt;1&lt;/span&gt;, ]
swimming_data &amp;lt;- swimming_data[-&lt;span class="dv"&gt;1&lt;/span&gt;, ]

swimming_data[[&lt;span class="st"&gt;"Result"&lt;/span&gt;]] &amp;lt;- &lt;span class="kw"&gt;as.numeric&lt;/span&gt;(swimming_data[[&lt;span class="st"&gt;"Result"&lt;/span&gt;]])
swimming_data[[&lt;span class="st"&gt;"Year"&lt;/span&gt;]]   &amp;lt;- &lt;span class="kw"&gt;as.numeric&lt;/span&gt;(swimming_data[[&lt;span class="st"&gt;"Year"&lt;/span&gt;]])
swimming_data             &amp;lt;- &lt;span class="kw"&gt;na.omit&lt;/span&gt;(swimming_data)

loess_prediction &amp;lt;- function(
  &lt;span class="dt"&gt;medal_type =&lt;/span&gt; &lt;span class="st"&gt;"GOLD"&lt;/span&gt;, 
  &lt;span class="dt"&gt;prediction_year =&lt;/span&gt; &lt;span class="dv"&gt;2012&lt;/span&gt;) 
{
  medal_type &amp;lt;- &lt;span class="kw"&gt;toupper&lt;/span&gt;(medal_type)
 
 swimming_loess &amp;lt;- &lt;span class="kw"&gt;loess&lt;/span&gt;(
    Result ~ Year, 
    &lt;span class="kw"&gt;subset&lt;/span&gt;(swimming_data, Medal == medal_type),
    &lt;span class="dt"&gt;control =&lt;/span&gt; &lt;span class="kw"&gt;loess.control&lt;/span&gt;(&lt;span class="dt"&gt;surface =&lt;/span&gt; &lt;span class="st"&gt;"direct"&lt;/span&gt;))
  
  swimming_prediction &amp;lt;- &lt;span class="kw"&gt;predict&lt;/span&gt;(
    swimming_loess, 
    &lt;span class="kw"&gt;data.frame&lt;/span&gt;(&lt;span class="dt"&gt;Year =&lt;/span&gt; prediction_year), 
    &lt;span class="dt"&gt;se =&lt;/span&gt; &lt;span class="ot"&gt;FALSE&lt;/span&gt;)

  &lt;span class="kw"&gt;return&lt;/span&gt;(swimming_prediction)
}

log_lm_prediction &amp;lt;- function(
  &lt;span class="dt"&gt;medal_type =&lt;/span&gt; &lt;span class="st"&gt;"GOLD"&lt;/span&gt;, 
  &lt;span class="dt"&gt;prediction_year =&lt;/span&gt; &lt;span class="dv"&gt;2012&lt;/span&gt;) 
{
  medal_type &amp;lt;- &lt;span class="kw"&gt;toupper&lt;/span&gt;(medal_type)
  swimming_log_lm &amp;lt;- &lt;span class="kw"&gt;lm&lt;/span&gt;(
    &lt;span class="kw"&gt;log&lt;/span&gt;(Result) ~ Year, 
    &lt;span class="kw"&gt;subset&lt;/span&gt;(swimming_data, Medal == medal_type))
  
  swimming_prediction &amp;lt;- &lt;span class="kw"&gt;exp&lt;/span&gt;(&lt;span class="kw"&gt;predict&lt;/span&gt;(
    swimming_log_lm, 
    &lt;span class="kw"&gt;data.frame&lt;/span&gt;(&lt;span class="dt"&gt;Year =&lt;/span&gt; prediction_year), 
    &lt;span class="dt"&gt;se =&lt;/span&gt; &lt;span class="ot"&gt;FALSE&lt;/span&gt;))

  &lt;span class="kw"&gt;return&lt;/span&gt;(swimming_prediction)
}

swimming_data &amp;lt;- &lt;span class="kw"&gt;rbind&lt;/span&gt;(
  &lt;span class="kw"&gt;data.frame&lt;/span&gt;(
    swimming_data[&lt;span class="kw"&gt;c&lt;/span&gt;(&lt;span class="st"&gt;"Year"&lt;/span&gt;, &lt;span class="st"&gt;"Medal"&lt;/span&gt;, &lt;span class="st"&gt;"Result"&lt;/span&gt;)], 
    &lt;span class="dt"&gt;type =&lt;/span&gt; &lt;span class="st"&gt;"actual"&lt;/span&gt;),
  &lt;span class="kw"&gt;data.frame&lt;/span&gt;(
    &lt;span class="dt"&gt;Year =&lt;/span&gt; &lt;span class="kw"&gt;rep&lt;/span&gt;(&lt;span class="dv"&gt;2012&lt;/span&gt;, &lt;span class="dv"&gt;3&lt;/span&gt;),
    &lt;span class="dt"&gt;Medal =&lt;/span&gt; &lt;span class="kw"&gt;c&lt;/span&gt;(&lt;span class="st"&gt;"GOLD"&lt;/span&gt;, &lt;span class="st"&gt;"SILVER"&lt;/span&gt;, &lt;span class="st"&gt;"BRONZE"&lt;/span&gt;),
    &lt;span class="dt"&gt;Result =&lt;/span&gt; &lt;span class="kw"&gt;c&lt;/span&gt;(
      &lt;span class="kw"&gt;loess_prediction&lt;/span&gt;(&lt;span class="st"&gt;"gold"&lt;/span&gt;), 
      &lt;span class="kw"&gt;loess_prediction&lt;/span&gt;(&lt;span class="st"&gt;"silver"&lt;/span&gt;),
      &lt;span class="kw"&gt;loess_prediction&lt;/span&gt;(&lt;span class="st"&gt;"bronze"&lt;/span&gt;)),
    &lt;span class="dt"&gt;type =&lt;/span&gt; &lt;span class="kw"&gt;rep&lt;/span&gt;(&lt;span class="st"&gt;"loess_prediction"&lt;/span&gt;, &lt;span class="dv"&gt;3&lt;/span&gt;)))

medal_colours &amp;lt;- &lt;span class="kw"&gt;c&lt;/span&gt;(
  &lt;span class="dt"&gt;GOLD   =&lt;/span&gt; &lt;span class="kw"&gt;rgb&lt;/span&gt;(&lt;span class="dv"&gt;201&lt;/span&gt;, &lt;span class="dv"&gt;137&lt;/span&gt;, &lt;span class="dv"&gt;16&lt;/span&gt;, &lt;span class="dt"&gt;maxColorValue =&lt;/span&gt; &lt;span class="dv"&gt;255&lt;/span&gt;),
  &lt;span class="dt"&gt;SILVER =&lt;/span&gt; &lt;span class="kw"&gt;rgb&lt;/span&gt;(&lt;span class="dv"&gt;168&lt;/span&gt;, &lt;span class="dv"&gt;168&lt;/span&gt;, &lt;span class="dv"&gt;168&lt;/span&gt;, &lt;span class="dt"&gt;maxColorValue =&lt;/span&gt; &lt;span class="dv"&gt;255&lt;/span&gt;),
  &lt;span class="dt"&gt;BRONZE =&lt;/span&gt; &lt;span class="kw"&gt;rgb&lt;/span&gt;(&lt;span class="dv"&gt;150&lt;/span&gt;, &lt;span class="dv"&gt;90&lt;/span&gt;, &lt;span class="dv"&gt;56&lt;/span&gt;, &lt;span class="dt"&gt;maxColorValue =&lt;/span&gt; &lt;span class="dv"&gt;255&lt;/span&gt;))
        
swimming_plot &amp;lt;- &lt;span class="kw"&gt;ggplot&lt;/span&gt;(
  swimming_data,
  &lt;span class="kw"&gt;aes&lt;/span&gt;(
    &lt;span class="dt"&gt;x =&lt;/span&gt; Year, 
    &lt;span class="dt"&gt;y =&lt;/span&gt; Result, 
    &lt;span class="dt"&gt;colour =&lt;/span&gt; Medal, 
    &lt;span class="dt"&gt;group =&lt;/span&gt; Medal)) + 
  &lt;span class="kw"&gt;scale_x_continuous&lt;/span&gt;(&lt;span class="dt"&gt;limits =&lt;/span&gt; &lt;span class="kw"&gt;c&lt;/span&gt;(&lt;span class="dv"&gt;1968&lt;/span&gt;, &lt;span class="dv"&gt;2012&lt;/span&gt;)) +
  &lt;span class="kw"&gt;geom_point&lt;/span&gt;() + 
  &lt;span class="kw"&gt;stat_smooth&lt;/span&gt;(
    &lt;span class="kw"&gt;aes&lt;/span&gt;(&lt;span class="dt"&gt;fill =&lt;/span&gt; Medal), 
    &lt;span class="dt"&gt;alpha =&lt;/span&gt; &lt;span class="fl"&gt;0.25&lt;/span&gt;, 
    &lt;span class="dt"&gt;data =&lt;/span&gt; &lt;span class="kw"&gt;subset&lt;/span&gt;(swimming_data, &lt;span class="dt"&gt;type =&lt;/span&gt; &lt;span class="st"&gt;"actual"&lt;/span&gt;), 
    &lt;span class="dt"&gt;fullrange =&lt;/span&gt; &lt;span class="ot"&gt;FALSE&lt;/span&gt;, 
    &lt;span class="dt"&gt;method =&lt;/span&gt; loess)
    
swimming_plot &amp;lt;- swimming_plot + 
  &lt;span class="kw"&gt;scale_fill_manual&lt;/span&gt;(&lt;span class="dt"&gt;values =&lt;/span&gt; medal_colours) + 
  &lt;span class="kw"&gt;scale_colour_manual&lt;/span&gt;(&lt;span class="dt"&gt;values =&lt;/span&gt; medal_colours) + &lt;span class="kw"&gt;theme_bw&lt;/span&gt;()&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="predictions"&gt;Predictions&lt;/h2&gt;
&lt;p&gt;I now use the functions loess_prediction and log_lm_prediction to estimate the times for the medal winning times.&lt;/p&gt;
&lt;h3 id="loess-predictions"&gt;Loess predictions&lt;/h3&gt;
&lt;p&gt;The gold prediction for 2012 is &lt;code&gt;49.7&lt;/code&gt; seconds, for silver is &lt;code&gt;49.5&lt;/code&gt; seconds, and for bronze is &lt;code&gt;50.2&lt;/code&gt; seconds.&lt;/p&gt;
&lt;h3 id="linear-modelling-of-log-results"&gt;Linear modelling (of log results)&lt;/h3&gt;
&lt;p&gt;I&amp;#8217;ve shown the code here for the calls to the linear modelling approach:&lt;/p&gt;
&lt;pre class="sourceCode r"&gt;&lt;code class="sourceCode r"&gt;swimming_log_lm_gold   &amp;lt;- &lt;span class="kw"&gt;log_lm_prediction&lt;/span&gt;(&lt;span class="st"&gt;"gold"&lt;/span&gt;)
swimming_log_lm_silver &amp;lt;- &lt;span class="kw"&gt;log_lm_prediction&lt;/span&gt;(&lt;span class="st"&gt;"silver"&lt;/span&gt;)
swimming_log_lm_bronze &amp;lt;- &lt;span class="kw"&gt;log_lm_prediction&lt;/span&gt;(&lt;span class="st"&gt;"bronze"&lt;/span&gt;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This gives the following times as predictions:&lt;/p&gt;
&lt;pre class="sourceCode r"&gt;&lt;code class="sourceCode r"&gt;swimming_log_lm_gold&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##     1 
## 50.23 &lt;/code&gt;&lt;/pre&gt;
&lt;pre class="sourceCode r"&gt;&lt;code class="sourceCode r"&gt;swimming_log_lm_silver&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##     1 
## 50.09 &lt;/code&gt;&lt;/pre&gt;
&lt;pre class="sourceCode r"&gt;&lt;code class="sourceCode r"&gt;swimming_log_lm_bronze&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##     1 
## 50.46 &lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="loess-prediction-plot"&gt;Loess prediction plot&lt;/h3&gt;
&lt;p&gt;The following is a plot of actual and predicted times, along with loess error setting as defaults from geom_smooth:&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;p&gt;&lt;img src="data:image/png;base64,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" alt="plot of chunk plot"/&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="notes"&gt;Notes&lt;/h2&gt;
&lt;p&gt;Note that because of the small difference between the silver and gold medal results at the 2008 olympics, the trend of improvement in silver exceeds that in the gold, so the prediction is that the silver time will be faster than the gold!&lt;/p&gt;
&lt;p&gt;Also note that this takes into account no information about performance of athletes involved or changes in rules, such as being unable to use the swimsuits that were present in the last Olympics and largely attributed to improving performance, purely modelling from a few data points as an interesting exercise!&lt;/p&gt;
&lt;h2 id="final-summary"&gt;Final Summary&lt;/h2&gt;
&lt;p&gt;To summarise, the final predicted results using these methods are:&lt;/p&gt;
&lt;pre class="sourceCode r"&gt;&lt;code class="sourceCode r"&gt;&lt;span class="kw"&gt;library&lt;/span&gt;(pander)
predictions &amp;lt;- &lt;span class="kw"&gt;data.frame&lt;/span&gt;(
  &lt;span class="dt"&gt;Medal =&lt;/span&gt; &lt;span class="kw"&gt;c&lt;/span&gt;(&lt;span class="st"&gt;"Gold"&lt;/span&gt;, &lt;span class="st"&gt;"Silver"&lt;/span&gt;, &lt;span class="st"&gt;"Bronze"&lt;/span&gt;),
  &lt;span class="dt"&gt;Loess_prediction =&lt;/span&gt; &lt;span class="kw"&gt;c&lt;/span&gt;(
    &lt;span class="kw"&gt;loess_prediction&lt;/span&gt;(&lt;span class="st"&gt;"gold"&lt;/span&gt;),
    &lt;span class="kw"&gt;loess_prediction&lt;/span&gt;(&lt;span class="st"&gt;"silver"&lt;/span&gt;),
    &lt;span class="kw"&gt;loess_prediction&lt;/span&gt;(&lt;span class="st"&gt;"bronze"&lt;/span&gt;)),
  &lt;span class="dt"&gt;Log_Linear_prediction =&lt;/span&gt; &lt;span class="kw"&gt;c&lt;/span&gt;(
    &lt;span class="kw"&gt;log_lm_prediction&lt;/span&gt;(&lt;span class="st"&gt;"gold"&lt;/span&gt;),
    &lt;span class="kw"&gt;log_lm_prediction&lt;/span&gt;(&lt;span class="st"&gt;"silver"&lt;/span&gt;),
    &lt;span class="kw"&gt;log_lm_prediction&lt;/span&gt;(&lt;span class="st"&gt;"bronze"&lt;/span&gt;)))
&lt;span class="kw"&gt;pandoc.table&lt;/span&gt;(predictions)&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;&lt;col width="11%"&gt;&lt;col width="26%"&gt;&lt;col width="31%"&gt;&lt;thead&gt;&lt;tr class="header"&gt;&lt;th align="left"&gt;Medal&lt;/th&gt;
&lt;th align="left"&gt;Loess_prediction&lt;/th&gt;
&lt;th align="left"&gt;Log_Linear_prediction&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr class="odd"&gt;&lt;td align="left"&gt;Gold&lt;/td&gt;
&lt;td align="left"&gt;49.69&lt;/td&gt;
&lt;td align="left"&gt;50.23&lt;/td&gt;
&lt;/tr&gt;&lt;tr class="even"&gt;&lt;td align="left"&gt;Silver&lt;/td&gt;
&lt;td align="left"&gt;49.52&lt;/td&gt;
&lt;td align="left"&gt;50.09&lt;/td&gt;
&lt;/tr&gt;&lt;tr class="odd"&gt;&lt;td align="left"&gt;Bronze&lt;/td&gt;
&lt;td align="left"&gt;50.20&lt;/td&gt;
&lt;td align="left"&gt;50.46&lt;/td&gt;
&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;p&gt;Obviously the predictions here are very crudely performed, especially given that it produces a faster time for a silver medal than for gold, but it&amp;#8217;ll still be interesting to see what actually happens, and if it&amp;#8217;ll be Michael Phelps yet again!&lt;/p&gt;</description><link>http://www.actuarially.co.uk/post/28625598393</link><guid>http://www.actuarially.co.uk/post/28625598393</guid><pubDate>Fri, 03 Aug 2012 13:56:00 +0100</pubDate><category>olympics</category><category>actuarially</category><category>Matt Malin</category><category>R</category><category>predictions</category><category>swimming</category><category>100m butterfly</category></item><item><title>Smartphone operating system share mosaic plot</title><description>&lt;h1&gt;Smartphone operating system share mosaic plot&lt;/h1&gt;

&lt;p&gt;&lt;i&gt;Author: Matt Malin&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;The increasing dominance of smartphones across the market is a very common topic in technology and news sites, with analysis of operating system share and phone types often shown in the media.&lt;/p&gt;

&lt;p&gt;Stumbling across &lt;a href="http://blog.nielsen.com/nielsenwire/?p=32494"&gt;this article&lt;/a&gt; on Nielsen Wire, I couldn&amp;#8217;t help but notice the massively disproportionate visualisation showing smartphone manufacturer share: &lt;/p&gt;

&lt;p&gt;&lt;img src="http://blog.nielsen.com/nielsenwire/wp-content/uploads/2012/07/Q2-2012-US-Smartphone-manufacturers-share.png" alt="Smartphone manufacturer share by operating system - Nielsen Wire"/&gt;&lt;/p&gt;

&lt;p&gt;This use of a mosaic plot may seem to be a good choice due to the ability to easily see operating system market share and within each operating system see the split by manufacturers, but this only holds in practice if areas are weighted equally across the plot. The plot here, however, seems to place nearly equal area to Apple&amp;#8217;s 34% compared to RIM&amp;#8217;s 9%, as well as many other issues such as HTC apparently having as much market share across HTC Windows phones (which 3.4%) as on Android (in fact this is much larger at 14%).&lt;/p&gt;

&lt;p&gt;Since we wish to see the split of manufacturers across OSes,and still demonstrate all of the main operating systems avaiable, a stacked bar chart would do a better job. Let&amp;#8217;s set this up in R:&lt;/p&gt;

&lt;p&gt;To mimic the style of the article, I first set up a data frame and custom colour palette:&lt;/p&gt;

&lt;pre&gt;&lt;code class="r"&gt;phone_manufacturer_split &amp;lt;- data.frame(
  operating_system = c(
    rep("Android OS", 4), 
    "Apple iPhone", 
    "RIM Blackberry", 
    rep("Windows Mobile", 3), 
    rep("Windows 7", 3),
    "Symbian",
    "Palm/WebOS"),
  manufacturer = c(
    "Samsung", "HTC", "Motorola", "Other",
    "Apple",
    "RIM Blackberry",
    "HTC", "Palm", "Other",
    "Samsung", "Nokia", "HTC",
    "Nokia",
    "Palm"),
  share = c(
    0.17, 0.14, 0.11, 0.09,
    0.34,
    0.09,
    0.029, 0.001, 0.002,
    0.005, 0.003, 0.005,
    0.009, 0.006
  )
)

custom_colours &amp;lt;- c(
  Samsung          = rgb(118, 184, 67, maxColorValue = 255),
  HTC              = rgb(226, 56, 40, maxColorValue = 255),
  Motorola         = rgb(255, 154, 0, maxColorValue = 255),
  Other            = rgb(33, 154, 220, maxColorValue = 255),
  Apple            = rgb(254, 219, 1, maxColorValue = 255),
  `RIM Blackberry` = rgb(20, 105, 122, maxColorValue = 255),
  Palm             = rgb(109, 110, 112, maxColorValue = 255),
  Nokia            = rgb(167, 206, 241, maxColorValue = 255))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I will also reproduce the mosaic plot with correct areas, although due to the large size difference of each element not all labels will be easy to format. Setting up necessary data such as midpoints for the elements, and ordering factors so that the plots will be ordered by total operating system market share:&lt;/p&gt;

&lt;pre&gt;&lt;code class="r"&gt;combined &amp;lt;- aggregate(share ~ operating_system , phone_manufacturer_split, sum)
names(combined)[which(names(combined) == "share")] &amp;lt;- "os_share"

combined &amp;lt;- combined[order(combined$os_share, decreasing = TRUE), ]
combined &amp;lt;- within(combined, cumsum &amp;lt;- cumsum(os_share))
combined &amp;lt;- within(combined, os_mid &amp;lt;- cumsum - 0.5 * os_share)

phone_manufacturer_split &amp;lt;- merge(
  phone_manufacturer_split, 
  combined[c("operating_system", "os_share", "os_mid")], 
  by = "operating_system")

phone_manufacturer_split &amp;lt;- within(
  phone_manufacturer_split,
  pct_os_split &amp;lt;- share / os_share)

os_manufacturer_mid &amp;lt;- lapply(
  unique(phone_manufacturer_split$operating_system), 
  FUN = function(the_operating_system) {
    os_subset &amp;lt;- subset(
      phone_manufacturer_split, 
      operating_system == the_operating_system)
    os_subset &amp;lt;- os_subset[order(os_subset$pct_os_split), ]
    os_subset &amp;lt;- within(
      os_subset, 
      os_manufacturer_mid &amp;lt;- {
        cumsum(pct_os_split) - 0.5 *    pct_os_split}
    )
    return(os_subset)
  })

phone_manufacturer_split &amp;lt;- do.call("rbind", os_manufacturer_mid)
phone_manufacturer_split &amp;lt;- within(
  phone_manufacturer_split, 
  operating_system &amp;lt;- factor(
    operating_system, 
    levels = combined$operating_system[order(combined$os_share, decreasing = TRUE)]))

phone_manufacturer_split
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;##    operating_system   manufacturer share os_share os_mid pct_os_split
## 4        Android OS          Other 0.090    0.510 0.2550      0.17647
## 3        Android OS       Motorola 0.110    0.510 0.2550      0.21569
## 2        Android OS            HTC 0.140    0.510 0.2550      0.27451
## 1        Android OS        Samsung 0.170    0.510 0.2550      0.33333
## 5      Apple iPhone          Apple 0.340    0.340 0.6800      1.00000
## 6        Palm/WebOS           Palm 0.006    0.006 0.9970      1.00000
## 7    RIM Blackberry RIM Blackberry 0.090    0.090 0.8950      1.00000
## 8           Symbian          Nokia 0.009    0.009 0.9895      1.00000
## 10        Windows 7          Nokia 0.003    0.013 0.9785      0.23077
## 9         Windows 7        Samsung 0.005    0.013 0.9785      0.38462
## 11        Windows 7            HTC 0.005    0.013 0.9785      0.38462
## 13   Windows Mobile           Palm 0.001    0.032 0.9560      0.03125
## 14   Windows Mobile          Other 0.002    0.032 0.9560      0.06250
## 12   Windows Mobile            HTC 0.029    0.032 0.9560      0.90625
##    os_manufacturer_mid
## 4              0.08824
## 3              0.28431
## 2              0.52941
## 1              0.83333
## 5              0.50000
## 6              0.50000
## 7              0.50000
## 8              0.50000
## 10             0.11538
## 9              0.42308
## 11             0.80769
## 13             0.01562
## 14             0.06250
## 12             0.54688
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To set up the plots, will use ggplot2:&lt;/p&gt;

&lt;pre&gt;&lt;code class="r"&gt;library(ggplot2)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, to set up the stacked chart:&lt;/p&gt;

&lt;pre&gt;&lt;code class="r"&gt;stacked_bar &amp;lt;- ggplot(phone_manufacturer_split, aes(x = operating_system, 
    y = share, fill = manufacturer)) + geom_bar(position = "stack") + opts(title = "Smartphone manufacturer share by operating system\nQ2 2012, US mobile subscribers\n", 
    legend.position = "bottom") + xlab("") + ylab("") + labs(fill = "") + opts(axis.text.x = theme_text(angle = 45)) + 
    scale_fill_manual(values = custom_colours)
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class="r"&gt;stacked_bar
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfgAAAH4CAMAAACR9g9NAAABa1BMVEUAAAAAADoAAGYAOjoAOmYAOpAAZmYAZpAAZrYUaXohmtw6AAA6ADo6AGY6OgA6Ojo6OmY6OpA6ZmY6ZrY6kJA6kLY6kNtDkvFesfFmAABmADpmAGZmOgBmOjpmOmZmOpBmZgBmZjpmZmZmZrZmkJBmkLZmkNtmtttmtv9tbnB2uEN/f39/f5V/f6t/lcF/q9aQOgCQOjqQOmaQZjqQZpCQkDqQkGaQkLaQkNuQtpCQtraQ27aQ29uQ2/+Vf3+VlcGVweunzvGrf6urlZWrlcGr1v+2ZgC2Zjq2Zma2kDq2kJC2tra2ttu2tv+225C22/+2/7a2/9u2///BlX/BlZXBlavBwdbB6//Wq3/W///bkDrbkGbbkJDbtmbbtpDb25Db29vb2//b/7bb/9vb///iOCjl5eXrwZXr1qvr///y8vL+2wH/mgD/tmb/tpD/1qv/25D/27b/29v/68H//7b//9b//9v//+v///+GFy59AAAACXBIWXMAAAsSAAALEgHS3X78AAAaw0lEQVR4nO2djZ8bx1nH1y4X1Jwd4xoEdgIhreOqMSV2aFNMIkiBrOsCbXMF6m5i7DRXQl9Ui3K57J/PPPO2K91KWj2zz92znt/zaR2dtL/5zc5352VnR5qiRmQZxUVnAHExAfCZBsBnGgCfaQB8pgHwmQbAZxoAn2kAfKYB8JkGwGcaAJ9pAHymAfCZBsBnGgCfaQB8pqEF/LMXyGXIHIjl+JzAl0VRTDZ/fHpvGl+f3JwNYrkoiunqO22XrbEzC9w8Ug5Obs33Ol4ozgd8OaGT2ExeAnx5xk4HeMnj94hzAe8u8sXlo+WVd03NX9javzw0rcCsPr1v3qL24OTWg8Pi8pEp1NuHxaU5nXVRHBzX9v3W3xQd6YTDLBNjZdoY4+c+o2MOjkk/CR+T7aW5T9L9QQlXhUvDZ6GVx3iwPSE6wOTVXlyVu8La2TUf1Stpu4RcDm7N4ymd3CwuvUsHR+uQov3LHh8Sap/zAHEu4GNlXx5OTBM8MScxtwRKQ+AelQ41gTdNCVSXj+x/S+JkROa/zd/m6q9cyXekEw4LZKkIm89mpHYuHnywpSTtHxSkW6ylVa4dTMeFvNLxp/dm8RxDdivStNJuErJNfZP+1JyKA++tfYr+r5BrSqh1zkMwOZ+m3lzZtrIsD2e2EEJT6c+tQWL+CWiWV49W/l64amSFHemEw9rgw2cLV7ar4KfuMEoytqj+wJhGO49t/3ZebT7reiW75p8zaYeELHh/SlQmVQPep2ySauU4JLR+zolxbqN6w95drdTu+9Kh1tgWZRz0mBcrpdL6u7I9ghuwdaTTDd595uvpKviZbV1tkh6na55nbfCtPLb9Q17JxLf0Mbv+o7W0Q0Ir4K00MrbWPkX/Fx0fElo55/Q4x9s5k/NW5k1JTCOBXuB9c+yTWk+nC3z4bCN4n2QEX9P9x6V5k1Yrj23/CH559SOvPQO+nXaT0Ebw3rpJsbSd/DT6jhG8OzeT41bmbUGtgO/T1PvoSKcLfPiss6lvteZt8GeuvfWD67pp6s3Bt11L393Uh7SbhDY29SGDTYrmr9jU1+ME7wZPFY3qG2DmfJaHdFFH8Kujs2a01BqOLdzguyOdtuz0ngff+sy2n9M6fOxtXZIRvBVcmbevtVYeG/+QV+oAJuEc18eirbSbhFbAx9NurH2K/i+XY5fQGMG7CRx7S9Jknu63fkLDbTqPim60vu7uh0KVDfdH7b9duXelEw+jW6QHV10f7z+j2zIqXipT/7Gz9Uk2Nb50t4ax1WjnseVv78dsE0xDLhcxu+40VtMOGanc7Vw7r+/6ptxZhxT9X5W/naM+YJTge8RQEzfnG35M38Tep7FojR06U5QJgE+Lan1qbZ/TWNgWYS2FMynKBMCnxPJwrbrueRpVsf5AoSNFmdADHnGuAfCZBsBnGgCfaQB8pgHwmQbAZxqjAU8Tl25e3D3hdO+G1/Tp1B83WzumDkuA7JzY9tV/4S7cLpPZtuBhy+16mJPVHWMBvzwkrqWd357GR1rhNT0hsa/pCpjVK8fY4yL4Hav/WsTY4Hd+qiJGAj5MbPpHboFKeG0fa9Gkd1X8wWuzeuUYigg+rv6jd9ur2OIjFreYztf41jK7uBwvPP29HR78hNV5YYHde1Tjb3csvKviQx4FMRLwy/ZT77peWXhmXtsHHfTZJ0fNk7bWMRH8SmVvrWJbXzHnwLeX2cXleAF8s+pu0VrVZ5dbzjsX3vlDhUuqb4wEfHiE5Wtxmx+9tnAc6NYyquaYpqkPq/8oWqvY1pdROPDtZXZry/HW1lu0lnrEPn594Z0e6BSjBL/OvQv8St1uDe786j+K9XU8rYVTDnx7md3acrxwoH87Lu6aNQPD9YV3YVWdjhgJ+JWm3g30/Af2dWzqW+tw20+9VsDHTmA3+NUnZSvL8cKqO/f2JvBri/pKPZ38SMC7tnJiB+WLVuGFpViE1LUKrowXqwXs3zw4jqv/rKoBv6WpX83FelPv345N/exsU1+v9D/n87R9d4wEvKvBZViCFN/1r5vbOVfGZ750UNmlW9Nm9V9Qe/DrK+bC4K5ZZhdXwbk1e+HA1io9u6ovgN+08G6Yb0MMEGMB7yZwCndTVPjlaXV8vTaBE98vQwUrQ1/tV/9RtFextb8A5Ufm/nYutB1+FZxfsxdX3ZXxS1rhWzXhO1JdC+/0dPKjAe/jd/vVmOUdoXyMPsYGfs/4WEvLqi5ecPCITQHwmQbAZxoAn2kAfKYB8JkGwGcaAJ9pAHymAfCZBsBnGgCfaQB8pgHwmQbAZxoAn2kAfKYB8JkGwGcae4L/7z7R7ygJ8UWqtVsDvJBauzXAC6m1WwO8kFq7NcALqbVbA7yQWrs1wAuptVsDvJBauzXAC6m1WwO8kFq7NcALqbVbA7yQWrs1wAuptVsDvJBau/VA4N9ixjAnoVGt3RrghdTarQFeSK3dujf4x3f/6mf+RXgF8CO27gv++V//yvzPvPjy33/WvBuTAfixWfcF//kH9Rf/+HPz4ot/+vu7b9M7d03Ej7ngNzYwiPONzeA/rL/8DwL//Ns/pz9cxOsHNX5s1r3BhxpP8fwDgB+7dV/wsY8n6Kjx47fuC96N6r/451/RqD5UeIAfr3Vv8J0RkwH4sVkDvJBauzXAC6m1WwO8kFq7NcALqbVbA7yQWrs1wAuptVsDvJBauzXAC6m1WwO8kFq7NcALqbVbA7yQWrs1wAuptVsDvJBauzXAC6m1WwO8kFq7NcALqbVbA7yQWrs1wAuptVsDvJBauzXAC6m1W6eB/3UILvhf74p65xFK1eqtUeNl1Nqt02p8TAbgx2YN8EJq7dYAL6TWbg3wQmrt1gAvpNZuDfBCau3WAC+k1m4N8EJq7dYAL6TWbg3wQmrt1gAvpNZuDfBCau3WAC+k1m4N8EJq7dYAL6TWbg3wQmrt1gAvpNZuDfBCau3WAC+k1m4N8EJq7dYAL6TWbg3wQmrt1gAvpNZu3Rv842YLos/xs+Xjt+4LPm5UYF7i9+pfAOu+4JutSf7vH/7HgsdmRC9S7N6MyOB/jho/fuve4EON/5xqOjYjGr11X/CtPr5GjX8BrPuCbzYjAvgXwro3+M6IyQD82KwBXkit3RrghdTarQFeSK3dGuCF1NqtAV5Ird0a4IXU2q0BXkit3RrghdTarQFeSK3dGuCF1NqtAV5Ird0a4IXU2q0BXkit3RrghdTarQFeSK3dGuCF1NqtAV5Ird0a4IXU2q0BXkit3RrghdTardPAx51tuOAH2lhHoVq9NWq8jFq7dVqNj8kA/NisAV5Ird0a4IXU2q0HAv8yM5z6N7wYqAhk1NqtAV5Ird0a4IXU2q0BXkit3RrghdTarQFeSK3dGuCF1NqtAV5Ird0a4IXU2q0BXkit3RrghdTarQFeSK3dGuCF1NqtAV5Ird0a4IXU2q0BXkit3RrghdTarQFeSK3dGuCF1Nqte4OPe9I8vnv3Q4AfvXVf8PH36p+/HfYoAfgxW/cF3+xJU/sXK3vScME7NRP8xtYJsXfs3pOG2vqzGxWgxo/Nujf4Vo1vNp6LyQD82Kz7gm/6+A8AXlysCHyzJ40Z1b+Npn701r3Bd0ZMBuDHZg3wQmrt1gAvpNZuDfBCau3WAC+k1m4N8EJq7dYAL6TWbg3wQmrt1gAvpNZuDfBCau3WAC+k1m4N8EJq7dYAL6TWbg3wQmrt1gAvpNZuDfBCau3WAC+k1m4N8EJq7dYAL6TWbg3wQmrt1gAvpNZuDfBCau3WaeDjzja/ZYZTM8EPtS2PiFq99TA1ngveqVHjz986rcbHZAB+bNYAL6TWbg3wQmrt1gAvpNZuDfBCau3WAC+k1m4N8EJq7dYAL6TWbg3wQmrt1gAvpNZuDfBCau3WAC+k1m4N8EJq7dYAL6TWbg3wQmrt1gAvpNZuDfBCau3WAC+k1m4N8EJq7dYAL6TWbg3wQmrt1gAvpNZu3Rt82Izoy5/evWt/uB7gR23dF3x7M6L6cdiGKiYD8GOz7gt+dWsSAr+yGREXvFMzwW9snRB7R5/NiGyldxGvH9T4sVn3Bt/U+MeRO8CP17ov+NjHf/nTD5t3YzIAPzbrvuDjZkSPqW8/swsVwI/Nujf4zojJAPzYrAFeSK3dGuCF1NqtAV5Ird0a4IXU2q0BXkit3RrghdTarQFeSK3dGuCF1NqtAV5Ird0a4IXU2q0BXkit3RrghdTarQFeSK3dGuCF1NqtAV5Ird0a4IXU2q0BXkit3RrghdTarQFeSK3dGuCF1Nqt08DHDU644J2aCX6o3VlE1OqtUeNl1Nqt02p8TAbgx2YN8EJq7dYAL6TWbg3wQmrt1gOB/yUznBrgz98a4IXU2q0BXkit3RrghdTarQFeSK3dGuCF1NqtAV5Ird0a4IXU2q0BXkit3RrghdTarQFeSK3dGuCF1NqtAV5Ird0a4IXU2q0BXkit3RrghdTarQFeSK3dGuCF1NqtAV5Ird26N/iwGVHd2qIE4Mdr3Rd83Kigfn732wA/fuu+4OPWJF/+p9+bZmUzIi54p2aC39g6IfaOPpsRxU2JUONHbN0bfLMZEcCLixWBb/p4gJcXKwIfNyMC+HMQawLfGTGZCwT/VWYMVIAiYoAHeCkxwCcWoIgY4AFeSgzwiQUoIgZ4gJcSA3xiAYqIAR7gpcQAn1iAImKAB3gpMcAnFqCIGOABXkoM8IkFKCIGeICXEgN8YgGKiAEe4KXEAJ9YgCJigAd4KTHAJxagiBjgAV5KDPCJBSgiVg8+7mzDBe/UTPBOzAU/1KY+EuLxbEaEGj+oWH2Nj8kA/KBigAd4KTHAJxagiBjgAV5KDPCJBSgiBniAlxIDfGIBiogBHuClxLmDf5kXA5W+jBrge4BPyndy6cuoAR7gtxwE8AAP8AAP8AAP8AAP8AAP8EOUvowa4AF+y0EAz8/3W8wYiF2SGOABHuD3zff3mZGkBviswX+LGQA/BPi0sx4J+LgZUbMrEcAnqccBPm5U0NqxAOCT1OMAH7cmiS9WNiNCjDx2b0bU2pWo7nfTMdYVTKPN+KCj+rM1HuBHbd0X/I4+/mJPQqNau3Vf8M1mRJ2j+os9CY1q7da9wXeGkpPQqNZuDfBCau3WAC+k1m4N8EJq7dYAL6TWbg3wQmrt1gAvpNZuDfBCau3WaeB7RdKjnLTnQBeoHpk1wA+lHpk1wA+lHpk1wA+lHpk1wA+lHpm1BHjECALgMw2AzzQAPtMA+EwD4DMNgM80AD7TyAX8D4742pObRTEZLis6IhPwpx9P+eJqdnr/e+8PlxkVkQn4+vQdXpWvTFWv/uT+/OT144FzdMGRBfiquHxUsap8NSknpqmf1YuEFuMCoiyKHRnOAPzJrTl10wesKvv7vzPkT++NrI/vcZWPAXzi4OrJm5/Sf6oZR7z8c6rzY4uH83pRmGZuyyHy4He3OrsiaXBlrhoHbnmD6c4j/4znNkxUBTVwW7sncfC8vnU1iZTBlanvFtzpvX0zUk1ME2+ummryyf4Dw8Wl+d6aoaPc1saJg+/R6uyKlMHV8tBQZzbW5Vfu2AuXw/3gEatnGSIqamJP/3XHWcvX+N2tzragSjdLGlzR+TPQBSmrh1gcHC8uamRQTinjv3ul2H7lndPgbmursy2e3DHsuWI3KkwYnJlCZF2y/2K8X01p5PjhLtRyZ65lwfdrdbaEGVTXfPJ+VMip73TNmJaq5Dc17Gs9LdyFury+a0gkCr5nq7M1qoQmM2FUSDd/NC7lD87ZVd72bmxbh3z3WUuC79vqbAhf6RLIc0eF1aU5QU+cpuX28km9my/v3fdSkuD7tjobIlQ6Tkvtb8WYo8In1668d2vOHZGaCzallU/r3VyD0eOsRWt8z1ZnQyRVunArxouHD668z76TMDewFfv2la5ybhsXJh56hXgfzy/9E36lM+Nq9q0Y9erLG8sr3AmYZzRVyW4s/vjmjE9+n6tdFHzPVudsuGv3m8xKZ8rNIGfeitkbEVNrueSXV6myM/t3cxvyN4cz9rzDPhMPMuCXh0n3Msvrj76SMsKpJiffqLm3YtXBo2K6NPaf8swXU+bIwlyv5bScLVIeSPW/2oVqPI2n2VEdPL3yRtIIp3rJ3BFwnw1VB8cVd455URx8xlzyQY+Aqbp+zGlpnsXZqovt4ykTbPJ20cvU9nPsu+gktSHPru8PHxyyH0aa8Xx8lrin0vRLfraq70lLgK8m5k6MP91GxX5/zh3h+CUXKfM+dB/P0pXFzNyGsO9fE3JtxhR7zlaJ1PjfvzZN6OcXB8f2doA3wqG7/5N/44+P0qK89AbrrJtHwAwxdQ7lbM/ZKhHwy9dMQ79glgB1lClLYqfsipM28+ImGk/v8ZZ4JTwCXl555YCamf3GlEKDu4q9WMqMcKjOM30/OaIuhnkXnTTzEicamcGed6B2fnk42Xdl2eDgU2fY7Ywlc/2Knf9gP7xPmHmhbi1tdv8Zd96B2nm72GXPS3Zw8Ckz7D4F9rgszH+wImnmxXSwKRONp/euFTPWvEM5MX2LbSn2vA8ZHnz6Yy0m+WqSNv/Bnnnxt68J64RO/pYuHc7t58k3qLlhPPsfGPzJrYTHWjHYK6W48x+JMy91yu2rndk27TRzzota2JLxpYGBwT9581P+hZ+yft5OsZcv8eY/KFJmXmwzx5+mfnLH9zOccK3rf/14X91w4OnE7ZpWXpj2PWH9vFFTCXCXeKXOvNh7aCb3H/yIhrNc8s+4vgPWeNtW8Vc2lhP+Sima7bOLuNn23JmX2j2D5D5IdN/jpUENa46YBoXf5PVQw4H38/MJ5F/ir5+vDp7QPSRrAiRt5iV5qRR9j5d7I2MHhbfvcKTDgQ8DHP59XPmH/HEx1Xm6n+VI+TMvz+jRf8pSqfA9XlahJQ0KBwSfMsBxM9UpX0+s/Az/fpE287K8MqeJRl599d8pZH+PN3FQOGRTzx/g0DkwG+r4KK1iDcrTZl4WE1vfOeRbbQzne7yhqWGTHwh82gDHnQOtmmHEk2vs5XFpMy/uoZilzrhgW98pZE3Rl/6C4y4cGAh84gDHVgDutM/DB3zyCTMv4aEYs6VvvlO4//d4bZTMpsbHAODN5Z40wPFPolm1LnVJbMrAJD4US3j0z/2eFVkmfBu0HgL88pBu4xKuPd+/szrKxCWx/IEJ96FYK/jfKfSrsJN+qmOAGm+glcUk7Tks9e+cW6q0JbF2+TerpTn5HvOhWCu43ylcXn+UuAqbYgDwJ68eldNFcYmRC5dzbv9OT+3ZS2LpQk0amfAeiqVHdfC0mCSuwq6HGdzxbqTq0EvUzP7dLy5lLYl9Rkt9Ur+lxnkolhx2DfLX2E8hYwwBnv9ww/USvNEprcyz5BmrdUhH2JPW4tach2Kp4dYgv8d/ChlikNs5dpPne4kJo3+n753Mau6ozi60qdLJn38sWDOUZ2MQ8NxfEkvoJdy3Lnj3Yn7mxSZyMauwUyJpDXITF/wDh9xeglbDLq+8wlsZGWZeLmrxfWLw1yC346J/2ZLbSywu/+jqR5/yBvSs5ciKYpDf0Lto8OxeYsGcORlg5uWFiIsGzw8e+SFmXl6IGC94dot3UTMvumLE4PlxITMvyiJL8Bcx86ItMgWPAPhMA+AzDYDPNAA+0wD4TAPgMw2AzzQAPtMA+EwD4DMNgM80AD7TAPhMA+AzDYDPNAA+0wD4TAPgMw2AzzQAPtMA+EwD4DMNgM80AD7TAPhMA+AzDYDPNAA+0wD4TAPgMw2AzzQAPtNggP/Nemw//JfrsfHI356JPXL1/fXYfvjL67H98G+tx5Zjv7oee5zF9nhrPRLSAniA7xsAD/AA3xEA7wLg9ziL7QHwHQHw+8VQ4M9sfHfyqn+jC7z9TVHaXoNiZneqmHaDXx7SL1Q3P2L5w/VfJgw+HeBtnsKPWNKPFsc8dYOnLWrod1J/eHzmF3Y7wFOm4w8ltlLuAm+PndBR7fOx705XtC6fm37gtwt8VRSsrW2GAl9+fe0nxPuA90fRVo+0Q0gn+D/6C3PEw2se/NmtQLeBv3ZjFXwrOsDbTVoXl49oQ/E+4OmHz8MGC7vAm/RO788JfOt8KAX3bstpT/A+je7jt8VA4E9e/4XJ/vJrtGWG+5dOx26fuht8KL1O8NcfmRbhTXNqpd191v6ftrS4dvmoLBqfSRf4G6YUjYsTzKpJOLbuBO82RKqmxoNOwVRmm39y2gY+5II0U/qx1O3g4/l4aN85bnJFmxA+Mvl0JRjtv3vt8l/OKI0u8H6LDptAzIJpSmfk+XC+vHZot8ouLr+xenUMBN6UsPkfta3lzP1rTof2/6hmneAPXRvvwc+2gX96o/74/ftzSsyk+vqxe1FNav+OKcwbplT/rAs8bX0y84LbN+pw7LwTvMvGYko1/urRqbOk66Xe1tS7BCnlq0fUZpSz7U19OJ9QCqaFCbmy21YWJp+uBKM97SN7g7LX1dTTJqn2c0ogZOHhvH7mwV8/Nh+Y65Oa1eHBk7srBFNw7l9zOtT9FNPdNd5Wtf/98Qbwn73z0Xc+M3mfeSjuBe1QOPM+VFMudYI3F4dB7gS+daBju8GHGu+b+odzl3/bHm2q8XXtEvTw3jnaAP6G7aQseH8+tU/BXrouEZsByufyjsuxtzf/O33nJ+aoTYO7cuoSiFkwl9TUg7f/UlE/lABv9/YJdb2p8bYk+/bx0w3gj6vbd07P1vhpU+OpYLprPDWBocabahCO7Qa/1sc/nIcrYSt4l+Bu8JRdC96fzwp4lwj9vShmtppSjQ/2lIOKxlAd4O0+JbY4KIGQBdtSXj82BesvYaEa785jcfD0bB9fdDf1K+C3juqvH5tu7DT08Sc3D45dlz2tm971sLj0xp92g7dNn+vjl9d/4Y+dbR3VG4+ntrhc/neAdwn2AG/qpQPvz2d1rG9zZart5e+afD41HbPr46293eCeuG0a1U99LmIWSrdHtunXHXi5Pt6FG42ujUlxH7/HWWwMe5mx7+Or9ZtGgB8JeLerIhs8tWVrt9uYuRsFeBds8B0B8ACPyCkAPtMA+EwD4DMNgM80AD7TAPhMA+AzDYDPNAA+0wD4TAPgMw2AzzQAPtMA+EwD4DMNgM80AD7TAPhMA+AzDYDPNAA+0/h/67Dxxb9iFg0AAAAASUVORK5CYII=" alt="plot of chunk unnamed-chunk-5"/&gt;&lt;/p&gt;

&lt;p&gt;This clearly demonstrates a lot more accurately the data as it exists, including showing more accurately the market dominance of Android OS and Apple iPhone, as well as emphasising the small share of the others, mainly because the dimensions used are now actually correctly mapped to values!&lt;/p&gt;

&lt;p&gt;Now, to attempt to mimic the original plot in ggplot will produce many difficulties in formatting, as there are massive overlaps if there are to be labels, so first will produce the mosaic plot without labels:&lt;/p&gt;

&lt;pre&gt;&lt;code class="r"&gt;the_plot &amp;lt;- ggplot(
    data = phone_manufacturer_split, 
    aes(
      x = os_mid, 
      y = os_manufacturer_mid, 
      fill = manufacturer)) + 
  geom_tile(
    colour = "white", 
    aes(
      height = pct_os_split, 
      width = os_share)) +
  theme_bw() +
  opts(
    title = "Smartphone manufacturer share by operating system\nQ2 2012, US mobile subscribers\n") +
  opts(axis.text.x = theme_text(angle = -90)) +
  opts(axis.text.y = theme_blank()) +
  xlab("") + 
  ylab("") + 
  labs(fill = "") +
  scale_x_continuous(
    breaks = combined$os_mid, 
    label = paste(
      combined$operating_system, 
      " ", 
      100 * combined$os_share, 
      "%", 
      sep = "")) +
  scale_fill_manual(values = custom_colours) +
  opts(legend.position = "bottom")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This gives the following plot, which again, as with the stacked bar chart, correctly has area mapped to market share:&lt;/p&gt;

&lt;pre&gt;&lt;code class="r"&gt;the_plot
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="data:image/png;base64,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" alt="plot of chunk unnamed-chunk-7"/&gt;&lt;/p&gt;

&lt;p&gt;The very thin bars for the smaller market share percentages are now too small to perceive and at this resolution are not represented correctly anyway, but this does suggest why the original chart strayed from accurate sizes anyway, so as to make the boxes at least visible, but at the cost of being a correctly informative visualisation of the underlying data. &lt;/p&gt;

&lt;p&gt;Quickly playing with some ggplot settings to attempt to now add the labels, as I haven&amp;#8217;t the time to fully replicate the design and improve the graphic it&amp;#8217;ll not look as pretty but will more importantly still be true to the data:&lt;/p&gt;

&lt;pre&gt;&lt;code class="r"&gt;the_plot_formatted &amp;lt;- the_plot + 
  geom_text(
    data = subset(
      phone_manufacturer_split, 
      os_share &amp;gt; 0.3),
    aes(label = paste(manufacturer, ": ", 100 * share, "%", sep = ""), angle = 0)) +
  geom_text(
    data = subset(
      phone_manufacturer_split, 
      {operating_system == "Windows Mobile"}&amp;amp;{
       manufacturer %in% c("Other", "Palm")}
      ),
    aes(
      label = paste(manufacturer, ": ", 100 * share, "%", sep = ""), 
      size = 1, 
      angle = 0)) +
  geom_text(
    data = subset(
      phone_manufacturer_split, 
      {os_share &amp;lt; 0.3}&amp;amp;!({
       operating_system == "Windows Mobile"}&amp;amp;{
       manufacturer %in% c("Other", "Palm")})
      ),
    aes(
      label = paste(manufacturer, ": ", 100 * share, "%", sep = ""), 
      size = 1, 
      angle = -90)) +
  opts(legend.position = "off") + 
  guides(size = FALSE)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="data:image/png;base64,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" alt="plot of chunk unnamed-chunk-9"/&gt;&lt;/p&gt;

&lt;p&gt;This plot would still require some finishing touches to improve the formatting but I&amp;#8217;ll leave it as it is. I&amp;#8217;ve also outputted a &lt;a href="http://i.imgur.com/8wgAk.png"&gt;much larger version of the mosaic plot&lt;/a&gt; to properly demonstrate the plot as it should be:&lt;br/&gt;&lt;a href="http://i.imgur.com/8wgAk.png"&gt;&lt;a href="http://i.imgur.com/8wgAk.png"&gt;http://i.imgur.com/8wgAk.png&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whilst creating the data frame with values from the Nielsen published graphic, I also couldn&amp;#8217;t help but notice that the numbers didn&amp;#8217;t match up with those in the article itself, e.g. Android OS at 51.8% in the article, 51% in the graphic, and RIM only at 8.1% in the article but rounded &lt;em&gt;up&lt;/em&gt; to 9% for the graphic! &lt;/p&gt;</description><link>http://www.actuarially.co.uk/post/27156208823</link><guid>http://www.actuarially.co.uk/post/27156208823</guid><pubDate>Sat, 14 Jul 2012 00:44:00 +0100</pubDate><category>R</category><category>Matt Malin</category><category>ggplot2</category><category>mosaic_plot</category><category>treemapping</category><category>smartphone</category></item><item><title>The Actuary Puzzle 508 - Square numbers</title><description>&lt;h1&gt;The Actuary Puzzle 508 - Square numbers&lt;/h1&gt;
&lt;p&gt;&lt;i&gt;Author: Matt Malin&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;From &lt;a href="http://www.theactuary.com/puzzles-and-games/2012/the-actuary-puzzles-june-2012/"&gt;the puzzle pages of The Actuary June 2012&lt;/a&gt;, I attempt to solve the following, making use of R:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This square contains exactly 21 smaller squares. Each of these smaller&lt;br/&gt;
squares has sides of integer length, with no two smaller squares having&lt;br/&gt;
sides of the same length. Can you find a solution for the size of the 21 smaller&lt;br/&gt;
squares? (Note, the 21st square, n, is between squares f, g, m and o).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src="data:image/png;base64,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" alt="21 squares puzzle"/&gt;&lt;/p&gt;

&lt;p&gt;The approach I decided to take was to calculate a few relationships and work from there to attempt to find working solutions, instead of working out all necessary equations and completely solving. Although there can be probably be an exhaustive set of calculations leading to some form of order of size (and solution), any assumptions on size are based on size differences guaranteed by adjacent squares and following lines directly, not from comparing printed sizes, so this approach may be missing out on easily excluding some more impossible values this way.&lt;/p&gt;

&lt;h2&gt;Initial rules&lt;/h2&gt;

&lt;p&gt;Looking at the square and coming up with a few rules hoping to be exhaustive enough, where letter \(x\) here is the value of the length of side on square \(x\):&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Values are integers.&lt;/li&gt;
&lt;li&gt;Values are unique.&lt;/li&gt;
&lt;li&gt;\(o &amp;gt; n\)&lt;/li&gt;
&lt;li&gt;\(m = n + o\)&lt;/li&gt;
&lt;li&gt;\(q = m + o\)&lt;/li&gt;
&lt;li&gt;\(l = m + q\)&lt;/li&gt;
&lt;li&gt;\(s = 0.25 * q \Rightarrow 4 | q\), as all values are integers. 

&lt;ul&gt;&lt;li&gt;Derivation: \(t + s = l + q \Rightarrow (u + s) + s = l + q \Rightarrow u + 2s = l + q\)

&lt;ul&gt;&lt;li&gt;\(\Rightarrow (k + s) + 2s = l + q \Rightarrow k + 3s = l + q\)&lt;/li&gt;
&lt;li&gt;\(\Rightarrow (l + s) + 3s = l + q \Rightarrow l + 4s = l + q\)&lt;/li&gt;
&lt;li&gt;\(\Rightarrow 4s = q\)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;\(4 | q = m + o = (n + o) + o = n + 2o\), so have that \(4 | n + 2o\).

&lt;ul&gt;&lt;li&gt;\(2 | 4\) and \(2 | 2o \Rightarrow 2 | n\), so \(n\) is even.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;\(k = l + s\)&lt;/li&gt;
&lt;li&gt;\(u = k + s\)&lt;/li&gt;
&lt;li&gt;\(t = u + s\)&lt;/li&gt;
&lt;li&gt;\(l - n &amp;gt; p &amp;gt; o\)&lt;/li&gt;
&lt;li&gt;\(r = l + t - n -p\)&lt;/li&gt;
&lt;li&gt;\(j = r - p\)&lt;/li&gt;
&lt;li&gt;\(i = j - p\)&lt;/li&gt;
&lt;li&gt;\(g = q + p - i - n - m\)&lt;/li&gt;
&lt;li&gt;\(f = g - n\)&lt;/li&gt;
&lt;li&gt;\(h = g - i\)&lt;/li&gt;
&lt;li&gt;\(e = i + j - h\)&lt;/li&gt;
&lt;li&gt;\(d = e - h\)&lt;/li&gt;
&lt;li&gt;\(c = d + e\)&lt;/li&gt;
&lt;li&gt;\(b = c + d\)&lt;/li&gt;
&lt;li&gt;\(a = b + f\)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The set of numbers are also contrained by the fact that the total length of each side of the large square is consistent (will check this in three ways):&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;\(a + b + c = u + t + r\)&lt;/li&gt;
&lt;li&gt;\(b + c = k + u\)&lt;/li&gt;
&lt;li&gt;\(b + t = k + e + j\)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Also, the total area of the small squares should sum the total area of the large square:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;\((a + b + c)^2 = a^2 + b^2 + c^2 + … + s^2 + t^2 + u^2\)&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Calculations&lt;/h2&gt;

&lt;p&gt;Under these assumptions there are very few lengths which aren&amp;#8217;t defined by the lengths of values already determined, so setting up nested loops for searching for working solutions shouldn&amp;#8217;t be too computationally intensive. &lt;/p&gt;

&lt;p&gt;First decide on maximum values to take across our loops.&lt;/p&gt;

&lt;pre&gt;&lt;code class="r"&gt;max_nn &amp;lt;- 10
max_oo &amp;lt;- 50
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now set up the set of possible values for our first guess (in this case, square \(n\), which is even)&lt;/p&gt;

&lt;pre&gt;&lt;code class="r"&gt;possible_nn &amp;lt;- 2 * 1:(max_nn/2)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Instead of stopping the loop at the first solution, will save all of the combinations in a list outside the loop, to see if there are multiple solutions.&lt;/p&gt;

&lt;pre&gt;&lt;code class="r"&gt;possible_solutions &amp;lt;- list()
i &amp;lt;- 1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now create and check possible values under the rules above, looping across possible values for those not defined strictly by linear sums and moving onto the next possibility when it produces an incorrect combination of values:&lt;/p&gt;

&lt;pre&gt;&lt;code class="r"&gt;for (nn in possible_nn) {
    possible_oo &amp;lt;- (nn + 1):max_oo  # includes that o &amp;gt; n
    for (oo in possible_oo) {
        mm &amp;lt;- nn + oo
        qq &amp;lt;- mm + oo
        if ((qq%%4) != 0) 
            next
        ll &amp;lt;- mm + qq
        if (any(duplicated(c(nn, oo, mm, qq, ll)))) 
            next
        ss &amp;lt;- qq/4
        kk &amp;lt;- ll + ss
        uu &amp;lt;- kk + ss
        tt &amp;lt;- uu + ss
        if (any(duplicated(c(nn, oo, mm, qq, ll, ss, kk, uu, tt)))) 
            next
        possible_p &amp;lt;- (oo + 1):(ll - nn - 1)
        possible_p &amp;lt;- possible_p[!{
            possible_p %in% c(nn, oo, mm, qq, ll, ss, kk, uu, tt)
        }]  # filter out values already used, as numbers must be unique
        if (length(possible_p) == 0) 
            next
        for (pp in possible_p) {
            rr &amp;lt;- ll + tt - nn - pp
            jj &amp;lt;- rr - pp
            ii &amp;lt;- jj - pp
            gg &amp;lt;- qq + pp - ii - nn - mm
            ff &amp;lt;- gg - nn
            hh &amp;lt;- gg - ii
            ee &amp;lt;- ii + jj - hh
            dd &amp;lt;- ee - hh
            cc &amp;lt;- dd + ee
            bb &amp;lt;- cc + dd
            aa &amp;lt;- bb + ff

            all_values &amp;lt;- c(a = aa, b = bb, c = cc, d = dd, e = ee, 
                f = ff, g = gg, h = hh, i = ii, j = jj, k = kk, l = ll, 
                m = mm, n = nn, o = oo, p = pp, q = qq, r = rr, 
                s = ss, t = tt, u = uu)

            if (any(duplicated(all_values))) 
                next
            if (aa + bb + cc != uu + tt + rr) 
                next
            if (bb + cc != kk + uu) 
                next
            if (bb + tt != kk + ee + jj) 
                next

            if ((aa + bb + cc)^2 != sum(all_values^2)) 
                next

            # if execution reaches here, numbers fit criteria:
            possible_solutions[[i]] &amp;lt;- all_values
            i &amp;lt;- i + 1
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This produces the following (potential) solutions to the puzzle:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;## [[1]]
##  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u 
## 50 35 27  8 19 15 17 11  6 24 29 25  9  2  7 18 16 42  4 37 33 
## 
## [[2]]
##   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p   q   r 
## 100  70  54  16  38  30  34  22  12  48  58  50  18   4  14  36  32  84 
##   s   t   u 
##   8  74  66 
## 
## [[3]]
##   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p   q   r 
## 150 105  81  24  57  45  51  33  18  72  87  75  27   6  21  54  48 126 
##   s   t   u 
##  12 111  99 
## 
## [[4]]
##   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p   q   r 
## 200 140 108  32  76  60  68  44  24  96 116 100  36   8  28  72  64 168 
##   s   t   u 
##  16 148 132 
## 
## [[5]]
##   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p   q   r 
## 250 175 135  40  95  75  85  55  30 120 145 125  45  10  35  90  80 210 
##   s   t   u 
##  20 185 165 
## 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you can see, they are seem to be multiples of the first solution (when \(a = 50\), \(b = 35\), etc) suggesting a unique solution up to scalar multiples, but these still need to be confirmed. To do this will now attempt to plot the square with layout from the original puzzle, values from the first produced solution.&lt;/p&gt;

&lt;pre&gt;&lt;code class="r"&gt;library(ggplot2)
values &amp;lt;- as.list(possible_solutions[[1]])  # use first solution
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To set up the plot, need to manually create table of values of corner locations for each square. I used the image of the puzzle to create these points based on lengths of all squares in a given solution.&lt;/p&gt;

&lt;pre&gt;&lt;code class="r"&gt;squares &amp;lt;- list()

squares &amp;lt;- with(values, {
  sq &amp;lt;- list()
  sq$u &amp;lt;- c(x1 = 0, y1 = 0, 
            x2 = u, y2 = u)
  sq$u &amp;lt;- c(x1 = 0, y1 = 0, 
            x2 = u, y2 = u)
  sq$t &amp;lt;- c(x1 = u, y1 = 0, 
            x2 = u + t, y2 = t)
  sq$r &amp;lt;- c(x1 = u + t,  y1 = 0, 
            x2 = u + t + r,  y2 = r)
  sq$k &amp;lt;- c(x1 = 0, y1 = u, 
            x2 = k, y2 = u + k)
  sq$s &amp;lt;- c(x1 = k, y1 = u, 
            x2 = k + s, y2 = u + s)  
  sq$l &amp;lt;- c(x1 = k, y1 = u + s, 
            x2 = k + l, y2 = u + s + l)
  sq$q &amp;lt;- c(x1 = k + l, y1 = t, 
            x2 = k + l + q, y2 = t + q)
  sq$m &amp;lt;- c(x1 = k + l, y1 = t + q, 
            x2 = k + l + m, y2 = t + q + m)
  sq$o &amp;lt;- c(x1 = k + l + m, y1 = t + q, 
            x2 = k + l + m + o, y2 = t + q + o)
  sq$n &amp;lt;- c(x1 = k + l + m, y1 = t + q + o, 
            x2 = k + l + m + n, y2 = t + q + o + n)
  sq$p &amp;lt;- c(x1 = k + l + q, y1 = r, 
            x2 = k + l + q + p, y2 = r + p)
  sq$j &amp;lt;- c(x1 = k + l + q + p, y1 = r,
            x2 = k + l + q + p + j, y2 = r + j)
  sq$i &amp;lt;- c(x1 = a + f + g, y1 = r + p, 
            x2 = a + f + g + i, y2 = r + i)
  sq$a &amp;lt;- c(x1 = 0, y1 = k + u, 
            x2 = a, y2 = k + u + a)
  sq$b &amp;lt;- c(x1 = a, y1 = t + q + m + f, 
            x2 = a + b, y2 = t + q + m + f + b)
  sq$c &amp;lt;- c(x1 = a + b, y1 = r + j + e, 
            x2 = a + b + c, y2 = r + j + e + c)
  sq$d &amp;lt;- c(x1 = a + b, y1 = r + j + h, 
            x2 = a + b + d, y2 = r + j + h + d)
  sq$e &amp;lt;- c(x1 = a + b + d, y1 = r + j, 
            x2 = a + b + d + e, y2 = r + j + e)
  sq$f &amp;lt;- c(x1 = a, y1 = t + l, 
            x2 = a + f, y2 = t + l + f)
  sq$g &amp;lt;- c(x1 = a + f, y1 = t + q + o, 
            x2 = a + f + g, y2 = t + q + o + g)
  sq$h &amp;lt;- c(x1 = a + f + g, y1 = r + j, 
            x2 = a + f + g + h, y2 = r + j + h)
  sq$i &amp;lt;- c(x1 = a + f + g, y1 = r + p, 
            x2 = a + f + g + i, y2 = r + p + i)
  return(sq)
})

squares_df &amp;lt;- data.frame(do.call("rbind", squares), square = names(squares))
squares_df
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;##   x1 y1  x2  y2 square
## u  0  0  33  33      u
## t 33  0  70  37      t
## r 70  0 112  42      r
## k  0 33  29  62      k
## s 29 33  33  37      s
## l 29 37  54  62      l
## q 54 37  70  53      q
## m 54 53  63  62      m
## o 63 53  70  60      o
## n 63 60  65  62      n
## p 70 42  88  60      p
## j 88 42 112  66      j
## i 82 60  88  66      i
## a  0 62  50 112      a
## b 50 77  85 112      b
## c 85 85 112 112      c
## d 85 77  93  85      d
## e 93 66 112  85      e
## f 50 62  65  77      f
## g 65 60  82  77      g
## h 82 66  93  77      h
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now plot this to see if it matches the puzzle, using ggplot2 and the geom “geom_rect” for plotting the rectangles. To achieve random colouring, first rearranged the levels of the factor “square”:&lt;/p&gt;

&lt;pre&gt;&lt;code class="r"&gt;set.seed(1)
ggplot(squares_df) +  
  scale_x_continuous(name="x") + 
  scale_y_continuous(name="y") +
  geom_rect(aes(
      xmin = x1, 
      xmax = x2, 
      ymin = y1, 
      ymax = y2, 
      fill = factor(square, levels = sample(levels(square)))), 
    colour = "black") + 
  geom_text(aes(
    x = x1 + (x2 - x1) / 2, 
    y = y1 + (y2 - y1) / 2, 
    label = square)) +
  opts(legend.position = "none", title = "21 squares")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="data:image/png;base64,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" alt="plot of chunk plot_squares"/&gt;&lt;/p&gt;

&lt;h1&gt;Final solution!&lt;/h1&gt;

&lt;p&gt;As you can see, it has produced a correct solution:&lt;/p&gt;

&lt;pre&gt;&lt;code class="r"&gt;unlist(values)
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;##  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u 
## 50 35 27  8 19 15 17 11  6 24 29 25  9  2  7 18 16 42  4 37 33 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I&amp;#8217;m certain that further algebra playing, coming up with more equations perhaps from the picture, this result can be derived without these loops but it was definitely a fun exercise producing a solution this way.&lt;/p&gt;</description><link>http://www.actuarially.co.uk/post/26708774388</link><guid>http://www.actuarially.co.uk/post/26708774388</guid><pubDate>Sat, 07 Jul 2012 19:23:00 +0100</pubDate><category>R</category><category>ggplot2</category><category>the_actuary</category><category>square</category><category>puzzle</category><category>Matt Malin</category></item></channel></rss>
