Processing
Børre Stenseth
Problemer >Befolkning

Befolkning

Hva

Fra Statistisk Sentralbyrå her vi fått tak i tall for befolkningen i Norge for årene 1986 fram til 2017. Vi vil lage en skisse som kan besvare spørsmål om befolkningen i form av enkelttall, tabeller og kurver.

Relevante Skisser
befolkning 

Analyse

Kan problemet dekomponeres, er det så fall noen opplagt eller smart rekkefølge, eller kan problemene løses hver for seg ?

Hvis vi analyserer den aktuelle oppgaven så involverer den i hvert fall tre utfordringer:

  1. Hvordan ser dataene ut, hvordan er de organisert?
  2. Hvordan skal vi kunne lese dem, sikkert og effektivt?
  3. Hvordan skal vi lage en skisse som lett kan modifiseres til å besvare ulike spørsmål ?

Datagrunnlag

Originaltallene er hentet herfra: http://data.ssb.no/api/v0/dataset/1082.csv?lang=no"

Formatet er forenklet og fordelt på to filer, en for menn og en for kvinner:
https://borres.hiof.no/wep/data/befolkning/data/men.txt
https://borres.hiof.no/wep/data/befolkning/data/women.txt.

De to filene er kompakte tekstfiler, hver med en linje for hvert år. Hver linje inneholder 106 tall adskilte med komma. Det første tallet (det 0.te) angir antall menn/kvinner som er yngre enn ett år. Det neste tallet de som er mellom 0 og et år, og det siste tallet de som er 105 år eller eldre.

Lesing

I dette tilfellet har vi ikke så mye vi kan kontrollere. Det vi kan gjøre er å sjekke om vi faktisk finner data på de angitte adressene, og at det er like mange linjer og tall for menn og kvinner.

Organisering

Nedenfor finner du tre filer som setter opp et skjelett som du kan kopiere, bearbeide og utvide etter ønske. Dette skjelette er et forsøk på å lage en arbeidsdeling som gjør endringer rimelig enkle

  • Den første fila, befokning.pde, Setter opp skissen, kontrollerer data og preparerer en datastruktur. Du vil sikkert ha behov for å endre formatet på selve tegneflaten.
  • Den andre fila, ettAar.pde, beskriver en klasse som inneholder data for ett år. Vi lager et objekt av denne typen for hvert år vi har data for. Denne er ment å være rimelig robust og fleksibel med tanke på at det burde være greitt å bruke den som grunnlag for ulike framstillinger. Den burde også være rimelig enkel å modifisere hvis vi vil trekke ut data av litt forskjellig type.
  • Den tredje fila, presentasjon.pde, inneholder noen eksempler på enkel framstilling av data. Et naturlig sted å begynne er å legge til eller endre funksjoner i denne fila.
_befolkning.pde
/*
Norges befolkning 
Tall fra Statistisk Sentralbyrå(SSB):
http://data.ssb.no/api/v0/dataset/1082.csv?lang=no
Data er komprimert til 2 kommaseparerte filer: 
men.csv, women.csv, en linje pr år
Du kan gjerne kopiere filene fra adressene under 
og flytte innholdt til din egen maskin, 
kanskje helst inne i folderen sammen med koden
*/
String filMenn=
  "https://borres.hiof.no/wep/data/befolkning/data/men.txt";
String filKvinner=
  "https://borres.hiof.no/wep/data/befolkning/data/women.txt";
