Prace dyplomowe · Ankieta

Analiza treści pytań otwartych w ankiecie krok po kroku

Jak zamienić odpowiedzi tekstowe w kategorie, które da się policzyć: jednostka analizy, klucz kategoryzacji z regułami granicznymi, pilotaż, zgodność dwóch koderów (kappa w każdej kategorii), odsetki z przedziałem Wilsona, porównanie grup, opis APA i kod R.

Strona główna / Blog / Analiza treści pytań otwartych
W skrócie: Analiza treści zamienia odpowiedzi na pytanie otwarte w kategorie z kluczem kategoryzacji: definicją, przykładem i regułą dla przypadków granicznych. Klucz sprawdź w pilotażu na kilkudziesięciu odpowiedziach, a potem zakoduj wszystko niezależnie we dwoje i podaj odsetek zgodności oraz kappę Cohena osobno dla każdej kategorii. Odsetki licz z liczby osób, które odpowiedziały, podawaj z 95% przedziałem Wilsona i zawsze wskazuj mianownik.

Kiedy odpowiedzi otwarte wymagają analizy treści

Ankieta do pracy dyplomowej prawie zawsze kończy się polem tekstowym: „Co jeszcze chcesz dodać?”, „Dlaczego?”, „Co należałoby zmienić?”. Po zebraniu danych okazuje się, że jest tam 150 albo 400 wypowiedzi o różnej długości i jakości. Część to jedno słowo, część to akapit, część nie odpowiada na pytanie. Najprostsza reakcja, czyli wklejenie kilku „ciekawych” cytatów do rozdziału wyników, rzadko przekonuje promotora i recenzenta. Nie wiadomo bowiem, jak często dana myśl się powtarzała ani dlaczego wybrano akurat te cytaty.

Analiza treści (ang. content analysis) zamienia swobodne wypowiedzi w kategorie, które da się policzyć, porównać i opisać w sposób powtarzalny. Wytyczne GESIS opisują ją jako podstawową metodę opracowania pytań otwartych w ankietach, obok komputerowej analizy słownikowej i analizy współwystępowania (Züll, 2016). Singer i Couper (2017) zwracają uwagę, że odpowiedzi otwarte w badaniach ilościowych pokazują nie tylko treść opinii, ale też to, jak respondenci rozumieją pytanie. Bywają więc cenne także wtedy, gdy nie są głównym celem badania.

Samą czynność przypisywania wypowiedzi do kategorii omawiamy w haśle kodowanie odpowiedzi otwartych. Ten poradnik prowadzi przez całą analizę na jednym przykładzie. Zaczynamy od przygotowania danych i klucza kategoryzacji, potem pokazujemy pilotaż i zgodność dwóch koderek w każdej kategorii, a na końcu liczenie odsetków z przedziałami ufności, porównanie grup, opis w pracy i kod R.

Trzy podejścia do analizy treści

Hsieh i Shannon (2005) wyróżniają trzy odmiany jakościowej analizy treści. Różnią się tym, skąd pochodzą kategorie:

Trzy podejścia do analizy treści według Hsieh i Shannon: skąd pochodzą kategorie i kiedy je stosować w ankiecie
PodejścieSkąd kategorieKiedy w ankiecie
Konwencjonalne (indukcyjne)Z samych odpowiedzi, po ich przeczytaniuPytanie eksploracyjne, mało wcześniejszych badań, np. „Co Cię zniechęca…?”
Ukierunkowane (dedukcyjne)Z teorii lub wcześniejszych badań; nowe kategorie dopisuje się w razie potrzebyGdy chcesz sprawdzić, czy znana typologia (np. barier, motywów) pasuje do Twojej grupy
SumacyjneZ listy słów lub treści, które się liczy, a potem interpretuje w kontekścieGdy interesuje Cię częstość konkretnych określeń, np. nazw usług czy objawów

Elo i Kyngäs (2008) opisują wariant indukcyjny i dedukcyjny jako ten sam proces w trzech fazach: przygotowanie, organizowanie i raportowanie. Według nich podejście indukcyjne pasuje do zjawisk słabo opisanych w literaturze, a dedukcyjne do sprawdzania wcześniejszej teorii w nowej sytuacji. W pracy dyplomowej często łączy się oba podejścia. Klucz startowy budujesz z literatury, a kategorie, których w niej nie było, dopisujesz po lekturze odpowiedzi. Napisz w rozdziale metodologicznym wprost, które podejście wybrałeś(-aś).

Ten poradnik dotyczy analizy treści, której wynikiem są liczby: liczebności kategorii, odsetki i porównania grup. Gdy pracujesz z długimi wywiadami i celem jest interpretacja znaczeń, a nie liczenie, potrzebujesz metod jakościowych w ścisłym sensie. Wtedy połączenie obu części opisujemy we wpisie badania mieszane (mixed methods) – schematy i opis.

Badanie przykładowe: bariery w korzystaniu z pomocy psychologicznej

Studentka psychologii przeprowadziła ankietę internetową wśród 320 osób studiujących (208 kobiet i 112 mężczyzn; dane symulowane). Oprócz skal i pytań zamkniętych ankieta zawierała jedno nieobowiązkowe pytanie otwarte:

„Co najbardziej zniechęca Cię do skorzystania z pomocy psychologicznej na uczelni?”

Odpowiedziały na nie 184 osoby (57.5%). Odpowiedzi kodowały niezależnie dwie osoby, autorka pracy i koleżanka z seminarium, według wspólnego klucza z dziewięcioma kategoriami. Jedna odpowiedź mogła dostać do trzech kodów, bo wiele osób wymieniało kilka powodów naraz, np. wstyd i terminy. Dane z kodami obu koderek i klucz kategoryzacji możesz pobrać jako plik Excel. Arkusz klucz zawiera definicje i reguły graniczne, a arkusz odpowiedzi zawiera teksty, kody koderki A i B oraz kod ostateczny.

Schemat ośmiu etapów analizy treści pytania otwartego: przygotowanie odpowiedzi, wstępny klucz, pilotaż kodowania przez dwie osoby, poprawa klucza z pętlą powrotu do pilotażu, kodowanie wszystkich odpowiedzi od nowa, zgodność kappa w każdej kategorii, rozstrzygnięcie rozbieżności oraz liczenie kategorii z 95% CI i cytatami
Rysunek 1. Etapy analizy treści pytania otwartego w ankiecie. Najważniejsza jest pętla między pilotażem a poprawą klucza. Klucz zmieniasz przed kodowaniem właściwym, a nie w jego trakcie.

Krok 1. Przygotuj odpowiedzi i ustal jednostkę analizy

Eksport z Google Forms czy LimeSurvey daje kolumnę tekstu, której nie wolno jeszcze analizować. Najpierw zdecyduj o trzech sprawach.

  • Co jest jednostką analizy. W ankiecie zwykle jest nią cała odpowiedź jednej osoby. Dzięki temu możesz potem napisać „33.2% osób wspomniało o wstydzie”. Przy długich wypowiedziach można dzielić tekst na fragmenty (zdania, wątki), ale wtedy liczysz wzmianki, a nie osoby. Campbell i in. (2013) pokazują, że przy kodowaniu wywiadów ujednolicenie jednostek tekstu jest pierwszym warunkiem sensownej zgodności koderów. Jeśli każda osoba podzieli tekst inaczej, nie da się porównać ich kodów.
  • Co z odpowiedziami pustymi i nie na temat. Puste pole to brak odpowiedzi, a nie kategoria. Odpowiedzi „nie wiem”, „-”, „brak” czy „nic” rozdziel. „Nic mnie nie zniechęca” jest merytoryczną odpowiedzią i dostaje osobny kod. „Nie wiem” albo kreska to brak treści, który możesz wyłączyć z mianownika, ale musisz podać jego liczbę.
  • Czy jedna odpowiedź może mieć kilka kodów. Jeśli tak, zapisuj kody jako osobne kolumny 0/1, tak jak odpowiedzi w pytaniu wielokrotnego wyboru, a nie jako jedną kolumnę z tekstem „WSTYD, TERMINY”.

Na tym etapie usuń też z tekstów dane, które pozwalają rozpoznać osobę: nazwiska prowadzących, nazwy małych grup, opisy zdarzeń. Odpowiedzi otwarte częściej niż pytania zamknięte zawierają informacje identyfikujące, dlatego w pliku dla drugiej koderki i w aneksie stosuj zasady z hasła anonimizacja i pseudonimizacja danych. Jak wyeksportować dane z formularza i nadać kolumnom nazwy, pokazujemy we wpisie dane z Google Forms i LimeSurvey do SPSS i R.

