Leren Exceleren

Mijn ouders zitten terwijl ik dit blog schrijf in Moldavië. Mijn moeder had in het hotel waar ze overnachtte problemen met de Wifi-verbinding van haar telefoon. Een ter hulp geroepen hotelbediende lukte het vervolgens wel de koppeling tot stand te brengen. Deze dame sprak na het oplossen van het probleem de woorden: ‘It’s magic’. Toen ik dat verhaal hoorde, was mijn eerste reactie: “Hé, dat is mijn tekst! Ik zal die lui in Moldavië eens laten zien wie hier de software magiër is”. Ik had toen eigenlijk het huidige blog al opgegeven, maar dat weerhield me niet om er nog eens met een frisse blik tegen aan te kijken.

De missie: schrijf een AI in ’s werelds meest gebruikte en meest veelzijdig ingezette bedrijfsapplicatie: Microsoft Excel. Nou is dat niet zo heel erg ingewikkeld. Excel heeft namelijk een volwaardige programmeertaal ingebakken in de ontwikkelaarsmodus. Maar dat is niet echt een uitdaging, daarom was het idee om voor de AI uitsluitend ingebakken Excelformules te gebruiken.

In theorie moet dat kunnen. Excel heeft genoeg veelzijdige formules die zou je kunnen gebruiken als functies en dan heb je een, zij het hele rudimentaire, functionele programmeertaal. In de praktijk echter is het absoluut gekkenwerk en ik heb ook nog andere hobby’s. Bovendien: wat heb ik hotelmedewerkers in Moldavië te bewijzen? Dus na een goede 18 minuten heb ik besloten dat het geheel heel erg te versimpelen. Wat is het allerminste wat ik nog kan kwalificeren als een kunstmatige intelligentie? Dat is altijd een discutabele vraag, maar ik heb het gevoel dat ik met een kennissysteem nog wel weg kan komen. Een kennissysteem is een computersysteem dat menselijke kennis bevat en dat gebruikt om een probleem op te lossen. Als dat klinkt als elk computersysteem, tja dat doet het ook, maar zoals ik zei, ik ben aan het versimpelen. Als je daar problemen mee hebt stel ik voor dat je eerst een paar uur een neuraal netwerk in Excel formules probeert te bouwen, vervolgens op Wikipedia de pagina over expertsystemen leest, deze podcast luistert waarin iemand van Microsoft zegt dat een rekenmachine al KI is en dan net als ik je schouders ophaalt en pakt wat je pakken kan.

Dus een expertsysteem. Een goed voorbeeld van een expertsysteem is een diagnosesysteem. Je geeft je symptomen op, het systeem stelt aan de hand daarvan een aantal vragen en trekt vervolgens op basis van jouw symptomen en jouw antwoorden een conclusie. Een ander bekend voorbeeld zijn die 20-questions-spelletjes die met 20 ja/nee-vragen raden welk bekend persoon je in je hoofd hebt. Dat is nog steeds best wel ingewikkeld en ik was enorm aan het versimpelen (ik neem het versimpelen op dit moment erg serieus!) dus we gaan op het randje zitten van wat je nog een expertsysteem mag noemen. Een heel bekend voorbeeld (zeker voor ouders) van een expertsysteem is de Apgartest. Voor elke baby checkt een arts 5 kritieke onderdelen. Op elk onderdeel kun je 0,1 of 2 punten scoren. Deze punten tel je op en voor het resultaat geldt de vuistregel dat als je een ruime voldoende scoort er (waarschijnlijk) niets aan de hand is. Scoor je een onvoldoende dan staat er binnen no-time een heel doktersteam in de kamer.

