DataDivers

Data visualisering og analyse.

Implementering af datainformerede beslutningsprocesser i SMV.

CVR-nr.: 18508192

Lead scientist: Lars Therkelsen

Mindstekravs Generator.

Dato: 2024.04.26

Generator til eksamens mindstekrav HHX under opbygning, beta version her.: Mindstekravs Generator.

Julia og PDFIO pakken; .pdf filer til.txt.

Dato: 2022.10.27

For at kunne databehandle de fundne Finanslove fra sideste uge er vi nød til at læse .pdf og konvertere dem til tekst, som data kan ekstraheres fra. Til formålet bruges Julias PDFIO pakke.


# PDFIO.jl pakken indlæses og initialiseres. 
[1]: using Pkg
     Pkg.add("PDFIO")
     using PDFIO

# Arbejdsbiblioteket indstilles og bibliotekets indhold indlæses i et array 
[2]: pwd()
     cd("/Sund")
     fl = filter(x -> endswith(lowercase(x), ".pdf"), readdir("./FinansLov",join=true))

Ideen er nu at læse iterere over biblioteket, læse hver fil og gemme den som .txt fil.
Problemet opstår blot med PDFIOs


pdPageExtractText(stdout, page)

kode, der genererer fejl ved nyere Finanslovs filer, der er indexerede og med nydelig fuldsidegrafik, hvorfor scriptet stopper.
Løsningen ligger i Julias try/catch funktion.


[3]: try
       sqrt(-1)
     catch
       println("Du kan ikke tage kvadratrod af et negativt tal.")
     end
[3]: Du kan ikke tage kvadratrod af et negativt tal.

Dermed bliver det muligt at bygge en funktion til læsning af .pdf og skrivning af .txt filer.


# Input: src, sti og filnavn på .pdf kilde
#        out, sti og filnavn på .txt output
[4]: function getPDFText(src, out)
       # handle til brug for dokument operationre.
       doc = pdDocOpen(src)
      
       # Ekstraher dokument information
       docinfo = pdDocGetInfo(doc) 
    
       open(out, "w") do io
         # Antal side i dokumentet       
         npage = pdDocGetPageCount(doc)

         for i=1:npage
           # Handle for den specifikke side i dokumentet
           page = pdDocGetPage(doc, i)
            
           # Uddrag teksten fra siden, hvis det er muligt
           try
             pdPageExtractText(io, page)
           catch
             # Ved fejl foretag ignorer siden og fortsæt
             1 == 1
           end
         end
       end

       # Luk dokumentets handle 
       pdDocClose(doc)
       return docinfo
     end

Afslutningsvis kan vi tage alle .pdf filerne fra Finanslovesbiblioteket og generere tekstfilerne bulk med et kald.


# Iterer over fil array og eksekver
[5]: for x in fl
       getPDFText(x, split(x,".pd")[1]*".txt")
     end

Kilder:
https://docs.julialang.org/en/v1/base/io-network/
https://docs.julialang.org/en/v1/manual/control-flow/

Det danske sundhedsvæsen, et forsøg på at skabe overblik II.

Dato: 2022.10.20

Finansloven.

Når man skal følge pengene kan man entent starte fra toppen eller bunden. Fra bunden er devisen at pengene skal følge borgeren, hvilket selvfølgelig er en interessant vinkel og noget at et detektivarbejde at trevle sundhedsvæsnet op fra, men også en vinkel der umiddelbart gør det svært at skabe et overblik. Jeg har derfor valgt at starte så langt op det nu er muligt at komme, nemlig med Finansloven. Efter at have ledt lidt fandt jeg Finanslovene 2008-2022 tilgængelige for download i .pdf format primært fra Folketingets hjemmeside. For finanslove før 2008 og efter 2002 (02 ikke inkluderet) kan Finanslovsdatabasen hos Erhvers og Økonomiministeriet benyttes. Yderligere reseach for Finanslove før 2003 skal foretages.

Her følger en linkliste over Finanslovene 2008-2022

Kaninhullet

Kaninhullet er det koncentrerede, det nørdede. Det er her der virkelig bliver gravet og boret i dybden, en øvelse der selvsagt tager lang tid. Det første kaninhul vi hopper i er det danske sundhedsvæsen. Idag er det første afsnit af mange, der offetliggøres.

Det danske sundhedsvæsen, et forsøg på at skabe overblik.

Dato: 2022.10.13