Zanim zaczniesz kodować, sprawdź, kto w ogóle odpowiedział. W przykładzie pole wypełniło 62.0% kobiet i 49.1% mężczyzn, χ²(1, N = 320) = 4.97, p = .026, φ = .12. To typowe: na pytania otwarte chętniej odpowiadają osoby bardziej zaangażowane w temat. Wszystkie odsetki z dalszej analizy opisują więc osoby, które coś napisały, a nie całą próbę. Mechanizm ten przypomina błąd braku odpowiedzi w całej ankiecie.

Krok 2. Zbuduj klucz kategoryzacji

Klucz kategoryzacji (ang. codebook) to instrukcja, dzięki której dwie osoby, które nigdy nie rozmawiały o danych, przypiszą tej samej odpowiedzi te same kody. Przeczytaj 40–60 odpowiedzi, wypisz powtarzające się wątki i zgrupuj je. Potem każdą kategorię opisz w pięciu polach.

  1. Kod: krótka nazwa bez polskich znaków, wygodna w R i SPSS (np. POUFNOSC).
  2. Nazwa: to, co pojawi się w tabeli wyników.
  3. Definicja: jedno lub dwa zdania o tym, co należy do kategorii.
  4. Przykład: typowa odpowiedź z danych.
  5. Reguła graniczna: jak kodować odpowiedzi pasujące do dwóch kategorii.

Kategorie powinny być rozłączne, bo żadna wypowiedź nie może pasować do dwóch definicji jednocześnie. Muszą też być wyczerpujące, czyli każda odpowiedź musi gdzieś trafić, choćby do „inne”. Ważny jest też poziom szczegółowości. Dziewięć kategorii przy 184 odpowiedziach to rozsądna liczba. Trzydzieści kategorii z kilkoma osobami w każdej daje tabelę, której nie da się zinterpretować, a kappa w rzadkich kategoriach jest bardzo niestabilna. Gotowy klucz zapisz w książce kodowej razem z kodami zmiennych zamkniętych.

Fragment klucza kategoryzacji: kod, definicja i reguła graniczna dla pięciu kategorii barier
KodDefinicjaReguła graniczna
WSTYDWstyd, lęk przed oceną innych osób lub przed byciem uznanym za „słabego”„Boję się, że ktoś się dowie” bez wskazania uczelni lub dokumentów → WSTYD
POUFNOSCObawa, że informacja o wizycie lub treść rozmowy trafi do uczelni, prowadzących albo do aktGdy osoba wskazuje, kto mógłby się dowiedzieć (dziekanat, prowadzący, system) → POUFNOSC
TERMINYBariery po stronie poradni: kolejki, godziny przyjęć, liczba specjalistów„Terminy w godzinach zajęć” → TERMINY, bo problem leży w ofercie poradni
CZASBariery po stronie osoby: brak czasu z powodu zajęć, pracy, dojazdów„Nie mam czasu” bez wzmianki o godzinach poradni → CZAS
ZAUFANIEWątpliwości co do skuteczności pomocy, złe doświadczenia, brak zaufania do kompetencji„To nic nie da” → ZAUFANIE, a nie SAMODZIELNOSC

Pozostałe kategorie w przykładzie to INFO (brak informacji, gdzie i jak się zapisać), SAMODZIELNOSC („poradzę sobie sam(a)”, „inni mają gorzej”), BRAK („nic mnie nie zniechęca”, kod wyłączny, którego nie łączy się z innymi) oraz INNE. Pełny klucz jest w pliku do pobrania. Zwróć uwagę na pary kategorii, które łatwo pomylić: wstyd i poufność, terminy i brak czasu, „poradzę sobie” i wątpliwości co do skuteczności. Właśnie dla nich reguły graniczne są najważniejsze. Jak pokaże pilotaż, w pierwszej wersji klucza ich brakowało.

Krok 3. Pilotaż kodowania i poprawa klucza

Pierwsza wersja klucza prawie nigdy nie jest dobra. Zanim zakodujesz wszystko, poproś drugą osobę o niezależne zakodowanie niewielkiej części odpowiedzi. Druga osoba nie może przy tym widzieć Twoich kodów. W przykładzie obie koderki zakodowały 40 pierwszych odpowiedzi według klucza w wersji 1, który miał tylko nazwy i krótkie definicje.

Ten sam zestaw kodów dla całej odpowiedzi miały w 57.5% przypadków. Średnia kappa z kategorii (bez rzadkiej kategorii „inne”) wyniosła .70, ale za tą średnią kryły się duże różnice. Kategorie z wyraźnymi słowami kluczowymi, takie jak brak informacji (κ = .91), wstyd (κ = .86) i terminy (κ = .83), kodowały podobnie. Najsłabiej wypadły wątpliwości co do skuteczności (κ = .28), obawa o poufność (κ = .53), brak czasu (κ = .57) i „poradzę sobie sam(a)” (κ = .63). Te cztery kategorie są dokładnie tymi, które mają „sąsiada”, z którym łatwo je pomylić. Przy wątpliwościach co do skuteczności koderki zgodziły się w 90.0% decyzji tak/nie, a kappa była mimo to bardzo niska. Do tego paradoksu wrócimy w kroku 4.

Po pilotażu koderki omówiły wszystkie rozbieżności i dopisały do klucza reguły graniczne z tabeli wyżej. Tak wygląda praktyczny sens oceny zgodności. O’Connor i Joffe (2020) przyznają, że liczenie zgodności koderów budzi w badaniach jakościowych spory. Wskazują jednak, że zwiększa ono systematyczność i przejrzystość kodowania i pomaga zespołowi dopracować kategorie. Campbell i in. (2013) opisują tę samą logikę jako poprawianie klucza w kolejnych rundach, aż błędy kodowania spadną do akceptowalnego poziomu.

Odpowiedzi z pilotażu po zmianie klucza zakoduj od nowa. Kodów nadanych według wersji 1 nie łącz z kodami według wersji 2. Jeśli po poprawkach zgodność w pilotażu nadal jest niska, zrób drugą rundę na nowych 30–40 odpowiedziach, a nie na tych samych.

Krok 4. Kodowanie właściwe i zgodność w każdej kategorii

Według klucza w wersji 2 obie koderki zakodowały niezależnie wszystkie 184 odpowiedzi. Gdy kodów jest kilka na odpowiedź, zgodność licz osobno dla każdej kategorii. Każda kategoria to wtedy decyzja tak/nie podjęta przez obie osoby, a kappa Cohena koryguje odsetek zgodnych decyzji o zgodność, której można by oczekiwać przy przypadkowym kodowaniu (McHugh, 2012). Pojedyncza kappa „dla całego pytania” nie ma tu sensu, bo kategorie nie wykluczają się wzajemnie.

Tabela 1

Zgodność dwóch koderek w kategoriach pytania o bariery w korzystaniu z pomocy psychologicznej

KategoriaCzęstość (%)Zgodność (%)κ95% CI
Wstyd i obawa przed oceną35.196.2.92[.86, .98]
Terminy i dostępność31.397.3.94[.88, .99]
„Poradzę sobie sam(a)”20.197.8.93[.87, 1.00]
Brak własnego czasu19.395.1.84[.74, .94]
Obawa o poufność17.794.0.79[.68, .91]
Brak informacji15.097.3.89[.80, .99]
Wątpliwości co do skuteczności9.096.2.77[.60, .93]
Nic nie zniechęca7.1100.01.00–
Inne4.697.3.69[.44, .95]

Uwaga. n = 184 odpowiedzi zakodowanych niezależnie przez dwie osoby według klucza w wersji 2. Częstość to średni odsetek odpowiedzi, którym kategorię przypisały obie koderki. Zgodność to odsetek zgodnych decyzji tak/nie. κ to kappa Cohena dla kodu tak/nie w danej kategorii. Dane symulowane.

Po poprawie klucza średnia kappa wzrosła do .89, a odsetek odpowiedzi z identycznym zestawem kodów do 76.6%. Największą poprawę widać właśnie w czterech kategoriach, które w pilotażu sprawiały trudność (Rysunek 2). Najmniej precyzyjnie oszacowane są kategorie rzadkie: przy wątpliwościach co do skuteczności przedział sięga od .60 do .93, a przy „inne” od .44 do .95.

Wykres kappa Cohena w ośmiu kategoriach przed poprawą klucza i po niej: wątpliwości co do skuteczności z .28 do .77, obawa o poufność z .53 do .79, brak czasu z .57 do .84, poradzę sobie sam z .63 do .93, wstyd z .86 do .92, terminy z .83 do .94, brak informacji .91 i .89, inne .66 i .69; przy rzadkich kategoriach szerokie 95% CI
Rysunek 2. Kappa Cohena w każdej kategorii w pilotażu (szare punkty, klucz w wersji 1, 40 odpowiedzi) i w kodowaniu właściwym (czerwone punkty, klucz w wersji 2, 184 odpowiedzi). Niebieskie odcinki to 95% CI w kodowaniu właściwym. Kategoria „nic nie zniechęca” miała pełną zgodność w obu rundach i została pominięta. Obliczenia: R (dane symulowane).

