factor(), automatyczne rekodowanie), które niszczą porządek skali Likerta, i dołącz do pracy książkę kodową.Dlaczego surowy eksport z ankiety nie nadaje się do analizy?
Ankieta zamknięta, odpowiedzi pobrane – i pierwszy zgrzyt. W nagłówkach są całe pytania, zamiast liczb – słowa („Raczej się zgadzam”), kilka zaznaczonych odpowiedzi siedzi w jednej komórce, a na początku pliku wiszą Twoje próbne wypełnienia. Z takiego pliku program nie policzy ani średniej, ani rzetelności skali. Zanim zaczniesz analizę ankiety, zamień eksport w porządny zbiór danych: jedna osoba w wierszu, jedna zmienna w kolumnie, liczby zamiast tekstu i jasno oznaczone braki.
Poradnik prowadzi przez cały proces w dziewięciu krokach na przykładzie pliku z Formularzy Google (dane symulowane, do pobrania) i pokazuje, czym różni się eksport z LimeSurvey. Każdy krok wykonasz w R (gotowy kod poniżej) albo w SPSS (ścieżki menu w osobnej sekcji). Zasada nadrzędna: nie poprawiaj danych ręcznie w arkuszu – zapisuj każdy krok w skrypcie lub w składni. Ellis i Leek (2018) radzą, by osoba analizująca dane dostawała dane surowe razem z opisem wszystkich kroków wstępnego przetwarzania – tylko wtedy każdą decyzję da się sprawdzić i powtórzyć.
Jak pobrać odpowiedzi z Google Forms i LimeSurvey?
Formularze Google
Odpowiedzi pobierzesz na dwa sposoby (Google, b.d.): przez Arkusz Google – w zakładce Odpowiedzi kliknij Połącz z Arkuszami (ang. Link to Sheets), a potem w arkuszu Plik → Pobierz jako .csv albo .xlsx – albo bezpośrednio: Odpowiedzi → menu ⋮ → Pobierz odpowiedzi (.csv). Pomoc Google zaznacza, że tak pobrane odpowiedzi nie muszą być ułożone według czasu wysłania.
Pierwsza kolumna eksportu to moment wysłania formularza (w polskim arkuszu: Sygnatura czasowa), a nagłówkami pozostałych są pełne treści pytań. Siatka daje osobną kolumnę dla każdego stwierdzenia („Pytanie [stwierdzenie]”), skala liniowa zapisuje się jako liczba, a jednokrotny wybór i siatka – jako tekst etykiety. Pola wyboru trafiają do jednej komórki, rozdzielone przecinkiem i spacją, razem z tekstem z opcji „Inne”.
LimeSurvey
W LimeSurvey odpowiedzi eksportujesz z menu Eksport w części odpowiedzi i statystyk (ang. Responses & statistics → Export) – m.in. do CSV, Excela, SPSS (.sav), Staty i R (LimeSurvey, 2026). Ustaw stan ukończenia (LimeSurvey zapisuje także ankiety przerwane), odpowiedzi jako kody (wartości nadane opcjom w edytorze – najlepiej od początku 1–5) i nagłówki jako kody pytań (np. STR01), które od razu nadają się na nazwy zmiennych.
Najwygodniejszy jest eksport do pliku .sav: otwiera się bezpośrednio w SPSS lub PSPP i ma już etykiety zmiennych i wartości. Eksport do R daje składnię i plik danych, a pytania z zamkniętą listą odpowiedzi stają się czynnikami (factor) z etykietami (LimeSurvey, 2026). Sprawdź jednak kierunek skal – eksport nie wie, które pozycje są odwrócone.
| Cecha eksportu | Formularze Google | LimeSurvey |
|---|---|---|
| Formaty | CSV, przez Arkusz Google także .xlsx | CSV, Excel, SPSS (.sav), R, Stata i inne |
| Nagłówki kolumn | Pełna treść pytania | Kod pytania, tekst lub oba |
| Odpowiedzi zamknięte | Tekst etykiety (skala liniowa – liczba) | Kody albo pełne odpowiedzi |
| Wielokrotny wybór | Jedna komórka, opcje rozdzielone „, ” | Osobna kolumna dla każdej opcji |
| Etykiety dla SPSS | Brak – trzeba je nadać | Zapisane w pliku .sav |
| Ankiety przerwane | Nie zapisują się | Zapisują się – filtruj stan ukończenia |
Pobrany plik zapisz w folderze z danymi surowymi i nigdy go nie edytuj – zmiany wykonuj w kopii za pomocą skryptu. Wilson i in. (2017) zaliczają zachowanie surowych danych i zapis kroków przetwarzania w kodzie do „wystarczająco dobrych” praktyk, dostępnych także bez przygotowania informatycznego.
Zasady porządnego zbioru danych
Docelowy plik powinien mieć postać, którą Wickham (2014) nazwał danymi uporządkowanymi (ang. tidy data): każda zmienna to kolumna, każda obserwacja to wiersz, a każdy rodzaj jednostki obserwacji – osobna tabela. W ankiecie oznacza to jedną osobę w wierszu i jedną odpowiedź (albo jedną opcję pytania wielokrotnego wyboru) w kolumnie. Taki układ przyjmą bez przeróbek R, SPSS, JASP i jamovi. Broman i Woo (2018) dodają praktyczne reguły pracy z arkuszem:
- bądź konsekwentny („Kobieta”, a nie raz „kobieta”, raz „K”), a daty zapisuj jako RRRR-MM-DD;
- nie zostawiaj pustych komórek bez znaczenia i trzymaj jedną informację w komórce;
- dane to jeden prostokąt z jednym wierszem nagłówka – bez scalonych komórek i podsumowań;
- przygotuj słownik danych, nie licz niczego w pliku surowym, nie koduj informacji kolorem i zapisuj dane w plikach tekstowych (CSV).
Osobna przestroga dotyczy Excela. Ziemann i in. (2016) przeszukali artykuły z czołowych czasopism genomicznych i stwierdzili, że mniej więcej co piąty artykuł z listami genów w Excelu zawierał błędy powstałe przez automatyczną zamianę nazw genów na daty i liczby. W ankiecie ten sam mechanizm potrafi zamienić odpowiedź „1-2” w datę albo usunąć zera z kodu uczestnika („007” → 7). Plik CSV otwieraj w programie do analizy, a nie podwójnym kliknięciem w Excelu.
Kodowanie danych z ankiety krok po kroku
Van den Broeck i in. (2005) opisują czyszczenie danych jako powtarzany cykl: przesiew (szukanie podejrzanych wartości), diagnoza (błąd, brak czy prawdziwa wartość skrajna) i edycja. Reguły postępowania z błędami, brakami i wartościami skrajnymi radzą ustalić z góry – zapisz je, zanim otworzysz dane.
Przykładem jest symulowany eksport z Formularzy Google (pobierz plik CSV): 126 wierszy i 13 kolumn. Są w nim zgoda na udział, wiek, płeć, sześć stwierdzeń o stresie związanym ze studiami (siatka z pięciostopniową skalą zgody, pozycje 2 i 5 odwrócone), pytanie wielokrotnego wyboru o formy wsparcia, liczba godzin nauki wpisywana ręcznie i samopoczucie na skali liniowej 1–10. Liczby poniżej pochodzą z kodu w sekcji Przykład w R.
Krok 1. Nadaj zmiennym krótkie nazwy
Nazwa zmiennej ma być krótka i bezpieczna w każdym programie: litery bez polskich znaków, cyfry i podkreślnik, na początku litera, bez spacji. Pozycje jednej skali nazwij wspólnym przedrostkiem z numerem (str_01…str_06), a pozycje po odwróceniu oznacz przyrostkiem _r. Pełnej treści pytania nie wyrzucaj – zapisz ją jako etykietę zmiennej i w książce kodowej.
| Nagłówek w eksporcie | Nazwa zmiennej | Etykieta zmiennej |
|---|---|---|
| Sygnatura czasowa | czas | Czas wysłania formularza |
| Ile masz lat? | wiek | Wiek (lata) |
| Na ile zgadzasz się z poniższymi stwierdzeniami? [Zwykle spokojnie podchodzę do sesji egzaminacyjnej.] | str_02, po odwróceniu str_02_r | Zwykle spokojnie podchodzę do sesji egzaminacyjnej. |
| Z jakich form wsparcia korzystasz, gdy studia Cię stresują? | wsparcie → wsp_rodzina, wsp_sport… | Wsparcie: Rozmowa z rodziną itd. |
Krok 2. Usuń odpowiedzi testowe, osoby bez zgody i duplikaty
W przykładowym pliku są trzy rodzaje rekordów, których nie analizujesz: 2 próbne wypełnienia sprzed daty rozpoczęcia badania (rozpoznasz je po sygnaturze czasowej i wpisie „test”), 1 rekord osoby bez zgody („Nie wyrażam zgody” – zob. świadoma zgoda i RODO w badaniach) oraz 3 duplikaty, czyli identyczne odpowiedzi wysłane ponownie od 6 do 41 sekund po pierwszych – zwykle skutek dwukrotnego kliknięcia „Prześlij”. Po tych krokach zostaje 120 osób.
Duplikaty usuwaj ostrożnie: w krótkiej ankiecie dwie osoby mogą odpowiedzieć tak samo, więc sprawdź też odstęp czasu albo kod uczestnika. Jeśli badanie pilotażowe odbyło się na tym samym formularzu, zanotuj, do kiedy trwało. Każde wykluczenie policz – te liczby trafią do opisu próby.
Osobnym etapem jest wykrywanie odpowiedzi nieuważnych: zbyt szybkich, jednakowych w całej siatce albo niezgodnych z pytaniem kontrolnym. Ward i Meade (2023) zwracają uwagę, że ankiety internetowe są na nie szczególnie podatne. Kryteria ustal z góry (zob. nieuważne odpowiedzi w ankietach online i straightlining).
Krok 3. Zamień odpowiedzi słowne na liczby
Odpowiedzi ze skali Likerta zapisane słowami zamieniasz na liczby według jawnej mapy, w której każdej etykiecie odpowiada jeden kod – to najprostsza postać rekodowania:
| Odpowiedź w eksporcie | Poprawny kod | Kod alfabetyczny (błędny) |
|---|---|---|
| Zdecydowanie się nie zgadzam | 1 | 4 |
| Raczej się nie zgadzam | 2 | 2 |
| Ani się zgadzam, ani się nie zgadzam | 3 | 1 |
| Raczej się zgadzam | 4 | 3 |
| Zdecydowanie się zgadzam | 5 | 5 |
Ostatnia kolumna pokazuje najgroźniejszą pułapkę tego etapu. Funkcja factor() w R bez podanej kolejności poziomów i automatyczne rekodowanie w SPSS nadają kody alfabetycznie: „Ani się zgadzam…” dostaje 1, a „Zdecydowanie się nie zgadzam” – 4. Liczby mieszczą się w zakresie 1–5, więc błąd łatwo przeoczyć, ale porządek skali jest zniszczony, a każda średnia czy korelacja – bezwartościowa.
Przed rekodowaniem sprawdź, czy w danych nie ma etykiet spoza mapy: literówek, starej wersji odpowiedzi czy spacji na końcu. W przykładzie w żadnej z 720 komórek siatki (120 osób × 6 pozycji) nie było takiej etykiety. Wartości spoza mapy nie zamieniaj na brak „po cichu” – najpierw je wypisz.
Krok 4. Przekoduj pozycje odwrócone
Pozycje odwrócone są sformułowane w kierunku przeciwnym do reszty skali – zgoda ze stwierdzeniem „Zwykle spokojnie podchodzę do sesji egzaminacyjnej” oznacza mniej stresu, a nie więcej. Przed policzeniem wyniku przekoduj je według wzoru:
Dla skali 1–5 to 6 − x (1 ↔ 5, 2 ↔ 4, 3 bez zmian), dla 1–7 – 8 − x. Wynik zapisz w nowej zmiennej (str_02_r), a oryginał zostaw. Klucz odwróceń bierz z publikacji lub podręcznika narzędzia, a nie z danych.
Zapomniane odwrócenie łatwo wykryć: pozycja, której nie odwrócono, koreluje z sumą pozostałych pozycji ujemnie (rysunek 1).
Przed odwróceniem pozycje 2 i 5 korelowały z resztą skali na poziomie −.68, a alfa Cronbacha była ujemna (α = −.36). Po odwróceniu korelacje mieściły się między .70 a .76, a α = .90. Ujemna alfa sygnalizuje, że część pozycji ma kierunek przeciwny do pozostałych – zanim napiszesz w pracy o słabej spójności wewnętrznej, sprawdź klucz (więcej w poradniku o alfie Cronbacha).
Krok 5. Rozbij pytania wielokrotnego wyboru na zmienne 0/1
Pytanie z polami wyboru – kafeteria wielokrotnego wyboru – zapisuje w Formularzach Google wszystkie zaznaczenia w jednej komórce, np. „Rozmowa z przyjaciółmi, Sport, aktywność fizyczna, medytacja”. Do analizy potrzebujesz osobnej zmiennej dla każdej opcji: 1 = zaznaczono, 0 = nie zaznaczono. Osoba, która pominęła całe pytanie, dostaje braki danych, a nie same zera.
Najprostszy pomysł – podzielić tekst po przecinku – zawodzi, gdy przecinek występuje w treści opcji. W przykładzie opcja „Sport, aktywność fizyczna” rozpadła się na „Sport” i „aktywność fizyczna” (po 47 wskazań), a wpisy z pola „Inne” utworzyły trzy osobne mini-kategorie (rysunek 2).
Poprawnie jest wyszukiwać w tekście pełne etykiety opcji, a do zmiennej „inne” zaliczyć osoby, którym po usunięciu znanych etykiet został jakiś tekst. Najczęściej wskazywano rozmowę z przyjaciółmi (79 z 117 osób, które odpowiedziały na pytanie, czyli 67.5%), a 12 osób (10.3%) wpisało własną odpowiedź. Odsetki sumują się do ponad 100%, bo można było wskazać kilka opcji. Wpisy z pola „Inne” przejrzyj ręcznie i w razie potrzeby zakoduj jak odpowiedzi na pytania otwarte.
To nie to samo co kodowanie zero-jedynkowe predyktora w regresji: tam zmienna nominalna z k wykluczającymi się kategoriami daje k − 1 wskaźników, a tu każda opcja jest osobną zmienną i jedna osoba może mieć kilka jedynek. Ten krok automatyzuje procedura rekodowania pytań wielokrotnego wyboru z Formularzy Google w aplikacji SZTOS (zob. oprogramowanie naukowe).
Krok 6. Oznacz braki danych
Pusta komórka zwykle oznacza pominięte pytanie, a „nie wiem”, „nie dotyczy” czy „wolę nie odpowiadać” to inne sytuacje – nie łącz ich. Broman i Woo (2018) radzą oznaczać braki konsekwentnie jednym kodem.
- W R brak to
NA;read_csv()domyślnie zamienia na nie puste komórki, a kody w rodzaju −99 zamień samodzielnie. - W SPSS zdefiniuj kody w kolumnie Braki danych w widoku zmiennych (np. −99 = odmowa, −98 = nie dotyczy). Niezdefiniowany kod program policzy jak liczbę – jedno −99 psuje średnią.
- Nie wpisuj braku jako 0, jeśli 0 jest możliwą odpowiedzią albo zmienna wchodzi do sumy.
W przykładzie w siatce brakowało 11 odpowiedzi, a 3 osoby pominęły pytanie o wsparcie. O mechanizmach braków i ich uzupełnianiu piszemy w haśle braki danych: MCAR, MAR i MNAR i w poradniku o imputacji wielokrotnej w R.
Krok 7. Popraw liczby, daty i godziny
Pola tekstowe przynoszą liczby w różnych postaciach: „21”, „22 lata”, „2,5”, „1.5”, „3 h”. Funkcja parse_number() z pakietu readr wyciąga liczbę z tekstu („22 lata” → 22), ale przecinek traktuje jako separator tysięcy, więc z „2,5” robi 25. Najpierw zamień przecinek na kropkę, potem konwertuj, a na końcu obejrzyj minimum i maksimum – w przykładzie wiek mieścił się w przedziale 19–26 lat, a czas nauki od 1 do 5 godzin, więc nic nie wskazywało na błąd wpisu.
Data i godzina z polskiego arkusza mają postać dzień.miesiąc.rok (14.03.2026 03:18:11) – w R zamienisz je funkcją dmy_hms() z pakietu lubridate, a w plikach dla innych zapisuj je jako RRRR-MM-DD (Broman i Woo, 2018). Formularze Google zapisują tylko moment wysłania, więc nie policzysz z nich czasu wypełniania; LimeSurvey może go zapisywać po włączeniu tej opcji w ustawieniach ankiety.
Krok 8. Policz wyniki skal
Wynik skali licz po odwróceniu pozycji – jako sumę albo średnią, zgodnie z zaleceniem autora narzędzia. Średnia pozostaje w skali odpowiedzi (1–5) i łatwo ją policzyć mimo pojedynczych braków. Minimalną liczbę odpowiedzi ustal z góry: w przykładzie wynik liczono, gdy osoba odpowiedziała na co najmniej 5 z 6 pozycji. Jedna osoba odpowiedziała tylko na 4, więc nie ma wyniku skali (n = 119, M = 2.94, SD = 1.02). Suma z niepełnych odpowiedzi zaniżyłaby jej wynik.
Odpowiedź na pojedynczą pozycję Likerta jest porządkowa, a Sullivan i Artino (2013) podkreślają, że połączenie pozycji w jeden wynik trzeba uzasadnić dowodami rzetelności lub struktury skali. Dlatego obok wyniku skali podaj jej rzetelność – gotowe sformułowania znajdziesz we wzorze raportowania alfy Cronbacha.
Krok 9. Zapisz plik dla SPSS i książkę kodową
Jeśli promotor albo zespół pracuje w SPSS, zapisz gotowy zbiór jako .sav funkcją write_sav() z pakietu haven, który importuje i eksportuje pliki SPSS, Stata i SAS (Wickham i in., 2025). Przed zapisem nadaj zmiennym etykiety (treść pytania), a kodom – etykiety wartości. Pozycje odwrócone dostają odwrócone etykiety: w str_02_r wartość 1 to „Zdecydowanie się zgadzam”. Na koniec wczytaj plik ponownie i sprawdź, co zobaczy SPSS. Plik .sav otworzysz także w PSPP, JASP i jamovi.
Książka kodowa (codebook): wzór
Książka kodowa, czyli słownik danych, opisuje każdą zmienną: nazwę, treść pytania, typ, kody, braki i przekształcenia. Buchanan i in. (2021) prowadzą od surowych odpowiedzi z ankiety do udostępnionego zbioru danych z metadanymi zgodnymi z zasadami FAIR, a Arslan (2019) opisuje pakiet R codebook, który tworzy taką dokumentację automatycznie – razem z rzetelnością skal, statystykami opisowymi i wzorcami braków. Prostą wersję przygotujesz w tabeli:
| Zmienna | Pytanie lub etykieta | Typ i zakres | Kody i etykiety | Braki | Przekształcenie |
|---|---|---|---|---|---|
wiek | Ile masz lat? | liczba (lata) | – | pusta komórka | liczba z tekstu („21 lat” → 21) |
str_01 | Czuję się przytłoczony(-a) liczbą obowiązków na studiach. | porządkowa, 1–5 | 1 = Zdecydowanie się nie zgadzam … 5 = Zdecydowanie się zgadzam | pusta komórka | tekst → kod według mapy |
str_02_r | Zwykle spokojnie podchodzę do sesji egzaminacyjnej. (odwrócona) | porządkowa, 1–5 | 1 = Zdecydowanie się zgadzam … 5 = Zdecydowanie się nie zgadzam | pusta komórka | 6 − str_02 |
wsp_sport | Wsparcie: Sport, aktywność fizyczna | 0/1 | 0 = nie zaznaczono, 1 = zaznaczono | pytanie pominięte | wyszukanie pełnej etykiety w kolumnie wsparcie |
wsp_inne | Wsparcie: inne (wpisane) | 0/1 | 0 = nie, 1 = tak | pytanie pominięte | 1, gdy po usunięciu znanych opcji został tekst |
stres | Stres akademicki – wynik skali | średnia, 1–5 | wyższy wynik = silniejszy stres | mniej niż 5 odpowiedzi | średnia z str_01, str_02_r, str_03, str_04, str_05_r, str_06 |
Drugi przepis w sekcji z kodem tworzy podstawową książkę kodową (nazwa, etykieta, kody) automatycznie z etykiet zapisanych w pliku – pobierz przykład w formacie .xlsx i uzupełnij go o braki i przekształcenia. Dołącz książkę kodową do pracy jako aneks albo do repozytorium danych, jeśli udostępniasz je w duchu otwartej nauki.
Przykład w R
Dwa przepisy prowadzą od pliku CSV z Formularzy Google do gotowego pliku .sav i książki kodowej. Liczby w tekście i na rysunkach 1–2 pochodzą z tego kodu.
Czyszczenie i kodowanie (kroki 1–8)
R
library(readr); library(dplyr); library(stringr); library(lubridate)
surowe <- read_csv("odpowiedzi-google-forms.csv",
col_types = cols(.default = col_character())) # wszystko jako tekst
dim(surowe)
pytania <- names(surowe) # pełne treści pytań przydadzą się jako etykiety
# Krok 1. Krótkie nazwy zmiennych (w kolejności kolumn eksportu)
names(surowe) <- c("czas", "zgoda", "wiek", "plec", sprintf("str_%02d", 1:6),
"wsparcie", "nauka_h", "samopoczucie")
# Krok 2. Odpowiedzi testowe, brak zgody, podwójne wysłanie formularza
table(przed_startem = dmy_hms(surowe$czas) < ymd("2026-03-02"), surowe$zgoda)
dane <- surowe |>
mutate(czas = dmy_hms(czas)) |>
filter(czas >= ymd("2026-03-02"), # testy sprzed startu badania
zgoda == "Wyrażam zgodę") # osoby bez zgody kończą ankietę
sum(duplicated(select(dane, -czas))) # te same odpowiedzi wysłane ponownie
dane <- distinct(dane, pick(-czas), .keep_all = TRUE)
nrow(dane)
# Krok 3. Tekst skali Likerta -> liczby 1–5 według jawnej mapy
likert <- c("Zdecydowanie się nie zgadzam" = 1, "Raczej się nie zgadzam" = 2,
"Ani się zgadzam, ani się nie zgadzam" = 3, "Raczej się zgadzam" = 4,
"Zdecydowanie się zgadzam" = 5)
odp <- unlist(select(dane, str_01:str_06))
table(poza_mapa = !(odp %in% names(likert)) & !is.na(odp)) # literówki, inne etykiety?
data.frame(poprawny = likert, alfabetyczny = as.numeric(factor(names(likert)))) # pułapka
dane <- mutate(dane, across(str_01:str_06, \(x) unname(likert[x])))
# Krok 4. Pozycje odwrócone (2 i 5): nowa wartość = 6 - stara
dane <- mutate(dane, across(c(str_02, str_05), \(x) 6 - x, .names = "{.col}_r"))
# Krok 5. Pytanie wielokrotnego wyboru -> osobna zmienna 0/1 dla każdej opcji
opcje <- c(wsp_rodzina = "Rozmowa z rodziną", wsp_przyjaciele = "Rozmowa z przyjaciółmi",
wsp_sport = "Sport, aktywność fizyczna",
wsp_psycholog = "Pomoc psychologa lub psychoterapeuty",
wsp_brak = "Nie korzystam z żadnej formy wsparcia")
for (v in names(opcje)) dane[[v]] <- as.integer(str_detect(dane$wsparcie, fixed(opcje[[v]])))
reszta <- str_remove_all(dane$wsparcie, paste(opcje, collapse = "|"))
dane$wsp_inne <- as.integer(str_detect(reszta, "[[:alpha:]]")) # tekst wpisany w „Inne”
colSums(select(dane, starts_with("wsp_")), na.rm = TRUE)
# Krok 6. Liczby wpisane jako tekst
nauka_przyklad <- c("2", "2,5", "1.5", "3 h")
rbind(parse_number(nauka_przyklad), # „2,5” -> 25 (przecinek!)
parse_number(str_replace(nauka_przyklad, ",", "."))) # poprawnie
dane <- mutate(dane,
wiek = parse_number(wiek), # „22 lata” -> 22
nauka_h = parse_number(str_replace(nauka_h, ",", ".")),
samopoczucie = as.integer(samopoczucie),
plec = factor(plec, levels = c("Kobieta", "Mężczyzna", "Inna", "Wolę nie odpowiadać")))
# Krok 7. Wynik skali: średnia, gdy osoba odpowiedziała na co najmniej 5 z 6 pozycji
pozycje <- c("str_01", "str_02_r", "str_03", "str_04", "str_05_r", "str_06")
dane <- mutate(dane,
n_odp = rowSums(!is.na(pick(all_of(pozycje)))),
stres = if_else(n_odp >= 5, rowMeans(pick(all_of(pozycje)), na.rm = TRUE), NA))
table(dane$n_odp)
round(c(M = mean(dane$stres, na.rm = TRUE), SD = sd(dane$stres, na.rm = TRUE)), 2)
# Kontrola: korelacja pozycji z sumą pozostałych i alfa Cronbacha przed i po odwróceniu
r_reszta <- function(d) sapply(names(d), \(v) cor(d[[v]], rowSums(d[setdiff(names(d), v)]),
use = "complete.obs"))
alfa <- function(d) { d <- na.omit(d); k <- ncol(d)
k / (k - 1) * (1 - sum(sapply(d, var)) / var(rowSums(d))) }
przed <- select(dane, str_01:str_06); po <- select(dane, all_of(pozycje))
round(rbind(przed = unname(r_reszta(przed)), po = unname(r_reszta(po))), 2)
round(c(alfa_przed = alfa(przed), alfa_po = alfa(po)), 2)
# Przed i po: ta sama osoba
surowe |> filter(czas == "14.03.2026 03:18:11") |> select(wiek, str_02, wsparcie, nauka_h) |> glimpse()
dane |> filter(czas == dmy_hms("14.03.2026 03:18:11")) |>
select(wiek, str_02, str_02_r, wsp_przyjaciele, wsp_sport, wsp_inne, nauka_h, stres) |> glimpse()Wynik w R
[1] 126 13
przed_startem Nie wyrażam zgody Wyrażam zgodę
FALSE 1 123
TRUE 0 2
[1] 3
[1] 120
poza_mapa
FALSE
720
poprawny alfabetyczny
Zdecydowanie się nie zgadzam 1 4
Raczej się nie zgadzam 2 2
Ani się zgadzam, ani się nie zgadzam 3 1
Raczej się zgadzam 4 3
Zdecydowanie się zgadzam 5 5
wsp_rodzina wsp_przyjaciele wsp_sport wsp_psycholog wsp_brak
53 79 47 15 10
wsp_inne
12
[,1] [,2] [,3] [,4]
[1,] 2 25.0 1.5 3
[2,] 2 2.5 1.5 3
4 5 6
1 9 110
M SD
2.94 1.02
[,1] [,2] [,3] [,4] [,5] [,6]
przed 0.38 -0.68 0.33 0.39 -0.68 0.31
po 0.72 0.76 0.70 0.76 0.75 0.70
alfa_przed alfa_po
-0.36 0.90
Rows: 1
Columns: 4
$ wiek <chr> "21 lat"
$ str_02 <chr> "Zdecydowanie się zgadzam"
$ wsparcie <chr> "Rozmowa z przyjaciółmi, Sport, aktywność fizyczna, medytacja"
$ nauka_h <chr> "2,5"
Rows: 1
Columns: 8
$ wiek <dbl> 21
$ str_02 <dbl> 5
$ str_02_r <dbl> 1
$ wsp_przyjaciele <int> 1
$ wsp_sport <int> 1
$ wsp_inne <int> 1
$ nauka_h <dbl> 2.5
$ stres <dbl> 2Zapis do SPSS (.sav) i książka kodowa (krok 9)
R
library(haven)
etykiety_r <- sort(setNames(6 - likert, names(likert))) # pozycje odwrócone: 1 = „Zdecydowanie się zgadzam”
sav <- dane |>
select(wiek, plec, all_of(pozycje), starts_with("wsp_"), nauka_h, samopoczucie, stres) |>
mutate(across(c(str_01, str_03, str_04, str_06), \(x) labelled(x, likert)),
across(c(str_02_r, str_05_r), \(x) labelled(x, etykiety_r)),
across(starts_with("wsp_"), \(x) labelled(x, c("nie zaznaczono" = 0L, "zaznaczono" = 1L))))
tresc <- str_match(pytania[5:10], "\\[(.*)\\]")[, 2] # treść stwierdzeń z nagłówków eksportu
etykiety <- c(wiek = "Wiek (lata)", plec = "Płeć", setNames(tresc, pozycje),
setNames(paste("Wsparcie:", c(opcje, "inne (wpisane)")), c(names(opcje), "wsp_inne")),
nauka_h = "Nauka: godziny dziennie", samopoczucie = "Samopoczucie (1–10)",
stres = "Stres akademicki: średnia z 6 pozycji (min. 5 odpowiedzi)")
etykiety[c("str_02_r", "str_05_r")] <- paste(etykiety[c("str_02_r", "str_05_r")], "(odwrócona)")
for (v in names(etykiety)) attr(sav[[v]], "label") <- etykiety[[v]]
write_sav(sav, "stres-studia.sav")
spr <- read_sav("stres-studia.sav") # kontrola: co zobaczy SPSS?
attr(spr$str_02_r, "label")
print_labels(spr$str_02_r)
ksiazka <- tibble(zmienna = names(spr),
etykieta = sapply(spr, \(x) attr(x, "label") %||% ""),
wartosci = sapply(spr, \(x) { l <- attr(x, "labels")
if (is.null(l)) "" else paste(l, names(l), sep = " = ", collapse = "; ") }))
writexl::write_xlsx(ksiazka, "ksiazka-kodowa.xlsx")
ksiazka |> slice(c(2, 4, 9)) |> glimpse()Wynik w R
[1] "Zwykle spokojnie podchodzę do sesji egzaminacyjnej. (odwrócona)"
Labels:
value label
1 Zdecydowanie się zgadzam
2 Raczej się zgadzam
3 Ani się zgadzam, ani się nie zgadzam
4 Raczej się nie zgadzam
5 Zdecydowanie się nie zgadzam
Rows: 3
Columns: 3
$ zmienna <chr> "plec", "str_02_r", "wsp_rodzina"
$ etykieta <chr> "Płeć", "Zwykle spokojnie podchodzę do sesji egzaminacyjnej. …
$ wartosci <chr> "1 = Kobieta; 2 = Mężczyzna; 3 = Inna; 4 = Wolę nie odpowiada…Bibliografia oprogramowania
Wyniki na tej stronie pochodzą z uruchomienia pokazanego kodu w R 4.5.3; rysunki przygotowano w pakiecie ggplot2. W pracy podaj wersje faktycznie użytych pakietów (sessionInfo()).
- R: R Core Team. (2026). R: A language and environment for statistical computing (Version 4.5.3) [Computer software]. R Foundation for Statistical Computing. https://www.R-project.org/
- readr (wersja 2.2.0): Wickham, H., Hester, J., & Bryan, J. (2026). readr: Read rectangular text data [R package]. https://doi.org/10.32614/CRAN.package.readr
- dplyr (wersja 1.2.0): Wickham, H., François, R., Henry, L., Müller, K., & Vaughan, D. (2026). dplyr: A grammar of data manipulation [R package]. https://doi.org/10.32614/CRAN.package.dplyr
- stringr (wersja 1.6.0): Wickham, H. (2025). stringr: Simple, consistent wrappers for common string operations [R package]. https://doi.org/10.32614/CRAN.package.stringr
- lubridate (wersja 1.9.5): Grolemund, G., & Wickham, H. (2011). Dates and times made easy with lubridate. Journal of Statistical Software, 40(3), 1–25. https://www.jstatsoft.org/v40/i03/
- haven (wersja 2.5.5): Wickham, H., Miller, E., & Smith, D. (2025). haven: Import and export 'SPSS', 'Stata' and 'SAS' files [R package]. https://doi.org/10.32614/CRAN.package.haven
- writexl (wersja 1.5.4): Ooms, J. (2025). writexl: Export data frames to Excel 'xlsx' format [R package]. https://doi.org/10.32614/CRAN.package.writexl
- ggplot2 (wersja 4.0.2): Wickham, H. (2016). ggplot2: Elegant graphics for data analysis. Springer. https://ggplot2.tidyverse.org
To samo w SPSS: ścieżki menu
Każdy krok wykonasz też w SPSS. Nazwy poleceń podajemy w polskiej wersji programu, a w nawiasie – w angielskiej.
- Import: Plik → Importuj dane → Dane CSV (File → Import Data → CSV Data) z kodowaniem UTF-8; nazwy i etykiety wpiszesz w widoku zmiennych (Variable View).
- Wykluczenia: Dane → Wybierz obserwacje (Data → Select Cases); duplikaty oznaczy Dane → Identyfikuj duplikaty obserwacji (Data → Identify Duplicate Cases).
- Tekst → liczby: Przekształcenia → Rekoduj na inne zmienne (Transform → Recode into Different Variables), przycisk Wartości stare i nowe: stara wartość to dokładny tekst etykiety, nowa – kod. Wynik sprawdź tabelą krzyżową starej i nowej zmiennej.
- Automatyczne rekodowanie (Przekształcenia → Automatyczne rekodowanie, Transform → Automatic Recode) nadaje kody alfabetycznie – użyj go do zmiennych nominalnych, nie do skal.
- Pozycje odwrócone: Rekoduj na inne zmienne (1→5, 2→4, 3→3, 4→2, 5→1) albo Przekształcenia → Oblicz wartości (Transform → Compute Variable) z wyrażeniem
6 - str_02. - Wielokrotny wybór: Oblicz wartości z wyrażeniem
CHAR.INDEX(wsparcie, 'Sport, aktywność fizyczna') > 0(1 = opcję zaznaczono; osobom, które pominęły pytanie, przypisz brak). Częstości opcji policzysz w Analiza → Odpowiedzi wielokrotne (Analyze → Multiple Response). - Braki i wynik skali: kody braków wpisz w kolumnie Braki danych (Missing), a wynik policz w Oblicz wartości wyrażeniem
MEAN.5(str_01, str_02_r, str_03, str_04, str_05_r, str_06)– średnia powstanie tylko u osób z co najmniej 5 ważnymi odpowiedziami.
W każdym oknie zamiast OK kliknij Wklej (Paste) – SPSS zapisze polecenie w pliku składni, który uruchomisz ponownie i dołączysz do dokumentacji. Wcześniejsze etapy opisujemy w poradniku jak zrobić ankietę do pracy dyplomowej, a pytania demograficzne – w haśle metryczka.
Jak opisać przygotowanie danych w pracy
W rozdziale Metoda – w części o procedurze albo o analizie danych – napisz, skąd pochodzą dane, kogo wykluczono i dlaczego, jak zakodowano odpowiedzi i jak policzono wyniki skal. Opis dla przykładu z tego wpisu:
Liczby wykluczeń przenieś też do opisu próby (zob. jak opisać charakterystykę próby), a akapit wpasuj w rozdział metodologiczny.
Najczęstsze błędy
- Ręczne poprawki w Excelu – nie da się ich odtworzyć, a Excel potrafi sam zamienić odpowiedzi w daty (Ziemann i in., 2016).
- Kody alfabetyczne dla skali Likerta –
factor()bez podanej kolejności i automatyczne rekodowanie w SPSS układają etykiety alfabetycznie, a nie według skali. - Nieodwrócone pozycje – objawy to ujemne korelacje pozycji z resztą skali i niska albo ujemna alfa Cronbacha.
- Podział wielokrotnych odpowiedzi po przecinku, gdy przecinek jest w treści opcji, oraz zera zamiast braków u osób, które pominęły pytanie.
- Kod braku policzony jak liczba – −99 niezdefiniowane jako brak w SPSS albo pozostawione w danych w R.
- Zmiany w formularzu w trakcie badania – ta sama odpowiedź występuje potem w dwóch wersjach, a pytanie usunięte i dodane ponownie tworzy nową kolumnę. Zapisz datę zmiany i ujednolij kody.
- Brak dokumentacji – bez książki kodowej i skryptu nikt, także Ty za pół roku, nie odtworzy wyników.
Najczęstsze pytania
Jak przenieść dane z Google Forms do SPSS?
Pobierz odpowiedzi jako CSV (Odpowiedzi → ⋮ → Pobierz odpowiedzi) albo połącz formularz z Arkuszem Google i pobierz plik .xlsx. W SPSS wybierz Plik → Importuj dane → Dane CSV z kodowaniem UTF-8, nadaj krótkie nazwy zmiennych i zrekoduj odpowiedzi słowne na liczby (Przekształcenia → Rekoduj na inne zmienne). Możesz też przygotować dane w R i zapisać je jako .sav funkcją haven::write_sav().
Jak zamienić odpowiedzi tekstowe ze skali Likerta na liczby?
Przygotuj mapę, w której każdej etykiecie (np. „Raczej się zgadzam”) odpowiada jeden kod (4), i zrekoduj według niej wszystkie pozycje – w R nazwanym wektorem, w SPSS poleceniem Rekoduj na inne zmienne. Nie używaj automatycznego rekodowania ani factor() bez podanej kolejności poziomów, bo nadają kody alfabetycznie i niszczą porządek skali.
Jak zakodować pytanie wielokrotnego wyboru z Google Forms?
Utwórz osobną zmienną 0/1 dla każdej opcji: 1, gdy pełna etykieta opcji występuje w komórce, 0, gdy nie. Nie dziel tekstu po przecinku, bo przecinek bywa częścią opcji. Osobie, która pominęła pytanie, wpisz brak danych, a tekst z pola „Inne” zakoduj w osobnej zmiennej.
Jak odwrócić pozycję w skali 1–5?
Użyj wzoru (min + max) − x, czyli 6 − x: 1 zamienia się w 5, 2 w 4, a 3 zostaje bez zmian. Dla skali 1–7 to 8 − x. Wynik zapisz w nowej zmiennej (np. str_02_r), a w pliku SPSS odwróć też etykiety wartości.
Czy z LimeSurvey eksportować kody odpowiedzi czy pełne odpowiedzi?
Do analizy wybierz kody odpowiedzi i kody pytań jako nagłówki – najlepiej w formacie SPSS (.sav), który zawiera etykiety zmiennych i wartości. Pełne odpowiedzi przydają się do czytania i kontroli, ale tekst i tak trzeba by potem rekodować.
Co to jest książka kodowa i czy dołączyć ją do pracy?
Książka kodowa opisuje każdą zmienną w pliku: nazwę, treść pytania, typ, kody i ich znaczenie, kody braków oraz przekształcenia. Dołącz ją jako aneks albo do repozytorium danych – dzięki niej promotor, recenzent i Ty sam odtworzycie analizę.
Powiązane hasła
Przeczytaj też
Analiza ankiety do pracy licencjackiej i magisterskiej
Analiza ankiety do pracy dyplomowej: przygotowanie bazy, kodowanie pytań, skale, testy, modele i raport wyników do licencjatu lub magisterki.
Czytaj →PoradnikNieuważne odpowiedzi w ankietach online
Jak wykryć straightlining, losowe klikanie i speeding: longstring, IRV, D² Mahalanobisa i pytania kontrolne w R, reguła wykluczeń i opis w APA.
Czytaj →PoradnikBraki danych i imputacja wielokrotna w R
MCAR, MAR i MNAR, test Little’a, symulacja metod i imputacja wielokrotna w R krok po kroku – z kodem, regułami Rubina i gotowym opisem APA.
Czytaj →Potrzebujesz wsparcia w analizie danych?
Wybierz ofertę dopasowaną do pracy dyplomowej albo profesjonalnego projektu naukowego.
Wyceń analizęOferta dla studentówBibliografia i dalsza literatura naukowa (APA 7)
- Arslan, R. C. (2019). How to automatically document data with the codebook package to facilitate data reuse. Advances in Methods and Practices in Psychological Science, 2(2), 169–187. https://doi.org/10.1177/2515245919838783 ● Otwarty dostęp
- Broman, K. W., & Woo, K. H. (2018). Data organization in spreadsheets. The American Statistician, 72(1), 2–10. https://doi.org/10.1080/00031305.2017.1375989 ● Otwarty dostęp: pełny tekst
- Buchanan, E. M., Crain, S. E., Cunningham, A. L., Johnson, H. R., Stash, H., Papadatou-Pastou, M., Isager, P. M., Carlsson, R., & Aczel, B. (2021). Getting started creating data dictionaries: How to create a shareable data set. Advances in Methods and Practices in Psychological Science, 4(1), Article 2515245920928007. https://doi.org/10.1177/2515245920928007 ● Otwarty dostęp
- Ellis, S. E., & Leek, J. T. (2018). How to share data for collaboration. The American Statistician, 72(1), 53–57. https://doi.org/10.1080/00031305.2017.1375987 ● Otwarty dostęp: pełny tekst
- Google. (b.d.). View & manage form responses. Google Docs Editors Help. Pobrano 15 października 2026 z https://support.google.com/docs/answer/139706 ● Otwarty dostęp
- LimeSurvey. (2026). Export responses. LimeSurvey Manual. https://manual.limesurvey.org/Export_responses ● Otwarty dostęp
- Sullivan, G. M., & Artino, A. R., Jr. (2013). Analyzing and interpreting data from Likert-type scales. Journal of Graduate Medical Education, 5(4), 541–542. https://doi.org/10.4300/JGME-5-4-18 ● Otwarty dostęp
- Van den Broeck, J., Argeseanu Cunningham, S., Eeckels, R., & Herbst, K. (2005). Data cleaning: Detecting, diagnosing, and editing data abnormalities. PLoS Medicine, 2(10), Article e267. https://doi.org/10.1371/journal.pmed.0020267 ● Otwarty dostęp
- Ward, M. K., & Meade, A. W. (2023). Dealing with careless responding in survey data: Prevention, identification, and recommended best practices. Annual Review of Psychology, 74(1), 577–596. https://doi.org/10.1146/annurev-psych-040422-045007 ● Otwarty dostęp
- Wickham, H. (2014). Tidy data. Journal of Statistical Software, 59(10), 1–23. https://doi.org/10.18637/jss.v059.i10 ● Otwarty dostęp
- Wickham, H., Miller, E., & Smith, D. (2025). haven: Import and export 'SPSS', 'Stata' and 'SAS' files (Version 2.5.5) [R package]. https://doi.org/10.32614/CRAN.package.haven ● Otwarty dostęp
- Wilson, G., Bryan, J., Cranston, K., Kitzes, J., Nederbragt, L., & Teal, T. K. (2017). Good enough practices in scientific computing. PLOS Computational Biology, 13(6), Article e1005510. https://doi.org/10.1371/journal.pcbi.1005510 ● Otwarty dostęp
- Ziemann, M., Eren, Y., & El-Osta, A. (2016). Gene name errors are widespread in the scientific literature. Genome Biology, 17(1), Article 177. https://doi.org/10.1186/s13059-016-1044-7 ● Otwarty dostęp
Cytowania BibTeX
@article{arslan2019how, author={Arslan, Ruben C.}, title={{How to automatically document data with the codebook package to facilitate data reuse}}, journal={Advances in Methods and Practices in Psychological Science}, year={2019}, volume={2}, number={2}, pages={169--187}, doi={10.1177/2515245919838783}}@article{broman2018data, author={Broman, Karl W. and Woo, Kara H.}, title={{Data organization in spreadsheets}}, journal={The American Statistician}, year={2018}, volume={72}, number={1}, pages={2--10}, doi={10.1080/00031305.2017.1375989}}@article{buchanan2021getting, author={Buchanan, Erin M. and Crain, Sarah E. and Cunningham, Ari L. and Johnson, Hannah R. and Stash, Hannah and Papadatou-Pastou, Marietta and Isager, Peder M. and Carlsson, Rickard and Aczel, Balazs}, title={{Getting started creating data dictionaries: How to create a shareable data set}}, journal={Advances in Methods and Practices in Psychological Science}, year={2021}, volume={4}, number={1}, eid={2515245920928007}, doi={10.1177/2515245920928007}}@article{ellis2018how, author={Ellis, Shannon E. and Leek, Jeffrey T.}, title={{How to share data for collaboration}}, journal={The American Statistician}, year={2018}, volume={72}, number={1}, pages={53--57}, doi={10.1080/00031305.2017.1375987}}@misc{googlendview, author={{Google}}, title={{View \& manage form responses}}, howpublished={Google Docs Editors Help}, url={https://support.google.com/docs/answer/139706}}@misc{limesurvey2026export, author={{LimeSurvey}}, title={{Export responses}}, howpublished={LimeSurvey Manual}, year={2026}, url={https://manual.limesurvey.org/Export_responses}}@article{sullivan2013analyzing, author={Sullivan, Gail M. and Artino, Jr., Anthony R.}, title={{Analyzing and interpreting data from Likert-type scales}}, journal={Journal of Graduate Medical Education}, year={2013}, volume={5}, number={4}, pages={541--542}, doi={10.4300/jgme-5-4-18}}@article{vandenbroeck2005data, author={Van den Broeck, Jan and Argeseanu Cunningham, Solveig and Eeckels, Roger and Herbst, Kobus}, title={{Data cleaning: Detecting, diagnosing, and editing data abnormalities}}, journal={PLoS Medicine}, year={2005}, volume={2}, number={10}, eid={e267}, doi={10.1371/journal.pmed.0020267}}@article{ward2023dealing, author={Ward, M. K. and Meade, Adam W.}, title={{Dealing with careless responding in survey data: Prevention, identification, and recommended best practices}}, journal={Annual Review of Psychology}, year={2023}, volume={74}, number={1}, pages={577--596}, doi={10.1146/annurev-psych-040422-045007}}@article{wickham2014tidy, author={Wickham, Hadley}, title={{Tidy data}}, journal={Journal of Statistical Software}, year={2014}, volume={59}, number={10}, pages={1--23}, doi={10.18637/jss.v059.i10}}@misc{wickham2025haven, author={Wickham, Hadley and Miller, Evan and Smith, Danny}, title={{haven: Import and export 'SPSS', 'Stata' and 'SAS' files (R package version 2.5.5) [Computer software]}}, year={2025}, doi={10.32614/cran.package.haven}}@article{wilson2017good, author={Wilson, Greg and Bryan, Jennifer and Cranston, Karen and Kitzes, Justin and Nederbragt, Lex and Teal, Tracy K.}, title={{Good enough practices in scientific computing}}, journal={PLOS Computational Biology}, year={2017}, volume={13}, number={6}, eid={e1005510}, doi={10.1371/journal.pcbi.1005510}}@article{ziemann2016gene, author={Ziemann, Mark and Eren, Yotam and El-Osta, Assam}, title={{Gene name errors are widespread in the scientific literature}}, journal={Genome Biology}, year={2016}, volume={17}, number={1}, eid={177}, doi={10.1186/s13059-016-1044-7}}