Moja vysnívaná kariéra: Dátový vedec

Autor

Martin Bakič

Publikované

19. októbra 2026

Kód
knitr::opts_chunk$set(
  echo = TRUE,
  message = FALSE,
  warning = FALSE
)

Úvod

V tomto dokumente sa venujem práci s databázami v programovacom jazyku R.

Pokračujem vo svojej téme Moja vysnívaná kariéra: Dátový vedec. Práca dátového vedca je založená na získavaní, spracovaní, analyzovaní a interpretovaní údajov.

Na vlastných príkladoch demonštrujem vytváranie databáz, výber údajov, filtrovanie, triedenie, sumarizáciu, vizualizáciu a základnú štatistickú analýzu.

V hlavnej časti dokumentu budem pracovať so skutočnou databázou Latest Data Science Salaries, ktorá obsahuje údaje o pracovných pozíciách a platoch v oblasti Data Science.

1. Práca s údajmi

Tradičná práca s databázou

Pri práci s databázami sa v R často používa dátový typ data.frame.

Dátový rámec predstavuje tabuľku, v ktorej jednotlivé stĺpce predstavujú premenné a riadky jednotlivé pozorovania.

Vytvorenie vlastnej databázy

Najskôr vytvorím jednoduchú ilustračnú databázu troch pracovných pozícií z oblasti Data Science.

Kód
Pozicia <- c(
  "Data Scientist",
  "Data Analyst",
  "Data Engineer"
)

PlatUSD <- c(
  120000,
  85000,
  110000
)

Rok <- c(
  2021,
  2022,
  2023
)

udaje <- data.frame(
  Pozicia,
  PlatUSD,
  Rok
)

print(udaje)
         Pozicia PlatUSD  Rok
1 Data Scientist  120000 2021
2   Data Analyst   85000 2022
3  Data Engineer  110000 2023

Údaje v tejto malej databáze sú iba ilustračné.

Základné operácie s databázou

Vypíšem hodnoty platu.

Kód
print(
  udaje$PlatUSD
)
[1] 120000  85000 110000

Vypočítam priemerný plat.

Kód
mean(
  udaje$PlatUSD
)
[1] 105000

Vyberiem pracovnú pozíciu Data Scientist.

Kód
udaje[
  udaje$Pozicia == "Data Scientist",
]
         Pozicia PlatUSD  Rok
1 Data Scientist  120000 2021

Vyberiem tretí riadok.

Kód
udaje[3, ]
        Pozicia PlatUSD  Rok
3 Data Engineer  110000 2023

Vyberiem druhý a tretí stĺpec.

Kód
udaje[, 2:3]
  PlatUSD  Rok
1  120000 2021
2   85000 2022
3  110000 2023

Vyberiem jednu konkrétnu bunku.

Kód
udaje[1, 2]
[1] 120000

Zobrazím základné štatistiky.

Kód
summary(
  udaje
)
      Pozicia      PlatUSD            Rok      
 Length   : 3   Min.   : 85000   Min.   :2021  
 N.unique : 3   1st Qu.: 97500   1st Qu.:2022  
 N.blank  : 0   Median :110000   Median :2022  
 Min.nchar:12   Mean   :105000   Mean   :2022  
 Max.nchar:14   3rd Qu.:115000   3rd Qu.:2022  
                Max.   :120000   Max.   :2023  

Pridanie nového stĺpca

Do databázy pridám informáciu, či plat presahuje 100 000 USD.

Kód
udaje$VysokyPlat <-
  udaje$PlatUSD > 100000

udaje
         Pozicia PlatUSD  Rok VysokyPlat
1 Data Scientist  120000 2021       TRUE
2   Data Analyst   85000 2022      FALSE
3  Data Engineer  110000 2023       TRUE

Pridanie nového riadku

Pridám ďalšiu pracovnú pozíciu.

Kód
novy_riadok <- data.frame(
  Pozicia = "Machine Learning Engineer",
  PlatUSD = 125000,
  Rok = 2023,
  VysokyPlat = TRUE
)

udaje <- rbind(
  udaje,
  novy_riadok
)

udaje
                    Pozicia PlatUSD  Rok VysokyPlat
1            Data Scientist  120000 2021       TRUE
2              Data Analyst   85000 2022      FALSE
3             Data Engineer  110000 2023       TRUE
4 Machine Learning Engineer  125000 2023       TRUE

Vytvorenie tabuľky

Na prehľadné zobrazenie použijem funkciu knitr::kable().

Kód
knitr::kable(
  udaje,
  digits = 2,
  caption = "Ilustračné pracovné pozície v Data Science"
)
Ilustračné pracovné pozície v Data Science
Pozicia PlatUSD Rok VysokyPlat
Data Scientist 120000 2021 TRUE
Data Analyst 85000 2022 FALSE
Data Engineer 110000 2023 TRUE
Machine Learning Engineer 125000 2023 TRUE

2. Manipulácia s údajmi

