<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://colbyschrauth.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://colbyschrauth.com/" rel="alternate" type="text/html" /><updated>2026-10-13T08:27:46-07:00</updated><id>https://colbyschrauth.com/feed.xml</id><title type="html">Colby Schrauth</title><subtitle>Thoughts, articles and a scrapbook from Colby Schrauth.</subtitle><entry><title type="html">An Illustrated Guide to Restricted Stock Units (RSUs)</title><link href="https://colbyschrauth.com/blog/rsu.html" rel="alternate" type="text/html" title="An Illustrated Guide to Restricted Stock Units (RSUs)" /><published>2020-05-17T00:00:00-07:00</published><updated>2020-05-17T00:00:00-07:00</updated><id>https://colbyschrauth.com/blog/rsu</id><content type="html" xml:base="https://colbyschrauth.com/blog/rsu.html"><![CDATA[<p><img src="/assets/rsu.png" alt="An illustrated, one-page guide to restricted stock units: grant, vesting, taxes and net shares" /></p>]]></content><author><name></name></author><category term="Guides" /><summary type="html"><![CDATA[A one-page illustrated guide to how restricted stock units vest, get taxed and show up on your paystub.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://colbyschrauth.com/assets/rsu.png" /><media:content medium="image" url="https://colbyschrauth.com/assets/rsu.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Measuring Equality in Python</title><link href="https://colbyschrauth.com/blog/measuring_equality_python.html" rel="alternate" type="text/html" title="Measuring Equality in Python" /><published>2017-06-04T00:00:00-07:00</published><updated>2017-06-04T00:00:00-07:00</updated><id>https://colbyschrauth.com/blog/measuring_equality_python</id><content type="html" xml:base="https://colbyschrauth.com/blog/measuring_equality_python.html"><![CDATA[<p>Distribution inequality can be measured via a Lorenz Curve and/or Gini Coefficient. Here’s a best attempt at defining both, in simple terms:</p>

<ul>
  <li><strong>Lorenz Curve</strong>: line chart visualizing the cumulative percentage of <em>something</em> (ie. distribution of wealth in a given country) for a given population</li>
  <li><strong>Gini Coefficient</strong>: a number from 0 to 1 representing the degree of equality (0 = complete equality, 1 = complete inequality)</li>
</ul>

<p>What is this used for? A common area is wealth distribution. For example, if one wanted to put a statistical lens over the popular US political slogan, “We are the 99%”. Internalizing the Gini Coefficient for a country’s distribution of wealth provokes a deeper understanding of the topic, as well as a measurement to contrast against other geographic locations.</p>

<p>The Lorenz Curve and Gini Coefficient can be used to represent the level of inequality in many places outside of wealth distribution as well. For example, it could be used to measure revenue concentration by customers, usage of datasets in a BI Tool, or usage of features in a Web Application.</p>

<p><strong>General steps for computing the Gini Coefficient:</strong></p>

<ul>
  <li>Load data of interest – in the example below we’re using a dataset containing 25 fictitious annual gross salaries</li>
  <li>Sort data in ascending order</li>
  <li>Store the line of perfect equality in an array</li>
  <li>Store the cumulative % of each individual annual income in an array</li>
  <li>Compute the area between the line of perfect equality and the distribution of income</li>
</ul>

<p>Now, let’s rock this out in Python:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Import necessary libraries
</span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">division</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="n">pd</span>

<span class="c1"># Load dataset and store dataframe in variable 'df'
# 25 randomly selected income values w/ a range of $50k – $250k
</span><span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s">'http://bit.ly/2eaP6ny'</span><span class="p">,</span> <span class="n">header</span> <span class="o">=</span> <span class="bp">None</span><span class="p">)</span>
<span class="n">df</span> <span class="o">=</span> <span class="n">df</span>

<span class="c1"># Sort, and store in variable 'raw_data'
# Use of np.sort automatically converts to numpy array
</span><span class="n">raw_data</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">sort</span><span class="p">(</span><span class="n">df</span><span class="p">)</span>

<span class="c1"># The perfect equality y values. Cumulative percentage of incomes
</span><span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">linspace</span><span class="p">(</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">raw_data</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>

<span class="c1"># Create y-axis values for line of perfect equality, which is equal to x
</span><span class="n">y_pe</span> <span class="o">=</span> <span class="n">x</span>

<span class="c1"># Create an empty list to store cumulative % of income
# Start w/ an initial value of '0.0' to match list length of variable 'y_pe'
</span><span class="n">y</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">]</span>

<span class="c1"># Compute % income to total income, and append to list y
</span><span class="k">for</span> <span class="n">data_point</span> <span class="ow">in</span> <span class="n">raw_data</span><span class="p">:</span>
    <span class="n">y</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">data_point</span> <span class="o">/</span> <span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nb">sum</span><span class="p">(</span><span class="n">raw_data</span><span class="p">)))</span>

<span class="c1"># Calculte cumulative % incomes in list y
</span><span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">cumsum</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>

<span class="c1"># Calculate the area below the perfect equality line
</span><span class="n">area_perfect</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">trapz</span><span class="p">(</span><span class="n">y_pe</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>