Engang for længe siden tilbage i 1990erne i et lille kongerige højt mod nord var der et sundhedsvæsen der fungerede næsten upåklageligt. Der hørtes enkelte pip om lidt lægemangel på grund af politikernes dårlige beslutninger 10 år tidliege, men ellers var der stille på fronten.
Efter årtusindeskiftet skete der dog noget i det lille kongerige; et universelt gult sygesikringsbevis gjaldt pludseligt ikke længere uden for landets grænser, sundhedsforsikringer blev indført, privathospitaler blev det nye sort, sygehuse og akutafdelinger blev nedlagt på stribe, hele 5 supersygehuse med enorme budgetoverskridelser skulle bygges på samme tid, lægevagter blev nedlagt, akuttelefoner blev overbelastet, fejlbehæftede IT systemer blev indført med store produktivitetsfald til følge, psykiatrien fik lov at hænge i laser, behandlingsgarantien blev overskredet med flere år og sygeplejersker blev en direkte mangelvare. Dertil lægger vi selvfølgelig salget af Statens Serum Instituts vaccineproduktion direkte fulgt af Covid19 pandemien.
Det er som om ingen rigtigt længere har overblikket over, hvad der foregår, og den tidligere indenrigs-, sundheds- og statsminister, der stod bag mange af de katastrofale beslutninger, søger i 2022 folketingsvalgkampen at lancere sig som løsningen til det selvskabte problem.

Om folketingskandidaten har ret i sin løsningsmodel eller ej skal vi ikke kunne sige her på DataDivers.dk, men vi vil forsøge at skabe et overblik over det danske sundhedsvæsen - for ingen andre synes at være i besiddelse af det.

Hvad er et sundhedsvæsen?

Ifølge WHOs målsætning er "sundhed en tilstand af fuld fysiske, mental og socialt velvære og ikke bare farvær af sygdom og svaghed" (1), videre følger det fra WHO at "et sundhedssystem består af alle organisationer, mennesker og handlinger, hvis primære aktivitet er at fremme, genoprette eller fastholde sundhed".
WHO gør derigennem brug af den brede definition af et sundhedsvæsen, en definition der indbefatter alle direkte sundhedsydelser såvel som sikring af rent drikkevand, bortskaffelse af forurening og mikroplast, nedbringning af trafikstøj, sikring af fødevarer osv osv.

Traditionelt gør vi i Danmark dog brug af den mere snævre definition af Roemer (2001) "sundhedsvæsen er en kombination af ressourcer, organisation, finansiering og styring, der resulterer i produktionen af sundhedsydelser til befolkningen" (3), en definition der går igen i Den Store Danske med ordene "Sundhedsvæsen, samfundets samlede indsats mhp. forebyggelse, diagnostik og behandling af sygdom og pleje af syge, både i offentligt og privat regi" (4).

Kilder:
1) https://www.who.int/about/governance/constitution
2) https://www.physio-pedia.com/Health_Care_Systems
3) https://sundhedsvaesenogsundhedspolitik-3udg.digi.munksgaard.dk/
4) https://denstoredanske.lex.dk/sundhedsv%C3%A6sen

Problematiseringen

Efter vor mening er Roemers definition fra 2001 et alt for snævert og utidssvarende perspektiv, der slet ikke tager højde for hverken globalisering eller den rivende udvikling inden for kommunikation og kunstig intelligens, der muliggør indsigter på tværs af traditionelle faglige og politisk administrative skel.
Vi vil derfor tage udgangspunkt i WHOs brede definition, men samtidigt vil vi søge at problematisere implikationerne af de demokratiske og frihedsindgribende konsekvenser den brede definition har. Er det eksempelvis samfundets opgave at påbyde motion og forbyde rygning, alkohol og slik eller har individet ret til selv oplyst at vælge, hvilke ikke sundhedsoptimerende aktiviteter personen foretager.

Det er derfor hensigten at skabe et overblik over såvel det Roemerske sundhedsvæsen samt krydsfeltet til det bredt definerede WHO sundhedsvæsen for derigennem, forhåbentligt, at kunne bidrage til et tidssvarende, efficient og effektivt sundhedsvæsen for såvel borgere som samfund.

Operationalisering