Dlaczego sam odsetek zgodności nie wystarczy

Spójrz na kategorię „inne”. Koderki zgodziły się w 97.3% decyzji, a kappa wynosi tylko .69. To nie jest błąd obliczeń. Kategorię przypisano zaledwie około 4.6% odpowiedzi, więc dwie osoby, które prawie zawsze wpisują „nie”, zgadzają się w większości przypadków bez żadnego wysiłku. Kappa odejmuje tę „darmową” zgodność. Feinstein i Cicchetti (1990) opisali to zjawisko jako paradoks: przy silnie niezrównoważonych rozkładach brzegowych wysoka zgodność może dawać niską kappę. Sim i Wright (2005) wymieniają rozpowszechnienie kategorii i różnice w skłonnościach oceniających wśród czynników wpływających na wielkość kappy.

Lombard i in. (2002) przejrzeli 200 badań wykorzystujących analizę treści. Stwierdzili, że autorzy często w ogóle nie raportują zgodności koderów albo opierają się na samym odsetku zgodności, który uznali za zbyt liberalny wskaźnik. Krippendorff (2004) w polemice z tym przeglądem analizuje, jak naprawdę zachowują się popularne współczynniki, i formułuje własne zalecenia. Wniosek praktyczny dla pracy dyplomowej: podawaj obie liczby, odsetek zgodności i kappę z przedziałem ufności, osobno dla każdej kategorii. Przy rzadkich kategoriach skomentuj szeroki przedział, zamiast ukrywać go w średniej.

Gdy koderów jest więcej niż dwóch, zamiast kappy Cohena użyj kappy Fleissa albo alfy Krippendorffa, która radzi sobie także z brakami w kodowaniu. Hallgren (2012) omawia, jak zaplanować ocenę zgodności i jak ją raportować. Porównanie miar na wspólnych danych znajdziesz we wpisie zgodność sędziów: kappa, ICC i alfa Krippendorffa. Tutaj nie powtarzamy tych wzorów.

Czy druga osoba musi kodować wszystko?

Nie zawsze. Przy kilkuset odpowiedziach możesz policzyć zgodność na losowej części odpowiedzi, np. co czwartej, a resztę może zakodować jedna osoba według sprawdzonego klucza. Campbell i in. (2013) opisują właśnie taki scenariusz: po dopracowaniu klucza całość koduje jeden kompetentny koder. Losową część wybierz w R (sample()) i podaj w pracy jej wielkość. Niech nie będą to „pierwsze 50 odpowiedzi”, bo kolejność w eksporcie często zależy od czasu wypełnienia. W pracy licencjackiej promotor może zgodzić się na kodowanie przez jedną osobę. Wtedy opisz klucz bardzo dokładnie, dołącz go do aneksu i nazwij brak drugiego kodera ograniczeniem badania.

Krok 5. Rozstrzygnij rozbieżności i ustal kod ostateczny

W kodowaniu właściwym 43 odpowiedzi (23.4%) różniły się co najmniej jednym kodem, a łącznie było 53 rozbieżnych decyzji tak/nie. Każdą z nich koderki omówiły, wracając do definicji i reguł granicznych. Kilka typowych przykładów:

Przykłady rozbieżnych kodów dwóch koderek i kod ustalony po dyskusji
OdpowiedźKoderka AKoderka BKod ostateczny
„Nie wiem, czy to nie trafi do dziekanatu”POUFNOSCWSTYD, POUFNOSCPOUFNOSC, bo wskazano, kto mógłby się dowiedzieć
„Obawiam się, że zostanie jakiś ślad w systemie uczelni, długo się czeka na wizytę”POUFNOSC, TERMINYWSTYD, TERMINYPOUFNOSC, TERMINY
„Moje problemy nie są aż tak poważne”SAMODZIELNOSCCZAS, SAMODZIELNOSCSAMODZIELNOSC, bo w tekście nie ma mowy o czasie
„Nie wiem, czy ktoś na uczelni ma odpowiednie kompetencje”ZAUFANIE, INNEZAUFANIEZAUFANIE, bo „inne” stosuje się tylko wtedy, gdy nic nie pasuje

Rozbieżności można rozstrzygać na trzy sposoby: dyskusją do konsensusu, decyzją trzeciej osoby (np. promotora) albo przyjęciem kodów głównego kodera. Każdy jest dopuszczalny, ale wybrany sposób opisz w pracy. Zgodność raportuj zawsze dla kodów sprzed dyskusji, bo po dyskusji wynosi z definicji 100%. Gdy omawiane przypadki ujawnią nową regułę, dopisz ją do klucza i sprawdź, czy wcześniej zakodowane podobne odpowiedzi jej nie naruszają.

Krok 6. Policz kategorie: trzy możliwe mianowniki

Po rozstrzygnięciu rozbieżności 111 osób miało jeden kod, 46 dwa, a 27 trzy. Razem było więc 284 wzmianek od 184 osób, średnio 1.54 kodu na odpowiedź. Właśnie dlatego odsetki z pytania otwartego z wieloma kodami nie sumują się do 100%. Najczęstszym błędem w tej części pracy jest niejasny mianownik. Ta sama liczba 61 może oznaczać trzy różne odsetki:

Tabela 2

Bariery w korzystaniu z pomocy psychologicznej na uczelni w odpowiedziach na pytanie otwarte

Kategorian% odpowiadających [95% CI]% całej próby% wzmianek
Wstyd i obawa przed oceną6133.2 [26.8, 40.2]19.121.5
Terminy i dostępność5831.5 [25.2, 38.6]18.120.4
„Poradzę sobie sam(a)”3619.6 [14.5, 25.9]11.212.7
Brak własnego czasu3519.0 [14.0, 25.3]10.912.3
Obawa o poufność3317.9 [13.1, 24.1]10.311.6
Brak informacji2614.1 [9.8, 19.9]8.19.2
Wątpliwości co do skuteczności168.7 [5.4, 13.7]5.05.6
Nic nie zniechęca137.1 [4.2, 11.7]4.14.6
Inne63.3 [1.5, 6.9]1.92.1

Uwaga. Odsetek odpowiadających liczono z 184 osób, które odpowiedziały na pytanie, z 95% przedziałem ufności Wilsona. Odsetek całej próby liczono z N = 320 osób, a odsetek wzmianek z 284 przypisanych kodów. Jedna odpowiedź mogła otrzymać do trzech kodów, dlatego odsetki odpowiadających nie sumują się do 100. Kody ostateczne ustalono po rozstrzygnięciu rozbieżności. Dane symulowane.

  • Odsetek odpowiadających (61 z 184 = 33.2%) odpowiada na pytanie „jaka część osób, które coś napisały, wspomniała o wstydzie?”. To zwykle najlepszy wybór do tekstu pracy.
  • Odsetek całej próby (61 z 320 = 19.1%) jest dolnym ograniczeniem. Osoby, które nic nie napisały, mogły odczuwać tę samą barierę. Nie pisz więc, że „wstyd zniechęca 19.1% studentów”.
  • Odsetek wzmianek (61 z 284 = 21.5%) opisuje strukturę wszystkich wypowiedzi. Przydaje się rzadko, a często myli czytelnika, bo zależy od tego, ile kodów dostawały inne osoby.

Odsetek podaj z przedziałem ufności dla proporcji. Brown i in. (2001) pokazali, że standardowy przedział Walda ma przy proporcjach chaotyczne pokrycie, i zalecają m.in. przedział Wilsona. Przedziały w Tabeli 2 i na Rysunku 3 mają szerokość od około 5 do 13 punktów procentowych. Wstyd (33.2%) i terminy (31.5%) mają przedziały, które w dużej mierze się pokrywają. Na podstawie tych danych nie napiszesz więc, że wstyd jest „ważniejszy” niż terminy. Możesz natomiast napisać, że obie bariery wymieniano wyraźnie częściej niż brak informacji czy wątpliwości co do skuteczności.

Poziomy wykres słupkowy odsetka osób, które wspomniały każdą barierę, z 95% przedziałami Wilsona: wstyd 61 osób (33.2%), terminy 58 (31.5%), poradzę sobie sam 36 (19.6%), brak czasu 35 (19.0%), poufność 33 (17.9%), brak informacji 26 (14.1%), wątpliwości co do skuteczności 16 (8.7%), nic nie zniechęca 13 (7.1%), inne 6 (3.3%)
Rysunek 3. Odsetek osób, które w odpowiedzi na pytanie otwarte wspomniały daną barierę (n = 184), z 95% przedziałami ufności Wilsona. Kategorie są uporządkowane według częstości, a kategoria „inne” jest na końcu. Obliczenia: R (dane symulowane).

