
I detta kapitel kommer vi börja med att läsa in data till Python och därefter inspektera data. Detta är det första steget i all dataanalys och det är viktigt att behärska de här stegen.
1. Specificera en working directory (arbetsplats)
Vi börjar, som alltid, projektet med att skapa en ny mapp där alla filer kommer sparas. Denna mappen kallas working directory och jag kommer skapa den på mitt skrivbord för enkelhetens skull. Mappen kommer döpas till “Mitt projekt”. Därefter startar vi Spyder via Anaconda. På de första raderna skriver vi:
# Importera "os" som möjliggör kommunikation med operativsystemet import os # Vilket är vårt nuvarande "working directory?" (mappen vi arbetar i) os.getcwd() # Ändra working directory till den mappen vi vill ha os.chdir("/Users/Thomas/Desktop/Mitt projekt") # Få hjälp med funktionen chdir help(os.chdir) # Kontrollera att working directory nu är korrekt os.getcwd() # Visa alla filer i min working directory os.listdir('.')
2. Läs in data till Python
Data kan läsas in från datorn eller direkt från Internet. För tydlighetens skull kommer vi använda data som kan laddas ner direkt från Vanderbuilt Universitys webbplats. Koden är som följer:
# aktivera pandas import pandas as pd # importera data från en Internetadress och spara data i objektet "df" df = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/rhc.csv")
Vi kommer hädanefter arbeta med df
som lästs in från ovanstående address. Om vi istället hade önskat läsa in data från en .CSV eller .XLSX (Excel) fil från hårddisken så kunde följande kommandon använts:
# Läs in CSV-fil min_csv = pd.read_csv("/Users/Thomas/Mitt projekt/bra_data.csv") # Eftersom bra_data.csv finns i samma mapp som är vårt working directory, så kunde vi skrivit: min_csv = pd.read_csv("bra_data.csv") # Läs in Excel-fil (Excelfiler kan ha flera blad) # Läser in "bra_data.xlsx" från mappen "Mitt projekt" min_excelfil = pd.ExcelFile("/Users/Thomas/Mitt projekt/bra_data.xlsx") # Undersöker vilka blad som finns i Excelfilen print(prover.sheet_names) # Väljer första bladet ("Blad1") och sparar som "min_excel" min_excel = min_excelfil.parse('Blad1')
Använd alltid CSV (Comma Separated Values)
Du bör alltid föredra att arbeta med CSV-filer eftersom dessa ger minimalt med problem. CSV-filer kan användas på alla datorer och läsas in (och skrivas) av i princip all mjukvara för dataanalys. Andra filformat, såsom SAS-filer, Excel-filer etc, kan inte användas av all mjukvara och skall därför undvikas så långt det är möjligt. Om du arbetar med Excel så kan du exportera XLSX eller XLS till CSV genom att välja: Spara som → Kommaavgränsad fil. Samma princip gäller i SPSS och annan mjukvara.
Datatyper i pandas
Eftersom pandas är det mest använda biblioteket för att bearbeta data i Python så är det viktigt att förstå vilka datatyper som kan lagras i Pandas datastrukturer. Följande tabell listar de datatyper som pandas nyttjar, samt relationen till Pythons standardbibliotek liksom NumPy.
Pandas dtype | Python typ | NumPy typ | Beskrivning |
---|---|---|---|
object | str | string_, unicode_ | Text (strängar) |
int64 | int | int_, int8, int16, int32, int64, uint8, uint16, uint32, uint64 | Heltal (integer numbers) |
float64 | float | float_, float16, float32, float64 | Decimaltal (floating point numbers) |
bool | bool | bool_ | True/False |
datetime64 | NA | datetime64[ns] | Datum och tid |
timedelta[ns] | NA | NA | differensen mellan två tidpunkter (datum) |
category | NA | NA | Text (strängar) med få kategorier, så till vida att de kan tolkas som en kategorisk variabel. |
Det är viktigt att ha koll på vilken datatyp variablerna har eftersom man annars kan stöta på oväntade felmeddelanden eller ologiska resultat. När man läser in data via pandas funktioner (exempelvis read_csv
) så kommer pandas automatiskt tillskriva varje variabel en datatyp, vilket vi kommer se nedan.
3. Inspektera och beskriv data
En första inspektion kan göras direkt genom att klicka på objektet df
i fönstret Variable Explorer
, högst upp till höger i Spyder. I Variable Explorer framgår alla objekt som finns i din Python-miljö. Av bilden nedan framgår att det i nuläget finns ett objekt och det har namnet df; objektet är av typen Data Frame; storleken är 5735 (antal rader) × 63 (antal kolumner).

