Obligatorisk innlevering uke 3, alternativt oblig-løp

Frist for innlevering: 08.09. kl 23:59

Spørsmål eller kommentarer til oppgaveteksten sendes til ivargry@ifi.uio.no.

Læringsmål

Introduksjon

I denne oppgaven skal vi forsøke å avgjøre hvorvidt en person kommer til å klare å nedbetale et lån eller ikke. Dette skal vi gjøre basert på enkel informasjon om personen, slik som alder, kjønn, utdanningsnivå, hvor mye gjeld personen har og historikk over tidligere gjeld. Vi skal se at vi enklere kan holde orden på informasjon om disse personene ved hjelp av lister, og at ordbøker kan gjøre oppslag av informasjon enklere.

Basert på informasjon om en person er det selvsagt ikke mulig å vite helt sikkert om en person kommer til å betale gjelden sin eller ikke, men vi kan forutsi det med en viss nøyaktighet. Dersom du ønsker kan du delta i en valgfri konkurranser der programmet du leverer blir kjørt på 30 000 tilfeller, hvor du får feedback på hvor høy treffsikkerhet det hadde på dette datasettet. Blant de som deltar kårer vi en vinner blant de som hadde høyest treffsikkerhet. Høy treffsikkerhet er ikke noe krav for å bestå innleveringen.

Innleveringen er delt inn i flere deloppgaver, og for hver oppgave vil du gradvis forbedre prediksjonen. Den valgfrie oppgaven der du lager en valgfri egen prediksjon som blir kjørt på 30 000 individer kommer helt til slutt.

Oppgave 1: Hente inn alder, kjønn, sivilstatus og gjeld.

Filnavn: enkel_prediksjon.py

Lag en prosedyre enkel_prediksjon som henter inn alder, kjønn, sivilstatus og mengde gjeld (i kroner) til en person. Lagre denne informasjonen i passende variabler.

Print en setning som beskriver personen basert på denne informasjonen. Eksempel: "Du er en singel mann på 30 år med 100 000 kr i gjeld".

Kall prosedyren en gang og test at den fungerer (dvs. at den skriver ut informasjonen som brukeren gir på rett måte).

Oppgave 2: Enkel prediksjon basert på alder, kjønn sivilstatus og gjeld

Filnavn: enkel_prediksjon.py

Vi ønsker nå å skrive et lite program som prøver å predikere om personen vil betale gjelde sin eller ikke.

Vi antar følgende:

Fortsett i prodsedyren enkel_prediksjon som du skrev i forrige oppgave. Skriv if-setninger som basert på antakelsene over vurderer om personen vil betale gjelden sin eller ikke. Basert på dette skal det printes enten “vil betale” eller “vil ikke betale”.

Test programmet ditt med ulike verdier. Sjekk for eksempel at det printes “vil ikke betale” hvis du kjører programmet med singel mann på 21 år med 120 000 kroner i gjeld.

Oppgave 3: Prediksjon basert på tidligere betalingshistorikk

Filnavn: prediksjon_med_historikk.py

Lag en ny prosedyre prediksjon_med_betalingshistorikk. Hent inn alder, kjønn, sivilstatus og mengde gjeld på samme måte som i oppgave 1 (du kan kopiere de linjene med kode).

Vi ønsker nå også å hente inn betalingshistorikken fra de tre forrige fire månedene og legge denne informasjonen i en liste.

Implementer den samme prediksjonen som du skrev i oppgave 2 (du kan kopiere koden fra den prosedyren), men gjør én endring: Prediker alltid at personen ikke vil betale hvis personen ikke har betalt 2 av de 3 forrige månedene.

Oppgave 4: Prediksjon basert på utdanningsnivå

Filnavn: prediksjon_med_historikk.py (fortsett på samme kode som i forrige oppgave)

Utvid prosedyren du skrev i oppgave 3 til å også hente inn utdanningsnivå. Utdanningsnivå skal være en streng som enten er “ukjent”, “grunnskole”, “hoeyskole” eller “universitet”.