// første året vi har data for
int START_AAR=1986;
// data for alle årene vi har tall for lastes opp i
// en liste av objekter, se fila ettAar.pde
ArrayList<Aarsdata> AarList;
// noe kan gå galt med etablering av data
boolean Feil_I_Data=false;
String feilMelding;
void setup(){ 
  size(600,600);
  // her vil vi lagre alle årene
  AarList=new ArrayList<Aarsdata>();
  // last opp datalistene for menn og kvinner
  String[] Menner = loadStrings(filMenn);
  String[] Kvinner = loadStrings(filKvinner);
  
  if(Menner==null || Kvinner==null){
    Feil_I_Data=true;
    feilMelding="Fant ikke data";  
  }
  else{
    // sjekk data, holder åpent for at det 
    // kan komme flere årstellinger
    if(Menner.length==0){
      Feil_I_Data=true;
      feilMelding="Fant ikke relevante data";  
    }
    if((Menner.length != Kvinner.length)){
      Feil_I_Data=true;
      feilMelding="Ulikt antall år for kvinner og menn";
    }
    
    // gjør klar alle observasjonsårene
    for(int ix=0;  ix<Menner.length; ix++){
      if(!Feil_I_Data)
        AarList.add(new Aarsdata(ix+START_AAR,Menner[ix],Kvinner[ix]));
    }
  }
  noLoop();
}
void draw(){
  background(255, 255,255);
  // bruker rapporterngsmuligheter som 
  // er laget i fila presentasjon.pde
  // velg hvilken rapport du vil se:
  //rapport0(Feil_I_Data,feilMelding);
  //rapport1(2017);
  rapport2();
}
_ettAar.pde
/*
 Klasse som inneholder tall for ett år.
 Menn og kvinner i hver alder, 
 fom 0 år tom 105+ år.
 Det skal altså være 106 tall for hvert 
 kjønn i tallene for et år
*/
class Aarsdata{
  // privat betyr at vi ikke kan hente dataene direkte
  // vi må bruke get-funksjonene nedenfor
  // det aktuelle året
  private int aar;
  // antall menn, kvinner og personer 
  // fordelt på 106 årstrinn
  // personer er summen av menn og kvinner
  private IntList menn;
  private IntList kvinner;
  private IntList personer;
  private int sumMenn;
  private int sumKvinner;
 
  // opprett datasettet, konstruktør
  Aarsdata(int aar,String Menn,String Kvinner){
    this.aar=aar;
    menn=new IntList();
    kvinner=new IntList();
    personer=new IntList();
    sumMenn=0;
    sumKvinner=0;
    
    String[] data=Menn.split(",",0);
    for(int ix=0;ix <data.length;ix++){
      menn.append(int(data[ix]));
      personer.append(int(data[ix]));
      sumMenn+=int(data[ix]);
    }
     
    data=Kvinner.split(",",0);
    for(int ix=0;ix <data.length;ix++){
      kvinner.append(int(data[ix]));
      personer.append(int(data[ix]));
      sumKvinner+=int(data[ix]);
    }
     
    // sjekk data format
    if((menn.size()!=106) ||( kvinner.size()!=106)){
        Feil_I_Data=true;
        println("feil antall årsklasser\n for året: ",aar);
    }
  }
  
  // noen eksempler på datahenting
  // her vil du kanskje lage fler
  //-------------------------
  
  // hent den største verdien som er funnet for et årskull
  int getMaxVerdiPersoner(){
    return personer.max();
  }
  int getSumMenn(){
    return sumMenn;
  }
  int getSumKvinner(){
    return sumKvinner;
  }
  int getSumPersoner(){
    return sumMenn+sumKvinner;
  }
  int getxArigeMenn(int x){
    if(x<0 || x>= menn.size())
      return 0;
    return menn.get(x);
  }
  int getxArigeKvinner(int x){
    if(x<0 || x>= kvinner.size())
      return 0;
    return kvinner.get(x);
  }
  int getxArigePersoner(int x){
    if(x<0 || x>= personer.size())
      return 0;
    return personer.get(x);
  }
  int getMaxAntallMenn(){
    return menn.max();
  }
  int getMaxAntallKvinner(){
    return kvinner.max();
  }
  int getMaxAntallPersoner(){
    return personer.max();
  }
  float getGjennomsnittsAlderMenn(){
    float m=0;
    for(int ix=0;ix < menn.size(); ix++){
      m+=menn.get(ix)*ix;
    }
    return m/sumMenn;
  }
  float getGjennomsnittsAlderKvinner(){
    float m=0;
    for(int ix=0;ix < kvinner.size(); ix++){
      m+=kvinner.get(ix)*ix;
    }
    return m/sumKvinner;
  }
  float getGjennomsnittsAlderPersoner(){
    float m=0;
    for(int ix=0;ix < personer.size(); ix++){
      m+=personer.get(ix)*ix;
    }
    return m/getSumPersoner();
  }
 }