Vandaag houden we het expertsysteem iets luchtiger en gaan we een eenvoudig boekhoudprogramma in elkaar zetten. Daarvoor richten we een fictieve klaverjasbedrijfscompetitie op binnen Orcado. (Die competitie is fictief, want ondanks dat meerdere van mijn collega’s kunnen klaverjassen hebben ze het nog nooit aangedurfd om daadwerkelijk tegen me te klaverjassen. Dat neem ik ze overig niet kwalijk, van de 4 kampioenschappen die ik vorig jaar heb gewonnen, was maar één een badmintonkampioenschap, de rest waren klaverjasoverwinningen.) Het belangrijkste van een fictieve competitie is natuurlijk de naam. Na een bijzonder korte brainstormsessie is dat geworden: Harten ITwee. De competitie heeft natuurlijk een financiële afrekening (waarom anders een boekhoudprogramma?). Een goede financiële afrekening voldoet aan een aantal regels (regels die een expert kent).

1. Er is een baten- en een lastenpost.
2. De baten en lasten moeten onder streep gelijk zijn.
3. Je moet van alle baten en lasten een bewijs/afschrift hebben.
4. Het verschil tussen je baten en lasten is een overschot/tekort, dat wordt verrekend met je kas

Die regels zetten we in ons Exceldocument, dat je hier kunt vinden. Vervolgens gaan we aan de hand van Excelformules controleren of aan die regels wordt voldaan. Maar voor dat het zover is gaan we eerst een nieuwe naam bedenken want Harten ITwee is toch het resultaat van een duidelijk té korte brainstormsessie, aan de andere kant is het ook weer niet zó belangrijk, we noemen het wel… uhm… Seinen op eigen wijze.

De eerste regel is simpel, we moeten minstens 1 baat en 1 last hebben, dus als E2, F2, G2 en H2 alle 4 niet leeg zijn hebben we daar aan voldaan. De formule wordt iets ingewikkelder omdat we ook willen laten zien welke er mist, maar het hoeft ook niet te ingewikkeld. Als er 2 missen vind ik het genoeg dat hij de eerste laat zien, en zodra je dat fixt de ander. In Excelformules kan dat zo:

=ALS(ISLEEG(E2);"Er is geen baat met een omschrijving"
;ALS(ISLEEG(F2);"Er is geen baat met een waarde"
;ALS(ISLEEG(G2);"Er is geen last met een omschrijving"
;ALS(ISLEEG(H2);"Er is geen last met een waarde"
;""))))

Het ziet er niet heel elegant uit maar het werkt. Het zijn eigenlijk gewoon geneste if-statements: Als E2 leeg is geef de tekst dat er geen baat  is met een omschrijving anders, als F2 leeg is, et cetera. Ter vergelijking als je dit herschrijft naar javascript en dezelfde logica gebruikt ziet dat er zo uit:

if(E2 === ""){
  return "Er is geen baat met een omschrijving"
} else if (F2 === "") {
  return "Er is geen baat met een waarde"
} else if (G2 === "") {
  return "Er is geen last met een omschrijving"
} else if (H2 === "") {
  return "Er is geen last met een waarde"
} else{
  return ""
}

, wat je zou kunnen herschrijven als:

if (E2 === "") {
  return "Er is geen baat met een omschrijving"
} if (F2 === "") {
  return "Er is geen baat met een waarde"
} if (G2 === "") {
  return "Er is geen last met een omschrijving"
} if (H2 === "") {
  return "Er is geen last met een waarde"
} 
return ""

Dat is al een heel stuk leesbaarder, maar dat is niet in Excel en we moeten troeven met de kaarten die we hebben, dus op naar de volgende regels.

De volgende regel is ook erg makkelijk. We sommeren de baten en de lasten en kijken of die dan ongelijk zijn:

=ALS(J2<>K2;"Baten en lasten zijn ongelijk";"")

Regel 3 is een grotere boef. Om dat makkelijk op te lossen, maken we wat extra hulpvelden. In kolom P komt een opsomming van alle bedragen die ontvangen en uitgegeven zijn. Dit is de uitgebreide versie van kolom E en G. Je kunt er ook voor kiezen om daar alles uit te schrijven en de kwitanties van baten en lasten te scheiden, maar dat heb ik hier niet gedaan. Vervolgens maken we een nieuw blad en zetten we in kolom A de omschrijving en daarnaast een foto van de kwitantie. Daarna vullen we kolom Q met de volgende formule:

=ALS.FOUT(HYPERLINK("#'bijlages'!" & ADRES(VERGELIJKEN($P2; bijlages!$A:$A; 0); 1); TEKST.SAMENVOEGEN("afb "; $P2));"") 

We maken hier een hyperlink naar het bijlageblad, zoeken dan op dat blad in kolom A de waarde van P2 (dit is Q2, in Q5 staat daar P5) en dan linken we naar de cel waar die waarde in staat. We geven die link het naampje afb + P2. Daarom heen staat een ‘als.fout’, voor als er niks gevonden kan worden. In dat geval laten we het veld leeg. Wacht. Ik zal het opsplitsen. Dat maakt het wat leesbaarder:

=ALS.FOUT(                              // ALS.FOUT(waarde;waarde_indien_fout)
    HYPERLINK(                          // HYPERLINK (koppelingslocatie; [vriendelijke_naam])
      "#'bijlages'!" & ADRES(           // ADRES(rij_getal; kolom_getal;[abs_getal];[a1];[blad_tekst])
        VERGELIJKEN(                    // VERGELIJKEN(zoekwaarde; zoeken_matrix;[criteriumtype_getal])
            $P2; 
            bijlages!$A: $A; 
            0);
          1); 
      TEKST.SAMENVOEGEN(                // TEKST.SAMENVOEGEN(tekst1;[tekst2];...)
        "afb "; 
        $P2)
      ); 
    "")

Is dat leesbaarder? Ben je ook niet blij dat ik het simpel heb gehouden? De manier waarop je in Excel formules nest maakt het lastig om te lezen wat er precies gebeurt. Gelukkig is de volgende formule een stuk makkelijk te volgen in kolom R:

=ALS(EN((P2<>"");Q2="");1;0)

Daar staat zoveel als: als P2 niet leeg is EN Q2 is wel leeg, dan 1 anders 0. Vervolgens sommeren we over kolom R en dat geeft ons het aantal missende bijlages. Dat zetten we dan bij de derde regel met:

=ALS(J5>0;""& J5 &" missende bijlage(s)";"")

Als het totaal van missende bijlages groter is dan 0, geef dat aantal en plak daar ‘ missende bijlage(s)’ aan vast. In ons voorbeeld is dat zo in 1 geval. Ik heb nog geen contributie overgemaakt. (Maar gezien ik deze fictieve klaverjascompetitie sowieso ga winnen verrekenen we dat later wel met het prijzengeld.)

Je ziet overigens dat ik twee manieren van tekst aan elkaar plakken door elkaar gebruik:

"aan" & "elkaar" 
//en
TEKST.SAMENVOEGEN("aan","elkaar") 

In dat opzicht zijn Excelformules net een echte programmeertaal: meer oplossingen voor hetzelfde probleem.

Dan moeten we nog de laatste regel: Het verschil tussen je baten en lasten is een overschot/tekort, dat wordt verrekend met je kas. Dat laat ik voor jullie als huiswerkopdracht want ik zit al weer over de 1500 woorden. Je hebt hiervoor de adres- en vergelijkenfuncties nodig van regel 2 of je kunt verticaal zoeken gebruiken. Ik ga me niet in die discussie mengen. Zodra je dat huiswerk hebt gedaan heb je een volledig werkende kunstmatige intelligentie in Excel. Voelt het alsof we echt een kunstmatige intelligentie in Excel hebben gemaakt? Nee, maar was het al het geklooi met Excel uiteindelijk waard? Ook nee, maar zijn we uiteindelijk op zijn minst tevreden over de naam van onze fictieve klaverjas vereniging? Ook nee, dáár kunnen we gelukkig nog iets aan doen. Ehm wat vinden jullie van klaverJSen,  of KlaverClass, of 3-kaarten logica, of Klaverjasegmentation fault, of KlaverjAS2en, of, of, of…   

Disclaimer: Omdat deze exercitie (ook voor mij) niet AI genoeg aanvoelde volgt binnenkort(ish) het blog Leren Exceleren 2, waarin in ik alsnog een neuraal netwerk bouw in Excel, dat 2-waarde logica statements kan leren.