knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)Výpočty so svojou databázou
Lineárna regresia – Moja vysnívaná kariéra: Dátový vedec
1 Predmet výskumu
V tomto cvičení sa prvýkrát podrobnejšie venujem lineárnej regresii v programovacom jazyku R.
Pokračujem vo svojej téme Moja vysnívaná kariéra: Dátový vedec a pracujem so svojou databázou Latest Data Science Salaries.
Databáza obsahuje informácie o pracovných pozíciách v oblasti Data Science, platoch, skúsenostiach, veľkosti spoločností, lokalite spoločností a roku pozorovania.
V tomto cvičení sa zameriam priamo na pracovnú pozíciu Data Scientist.
Budeme skúmať najmä tieto otázky:
- Súvisí rok pozorovania s výškou platu Data Scientist?
- Ako môžeme túto závislosť graficky znázorniť?
- Ako odhadneme jednoduchú regresnú priamku?
- Ako sa výsledky zmenia po pridaní úrovne skúseností a veľkosti firmy?
- Ako porovnáme skutočné a predikované hodnoty?
- Ako môžeme pomocou regresného modelu vytvoriť predikciu?
Cieľom je pochopiť základnú myšlienku lineárnej regresie a prácu s funkciou lm().
2 Príprava údajov
2.1 Umiestnenie súboru
Databázu mám uloženú v priečinku údaje pod názvom:
Latest_Data_Science_Salaries.csv
Najskôr overím, či R súbor nájde.
cesta <- "údaje/Latest_Data_Science_Salaries.csv"
file.exists(cesta)[1] TRUE
Výsledkom by mala byť hodnota TRUE.
2.2 Načítanie CSV
udaje <- read.csv(
cesta,
sep = ",",
dec = ".",
na.strings = c("", "NA"),
check.names = FALSE,
stringsAsFactors = FALSE
)
head(udaje) 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
Upravím názvy premenných tak, aby sa s nimi jednoduchšie pracovalo v R.
names(udaje) <- make.names(
trimws(
names(udaje)
),
unique = TRUE
)
names(udaje) [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"
Po úprave používam napríklad názvy:
Job.TitleExperience.LevelSalary.in.USDCompany.LocationCompany.SizeYear
3 Výber pracovnej pozície Data Scientist
Keďže mojou vysnívanou kariérou je práca Data Scientist, z celej databázy vyberiem iba túto pracovnú pozíciu.
data_scientist <- udaje[
udaje$Job.Title == "Data Scientist",
]Počet záznamov:
nrow(
data_scientist
)[1] 635
Databáza obsahuje 635 záznamov pre pracovnú pozíciu Data Scientist.
Vyberiem premenné potrebné pre dnešnú analýzu.
data_scientist <- data_scientist[, c(
"Job.Title",
"Salary.in.USD",
"Experience.Level",
"Company.Size",
"Company.Location",
"Year"
)]
head(
data_scientist
) Job.Title Salary.in.USD Experience.Level Company.Size Company.Location
5 Data Scientist 140000 Senior Medium United States
6 Data Scientist 126000 Senior Medium United States
7 Data Scientist 170000 Senior Medium United States
8 Data Scientist 130000 Senior Medium United States
17 Data Scientist 185900 Senior Medium United States
18 Data Scientist 129300 Senior Medium United States
Year
5 2023
6 2023
7 2023
8 2023
17 2023
18 2023
Zobrazím prvých šesť pozorovaní v tabuľke.
knitr::kable(
head(
data_scientist,
6
),
digits = 2,
row.names = FALSE,
caption = "Prvých šesť pozorovaní pracovnej pozície Data Scientist"
)| Job.Title | Salary.in.USD | Experience.Level | Company.Size | Company.Location | Year |
|---|---|---|---|---|---|
| Data Scientist | 140000 | Senior | Medium | United States | 2023 |
| Data Scientist | 126000 | Senior | Medium | United States | 2023 |
| Data Scientist | 170000 | Senior | Medium | United States | 2023 |
| Data Scientist | 130000 | Senior | Medium | United States | 2023 |
| Data Scientist | 185900 | Senior | Medium | United States | 2023 |
| Data Scientist | 129300 | Senior | Medium | United States | 2023 |
Jeden riadok predstavuje jedno pozorovanie pracovnej pozície Data Scientist.
Databáza obsahuje údaje z rokov 2020 až 2023.
4 Prehľad premenných
popis <- data.frame(
Premenna = c(
"Salary.in.USD",
"Year",
"Experience.Level",
"Company.Size"
),
Vyznam = c(
"Plat pracovníka prepočítaný na USD.",
"Rok, z ktorého pochádza pozorovanie.",
"Úroveň pracovných skúseností.",
"Veľkosť spoločnosti."
)
)
knitr::kable(
popis,
col.names = c(
"Premenná",
"Význam"
),
row.names = FALSE,
caption = "Premenné použité v regresnej analýze"
)| Premenná | Význam |
|---|---|
| Salary.in.USD | Plat pracovníka prepočítaný na USD. |
| Year | Rok, z ktorého pochádza pozorovanie. |
| Experience.Level | Úroveň pracovných skúseností. |
| Company.Size | Veľkosť spoločnosti. |
5 Chýbajúce hodnoty
Chýbajúcu hodnotu označuje R ako NA.
Najskôr skontrolujem počet chýbajúcich hodnôt.
chybajuce <- data.frame(
Premenna =
names(data_scientist),
Pocet_NA =
colSums(
is.na(
data_scientist
)
)
)
knitr::kable(
chybajuce,
row.names = FALSE,
col.names = c(
"Premenná",
"Počet chýbajúcich hodnôt"
),
caption = "Kontrola chýbajúcich hodnôt"
)| Premenná | Počet chýbajúcich hodnôt |
|---|---|
| Job.Title | 0 |
| Salary.in.USD | 0 |
| Experience.Level | 0 |
| Company.Size | 0 |
| Company.Location | 0 |
| Year | 0 |
Celkový počet chýbajúcich hodnôt:
sum(
is.na(
data_scientist
)
)[1] 0
V mojej databáze sa v použitých premenných nenachádzajú chýbajúce hodnoty, preto ich nemusím dopĺňať.
6 Úprava dátových typov
Premenné predstavujúce skúsenosti a veľkosť firmy nastavím ako kategorizované premenné.
Ako základnú kategóriu skúseností použijem Entry.
data_scientist$Experience.Level <- factor(
data_scientist$Experience.Level,
levels = c(
"Entry",
"Mid",
"Senior",
"Executive"
)
)Ako základnú kategóriu veľkosti firmy použijem Small.
data_scientist$Company.Size <- factor(
data_scientist$Company.Size,
levels = c(
"Small",
"Medium",
"Large"
)
)Rok nastavím ako numerickú premennú.
data_scientist$Year <- as.numeric(
data_scientist$Year
)Skontrolujem štruktúru údajov.
str(
data_scientist
)'data.frame': 635 obs. of 6 variables:
$ Job.Title : chr "Data Scientist" "Data Scientist" "Data Scientist" "Data Scientist" ...
$ Salary.in.USD : int 140000 126000 170000 130000 185900 129300 225000 156400 61520 49216 ...
$ Experience.Level: Factor w/ 4 levels "Entry","Mid",..: 3 3 3 3 3 3 3 3 2 2 ...
$ Company.Size : Factor w/ 3 levels "Small","Medium",..: 2 2 2 2 2 2 2 2 2 2 ...
$ Company.Location: chr "United States" "United States" "United States" "United States" ...
$ Year : num 2023 2023 2023 2023 2023 ...
7 Opisná štatistika
Vypočítam základné charakteristiky platu.
opis <- data.frame(
Minimum =
min(
data_scientist$Salary.in.USD
),
Median =
median(
data_scientist$Salary.in.USD
),
Priemer =
mean(
data_scientist$Salary.in.USD
),
Maximum =
max(
data_scientist$Salary.in.USD
)
)
knitr::kable(
opis,
digits = 2,
row.names = FALSE,
caption = "Opisná štatistika platu Data Scientist"
)| Minimum | Median | Priemer | Maximum |
|---|---|---|---|
| 16000 | 140000 | 141886.2 | 412000 |
7.1 Priemerný plat podľa rokov
priemer_rok <- aggregate(
Salary.in.USD ~ Year,
data = data_scientist,
FUN = mean
)
knitr::kable(
priemer_rok,
digits = 2,
row.names = FALSE,
col.names = c(
"Rok",
"Priemerný plat v USD"
),
caption = "Priemerný plat Data Scientist podľa rokov"
)| Rok | Priemerný plat v USD |
|---|---|
| 2020 | 85970.52 |
| 2021 | 79366.23 |
| 2022 | 127960.07 |
| 2023 | 160877.95 |
8 Graf
Najskôr graficky zobrazím vzťah medzi rokom pozorovania a platom Data Scientist.
Pracovná hypotéza je, že v novších rokoch sa v databáze objavujú vyššie platy.
plot(
jitter(
data_scientist$Year,
amount = 0.10
),
data_scientist$Salary.in.USD,
pch = 19,
cex = 0.6,
xlab = "Rok",
ylab = "Plat v USD",
main = "Rok a plat Data Scientist"
)Každý bod predstavuje jedno pozorovanie pracovnej pozície Data Scientist.
Z grafu môžeme sledovať, či sa výška platov medzi jednotlivými rokmi mení.
Zároveň vidíme, že pracovníci v rovnakom roku nemajú rovnaký plat. Výška platu teda závisí aj od ďalších faktorov.
9 Jednoduchá lineárna regresia
9.1 Zápis modelu
Najskôr použijem iba jednu vysvetľujúcu premennú – rok.
Model má tvar:
\[ Salary_i = \beta_0 + \beta_1 Year_i + u_i \]
kde:
- \(Salary_i\) je plat Data Scientist v USD,
- \(Year_i\) je rok pozorovania,
- \(\beta_0\) je konštanta,
- \(\beta_1\) je regresný koeficient pri roku,
- \(u_i\) zachytáva ostatné faktory, ktoré jednoduchý model nevysvetľuje.
9.2 Odhad pomocou lm()
model1 <- lm(
Salary.in.USD ~ Year,
data = data_scientist
)
summary(
model1
)
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é koeficienty:
koeficienty1 <- as.data.frame(
summary(model1)$coefficients
)
koeficienty1$Clen_modelu <-
rownames(
koeficienty1
)
rownames(
koeficienty1
) <- NULL
koeficienty1 <- koeficienty1[, c(
"Clen_modelu",
"Estimate"
)]
knitr::kable(
koeficienty1,
digits = 2,
row.names = FALSE,
col.names = c(
"Člen modelu",
"Odhad koeficienta"
),
caption = "Jednoduchá regresia: plat Data Scientist a rok"
)| Člen modelu | Odhad koeficienta |
|---|---|
| (Intercept) | -64503590.95 |
| Year | 31964.29 |
Znak ~ čítame ako vysvetľujeme pomocou.
V našom modeli teda vysvetľujeme:
Salary.in.USD
pomocou:
Year.
Koeficient pri premennej Year vyjadruje priemerný rozdiel predikovaného platu pri zvýšení roku o jednu jednotku.
V tejto databáze vychádza koeficient pri roku kladný. To znamená, že novšie roky sa v jednoduchom modeli spájajú s vyšším predikovaným platom.
Dôležité však je, že tento vzťah automaticky neznamená príčinnú súvislosť.
10 Regresná priamka v grafe
Do pôvodného grafu pridám odhadnutú regresnú priamku.
plot(
jitter(
data_scientist$Year,
amount = 0.10
),
data_scientist$Salary.in.USD,
pch = 19,
cex = 0.6,
xlab = "Rok",
ylab = "Plat v USD",
main = "Regresná priamka – rok a plat Data Scientist"
)
abline(
model1,
lwd = 2
)Regresná priamka nemusí prechádzať všetkými bodmi.
Metóda najmenších štvorcov vyberá takú priamku, ktorá minimalizuje súčet štvorcov rozdielov medzi skutočnými a predikovanými hodnotami.
11 Viacnásobná lineárna regresia
Výška platu pravdepodobne nesúvisí iba s rokom.
Preto do modelu pridám:
- úroveň skúseností,
- veľkosť spoločnosti.
Model má tvar:
\[ Salary_i = \beta_0 + \beta_1 Year_i + \beta_2 Experience_i + \beta_3 CompanySize_i + u_i \]
model <- lm(
Salary.in.USD ~
Year +
Experience.Level +
Company.Size,
data = data_scientist
)
summary(
model
)
Call:
lm(formula = Salary.in.USD ~ Year + Experience.Level + Company.Size,
data = data_scientist)
Residuals:
Min 1Q Median 3Q Max
-135659 -35648 -3527 30791 290271
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -22796486 6759217 -3.373 0.000790 ***
Year 11301 3344 3.379 0.000771 ***
Experience.LevelMid 16348 8152 2.005 0.045359 *
Experience.LevelSenior 77673 7751 10.022 < 2e-16 ***
Experience.LevelExecutive 94384 14391 6.559 1.13e-10 ***
Company.SizeMedium 30753 11129 2.763 0.005889 **
Company.SizeLarge 11859 11557 1.026 0.305211
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 53430 on 628 degrees of freedom
Multiple R-squared: 0.3627, Adjusted R-squared: 0.3566
F-statistic: 59.57 on 6 and 628 DF, p-value: < 2.2e-16
12 Koeficienty viacnásobného modelu
koeficienty <- as.data.frame(
summary(model)$coefficients
)
koeficienty$Clen_modelu <-
rownames(
koeficienty
)
rownames(
koeficienty
) <- NULL
koeficienty <- koeficienty[, c(
"Clen_modelu",
"Estimate"
)]
knitr::kable(
koeficienty,
digits = 2,
row.names = FALSE,
col.names = c(
"Člen modelu",
"Odhad koeficienta"
),
caption = "Viacnásobná regresia platu Data Scientist"
)| Člen modelu | Odhad koeficienta |
|---|---|
| (Intercept) | -22796486.42 |
| Year | 11301.33 |
| Experience.LevelMid | 16348.02 |
| Experience.LevelSenior | 77672.94 |
| Experience.LevelExecutive | 94383.80 |
| Company.SizeMedium | 30753.02 |
| Company.SizeLarge | 11859.18 |
V tomto modeli sa koeficient pri roku interpretuje pri rovnakej úrovni skúseností a rovnakej veľkosti spoločnosti.
Premenné Experience.Level a Company.Size sú kategorizované.
Základnou kategóriou skúseností je:
Entry
a základnou veľkosťou spoločnosti:
Small.
Koeficient napríklad pri Experience.LevelSenior preto vyjadruje rozdiel medzi Senior a Entry pracovníkom pri rovnakom roku a rovnakej veľkosti firmy.
13 Porovnanie jednoduchého a viacnásobného modelu
Porovnám koeficient pri roku.
porovnanie_modelov <- data.frame(
Model = c(
"Jednoduchý model",
"Viacnásobný model"
),
Koeficient_Year = c(
coef(model1)["Year"],
coef(model)["Year"]
)
)
knitr::kable(
porovnanie_modelov,
digits = 2,
row.names = FALSE,
col.names = c(
"Model",
"Koeficient pri roku"
),
caption = "Porovnanie koeficientu Year"
)| Model | Koeficient pri roku |
|---|---|
| Jednoduchý model | 31964.29 |
| Viacnásobný model | 11301.33 |
Koeficient sa môže po pridaní ďalších premenných zmeniť.
Jednoduchý a viacnásobný model totiž odpovedajú na odlišné otázky.
Viacnásobný model zohľadňuje aj rozdiely v skúsenostiach a veľkosti spoločností.
14 Stručný súhrn modelu
Teraz zobrazím základné charakteristiky viacnásobného modelu.
model_summary <- summary(
model
)
suhrn <- data.frame(
Pocet_pozorovani =
nobs(model),
R_squared =
model_summary$r.squared,
SD_chyby =
model_summary$sigma
)
knitr::kable(
suhrn,
digits = 3,
row.names = FALSE,
col.names = c(
"Počet pozorovaní",
"R²",
"Odhad SD chyby"
),
caption = "Základné charakteristiky viacnásobného modelu"
)| Počet pozorovaní | R² | Odhad SD chyby |
|---|---|---|
| 635 | 0.363 | 53427.47 |
14.1 R-squared
Hodnota \(R^2\) vyjadruje, akú časť variability platu zachytáva regresný model.
model_summary$r.squared[1] 0.3626892
Vyššie \(R^2\) znamená, že model zachytáva väčšiu časť variability pozorovaných platov.
Neznamená to však, že rovnaké percento predikcií je správnych a ani to nedokazuje príčinnú súvislosť.
15 Skutočná hodnota, predikcia a rezíduum
Pre každého pracovníka môžeme porovnať skutočný plat s platom predikovaným regresným modelom.
Rezíduum vypočítame:
\[ e_i = y_i - \widehat{y}_i \]
Kladné rezíduum znamená, že skutočný plat je vyšší než predikcia.
Záporné rezíduum znamená, že skutočný plat je nižší než predikcia.
porovnanie <- data.frame(
Rok =
data_scientist$Year,
Skusenosti =
data_scientist$Experience.Level,
Velkost_firmy =
data_scientist$Company.Size,
Skutocnost =
data_scientist$Salary.in.USD,
Predikcia =
fitted(model),
Reziduum =
residuals(model)
)Zobrazím prvých osem pozorovaní.
knitr::kable(
head(
porovnanie,
8
),
digits = 2,
row.names = FALSE,
col.names = c(
"Rok",
"Skúsenosti",
"Veľkosť firmy",
"Skutočný plat",
"Predikcia",
"Rezíduum"
),
caption = "Skutočné a predikované platy Data Scientist"
)| Rok | Skúsenosti | Veľkosť firmy | Skutočný plat | Predikcia | Rezíduum |
|---|---|---|---|---|---|
| 2023 | Senior | Medium | 140000 | 174526.9 | -34526.91 |
| 2023 | Senior | Medium | 126000 | 174526.9 | -48526.91 |
| 2023 | Senior | Medium | 170000 | 174526.9 | -4526.91 |
| 2023 | Senior | Medium | 130000 | 174526.9 | -44526.91 |
| 2023 | Senior | Medium | 185900 | 174526.9 | 11373.09 |
| 2023 | Senior | Medium | 129300 | 174526.9 | -45226.91 |
| 2023 | Senior | Medium | 225000 | 174526.9 | 50473.09 |
| 2023 | Senior | Medium | 156400 | 174526.9 | -18126.91 |
16 Ručné overenie rezídua
Vyberiem prvé pozorovanie.
porovnanie$Skutocnost[1] -
porovnanie$Predikcia[1][1] -34526.91
Porovnám ho s rezíduom vypočítaným pomocou modelu.
porovnanie$Reziduum[1][1] -34526.91
Obe hodnoty by mali byť rovnaké alebo sa môžu nepatrne líšiť v dôsledku zaokrúhlenia.
17 Rezíduá
Základný prehľad rezíduí:
summary(
residuals(model)
) Min. 1st Qu. Median Mean 3rd Qu. Max.
-135659 -35648 -3527 0 30791 290271
Priemer rezíduí:
mean(
residuals(model)
)[1] 1.14027e-12
Pri regresii s konštantou by mal byť priemer rezíduí veľmi blízky nule.
18 Predikcia pre nové hodnoty
Na jednoduchú ukážku predikcie sa vrátim k modelu:
Salary.in.USD ~ Year
Vypočítam predikovaný plat pre roky 2020, 2022 a 2023.
nove_udaje <- data.frame(
Year = c(
2020,
2022,
2023
)
)
nove_udaje$Predikcia <- predict(
model1,
newdata = nove_udaje
)
knitr::kable(
nove_udaje,
digits = 2,
row.names = FALSE,
col.names = c(
"Rok",
"Predikovaný plat v USD"
),
caption = "Predikcie jednoduchého regresného modelu"
)| Rok | Predikovaný plat v USD |
|---|---|
| 2020 | 64265.8 |
| 2022 | 128194.4 |
| 2023 | 160158.7 |
Ide o bodové predikcie vytvorené jednoduchým modelom.
Skutočný plat konkrétneho pracovníka môže byť výrazne odlišný, pretože plat ovplyvňuje viacero ďalších faktorov.
19 Predikcia pomocou viacnásobného modelu
Môžem vytvoriť aj konkrétny modelový príklad.
Predpokladajme Data Scientist v roku 2023:
- úroveň skúseností Senior,
- stredne veľká firma.
novy_pracovnik <- data.frame(
Year = 2023,
Experience.Level = factor(
"Senior",
levels = levels(
data_scientist$Experience.Level
)
),
Company.Size = factor(
"Medium",
levels = levels(
data_scientist$Company.Size
)
)
)
novy_pracovnik$Predikovany.plat <- predict(
model,
newdata = novy_pracovnik
)
knitr::kable(
novy_pracovnik,
digits = 2,
row.names = FALSE,
col.names = c(
"Rok",
"Skúsenosti",
"Veľkosť firmy",
"Predikovaný plat v USD"
),
caption = "Predikcia platu modelového Data Scientist"
)| Rok | Skúsenosti | Veľkosť firmy | Predikovaný plat v USD |
|---|---|---|---|
| 2023 | Senior | Medium | 174526.9 |
Táto hodnota predstavuje predikciu regresného modelu, nie istý plat, ktorý by pracovník skutočne dostal.
20 Malé cvičenia
20.1 Cvičenie 1
Ktorá premenná je v našom modeli vysvetľovaná a ktoré premenné sú vysvetľujúce?
Odpoveď:
Vysvetľovanou premennou je Salary.in.USD.
V jednoduchom modeli je vysvetľujúcou premennou Year.
Vo viacnásobnom modeli sú vysvetľujúcimi premennými:
Year,Experience.Level,Company.Size.
20.2 Cvičenie 2
Odhadnem jednoduchý model iba medzi platom a rokom.
cvicenie_model <- lm(
Salary.in.USD ~ Year,
data = data_scientist
)
summary(
cvicenie_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
20.3 Cvičenie 3
Vypíšem koeficient pri roku.
coef(
model1
)["Year"] Year
31964.29
Tento koeficient vyjadruje zmenu predikovaného platu spojenú s rozdielom jedného roku v jednoduchom modeli.
20.4 Cvičenie 4
Vytvorím predikciu pre rok 2023.
predict(
model1,
newdata = data.frame(
Year = 2023
)
) 1
160158.7
20.5 Cvičenie 5
Nájdem jedno kladné a jedno záporné rezíduum.
kladne <- porovnanie[
porovnanie$Reziduum > 0,
]
head(
kladne,
1
) Rok Skusenosti Velkost_firmy Skutocnost Predikcia Reziduum
17 2023 Senior Medium 185900 174526.9 11373.09
zaporne <- porovnanie[
porovnanie$Reziduum < 0,
]
head(
zaporne,
1
) Rok Skusenosti Velkost_firmy Skutocnost Predikcia Reziduum
5 2023 Senior Medium 140000 174526.9 -34526.91
Kladné rezíduum znamená, že skutočný plat je vyšší než predikovaný.
Záporné rezíduum znamená, že skutočný plat je nižší než predikovaný.
20.6 Cvičenie 6
Prečo z kladného koeficienta pri roku nemožno automaticky vyvodiť kauzálny vzťah?
Kladný koeficient ukazuje štatistický vzťah v našej databáze. Výšku platu však ovplyvňujú aj skúsenosti, pracovná pozícia, veľkosť firmy, krajina a ďalšie faktory.
Preto samotná regresia nedokazuje, že neskorší rok je priamou príčinou vyššieho platu.
21 Záver
V tomto cvičení som použil svoju databázu Latest Data Science Salaries a zameral som sa na pracovnú pozíciu Data Scientist.
Najskôr som pripravil údaje a skontroloval chýbajúce hodnoty.
Následne som graficky zobrazil vzťah medzi rokom a platom a pomocou funkcie lm() som odhadol jednoduchý lineárny regresný model.
Potom som model rozšíril o úroveň skúseností a veľkosť spoločnosti.
Pri regresných modeloch som pracoval s koeficientmi, hodnotou \(R^2\), predikovanými hodnotami a rezíduami.
Na záver som vytvoril predikcie pre nové hodnoty.
Toto cvičenie mi ukázalo, ako možno lineárnu regresiu využiť pri analýze pracovného trhu a platov v oblasti Data Science, čo priamo súvisí s mojou témou Moja vysnívaná kariéra: Dátový vedec.