Intuitivt består den Roemerske del af det danske sundhedsvæsen af en anerkendt offentlig og privat del samt en potentiel del. Den anerkendte offentlige og private del er vestligmedicinsk forskningsbaseret og primært finansieret gennem offentlige og fonds midler samt private forsikringer samt brugerbetaling mens den potentielle ikke anerkendte del del primært findes i den østlige heilpraktiske tradition og alene finansieret gennem brugerbetaling.
Dertil kommer så de ikke Roemerske miljømæssige udgifter og tiltag der finansieres gennem såvel det offentlige, fonde samt private midler og primært styres af lovgivning.
Fælles for alt ovenstående er at der er penge involveret, så de første spørgsmål må være;
* Hvor mange penge er involveret?
* Hvordan har udviklingen i disse midler været?

I næste afsnit begynder vi at følge pengene.

Guldfisken

Guldfisken en det korte koncentrationsspan, det er her jeg publicerer de små eksperimenter, observationer, undersøgelser og tiltag. Modsat Guldfisken finder du i Kaninhullet fordybelse, de større og mere krævende undersøgelser og tiltag. I essensen er Guldfisken forstudiet til Kaninhullet.

Web-scraping med Julia og HTTP.jl pakken

Dato: 2022.02.20

Indledningsvist skal det bemærkes at der selvfølglig er et såvel lovgivningsmæssigt, som etisk aspekt ved web-scraping. Derfor scrap kun de sider, hvor processen ikke kommer i konflikt med lovgivning eller, hvor du ikke kan stå inde for formålet med dit web scrape.

Når det er sagt er scraping af websider simplet med Julia. Primært skal der bruges to pakker HTTP.jl til indhentning af sider og siderkoder samt Gumbo.jl til arbejdet med det entede materiale.
I denne guldfisk vil fokus være på HTTP.jl pakken.

Til formålet åbnes et Jupyter Lab vindue gennem Anaconda-Navigator og på bare tre linjer er hjemmesidens kode hentet.


# Installation af HTTP.jl pakken med Pkg 
[1]: import Pkg; Pkg.add("HTTP")

# HTTP.jl pakken aktiveres
[2]: using HHTP

# Hent hjemmesiden, i dette tilfælde denne side, og gem resultatet i variablen r
[3]: r = HTTP.get("http://trylmand.dk/")

[3]:     HTTP.Messages.Response:
     """
     HTTP/1.1 200 OK
     Date: Sun, 20 Feb 2022 11:23:07 GMT
     Server: Apache
     Upgrade: h2
     Connection: Upgrade
     Vary: Accept-Encoding
     X-Content-Type-Options: nosniff
     SimplyCom-Server: Apache
     Transfer-Encoding: chunked
     Content-Type: text/html

     <!DOCTYPE html>
     <html lang="da" xmlns:m="http://www.w3.org/1998/Math/MathML">

     <head>
     <title>Trylmand</title>
     """

Til det lidt mere avancerede har HTTP kommandoen har en standard opsætning med den originale stuktur er HTTP.request("GET", "http://trylmand.dk/"; retries=4, cookies=true), hvor metoden i kaldet har mulighederne [GET | POST | PUT | OPEN], hvilket kan simplificeres over i HTTP.get(.), HTTP.post(.), og HTTP.put(.), HTTP.open(.).
Hvor HTTP.open(.) benyttes til streamning (gem eller gengiv). Følg kildelinket herunder til dokumentationen for uddybning.

Kilder: https://julia.school/julia/scraping/
https://juliaweb.github.io/HTTP.jl/stable/.

Installation af Anaconda på Ubuntu 20.04

Dato: 2022.02.19

Anaconda er en data-science platform der gør det nemt og overskueligt at køre og installere akker og programmer på tværs af analyse platforme såsom R, Python og Julia.

Det er en fordel at have præinstalleret R, Python og Julia - så hvis du allerede har det kan du springe de respektive afsnit over.

Først systemopdatering så check for Python version. Hvis installation er nødvendigt an kan Python 3.10 nemt installeres Ubuntu 20.04|18.04 med brug af Apt-Repo - kudos til deadsnakes tilpassede PPA der gør det nemt at installere, vedligeholde g sikkerhedsopdatere.


lars$datadivers:~$ sudo apt-update
lars$datadivers:~$ sudo apt-upgrade

lars$datadivers:~$ sudo apt install software-properties-common -y
lars$datadivers:~$ sudo add-apt-repository ppa:deadsnakes/ppa

lars$datadivers:~$ sudo apt install python3.9
lars$datadivers:~$ python3 --version
Python 3.9.7

KILDE: https://computingforgeeks.com/how-to-install-python-on-ubuntu-linux-system/