W tabeli i na wykresie uporządkuj kategorie według częstości, a „inne” i „nic nie zniechęca” umieść na końcu. Wybierz słupki poziome, bo nazwy kategorii są długie. Przy kategoriach zakodowanych jako 0/1 nie licz średnich ani testów na „sumie kodów”. Wyjątek to sytuacja, gdy liczba wymienionych barier jest dla Ciebie osobną, zaplanowaną zmienną. Ogólne zasady wykresów słupkowych opisujemy w haśle wykres słupkowy.

Liczby nie wystarczą. Do każdej głównej kategorii dodaj jeden lub dwa krótkie, zanonimizowane cytaty, np. „Obawiam się, że zostanie jakiś ślad w systemie uczelni”. Cytat pokazuje, co kryje się pod etykietą, a liczba pokazuje, jak typowa jest ta wypowiedź. Wybieraj cytaty typowe, a nie najbardziej dramatyczne.

Krok 7. Porównanie grup: ostrożnie i z poprawką

Zakodowane kategorie są zwykłymi zmiennymi nominalnymi, więc możesz je zestawić z innymi zmiennymi w tabeli krzyżowej i teście chi-kwadrat. W przykładzie autorka sprawdziła, czy kobiety i mężczyźni wymieniali te same bariery. Takie porównanie ma jednak trzy słabe punkty, o których trzeba napisać:

  • porównujesz tylko osoby, które odpowiedziały, a mężczyźni odpowiadali rzadziej (49.1% wobec 62.0%);
  • brak wzmianki o barierze nie znaczy, że jej nie ma, bo osoba mogła po prostu napisać o czymś innym;
  • przy dziewięciu kategoriach robisz dziewięć testów, więc rośnie ryzyko fałszywego alarmu.

Wstyd i obawę przed oceną wymieniło 25.6% kobiet (n = 129) i 50.9% mężczyzn (n = 55), χ²(1, N = 184) = 11.16, p < .001, φ = .25. Różnica pozostaje istotna po poprawce Holma na dziewięć porównań (pHolm = .008). Obawę o poufność częściej wymieniali mężczyźni (25.5% wobec 14.7%), ale ta różnica nie była istotna już przed poprawką (p = .083; pHolm = .660). W pozostałych kategoriach różnice między płciami nie przekraczały siedmiu punktów procentowych. W kategorii „inne” najmniejsza liczebność oczekiwana wynosiła 1.79, więc zamiast chi-kwadrat zastosowano test dokładny Fishera (p = .671).

Porównania kategorii z pytania otwartego traktuj w pracy jako eksploracyjne, chyba że hipoteza dotyczyła konkretnej kategorii i była sformułowana przed zebraniem danych. Jeśli pytanie o wstyd jest dla Ciebie kluczowe, w kolejnym badaniu zadaj je jako pytanie zamknięte, np. jako twierdzenie na skali Likerta. Pytanie otwarte dobrze nadaje się do znalezienia takich kategorii, a słabiej do precyzyjnego pomiaru ich częstości.

Jak opisać analizę treści w pracy (APA)

Opis składa się z dwóch części. W rozdziale metodologicznym opisujesz procedurę, a w wynikach liczby. Zmień liczby i nazwy kategorii na własne. Nie zostawiaj zdań o etapach, których nie wykonałeś(-aś).

Metoda: opracowanie odpowiedzi na pytanie otwarte

Odpowiedzi na pytanie otwarte „Co najbardziej zniechęca Cię do skorzystania z pomocy psychologicznej na uczelni?” opracowano metodą analizy treści z kategoriami wyprowadzonymi z danych. Jednostką analizy była cała odpowiedź jednej osoby; jednej odpowiedzi można było przypisać do trzech kodów. Wstępny klucz kategoryzacji (dziewięć kategorii z definicjami i przykładami) sprawdzono w pilotażu: dwie osoby niezależnie zakodowały 40 odpowiedzi. Na tej podstawie dodano reguły dla przypadków granicznych, a następnie obie osoby niezależnie zakodowały wszystkie odpowiedzi (n = 184) według poprawionego klucza. Zgodność oceniono osobno dla każdej kategorii jako odsetek zgodnych decyzji i kappę Cohena z 95% CI. Rozbieżności (43 odpowiedzi) rozstrzygnięto w dyskusji, a do analiz użyto kodów ustalonych po dyskusji. Pełny klucz zamieszczono w Aneksie.

Wyniki

Na pytanie otwarte odpowiedziały 184 osoby (57.5% próby): 62.0% kobiet i 49.1% mężczyzn, χ²(1, N = 320) = 4.97, p = .026, φ = .12. Zgodność koderek w poszczególnych kategoriach wynosiła od 94.0% do 100.0% (κ od .69 do 1.00; Tabela 1); najniższą i najmniej precyzyjnie oszacowaną kappę miała rzadka kategoria „inne” (κ = .69, 95% CI [.44, .95]). Najczęściej wymienianymi barierami były wstyd i obawa przed oceną (33.2% odpowiadających, 95% CI [26.8, 40.2]) oraz terminy i dostępność poradni (31.5%, 95% CI [25.2, 38.6]); rzadziej przekonanie, że osoba poradzi sobie sama (19.6%), brak czasu (19.0%) i obawa o poufność (17.9%). Mężczyźni częściej niż kobiety wymieniali wstyd (50.9% vs 25.6%), χ²(1, N = 184) = 11.16, p < .001, φ = .25, także po poprawce Holma na dziewięć porównań (p = .008). Pozostałe różnice między płciami nie były istotne.

Tabelę 2 umieść w rozdziale wyników, a Tabelę 1 w wynikach albo w aneksie. Cytaty ilustrujące kategorie dodaj w tekście albo w osobnej kolumnie tabeli. Ogólne zasady zapisu liczb opisujemy we wpisie jak opisać wyniki w stylu APA, a miejsce analizy pytań otwartych w całej ankiecie we wpisie analiza ankiety do pracy dyplomowej. Jeśli chcesz, żeby ktoś sprawdził Twój klucz, kodowanie i tabele, zanim oddasz rozdział, zajrzyj do oferty analiz dla studentów. Pomagamy policzyć i wyjaśnić wyniki, ale samą interpretację odpowiedzi musisz umieć obronić sam(a).

Przykład reprodukowalny

Analiza treści pytania otwartego w R

Kod odtwarza wszystkie liczby z tekstu, tabel i rysunków. Uruchom przepisy po kolei w jednej sesji R, bo przepisy 2 i 3 korzystają z obiektów z przepisu 1. Kody zapisano jako macierze 0/1 (wiersz to odpowiedź, kolumna to kategoria). Kappę z przedziałem ufności liczy funkcja psych::cohen.kappa(), a przedział Wilsona funkcja DescTools::BinomCI(). Pakietu irr nie użyto. Na własnych danych wczytaj arkusz z kodami (np. readxl::read_excel()) i zamień kolumny koderów na takie same macierze.

1. Dane, pilotaż i zgodność koderek w każdej kategorii

Dane wejściowe: 320 osób studiujących, 184 odpowiedzi na pytanie otwarte, dziewięć kategorii, kody dwóch koderek w pilotażu (40 odpowiedzi, klucz v1) i w kodowaniu właściwym (184 odpowiedzi, klucz v2) (dane symulowane, set.seed(9601)); pakiet psych.

Co odczytać: odsetek odpowiedzi według płci z testem χ², zgodność i kappę w każdej kategorii w obu rundach, odsetek odpowiedzi z identycznym zestawem kodów i liczbę rozbieżności.

R
# Pytanie otwarte: „Co najbardziej zniechęca Cię do skorzystania z pomocy psychologicznej na uczelni?”
# Ankieta wśród 320 osób studiujących (dane symulowane, set.seed(9601)).
# Klucz kategoryzacji: 9 kategorii; jedna odpowiedź może dostać do 3 kodów (kodowanie wielokrotne).
set.seed(9601)
N <- 320
ankieta <- data.frame(id = sprintf("R%03d", 1:N),
                      plec = sample(c("kobieta", "mężczyzna"), N, replace = TRUE, prob = c(.66, .34)))
p_odp <- ifelse(ankieta$plec == "kobieta", .64, .50)
ankieta$odpowiedzial <- rbinom(N, 1, p_odp) == 1

kody <- c("WSTYD", "POUFNOSC", "TERMINY", "CZAS", "INFO", "SAMODZIELNOSC", "ZAUFANIE", "BRAK", "INNE")
nazwy <- c(WSTYD = "Wstyd i obawa przed oceną", POUFNOSC = "Obawa o poufność",
           TERMINY = "Terminy i dostępność", CZAS = "Brak własnego czasu",
           INFO = "Brak informacji", SAMODZIELNOSC = "„Poradzę sobie sam(a)”",
           ZAUFANIE = "Wątpliwości co do skuteczności", BRAK = "Nic nie zniechęca", INNE = "Inne")

