{"id":18473597,"url":"https://github.com/robwiederstein/outliers_pres","last_synced_at":"2026-05-20T05:36:38.355Z","repository":{"id":229077198,"uuid":"775700931","full_name":"RobWiederstein/outliers_pres","owner":"RobWiederstein","description":"This is a quarto presentation on outlier analysis and detection.  It relies on the methodology described in the \"stray\"  package.","archived":false,"fork":false,"pushed_at":"2024-03-23T22:44:21.000Z","size":11377,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-25T09:54:38.884Z","etag":null,"topics":["hdoutlier","knn","quarto","r","scagnostics","stray"],"latest_commit_sha":null,"homepage":"https://robwiederstein.github.io/outliers_pres/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RobWiederstein.png","metadata":{"files":{"readme":"README.html","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-21T22:01:22.000Z","updated_at":"2025-03-30T16:18:10.000Z","dependencies_parsed_at":"2024-12-25T10:50:59.440Z","dependency_job_id":null,"html_url":"https://github.com/RobWiederstein/outliers_pres","commit_stats":null,"previous_names":["robwiederstein/outliers_pres"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/RobWiederstein/outliers_pres","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobWiederstein%2Foutliers_pres","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobWiederstein%2Foutliers_pres/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobWiederstein%2Foutliers_pres/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobWiederstein%2Foutliers_pres/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RobWiederstein","download_url":"https://codeload.github.com/RobWiederstein/outliers_pres/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobWiederstein%2Foutliers_pres/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268987471,"owners_count":24340667,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-05T02:00:12.334Z","response_time":2576,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hdoutlier","knn","quarto","r","scagnostics","stray"],"created_at":"2024-11-06T10:25:41.742Z","updated_at":"2026-05-20T05:36:33.307Z","avatar_url":"https://github.com/RobWiederstein.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!DOCTYPE html\u003e\n\u003chtml xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\" xml:lang=\"en\"\u003e\u003chead\u003e\n\n\u003cmeta charset=\"utf-8\"\u003e\n\u003cmeta name=\"generator\" content=\"quarto-1.4.550\"\u003e\n\n\u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\"\u003e\n\n\n\u003ctitle\u003ereadme\u003c/title\u003e\n\u003cstyle\u003e\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\ndiv.columns{display: flex; gap: min(4vw, 1.5em);}\ndiv.column{flex: auto; overflow-x: auto;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\nul.task-list li input[type=\"checkbox\"] {\n  width: 0.8em;\n  margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ \n  vertical-align: middle;\n}\n\u003c/style\u003e\n\n\n\u003cscript src=\"README_files/libs/clipboard/clipboard.min.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"README_files/libs/quarto-html/quarto.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"README_files/libs/quarto-html/popper.min.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"README_files/libs/quarto-html/tippy.umd.min.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"README_files/libs/quarto-html/anchor.min.js\"\u003e\u003c/script\u003e\n\u003clink href=\"README_files/libs/quarto-html/tippy.css\" rel=\"stylesheet\"\u003e\n\u003clink href=\"README_files/libs/quarto-html/quarto-syntax-highlighting.css\" rel=\"stylesheet\" id=\"quarto-text-highlighting-styles\"\u003e\n\u003cscript src=\"README_files/libs/bootstrap/bootstrap.min.js\"\u003e\u003c/script\u003e\n\u003clink href=\"README_files/libs/bootstrap/bootstrap-icons.css\" rel=\"stylesheet\"\u003e\n\u003clink href=\"README_files/libs/bootstrap/bootstrap.min.css\" rel=\"stylesheet\" id=\"quarto-bootstrap\" data-mode=\"light\"\u003e\n\n\n\u003c/head\u003e\n\n\u003cbody class=\"fullcontent\"\u003e\n\n\u003cdiv id=\"quarto-content\" class=\"page-columns page-rows-contents page-layout-article\"\u003e\n\n\u003cmain class=\"content\" id=\"quarto-document-content\"\u003e\n\n\n\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://robwiederstein.github.io/outliers_pres/\"\u003e\u003cimg src=\"./img/home_page.png\" width=\"600\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003chr\u003e\n\u003csection id=\"outliers_pres\" class=\"level1\"\u003e\n\u003ch1\u003eoutliers_pres\u003c/h1\u003e\n\u003cp\u003eThe \u003ccode\u003eoutliers_pres\u003c/code\u003e is a quarto presentation on outlier analysis. The presentation was accompanied with a release of an interactive dashboard illustrating the concepts. The dashboard is available online \u003ca href=\"https://rob-wiederstein.shinyapps.io/outliers_dash/\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003csection id=\"contributing\" class=\"level2\"\u003e\n\u003ch2 class=\"anchored\" data-anchor-id=\"contributing\"\u003eContributing\u003c/h2\u003e\n\u003cp\u003eContributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are \u003cstrong\u003egreatly appreciated\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eIf you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag “enhancement”. Don’t forget to give the project a star! Thanks again!\u003c/p\u003e\n\u003col type=\"1\"\u003e\n\u003cli\u003eFork the Project\u003c/li\u003e\n\u003cli\u003eCreate your Feature Branch (\u003ccode\u003egit checkout -b feature/AmazingFeature\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eCommit your Changes (\u003ccode\u003egit commit -m 'Add some AmazingFeature'\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003ePush to the Branch (\u003ccode\u003egit push origin feature/AmazingFeature\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eOpen a Pull Request\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/section\u003e\n\u003csection id=\"license\" class=\"level2\"\u003e\n\u003ch2 class=\"anchored\" data-anchor-id=\"license\"\u003eLicense\u003c/h2\u003e\n\u003cp\u003eDistributed under the MIT License. See \u003ca href=\"%22https://github.com/RobWiederstein/outliers_pres/blob/main/LICENSE.md%22\"\u003e\u003ccode\u003eLICENSE.md\u003c/code\u003e\u003c/a\u003e for more information.\u003c/p\u003e\n\u003c/section\u003e\n\u003csection id=\"acknowledgements\" class=\"level2\"\u003e\n\u003ch2 class=\"anchored\" data-anchor-id=\"acknowledgements\"\u003eAcknowledgements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eProfessor Talagala whose academic paper and numerous repositories have been extremely helpful and form the basis of this dashboard.\u003c/p\u003e\u003c/li\u003e\n\u003cli\u003e\u003cp\u003eCenters for Medicare and Medicaid Services for the publicly available claims data.\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/section\u003e\n\u003csection id=\"contact\" class=\"level2\"\u003e\n\u003ch2 class=\"anchored\" data-anchor-id=\"contact\"\u003eContact\u003c/h2\u003e\n\u003cp\u003eRob Wiederstein - \u003ca href=\"https://www.linkedin.com/in/rob-wiederstein-797553138/\"\u003eLinked In\u003c/a\u003e\u003c/p\u003e\n\u003c/section\u003e\n\u003c/section\u003e\n\n\u003c/main\u003e\n\u003c!-- /main column --\u003e\n\u003cscript id=\"quarto-html-after-body\" type=\"application/javascript\"\u003e\nwindow.document.addEventListener(\"DOMContentLoaded\", function (event) {\n  const toggleBodyColorMode = (bsSheetEl) =\u003e {\n    const mode = bsSheetEl.getAttribute(\"data-mode\");\n    const bodyEl = window.document.querySelector(\"body\");\n    if (mode === \"dark\") {\n      bodyEl.classList.add(\"quarto-dark\");\n      bodyEl.classList.remove(\"quarto-light\");\n    } else {\n      bodyEl.classList.add(\"quarto-light\");\n      bodyEl.classList.remove(\"quarto-dark\");\n    }\n  }\n  const toggleBodyColorPrimary = () =\u003e {\n    const bsSheetEl = window.document.querySelector(\"link#quarto-bootstrap\");\n    if (bsSheetEl) {\n      toggleBodyColorMode(bsSheetEl);\n    }\n  }\n  toggleBodyColorPrimary();  \n  const icon = \"\";\n  const anchorJS = new window.AnchorJS();\n  anchorJS.options = {\n    placement: 'right',\n    icon: icon\n  };\n  anchorJS.add('.anchored');\n  const isCodeAnnotation = (el) =\u003e {\n    for (const clz of el.classList) {\n      if (clz.startsWith('code-annotation-')) {                     \n        return true;\n      }\n    }\n    return false;\n  }\n  const clipboard = new window.ClipboardJS('.code-copy-button', {\n    text: function(trigger) {\n      const codeEl = trigger.previousElementSibling.cloneNode(true);\n      for (const childEl of codeEl.children) {\n        if (isCodeAnnotation(childEl)) {\n          childEl.remove();\n        }\n      }\n      return codeEl.innerText;\n    }\n  });\n  clipboard.on('success', function(e) {\n    // button target\n    const button = e.trigger;\n    // don't keep focus\n    button.blur();\n    // flash \"checked\"\n    button.classList.add('code-copy-button-checked');\n    var currentTitle = button.getAttribute(\"title\");\n    button.setAttribute(\"title\", \"Copied!\");\n    let tooltip;\n    if (window.bootstrap) {\n      button.setAttribute(\"data-bs-toggle\", \"tooltip\");\n      button.setAttribute(\"data-bs-placement\", \"left\");\n      button.setAttribute(\"data-bs-title\", \"Copied!\");\n      tooltip = new bootstrap.Tooltip(button, \n        { trigger: \"manual\", \n          customClass: \"code-copy-button-tooltip\",\n          offset: [0, -8]});\n      tooltip.show();    \n    }\n    setTimeout(function() {\n      if (tooltip) {\n        tooltip.hide();\n        button.removeAttribute(\"data-bs-title\");\n        button.removeAttribute(\"data-bs-toggle\");\n        button.removeAttribute(\"data-bs-placement\");\n      }\n      button.setAttribute(\"title\", currentTitle);\n      button.classList.remove('code-copy-button-checked');\n    }, 1000);\n    // clear code selection\n    e.clearSelection();\n  });\n  function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {\n    const config = {\n      allowHTML: true,\n      maxWidth: 500,\n      delay: 100,\n      arrow: false,\n      appendTo: function(el) {\n          return el.parentElement;\n      },\n      interactive: true,\n      interactiveBorder: 10,\n      theme: 'quarto',\n      placement: 'bottom-start',\n    };\n    if (contentFn) {\n      config.content = contentFn;\n    }\n    if (onTriggerFn) {\n      config.onTrigger = onTriggerFn;\n    }\n    if (onUntriggerFn) {\n      config.onUntrigger = onUntriggerFn;\n    }\n    window.tippy(el, config); \n  }\n  const noterefs = window.document.querySelectorAll('a[role=\"doc-noteref\"]');\n  for (var i=0; i\u003cnoterefs.length; i++) {\n    const ref = noterefs[i];\n    tippyHover(ref, function() {\n      // use id or data attribute instead here\n      let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');\n      try { href = new URL(href).hash; } catch {}\n      const id = href.replace(/^#\\/?/, \"\");\n      const note = window.document.getElementById(id);\n      return note.innerHTML;\n    });\n  }\n  const xrefs = window.document.querySelectorAll('a.quarto-xref');\n  const processXRef = (id, note) =\u003e {\n    // Strip column container classes\n    const stripColumnClz = (el) =\u003e {\n      el.classList.remove(\"page-full\", \"page-columns\");\n      if (el.children) {\n        for (const child of el.children) {\n          stripColumnClz(child);\n        }\n      }\n    }\n    stripColumnClz(note)\n    if (id === null || id.startsWith('sec-')) {\n      // Special case sections, only their first couple elements\n      const container = document.createElement(\"div\");\n      if (note.children \u0026\u0026 note.children.length \u003e 2) {\n        container.appendChild(note.children[0].cloneNode(true));\n        for (let i = 1; i \u003c note.children.length; i++) {\n          const child = note.children[i];\n          if (child.tagName === \"P\" \u0026\u0026 child.innerText === \"\") {\n            continue;\n          } else {\n            container.appendChild(child.cloneNode(true));\n            break;\n          }\n        }\n        if (window.Quarto?.typesetMath) {\n          window.Quarto.typesetMath(container);\n        }\n        return container.innerHTML\n      } else {\n        if (window.Quarto?.typesetMath) {\n          window.Quarto.typesetMath(note);\n        }\n        return note.innerHTML;\n      }\n    } else {\n      // Remove any anchor links if they are present\n      const anchorLink = note.querySelector('a.anchorjs-link');\n      if (anchorLink) {\n        anchorLink.remove();\n      }\n      if (window.Quarto?.typesetMath) {\n        window.Quarto.typesetMath(note);\n      }\n      // TODO in 1.5, we should make sure this works without a callout special case\n      if (note.classList.contains(\"callout\")) {\n        return note.outerHTML;\n      } else {\n        return note.innerHTML;\n      }\n    }\n  }\n  for (var i=0; i\u003cxrefs.length; i++) {\n    const xref = xrefs[i];\n    tippyHover(xref, undefined, function(instance) {\n      instance.disable();\n      let url = xref.getAttribute('href');\n      let hash = undefined; \n      if (url.startsWith('#')) {\n        hash = url;\n      } else {\n        try { hash = new URL(url).hash; } catch {}\n      }\n      if (hash) {\n        const id = hash.replace(/^#\\/?/, \"\");\n        const note = window.document.getElementById(id);\n        if (note !== null) {\n          try {\n            const html = processXRef(id, note.cloneNode(true));\n            instance.setContent(html);\n          } finally {\n            instance.enable();\n            instance.show();\n          }\n        } else {\n          // See if we can fetch this\n          fetch(url.split('#')[0])\n          .then(res =\u003e res.text())\n          .then(html =\u003e {\n            const parser = new DOMParser();\n            const htmlDoc = parser.parseFromString(html, \"text/html\");\n            const note = htmlDoc.getElementById(id);\n            if (note !== null) {\n              const html = processXRef(id, note);\n              instance.setContent(html);\n            } \n          }).finally(() =\u003e {\n            instance.enable();\n            instance.show();\n          });\n        }\n      } else {\n        // See if we can fetch a full url (with no hash to target)\n        // This is a special case and we should probably do some content thinning / targeting\n        fetch(url)\n        .then(res =\u003e res.text())\n        .then(html =\u003e {\n          const parser = new DOMParser();\n          const htmlDoc = parser.parseFromString(html, \"text/html\");\n          const note = htmlDoc.querySelector('main.content');\n          if (note !== null) {\n            // This should only happen for chapter cross references\n            // (since there is no id in the URL)\n            // remove the first header\n            if (note.children.length \u003e 0 \u0026\u0026 note.children[0].tagName === \"HEADER\") {\n              note.children[0].remove();\n            }\n            const html = processXRef(null, note);\n            instance.setContent(html);\n          } \n        }).finally(() =\u003e {\n          instance.enable();\n          instance.show();\n        });\n      }\n    }, function(instance) {\n    });\n  }\n      let selectedAnnoteEl;\n      const selectorForAnnotation = ( cell, annotation) =\u003e {\n        let cellAttr = 'data-code-cell=\"' + cell + '\"';\n        let lineAttr = 'data-code-annotation=\"' +  annotation + '\"';\n        const selector = 'span[' + cellAttr + '][' + lineAttr + ']';\n        return selector;\n      }\n      const selectCodeLines = (annoteEl) =\u003e {\n        const doc = window.document;\n        const targetCell = annoteEl.getAttribute(\"data-target-cell\");\n        const targetAnnotation = annoteEl.getAttribute(\"data-target-annotation\");\n        const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));\n        const lines = annoteSpan.getAttribute(\"data-code-lines\").split(\",\");\n        const lineIds = lines.map((line) =\u003e {\n          return targetCell + \"-\" + line;\n        })\n        let top = null;\n        let height = null;\n        let parent = null;\n        if (lineIds.length \u003e 0) {\n            //compute the position of the single el (top and bottom and make a div)\n            const el = window.document.getElementById(lineIds[0]);\n            top = el.offsetTop;\n            height = el.offsetHeight;\n            parent = el.parentElement.parentElement;\n          if (lineIds.length \u003e 1) {\n            const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);\n            const bottom = lastEl.offsetTop + lastEl.offsetHeight;\n            height = bottom - top;\n          }\n          if (top !== null \u0026\u0026 height !== null \u0026\u0026 parent !== null) {\n            // cook up a div (if necessary) and position it \n            let div = window.document.getElementById(\"code-annotation-line-highlight\");\n            if (div === null) {\n              div = window.document.createElement(\"div\");\n              div.setAttribute(\"id\", \"code-annotation-line-highlight\");\n              div.style.position = 'absolute';\n              parent.appendChild(div);\n            }\n            div.style.top = top - 2 + \"px\";\n            div.style.height = height + 4 + \"px\";\n            div.style.left = 0;\n            let gutterDiv = window.document.getElementById(\"code-annotation-line-highlight-gutter\");\n            if (gutterDiv === null) {\n              gutterDiv = window.document.createElement(\"div\");\n              gutterDiv.setAttribute(\"id\", \"code-annotation-line-highlight-gutter\");\n              gutterDiv.style.position = 'absolute';\n              const codeCell = window.document.getElementById(targetCell);\n              const gutter = codeCell.querySelector('.code-annotation-gutter');\n              gutter.appendChild(gutterDiv);\n            }\n            gutterDiv.style.top = top - 2 + \"px\";\n            gutterDiv.style.height = height + 4 + \"px\";\n          }\n          selectedAnnoteEl = annoteEl;\n        }\n      };\n      const unselectCodeLines = () =\u003e {\n        const elementsIds = [\"code-annotation-line-highlight\", \"code-annotation-line-highlight-gutter\"];\n        elementsIds.forEach((elId) =\u003e {\n          const div = window.document.getElementById(elId);\n          if (div) {\n            div.remove();\n          }\n        });\n        selectedAnnoteEl = undefined;\n      };\n        // Handle positioning of the toggle\n    window.addEventListener(\n      \"resize\",\n      throttle(() =\u003e {\n        elRect = undefined;\n        if (selectedAnnoteEl) {\n          selectCodeLines(selectedAnnoteEl);\n        }\n      }, 10)\n    );\n    function throttle(fn, ms) {\n    let throttle = false;\n    let timer;\n      return (...args) =\u003e {\n        if(!throttle) { // first call gets through\n            fn.apply(this, args);\n            throttle = true;\n        } else { // all the others get throttled\n            if(timer) clearTimeout(timer); // cancel #2\n            timer = setTimeout(() =\u003e {\n              fn.apply(this, args);\n              timer = throttle = false;\n            }, ms);\n        }\n      };\n    }\n      // Attach click handler to the DT\n      const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');\n      for (const annoteDlNode of annoteDls) {\n        annoteDlNode.addEventListener('click', (event) =\u003e {\n          const clickedEl = event.target;\n          if (clickedEl !== selectedAnnoteEl) {\n            unselectCodeLines();\n            const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');\n            if (activeEl) {\n              activeEl.classList.remove('code-annotation-active');\n            }\n            selectCodeLines(clickedEl);\n            clickedEl.classList.add('code-annotation-active');\n          } else {\n            // Unselect the line\n            unselectCodeLines();\n            clickedEl.classList.remove('code-annotation-active');\n          }\n        });\n      }\n  const findCites = (el) =\u003e {\n    const parentEl = el.parentElement;\n    if (parentEl) {\n      const cites = parentEl.dataset.cites;\n      if (cites) {\n        return {\n          el,\n          cites: cites.split(' ')\n        };\n      } else {\n        return findCites(el.parentElement)\n      }\n    } else {\n      return undefined;\n    }\n  };\n  var bibliorefs = window.document.querySelectorAll('a[role=\"doc-biblioref\"]');\n  for (var i=0; i\u003cbibliorefs.length; i++) {\n    const ref = bibliorefs[i];\n    const citeInfo = findCites(ref);\n    if (citeInfo) {\n      tippyHover(citeInfo.el, function() {\n        var popup = window.document.createElement('div');\n        citeInfo.cites.forEach(function(cite) {\n          var citeDiv = window.document.createElement('div');\n          citeDiv.classList.add('hanging-indent');\n          citeDiv.classList.add('csl-entry');\n          var biblioDiv = window.document.getElementById('ref-' + cite);\n          if (biblioDiv) {\n            citeDiv.innerHTML = biblioDiv.innerHTML;\n          }\n          popup.appendChild(citeDiv);\n        });\n        return popup.innerHTML;\n      });\n    }\n  }\n});\n\u003c/script\u003e\n\u003c/div\u003e \u003c!-- /content --\u003e\n\n\n\n\n\u003c/body\u003e\u003c/html\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobwiederstein%2Foutliers_pres","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frobwiederstein%2Foutliers_pres","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobwiederstein%2Foutliers_pres/lists"}