“Не может быть поражений — могут быть лишь временные трудности.”

Александр Васильевич Колчак

Hitro, hitreje… Časa nikoli dovolj. Tudi nepoznan podatkovni izvor lahko hitro pregledaš z nekaj orodji.

Primer nepoznanega podatkovnega seta

Iz http://insideairbnb.com/get-the-data.html sem snel podatke o nočitvah na Dunaju (The data behind the Inside Airbnb site is sourced from publicly available information from the Airbnb site.). Zanima me, kaj se v teh podatkih “skriva”. Podatke sem shranil lokalno v 2019-05-04_listings.csv.

Začetek

CSV zapis so z ločilom ločeni podatki. V slovenski lokalizaciji je ločilo običajno podpičje “;”, ker je tako osnovna nastavitev v Excelu, bolj običajno pa je ločilo vejica “,”, ker večina podatkov nastane izven Slovenije in excela.

Da se ne zaženem direktno z dvoklikom v Excel, kar sem se, in na srečo je podatkovni vir majhen, sem dobil sledeč rezulat :

CSV z vejico v slovenski lokalizaciji excela

CSV z vejico v slovenski lokalizaciji excela

Bolj pametno bi bilo, če najprej pogledam s pregledovalnikom velikih besedil, ki bere direktno z diska in ne bo zablokiral ob vsaki malo večji datoteki:

CSV ogled v OS:Windows10, VIM zagnan v GIT-bash

CSV ogled v OS:Windows10, VIM zagnan v GIT-bash

V obeh primerih se vidi, da ima vir glavo podatkov in da so podatki ločeni z vejico. Nekaj je številk in nekaj je teksta in nekatera besedila so ograjena z narekovaji.

Dobro je pogledati tudi zadnje vrstice. Linux tail ukaz ali v vim G-end. V MORE se poslužim trika, da preskočim (s) veliko vrsti (npr. 10000000) in potem prikaže samo nekaj zadnjih.

V tem primeru na koncu ni nobenih presenečenj. Datoteka na koncu izgleda kot na začetku.

Hiter pregled v R

Lahko bi napisal hiter pregled v RStudio in kasneje pri pythonu v Jupyter notes, pa pač nisem.

Za hiter pregled uporabim paket DataExplorer.

library(DataExplorer)

df <-  read.csv(file="./../../static/data/2019-05-04_listings.csv", 
                header=TRUE, sep=",")

DataExplorer::create_report(df)
#alternativa je lahko paket dlookr ali RtutoR ali autoEDA
#https://cran.r-project.org/web/packages/dlookr/vignettes/EDA.html

Rezultat te kode je izčrpno poročilo o viru GLEJ TUKAJ.

Pa nekaj o cenah nočitve na Dunaju:

#library(psych)
library(knitr)
library(dplyr)
#library(kableExtra)

df <-  read.csv(file="./../../static/data/2019-05-04_listings.csv", 
                header=TRUE, sep=",")
print(summary(df$price))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    9.00   38.00   56.00   77.85   85.00 9270.00
#https://stackoverflow.com/questions/9847054/how-to-get-summary-statistics-by-group
#tapply(df$price, df$neighbourhood, summary)
#kable(psych::describeBy(df$price, df$neighbourhood, mat=T))


kable(
  df %>% 
    group_by(neighbourhood) %>% 
    summarize(max=max(price),
              min=min(price),
              mean=mean(price), 
              median=median(price)) %>% 
    arrange(desc(median)) %>% 
    top_n(5),

format = "html", digits = 1, longtable = TRUE,
caption = "TOP 5 na Dunaju",
align=c('l', 'r', 'r', 'r', 'r'),
table.attr = "style='width:100%;'")
Table 1: TOP 5 na Dunaju
neighbourhood max min mean median
Innere Stadt 5500 19 156.2 110
Landstra§e 1000 12 81.2 60
Leopoldstadt 900 10 75.2 60
Mariahilf 750 13 71.2 60
Neubau 1000 11 70.5 60

Hiter pregled v Python

Zanimiva paketa sta optimus in pandas_profiling. Ker oba vrneta rezultate v html objektu, je bolje delati v Jupyter notebooks kot pa v Spyder. Za primer podatkov z AirBnB, hitro poročilo v optimus ni delovala, zato sem uporabil pandas_profiling.

#Testiranje pandas_profiling v Jupyter notebooks#  
#po potrebi instaliraj paket 
#!pip install pandas-profiling 
import pandas as pd 
import pandas_profiling as pp 
# Naložim podatke:
df = pd.read_csv(r".\data\2019-05-04_listings.csv") 
df.describe()
pp.ProfileReport(df)

Rezultat te kode je poročilo o viru GLEJ TUKAJ. Podrobnosti je na voljo več kot v DataExplorer.

Bližnjica do beležnice (Jupyter Notebook) je TUKAJ.

Sortiraš podobno kot v R:

import numpy as np 
df3 = df.groupby('neighbourhood')[['price']].aggregate([min, np.mean, np.median, max])
df3.sort_values(by=[('price', 'median')], ascending=False).head(n=5)