# „Prawdziwe” kody (w praktyce nieznane – to, co ustalają koderzy po rozstrzygnięciu rozbieżności)
odp <- ankieta[ankieta$odpowiedzial, ]
n <- nrow(odp)
pr <- function(k, m) switch(k, WSTYD = ifelse(m, .42, .25), POUFNOSC = .13, TERMINY = .28, CZAS = .19,
                             INFO = .21, SAMODZIELNOSC = ifelse(m, .30, .14), ZAUFANIE = .08, INNE = .04)
prawda <- matrix(0L, n, length(kody), dimnames = list(odp$id, kody))
for (i in 1:n) {
  m <- odp$plec[i] == "mężczyzna"
  if (runif(1) < .07) { prawda[i, "BRAK"] <- 1L; next }
  bariery <- setdiff(kody, "BRAK")
  for (k in bariery) prawda[i, k] <- rbinom(1, 1, pr(k, m))
  if (sum(prawda[i, ]) == 0) prawda[i, sample(bariery, 1, prob = sapply(bariery, pr, m = m))] <- 1L
  while (sum(prawda[i, ]) > 3) prawda[i, sample(which(prawda[i, ] == 1), 1)] <- 0L
}

# Koder: pomija kod (miss), dopisuje kod (add) i myli pary podobnych kategorii (myl)
koduj <- function(P, miss, add, myl) {
  K <- P
  for (i in seq_len(nrow(P))) {
    for (k in colnames(P)) {
      if (P[i, k] == 1 && runif(1) < miss) K[i, k] <- 0L
      if (P[i, k] == 0 && k != "BRAK" && runif(1) < add) K[i, k] <- 1L
    }
    for (para in myl) if (P[i, para$z] == 1 && runif(1) < para$p) { K[i, para$z] <- 0L; K[i, para$na] <- 1L }
    if (sum(K[i, ]) == 0) K[i, ] <- P[i, ]
  }
  K
}
# Runda pilotażowa: klucz w wersji 1 (bez reguł granicznych), 40 pierwszych odpowiedzi
pil <- prawda[1:40, ]
myl_v1 <- list(list(z = "POUFNOSC", na = "WSTYD", p = .45), list(z = "CZAS", na = "TERMINY", p = .40),
               list(z = "ZAUFANIE", na = "SAMODZIELNOSC", p = .40))
pA1 <- koduj(pil, .04, .01, list()); pB1 <- koduj(pil, .08, .03, myl_v1)
# Klucz w wersji 2 (dopisane definicje i przypadki graniczne): wszystkie odpowiedzi od nowa
myl_v2 <- list(list(z = "POUFNOSC", na = "WSTYD", p = .12), list(z = "CZAS", na = "TERMINY", p = .10),
               list(z = "ZAUFANIE", na = "SAMODZIELNOSC", p = .12))
A <- koduj(prawda, .04, .01, list()); B <- koduj(prawda, .07, .02, myl_v2)

# Liczba odpowiedzi i odsetek
round(c(N = N, odpowiedzialo = n, proc = 100 * n / N), 1)
tab_odp <- table(ankieta$plec, ankieta$odpowiedzial)
tab_odp
round(100 * prop.table(tab_odp, 1)[, "TRUE"], 1)
chisq.test(tab_odp, correct = FALSE)
c(phi = round(sqrt(unname(chisq.test(tab_odp, correct = FALSE)$statistic) / N), 4))

# Zgodność w każdej kategorii: odsetek zgodnych decyzji tak/nie, częstość kategorii i kappa Cohena z 95% CI
zgodnosc <- function(A, B) {
  t(sapply(colnames(A), function(k) {
    tab <- table(factor(A[, k], 0:1), factor(B[, k], 0:1))
    kk <- suppressWarnings(psych::cohen.kappa(tab))
    c(czestosc = 100 * mean((A[, k] + B[, k]) / 2), zgodnosc = 100 * mean(A[, k] == B[, k]),
      kappa = kk$kappa, dolna = kk$confid[1, 1], gorna = kk$confid[1, 3])
  }))
}
zg_pilot <- zgodnosc(pA1, pB1)
zg_final <- zgodnosc(A, B)
round(zg_pilot[, c("zgodnosc", "kappa")], 2)
round(zg_final, 2)
# Zgodność całych odpowiedzi (ten sam zestaw kodów) i liczba rozbieżności do omówienia
round(c(pilot = 100 * mean(rowSums(pA1 != pB1) == 0), final = 100 * mean(rowSums(A != B) == 0)), 1)
c(rozbiezne_odpowiedzi = sum(rowSums(A != B) > 0), proc = round(100 * mean(rowSums(A != B) > 0), 1),
  rozbiezne_decyzje = sum(A != B))
# Średnia kappa z kategorii (bez rzadkiej kategorii INNE)
round(c(pilot = mean(zg_pilot[kody != "INNE", "kappa"]), final = mean(zg_final[kody != "INNE", "kappa"])), 2)
Wynik w R
            N odpowiedzialo          proc 
        320.0         184.0          57.5 
           
            FALSE TRUE
  kobieta      79  129
  mężczyzna    57   55
  kobieta mężczyzna 
     62.0      49.1 

	Pearson's Chi-squared test

data:  tab_odp
X-squared = 4.9667, df = 1, p-value = 0.02584

   phi 
0.1246 
              zgodnosc kappa
WSTYD             95.0  0.86
POUFNOSC          92.5  0.53
TERMINY           92.5  0.83
CZAS              85.0  0.57
INFO              97.5  0.91
SAMODZIELNOSC     87.5  0.63
ZAUFANIE          90.0  0.28
BRAK             100.0  1.00
INNE              97.5  0.66
              czestosc zgodnosc kappa dolna gorna
WSTYD            35.05    96.20  0.92  0.86  0.98
POUFNOSC         17.66    94.02  0.79  0.68  0.91
TERMINY          31.25    97.28  0.94  0.88  0.99
CZAS             19.29    95.11  0.84  0.74  0.94
INFO             14.95    97.28  0.89  0.80  0.99
SAMODZIELNOSC    20.11    97.83  0.93  0.87  1.00
ZAUFANIE          8.97    96.20  0.77  0.60  0.93
BRAK              7.07   100.00  1.00  1.00  1.00
INNE              4.62    97.28  0.69  0.44  0.95
pilot final 
 57.5  76.6 
rozbiezne_odpowiedzi                 proc    rozbiezne_decyzje 
                43.0                 23.4                 53.0 
pilot final 
 0.70  0.89 

2. Liczebności kategorii, przedziały Wilsona i porównanie grup

Dane wejściowe: kody ostateczne z przepisu 1; pakiet DescTools.

Co odczytać: liczbę kodów na odpowiedź, liczebność i trzy odsetki każdej kategorii z 95% CI Wilsona, odsetki kobiet i mężczyzn w kategoriach, χ², p, φ, p po poprawce Holma i test Fishera dla kategorii „inne”.

R
# Liczenie kategorii po rozstrzygnięciu rozbieżności (kody ostateczne = obiekt prawda z przepisu 1).
# Odsetek osób, które wspomniały kategorię, z 95% przedziałem Wilsona; trzy różne mianowniki.
K <- prawda
liczba_kodow <- rowSums(K)
table(liczba_kodow)
c(odpowiedzi = nrow(K), wzmianki = sum(K), srednio = round(mean(liczba_kodow), 2))

wil <- DescTools::BinomCI(colSums(K), nrow(K), method = "wilson")
kat <- data.frame(n = colSums(K),
                  proc_odp = 100 * colSums(K) / nrow(K),
                  ci_dolna = 100 * wil[, "lwr.ci"], ci_gorna = 100 * wil[, "upr.ci"],
                  proc_wszystkich = 100 * colSums(K) / N,
                  proc_wzmianek = 100 * colSums(K) / sum(K))
kat <- kat[order(-kat$n), ]
round(kat, 1)

# Kategorie a płeć (analiza eksploracyjna): test chi-kwadrat dla każdej kategorii, poprawka Holma
plec <- odp$plec
porown <- t(sapply(kody, function(k) {
  tab <- table(plec, K[, k])
  ch <- suppressWarnings(chisq.test(tab, correct = FALSE))
  c(K = 100 * mean(K[plec == "kobieta", k]), M = 100 * mean(K[plec == "mężczyzna", k]),
    chi2 = unname(ch$statistic), p = ch$p.value, min_oczek = min(ch$expected),
    phi = sqrt(unname(ch$statistic) / length(plec)))
}))
porown <- cbind(porown, p_holm = p.adjust(porown[, "p"], "holm"))
round(porown, 4)
table(plec)
# Dla kategorii z małą liczebnością oczekiwaną: test dokładny Fishera
fisher.test(table(plec, K[, "INNE"]))$p.value
Wynik w R
liczba_kodow
  1   2   3 
