En vänlig introduktion till dataanalys i Python

Under åren har användningen av python för datavetenskap vuxit otroligt och fortsätter att växa dagligen.

Datavetenskap är ett stort studieområde med många delområden, av vilka dataanalys utan tvekan är ett av de viktigaste av alla dessa områden, och oavsett ens kompetensnivå inom datavetenskap har det blivit allt viktigare att förstå eller ha åtminstone grundläggande kunskaper om det.

Vad är dataanalys?

Dataanalys är rensning och omvandling av en stor mängd ostrukturerad eller oorganiserad data, med målet att generera viktiga insikter och information om denna data som skulle hjälpa till att fatta välgrundade beslut.

Det finns olika verktyg som används för dataanalys, Python, Microsoft Excel, Tableau, SaS, etc, men i den här artikeln skulle vi fokusera på hur dataanalys görs i python. Mer specifikt, hur det går till med ett pythonbibliotek som heter Pandas.

Vad är pandor?

Pandas är ett Python-bibliotek med öppen källkod som används för datamanipulation och gräl. Den är snabb och mycket effektiv och har verktyg för att ladda flera sorters data i minnet. Den kan användas för att omforma, märka skivor, indexera eller till och med gruppera flera former av data.

Datastrukturer i pandor

Det finns 3 datastrukturer i Pandas, nämligen;

Det bästa sättet att särskilja de tre är att se att den ena innehåller flera högar av den andra. Så en DataFrame är en stack av serier och en panel är en stack av DataFrames.

En serie är en endimensionell array

En stack av flera serier gör en 2-dimensionell DataFrame

En stapel med flera dataramar gör en 3-dimensionell panel

Den datastruktur vi skulle arbeta mest med är den 2-dimensionella DataFrame som också kan vara standardmetoden för representation för vissa datamängder som vi kan stöta på.

Dataanalys i pandor

För den här artikeln behövs ingen installation. Vi skulle använda ett verktyg som heter samarbete skapad av Google. Det är en online-pythonmiljö för dataanalys, maskininlärning och AI. Det är helt enkelt en molnbaserad Jupyter Notebook som kommer förinstallerad med nästan alla pythonpaket du skulle behöva som datavetare.

Gå nu vidare till https://colab.research.google.com/notebooks/intro.ipynb. Du bör se nedan.

I den övre vänstra navigeringen, klicka på filalternativet och klicka på alternativet ”ny anteckningsbok”. Du skulle se en ny Jupyter-anteckningsbok-sida laddad i din webbläsare. Det första vi behöver göra är att importera pandor till vår arbetsmiljö. Vi kan göra det genom att köra följande kod;

import pandas as pd

För den här artikeln skulle vi använda en bostadsprisdatauppsättning för vår dataanalys. Datauppsättningen vi skulle använda kan hittas här. Det första vi skulle vilja göra är att ladda denna datauppsättning i vår miljö.

Vi kan göra det med följande kod i en ny cell;

df =  pd.read_csv('https://firebasestorage.googleapis.com/v0/b/ai6-portfolio-abeokuta.appspot.com/o/kc_house_data.csv?alt=media &token=6a5ab32c-3cac-42b3-b534-4dbd0e4bdbc0 ', sep=',')

.read_csv används när vi vill läsa en CSV-fil och vi skickade en sep-egenskap för att visa att CSV-filen är kommaavgränsad.

Vi bör också notera att vår inlästa CSV-fil lagras i en variabel df .

Vi behöver inte använda funktionen print() i Jupyter Notebook. Vi kan helt enkelt bara skriva in ett variabelnamn i vår cell så skriver Jupyter Notebook ut det åt oss.

Vi kan prova det genom att skriva df i en ny cell och köra den, den kommer att skriva ut all data i vår datauppsättning som en DataFrame åt oss.

Men vi vill inte alltid se all data, ibland vill vi bara se de första data och deras kolumnnamn. Vi kan använda funktionen df.head() för att skriva ut de fem första kolumnerna och df.tail() för att skriva ut de fem sista. Utdata från någon av de två skulle se ut som sådan;

Vi skulle vilja kontrollera förhållanden mellan dessa flera rader och kolumner med data. Funktionen .describe() gör exakt detta för oss.

Att köra df.describe() ger följande utdata;

Vi kan omedelbart se att .describe() ger medelvärdet, standardavvikelsen, lägsta och maximala värden och percentiler för varje kolumn i DataFrame. Detta är särskilt användbart.

Vi kan också kontrollera formen på vår 2D DataFrame för att ta reda på hur många rader och kolumner den har. Vi kan göra det med hjälp av df.shape som returnerar en tupel i formatet (rader, kolumner).

Vi kan också kontrollera namnen på alla kolumner i vår DataFrame med hjälp av df.columns.

Vad händer om vi bara vill välja en kolumn och returnera all data i den? Detta görs på ett sätt som liknar att skära igenom en ordbok. Skriv in följande kod i en ny cell och kör den

df['price ']

Ovanstående kod returnerar priskolumnen, vi kan gå längre genom att spara den i en ny variabel som sådan

price = df['price']

