You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
opensensmapR/inst/doc/osem-intro.html

588 lines
403 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Analyzing environmental sensor data from openSenseMap.org in R</title>
<script type="text/javascript">
window.onload = function() {
var imgs = document.getElementsByTagName('img'), i, img;
for (i = 0; i < imgs.length; i++) {
img = imgs[i];
// center an image if it is the only element of its parent
if (img.parentElement.childElementCount === 1)
img.parentElement.style.textAlign = 'center';
}
};
</script>
<!-- Styles for R syntax highlighter -->
<style type="text/css">
pre .operator,
pre .paren {
color: rgb(104, 118, 135)
}
pre .literal {
color: #990073
}
pre .number {
color: #099;
}
pre .comment {
color: #998;
font-style: italic
}
pre .keyword {
color: #900;
font-weight: bold
}
pre .identifier {
color: rgb(0, 0, 0);
}
pre .string {
color: #d14;
}
</style>
<!-- R syntax highlighter -->
<script type="text/javascript">
var hljs=new function(){function m(p){return p.replace(/&/gm,"&amp;").replace(/</gm,"&lt;")}function f(r,q,p){return RegExp(q,"m"+(r.cI?"i":"")+(p?"g":""))}function b(r){for(var p=0;p<r.childNodes.length;p++){var q=r.childNodes[p];if(q.nodeName=="CODE"){return q}if(!(q.nodeType==3&&q.nodeValue.match(/\s+/))){break}}}function h(t,s){var p="";for(var r=0;r<t.childNodes.length;r++){if(t.childNodes[r].nodeType==3){var q=t.childNodes[r].nodeValue;if(s){q=q.replace(/\n/g,"")}p+=q}else{if(t.childNodes[r].nodeName=="BR"){p+="\n"}else{p+=h(t.childNodes[r])}}}if(/MSIE [678]/.test(navigator.userAgent)){p=p.replace(/\r/g,"\n")}return p}function a(s){var r=s.className.split(/\s+/);r=r.concat(s.parentNode.className.split(/\s+/));for(var q=0;q<r.length;q++){var p=r[q].replace(/^language-/,"");if(e[p]){return p}}}function c(q){var p=[];(function(s,t){for(var r=0;r<s.childNodes.length;r++){if(s.childNodes[r].nodeType==3){t+=s.childNodes[r].nodeValue.length}else{if(s.childNodes[r].nodeName=="BR"){t+=1}else{if(s.childNodes[r].nodeType==1){p.push({event:"start",offset:t,node:s.childNodes[r]});t=arguments.callee(s.childNodes[r],t);p.push({event:"stop",offset:t,node:s.childNodes[r]})}}}}return t})(q,0);return p}function k(y,w,x){var q=0;var z="";var s=[];function u(){if(y.length&&w.length){if(y[0].offset!=w[0].offset){return(y[0].offset<w[0].offset)?y:w}else{return w[0].event=="start"?y:w}}else{return y.length?y:w}}function t(D){var A="<"+D.nodeName.toLowerCase();for(var B=0;B<D.attributes.length;B++){var C=D.attributes[B];A+=" "+C.nodeName.toLowerCase();if(C.value!==undefined&&C.value!==false&&C.value!==null){A+='="'+m(C.value)+'"'}}return A+">"}while(y.length||w.length){var v=u().splice(0,1)[0];z+=m(x.substr(q,v.offset-q));q=v.offset;if(v.event=="start"){z+=t(v.node);s.push(v.node)}else{if(v.event=="stop"){var p,r=s.length;do{r--;p=s[r];z+=("</"+p.nodeName.toLowerCase()+">")}while(p!=v.node);s.splice(r,1);while(r<s.length){z+=t(s[r]);r++}}}}return z+m(x.substr(q))}function j(){function q(x,y,v){if(x.compiled){return}var u;var s=[];if(x.k){x.lR=f(y,x.l||hljs.IR,true);for(var w in x.k){if(!x.k.hasOwnProperty(w)){continue}if(x.k[w] instanceof Object){u=x.k[w]}else{u=x.k;w="keyword"}for(var r in u){if(!u.hasOwnProperty(r)){continue}x.k[r]=[w,u[r]];s.push(r)}}}if(!v){if(x.bWK){x.b="\\b("+s.join("|")+")\\s"}x.bR=f(y,x.b?x.b:"\\B|\\b");if(!x.e&&!x.eW){x.e="\\B|\\b"}if(x.e){x.eR=f(y,x.e)}}if(x.i){x.iR=f(y,x.i)}if(x.r===undefined){x.r=1}if(!x.c){x.c=[]}x.compiled=true;for(var t=0;t<x.c.length;t++){if(x.c[t]=="self"){x.c[t]=x}q(x.c[t],y,false)}if(x.starts){q(x.starts,y,false)}}for(var p in e){if(!e.hasOwnProperty(p)){continue}q(e[p].dM,e[p],true)}}function d(B,C){if(!j.called){j();j.called=true}function q(r,M){for(var L=0;L<M.c.length;L++){if((M.c[L].bR.exec(r)||[null])[0]==r){return M.c[L]}}}function v(L,r){if(D[L].e&&D[L].eR.test(r)){return 1}if(D[L].eW){var M=v(L-1,r);return M?M+1:0}return 0}function w(r,L){return L.i&&L.iR.test(r)}function K(N,O){var M=[];for(var L=0;L<N.c.length;L++){M.push(N.c[L].b)}var r=D.length-1;do{if(D[r].e){M.push(D[r].e)}r--}while(D[r+1].eW);if(N.i){M.push(N.i)}return f(O,M.join("|"),true)}function p(M,L){var N=D[D.length-1];if(!N.t){N.t=K(N,E)}N.t.lastIndex=L;var r=N.t.exec(M);return r?[M.substr(L,r.index-L),r[0],false]:[M.substr(L),"",true]}function z(N,r){var L=E.cI?r[0].toLowerCase():r[0];var M=N.k[L];if(M&&M instanceof Array){return M}return false}function F(L,P){L=m(L);if(!P.k){return L}var r="";var O=0;P.lR.lastIndex=0;var M=P.lR.exec(L);while(M){r+=L.substr(O,M.index-O);var N=z(P,M);if(N){x+=N[1];r+='<span class="'+N[0]+'">'+M[0]+"</span>"}else{r+=M[0]}O=P.lR.lastIndex;M=P.lR.exec(L)}return r+L.substr(O,L.length-O)}function J(L,M){if(M.sL&&e[M.sL]){var r=d(M.sL,L);x+=r.keyword_count;return r.value}else{return F(L,M)}}function I(M,r){var L=M.cN?'<span class="'+M.cN+'">':"";if(M.rB){y+=L;M.buffer=""}else{if(M.eB){y+=m(r)+L;M.buffer=""}else{y+=L;M.buffer=r}}D.push(M);A+=M.r}function G(N,M,Q){var R=D[D.length-1];if(Q){y+=J(R.buffer+N,R);return false}var P=q(M,R);if(P){y+=J(R.buffer+N,R);I(P,M);return P.rB}var L=v(D.
hljs.initHighlightingOnLoad();
</script>
<style type="text/css">
body, td {
font-family: sans-serif;
background-color: white;
font-size: 13px;
}
body {
max-width: 800px;
margin: auto;
padding: 1em;
line-height: 20px;
}
tt, code, pre {
font-family: 'DejaVu Sans Mono', 'Droid Sans Mono', 'Lucida Console', Consolas, Monaco, monospace;
}
h1 {
font-size:2.2em;
}
h2 {
font-size:1.8em;
}
h3 {
font-size:1.4em;
}
h4 {
font-size:1.0em;
}
h5 {
font-size:0.9em;
}
h6 {
font-size:0.8em;
}
a:visited {
color: rgb(50%, 0%, 50%);
}
pre, img {
max-width: 100%;
}
pre {
overflow-x: auto;
}
pre code {
display: block; padding: 0.5em;
}
code {
font-size: 92%;
border: 1px solid #ccc;
}
code[class] {
background-color: #F8F8F8;
}
table, td, th {
border: none;
}
blockquote {
color:#666666;
margin:0;
padding-left: 1em;
border-left: 0.5em #EEE solid;
}
hr {
height: 0px;
border-bottom: none;
border-top-width: thin;
border-top-style: dotted;
border-top-color: #999999;
}
@media print {
* {
background: transparent !important;
color: black !important;
filter:none !important;
-ms-filter: none !important;
}
body {
font-size:12pt;
max-width:100%;
}
a, a:visited {
text-decoration: underline;
}
hr {
visibility: hidden;
page-break-before: always;
}
pre, blockquote {
padding-right: 1em;
page-break-inside: avoid;
}
tr, img {
page-break-inside: avoid;
}
img {
max-width: 100% !important;
}
@page :left {
margin: 15mm 20mm 15mm 10mm;
}
@page :right {
margin: 15mm 10mm 15mm 20mm;
}
p, h2, h3 {
orphans: 3; widows: 3;
}
h2, h3 {
page-break-after: avoid;
}
}
</style>
</head>
<body>
<h2>Analyzing environmental sensor data from openSenseMap.org in R</h2>
<p>This package provides data ingestion functions for almost any data stored on the
open data platform for environemental sensordata <a href="https://opensensemap.org">https://opensensemap.org</a>.
Its main goals are to provide means for:</p>
<ul>
<li>big data analysis of the measurements stored on the platform</li>
<li>sensor metadata analysis (sensor counts, spatial distribution, temporal trends)</li>
</ul>
<h3>Exploring the dataset</h3>
<p>Before we look at actual observations, lets get a grasp of the openSenseMap
datasets&#39; structure.</p>
<pre><code class="r">library(magrittr)
library(opensensmapr)
all_sensors = osem_boxes()
</code></pre>
<pre><code class="r">summary(all_sensors)
</code></pre>
<pre><code>## boxes total: 1779
##
## boxes by exposure:
## indoor mobile outdoor unknown
## 288 55 1416 20
##
## boxes by model:
## custom homeEthernet homeEthernetFeinstaub
## 335 92 49
## homeWifi homeWifiFeinstaub luftdaten_pms1003
## 192 144 1
## luftdaten_pms1003_bme280 luftdaten_pms5003_bme280 luftdaten_pms7003_bme280
## 1 5 2
## luftdaten_sds011 luftdaten_sds011_bme280 luftdaten_sds011_bmp180
## 57 197 19
## luftdaten_sds011_dht11 luftdaten_sds011_dht22
## 46 639
##
## $last_measurement_within
## 1h 1d 30d 365d never
## 921 960 1089 1427 235
##
## oldest box: 2014-05-28 15:36:14 (CALIMERO)
## newest box: 2018-05-24 20:29:50 (Stadthalle)
##
## sensors per box:
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 4.000 4.000 4.601 5.000 33.000
</code></pre>
<p>This gives a good overview already: As of writing this, there are more than 700
sensor stations, of which ~50% are currently running. Most of them are placed
outdoors and have around 5 sensors each.
The oldest station is from May 2014, while the latest station was registered a
couple of minutes ago.</p>
<p>Another feature of interest is the spatial distribution of the boxes: <code>plot()</code>
can help us out here. This function requires a bunch of optional dependencies though.</p>
<pre><code class="r">if (!require(&#39;maps&#39;)) install.packages(&#39;maps&#39;)
if (!require(&#39;maptools&#39;)) install.packages(&#39;maptools&#39;)
if (!require(&#39;rgeos&#39;)) install.packages(&#39;rgeos&#39;)
plot(all_sensors)
</code></pre>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfgAAAH4CAIAAAApSmgoAAAACXBIWXMAAAsSAAALEgHS3X78AAAgAElEQVR4nOzdd0BT1/sw8JtBQhIIgRD23rJkOHACDrYLxUHVat1V6yxat4jUbdU661514AbBBYggG9lTIKyQQBKyEzLfP+77Q0VrrYJovufzFyQ3NyeBPDn3nOc8B6FSqSAAAABAfSH7ugEAAABA7wKBHgAAQM2BQA8AAKDmQKAHAABQcyDQAwAAqDkQ6AEAANQcCPQAAABqDgR6AAAANQcCPQAAgJoDgR4AAEDNobt+Gjt27D8d9OTJk6/SGAAAAKDnvQn0y5Yt63ZfWVlZbGysvb39120SAAAA0JMQHyxqJhaLY2Jijh8/vmnTphUrVqBQqK/fMgAAAKBHoN+/KSkpaenSpW5ubkVFRebm5p9x0t9+++3+/fs4HO6LmwcAAAB8AJPJpFKpn3jwO4G+tbV11apVL1++PHLkyIQJEz67BUKh8Nq1a25ubp99BgAAAOAj/P39P/3gN1k3x44dc3NzMzU1raio+JIoDwAAAHxT3gT6pUuXcjicU6dOGRkZab+rD9sHAAAAfKE3Qzd0Or0P2wEAAAD0kjeB3tDQEIIgOp2uUqmMjY37rkkAAABAT3pnMvbEiROJiYlIJDI4OHjhwoV91SYAAACgB70T6OPi4h4/fgxBUGBgIAj0AAAA6uGdQO/t7R0dHQ1BkJeXVx+1BwAAAOhh7wT6Xbt2PXz4EIFABAcH91WDAAAAgJ71TqBHIBChoaEQBPH5fC0tLQQC0UetAgAAAHrMmzx6sVgcGxvr6OioqalJJBIxGIyDg0N0dLRUKu3D9gEAAABf6J0FU7m5uWfPnm1tbZXJZG1tbRcuXCgvL//555/7sH0AAADAF3ozdPPgwYPGxsauSmS6urpDhgwZNGiQjY3NRx5/5MiR0tLSbjcmJSUFBgaCWjcAAADfgjeB3tzc/NGjRxMnTnz77rS0NH19/Y88PjIyksvldrvxxYsXnZ2dPdhKAAAA4LO9CfTHjx+PiIjYsmWLs7Oztra2QCCorKxkMpn37t37yOPJZDKZTO52IwaD6ZXGAgAAAP/dm0A/ePDg+vr6lJSUhoYGFoulq6u7YMECX19fsOsIAADAd+2d9EoUCjVmzBj4ZzabjcViQZQHAAD43r3Juhk3bpxEIoEgqLa2dvDgwRQKRVdXNyQkhMFg9F3zAAAAgC/1JtDHx8crFAoIghYtWuTv7y8QCAQCwYABA97fNBwAAAD4jnxgz9j8/PykpCQ0Gg1B0NatW01MTL56qwAAAIAeg3z7F3iUxsbGprGxEb6lpqZGR0enD9oFAAAA9JA3gX7kyJG+vr7a2tp1dXXLly+HICg9Pd3X1xf+GQAAAPhOvRm6ef78OQRBEomESqXyeDwIgjAYzN9//z1q1Kg+ax0AAADwxbqP0Wtqajo5OcE/Dxo06Ku3BwAAAOhhyH8/BAAAAPievenR02g0Pp//wYMcHR2/VnsAAACAHvYm0F+8eHHTpk0IBOL9Kmatra1ft1UAAABAj3kT6NevX29nZ7d9+/aSkpI+bBAAAADQs94Zow8ODvbw8OirpgAAAAC94Z1ATyAQLl261FdNAQAAAHoDyLoBAABQcyDQAwAAqDkQ6AEAANQcCPQAAABqDgR6AAAANQcCPQAAgJoDgR4AAEDNgUAPAACg5kCgBwAAUHMg0AMAAKg5EOgBAADUHAj0AAAAag4EegAAADUHAj0AAICaA4EeAABAzYFADwAAoOZAoAcAAFBzINADAACoORDoAQAA1BwI9AAAAGoOBHoAAAA1BwI9AACAmgOBHgAAQM2BQA8AAKDmQKAHAABQcyDQAwAAqDkQ6AEAANQcCPQAAABqDgR6AAAANQcCPQAAgJoDgR4AAEDNgUAPAACg5kCgBwAAUHMg0AMAAKg5EOgBAADUHAj0AAAAag4EegAAADUHAj0AAICaA4EeAABAzYFADwAAoOZAoAcAAFBzINADAACoORDoAQAA1BwI9AAAAGoOBHoAAAA1BwI9AACAmgOBHgAAQM2BQA8AAKDm0F0/jR079p8OevLkyVdpDAAAANDz3gT6ZcuWdbuvrKwsNjbW3t7+6zYJAAAA6ElvAv2ECRO6fhaLxTExMcePH4+Ojl6xYkVfNAwAAADoGej3b0pKSlq6dKmbm1tRUZG5ufnXbxMAAADQg94J9K2tratWrXr58uWRI0fe7uADAAAA3683WTfHjh1zc3MzNTWtqKgAUR4AAEBtvAn0S5cu5XA4p06dMjIy0n5XH7YPAAAA+EJvhm7odHoftgMAAADoJW8CvaGhIQRBdDpdpVIZGxv3XZMAAACAnvTOZOyJEycSExORSGRwcPDChQv7qk0AAABAD3on0MfFxT1+/BiCoMDAQBDoAQAA1MM7gd7b2zs6OhqCIC8vrz5qDwAAANDD3gn0u3btevjwIQKBCA4O7qsGAQAAAD3rnUCPQCBCQ0MhCOLz+VpaWggEoo9aBQAAAPSYN3n0YrE4NjbW0dFRU1OTSCRiMBgHB4fo6GipVNqH7QMAAAC+0DsLpnJzc8+ePdva2iqTydra2i5cuFBeXv7zzz/3YfsAAACAL/Rm6ObBgweNjY04HA7+VVdXd8iQIYMGDbKxsfnI47dt25aRkdHtxrq6OoFA0ONtBQAAAD7Dm0Bvbm7+6NGjiRMnvn13Wlqavr7+Rx6/bdu292/08PDQ0tLqoRYCAAAAX+RNoD9+/HhERMSWLVucnZ21tbUFAkFlZSWTybx3714ftg8AAAD4Qm8C/eDBg+vr61NSUhoaGlgslq6u7oIFC3x9fVEoVB+2DwAAAPhC76RXolCoMWPGQCC9EgAAQI2A9EoAAAA1B9IrAQAA1NyXplcCAAAA37g3PXo4vbLb3f+aXgkAAAB840B6JQAAgJoD6ZUAAABq7sPplQAAAIDaQP77IQAAAMD37E2Pnkaj8fn8Dx7k6Oj4tdoDAAAA9LA3gf7ixYubNm1CIBDvp9m0trZ+3VYBAAAAPeZNoF+/fr2dnd327dtLSkr6sEEAAABAz3pnjD44ONjDw6OvmgIAAAD0hncCPYFAuHTpUl81BQAAAOgNIOsGAABAzYFADwAAoOZAoAcAAFBzINADAACoORDoAQAA1BwI9AAAAGoOBHoAAAA1BwI9AACAmgOBHgAAQM2h//0QQK2JRKLOzk4sFovH4+Ff6XS6pqYmBoPh8Xhisbhfv35I5FfqEIhEIrlc3t7ezmQy6XQ6g8HQ0NCwtbVVqVRpaWmampqWlpbx8fEMBkMqlcrlck1NTQiCmpubCQSCQqFAoVAikYjD4YjFYoVCoaenp6+vb2FhoaGhQSKRKBSKo6Ojq6urp6fn13k5APCNAIFePclkMplMBsdupVJ5//59KpVaUVFRXl5eW1urra1tZmamUqnS09NlMhkCgejfvz8EQWKxuLq62szMzN7evrKy0s7OjkAgtLW1tbS08Pl8JBKJw+E8PDyQSKRUKiWRSCQSaeHChWg0Go6nCATiE5unUqmoVKpKpdLV1dXR0UEikWVlZXfu3Nm/fz+Hw3n/eG9v74iICLlc/vz589bWVgqFsmDBgg+e+fr16y9evLC2ttbV1YXb09HRoVKpGAxGc3NzRUXF9evXuVwuHo/H4XBaWlqWlpazZ88GhbgB9QYC/XdMLBY3NTXx+XwGg1FZWSkQCExMTJKTk6uqqoqLix0cHLBYLIlEksvlL168gCCIRCINHDhw/Pjx9vb2cLxua2vLz88XCASTJk1Co9EKhYJGo+HxeDKZ/PYTNTU11dXVaWho6OvrUygULBaLRqP5fP6jR4/GjRsnEAjEYvHRo0c9PT0RCMSrV6/q6+tZLBafz4eDrEwmY7PZBgYGNjY2eXl5Pj4+enp6sbGxEASZm5uTyWQCgYBAIOrr6yUSCfyMRkZG+/btEwgEEATx+XwrK6tuTfon06ZNmzZtGgRBLBbrypUrQqFQpVLB7xV8NqFQiEQiWSxWU1MTfAuTyTx+/DiLxTp8+HBoaKiP
<p>It seems we have to reduce our area of interest to Germany.</p>
<p>But what do these sensor stations actually measure? Lets find out.
<code>osem_phenomena()</code> gives us a named list of of the counts of each observed
phenomenon for the given set of sensor stations:</p>
<pre><code class="r">phenoms = osem_phenomena(all_sensors)
str(phenoms)
</code></pre>
<pre><code>## List of 432
## $ Temperatur : int 1607
## $ rel. Luftfeuchte : int 1421
## $ PM10 : int 1200
## $ PM2.5 : int 1198
## $ Luftdruck : int 824
## $ Beleuchtungsstärke : int 480
## $ UV-Intensität : int 471
## $ Luftfeuchtigkeit : int 84
## $ Temperature : int 49
## $ Humidity : int 42
## $ Helligkeit : int 25
## $ Lautstärke : int 21
## $ Schall : int 20
## $ UV : int 20
## $ Pressure : int 19
## $ Licht : int 18
## $ Luftfeuchte : int 14
## $ Umgebungslautstärke : int 14
## $ Lämpötila : int 13
## $ Ilmanpaine : int 12
## $ Signal : int 12
## $ Feinstaub PM10 : int 10
## $ Feinstaub PM2.5 : int 9
## $ Kosteus : int 8
## $ Valonmäärä : int 8
## $ temperature : int 8
## $ PM01 : int 7
## $ Temperatur DHT22 : int 7
## $ UV-säteily : int 7
## $ Niederschlag : int 6
## $ UV-Strahlung : int 6
## $ Wind speed : int 6
## $ Windgeschwindigkeit : int 6
## $ humidity : int 6
## $ Ilmankosteus : int 5
## $ Wassertemperatur : int 5
## $ Windrichtung : int 5
## $ rel. Luftfeuchtigkeit : int 5
## $ Druck : int 4
## $ Light : int 4
## $ Temperature 1 : int 4
## $ UV Index : int 4
## $ UV-Säteily : int 4
## $ lautstärke : int 4
## $ rel. Luftfeuchte 1 : int 4
## $ relative Luftfeuchtigkeit : int 4
## $ Air pressure : int 3
## $ Batterie : int 3
## $ Battery : int 3
## $ DS18B20_Probe01 : int 3
## $ DS18B20_Probe02 : int 3
## $ DS18B20_Probe03 : int 3
## $ DS18B20_Probe04 : int 3
## $ DS18B20_Probe05 : int 3
## $ Licht (digital) : int 3
## $ Luftdruck (BME280) : int 3
## $ PM 10 : int 3
## $ PM 2.5 : int 3
## $ Temp : int 3
## $ Temperatur (BME280) : int 3
## $ Temperatur HDC1008 : int 3
## $ Temperatura : int 3
## $ Temperature 2 : int 3
## $ UV-Index : int 3
## $ Valoisuus : int 3
## $ Wind Gust : int 3
## $ pressure : int 3
## $ rel. Luftfeuchte DHT22 : int 3
## $ 1 : int 2
## $ 10 : int 2
## $ 2 : int 2
## $ 3 : int 2
## $ 4 : int 2
## $ 5 : int 2
## $ 6 : int 2
## $ 7 : int 2
## $ 8 : int 2
## $ 9 : int 2
## $ Air Pressure : int 2
## $ Anderer : int 2
## $ Battery voltage : int 2
## $ CO2 : int 2
## $ Feuchte : int 2
## $ Illuminance : int 2
## $ Intensity : int 2
## $ Leitfähigkeit : int 2
## $ Lichtintensität : int 2
## $ Luftdruck BMP180 : int 2
## $ Luftfeuchte (BME280) : int 2
## $ Luftqualität : int 2
## $ Lufttemperatur : int 2
## $ PM25 : int 2
## $ Radioactivity : int 2
## $ Radioaktivität : int 2
## $ Regen : int 2
## $ Relative Humidity : int 2
## $ Sound : int 2
## $ Temperatur (DHT22) : int 2
## $ Temperatur BMP180 : int 2
## [list output truncated]
</code></pre>
<p>Thats quite some noise there, with many phenomena being measured by a single
sensor only, or many duplicated phenomena due to slightly different spellings.
We should clean that up, but for now let&#39;s just filter out the noise and find
those phenomena with high sensor numbers:</p>
<pre><code class="r">phenoms[phenoms &gt; 20]
</code></pre>
<pre><code>## $Temperatur
## [1] 1607
##
## $`rel. Luftfeuchte`
## [1] 1421
##
## $PM10
## [1] 1200
##
## $PM2.5
## [1] 1198
##
## $Luftdruck
## [1] 824
##
## $Beleuchtungsstärke
## [1] 480
##
## $`UV-Intensität`
## [1] 471
##
## $Luftfeuchtigkeit
## [1] 84
##
## $Temperature
## [1] 49
##
## $Humidity
## [1] 42
##
## $Helligkeit
## [1] 25
##
## $Lautstärke
## [1] 21
</code></pre>
<p>Alright, temperature it is! Fine particulate matter (PM2.5) seems to be more
interesting to analyze though.
We should check how many sensor stations provide useful data: We want only those
boxes with a PM2.5 sensor, that are placed outdoors and are currently submitting
measurements:</p>
<pre><code class="r">pm25_sensors = osem_boxes(
exposure = &#39;outdoor&#39;,
date = Sys.time(), # ±4 hours
phenomenon = &#39;PM2.5&#39;
)
</code></pre>
<pre><code class="r">summary(pm25_sensors)
</code></pre>
<pre><code>## boxes total: 788
##
## boxes by exposure:
## outdoor
## 788
##
## boxes by model:
## custom homeEthernetFeinstaub homeWifi
## 28 37 6
## homeWifiFeinstaub luftdaten_pms1003_bme280 luftdaten_pms5003_bme280
## 57 1 2
## luftdaten_pms7003_bme280 luftdaten_sds011 luftdaten_sds011_bme280
## 2 33 135
## luftdaten_sds011_bmp180 luftdaten_sds011_dht11 luftdaten_sds011_dht22
## 14 31 442
##
## $last_measurement_within
## 1h 1d 30d 365d never
## 764 777 780 785 3
##
## oldest box: 2016-06-02 12:09:47 (BalkonBox Mindener Str.)
## newest box: 2018-05-24 20:29:50 (Stadthalle)
##
## sensors per box:
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.000 4.000 4.000 4.615 5.000 12.000
</code></pre>
<pre><code class="r">plot(pm25_sensors)
</code></pre>
<p><img src="data:image/png;base64,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
<p>Thats still more than 200 measuring stations, we can work with that.</p>
<h3>Analyzing sensor data</h3>
<p>Having analyzed the available data sources, let&#39;s finally get some measurements.
We could call <code>osem_measurements(pm25_sensors)</code> now, however we are focussing on
a restricted area of interest, the city of Berlin.
Luckily we can get the measurements filtered by a bounding box:</p>
<pre><code class="r">library(sf)
</code></pre>
<pre><code>## Linking to GEOS 3.6.1, GDAL 2.1.4, proj.4 4.9.3
</code></pre>
<pre><code class="r">library(units)
library(lubridate)
</code></pre>
<pre><code>##
## Attaching package: &#39;lubridate&#39;
</code></pre>
<pre><code>## The following object is masked from &#39;package:base&#39;:
##
## date
</code></pre>
<pre><code class="r">library(dplyr)
</code></pre>
<pre><code>##
## Attaching package: &#39;dplyr&#39;
</code></pre>
<pre><code>## The following objects are masked from &#39;package:lubridate&#39;:
##
## intersect, setdiff, union
</code></pre>
<pre><code>## The following objects are masked from &#39;package:rgeos&#39;:
##
## intersect, setdiff, union
</code></pre>
<pre><code>## The following objects are masked from &#39;package:stats&#39;:
##
## filter, lag
</code></pre>
<pre><code>## The following objects are masked from &#39;package:base&#39;:
##
## intersect, setdiff, setequal, union
</code></pre>
<pre><code class="r"># construct a bounding box: 12 kilometers around Berlin
berlin = st_point(c(13.4034, 52.5120)) %&gt;%
st_sfc(crs = 4326) %&gt;%
st_transform(3857) %&gt;% # allow setting a buffer in meters
st_buffer(set_units(12, km)) %&gt;%
st_transform(4326) %&gt;% # the opensensemap expects WGS 84
st_bbox()
</code></pre>
<pre><code class="r">pm25 = osem_measurements(
berlin,
phenomenon = &#39;PM2.5&#39;,
from = now() - days(20), # defaults to 2 days
to = now()
)
plot(pm25)
</code></pre>
<p><img src="data:image/png;base64,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
<p>Now we can get started with actual spatiotemporal data analysis.
First, lets mask the seemingly uncalibrated sensors:</p>
<pre><code class="r">outliers = filter(pm25, value &gt; 100)$sensorId
bad_sensors = outliers[, drop = T] %&gt;% levels()
pm25 = mutate(pm25, invalid = sensorId %in% bad_sensors)
</code></pre>
<p>Then plot the measuring locations, flagging the outliers:</p>
<pre><code class="r">st_as_sf(pm25) %&gt;% st_geometry() %&gt;% plot(col = factor(pm25$invalid), axes = T)
</code></pre>
<p><img src="data:image/png;base64,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
<p>Removing these sensors yields a nicer time series plot:</p>
<pre><code class="r">pm25 %&gt;% filter(invalid == FALSE) %&gt;% plot()
</code></pre>
<p><img src="data:image/png;base64,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
<p>Further analysis: comparison with LANUV data <code>TODO</code></p>
</body>
</html>