<?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://rshafranek.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://rshafranek.github.io/" rel="alternate" type="text/html" /><updated>2026-08-13T17:13:23+00:00</updated><id>https://rshafranek.github.io/feed.xml</id><title type="html"> </title><subtitle>Definitely A Website.</subtitle><author><name>Richard M. Shafranek</name></author><entry><title type="html">Where I’ve Been: Analyzing Ten Years of Google Location History with R</title><link href="https://rshafranek.github.io/location-history/" rel="alternate" type="text/html" title="Where I’ve Been: Analyzing Ten Years of Google Location History with R" /><published>2024-05-23T00:00:00+00:00</published><updated>2024-05-23T00:00:00+00:00</updated><id>https://rshafranek.github.io/location-history</id><content type="html" xml:base="https://rshafranek.github.io/location-history/"><![CDATA[<h2 id="location-history-data">Location history data</h2>
<p><em>Updated 5-Jun-2025</em></p>

<p>I’ve been using Google Location History ever since switching to an
Android device in mid-2016. Many people, understandably concerned about
their privacy or just plain creeped out by the concept, turn location
history off, but I appreciate the way it effortlessly creates a record
of my days. It’s like an auto-generated diary that eliminates the hassle
of having to write down your deeds by hand.</p>

<p>It’s pretty easy to view your history at <a href="https://timeline.google.com/">https://timeline.google.com/</a>,
but I wanted to export my data, analyze it, and create some custom
plots.</p>

<p>Exporting your data yields a series of deeply nested .json files. They
can be tricky to work with, but fortunately volunteers have provided
helpful and extensive documentation at
<a href="https://locationhistoryformat.com/">https://locationhistoryformat.com/</a>.</p>

<p>For the sake of readers who might be interested in replicating these
plots with their own Location History data, I’ve included my R code in
this post. We’ll start by loading necessary packages and then importing
the data.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">### import necessary packages</span><span class="w">

</span><span class="n">library</span><span class="p">(</span><span class="n">jsonlite</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">tidyverse</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">sf</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">tigris</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggrepel</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">rnaturalearth</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">rnaturalearthdata</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">plotly</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">lutz</span><span class="p">)</span><span class="w"> </span><span class="c1"># for time zones</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">viridis</span><span class="p">)</span><span class="w"> </span><span class="c1"># for nice graph colors</span><span class="w">
</span></code></pre></div></div>
<p>Rather than a single convenient file, Google generates Location History .json files for each month, so we’ll need to piece them together for the purposes of this anaylsis:</p>
<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">### load the data</span><span class="w">

