Kód
knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)Moja vysnívaná kariéra: Dátový vedec
knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)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.
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.
Najskôr vytvorím jednoduchú ilustračnú databázu troch pracovných pozícií z oblasti Data Science.
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é.
Vypíšem hodnoty platu.
print(
udaje$PlatUSD
)[1] 120000 85000 110000
Vypočítam priemerný plat.
mean(
udaje$PlatUSD
)[1] 105000
Vyberiem pracovnú pozíciu Data Scientist.
udaje[
udaje$Pozicia == "Data Scientist",
] Pozicia PlatUSD Rok
1 Data Scientist 120000 2021
Vyberiem tretí riadok.
udaje[3, ] Pozicia PlatUSD Rok
3 Data Engineer 110000 2023
Vyberiem druhý a tretí stĺpec.
udaje[, 2:3] PlatUSD Rok
1 120000 2021
2 85000 2022
3 110000 2023
Vyberiem jednu konkrétnu bunku.
udaje[1, 2][1] 120000
Zobrazím základné štatistiky.
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
Do databázy pridám informáciu, či plat presahuje 100 000 USD.
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
Pridám ďalšiu pracovnú pozíciu.
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
Na prehľadné zobrazenie použijem funkciu knitr::kable().
knitr::kable(
udaje,
digits = 2,
caption = "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 |
Vyberiem pracovné pozície s platom vyšším ako 100 000 USD.
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.
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
Vyberiem iba pracovnú pozíciu a plat.
udaje[, c(
"Pozicia",
"PlatUSD"
)] Pozicia PlatUSD
1 Data Scientist 120000
2 Data Analyst 85000
3 Data Engineer 110000
4 Machine Learning Engineer 125000
Vypočítam priemerný plat podľa toho, či pozícia patrí do skupiny s vysokým platom.
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:
table(
udaje$VysokyPlat
)
FALSE TRUE
1 3
Pracovné pozície rozdelím podľa výšky platu.
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ý
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
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.
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.
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
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
Vyberiem roky, v ktorých priemerný plat presiahol 100 000 USD.
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
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
mean(platy$Entry)[1] 70700
mean(platy$Mid)[1] 96900
mean(platy$Senior)[1] 131900
sd(platy$Entry)[1] 9557.429
sd(platy$Mid)[1] 14325.19
sd(platy$Senior)[1] 20030.25
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:
R obsahuje aj vlastné databázy.
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 |
Ako príklad použijem zabudovanú databázu iris.
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:
dim(iris)[1] 150 5
Základné štatistiky:
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
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:
Súbor mám uložený v priečinku údaje.
subor <- "údaje/Latest_Data_Science_Salaries.csv"
file.exists(
subor
)[1] TRUE
Ak je výsledkom TRUE, súbor bol úspešne nájdený.
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
Názvy premenných:
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:
dim(
data_science
)[1] 3300 11
Databáza obsahuje 3300 pozorovaní a 11 premenných.
Štruktúra databázy:
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:
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
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:
sum(
is.na(
data_science
)
)[1] 0
sum(
duplicated(
data_science
)
)[1] 0
data_science_ciste <- unique(
data_science
)
dim(
data_science_ciste
)[1] 3300 11
Z databázy vyberiem premenné, ktoré sú pre moju analýzu najzaujímavejšie.
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
Keďže mojou vysnívanou kariérou je pracovná pozícia Data Scientist, vytvorím samostatnú databázu iba s touto pracovnou pozíciou.
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:
nrow(
data_scientist
)[1] 635
V databáze sa nachádza 635 pozorovaní pracovnej pozície Data Scientist.
table(
data_scientist$Year
)
2020 2021 2022 2023
21 39 222 353
Databáza obsahuje údaje za roky 2020 až 2023.
Vyberiem údaje z rokov 2022 a 2023.
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
Zoradím Data Scientist pozorovania podľa platu od najvyššieho.
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
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
knitr::kable(
plat_vyvoj,
digits = 2,
caption = "Priemerný plat Data Scientist podľa rokov"
)| Year | Salary.in.USD |
|---|---|
| 2020 | 85970.52 |
| 2021 | 79366.23 |
| 2022 | 127960.07 |
| 2023 | 160877.95 |
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
knitr::kable(
plat_skusenosti,
digits = 2,
caption = "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 |
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"
)| Company.Size | Salary.in.USD |
|---|---|
| Large | 102869.94 |
| Medium | 152406.95 |
| Small | 75773.55 |
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(
Salary.in.USD ~ factor(Year),
data = data_scientist,
xlab = "Rok",
ylab = "Plat v USD",
main = "Rozdelenie platov Data Scientist podľa rokov"
)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í"
)Zobrazím vzťah medzi rokom a výškou platu.
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"
)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"
)| 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 |
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í"
)| 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 |
summary(
data_scientist$Salary.in.USD
) Min. 1st Qu. Median Mean 3rd Qu. Max.
16000 93400 140000 141886 184217 412000
quantile(
data_scientist$Salary.in.USD,
probs = c(
0.25,
0.50,
0.75
)
) 25% 50% 75%
93400 140000 184217
Pomocou t-testu porovnám priemerný plat Data Scientist v rokoch 2022 a 2023.
plat_2022 <- data_scientist$Salary.in.USD[
data_scientist$Year == 2022
]
plat_2023 <- data_scientist$Salary.in.USD[
data_scientist$Year == 2023
]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ý.
Pomocou analýzy rozptylu porovnám platy podľa úrovne skúseností.
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.
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:
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
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
)koeficienty <- as.data.frame(
summary(model)$coefficients
)
koeficienty$Premenna <-
rownames(
koeficienty
)
rownames(
koeficienty
) <- NULL
knitr::kable(
koeficienty,
digits = 4,
caption = "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 |
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"
)| 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.
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ä:
Ako zdroj databázy som využil platformu Kaggle.
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.