Výber a triedenie

Vyberiem pracovné pozície s platom vyšším ako 100 000 USD.

Kód
vybrane <- subset(
  udaje,
  PlatUSD > 100000
)

vybrane
                    Pozicia PlatUSD  Rok VysokyPlat
1            Data Scientist  120000 2021       TRUE
3             Data Engineer  110000 2023       TRUE
4 Machine Learning Engineer  125000 2023       TRUE

Následne ich zoradím od najvyššieho platu.

Kód
zoradene <- vybrane[
  order(
    vybrane$PlatUSD,
    decreasing = TRUE
  ),
]

zoradene
                    Pozicia PlatUSD  Rok VysokyPlat
4 Machine Learning Engineer  125000 2023       TRUE
1            Data Scientist  120000 2021       TRUE
3             Data Engineer  110000 2023       TRUE

Výber stĺpcov

Vyberiem iba pracovnú pozíciu a plat.

Kód
udaje[, c(
  "Pozicia",
  "PlatUSD"
)]
                    Pozicia PlatUSD
1            Data Scientist  120000
2              Data Analyst   85000
3             Data Engineer  110000
4 Machine Learning Engineer  125000

Zoskupenie a sumarizácia

Vypočítam priemerný plat podľa toho, či pozícia patrí do skupiny s vysokým platom.

Kód
priemery <- aggregate(
  PlatUSD ~ VysokyPlat,
  data = udaje,
  FUN = mean
)

priemery
  VysokyPlat  PlatUSD
1      FALSE  85000.0
2       TRUE 118333.3

Počet pracovných pozícií v jednotlivých skupinách:

Kód
table(
  udaje$VysokyPlat
)

FALSE  TRUE 
    1     3 

Vytvorenie novej premennej

Pracovné pozície rozdelím podľa výšky platu.

Kód
udaje$PlatovaKategoria <- ifelse(
  udaje$PlatUSD >= 120000,
  "Veľmi vysoký",
  ifelse(
    udaje$PlatUSD >= 100000,
    "Vysoký",
    ifelse(
      udaje$PlatUSD >= 80000,
      "Stredný",
      "Nižší"
    )
  )
)

udaje
                    Pozicia PlatUSD  Rok VysokyPlat PlatovaKategoria
1            Data Scientist  120000 2021       TRUE     Veľmi vysoký
2              Data Analyst   85000 2022      FALSE          Stredný
3             Data Engineer  110000 2023       TRUE           Vysoký
4 Machine Learning Engineer  125000 2023       TRUE     Veľmi vysoký

Rozdiel platu od priemeru

Kód
udaje$RozdielOdPriemeru <- round(
  udaje$PlatUSD -
    mean(udaje$PlatUSD),
  2
)

udaje
                    Pozicia PlatUSD  Rok VysokyPlat PlatovaKategoria
1            Data Scientist  120000 2021       TRUE     Veľmi vysoký
2              Data Analyst   85000 2022      FALSE          Stredný
3             Data Engineer  110000 2023       TRUE           Vysoký
4 Machine Learning Engineer  125000 2023       TRUE     Veľmi vysoký
  RozdielOdPriemeru
1             10000
2            -25000
3                 0
4             15000

3. Ilustračné údaje zoradené v čase

Keďže pri dátovej analýze je dôležité pracovať aj s údajmi zoradenými v čase, vytvorím jednoduchú databázu vývoja platov.

Kód
platy <- data.frame(
  Rok = 2015:2024,

  Entry = c(
    58000, 60000, 62000, 65000, 68000,
    72000, 76000, 79000, 82000, 85000
  ),

  Mid = c(
    78000, 82000, 85000, 88000, 92000,
    98000, 103000, 108000, 115000, 120000
  ),

  Senior = c(
    105000, 110000, 116000, 121000, 126000,
    132000, 140000, 148000, 156000, 165000
  )
)

platy
    Rok Entry    Mid Senior
1  2015 58000  78000 105000
2  2016 60000  82000 110000
3  2017 62000  85000 116000
4  2018 65000  88000 121000
5  2019 68000  92000 126000
6  2020 72000  98000 132000
7  2021 76000 103000 140000
8  2022 79000 108000 148000
9  2023 82000 115000 156000
10 2024 85000 120000 165000

Tieto údaje sú ilustračné a slúžia iba na precvičenie práce s časovou premennou.

Priemerný plat

Kód
platy$PriemernyPlat <- round(
  (
    platy$Entry +
    platy$Mid +
    platy$Senior
  ) / 3,
  2
)

platy
    Rok Entry    Mid Senior PriemernyPlat
1  2015 58000  78000 105000      80333.33
2  2016 60000  82000 110000      84000.00
3  2017 62000  85000 116000      87666.67
4  2018 65000  88000 121000      91333.33
5  2019 68000  92000 126000      95333.33
6  2020 72000  98000 132000     100666.67
7  2021 76000 103000 140000     106333.33
8  2022 79000 108000 148000     111666.67
9  2023 82000 115000 156000     117666.67
10 2024 85000 120000 165000     123333.33