111  46  27 
odpowiedzi   wzmianki    srednio 
    184.00     284.00       1.54 
               n proc_odp ci_dolna ci_gorna proc_wszystkich proc_wzmianek
WSTYD         61     33.2     26.8     40.2            19.1          21.5
TERMINY       58     31.5     25.2     38.6            18.1          20.4
SAMODZIELNOSC 36     19.6     14.5     25.9            11.2          12.7
CZAS          35     19.0     14.0     25.3            10.9          12.3
POUFNOSC      33     17.9     13.1     24.1            10.3          11.6
INFO          26     14.1      9.8     19.9             8.1           9.2
ZAUFANIE      16      8.7      5.4     13.7             5.0           5.6
BRAK          13      7.1      4.2     11.7             4.1           4.6
INNE           6      3.3      1.5      6.9             1.9           2.1
                    K       M    chi2      p min_oczek    phi p_holm
WSTYD         25.5814 50.9091 11.1616 0.0008   18.2337 0.2463 0.0075
POUFNOSC      14.7287 25.4545  3.0140 0.0825    9.8641 0.1280 0.6604
TERMINY       29.4574 36.3636  0.8520 0.3560   17.3370 0.0680 1.0000
CZAS          17.8295 21.8182  0.3983 0.5280   10.4620 0.0465 1.0000
INFO          13.1783 16.3636  0.3224 0.5701    7.7717 0.0419 1.0000
SAMODZIELNOSC 17.8295 23.6364  0.8262 0.3634   10.7609 0.0670 1.0000
ZAUFANIE       9.3023  7.2727  0.2001 0.6547    4.7826 0.0330 1.0000
BRAK           8.5271  3.6364  1.4047 0.2359    3.8859 0.0874 1.0000
INNE           3.8760  1.8182  0.5176 0.4719    1.7935 0.0530 1.0000
plec
  kobieta mężczyzna 
      129        55 
[1] 0.6706352

3. Arkusz z kluczem i kodami do pobrania

Dane wejściowe: obiekty z przepisu 1; pakiety openxlsx i readxl.

Co odczytać: wymiary arkusza i nazwy zakładek po ponownym wczytaniu, autora w metadanych pliku i przykładowe odpowiedzi z rozbieżnymi kodami (Krok 5).

R
# Arkusz do pobrania: klucz kategoryzacji + odpowiedzi z kodami dwóch koderów (obiekty z przepisu 1).
# Teksty odpowiedzi składane z krótkich wypowiedzi typowych dla każdej kategorii (dane symulowane).
set.seed(9603)
frazy <- list(
  WSTYD = c("wstydzę się", "boję się, że ktoś mnie zobaczy pod gabinetem", "nie chcę, żeby ktoś uznał, że coś jest ze mną nie tak",
            "trochę wstyd przyznać się, że sobie nie radzę", "obawa, co pomyślą znajomi z roku"),
  POUFNOSC = c("nie wiem, czy to nie trafi do dziekanatu", "boję się, że prowadzący się dowiedzą",
               "nie mam pewności, czy rozmowa zostaje między nami", "obawiam się, że zostanie jakiś ślad w systemie uczelni"),
  TERMINY = c("długo się czeka na wizytę", "terminy są tylko w godzinach zajęć", "zapisy na kilka tygodni do przodu",
              "jedna psycholożka na cały wydział", "trudno się dodzwonić i umówić"),
  CZAS = c("nie mam na to czasu", "pracuję i studiuję jednocześnie", "po zajęciach od razu jadę do pracy",
           "w sesji nie ma kiedy"),
  INFO = c("nie wiem, gdzie to jest", "nie wiedział{em}, że uczelnia ma taką pomoc", "nie wiem, jak się zapisać",
           "brak informacji na stronie wydziału"),
  SAMODZIELNOSC = c("poradzę sobie sam{a}", "moje problemy nie są aż tak poważne", "inni mają gorzej",
                    "wolę porozmawiać ze znajomymi", "radzę sobie sam{a}"),
  ZAUFANIE = c("nie wierzę, że jedna rozmowa coś zmieni", "słyszał{em}, że to nic nie daje",
               "miał{em} złe doświadczenie z psychologiem", "nie wiem, czy ktoś na uczelni ma odpowiednie kompetencje"),
  BRAK = c("nic, w razie potrzeby {poszedl}", "właściwie nic mnie nie zniechęca", "nic, korzystał{em} i polecam"),
  INNE = c("dojazd do drugiego budynku", "chciał{abym} rozmowy po angielsku", "wolał{abym} kontakt online"))
# Formy zależne od płci: {a}, {em}, {abym}, {poszedl}
rodzaj <- function(t, m) {
  z <- if (m) c("{a}" = "", "{em}" = "em", "{abym}" = "bym", "{poszedl}" = "poszedłbym")
       else c("{a}" = "a", "{em}" = "am", "{abym}" = "abym", "{poszedl}" = "poszłabym")
  for (k in names(z)) t <- gsub(k, z[[k]], t, fixed = TRUE)
  t
}
tekst <- sapply(seq_len(nrow(prawda)), function(i) {
  w <- prawda[i, ]
  cz <- vapply(names(w)[w == 1], function(k) sample(frazy[[k]], 1), "")
  t <- rodzaj(paste(cz, collapse = ifelse(runif(1) < .5, ", ", "; ")), odp$plec[i] == "mężczyzna")
  paste0(toupper(substr(t, 1, 1)), substr(t, 2, nchar(t)))
})
kod_tekst <- function(M) apply(M, 1, function(w) paste(names(w)[w == 1], collapse = "; "))
odpowiedzi <- data.frame(id = odp$id, plec = odp$plec, odpowiedz = unname(tekst),
                         koder_A = kod_tekst(A), koder_B = kod_tekst(B),
                         zgodne = ifelse(rowSums(A != B) == 0, "tak", "nie"), kod_ostateczny = kod_tekst(prawda))
klucz <- data.frame(
  kod = kody, nazwa = unname(nazwy[kody]),
  definicja = c("Wstyd, lęk przed oceną innych osób lub przed byciem uznanym za „słabego”.",
                "Obawa, że informacja o wizycie lub treść rozmowy trafi do uczelni, prowadzących albo do akt.",
                "Bariery po stronie poradni: kolejki, godziny przyjęć, liczba specjalistów, trudne zapisy.",
                "Bariery po stronie osoby: brak czasu z powodu zajęć, pracy, dojazdów.",
                "Brak wiedzy, że pomoc istnieje, gdzie jest i jak się zapisać.",
                "Przekonanie, że problem jest za mały albo że osoba poradzi sobie bez pomocy.",
                "Wątpliwości, czy pomoc jest skuteczna; złe doświadczenia; brak zaufania do kompetencji.",
                "Osoba pisze, że nic jej nie zniechęca (kod wyłączny).",
                "Treść, która nie pasuje do żadnej kategorii (zapisz ją w notatce)."),
  przyklad = vapply(kody, function(k) frazy[[k]][1], ""),
  reguly_graniczne = c("„Boję się, że ktoś się dowie” bez wskazania uczelni lub dokumentów → WSTYD.",
                       "Gdy osoba wskazuje, KTO mógłby się dowiedzieć (dziekanat, prowadzący, system) → POUFNOSC.",
                       "„Terminy w godzinach zajęć” → TERMINY (problem leży w ofercie poradni).",
                       "„Nie mam czasu” bez wzmianki o godzinach poradni → CZAS.",
                       "„Nie wiem, czy to darmowe” → INFO.",
                       "„Inni mają gorzej” → SAMODZIELNOSC, a nie WSTYD.",
                       "„To nic nie da” → ZAUFANIE, a nie SAMODZIELNOSC.",
                       "Nie łącz z innymi kodami.",
                       "Używaj tylko wtedy, gdy żadna definicja nie pasuje."))
wb <- openxlsx::createWorkbook(creator = "Metodolog.pl", title = "Analiza treści pytania otwartego – przykład")
openxlsx::addWorksheet(wb, "klucz"); openxlsx::writeData(wb, "klucz", klucz)
openxlsx::addWorksheet(wb, "odpowiedzi"); openxlsx::writeData(wb, "odpowiedzi", odpowiedzi)
openxlsx::setColWidths(wb, "klucz", 1:5, c(16, 30, 70, 45, 75))
openxlsx::setColWidths(wb, "odpowiedzi", 1:7, c(7, 11, 80, 32, 32, 8, 32))
plik <- "../analiza-tresci-pytan-otwartych-przyklad.xlsx"
openxlsx::saveWorkbook(wb, plik, overwrite = TRUE)

