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.