Rozdiel medzi Senior a Entry platom

Kód
platy$RozdielSeniorEntry <-
  platy$Senior -
  platy$Entry

platy
    Rok Entry    Mid Senior PriemernyPlat RozdielSeniorEntry
1  2015 58000  78000 105000      80333.33              47000
2  2016 60000  82000 110000      84000.00              50000
3  2017 62000  85000 116000      87666.67              54000
4  2018 65000  88000 121000      91333.33              56000
5  2019 68000  92000 126000      95333.33              58000
6  2020 72000  98000 132000     100666.67              60000
7  2021 76000 103000 140000     106333.33              64000
8  2022 79000 108000 148000     111666.67              69000
9  2023 82000 115000 156000     117666.67              74000
10 2024 85000 120000 165000     123333.33              80000

Výber rokov

Vyberiem roky, v ktorých priemerný plat presiahol 100 000 USD.

Kód
subset(
  platy,
  PriemernyPlat > 100000
)
    Rok Entry    Mid Senior PriemernyPlat RozdielSeniorEntry
6  2020 72000  98000 132000      100666.7              60000
7  2021 76000 103000 140000      106333.3              64000
8  2022 79000 108000 148000      111666.7              69000
9  2023 82000 115000 156000      117666.7              74000
10 2024 85000 120000 165000      123333.3              80000

Triedenie podľa priemerného platu

Kód
platy[
  order(
    platy$PriemernyPlat,
    decreasing = TRUE
  ),
]
    Rok Entry    Mid Senior PriemernyPlat RozdielSeniorEntry
10 2024 85000 120000 165000     123333.33              80000
9  2023 82000 115000 156000     117666.67              74000
8  2022 79000 108000 148000     111666.67              69000
7  2021 76000 103000 140000     106333.33              64000
6  2020 72000  98000 132000     100666.67              60000
5  2019 68000  92000 126000      95333.33              58000
4  2018 65000  88000 121000      91333.33              56000
3  2017 62000  85000 116000      87666.67              54000
2  2016 60000  82000 110000      84000.00              50000
1  2015 58000  78000 105000      80333.33              47000

Priemerné platy jednotlivých skupín

Kód
mean(platy$Entry)
[1] 70700
Kód
mean(platy$Mid)
[1] 96900
Kód
mean(platy$Senior)
[1] 131900

Štandardná odchýlka

Kód
sd(platy$Entry)
[1] 9557.429
Kód
sd(platy$Mid)
[1] 14325.19
Kód
sd(platy$Senior)
[1] 20030.25

4. Import údajov z otvorených databáz

Pri dátovej analýze je dôležité pracovať s dostupnými a dôveryhodnými zdrojmi údajov.

Medzi možné zdroje patria napríklad:

Zabudované databázy R

R obsahuje aj vlastné databázy.

Kód
ds <- as.data.frame(
  utils::data(
    package = "datasets"
  )$results
)[, c(
  "Item",
  "Title"
)]

knitr::kable(
  head(ds, 15),
  col.names = c(
    "Databáza",
    "Popis"
  )
)
Databáza Popis
AirPassengers Monthly Airline Passenger Numbers 1949-1960
BJsales Sales Data with Leading Indicator
BJsales.lead (BJsales) Sales Data with Leading Indicator
BOD Biochemical Oxygen Demand
CO2 Carbon Dioxide Uptake in Grass Plants
ChickWeight Weight Versus Age of Chicks on Different Diets
DNase Elisa assay of DNase
EuStockMarkets Daily Closing Prices of Major European Stock Indices, 1991-1998
Formaldehyde Determination of Formaldehyde
HairEyeColor Hair and Eye Color of Statistics Students
Harman23.cor Harman Example 2.3
Harman74.cor Harman Example 7.4
Indometh Pharmacokinetics of Indomethacin
InsectSprays Effectiveness of Insect Sprays
JohnsonJohnson Quarterly Earnings per Johnson & Johnson Share

Databáza iris

Ako príklad použijem zabudovanú databázu iris.

Kód
data("iris")

head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

Rozmery databázy:

Kód
dim(iris)
[1] 150   5

Základné štatistiky:

Kód
summary(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
       Species  
 setosa    :50  
 versicolor:50  
 virginica :50  
                
                
                

5. Import mojej databázy Data Science Salaries

Pre ďalšiu analýzu používam databázu Latest Data Science Salaries.

Databáza obsahuje údaje o pracovnom trhu v oblasti Data Science, napríklad:

  • názov pracovnej pozície,
  • typ pracovného pomeru,
  • úroveň skúseností,
  • úroveň odbornosti,
  • plat,
  • menu platu,
  • plat prepočítaný na USD,
  • lokalitu spoločnosti,
  • miesto bydliska zamestnanca,
  • veľkosť spoločnosti,
  • rok.

Súbor mám uložený v priečinku údaje.

Kontrola existencie súboru

Kód
subor <- "údaje/Latest_Data_Science_Salaries.csv"

file.exists(
  subor
)
[1] TRUE

Ak je výsledkom TRUE, súbor bol úspešne nájdený.

Načítanie databázy

Kód
data_science <- read.csv(
  "údaje/Latest_Data_Science_Salaries.csv",
  header = TRUE,
  sep = ",",
  dec = ".",
  stringsAsFactors = FALSE,
  check.names = TRUE
)

head(
  data_science
)
       Job.Title Employment.Type Experience.Level Expertise.Level Salary
1  Data Engineer       Full-Time           Senior          Expert 210000
2  Data Engineer       Full-Time           Senior          Expert 165000
3  Data Engineer       Full-Time           Senior          Expert 185900
4  Data Engineer       Full-Time           Senior          Expert 129300
5 Data Scientist       Full-Time           Senior          Expert 140000
6 Data Scientist       Full-Time           Senior          Expert 126000
       Salary.Currency Company.Location Salary.in.USD Employee.Residence
1 United States Dollar    United States        210000      United States
2 United States Dollar    United States        165000      United States
3 United States Dollar    United States        185900      United States
4 United States Dollar    United States        129300      United States
5 United States Dollar    United States        140000      United States
6 United States Dollar    United States        126000      United States
  Company.Size Year
1       Medium 2023
2       Medium 2023
3       Medium 2023
4       Medium 2023
5       Medium 2023
6       Medium 2023

Kontrola databázy

Názvy premenných:

Kód
colnames(
  data_science
)
 [1] "Job.Title"          "Employment.Type"    "Experience.Level"  
 [4] "Expertise.Level"    "Salary"             "Salary.Currency"   
 [7] "Company.Location"   "Salary.in.USD"      "Employee.Residence"
[10] "Company.Size"       "Year"              

Rozmery databázy:

Kód
dim(
  data_science
)
[1] 3300   11

Databáza obsahuje 3300 pozorovaní a 11 premenných.

Štruktúra databázy:

Kód
str(
  data_science
)
'data.frame':   3300 obs. of  11 variables:
 $ Job.Title         : chr  "Data Engineer" "Data Engineer" "Data Engineer" "Data Engineer" ...
 $ Employment.Type   : chr  "Full-Time" "Full-Time" "Full-Time" "Full-Time" ...
 $ Experience.Level  : chr  "Senior" "Senior" "Senior" "Senior" ...
 $ Expertise.Level   : chr  "Expert" "Expert" "Expert" "Expert" ...
 $ Salary            : int  210000 165000 185900 129300 140000 126000 170000 130000 85000 75000 ...
 $ Salary.Currency   : chr  "United States Dollar" "United States Dollar" "United States Dollar" "United States Dollar" ...
 $ Company.Location  : chr  "United States" "United States" "United States" "United States" ...
 $ Salary.in.USD     : int  210000 165000 185900 129300 140000 126000 170000 130000 104584 92280 ...
 $ Employee.Residence: chr  "United States" "United States" "United States" "United States" ...
 $ Company.Size      : chr  "Medium" "Medium" "Medium" "Medium" ...
 $ Year              : int  2023 2023 2023 2023 2023 2023 2023 2023 2023 2023 ...

Základný prehľad:

Kód
summary(
  data_science
)
     Job.Title     Employment.Type  Experience.Level  Expertise.Level
 Length   :3300   Length   :3300   Length   :3300    Length   :3300  
 N.unique : 111   N.unique :   4   N.unique :   4    N.unique :   4  
 N.blank  :   0   N.blank  :   0   N.blank  :   0    N.blank  :   0  
 Min.nchar:   9   Min.nchar:   8   Min.nchar:   3    Min.nchar:   6  
 Max.nchar:  40   Max.nchar:   9   Max.nchar:   9    Max.nchar:  12  
                                                                     
     Salary          Salary.Currency  Company.Location Salary.in.USD   
 Min.   :   14000   Length   :3300   Length   :3300    Min.   : 15000  
 1st Qu.:   94169   N.unique :  22   N.unique :  71    1st Qu.: 90000  
 Median :  140000   N.blank  :   0   N.blank  :   0    Median :136000  
 Mean   :  204662   Min.nchar:   4   Min.nchar:   4    Mean   :142096  
 3rd Qu.:  190000   Max.nchar:  22   Max.nchar:  25    3rd Qu.:185000  
 Max.   :30400000                                      Max.   :450000  
 Employee.Residence    Company.Size       Year     
 Length   :3300     Length   :3300   Min.   :2020  
 N.unique :  83     N.unique :   3   1st Qu.:2022  
 N.blank  :   0     N.blank  :   0   Median :2023  
 Min.nchar:   4     Min.nchar:   5   Mean   :2022  
 Max.nchar:  31     Max.nchar:   6   3rd Qu.:2023  
                                     Max.   :2023  

Kontrola chýbajúcich hodnôt

Kód
colSums(
  is.na(
    data_science
  )
)
         Job.Title    Employment.Type   Experience.Level    Expertise.Level 
                 0                  0                  0                  0 
            Salary    Salary.Currency   Company.Location      Salary.in.USD 
                 0                  0                  0                  0 
Employee.Residence       Company.Size               Year 
                 0                  0                  0 

Celkový počet chýbajúcich hodnôt:

Kód
sum(
  is.na(
    data_science
  )
)
[1] 0

Kontrola duplicít

Kód
sum(
  duplicated(
    data_science
  )
)
[1] 0

Odstránenie úplných duplicít

Kód
data_science_ciste <- unique(
  data_science
)

dim(
  data_science_ciste
)
[1] 3300   11

6. Výber údajov súvisiacich s mojou kariérou

Výber dôležitých premenných

Z databázy vyberiem premenné, ktoré sú pre moju analýzu najzaujímavejšie.

Kód
data_science_vyber <- data_science_ciste[, c(
  "Job.Title",
  "Experience.Level",
  "Salary.in.USD",
  "Company.Location",
  "Company.Size",
  "Year"
)]

head(
  data_science_vyber
)
       Job.Title Experience.Level Salary.in.USD Company.Location Company.Size
1  Data Engineer           Senior        210000    United States       Medium
2  Data Engineer           Senior        165000    United States       Medium
3  Data Engineer           Senior        185900    United States       Medium
4  Data Engineer           Senior        129300    United States       Medium
5 Data Scientist           Senior        140000    United States       Medium
6 Data Scientist           Senior        126000    United States       Medium
  Year
1 2023
2 2023
3 2023
4 2023
5 2023
6 2023

Výber pracovnej pozície Data Scientist

Keďže mojou vysnívanou kariérou je pracovná pozícia Data Scientist, vytvorím samostatnú databázu iba s touto pracovnou pozíciou.

Kód
data_scientist <- subset(
  data_science_ciste,
  Job.Title == "Data Scientist"
)

head(
  data_scientist
)
        Job.Title Employment.Type Experience.Level Expertise.Level Salary
5  Data Scientist       Full-Time           Senior          Expert 140000
6  Data Scientist       Full-Time           Senior          Expert 126000
7  Data Scientist       Full-Time           Senior          Expert 170000
8  Data Scientist       Full-Time           Senior          Expert 130000
17 Data Scientist       Full-Time           Senior          Expert 185900
18 Data Scientist       Full-Time           Senior          Expert 129300
        Salary.Currency Company.Location Salary.in.USD Employee.Residence
5  United States Dollar    United States        140000      United States
6  United States Dollar    United States        126000      United States
7  United States Dollar    United States        170000      United States
8  United States Dollar    United States        130000      United States
17 United States Dollar    United States        185900      United States
18 United States Dollar    United States        129300      United States
   Company.Size Year
5        Medium 2023
6        Medium 2023
7        Medium 2023
8        Medium 2023
17       Medium 2023
18       Medium 2023

Počet záznamov:

Kód
nrow(
  data_scientist
)
[1] 635

V databáze sa nachádza 635 pozorovaní pracovnej pozície Data Scientist.

Záznamy podľa rokov

Kód
table(
  data_scientist$Year
)

2020 2021 2022 2023 
  21   39  222  353 

Databáza obsahuje údaje za roky 2020 až 2023.

Filtrovanie podľa rokov

Vyberiem údaje z rokov 2022 a 2023.

Kód
data_scientist_2022_2023 <- subset(
  data_scientist,
  Year >= 2022 &
    Year <= 2023
)

head(
  data_scientist_2022_2023
)
        Job.Title Employment.Type Experience.Level Expertise.Level Salary
5  Data Scientist       Full-Time           Senior          Expert 140000
6  Data Scientist       Full-Time           Senior          Expert 126000
7  Data Scientist       Full-Time           Senior          Expert 170000
8  Data Scientist       Full-Time           Senior          Expert 130000
17 Data Scientist       Full-Time           Senior          Expert 185900
18 Data Scientist       Full-Time           Senior          Expert 129300
        Salary.Currency Company.Location Salary.in.USD Employee.Residence
5  United States Dollar    United States        140000      United States
6  United States Dollar    United States        126000      United States
7  United States Dollar    United States        170000      United States
8  United States Dollar    United States        130000      United States
17 United States Dollar    United States        185900      United States
18 United States Dollar    United States        129300      United States
   Company.Size Year
5        Medium 2023
6        Medium 2023
7        Medium 2023
8        Medium 2023
17       Medium 2023
18       Medium 2023

Najvyššie platy

Zoradím Data Scientist pozorovania podľa platu od najvyššieho.

Kód
data_scientist_zoradene <- data_scientist[
  order(
    data_scientist$Salary.in.USD,
    decreasing = TRUE
  ),
]

head(
  data_scientist_zoradene,
  10
)
          Job.Title Employment.Type Experience.Level Expertise.Level Salary
3296 Data Scientist       Full-Time           Senior          Expert 412000
1752 Data Scientist       Full-Time           Senior          Expert 370000
458  Data Scientist       Full-Time           Senior          Expert 359170
2393 Data Scientist       Full-Time           Senior          Expert 350000
347  Data Scientist       Full-Time           Senior          Expert 323300
1478 Data Scientist       Full-Time           Senior          Expert 317070
489  Data Scientist       Full-Time           Senior          Expert 316000
459  Data Scientist       Full-Time           Senior          Expert 310270
1747 Data Scientist       Full-Time           Senior          Expert 300240
1941 Data Scientist       Full-Time        Executive        Director 300000
          Salary.Currency Company.Location Salary.in.USD Employee.Residence
3296 United States Dollar    United States        412000      United States
1752 United States Dollar    United States        370000      United States
458  United States Dollar    United States        359170      United States
2393 United States Dollar    United States        350000      United States
347  United States Dollar    United States        323300      United States
1478 United States Dollar    United States        317070      United States
489  United States Dollar    United States        316000      United States
459  United States Dollar    United States        310270      United States
1747 United States Dollar    United States        300240      United States
1941 United States Dollar    United States        300000      United States
     Company.Size Year
3296        Large 2020
1752       Medium 2023
458        Medium 2023
2393       Medium 2022
347        Medium 2023
1478       Medium 2023
489        Medium 2023
459        Medium 2023
1747       Medium 2023
1941       Medium 2023

Priemerný plat podľa rokov

Kód
plat_vyvoj <- aggregate(
  Salary.in.USD ~ Year,
  data = data_scientist,
  FUN = mean
)

plat_vyvoj
  Year Salary.in.USD
1 2020      85970.52
2 2021      79366.23
3 2022     127960.07
4 2023     160877.95
Kód
knitr::kable(
  plat_vyvoj,
  digits = 2,
  caption = "Priemerný plat Data Scientist podľa rokov"
)
Priemerný plat Data Scientist podľa rokov
Year Salary.in.USD
2020 85970.52
2021 79366.23
2022 127960.07
2023 160877.95

Priemerný plat podľa skúseností

Kód
plat_skusenosti <- aggregate(
  Salary.in.USD ~ Experience.Level,
  data = data_scientist,
  FUN = mean
)

plat_skusenosti
  Experience.Level Salary.in.USD
1            Entry      75021.37
2        Executive     188429.58
3              Mid      96619.08
4           Senior     167714.71
Kód
knitr::kable(
  plat_skusenosti,
  digits = 2,
  caption = "Priemerný plat Data Scientist podľa úrovne skúseností"
)
Priemerný plat Data Scientist podľa úrovne skúseností
Experience.Level Salary.in.USD
Entry 75021.37
Executive 188429.58
Mid 96619.08
Senior 167714.71

Priemerný plat podľa veľkosti spoločnosti

Kód
plat_firma <- aggregate(
  Salary.in.USD ~ Company.Size,
  data = data_scientist,
  FUN = mean
)

knitr::kable(
  plat_firma,
  digits = 2,
  caption = "Priemerný plat Data Scientist podľa veľkosti spoločnosti"
)
Priemerný plat Data Scientist podľa veľkosti spoločnosti
Company.Size Salary.in.USD
Large 102869.94
Medium 152406.95
Small 75773.55

7. Grafické zobrazenie údajov

Vývoj priemerného platu Data Scientist

Kód
plot(
  plat_vyvoj$Year,
  plat_vyvoj$Salary.in.USD,
  type = "b",
  pch = 19,
  xlab = "Rok",
  ylab = "Priemerný plat v USD",
  main = "Vývoj priemerného platu Data Scientist"
)

Boxplot podľa rokov

Kód
boxplot(
  Salary.in.USD ~ factor(Year),
  data = data_scientist,
  xlab = "Rok",
  ylab = "Plat v USD",
  main = "Rozdelenie platov Data Scientist podľa rokov"
)

Boxplot podľa skúseností

Kód
boxplot(
  Salary.in.USD ~ Experience.Level,
  data = data_scientist,
  xlab = "Úroveň skúseností",
  ylab = "Plat v USD",
  main = "Plat Data Scientist podľa skúseností"
)

Bodový graf

Zobrazím vzťah medzi rokom a výškou platu.

Kód
plot(
  jitter(
    data_scientist$Year,
    amount = 0.1
  ),
  data_scientist$Salary.in.USD,
  pch = 19,
  cex = 0.6,
  xlab = "Rok",
  ylab = "Plat v USD",
  main = "Vzťah medzi rokom a platom Data Scientist"
)

8. Základné štatistiky

Štatistiky podľa rokov

Kód
roky <- sort(
  unique(
    data_scientist$Year
  )
)

salary_stats <- data.frame(

  Rok = roky,

  Pocet = sapply(
    roky,
    function(r) {
      sum(
        data_scientist$Year == r
      )
    }
  ),

  Priemer = sapply(
    roky,
    function(r) {
      mean(
        data_scientist$Salary.in.USD[
          data_scientist$Year == r
        ],
        na.rm = TRUE
      )
    }
  ),

  SD = sapply(
    roky,
    function(r) {
      sd(
        data_scientist$Salary.in.USD[
          data_scientist$Year == r
        ],
        na.rm = TRUE
      )
    }
  ),

  Minimum = sapply(
    roky,
    function(r) {
      min(
        data_scientist$Salary.in.USD[
          data_scientist$Year == r
        ],
        na.rm = TRUE
      )
    }
  ),

  Median = sapply(
    roky,
    function(r) {
      median(
        data_scientist$Salary.in.USD[
          data_scientist$Year == r
        ],
        na.rm = TRUE
      )
    }
  ),

  Maximum = sapply(
    roky,
    function(r) {
      max(
        data_scientist$Salary.in.USD[
          data_scientist$Year == r
        ],
        na.rm = TRUE
      )
    }
  )
)

knitr::kable(
  salary_stats,
  digits = 2,
  caption = "Základné štatistiky platov Data Scientist podľa rokov"
)
Základné štatistiky platov Data Scientist podľa rokov
Rok Pocet Priemer SD Minimum Median Maximum
2020 21 85970.52 81436.65 21669 62726 412000
2021 39 79366.23 41063.36 16904 77684 165000
2022 222 127960.07 57428.99 17684 127750 350000
2023 353 160877.95 65251.37 16000 158677 370000

Štatistiky podľa skúseností

Kód
urovne <- unique(
  data_scientist$Experience.Level
)

experience_stats <- data.frame(

  Skusenosti = urovne,

  Pocet = sapply(
    urovne,
    function(x) {
      sum(
        data_scientist$Experience.Level == x
      )
    }
  ),

  Priemer = sapply(
    urovne,
    function(x) {
      mean(
        data_scientist$Salary.in.USD[
          data_scientist$Experience.Level == x
        ],
        na.rm = TRUE
      )
    }
  ),

  Median = sapply(
    urovne,
    function(x) {
      median(
        data_scientist$Salary.in.USD[
          data_scientist$Experience.Level == x
        ],
        na.rm = TRUE
      )
    }
  )
)

knitr::kable(
  experience_stats,
  digits = 2,
  caption = "Štatistiky platu podľa úrovne skúseností"
)
Štatistiky platu podľa úrovne skúseností
Skusenosti Pocet Priemer Median
Senior Senior 398 167714.71 164500
Mid Mid 158 96619.08 90367
Executive Executive 19 188429.58 185000
Entry Entry 60 75021.37 74141

Celkové štatistiky platu

Kód
summary(
  data_scientist$Salary.in.USD
)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  16000   93400  140000  141886  184217  412000 

Kvartily

Kód
quantile(
  data_scientist$Salary.in.USD,
  probs = c(
    0.25,
    0.50,
    0.75
  )
)
   25%    50%    75% 
 93400 140000 184217 

9. Štatistické testovanie

T-test

Pomocou t-testu porovnám priemerný plat Data Scientist v rokoch 2022 a 2023.

Kód
plat_2022 <- data_scientist$Salary.in.USD[
  data_scientist$Year == 2022
]

plat_2023 <- data_scientist$Salary.in.USD[
  data_scientist$Year == 2023
]
Kód
t_test <- t.test(
  plat_2022,
  plat_2023
)

print(
  t_test
)

    Welch Two Sample t-test

data:  plat_2022 and plat_2023
t = -6.3447, df = 513.16, p-value = 4.9e-10
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -43110.69 -22725.07
sample estimates:
mean of x mean of y 
 127960.1  160877.9 

Nulová hypotéza predpokladá, že priemerný plat Data Scientist v roku 2022 a v roku 2023 je rovnaký.

T-test umožňuje posúdiť, či je rozdiel medzi priemermi dvoch skupín štatisticky významný.

ANOVA

Pomocou analýzy rozptylu porovnám platy podľa úrovne skúseností.

Kód
data_scientist$Experience.Level <- factor(
  data_scientist$Experience.Level
)

anova_model <- aov(
  Salary.in.USD ~ Experience.Level,
  data = data_scientist
)

summary(
  anova_model
)
                  Df    Sum Sq   Mean Sq F value Pr(>F)    
Experience.Level   3 8.987e+11 2.996e+11   98.75 <2e-16 ***
Residuals        631 1.914e+12 3.033e+09                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ANOVA umožňuje porovnávať priemery viacerých skupín.

10. Lineárna regresia

Vzťah medzi rokom a platom

Pomocou lineárnej regresie preskúmam vzťah medzi rokom a výškou platu Data Scientist.

Model má tvar:

\[ SALARY_i = \beta_0 + \beta_1 YEAR_i + \varepsilon_i \]

Kde:

  • \(SALARY_i\) je plat v USD,
  • \(YEAR_i\) je rok pozorovania,
  • \(\beta_0\) je konštanta,
  • \(\beta_1\) je regresný koeficient,
  • \(\varepsilon_i\) je náhodná chyba.
Kód
model <- lm(
  Salary.in.USD ~ Year,
  data = data_scientist
)

summary(
  model
)

Call:
lm(formula = Salary.in.USD ~ Year, data = data_scientist)

Residuals:
    Min      1Q  Median      3Q     Max 
-144159  -42069   -3159   38788  347734 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -64503591    6629969  -9.729   <2e-16 ***
Year            31964       3278   9.750   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 62160 on 633 degrees of freedom
Multiple R-squared:  0.1306,    Adjusted R-squared:  0.1292 
F-statistic: 95.07 on 1 and 633 DF,  p-value: < 2.2e-16

Regresný graf

Kód
plot(
  jitter(
    data_scientist$Year,
    amount = 0.1
  ),
  data_scientist$Salary.in.USD,
  pch = 19,
  cex = 0.6,
  xlab = "Rok",
  ylab = "Plat v USD",
  main = "Vzťah medzi rokom a platom Data Scientist"
)

abline(
  model,
  lwd = 2
)

Regresné koeficienty

Kód
koeficienty <- as.data.frame(
  summary(model)$coefficients
)

koeficienty$Premenna <-
  rownames(
    koeficienty
  )

rownames(
  koeficienty
) <- NULL

knitr::kable(
  koeficienty,
  digits = 4,
  caption = "Koeficienty lineárnej regresie"
)
Koeficienty lineárnej regresie
Estimate Std. Error t value Pr(>|t|) Premenna
-64503590.95 6629969.363 -9.7291 0 (Intercept)
31964.29 3278.222 9.7505 0 Year

Štatistiky modelu

Kód
model_summary <- summary(
  model
)

statistiky_modelu <- data.frame(

  R_squared =
    model_summary$r.squared,

  Adjusted_R_squared =
    model_summary$adj.r.squared,

  Pocet_pozorovani =
    nobs(model)
)

knitr::kable(
  statistiky_modelu,
  digits = 4,
  caption = "Štatistiky regresného modelu"
)
Štatistiky regresného modelu
R_squared Adjusted_R_squared Pocet_pozorovani
0.1306 0.1292 635

Výsledky regresie predstavujú štatistický vzťah medzi premennými, nie dôkaz príčinnej súvislosti.

11. Výber databázy na ďalšie hodiny

Na ďalšie hodiny som si vybral databázu Latest Data Science Salaries.

Moja téma je Moja vysnívaná kariéra: Dátový vedec.

Databáza obsahuje údaje o pracovných pozíciách a platoch v oblasti Data Science.

Obsahuje tieto premenné:

  • Job Title – názov pracovnej pozície,
  • Employment Type – typ pracovného pomeru,
  • Experience Level – úroveň skúseností,
  • Expertise Level – úroveň odbornosti,
  • Salary – výška platu,
  • Salary Currency – mena platu,
  • Company Location – lokalita spoločnosti,
  • Salary in USD – plat prepočítaný na USD,
  • Employee Residence – miesto bydliska zamestnanca,
  • Company Size – veľkosť spoločnosti,
  • Year – rok pozorovania.

Databáza obsahuje údaje za roky 2020, 2021, 2022 a 2023.

Premenná Year umožňuje analyzovať vývoj údajov v čase.

Na ďalších hodinách by som chcel sledovať najmä:

  • vývoj platov Data Scientist podľa rokov,
  • rozdiely v platoch podľa úrovne skúseností,
  • rozdiely medzi jednotlivými pracovnými pozíciami,
  • rozdiely podľa veľkosti spoločnosti,
  • rozdiely medzi jednotlivými krajinami.

Ako zdroj databázy som využil platformu Kaggle.

Záver

V tomto dokumente som si precvičil základné možnosti práce s databázami v programovacom jazyku R.

Najskôr som vytvoril jednoduchú ilustračnú databázu pracovných pozícií v oblasti Data Science a pracoval som s dátovým rámcom data.frame.

Použil som základné funkcie R na filtrovanie, triedenie, zoskupovanie a vytváranie nových premenných.

Následne som načítal svoju skutočnú databázu Latest_Data_Science_Salaries.csv, ktorá obsahuje údaje o pracovných pozíciách a platoch v oblasti Data Science.

Keďže mojou vysnívanou kariérou je Data Scientist, zameral som sa najmä na túto pracovnú pozíciu.

Analyzoval som platy podľa rokov, úrovne skúseností a veľkosti spoločností. Vytvoril som grafy, základné štatistiky a použil som t-test, ANOVA a lineárnu regresiu.

Tieto postupy predstavujú základné nástroje práce s údajmi, ktoré môžem využiť aj vo svojej budúcej kariére dátového vedca.