Man kan också inspektera antalet rader och kolumner med hjälp av funktioner i Python. Dessa funktioner är som följer (vi använder fortfarande data frame som namngivits df
):
# Antal rader och kolumner df.shape # antal rader och kolumner (data frame dimensions) df.shape[0] # antal rader df.shape[1] # antal kolumner len(df) # antal rader
Genom att klicka två gånger på objektet i Variable Explorer så öppnas hela tabellen så att den kan inspekteras direkt, likt en tabell i Excel.

Utifrån ovanstående får man dock ingen detaljerad information om variablerna i df. För det krävs att vi använder specifika funktioner i Python. Med funktionen dtypes
kan vi lista alla variabler och deras datatyp. Som framgår här nedan är variabeln Unnamed: 0 och sadmdte ett heltal (int64), medan cat1, cat2 och ca är av typen object. Som framgår i ovanstående bild består variablerna cat1, cat2 och ca av textsträngar (string). Man kan också använde funktionen info()
för att åskådliggöra detta.
# Visa datatyper för alla variabler med funktionen dtypes df.dtypes # Resultat # Unnamed: 0 int64 # cat1 object # cat2 object # ca object # sadmdte int64 ... # Man kan också använda info() df.info() # Resultat: # <class 'pandas.core.frame.DataFrame'> # RangeIndex: 5735 entries, 0 to 5734 # Data columns (total 63 columns): # Unnamed: 0 5735 non-null int64 # cat1 5735 non-null object # cat2 1200 non-null object # ca 5735 non-null object # sadmdte 5735 non-null int64 ...
Att beskriva data frame (descriptives)
All bearbetning och analys av data börjar med att man inspekterar data. Att hoppa över detta steget är alltid ödesdigert och leder enbart till tidsförlust. Syftet är att undersöka följande saker:
- Hur mycket data har jag? Hur många rader (observationer) och kolumner (variabler)?
- Hur ser variablernas fördelningar ut? Följande parametrar är av särskilt intresse
- Minsta värde (minimum)
- Högsta värde (maximum)
- Range (avståndet mellan minsta och högsta värde)
- Medelvärde och standarddeviation på normalfördelade variabler
- Median och interkvartilavstånd på icke-normalfördelade variabler
- Mode (det vanligaste värdet)
- Hur mycket missing är det i respektive kolumn (variabel)?
- Finns det något mönster i missing? Är det exempelvis så att det är samma individer som har missing på samtliga variabler?
- Finns det korrelationer mellan variablerna och hur uttalade är korrelationerna?
För att åskådliggöra ovanstående finns hundratals funktioner i Python men man behöver endast bekanta sig med ett fåtal. Vi börjar med funktionen describe()
som beskriver varje kolumn med nedanstående parametrar:
df.describe() # Resultat: # Unnamed: 0 sadmdte ... urin1 ptid # count 5735.000000 5735.000000 ... 2707.000000 5735.000000 # mean 2868.000000 11638.686312 ... 2192.453665 5134.006452 # std 1655.696228 513.967751 ... 1525.140006 2972.206379 # min 1.000000 10754.000000 ... 0.000000 5.000000 # 25% 1434.500000 11163.500000 ... 1110.000000 2561.500000 # 50% 2868.000000 11759.000000 ... 1927.000000 5131.000000 # 75% 4301.500000 12097.000000 ... 2955.000000 7689.000000 # max 5735.000000 12441.000000 ... 9000.000000 10278.000000
I ovanstående output kunde endast de två första och de två sista variablerna presenteras pga fönstrets bredd. De parametrar som presenteras är som följer:
Count
är helt enkelt antalet giltiga värden (värden som inte saknas [missing]).Mean
är medelvärdet och beräknas givetvis endast på giltiga värden.std
är standarddeviationen.Min
är minsta talet (minimum)25%
är den 25:e percentilen. Motsvarande gäller för50%
och75%
. Erinra50%
är matematiskt ekvivalent medmedianen
.Max
är det största värdet.
Ovanstående output lämpar sig för numeriska variabler, vilka brukar beskrivas med dessa parametrar. Faktum är att funktionen describe()
har i ovanstående fall enbart tagit numeriska variabler i beaktande och detta är avsiktligt. Om en data frame innehåller blandade variabler (datatyper) så kommer describe()
som default endast presentera numeriska variabler.
Självfallet kan describe()
nyttjas på strängar och kategoriska variabler. Då presenteras istället parametrarna count
, unique
, top
, och freq
. top
är det vanligaste värdet (kallas även mode
inom statistiken). freq
är frekvensen för det vanligaste värdet. För att pandas skall presentera deskriptiva data endast för objekt så skriver man df.describe(include = ['O'])
och för att enbart beskriva kategoriska variabler så använder man kommandot df.describe(include = ['category'])
.
# Beskriv alla variabler (oavsett typ) df.describe(include = 'all') # Beskriv endast objects (två varianter) df.describe(include = 'O') df.describe(include=[np.object]) # Beskriv endast kategoriska variabler df.describe(include=['category']) # Beskriv endast numeriska variabler df.describe(include=[np.number])
Observera att man kan ersätta include
med exclude
för att istället utesluta en viss datatyp från sammanställningen.
Lista alla variabler (kolumner)
För att lista alla kolumner (variabler, prediktorer) så skriver man följande i Python:
df.columns # Resultat: # Index(['Unnamed: 0', 'cat1', 'cat2', 'ca', 'sadmdte', 'dschdte', 'dthdte', 'lstctdte', 'death', 'cardiohx', 'chfhx', 'dementhx', 'psychhx', 'chrpulhx', 'renalhx', 'liverhx', 'gibledhx', 'malighx', 'immunhx',
Visa första eller sista n raderna
Det är vanligt att man behöver få en snabb överblick över hur data ser ut. Då brukar man skriva ut ett par rader, oftast de första eller sista raderna. Detta görs med head()
ochtail()
i Python.
# Skriv ut de första 5 raderna # Om inget argument anges i head() så skrivs första 5 raderna ut df.head() # Skriv ut de första 20 raderna df.head(20) # Skriv ut de sista 5 raderna # Om inget argument anges i tail() så skrivs sista 5 raderna ut df.tail() # Skriv ut de sista 20 raderna df.tail(20)
Beskriv enskilda variabler
Ibland behöver man sammanställa deskriptiva data för en enskild variabel. Detta görs enkelt genom att lägga till variabelns namn i anropet till funktionen. I följand exempel vill vi undersöka variabeln sadmdte i vår data frame.
df.sadmdte.describe() # Resultat # count 5735.000000 # mean 11638.686312 # std 513.967751 # min 10754.000000 # 25% 11163.500000 # 50% 11759.000000 # 75% 12097.000000 # max 12441.000000 # Name: sadmdte, dtype: float64 # Observera att vi kunde även ha skrivit: df['sadmdte'].describe()
För enskilda variabler kan även specifika parametrar hämtas. Detta exemplifieras med variabeln sadmdte här nedan:
# Summan av alla sadmdte df['sadmdte'].sum() # Medelvärde på sadmdte df['sadmdte'].mean() # Kumulativ summa (från första till sista raden) df['sadmdte'].cumsum() # Beräkna antal giltiga värden (non-NA) df['sadmdte'].count() # Minimum df['sadmdte'].min() # Maximum df['sadmdte'].max() # Median df['sadmdte'].median() # Varians df['sadmdte'].var() # Standarddeviation (SD) df['sadmdte'].std()
Frekvenstabeller och korstabeller i Python
För att göra en korstabell används funktionen crosstab i pandas.
# korstabell med variablerna cat1 och cat2 i df. # Observera att vi importerat pandas som pd pd.crosstab(df.cat1, df.cat2) # Korstabell med procentsiffror pd.crosstab(df.cat1, df.cat2, normalize='index') # Frekvenstabell för variabeln 'ca' df.ca.value_counts()
Baseline table – En utförlig och njutbar beskrivning av variabler
Inom data science är det vanligt att man skapar en så kallad table one vilket är en deskriptiv rapport av de variabler som finns i data. Till Python finns ett färdigt bibliotek för att skapa just table one. Biblioteket heter tableone och installeras via Terminal (Mac OS) eller Command Prompt (Windows). Du kan använda både pip eller conda för att göra installationen, enligt följande:
# Installera med pip pip install tableone # Installera med conda conda install -c conda-forge tableone
Tabellen kan nu skapas i Python och exporteras till vår arbetsmapp, varifrån den sedan kan importeras till Word eller liknande program.
from tableone import TableOne # Välj de kolumner som vi vill medbringa i tabellen kolumner = ['cat1','cat2','ca','sadmdte','dschdte','dthdte', 'age', 'sex', 'edu'] # Specificerar vilka variabler som skall hanteras som kategoriska kategoriska = ['cat1','cat2','ca', 'sex', 'edu'] # Anger vilken variabel som används för att stratifiera (separata kolumner) gruppering = 'ca' # Skapar tabellen tabell = TableOne(df, kolumner, kategoriska, gruppering, pval=True) # Skriv till Excel-fil (som sedan kan importeras till Word eller liknande) tabell.to_excel('Tabell.xlsx')
Resultat

Skapa en korrelationsmatris (korrelationer)
korrelationer = df.corr() print(korrelationer) # Du kan också klicka på "korrelationer" i Variable Explorer för att se tabellen
Resultat

Histogram i Python
Du kan skapa histogram för enskilda variabler, utvalda variabler eller samtliga variabler, enligt fölande:
# Skapa histogram med matplotlibs bibliotek import matplotlib.pyplot as plt # Histgram för hela df df.hist() # Histogram för variabeln sadmdte df['sadmdte'].hist() # Alternativ kod för histogram för variabeln sadmdte df.hist(column='sadmdte')
Resultat

I kommande kapitel kommer vi fördjupa oss i hur deskriptiva data genereras med Python.