# Kontrola: plik otwarty ponownie, metadane autora
sprawdz <- readxl::read_excel(plik, sheet = "odpowiedzi")
dim(sprawdz); readxl::excel_sheets(plik)
tmp <- tempfile(); utils::unzip(plik, "docProps/core.xml", exdir = tmp)
regmatches(readLines(file.path(tmp, "docProps/core.xml"), warn = FALSE),
           gregexpr("<dc:creator>[^<]*</dc:creator>|<cp:lastModifiedBy>[^<]*</cp:lastModifiedBy>",
                    readLines(file.path(tmp, "docProps/core.xml"), warn = FALSE)))
round(file.info(plik)$size / 1024)
# Przykładowe wiersze do tabeli we wpisie: odpowiedzi z rozbieżnymi kodami
head(odpowiedzi[odpowiedzi$zgodne == "nie", c("id", "odpowiedz", "koder_A", "koder_B", "kod_ostateczny")], 6)
head(odpowiedzi[odpowiedzi$zgodne == "tak" & lengths(strsplit(odpowiedzi$kod_ostateczny, ";")) > 1,
                c("id", "odpowiedz", "kod_ostateczny")], 4)
Wynik w R
[1] 184   7
[1] "klucz"      "odpowiedzi"
[[1]]
[1] "<dc:creator>Metodolog.pl</dc:creator>"              
[2] "<cp:lastModifiedBy>Metodolog.pl</cp:lastModifiedBy>"

[1] 17
       id                                                                         odpowiedz           koder_A
R002 R002                                          Nie wiem, czy to nie trafi do dziekanatu          POUFNOSC
R015 R015                                                 Zapisy na kilka tygodni do przodu           TERMINY
R016 R016                          Nie wiem, czy ktoś na uczelni ma odpowiednie kompetencje    ZAUFANIE; INNE
R023 R023 Obawiam się, że zostanie jakiś ślad w systemie uczelni, długo się czeka na wizytę POUFNOSC; TERMINY
R026 R026                                               Moje problemy nie są aż tak poważne     SAMODZIELNOSC
R034 R034                                                 Jedna psycholożka na cały wydział           TERMINY
                 koder_B    kod_ostateczny
R002     WSTYD; POUFNOSC          POUFNOSC
R015   POUFNOSC; TERMINY           TERMINY
R016            ZAUFANIE          ZAUFANIE
R023      WSTYD; TERMINY POUFNOSC; TERMINY
R026 CZAS; SAMODZIELNOSC     SAMODZIELNOSC
R034   TERMINY; ZAUFANIE           TERMINY
       id
R007 R007
R020 R020
R022 R022
R029 R029
                                                                                                                                     odpowiedz
R007                                             Nie mam pewności, czy rozmowa zostaje między nami, radzę sobie sama, wolałabym kontakt online
R020                                                                                Długo się czeka na wizytę; pracuję i studiuję jednocześnie
R022 Trochę wstyd przyznać się, że sobie nie radzę, obawiam się, że zostanie jakiś ślad w systemie uczelni, terminy są tylko w godzinach zajęć
R029                                                                               Obawa, co pomyślą znajomi z roku; długo się czeka na wizytę
                    kod_ostateczny
R007 POUFNOSC; SAMODZIELNOSC; INNE
R020                 TERMINY; CZAS
R022      WSTYD; POUFNOSC; TERMINY
R029                WSTYD; TERMINY

Bibliografia oprogramowania

Wyniki na tej stronie pochodzą z uruchomienia pokazanego kodu w R 4.5.3. Rysunki przygotowano w pakietach ggplot2 i svglite. W pracy podaj wersje faktycznie użytych pakietów (sessionInfo()).

  1. 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/
  2. psych (wersja 2.6.5): Revelle, W. (2026). psych: Procedures for psychological, psychometric, and personality research (R package version 2.6.5) [Computer software]. Northwestern University. https://CRAN.R-project.org/package=psych
  3. DescTools (wersja 0.99.60): Signorell, A. (2025). DescTools: Tools for descriptive statistics (R package version 0.99.60) [Computer software]. https://doi.org/10.32614/CRAN.package.DescTools
  4. openxlsx (wersja 4.2.8.1): Schauberger, P., & Walker, A. (2025). openxlsx: Read, write and edit xlsx files (R package version 4.2.8.1) [Computer software]. https://doi.org/10.32614/CRAN.package.openxlsx
  5. readxl (wersja 1.4.5): Wickham, H., & Bryan, J. (2025). readxl: Read Excel files (R package version 1.4.5) [Computer software]. https://doi.org/10.32614/CRAN.package.readxl
  6. ggplot2 (wersja 4.0.2): Wickham, H. (2016). ggplot2: Elegant graphics for data analysis. Springer. https://ggplot2.tidyverse.org
  7. svglite (wersja 2.2.2): Wickham, H., Henry, L., Pedersen, T. L., Luciani, T. J., Decorde, M., & Lise, V. (2025). svglite: An 'SVG' graphics device (R package version 2.2.2) [Computer software]. https://doi.org/10.32614/CRAN.package.svglite

Najczęstsze błędy w analizie pytań otwartych

  1. Klucz zmieniany w trakcie kodowania. Jeśli w połowie pracy dopisujesz kategorię albo zmieniasz definicję, pierwsza połowa odpowiedzi jest zakodowana według innych zasad. Poprawki rób po pilotażu, a jeśli są konieczne później, zakoduj wszystko od nowa.
  2. Kappa liczona po dyskusji. Zgodność opisuje kody nadane niezależnie. Kody po konsensusie zawsze się zgadzają, więc zgodność policzona na nich niczego nie mówi o kluczu.
  3. Jedna kappa przy kodowaniu wielokrotnym. Gdy odpowiedź może mieć kilka kodów, licz zgodność osobno dla każdej kategorii. Średnią podawaj tylko obok wartości dla kategorii.
  4. Sam procent zgodności. Przy rzadkich kategoriach daje on obraz zbyt optymistyczny (97.3% przy κ = .69 w kategorii „inne”). Podaj obie liczby.
  5. Niejasny mianownik. Zdanie „33.2% osób wskazało wstyd” bez dopisku „spośród 184 osób, które odpowiedziały” jest mylące. Zawsze podaj, z czego liczysz odsetek.
  6. Uogólnianie na całą próbę. Pytanie otwarte jest nieobowiązkowe i odpowiadają na nie określone osoby. Wyniki opisują odpowiadających, a brak wzmianki nie jest odpowiedzią „nie”.
  7. Zbyt wiele drobnych kategorii. Kategorie z trzema czy czterema osobami łącz w szersze, o ile klucz na to pozwala, albo przenieś do „inne”. Ich kappa i odsetki są zbyt niestabilne, by je interpretować.
  8. Cytaty wybrane pod tezę. Ilustruj kategorie typowymi wypowiedziami i nie usuwaj z tabeli kategorii, które nie pasują do hipotez, np. „nic nie zniechęca”.
  9. Testy bez poprawki. Porównanie wielu kategorii między grupami to seria testów. Zastosuj poprawkę na wielokrotne porównania albo wyraźnie nazwij analizę eksploracyjną.

Jeśli dopiero projektujesz ankietę, zastanów się, czy każde pytanie otwarte jest Ci naprawdę potrzebne i ile odpowiedzi zdążysz zakodować. Wskazówki znajdziesz we wpisach jak zrobić ankietę do pracy dyplomowej i najczęstsze błędy w ankietach. Jedno dobrze opracowane pytanie otwarte daje więcej niż pięć pytań, których odpowiedzi trafią do aneksu bez analizy.

Najczęstsze pytania

Jak liczyć procenty w pytaniu otwartym, gdy jedna odpowiedź ma kilka kodów?

Licz odsetek osób, które wspomniały daną kategorię, zwykle spośród osób, które odpowiedziały na pytanie, np. 61 z 184 = 33.2%. Takie odsetki nie sumują się do 100%, bo jedna osoba może mieć kilka kodów. Napisz to w nocie tabeli i podaj, z jakiej liczby liczysz odsetek.

Czy w pracy licencjackiej trzeba mieć dwóch koderów odpowiedzi otwartych?

Nie zawsze jest to wymagane, ale drugi koder bardzo wzmacnia wiarygodność analizy. Najprostsze rozwiązanie to niezależne zakodowanie przez drugą osobę losowej części odpowiedzi i podanie zgodności z kappą. Jeśli kodujesz sam(a), dołącz pełny klucz do aneksu i nazwij to ograniczeniem badania.

Jak zbudować klucz kategorii do pytania otwartego?