_presentasjon.pde
/*
 Når vi tester at datagrunnlaget er i orden
 Her finner du tre forskjellige rapporter
 som kan kalles fra hovedsketchen (befokning)
*/
//------------
void rapport0(boolean feil,String melding){      
  String S="";
  if(feil)
    S+="Feil\n "+melding;
  else
    S+="Data på plass\nfor "+AarList.size()+" år";
  textSize(32);
  textAlign(CENTER, CENTER);
  fill(0);
  text(S, width/2, height/2); 
}
//----------------
//antall kvinner og menn i et bestemt år
void rapport1(int aarstall){
  Aarsdata a=AarList.get(aarstall-START_AAR);
  String S="År: "+aarstall+"\n"+
           "Antall personer: "+a.getSumPersoner()+"\n"+
           a.getSumKvinner()+" kvinner\n"+
           a.getSumMenn()+" menn";
  textSize(24);
  textAlign(CENTER, CENTER);
  fill(0);
  text(S, width/2, height/2); 
}
//--------------------
//antall personer i de årene vi har tall for
void rapport2(){
  String S="Innbyggere:\n";
  for(int ix=0;ix < AarList.size();ix++)
    S+=ix+START_AAR+": "+AarList.get(ix).getSumPersoner()+"\n";
  textSize(11);
  textAlign(CENTER, CENTER);
  fill(0);
  text(S, width/2, height/2); 
  }

Oppgaverforslag

Det lar seg gjøre å presisere hva en ønsker å finne ut hva en ønsker å framstille og hvordan form det skal ha. Det er viktig å tenke nøyaktig gjennom problemstillingene. Noen eksempler som er relativt uproblematiske:

  • Hvor mange innbyggere var det i Norge i 2003?
  • Hvilket årstall passerte befolkningsmengden 5 millioner?
  • Hvilken aldersgruppe var den største i 1997?
  • Hvor mange barn var i grunnskolealder i 2001?

Det blir vanskeligere og mer usikkert dersom vi stiller spørsmål av denne typen:

  • Hvor mange pensjonister var det i Norge i 2015? Dette kan vi ikke lese ut av tallene. Dels er pesjonsalderen forskjellig for forskjellige yrker og dessuten er pensjoneringstidspunktet for mange frivillig. For å svare på dette må vi ha andre tall fra SSB
  • Hvilket årstall vil befolkningsmengden passere 5.5 millioner? Dette kan vi ikke svare ubetinget på. Innvandring og mulige endringer i fødselsrater spiller inn i dette. SSB lager prognoser av denne typen, men de har faglig og datamessig helt andre forutsetninger enn oss.

Det er alltid viktig å være kritisk til både egne (og andres) konklusjoner når det gjelder bruk av data.

Kurver

Du kan selv velge tema, men framstillingen bør inneholde kurver eller histogrammer. Noen forslag:

  • Lag et histogram, søylediagram, som viser gjennomsnittsalderen for hvert år. Årstallet på x-aksen og gjennomsnittsalderen langs y-aksen.
  • Lage en en framstilling av befolkningen (menn, kvinner, alle) i et bestemt år som kurver med alder på x-aksen og antall på y-aksen.
  • Lag en dynamisk kurve som viser hvordan befolkningen (alle) endrer seg fra år til år.
Problemer >Befolkning