</span><span class="c1"># loop through each folder in the directory</span><span class="w">
</span><span class="k">for</span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">list.files</span><span class="p">(</span><span class="s2">"Location History (Timeline)/Semantic Location History/"</span><span class="p">)){</span><span class="w">
  
  </span><span class="c1"># loop through the files in each folder</span><span class="w">
  </span><span class="k">for</span><span class="p">(</span><span class="n">j</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">list.files</span><span class="p">(</span><span class="n">paste0</span><span class="p">(</span><span class="s2">"Location History (Timeline)/Semantic Location History/"</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="p">))){</span><span class="w">
    
    </span><span class="c1"># paste together the full file path</span><span class="w">
    </span><span class="n">file</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">paste0</span><span class="p">(</span><span class="s2">"Location History (Timeline)/Semantic Location History/"</span><span class="p">,</span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="s2">"/"</span><span class="p">,</span><span class="w"> </span><span class="n">j</span><span class="p">)</span><span class="w">
    
    </span><span class="c1"># import individual json files</span><span class="w">
    </span><span class="n">place_visits_raw_temp</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">read_json</span><span class="p">(</span><span class="n">file</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">pluck</span><span class="p">(</span><span class="s2">"timelineObjects"</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">purrr</span><span class="o">::</span><span class="n">map</span><span class="p">(</span><span class="s2">"placeVisit"</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">compact</span><span class="p">()</span><span class="w">
    
    </span><span class="c1"># convert the json to a tibble</span><span class="w">
    </span><span class="n">place_visits_temp</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">place_visits_raw_temp</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">purrr</span><span class="o">::</span><span class="n">map</span><span class="p">(</span><span class="o">~</span><span class="p">{</span><span class="w">
      </span><span class="n">tibble</span><span class="p">(</span><span class="w">
        </span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">.x</span><span class="o">$</span><span class="n">location</span><span class="o">$</span><span class="n">placeId</span><span class="p">,</span><span class="w">
        </span><span class="n">latitudeE7</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">.x</span><span class="o">$</span><span class="n">location</span><span class="o">$</span><span class="n">latitudeE7</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">1e7</span><span class="p">,</span><span class="w">
        </span><span class="n">longitudeE7</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">.x</span><span class="o">$</span><span class="n">location</span><span class="o">$</span><span class="n">longitudeE7</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">1e7</span><span class="p">,</span><span class="w">
        </span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">.x</span><span class="o">$</span><span class="n">location</span><span class="o">$</span><span class="n">name</span><span class="p">,</span><span class="w">
        </span><span class="n">address</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">.x</span><span class="o">$</span><span class="n">location</span><span class="o">$</span><span class="n">address</span><span class="p">,</span><span class="w">
        </span><span class="n">startTimestamp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ymd_hms</span><span class="p">(</span><span class="n">.x</span><span class="o">$</span><span class="n">duration</span><span class="o">$</span><span class="n">startTimestamp</span><span class="p">,</span><span class="w"> </span><span class="n">tz</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"UTC"</span><span class="p">),</span><span class="w">
        </span><span class="n">endTimestamp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ymd_hms</span><span class="p">(</span><span class="n">.x</span><span class="o">$</span><span class="n">duration</span><span class="o">$</span><span class="n">endTimestamp</span><span class="p">,</span><span class="w"> </span><span class="n">tz</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"UTC"</span><span class="p">)</span><span class="w">
      </span><span class="p">)</span><span class="w">
    </span><span class="p">})</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">list_rbind</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">mutate</span><span class="p">(</span><span class="n">duration</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">endTimestamp</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">startTimestamp</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">st_as_sf</span><span class="p">(</span><span class="n">coords</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"longitudeE7"</span><span class="p">,</span><span class="w"> </span><span class="s2">"latitudeE7"</span><span class="p">),</span><span class="w"> </span><span class="n">crs</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">st_crs</span><span class="p">(</span><span class="s2">"EPSG:4326"</span><span class="p">))</span><span class="w">
    
    </span><span class="c1"># merge each tibble with all the data we've loaded so far</span><span class="w">
    </span><span class="n">places</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">rbind</span><span class="p">(</span><span class="n">places</span><span class="p">,</span><span class="w"> </span><span class="n">place_visits_temp</span><span class="p">)</span><span class="w">
    
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<h2 id="visits-over-time">Visits over time</h2>

<p>I’ll start by visualizing my visits over time. First, we’ll tidy up the
data and create some useful date- and time-related helper variables.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">### creating time-related variables</span><span class="w">

</span><span class="c1"># create year, month, day, and day of the week variables from "startTimestamp"</span><span class="w">
</span><span class="n">places</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">places</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">mutate</span><span class="p">(</span><span class="n">year</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">year</span><span class="p">(</span><span class="n">startTimestamp</span><span class="p">),</span><span class="w"> </span><span class="n">month</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">month</span><span class="p">(</span><span class="n">startTimestamp</span><span class="p">),</span><span class="w"> </span><span class="n">day</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">day</span><span class="p">(</span><span class="n">startTimestamp</span><span class="p">),</span><span class="w"> </span><span class="n">weekday</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">factor</span><span class="p">(</span><span class="n">weekdays</span><span class="p">(</span><span class="n">as.Date</span><span class="p">(</span><span class="n">places</span><span class="o">$</span><span class="n">startTimestamp</span><span class="p">)),</span><span class="w"> </span><span class="n">levels</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="s2">"Monday"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Tuesday"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Wednesday"</span><span class="p">,</span><span class="s2">"Thursday"</span><span class="p">,</span><span class="s2">"Friday"</span><span class="p">,</span><span class="s2">"Saturday"</span><span class="p">,</span><span class="s2">"Sunday"</span><span class="p">)))</span><span class="w">

</span><span class="c1"># this data spans multiple timezones, but all time is UTC</span><span class="w">
</span><span class="c1"># let's convert UTC time to local time based on geography</span><span class="w">
</span><span class="n">places</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">places</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">  </span><span class="n">mutate</span><span class="p">(</span><span class="n">tz</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">tz_lookup</span><span class="p">(</span><span class="n">.</span><span class="p">,</span><span class="w"> </span><span class="n">method</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"accurate"</span><span class="p">))</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">mutate</span><span class="p">(</span><span class="n">timestamp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ymd_hms</span><span class="p">(</span><span class="n">startTimestamp</span><span class="p">,</span><span class="w"> </span><span class="n">tz</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"UTC"</span><span class="p">))</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">group_by</span><span class="p">(</span><span class="n">tz</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> 
  </span><span class="n">mutate</span><span class="p">(</span><span class="n">timestamp_local</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">force_tz</span><span class="p">(</span><span class="n">with_tz</span><span class="p">(</span><span class="n">timestamp</span><span class="p">,</span><span class="w"> </span><span class="n">tz</span><span class="p">),</span><span class="w"> </span><span class="s2">"UTC"</span><span class="p">))</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> 
  </span><span class="n">ungroup</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">mutate</span><span class="p">(</span><span class="n">time_of_day</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">format</span><span class="p">(</span><span class="n">ymd_hms</span><span class="p">(</span><span class="n">timestamp_local</span><span class="p">),</span><span class="w"> </span><span class="s2">"%H:%M:%S"</span><span class="p">))</span><span class="w">
</span></code></pre></div></div>

<p>Like most people, I stayed home a lot more during the pandemic, and I
imagine that’s reflected in the data. Below, I plot the number of places
I visited per month:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">### plot visits by month</span><span class="w">

</span><span class="n">places</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">filter</span><span class="p">(</span><span class="n">as.Date</span><span class="p">(</span><span class="n">startTimestamp</span><span class="p">)</span><span class="o">&lt;=</span><span class="s2">"2024-04-30"</span><span class="o">&amp;</span><span class="n">as.Date</span><span class="p">(</span><span class="n">startTimestamp</span><span class="p">)</span><span class="o">&gt;=</span><span class="s2">"2016-07-01"</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> 
  </span><span class="n">mutate</span><span class="p">(</span><span class="n">year_month</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">as.Date</span><span class="p">(</span><span class="n">paste</span><span class="p">(</span><span class="n">year</span><span class="p">,</span><span class="w"> </span><span class="n">month</span><span class="p">,</span><span class="w"> </span><span class="s2">"01"</span><span class="p">,</span><span class="w"> </span><span class="n">sep</span><span class="o">=</span><span class="s2">"-"</span><span class="p">)))</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> 
  </span><span class="n">group_by</span><span class="p">(</span><span class="n">year_month</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> 
  </span><span class="n">dplyr</span><span class="o">::</span><span class="n">summarise</span><span class="p">(</span><span class="n">count</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">n</span><span class="p">())</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> 
  </span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">year_month</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="o">=</span><span class="n">count</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">geom_line</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">labs</span><span class="p">(</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Place visits by month"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Date"</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Number of places visited"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">geom_vline</span><span class="p">(</span><span class="n">xintercept</span><span class="o">=</span><span class="n">ymd</span><span class="p">(</span><span class="s2">"2020-03-01"</span><span class="p">),</span><span class="w"> </span><span class="n">linetype</span><span class="o">=</span><span class="s2">"dashed"</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="o">=</span><span class="s2">"red"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">annotate</span><span class="p">(</span><span class="s2">"rect"</span><span class="p">,</span><span class="w"> </span><span class="n">xmin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ymd</span><span class="p">(</span><span class="s2">"2020-03-01"</span><span class="p">),</span><span class="w"> </span><span class="n">xmax</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ymd</span><span class="p">(</span><span class="s2">"2021-06-17"</span><span class="p">),</span><span class="w"> </span><span class="n">ymin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">-50</span><span class="p">,</span><span class="w"> </span><span class="n">ymax</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">250</span><span class="p">,</span><span class="w"> </span><span class="n">alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.2</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"grey"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">geom_vline</span><span class="p">(</span><span class="n">xintercept</span><span class="o">=</span><span class="n">ymd</span><span class="p">(</span><span class="s2">"2021-06-17"</span><span class="p">),</span><span class="w"> </span><span class="n">linetype</span><span class="o">=</span><span class="s2">"dashed"</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="o">=</span><span class="s2">"red"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">coord_cartesian</span><span class="p">(</span><span class="n">ylim</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="m">200</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">theme_bw</span><span class="p">()</span><span class="w"> 
</span></code></pre></div></div>

<p><img src="/images/visits_plot-1.png" width="100%" /></p>

<p>There’s definitely a visible dip between March 2020 (when U.S. lockdowns
began) and June 2021 (when I was fully vaccinated). Besides overall
visits, I wondered whether I would see any pandemic-related trends in
terms of the <em>kinds</em> of places I tended to visit. Google does a pretty
good job of filling in the names for places you visit, but it doesn’t
get them all right, and obviously it can’t name residential addresses
for you. Offscreen, I used dplyr::case_when to create a category
variable. Let’s use it to plot my visits by category over time:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">### plot category proportion over time</span><span class="w">

</span><span class="n">places</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">as.data.frame</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">filter</span><span class="p">(</span><span class="n">as.Date</span><span class="p">(</span><span class="n">startTimestamp</span><span class="p">)</span><span class="o">&lt;=</span><span class="s2">"2024-04-30"</span><span class="o">&amp;</span><span class="n">as.Date</span><span class="p">(</span><span class="n">startTimestamp</span><span class="p">)</span><span class="o">&gt;=</span><span class="s2">"2016-07-01"</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> 
  </span><span class="n">mutate</span><span class="p">(</span><span class="n">year_month</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">as.Date</span><span class="p">(</span><span class="n">paste</span><span class="p">(</span><span class="n">year</span><span class="p">,</span><span class="w"> </span><span class="n">month</span><span class="p">,</span><span class="w"> </span><span class="s2">"01"</span><span class="p">,</span><span class="w"> </span><span class="n">sep</span><span class="o">=</span><span class="s2">"-"</span><span class="p">)))</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> 
  </span><span class="n">group_by</span><span class="p">(</span><span class="n">year_month</span><span class="p">,</span><span class="w"> </span><span class="n">category</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> 
  </span><span class="n">dplyr</span><span class="o">::</span><span class="n">summarise</span><span class="p">(</span><span class="n">visits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">n</span><span class="p">()))</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> 
  </span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">year_month</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="o">=</span><span class="n">visits</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="o">=</span><span class="n">category</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w"> 
  </span><span class="n">geom_area</span><span class="p">(</span><span class="n">position</span><span class="o">=</span><span class="n">position_fill</span><span class="p">())</span><span class="w"> </span><span class="o">+</span><span class="w"> 
  </span><span class="n">theme_minimal</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">xlab</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">ylab</span><span class="p">(</span><span class="s2">"Proportion of places"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">guides</span><span class="p">(</span><span class="n">fill</span><span class="o">=</span><span class="n">guide_legend</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s2">"Category"</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w"> 
  </span><span class="n">scale_fill_viridis</span><span class="p">(</span><span class="n">discrete</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">T</span><span class="p">,</span><span class="w"> </span><span class="n">direction</span><span class="o">=</span><span class="m">-1</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">annotate</span><span class="p">(</span><span class="s2">"rect"</span><span class="p">,</span><span class="w"> </span><span class="n">xmin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ymd</span><span class="p">(</span><span class="s2">"2020-03-01"</span><span class="p">),</span><span class="w"> </span><span class="n">xmax</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ymd</span><span class="p">(</span><span class="s2">"2021-06-17"</span><span class="p">),</span><span class="w"> </span><span class="n">ymin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">-0</span><span class="p">,</span><span class="w"> </span><span class="n">ymax</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.1</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"white"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">geom_vline</span><span class="p">(</span><span class="n">xintercept</span><span class="o">=</span><span class="n">ymd</span><span class="p">(</span><span class="s2">"2020-03-01"</span><span class="p">),</span><span class="w"> </span><span class="n">linetype</span><span class="o">=</span><span class="s2">"dashed"</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="o">=</span><span class="s2">"red"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">geom_vline</span><span class="p">(</span><span class="n">xintercept</span><span class="o">=</span><span class="n">ymd</span><span class="p">(</span><span class="s2">"2021-06-17"</span><span class="p">),</span><span class="w"> </span><span class="n">linetype</span><span class="o">=</span><span class="s2">"dashed"</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="o">=</span><span class="s2">"red"</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<p><img src="/images/stacked_plot-1.png" width="100%" /></p>

<p>I don’t know that this view offers too many new insights, but the
proportion of my visits that were “home” definitely increased and the
proportion that were “bars &amp; restaurants) definitely decreased during
the initial phase of the pandemic. Separately, you can see a couple of
spikes in mid-2022 and early 2023 when I paid friends &amp; family extended
visits.</p>

<p>I was curious about what other time-related patterns might appear in the
data. Chi-squared tests reveal–somewhat predictably–that the number of
places I visit varies significantly based on day of the week and month
of the year (I tend to visit more places during the warmer months and on
weekends). I also visualized my visits by hour:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">### plot visits by hour</span><span class="w">

</span><span class="n">places</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">  </span><span class="n">mutate</span><span class="p">(</span><span class="n">hour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hour</span><span class="p">(</span><span class="n">hms</span><span class="p">(</span><span class="n">time_of_day</span><span class="p">)))</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> 
  </span><span class="n">group_by</span><span class="p">(</span><span class="n">hour</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> 
  </span><span class="n">dplyr</span><span class="o">::</span><span class="n">summarise</span><span class="p">(</span><span class="n">visits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">n</span><span class="p">())</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> 
  </span><span class="n">drop_na</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> 
  </span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">factor</span><span class="p">(</span><span class="n">hour</span><span class="p">),</span><span class="w"> </span><span class="n">y</span><span class="o">=</span><span class="n">visits</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w"> 
  </span><span class="n">geom_col</span><span class="p">(</span><span class="n">fill</span><span class="o">=</span><span class="s2">"steelblue"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">ylim</span><span class="p">(</span><span class="m">-500</span><span class="p">,</span><span class="m">1260</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> 
  </span><span class="n">theme_minimal</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w"> 
  </span><span class="n">coord_polar</span><span class="p">(</span><span class="n">start</span><span class="o">=-</span><span class="nb">pi</span><span class="o">/</span><span class="m">12</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> 
  </span><span class="n">scale_x_discrete</span><span class="p">(</span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="o">:</span><span class="m">23</span><span class="p">,</span><span class="w"> </span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"12 AM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"1 AM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"2 AM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"3 AM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"4 AM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"5 AM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"6 AM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"7 AM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"8 AM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"9 AM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"10 AM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"11 AM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"12 PM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"1 PM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"2 PM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"3 PM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"4 PM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"5 PM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"6 PM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"7 PM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"8 PM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"9 PM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"10 PM"</span><span class="p">,</span><span class="w"> </span><span class="s2">"11 PM"</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">labs</span><span class="p">(</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Number of Visits by Hour of the Day"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> 
  </span><span class="n">theme</span><span class="p">(</span><span class="n">legend.position</span><span class="o">=</span><span class="s2">"none"</span><span class="p">,</span><span class="w"> </span><span class="n">axis.text.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">10</span><span class="p">,</span><span class="w"> </span><span class="n">angle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">vjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.5</span><span class="p">,</span><span class="w"> </span><span class="n">hjust</span><span class="o">=</span><span class="m">1</span><span class="p">),</span><span class="w"> </span><span class="n">axis.text.y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w"> </span><span class="n">axis.ticks.y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w"> </span><span class="n">aspect.ratio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">annotate</span><span class="p">(</span><span class="s2">"rect"</span><span class="p">,</span><span class="w"> </span><span class="n">xmin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="kc">Inf</span><span class="p">,</span><span class="w"> </span><span class="n">xmax</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">Inf</span><span class="p">,</span><span class="w"> </span><span class="n">ymin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="kc">Inf</span><span class="p">,</span><span class="w"> </span><span class="n">ymax</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"white"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">annotate</span><span class="p">(</span><span class="s2">"point"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">-500</span><span class="p">,</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">38</span><span class="p">,</span><span class="w"> </span><span class="n">shape</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">21</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"white"</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"steelblue"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">annotate</span><span class="p">(</span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">20</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<p><img src="/images/clock-1.png" width="100%" /></p>

<p>Very reasonably, the bulk of my activity occurs between 11 AM and 7 PM,
with virtually no activity recorded between the wee hours of midnight to
7 AM.</p>

<h2 id="plotting-my-location">Plotting my location</h2>

<p>More than anything else, I wanted to create a nice little visualization
of all the places I’ve been. I added a little additional information to
the plot to make it more interesting: each point’s <strong>color</strong> indicates
the recency of the visits (with green points being more recent, and red
points being longer ago), and each each point’s <strong>size</strong> indicates the
duration of a visit (larger points indicate longer durations).</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">### set up and display all visits</span><span class="w">

</span><span class="c1"># first, load shapefiles for the U.S. (so we can break out individual states) and the world</span><span class="w">
</span><span class="n">world</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">ne_countries</span><span class="p">(</span><span class="n">scale</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"medium"</span><span class="p">,</span><span class="w"> </span><span class="n">returnclass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"sf"</span><span class="p">)</span><span class="w">
</span><span class="n">us_states</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">states</span><span class="p">(</span><span class="n">resolution</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"20m"</span><span class="p">,</span><span class="w"> </span><span class="n">year</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2022</span><span class="p">,</span><span class="w"> </span><span class="n">cb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">)</span><span class="w">

</span><span class="c1"># let's create some labels for the countries I visited</span><span class="w">
</span><span class="n">world_points</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">st_centroid</span><span class="p">(</span><span class="n">world</span><span class="p">)</span><span class="w">
</span><span class="n">world_points</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">cbind</span><span class="p">(</span><span class="n">world</span><span class="p">,</span><span class="w"> </span><span class="n">st_coordinates</span><span class="p">(</span><span class="n">st_centroid</span><span class="p">(</span><span class="n">world</span><span class="o">$</span><span class="n">geometry</span><span class="p">)))</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">filter</span><span class="p">(</span><span class="n">continent</span><span class="o">==</span><span class="s2">"Europe"</span><span class="o">|</span><span class="n">continent</span><span class="o">==</span><span class="s2">"North America"</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">filter</span><span class="p">((</span><span class="n">name_en</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"United States of America"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Ireland"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Iceland"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Canada"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Germany"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Belgium"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Netherlands"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Czech Republic"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Hungary"</span><span class="p">)))</span><span class="w">

</span><span class="c1"># next, we'll define a narrower trip window -- we don't need to see the *whole* world</span><span class="w">
</span><span class="n">trip_window</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">st_sfc</span><span class="p">(</span><span class="w">
  </span><span class="n">st_point</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="m">-125.000</span><span class="p">,</span><span class="w"> </span><span class="m">27.5</span><span class="p">)),</span><span class="w">  </span><span class="c1"># left (west), bottom (south)</span><span class="w">
  </span><span class="n">st_point</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="m">20.000</span><span class="p">,</span><span class="w"> </span><span class="m">65.000</span><span class="p">)),</span><span class="w">   </span><span class="c1"># right (east), top (north)</span><span class="w">
  </span><span class="n">crs</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">st_crs</span><span class="p">(</span><span class="s2">"EPSG:4326"</span><span class="p">)</span><span class="w"> 
</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> 
  </span><span class="n">st_coordinates</span><span class="p">()</span><span class="w">

</span><span class="c1"># convert 'year' to a factor for plotting purposes</span><span class="w">
</span><span class="n">places</span><span class="o">$</span><span class="n">year</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">as.factor</span><span class="p">(</span><span class="n">places</span><span class="o">$</span><span class="n">year</span><span class="p">)</span><span class="w">

</span><span class="c1"># finally, we'll set up and display the plot</span><span class="w">
</span><span class="n">all_visits</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">ggplot</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">geom_sf</span><span class="p">(</span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">world</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">geom_sf</span><span class="p">(</span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">us_states</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="o">=</span><span class="kc">NA</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">theme</span><span class="p">(</span><span class="n">panel.grid.major</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_line</span><span class="p">(</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gray</span><span class="p">(</span><span class="m">.5</span><span class="p">),</span><span class="w"> </span><span class="n">linetype</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"dashed"</span><span class="p">,</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.25</span><span class="p">),</span><span class="w"> </span><span class="n">panel.background</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_rect</span><span class="p">(</span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"aliceblue"</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">geom_sf</span><span class="p">(</span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">places</span><span class="p">,</span><span class="w"> </span><span class="n">aes</span><span class="p">(</span><span class="n">fill</span><span class="o">=</span><span class="n">year</span><span class="p">,</span><span class="w"> </span><span class="n">size</span><span class="o">=</span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">duration</span><span class="p">),</span><span class="w">  </span><span class="n">text</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paste</span><span class="p">(</span><span class="w">
  </span><span class="s2">"Year: "</span><span class="p">,</span><span class="w"> </span><span class="n">year</span><span class="p">,</span><span class="w"> </span><span class="s2">"&lt;br&gt;"</span><span class="p">,</span><span class="w">
  </span><span class="s2">"Duration (minutes): "</span><span class="p">,</span><span class="w"> </span><span class="nf">round</span><span class="p">(</span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">duration</span><span class="p">),</span><span class="w"> </span><span class="n">digits</span><span class="o">=</span><span class="m">0</span><span class="p">),</span><span class="w"> </span><span class="s2">"&lt;br&gt;"</span><span class="w">
</span><span class="p">)),</span><span class="w"> </span><span class="n">shape</span><span class="o">=</span><span class="m">21</span><span class="p">,</span><span class="w"> </span><span class="n">stroke</span><span class="o">=</span><span class="m">.25</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="o">=</span><span class="s2">"black"</span><span class="w">
</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">scale_fill_brewer</span><span class="p">(</span><span class="n">palette</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"PiYG"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> 
  </span><span class="n">coord_sf</span><span class="p">(</span><span class="w">
  </span><span class="n">xlim</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">trip_window</span><span class="p">[,</span><span class="w"> </span><span class="s2">"X"</span><span class="p">],</span><span class="w">
  </span><span class="n">ylim</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">trip_window</span><span class="p">[,</span><span class="w"> </span><span class="s2">"Y"</span><span class="p">])</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">ggtitle</span><span class="p">(</span><span class="s2">"Places I've been, June 2016 - May 2024"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">geom_text_repel</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="w"> </span><span class="n">world_points</span><span class="p">,</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">X</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="o">=</span><span class="n">Y</span><span class="p">,</span><span class="w"> </span><span class="n">label</span><span class="o">=</span><span class="n">name</span><span class="p">),</span><span class="w"> </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"darkblue"</span><span class="p">,</span><span class="w"> </span><span class="n">fontface</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">,</span><span class="w"> </span><span class="n">check_overlap</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">,</span><span class="w"> </span><span class="n">nudge_y</span><span class="o">=</span><span class="m">1.5</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">guides</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="s2">"none"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">theme</span><span class="p">(</span><span class="n">axis.title.x</span><span class="o">=</span><span class="n">element_blank</span><span class="p">(),</span><span class="w"> </span><span class="n">axis.title.y</span><span class="o">=</span><span class="n">element_blank</span><span class="p">())</span><span class="w">
</span><span class="n">all_visits</span><span class="w">
</span></code></pre></div></div>

<p><img src="/images/mapplot-1.png" width="100%" /></p>

<p>Very nice! You can see that the bulk of my activity is confined to the
Midwest, particularly Illinois (I live in Chicago) and Ohio (where I’m
from); I also spent a fair amount of time exploring Wisconsin and (to a
lesser extent) Michigan and Indiana.</p>

<p>Finally, I created an interactive version of this plot that allows you
to pan, zoom, and filter by year. Feel free to explore my timeline
yourself:</p>

<h2 id="interactive-plotly-plot">Interactive (plotly) plot</h2>
<!-- ## Interactive (plotly) plot -->
<iframe src="/images/interactive_map_2025.html" width="100%" height="600"></iframe>

<h2 id="conclusion">Conclusion</h2>

<p>There’s a wealth of data contained in your Google Location History. I
think it’s pretty understandable to be concerned about how it might be
used–and maybe silly to leave it on unless you’re going to use that data
yourself! If you start poking around, though, there’s a lot you can
learn about your own habits and patterns. I’ve only scratched the
surface in these analyses, and I’ll likely keep digging!</p>]]></content><author><name>Richard M. Shafranek</name></author><summary type="html"><![CDATA[In this post, I export and analyze ~10 years of my Google Location History using R. What I find might shock you!]]></summary></entry><entry><title type="html">AI-Generated Political Science Article Names</title><link href="https://rshafranek.github.io/AI_articles/" rel="alternate" type="text/html" title="AI-Generated Political Science Article Names" /><published>2018-08-28T00:00:00+00:00</published><updated>2018-08-28T00:00:00+00:00</updated><id>https://rshafranek.github.io/AI_articles</id><content type="html" xml:base="https://rshafranek.github.io/AI_articles/"><![CDATA[<p>For fun and simply because I could (without stopping to ask whether I <em>should</em>), I trained a neural network to generate political science article names.</p>

<p>Specifically, I used a Python-based implementation of a recurrent neural network to generate new article names based on a novel dataset of 4,520 political science publications. This dataset includes every article published from 2008-2017 (excluding letters, editorials, and book reviews) in the following journals: <em>American Journal of Political Science, American Political Science Review, British Journal of Political Science, Comparative Politics, International Organization, International Theory, Journal of Experimental Political Science, Journal of Political Philosophy, Journal of Politics, Political Analysis, Political Science Research and Methods, Public Opinion Quarterly, Studies in American Political Development, World Politics</em>.</p>

<p>Thanks to Max Woolf’s <a href="https://github.com/minimaxir/textgenrnn/">textgenrnn</a> package, the process couldn’t be more straightforward. We simply load the text file containing our training data, and set the neural net to studying:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># import the package
</span><span class="kn">from</span> <span class="nn">textgenrnn</span> <span class="kn">import</span> <span class="n">textgenrnn</span>

<span class="c1"># train the neural net
</span><span class="n">t</span> <span class="o">=</span> <span class="n">textgenrnn</span><span class="p">()</span>
<span class="n">t</span><span class="p">.</span><span class="n">train_from_file</span><span class="p">(</span><span class="s">'articles.txt'</span><span class="p">,</span> <span class="n">num_epochs</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>

<span class="c1"># generate some article names
</span><span class="n">t</span><span class="p">.</span><span class="n">generate</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="n">temperature</span><span class="o">=</span><span class="mf">0.66</span><span class="p">)</span>
</code></pre></div></div>

<p>What’s the verdict? Are we ready for artificial intelligence to replace human political scientists? The first batch seems pretty on-the-mark:</p>

<blockquote>
  <p><em>The Conflicting of Partisan Political Parties</em></p>

  <p><em>The International Experiment on the Role of Democratic Representation</em></p>

  <p><em>The Politics of Political Participation in the USA</em></p>

  <p><em>The Political Content of International Conflict</em></p>

  <p><em>The Origins of Politics and the World Party Study</em></p>

  <p><em>International Responsibility and the Case of Robust Control, 1932-2000</em></p>
</blockquote>

<p>Seems like pretty plausible stuff. Throw in some articles about democratic peace, framing, maybe a little Kant, and you’ve got the greatest hits. Give the AI a little more leeway, though, and things get more interesting:</p>

<blockquote>
  <p><em>Candidate Data or Cash: Paternal Moral States</em></p>

  <p><em>Loyalism and the Mirth Politics of Candidate Identity</em></p>

  <p><em>Partisan Based Social Response Liquid Alternatives</em></p>

  <p><em>Disrobing the Logic of Pivotal Indian Attemporation</em></p>

  <p><em>Transfaction of Brandoo Political Action: Explaining the Electoral Logics of Classified Outcomes</em></p>

  <p><em>Moralized Government From Random Authoritarian Oranger Assolation</em></p>
</blockquote>

<p>Crank things up a little bit more, and things really start to go off the rails. (I’m intrigued by the appearance of the weapon-metaphors(?)).</p>

<blockquote>
  <p><em>ESPN and the European USATATiMophism of Children</em></p>

  <p><em>What is the World War Party</em></p>

  <p><em>Punishing Sword: A Financial Politics</em></p>

  <p><em>Motivated Rights and the Rocketification of Political Conflicts</em></p>
</blockquote>

<p>A few more fun ones:</p>

<blockquote>
  <p><em>The Distork: State Perspective on Campaign Preferences</em></p>

  <p><em>The Death Party Compliance: The Moderating Micro-Eaple Eurosity of the Quevel GOT</em></p>

  <p><em>Trumposition and Public Operability in Communist Theory</em></p>

  <p><em>Errorism and International Social Competition</em></p>

  <p><em>The Funching of Foreign Data: Party Strategies and Electoral Politics</em></p>

  <p><em>Moderating Political Ambition: The City of Santa influences of RometATATATATA</em></p>

  <p><em>A Private Stargoblacy Case of the Modern State</em></p>
</blockquote>

<p>I hope to see presentations on many of these topics at this year’s APSA.</p>]]></content><author><name>Richard M. Shafranek</name></author><summary type="html"><![CDATA[In advance of APSA 2018, I trained a neural network to generate political science article names. Watch out, human political scientists.]]></summary></entry><entry><title type="html">Hello, world!</title><link href="https://rshafranek.github.io/hello_world/" rel="alternate" type="text/html" title="Hello, world!" /><published>2016-02-24T03:02:20+00:00</published><updated>2016-02-24T03:02:20+00:00</updated><id>https://rshafranek.github.io/hello_world</id><content type="html" xml:base="https://rshafranek.github.io/hello_world/"><![CDATA[<p>This is a test! Bringing this blog online.</p>]]></content><author><name>Richard M. Shafranek</name></author><summary type="html"><![CDATA[This is a test! Bringing this blog online.]]></summary></entry></feed>