Fredagsfordypning uke 4
Frist for innlevering i Devilry: mandag 18. september kl 23:59
Læringsmål
- Du skal ha forstått hvordan du kan holde styr på mange verdier ved hjelp av forskjellige samlinger (lister, mengder og ordbøker).
- Du skal vite at samlingene representeres av objekter som tilbyr tjenester i programmet.
- I tillegg skal du vise at du kan skrive litt mer komplekse programmer med kunnskapene du har tilegnet deg de siste ukene.
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 senere bygge videre på dette til å delta i en valgfri konkurranse 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 dem som hadde høyest treffsikkerhet. Dette kommer først i uke 5.
Innleveringen er delt inn i flere deloppgaver, og for hver oppgave vil du gradvis forbedre prediksjonen.
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 (ved hjelp av input).
Lagre denne informasjonen i passende variabler.
- Kjønn vil være enten tekststrengen “mann” eller “kvinne”, og alder vil være et tall.
- Sivilstatus er for enkelhets skyld enten “gift” eller “singel”.
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:
- Alle single menn under 30 år med mer enn 100 000 kroner i gjeld vil ikke betale gjelden sin
- Menn under 25 år med mer enn 200 000 kroner i gjeld vil ikke betale gjelden sin, uavhengig av sivilstatus.
- Single kvinner under 28 år med mer enn 300 000 kroner i gjeld vil ikke betale gjelden sin
- Alle andre vil betale gjelden sin
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 månedene og legge denne informasjonen i en liste.
- Lag en tom liste som du skal fylle med betalingshistorikken
- Hent inn betalingshistorikken for de forrige måned ved hjelp av
input(én input for hver mnd, start med forrige mnd, deretter måneden før, til slutt 2 mnd siden) - Forventet input hver gang er enten tekststrengen
betaltellerikke_betalt - For hver gang du leser inn betalingshistorikken for en gitt måned legger du denne i listen
- Print til slutt innholdet i listen slik at du kan se at den har blitt fyllt opp som forventet.
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 minst 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”, “høyskole” eller “universitet”.
Vi ønsker å anta et inntektsnivå basert utdanningsnivået til personen. Vi antar at gjennomsnittlig årsinntekt for de ulike utdanningsnivåene er:
- Ukjent: 300 000 kr
- Grunnskole: 260 000 kr
- Høyskole: 500 000 kr
- Universitet: 700 000 kr
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.
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_lån hvor du kun leser inn kunde-ID til en person ved hjelp av input (kunde-ID vil være et tall og må konverteres til int).
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
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_lån 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?
Om innleveringen
- Kun .py-filene skal leveres inn.
- Koden bør inneholde gode kommentarer som forklarer hva programmet gjør.
- Programmet bør inneholde gode utskriftssetninger som gjør det enkelt for bruker å forstå.