Przeczytaj kilkadziesiąt odpowiedzi, wypisz powtarzające się wątki i zgrupuj je w kilka do kilkunastu kategorii. Każdej nadaj kod, nazwę, definicję, przykład i regułę dla przypadków granicznych, a na końcu dodaj kategorię „inne”. Klucz sprawdź w pilotażu z drugą osobą, zanim zakodujesz wszystkie odpowiedzi.

Jak traktować puste odpowiedzi i „nie wiem” w pytaniu otwartym?

Puste pole to brak odpowiedzi, a nie kategoria, więc nie wliczaj go do mianownika odsetków. Podaj jednak, ile osób odpowiedziało. Odpowiedź „nic mnie nie zniechęca” jest merytoryczna i dostaje własny kod. Samo „nie wiem” albo kreskę możesz wyłączyć z analizy, podając ich liczbę.

Dlaczego kappa jest niska, choć koderzy zgadzają się w ponad 90% przypadków?

Przy rzadkich kategoriach koderzy zgadzają się głównie dlatego, że prawie zawsze wpisują „nie”, a kappa odejmuje tę zgodność przypadkową. Przykładowo 97.3% zgodności może iść w parze z κ = .69. Podaj obie liczby z przedziałem ufności i skomentuj niską precyzję w rzadkich kategoriach.

Powiązane hasła

Przeczytaj też

Masz kilkaset odpowiedzi otwartych i nie wiesz, jak je policzyć?

Sprawdzimy klucz kategorii, policzymy zgodność koderów i odsetki z przedziałami ufności oraz wyjaśnimy wyniki tak, abyś umiał(a) je opisać i obronić.

Oferta dla studentówWyceń analizę

Bibliografia i dalsza literatura naukowa (APA 7)

  1. Brown, L. D., Cai, T. T., & DasGupta, A. (2001). Interval estimation for a binomial proportion. Statistical Science, 16(2), 101–133. https://doi.org/10.1214/ss/1009213286
  2. Campbell, J. L., Quincy, C., Osserman, J., & Pedersen, O. K. (2013). Coding in-depth semistructured interviews: Problems of unitization and intercoder reliability and agreement. Sociological Methods & Research, 42(3), 294–320. https://doi.org/10.1177/0049124113500475
  3. Elo, S., & Kyngäs, H. (2008). The qualitative content analysis process. Journal of Advanced Nursing, 62(1), 107–115. https://doi.org/10.1111/j.1365-2648.2007.04569.x ● Otwarty dostęp
  4. Feinstein, A. R., & Cicchetti, D. V. (1990). High agreement but low kappa: I. The problems of two paradoxes. Journal of Clinical Epidemiology, 43(6), 543–549. https://doi.org/10.1016/0895-4356(90)90158-L
  5. Hallgren, K. A. (2012). Computing inter-rater reliability for observational data: An overview and tutorial. Tutorials in Quantitative Methods for Psychology, 8(1), 23–34. https://doi.org/10.20982/tqmp.08.1.p023 ● Otwarty dostęp
  6. Hsieh, H.-F., & Shannon, S. E. (2005). Three approaches to qualitative content analysis. Qualitative Health Research, 15(9), 1277–1288. https://doi.org/10.1177/1049732305276687
  7. Krippendorff, K. (2004). Reliability in content analysis: Some common misconceptions and recommendations. Human Communication Research, 30(3), 411–433. https://doi.org/10.1111/j.1468-2958.2004.tb00738.x
  8. Lombard, M., Snyder-Duch, J., & Bracken, C. C. (2002). Content analysis in mass communication: Assessment and reporting of intercoder reliability. Human Communication Research, 28(4), 587–604. https://doi.org/10.1111/j.1468-2958.2002.tb00826.x
  9. McHugh, M. L. (2012). Interrater reliability: The kappa statistic. Biochemia Medica, 22(3), 276–282. https://doi.org/10.11613/BM.2012.031 ● Otwarty dostęp
  10. O’Connor, C., & Joffe, H. (2020). Intercoder reliability in qualitative research: Debates and practical guidelines. International Journal of Qualitative Methods, 19, Article 1609406919899220. https://doi.org/10.1177/1609406919899220 ● Otwarty dostęp
  11. Sim, J., & Wright, C. C. (2005). The kappa statistic in reliability studies: Use, interpretation, and sample size requirements. Physical Therapy, 85(3), 257–268. https://doi.org/10.1093/ptj/85.3.257
  12. Singer, E., & Couper, M. P. (2017). Some methodological uses of responses to open questions and other verbatim comments in quantitative surveys. Methods, Data, Analyses, 11(2), 115–134. https://doi.org/10.12758/mda.2017.01 ● Otwarty dostęp: pełny tekst
  13. Züll, C. (2016). Open-ended questions. GESIS – Leibniz Institute for the Social Sciences. https://doi.org/10.15465/gesis-sg_en_002 ● Otwarty dostęp: pełny tekst

Cytowania BibTeX

@article{brown2001interval, author={Brown, Lawrence D. and Cai, T. Tony and DasGupta, Anirban}, title={{Interval estimation for a binomial proportion}}, journal={Statistical Science}, year={2001}, volume={16}, number={2}, pages={101--133}, doi={10.1214/ss/1009213286}}
@article{campbell2013coding, author={Campbell, John L. and Quincy, Charles and Osserman, Jordan and Pedersen, Ove K.}, title={{Coding in-depth semistructured interviews: Problems of unitization and intercoder reliability and agreement}}, journal={Sociological Methods \& Research}, year={2013}, volume={42}, number={3}, pages={294--320}, doi={10.1177/0049124113500475}}
@article{elo2008qualitative, author={Elo, Satu and Kyngäs, Helvi}, title={{The qualitative content analysis process}}, journal={Journal of Advanced Nursing}, year={2008}, volume={62}, number={1}, pages={107--115}, doi={10.1111/j.1365-2648.2007.04569.x}}
@article{feinstein1990high, author={Feinstein, Alvan R. and Cicchetti, Domenic V.}, title={{High agreement but low kappa: I. The problems of two paradoxes}}, journal={Journal of Clinical Epidemiology}, year={1990}, volume={43}, number={6}, pages={543--549}, doi={10.1016/0895-4356(90)90158-l}}
@article{hallgren2012computing, author={Hallgren, Kevin A.}, title={{Computing inter-rater reliability for observational data: An overview and tutorial}}, journal={Tutorials in Quantitative Methods for Psychology}, year={2012}, volume={8}, number={1}, pages={23--34}, doi={10.20982/tqmp.08.1.p023}}
@article{hsieh2005three, author={Hsieh, Hsiu-Fang and Shannon, Sarah E.}, title={{Three approaches to qualitative content analysis}}, journal={Qualitative Health Research}, year={2005}, volume={15}, number={9}, pages={1277--1288}, doi={10.1177/1049732305276687}}
@article{krippendorff2004reliability, author={Krippendorff, Klaus}, title={{Reliability in content analysis: Some common misconceptions and recommendations}}, journal={Human Communication Research}, year={2004}, volume={30}, number={3}, pages={411--433}, doi={10.1111/j.1468-2958.2004.tb00738.x}}
@article{lombard2002content, author={Lombard, Matthew and Snyder-Duch, Jennifer and Bracken, Cheryl Campanella}, title={{Content analysis in mass communication: Assessment and reporting of intercoder reliability}}, journal={Human Communication Research}, year={2002}, volume={28}, number={4}, pages={587--604}, doi={10.1111/j.1468-2958.2002.tb00826.x}}
@article{mchugh2012interrater, author={McHugh, Mary L.}, title={{Interrater reliability: The kappa statistic}}, journal={Biochemia Medica}, year={2012}, volume={22}, number={3}, pages={276--282}, doi={10.11613/bm.2012.031}}
@article{oconnor2020intercoder, author={O'Connor, Clíodhna and Joffe, Hélène}, title={{Intercoder reliability in qualitative research: Debates and practical guidelines}}, journal={International Journal of Qualitative Methods}, year={2020}, volume={19}, eid={1609406919899220}, doi={10.1177/1609406919899220}}
@article{sim2005kappa, author={Sim, Julius and Wright, Chris C.}, title={{The kappa statistic in reliability studies: Use, interpretation, and sample size requirements}}, journal={Physical Therapy}, year={2005}, volume={85}, number={3}, pages={257--268}, doi={10.1093/ptj/85.3.257}}
@article{singer2017some, author={Singer, Eleanor and Couper, Mick P.}, title={{Some methodological uses of responses to open questions and other verbatim comments in quantitative surveys}}, journal={Methods, Data, Analyses}, year={2017}, volume={11}, number={2}, pages={115--134}, doi={10.12758/mda.2017.01}}
@techreport{zull2016open, author={Züll, Cornelia}, title={{Open-ended questions}}, year={2016}, institution={GESIS – Leibniz Institute for the Social Sciences}, doi={10.15465/gesis-sg_en_002}}
R