Výpočty so svojou databázou

Lineárna regresia – Moja vysnívaná kariéra: Dátový vedec

Autor

Martin Bakič

Publikované

26. októbra 2026

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

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.Title
  • Experience.Level
  • Salary.in.USD
  • Company.Location
  • Company.Size
  • Year

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"
)
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é 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"
)
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"
)
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"
)
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"
)

Vzťah medzi rokom a platom 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"
)
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
)

Odhadnutá regresná priamka medzi rokom a platom.

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"
)
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"
)
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"
)
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"
)
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"
)
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"
)
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.