Jupyter notebook til brug med såvel Julia som Python installeres nemmest med PIP


lars$datadivers:~$ sudo apt install python3-pip
lars$datadivers:~$ pip3 --version
pip 21.2.4 from ~/anaconda3/lib/python3.9/site-packages/pip (python 3.9)

lars$datadivers:~$ pip install jupyterlab
lars$datadivers:~$ pip install notebook

KILDER: https://itsfoss.com/install-pip-ubuntu/ ; https://jupyter.org/install

Nu skal Julia forbindes til Jupyter Notebook (for installation af Julia se tidligere Guldfisk).


#Start Julia
lars$datadivers:~$ julia
lars$datadivers:~$ using Pkg
lars$datadivers:~$ Pkg.add("IJulia")

#Jupyter Notebook åbnes nu nemt i browser, bare klik og vælg Julia
lars$datadivers:~$ jupyter notebook

KILDE: https://datatofish.com/add-julia-to-jupyter/

Endelig er vi klar til at installere Anaconda, til det bruges Curl, hvorefter Anaconda installations proceduren gennemgåes.


#Check Curl installation
lars$datadivers:~$ curl --version

#Hvis ikke installeret
lars$datadivers:~$ sudo apt-get install curl

Installationen starter med at downloade seneste version af anaconda fra udviklers hjemmeside ved at kopiere 64-bit (x86) linket ind terminalvinduet.
Dette følges umiddelbart efter med at check for filens integritet, hvor reference koden findes gennem hash kode linket.


lars$datadivers:~$ wget https://repo.anaconda.com/archive/Anaconda3-2021.11-Linux-x86_64.sh

# Sammenlign hashsum
lars$datadivers:~$ sha256sum Anaconda3-2021.11-Linux-x86_64.sh
edf9e340039557f7b5e8a8a86affa9d299f5e9820144bd7b92ae9f7ee08ac60  Anaconda3-2021.11-Linux-x86_64.sh

#Installer med
lars$datadivers:~$ bash Anaconda3-2021.11-Linux-x86_64.sh

Welcome to Anaconda3 2021.05

In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>>
# Tryk Enter for at fortsætte installatione eller Esc for at afslutte

Do you accept the license terms? [yes|no]
>>> 
# Hvis enig skriv "yes" ellers "no" og stop installation her

Anaconda3 will now be installed into this location:
/home/ourcodeworld/anaconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below
# Følg ovenstående besked

done
installation finished.
Do you wish the installer to initialize Anaconda3
by running conda init? [yes|no]
# Indtast yes for at afslutte installationen

==> For changes to take effect, close and re-open your current shell. <==
# Luk nu terminalvinduet således det installrede kan træde i kraft.

Så skal der lige køres et check og en update på anaconda.


lars$datadivers:~$ conda info
active environment : base
    active env location : /home/lars/anaconda3
    ...
    offline mode : False

# For at opdatere Anaconda køre
lars$datadivers:~$ conda update conda

# Og så skal Anaconda pakkerne opdateres
lars$datadivers:~$ conda update anaconda
Proceed ([y]/n)?
# Tryk y for at fortsætte

Så mangler vi kun at få installeret voila til Jupyter notebook og aktivere selvsamme i Anaconda


lars$datadivers:~$ pip3 install voila
lars$datadivers:~$ conda install voila -c conda-forge

Slutteligt starter vi Anacond navigator med kommandoen:


lars$datadivers:~$ anaconda-navigator

Kilder: https://anaconda.cloud/
https://blog.jupyter.org/and-voil%C3%A0-f6a2c08a4a93
https://anaconda.cloud/pittsburgh-bikeshare
https://docs.anaconda.com/anaconda/navigator/tutorials/create-r-environment/ https://ourcodeworld.com/articles/read/1609/how-to-install-anaconda-in-ubuntu-2004
https://phoenixnap.com/kb/how-to-install-anaconda-ubuntu-18-04-or-20-04
https://blog.jupyter.org/and-voil%C3%A0-f6a2c08a4a93.

Installation af Julia på Ubuntu 20.04

Dato: 2022.02.06

Julia er efter sigende analysesproget for det 21nd århundrede, hurtigere og bedre end de såvel R og Python. Mere om sammenligningerne senere, her handler det om installation på Ubuntu.

Først åbens et Terminal-vindue og Ubuntu klargøres ved at finde de nødvendige opdateringspakker for derefter at installere dem.


