Skip to content

Data opschonen

“deannabosschert” edited this page Nov 9, 2020 · 20 revisions

Lijstje van wat ik heb gedaan qua data cleaning.

Algemeen

ID

Indien de individuele personen relevant zouden zijn, zou een nieuwe kolom met een ID bij elke rij toegevoegd hebben, wat resulteert in een array van id-objecten die op zichzelf ook weer een object bevatten. Dat zou dan als volgt eruit zien:

  const Questionnaire = [{
      "Persoon 1": {
        "geboortedatum": "13-01-1994",
        "rijbewijs": "ja"
      },
      "Persoon 2": {
        "geboortedatum": "02-02-1997",
        "rijbewijs": "nee"
      }]

Duplicate Entries

‌ Er zat een duplicate entry op line 68; deze heb ik uit de dataset gehaald. ‌ Ik heb de kolom 'hoogste bedrag ooit uitgegeven' gesorteerd A-Z om te kijken of er nog meer duplicates in zouden zitten, maar dit was gelukkig niet het geval.

Daarnaast zijn de entries 11, 58 en 63 OOK hetzelfde, geen idee wie de dataset drie keer in heeft zitten vullen maar ik heb er in ieder geval twee van verwijderd.

Ik heb dit wel handmatig gedaan dus eigenlijk telt het niet zo voor functional programming. ‌

Data cleaning per kolom

HEX code van de ogen

‌ Om de data te cleanen heb ik de volgende aanpassingen gedaan:

VERSIE 1.0 van m'n patterns; want ik heb nog een versie 2.0 bij Lievelingskleur in HEX die actually functional is ipv hardcoded 'eyeColor'-variabelen.

Ik haalde de data op middels

module.exports = function getData(datasource, variable) { // get data from questionnaire file
  return new Promise((resolve, reject) => {
    const colors = datasource.filter(item => ({
      [variable]: item[variable]
    }))
    resolve(colors)
  })
}

Eigenlijk zou ik volgens FP-principe, een aparte functie voor fetchen en aparte functie voor filteren moeten gebruiken.

Hex (#) toegevoegd

Waar geen '#' voor stond, heb ik een '#' voor geplaatst.

module.exports = function addHash(data, withHash) { // add hash to answers that don't start with a hash yet
  return data.map((item) => {
    let eyeColor = item.eyeColor
    if (eyeColor.startsWith('#')) {
      return {eyeColor: eyeColor}
    } else {
      const newEyecolor = '#'.concat(eyeColor)
      return {eyeColor: newEyecolor}
    }
  })
}

Whitespace verwijderd



Waar een spatie in het antwoord verwerkt zat, heb ik deze uitgehaald



module.exports = function removeWhitespace(data) { // remove excessive tabs at the start or end of a value
  return data.map((item) => {
    const trimmed = item.eyeColor.trim()
    return {eyeColor: trimmed}
  })
}

Rgb naar Hex

Waar een RGB-kleur ipv HEX is ingevuld, heb ik omgezet naar hexadecimaal.

 Ik heb hiervoor wel een package gebruikt; ik heb eerst geprobeerd zelf uit te zoeken wat de juiste berekeningen zouden (moeten) zijn maar na iets meer dan een uur zat ik van 'waar ben ik mee bezig lol' en besloot ik een package hiervoor te gebruiken. Ik had opzich ook een functie ervoor van internet kunnen halen en credits in de codecomments kunnen geven maar hey, support your npmlocals.

const rgbHex = require('rgb-hex')

module.exports = function rgbToHex(data) { // check for rgb answers, then convert them to hex
  return data.map((item) => {
    let eyeColor = item.eyeColor
    const matches = eyeColor.substring(1, 4).match(/rgb+/g)
    if (matches == 'rgb' || matches == 'RGB') {
      const hexColor = matchRGB(eyeColor)
      return {eyeColor: hexColor}
    } else {
      return {eyeColor: eyeColor}
    }
  })
}

function matchRGB(rgb) { // convert rgb answers to hex, using the rgbHex-package
  const cleanRGB = rgb.replace(/\./gi, ',').substring(1)
  return `#${rgbHex(cleanRGB)}`
}

Plain text naar Hex

Waar alleen een kleur is ingevuld als 'lichtblauw' of 'bruin', heb ik de data vervangen met de bijbehorende algemene hex-kleur volgens de Web Colors standaarden

. Hiervoor heb ik de kleuren van de webpagina gehaald, in excel gegooid, geëxporteerd als csv en omgezet naar JSON.

const htmlcolors = require('../../_data/html-kleurcodes.js')

module.exports = function wordToHex(data) { // look for the matching hex in the htmlcolors-file
  return data.map((item) => {
    let eyeColor = item.eyeColor
    const match = /^#(?:[0-9a-fA-F]{3}){1,2}$/i.test(eyeColor) // source for regex: https://stackoverflow.com/questions/1636350/how-to-identify-a-given-string-is-hex-color-format
    if (match == false) {
      let word = eyeColor.replace(/#/gi, '').toLowerCase()
      for (color of htmlcolors) {
        if (color.NL == word || color.EN == word) {
          return {eyeColor: color.HEX}
        }
      }
      return {eyeColor: eyeColor}
    } else if (match == true) {
      return {eyeColor: eyeColor}
    }
  })
}

Uppercase

Of het verder met uppercase of lowercase-letters moet, ligt aan de programmeertaal. Voor CSS maakt het momenteel gelukkig geen zak uit, maar alsnog heb ik daar een aanpassing aan gedaan.

module.exports = function toUpperCase(lowercase) { // convert all values to uppercase
  return lowercase.map((item) => {
    let uppercase = item.eyeColor.toUpperCase()
    return {eyeColor: uppercase}
  })
}

Slaapkamer

Hier heb ik de punten (.) vervangen door komma's (,).

Importeren naar 11ty

const CleanSizes = require('../lib/clean-sizes.js')
const RenderSizes = require('../lib/render-sizes.js')

module.exports = async () => {
  return eyesizes = await CleanSizes('bedroomSize')
  .then(data => RenderSizes(data, 'bedroomSize'))
}

Cleaning

const questionnaire = require('../_data/Survey_Information_Design_clean-parsed.js')
const getData = require('./filters/get-data.js')
const removeWhitespace = require('./filters/remove-whitespace.js')
const pointToComma = require('./filters/point-to-comma.js')

module.exports = async (variable) => {
  try {
    return cleanColors = await getData(questionnaire, variable) // wait for data
      .then(data => removeWhitespace(data, variable)) // remove whitespace
      .then(data => pointToComma(data, variable))
  } catch (err) {
    console.error(err)
  }
}

Punten vervangen door komma's

module.exports = function pointToComma(data, variable) {
  return data.map((item) => {
    return {[variable]: item[variable].replace(/\./gi, ',')}
  })
}

Schoenmaat

Ook hier heb ik de punten (.) vervangen door komma's (,) ‌

Exporteren voor 11ty

const CleanSizes = require('../lib/clean-sizes.js')

module.exports = async () => {
  return shoeSizes = await CleanSizes('shoeSize')
}

Cleaning

const questionnaire = require('../_data/Survey_Information_Design_clean-parsed.js')
const getData = require('./filters/get-data.js')
const removeWhitespace = require('./filters/remove-whitespace.js')
const pointToComma = require('./filters/point-to-comma.js')

module.exports = async (variable) => {
  try {
    return cleanColors = await getData(questionnaire, variable) // wait for data
      .then(data => removeWhitespace(data, variable)) // remove whitespace
      .then(data => pointToComma(data, variable))
  } catch (err) {
    console.error(err)
  }
}

Punten vervangen door komma's

module.exports = function pointToComma(data, variable) {
  return data.map((item) => {
    return {[variable]: item[variable].replace(/\./gi, ',')}
  })
}


## Lievelingskleur in HEX
* Waar ipv een '#', een ' stond, vervangen door '#'


* #000 naar #000000



Alles geïmporteerd voor Eleventy middels
```js
const CleanColors = require('../lib/clean-colors.js')
const RenderColors = require('../lib/render-colors.js')

// export de async functie, die wacht dan weer to CleanEyecolor is uitgevoerd, return dan de door die functie gereturnde waarde en render deze dan
// dit is async aangezien er komende week nog meer uit te voeren functies bijkomen die asynchroon uitgevoerd mogen worden
module.exports = async () => {
  return eyeColors = await CleanColors('favoriteColor')
  .then(data => RenderColors(data, 'favoriteColor'))
}

waarbij ik de cleaning uitvoer middels

const questionnaire = require('../_data/Survey_Information_Design_clean-parsed.js')
const getData = require('./filters/get-data.js')
const removeWhitespace = require('./filters/remove-whitespace.js')
const addHash = require('./filters/add-hash.js')
const toUpperCase = require('./filters/to-uppercase.js')
const wordToHex = require('./filters/word-to-hex.js')
const rgbToHex = require('./filters/rgb-to-hex.js')

// I should refactor everything in a way that I map over the values at first, then filter and reduce instead of repeating to map
// I should also swap the adding of the hash and the converting..

module.exports = async (variable) => {
  try {
    return cleanColors = await getData(questionnaire, variable) // wait for data
      .then(data => removeWhitespace(data, variable)) // remove whitespace
      .then(trimmed => addHash(trimmed, variable)) // add hashtag
      .then(withHash => wordToHex(withHash, variable)) // convert text to hex
      .then(allColors => rgbToHex(allColors, variable)) // convert rgb to hex
      .then(cleanHEX => toUpperCase(cleanHEX, variable)) // make uppercase
  } catch (err) {
    console.error(err)
  }
}

Ik fetch hierin de data middels

module.exports = function getData(datasource, variable) { // get data from questionnaire file
  return new Promise((resolve, reject) => {
    const colors = datasource.map(item => ({
      [variable]: item[variable]
    }))
    resolve(colors)
  })
}

Hex (#) toegevoegd

Waar geen '#' voor stond, heb ik een '#' voor geplaatst.

module.exports = function addHash(data, variable) { // add hash to answers that don't start with a hash yet
  return data.map((item) => {
    if (item[variable].startsWith('#')) {
      return {[variable]: item[variable]}
    } else {
      return {[variable]: '#'.concat(item[variable])}
    }
  })
}

Whitespace verwijderd



Waar een spatie in het antwoord verwerkt zat, heb ik deze uitgehaald



module.exports = function removeWhitespace(data, variable) { // remove excessive tabs at the start or end of a value
  return data.map((item) => {
    return {[variable]: item[variable].trim()}
  })
}

Rgb naar Hex

Waar een RGB-kleur ipv HEX is ingevuld, heb ik omgezet naar hexadecimaal.

 Ik heb hiervoor wel een package gebruikt; ik heb eerst geprobeerd zelf uit te zoeken wat de juiste berekeningen zouden (moeten) zijn maar na iets meer dan een uur zat ik van 'waar ben ik mee bezig lol' en besloot ik een package hiervoor te gebruiken. Ik had opzich ook een functie ervoor van internet kunnen halen en credits in de codecomments kunnen geven maar hey, support your npmlocals.

const rgbHex = require('rgb-hex')

module.exports = function rgbToHex(data, variable) { // check for rgb answers, then convert them to hex
  return data.map((item) => {
    const matches = item[variable].substring(1, 4).match(/rgb+/g) // check if the string (without the hash) has 'rgb' in it
    if (matches == 'rgb' || matches == 'RGB') {
      return {[variable]: matchRGB(item[variable])}
    } else {
      return {[variable]: item[variable]}
    }
  })
}

function matchRGB(rgb) { // convert rgb answers to hex, using the rgbHex-package
  const cleanRGB = rgb.replace(/\./gi, ',').substring(1)
  return `#${rgbHex(cleanRGB)}`
}

Plain text naar Hex

Waar alleen een kleur is ingevuld als 'lichtblauw' of 'bruin', heb ik de data vervangen met de bijbehorende algemene hex-kleur volgens de Web Colors standaarden

. Hiervoor heb ik de kleuren van de webpagina gehaald, in excel gegooid, geëxporteerd als csv en omgezet naar JSON.

const htmlcolors = require('../../_data/html-kleurcodes.js')

module.exports = function wordToHex(data, variable) { // look for the matching hex in the htmlcolors-file
  return data.map((item) => {
    const match = /^#(?:[0-9a-fA-F]{3}){1,2}$/i.test(item[variable]) // source for regex: https://stackoverflow.com/questions/1636350/how-to-identify-a-given-string-is-hex-color-format
    if (match == false) {
      let word = item[variable].replace(/#/gi, '').toLowerCase()
      for (color of htmlcolors) {
        if (color.NL == word || color.EN == word) {
          return {[variable]: color.HEX}
        }
      }
      return {[variable]: item[variable]}
    } else if (match == true) {
      return {[variable]: item[variable]}
    }
  })
}

Uppercase

Of het verder met uppercase of lowercase-letters moet, ligt aan de programmeertaal. Voor CSS maakt het momenteel gelukkig geen zak uit, maar alsnog heb ik daar een aanpassing aan gedaan.

module.exports = function toUpperCase(data, variable) { // convert all values to uppercase
  return data.map((item) => {
    return {[variable]: item[variable].toUpperCase()}
  })
}

Politieke voorkeur

Wat ik gecleaned zou hebben:

  • Het antwoord '/' weggehaald


  • De volledige namen vervangen door hun afkortingen zoals op deze lijst aangeduid


  • Alles wat op 'ben er niet zo mee bezig' neerkomt, vervangen door 'Niet zo mee bezig'.


  • Alles wat op 'geen idee' neerkomt, vervangen door 'Geen idee'.


  • Alles wat op 'gaat je niets aan/wil ik niet vertellen' neerkomt, vervangen door 'Zeg ik liever niet'.


  • 'Geen voorkeur' in hetzelfde format qua capitals



Verder is er door iemand "Optie 17, optie 16" ingevuld, maar kom er niet uit waar dat voor zou moeten staan. Blanco, stemonthouding, geen idee.

Voor zover ik weet is de nummering van de kandidatenlijsten nog niet bekend, maar in 2017 waren het in ieder geval: ‌

  1. Forum voor Democratie


  2. De BurgerBeweging (19 kieskringen)

 ‌

CMD-voorkeuren (2 kolommen)

Wat ik gecleaned zou hebben:

  • Bij het antwoord 'anders', data vervangen door het antwoord dat in de volgende vraag gegeven is


  • Antwoorden als 'x' of '-' of 'nvt' eruit gehaald


  • Overeenkomende/dubbele antwoorden eruit gehaald


  • "Tech" met Frontend op 1 hoop gegooid, tenzij anders aangegeven (backend bijv wel apart benoemd)



Bijbaan‌

Wat ik gecleaned zou hebben:

  • Lege velden of iets dat op 'nee' neerkomt, vervangen door 'Nee'


  • '0' ook vervangen door 'Nee'.


  • 'Ja' aan het begin van de zin verwijderen zodat alleen de titel van de baan overblijft


  • Van alles een zelfstandig naamwoord gemaakt (bijv: 'ja, horeca' = 'Horecamedewerker')


  • Alles wat op 'bediening' of ' serveerder/serveerster' neerkomt vervangen door: 'Bediende'


  • 'Front-end' vervangen door 'frontend'


  • 'Winkelbediende' vervangen door 'winkelmedewerker'

 ‌

Waarom voor tech/visual gekozen

Wat ik gecleaned zou hebben:

  • Alles met 'beide', aangepast naar 'Beide'


  • Grammaticale fouten of spelfouten verbeterd


  • Iets met 'Interessant' = 'Interessant'


  • Iets met 'Leuk' = Leuk


  • Beknopte zinnen van gemaakt



Wat wil je later worden

Wat ik gecleaned zou hebben:

  • '?'. 'geen idee' of iets in die trant, veranderen in 'Weet ik nog niet'


  • 'Frontend Developer'-varianten veranderen naar 'Frontend Developer'


  • Vormgever etc naar ' Visual Designer'


  • 'Webdesign' naar 'Web Designer'



Geluksgetal

Wat ik gecleaned zou hebben:

  • '00 naar 0



Lievelingsmerk

Wat ik gecleaned zou hebben:

  • Alles met 'geen' naar 'Geen'


  • Hoofdletters


  • 'h&m divided' naar 'H&M'


  • 'Pokemon' naar 'Pokémon'


  • 'Addidas' naar 'Adidas'


  • 'Ben niet merkengeil' en 'geef ik niets om' naar 'Geen'

 ‌

Social Media

Wat ik gecleaned zou hebben:

  • 'Anders' uit antwoord verwijderd


  • '6300 minuten per dag' naar '630 minuten per dag' veranderd aangezien er maar 1440 minuten in een dag zitten



📋 Project

🗓 Logboek

🧹 Data cleaning

📋 Surveydata

⚙📝 Documentatie

🖊️ Notes

📈 Evaluatie

Clone this wiki locally