Vi ønsker å anta et inntektsnivå basert utdanningsnivået til personen. Vi antar at gjennomsnittlig årsinntekt for de ulike utdanningsnivåene er:

Denne informasjonen kan vi representere i en ordbok der nøkkel er utdanningsnivå og verdiene er inntekten. Opprett en slik ordbok øverst i prosedyren prediksjon_med_betalingshistorikk. La nøklene være små bokstaver og bytt ut ø-en i høyskole med oe (hoeyskole).

Skriv kode for å lese inn utdanningsnivået ved hjelp av input, og hent ut forventet inntekt ved å gjøre et oppslag i ordboken.

Utvid deretter reglene dine slik at du alltid spår “vil betale” hvis personen er mann og har forventet inntekt som er høyere enn 3 ganger gjelden.

Oppgave 5: Svartelistede personer

Filnavn: svartelisting.py

I noen tilfeller er ikke prediksjon nødvendig, fordi vi allerede er ganske sikre på hvem vi f. eks ønsker å tilby et lån eller ikke.

For eksempel har banker typisk tilgang til lister over personer som ikke skal få lån, basert på tidligere historikk (en slags svarteliste).

Lag en ny prosedyre bestem_laan hvor du kun leser inn kunde-ID til en person ved hjelp av input (kunde-ID vil være et tall og må konverteres).

Anta at du vet at følgende personer personer (identifsert med kunde-ID) mest sannsynlig aldri vil betale gjelden sin, og at disse ikke bør få lån:

23894, 29741, 10961, 22768, 22803, 11993, 24409, 9312, 29405, 6638, 738, 29964, 11967, 13443, 11534, 26228, 6867, 23027, 29137, 14084, 452, 15594, 22765, 25487```python

Basert på denne informasjon kunne du ved hjelp av if-setninger sjekket om kunde-ID-en som tastes inn er lik en av de svartelistede ID-ene, men dette vil kreve veldig mange if-else-setninger.

I stedet ønsker vi å lage en en mengde (set) som representerer kundene som er svartelistet. Dette kan du gjøre ved å kopiere linjen over og legge til { og } på hver side (se på forelesningsslidene dersom du har glemt hvordan du lager en mengde).

Sjekk deretter i prosedyren bestem_laan om kunde-ID-en som sendes inn matcher en av de svartelistede ID-ene (ved å sjekke om den finnes i mengden), og print i så fall "kan ikke få lån". Hvis den matcher, print "kan få lån".

Skriv en kommentar nederst i denne filen hvor du svarer på følgende spørsmål: Hvorfor passer det fint å bruke en mengde for å representere svartelistede kunder? Kunne man evt brukt en liste eller en ordbok?

Oppgave 6: Din egen prediksjon (valgfri oppgave) som kjører på tusenvis av individer

Filnavn: min_egen_prediksjon.py

Denne oppgaven er valgfri, men hvis du gjør den, vil prediksjonen din bli kjørt på 30 000 individer når du leverer oppgaven, og du vil få tilbakemelding på hvor bra den gjør det. Neste gruppetime vil vi litt uhøytidelig kåre en vinner.

For å få til å kjøre koden på så mange individer på en enkel måte, er vi nødt til å ta i bruk noen av konseptene som blir gjennomgått i løpet av de neste ukene. Dette blir derfor en smakebit på noe av det som kommer, og man trenger ikke å være bekymret om man ikke får til dette eller ikke skjønner hva som skjer her.

Endre prosedyren til å være en funksjon som tar parametere

Til nå har vi skrevet prosedyrer som henter input fra brukeren ved hjelp av input. Dette krever interaksjon med den som kjører programmet (via kommandolinjen), noe som er tungvindt hvis man skal skrive større programmer eller programmer der input-en kommer fra andre kilder enn fra kommandolinjen (f. eks hvis input er et resultat fra andre prosedyrer eller blir generert av andre deler av programmet).

De neste ukene skal vi se at funksjoner løser dette problemet. En funksjon er enkelt forklart en prosedyre som kan ta input via parametere, og returnere en verdi.

Følgende kode definerer en funksjon min_prediksjon som tar en rekke parametere, som blir tilgjengelig inne i funksjonen. I stedet for å måtte oppgi disse parameterene via kommandolinjen, kan vi kalle funksjonen med parameterene (se linjen etter funksjonen):

def min_prediksjon(alder, kjonn, sivilstatus, gjeld, betalingshistorikk, utdanningsnivo):

    # if alder < 28 and gjeld < 10000 ... osv
    
    return "vil ikke betale"
    
resultat = min_prediksjon(50, "mann", "singel", 100000, ["betalt", "ikke_betalt", "betalt"], "hoeyskole")
print("Resultatet er:", resultat)

Ta utgangspunkt i koden over og fyll inn funksjonen slik at den fungerer på samme måte som koden du skrev i oppgave 4 (men ikke bruk input). Merk at funksjonen nå tar inn en liste betalingshistorikk som vi forventer er laget på utsiden av funksjonen. Du trenger derfor ikke å opprette denne listen inne i funksjonen.

Kjør prediksjonen på 1000 personer

Senere i faget skal vi lære hvordan vi kan kjøre kode mange ganger ved hjelp av løkker. Det er for eksempel veldig praktisk å kunne gjøre hvis man skal predikere hvorvidt 1000 personer vil betale eller ikke, og ikke bare én person (slik vi har gjort til nå).

Nå kan du bruke koden under for å evaulere din egen prediksjon. Kopier følgende kode inn i filen min_prediksjon.py. Denne koden leser 1000 individer fra fil og kjører din funksjon for hvert individ og sjekker om det du predikerer er rett eller ikke. Du trenger ikke å sette deg inn i denne koden eller forstå hvordan den fungerer.


# Her er din funksjon med din egen prediksjon
def min_prediksjon(alder, kjonn, sivilstatus, gjeld, betalingshistorikk, utdanningsnivo):
    # ...

# Dette limer du inn under
def test_min_prediksjon():

    antall_predikert = 0
    antall_riktig_predikert = 0

    filnavn = "individer1000.txt"
    fil = open(filnavn)
    for linje in fil:
        data = linje.strip().split(",")
        alder = int(data[1])
        kjonn = data[2]
        sivilstatus = data[3]
        gjeld = int(data[4])
        betalingshistorikk = []
        for i in range(0, 3):
            betalingshistorikk.append(data[5+i])

        utdanningsnivo = data[8]
        fasit = data[9]

        prediksjon = min_prediksjon(alder, kjonn, sivilstatus, gjeld, betalingshistorikk, utdanningsnivo)

        if prediksjon == fasit:
            antall_riktig_predikert += 1

        antall_predikert += 1



    print(antall_riktig_predikert, "av", antall_predikert, "ble riktig predikert")


test_min_prediksjon()

Du må i tillegg laste ned denne filen, og lagre den som individer1000.txt i samme mappe som du skriver programmet ditt.

Hvis du har gjort alt rett og kjører dette programmet, vil det til slutt printes hvor mange riktig predikeringer du har på 1000 individer. Når du leverer obligen vil programmet ditt bli kjørt på 30 000 individer. Du "trener" altså programmet ditt på et mindre antall individer enn det programmet vil bli brukt på senere.

Ekstra informasjon

Du kan implementere din egen prediksjon akkurat slik du vil. Du kan ha nytte av denne informasjonen når du skal implementere dine egne regler. Disse tallene gjelder for datasettet du vil bli vurdert på til slutt:

Krav til innlevering

Hvordan levere oppgaven

Kommenter på følgende spørsmål i kommentarfeltet i Devilry. Spørsmålene skal besvares.

For å levere:

  1. Logg inn på Devilry.
  2. Lever alle .py-filene , og husk å svare på spørsmålene i kommentarfeltet.
  3. Husk å trykke lever/add delivery og sjekk deretter at innleveringen din er komplett. Du kan levere flere ganger, men alle filer må være med i hver innlevering.
  4. Den obligatoriske innleveringen er minimum av hva du bør ha programmert i løpet av en uke. Du finner flere oppgaver for denne uken på semestersiden.