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 dtypePython typNumPy typBeskrivning
objectstrstring_, unicode_Text (strängar)
int64intint_, int8, int16, int32, int64, uint8, uint16, uint32, uint64Heltal (integer numbers)
float64floatfloat_, float16, float32, float64Decimaltal (floating point numbers)
boolboolbool_True/False
datetime64NAdatetime64[ns]Datum och tid
timedelta[ns]NANAdifferensen mellan två tidpunkter (datum)
categoryNANAText (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).

Python Variable Explorer
Python Variable Explorer

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.

Data Frame i Python
Data Frame i Python

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ör 50% och 75%. Erinra 50% är matematiskt ekvivalent med medianen.
  • 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 countuniquetop, och freqtop ä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

Korrelationer (korrelationsmatris) i Python
Korrelationer (korrelationsmatris) i Python

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

Histogram i Python
Histogram i Python

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

0/5 (0 Reviews)