lars$datadivers:~$ sudo apt-get update
lars$datadivers:~$ sudo apt-get upgrade

Så findes den seneste version på GitHub og vi checker om der eksisterer en version installeret på computeren i forvejen.


lars$datadivers:~$ JULIA_VER=$(curl -s "https://api.github.com/repos/JuliaLang/julia/releases/latest" | grep -Po '"tag_name": "v\K[0-9.]+')
lars$datadivers:~$ JULIA_MINOR_VER=$(echo $JULIA_VER | grep -Po "^[0-9]+.[0-9]+")

Dernæst downloades seneste version fra Julias hjemmeside.


lars$datadivers:~$ curl -o julia.tar.gz "https://julialang-s3.julialang.org/bin/linux/x64/${JULIA_MINOR_VER}/julia-${JULIA_VER}-linux-x86_64.tar.gz"

Vi skaber et bibliotek i /opt/ biblioteket og pakker programmet ud.


lars$datadivers:~$ sudo mkdir /opt/julia
lars$datadivers:~$ sudo tar xf julia.tar.gz --strip-components=1 -C /opt/julia

Til sidst skaber vi et link til Julia i ~/.bashrc eller ~/.bash_profile filen ved at kopiere nedenstående kode ind.


lars$datadivers:~$ export PATH="$PATH:/opt/julia/bin"

# Programmet kan nu køres med kommandoen
lars$datadivers:~$ julia

Kilder: Julia og Lindevs Blog

Klassifikation

Klassifikation er superviseret læring der har til hensigt at inddele de observerede identiteter i konkrete grupper med en betemt egenskab. Det kan lige såvel dreje om planter vi ønsker at katalogisere til sikring af en leverances kvalitet, fisk der skal sorteres på trawlers transportbånd så bifangst undgåes eller kunder der skal identificeres som mulige churns.

Du vil starte med at lære det simple tilfælde, hvor alene er to diskrete klasser skal identificeres i en beskrivende dimension, derfra øges antallet af til to, tre og op til en generalisering af dimensionerne.
Mens det diskrete tilfælde fastholdes vil du lære at håndtere et øget antal klasser når 2 går til 3 til 4 osv inden fokus skiftes til kontinuerte klasser og dimensioner.

I processen vil du støde på begreberne
og værktøjerne

Hypotese apparatet

Først skal der dog styr på hele det matematiske hypotese apparatet, der muliggør en struktureret analyse af data.

Høj Vægt Køn
\(x_{1,1}\) \(x_{1,2}\) \(x_{1,3}\)
\(x_{2,1}\) \(x_{2,2}\) \(x_{2,3}\)
\(x_{3,1}\) \(x_{3,2}\) \(x_{3,3}\)
\(x_{4,1}\) \(x_{4,2}\) \(x_{4,3}\)
\(x_{5,1}\) \(x_{5,2}\) \(x_{5,3}\)
\(x_{6,1}\) \(x_{6,2}\) \(x_{6,3}\)
\(x_{7,1}\) \(x_{7,2}\) \(x_{7,3}\)
\(x_{8,1}\) \(x_{8,2}\) \(x_{8,3}\)
\(x_{9,1}\) \(x_{9,2}\) \(x_{9,3}\)
\(x_{10,1}\) \(x_{10,2}\) \(x_{10,3}\)
\(x_{11,1}\) \(x_{11,2}\) \(x_{11,3}\)

Antag vi har registreret 11 identiteter i tre dimensioner og vi nu ønsker nu at skabe en regel der kan forudsige den tredje dimension ud fra de to andre. Et eksempel kunne være at forudsige et menneskes køn ud fra højde og vægt.
De 11 observationssæt ses afbildet herunder.

Matematikke bag.

En observation består af tre registreringer \(x_{.1}, x_{.2}\) og \(x_{.3}\). I eksemplet fra før er det være højde, vægt og køn. Der er 11 observationer, hvorfor den første registrering kommer til at hedde \(x_{1,1}, x_{1,2}\) og \(x_{1,3}\). Dermed har vi en \(11\)x\(3\) matrice og i eksemplet er hver række en person og hver søjle er de informationer vi har registreret om personen, altså højde, vægt og køn.

I tilfældet med de 11 registreringer afbildet ses her der 7 kvinder markeret med \(O\) og 5 mænd markeret med \({\Delta}\).

Resultat fra kommunalvalg i Vejle november 2017 fordelt på valgsteder.