Nu kan vi utföra alla andra åtgärder som kan utföras på en DataFrame på vår prisvariabel eftersom det bara är en delmängd av en faktisk DataFrame. Vi kan göra saker som df.head(), df.shape etc..

Vi kan också välja flera kolumner genom att skicka en lista med kolumnnamn till df som sådan

data = df[['price ', 'bedrooms']]

Ovanstående väljer kolumner med namn ”price” och ”bedrooms”, om vi skriver in data.head() i en ny cell, skulle vi ha följande

Ovanstående sätt att dela upp kolumner returnerar alla radelement i den kolumnen, vad händer om vi vill returnera en delmängd av rader och en delmängd av kolumner från vår datauppsättning? Detta kan göras med .iloc och indexeras på ett sätt som liknar python-listor. Så vi kan göra något liknande

df.iloc[50: , 3]

Vilket returnerar den 3:e kolumnen från den 50:e raden till slutet. Det är ganska snyggt och precis som att skiva listor i python.

Låt oss nu göra några riktigt intressanta saker, vår datauppsättning av bostadspriser har en kolumn som talar om för oss priset på ett hus och en annan kolumn berättar hur många sovrum som just huset har. Bostadspriset är ett kontinuerligt värde, så det är möjligt att vi inte har två hus som har samma pris. Men antalet sovrum är något diskret så vi kan ha flera hus med två, tre, fyra sovrum osv.

Tänk om vi vill få alla hus med samma antal sovrum och hitta medelpriset för varje diskret sovrum? Det är relativt enkelt att göra det i pandor, det kan göras som sådant;

df.groupby('bedrooms ')['price '].mean()

Ovanstående grupperar först DataFrame efter datamängder med identiskt sovrumsnummer med df.groupby()-funktionen, sedan säger vi till den att bara ge oss sovrumskolumnen och använder .mean()-funktionen för att hitta medelvärdet för varje hus i datamängden .

Vad händer om vi vill visualisera ovanstående? Vi skulle vilja kunna kontrollera hur medelpriset för varje enskilt sovrumsnummer varierar? Vi behöver bara kedja den tidigare koden till en .plot() funktion som sådan;

df.groupby('bedrooms ')['price '].mean().plot()

Vi kommer att ha en utgång som ser ut som sådan;

Ovanstående visar oss några trender i data. På den horisontella axeln har vi ett distinkt antal sovrum (Observera att mer än ett hus kan ha X antal sovrum), På den vertikala axeln har vi medelvärdet av priserna vad gäller motsvarande antal sovrum på den horisontella axeln axel. Vi kan nu direkt märka att hus som har mellan 5 till 10 sovrum kostar mycket mer än hus med 3 sovrum. Det kommer också att bli uppenbart att hus som har cirka 7 eller 8 sovrum kostar mycket mer än hus med 15, 20 eller till och med 30 rum.

Information som ovan är varför dataanalys är mycket viktigt, vi kan extrahera användbar insikt från data som inte är omedelbart eller helt omöjlig att lägga märke till utan analys.

Saknar data

Låt oss anta att jag gör en undersökning som består av en serie frågor. Jag delar en länk till undersökningen med tusentals människor så att de kan ge sin feedback. Mitt slutmål är att köra dataanalys på dessa data så att jag kan få några viktiga insikter från datan.

Nu kan mycket gå fel, vissa besiktningsmän kan känna sig obekväma med att svara på några av mina frågor och lämna det tomt. Många människor skulle kunna göra detsamma för flera delar av mina enkätfrågor. Detta kanske inte anses vara ett problem men tänk om jag skulle samla in numerisk data i min undersökning och en del av analysen krävde att jag fick antingen summan, medelvärdet eller någon annan aritmetisk operation. Flera saknade värden skulle leda till många felaktigheter i min analys, jag måste hitta ett sätt att hitta och ersätta dessa saknade värden med några värden som kan vara en nära ersättning för dem.

Pandas ger oss en funktion för att hitta saknade värden i en DataFrame som heter isnull().

Funktionen isnull() kan användas som sådan;

df.isnull()

Detta returnerar en DataFrame med booleaner som talar om för oss om den data som ursprungligen fanns där saknades verkligen eller felaktigt. Utgången skulle se ut som sådan;

Vi behöver ett sätt att kunna ersätta alla dessa saknade värden, oftast kan valet av saknade värden tas som noll. Ibland kan det tas som medelvärdet av all annan data eller kanske medelvärdet av data runt den, beroende på dataforskaren och användningsfallet för de data som analyseras.

För att fylla alla saknade värden i en DataFrame använder vi funktionen .fillna() som används som sådan;

df.fillna(0)

I ovanstående fyller vi alla tomma data med värdet noll. Det kan lika gärna vara vilket annat nummer som helst som vi anger att det ska vara.

Vikten av data kan inte överbetonas, det hjälper oss att få svar direkt från själva vår data!. Dataanalys säger de är den nya Oil for Digital Economies.

Alla exempel i den här artikeln kan hittas här.

För att lära dig mer ingående, kolla in Dataanalys med Python och Pandas onlinekurs.