<span class="c1"># Compute the area using the composite trapezoidal rule
</span><span class="n">area_lorenz</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">trapz</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
<span class="n">area_lorenz</span>

<span class="c1"># Compute the gini coefficient
# Divide the difference of 'area_perfect' and 'area_lorenz' by 'area_perfect'
</span><span class="n">gini_coeff</span> <span class="o">=</span> <span class="p">(</span><span class="n">area_perfect</span> <span class="o">-</span> <span class="n">area_lorenz</span><span class="p">)</span><span class="o">/</span><span class="n">area_perfect</span>

<span class="c1"># Print gini coefficient (Answer = .19)
</span><span class="k">print</span> <span class="p">(</span><span class="n">gini_coeff</span><span class="p">)</span>

<span class="c1"># --------------------------------------------------
</span>
<span class="c1"># Import visualization libraries
</span><span class="kn">from</span> <span class="nn">bokeh.models</span> <span class="kn">import</span> <span class="n">SingleIntervalTicker</span><span class="p">,</span> <span class="n">LinearAxis</span><span class="p">,</span> <span class="n">HoverTool</span><span class="p">,</span> <span class="n">CrosshairTool</span>
<span class="kn">from</span> <span class="nn">bokeh.charts</span> <span class="kn">import</span> <span class="n">Bar</span><span class="p">,</span> <span class="n">output_file</span><span class="p">,</span> <span class="n">show</span><span class="p">,</span> <span class="n">output_notebook</span>
<span class="kn">from</span> <span class="nn">bokeh.plotting</span> <span class="kn">import</span> <span class="n">figure</span><span class="p">,</span> <span class="n">output_file</span><span class="p">,</span> <span class="n">show</span>

<span class="n">p</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">x_axis_type</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">y_axis_type</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">plot_width</span><span class="o">=</span><span class="mi">750</span><span class="p">,</span> <span class="n">plot_height</span><span class="o">=</span><span class="mi">750</span><span class="p">)</span>
<span class="n">ticker</span> <span class="o">=</span> <span class="n">SingleIntervalTicker</span><span class="p">(</span><span class="n">interval</span><span class="o">=</span><span class="p">.</span><span class="mi">1</span><span class="p">,</span> <span class="n">num_minor_ticks</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
<span class="n">xaxis</span> <span class="o">=</span> <span class="n">LinearAxis</span><span class="p">(</span><span class="n">ticker</span><span class="o">=</span><span class="n">ticker</span><span class="p">)</span>
<span class="n">yaxis</span> <span class="o">=</span> <span class="n">LinearAxis</span><span class="p">(</span><span class="n">ticker</span><span class="o">=</span><span class="n">ticker</span><span class="p">)</span>
<span class="n">p</span><span class="p">.</span><span class="n">add_layout</span><span class="p">(</span><span class="n">xaxis</span><span class="p">,</span> <span class="s">'below'</span><span class="p">)</span><span class="c1"># Add hover to this comma-separated string and see what changes
</span><span class="n">p</span><span class="p">.</span><span class="n">add_layout</span><span class="p">(</span><span class="n">yaxis</span><span class="p">,</span> <span class="s">'left'</span><span class="p">)</span>
<span class="n">p</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">line_width</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>

<span class="n">p</span><span class="p">.</span><span class="n">xaxis</span><span class="p">.</span><span class="n">axis_label</span> <span class="o">=</span> <span class="s">"Cumulative % of Income"</span>
<span class="n">p</span><span class="p">.</span><span class="n">xaxis</span><span class="p">.</span><span class="n">axis_label_standoff</span> <span class="o">=</span> <span class="mi">25</span>

<span class="n">p</span><span class="p">.</span><span class="n">yaxis</span><span class="p">.</span><span class="n">axis_label</span> <span class="o">=</span> <span class="s">"Cumulative % of Population"</span>
<span class="n">p</span><span class="p">.</span><span class="n">yaxis</span><span class="p">.</span><span class="n">axis_label_standoff</span> <span class="o">=</span> <span class="mi">25</span>

<span class="c1"># Configure visual properties on a plot's title attribute
</span><span class="n">p</span><span class="p">.</span><span class="n">title</span><span class="p">.</span><span class="n">text</span><span class="o">=</span><span class="s">"Lorenz Curve for Income Distribution, Gini Coefficient = %f"</span> <span class="o">%</span><span class="n">gini_coeff</span>
<span class="n">p</span><span class="p">.</span><span class="n">title</span><span class="p">.</span><span class="n">align</span> <span class="o">=</span> <span class="s">"center"</span>
<span class="n">p</span><span class="p">.</span><span class="n">title</span><span class="p">.</span><span class="n">text_font_size</span><span class="o">=</span><span class="s">'10pt'</span>

<span class="n">output_notebook</span><span class="p">()</span>
<span class="n">show</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
</code></pre></div></div>

<p>The code is also on <a href="https://gist.github.com/colby-schrauth/3eaf03f2234b8e85c62aeb531987c988">GitHub as a gist</a>.</p>]]></content><author><name></name></author><category term="Data" /><summary type="html"><![CDATA[What the Lorenz Curve and Gini Coefficient are, and how to compute them in Python.]]></summary></entry></feed>