Indlæsning, vask og manipulation af data

Det tredje kursus i programmet Data Science udbudt af John Hopkins Universitet under Coursera hedder “Getting and Cleaning Data”. Dette er en kort sammenfatning af min oplevelse med kurset og en opsummering/huskeliste over nyttige udvidelsesbiblioteker til brug for indlæsning, vask og manipulation af datasæt.

Er dette virkelig Data Science?

I den ideelle verden har vi et komplet datasæt til rådighed for vores kommende data analyse. Men den ideelle verden findes så godt som aldrig. I virkelighedens verden kommer data fra mange forskellige kilder og i mange forskellige formater. Derudover er datasæt ofte mangelfulde og/eller indeholder informationer som ikke er relevante for lige netop din analyse. Jobtitlen “Data Scientist” er tidligere blevet kaldet for det 21. århundredes mest sexede jobtitle, men virkelighedens erfaringer fortæller os, at mellem 50% - 80% af tidsforbruget i en data analyse går med indsamling, vask og manipulation af data. Hvor sexet er den opgave egentligt?

Tilbage til spørgsmålet. Er dette virkelig Data Science? Ja og nej. I sig selv kan indlæsning, vask og manipulation af data næppe kaldes for data science. Men når svaret alligevel er ‘ja’, så er det naturligvis fordi vi i virkelighedens verden er nød til at mestre denne disciplin for at kunne få skabt det datasæt, som vi skal bruge til selve data analysen.

Indlæsning af data

Data kan som nævnt tidligere komme fra mange forskellige kilder og formater. Hvordan får man så læst data ind i R? Der findes heldigvis udvidelsesbibliotekter til rigtig mange standard formater. Her er blot en kort oversigt over nogle af de mest udbredte:

Data kilde R udvidelsesbibliotek
Excel XLConnect
XML XML2R og XMl
JSON jsonlite
SQL rsqlserver og RODBC
WEB rvest og httr

Data i Excel ark kan være ret ustrukturet af natur, og der findes mange andre muligheder end XLConnect. Denne artikel giver et godt overblik.

Web scraping er nærmest en kunst i sig selv. Et rigtig godt værktøj i den forbindelse er Chrome browser udvidelsen SelectorGadget. For en hurtig gennemgang af mulighederne med SelectorGadget henvises til disse slides.

Om web scraping

Husk at checke robots.txt filen for websites for du går i gang med web scraping. Du bør overholde spillereglerne angivet i denne fil. Hvis man fx kigger på O’Reillys webshop finder vi følgende indhold i deres http://shop.oreilly.com/robots.txt fil

Crawl-delay: 30 
Request-rate: 1/30 

som betyder at man kun må foretage et request hver 30. sekund og at man yderligere kun må hente en side per 30. sekund. Der er andre linjer som angiver hvilke URL’er man må eller ikke må webscrape.

Der er alternativer til R

Funktionalitet i mange af de ovennævnte udvidelsespakker er ikke unik for R. Et godt alternativ for personer med hang til kommandolinje værktøjer findes i den fine lille bog Data Science at the Command Line[1]. Der er intet til hinder for at bruge R til selve dataanalysen og andre værktøjer til indsamling mv. af data.

Data manipulation

Nu er data læst ind i R. Kan man så gå i gang med selve dataanalysen? Næppe. Datasættet kan være både ufuldstændigt og organiseret på en måde som slet ikke er velegnet til videre bearbejdning. Vi må i gang med data vask og manipulation først. Fra kurser skal nævnes følgende tre punkter:

Tidy data

Artiklen Tidy Data af Hadley Wickham er must-read om emnet. Kort sagt er tidy data kendetegnet ved

Hvis du er bekendt med Codds normalformer for databaser så vil du genkende tidy data som opfyldende tredje normalform. For en alternativ gennemgang af tidy data begrebet henvises til den kommende bog Data Science with R af Garrett Grolemund. På bogen website finder man eksempler på processen med at skabe et tidy datasæt.

dplyr grammatik og magrittr

Hvis du kender Unix pipes og/eller funktionssammensætning (.) fra Haskell og forward operatoren |> i F# er kombinationen af udvidelsespakkerne [magrittr og dplyr det helt rigtige valg for dig til data manipulation. Grammatikken for dplyr er bygget op omkring verber, hvoraf nogle af de meste brugte er i nedenstående tabel

Verbum Handling
select udvælg kolonner
filter udvælg rækker
mutate tilføj nye kolonner eller overskriv eksisterende
arrange sortering af data
summarise aggregeringer som fx gennemsnit eller sum
group_by gruppering af data

i sammensætning er tilstrækkelige til at foretage så godt som alle data manipulationer. I sammensætning skal her opfattes i stil med Unix pipe operator. Med det klassiske iris datasæt kan man fx på en linie

library(dplyr)
iris %>% 
  filter(Sepal.Length > 5.0) %>% 
  group_by(Species) %>% 
  summarise(mean = mean(Sepal.Length)) %>% 
  arrange(desc(mean))

udregne gennemsnittet af Sepal.Length for de rækker hvor Sepal.Length er større end 5.0 opdelt på art og sorteret efter faldende gennemsnittet.

En anden styrke ved dplyr er mulighed for at hente data direkte fra en database. Læs mere her.

Dato formater

Det kan være svært at parse datoer, når man indlæser dato. Et givent datoformat afhænger af mange faktorere som fx geografi, kultur og anvendelse. Hvis man ikke har en Unix baggrund kan R’s dato type godt synes lidt underligt. R’s dato type kommer fra Unix Posix time som angiver tidspunkter (og dermed datoer) i antallet af sekunder efter kl. 00:00:00 den 1. januar 1970. Heldigvis er håndtering af datotyper rimelig nemt at gå til med udvidelsepakken lubridate.

Diverse

For nybegyndere i R programmeringsproget vil jeg anbefale bogen R Cookbook[3]. Den gennemgår en række eksempler på hvordan man udfører forskellige opgaver med R. Der er fx også et afsnit om data manipulation.

Referencer

[1] Tidy data, Hadley Wickham, Journal of Statistical Software, Vol 59, 2014

[2] Data Science at the Command Line, Jeroen Janssens, O’Reilly Media, 2014

[3] R Cookbook, Paul Teetor, O’Reilly Media, 2011


Please send messages and comments to my twitter account Twitter.

Edit page on GitHub. Please help me to improve the blog by fixing mistakes on GitHub. This link will take you directly to this page in our GitHub repository.

There are more posts on the front page.

Creative Commons License
Content of this blog by Carsten Jørgensen is licensed under a Creative Commons Attribution 4.0 International License.