Podstawy dziennikarstwa danych

Narzędzia i analiza danych

Ben Stanley

Wydział Nauk Społecznych, Uniwersytet SWPS

25 kwietnia 2026

Treści programowe

  • 25.04 Narzędzia i analiza danych
    • Narzędzia do pozyskiwania i analizy danych
    • Pułapki dziennikarstwa danych
    • Praktyka: tworzenie wizualizacji w Datawrapper

Plan dzisiejszego spotkania

  • Otwarcie (~15 min): Check-in grup — podsumowanie planów
  • Część 1 (~30 min): Proces + narzędzia + pułapki
    • Cztery etapy pracy z danymi
    • Narzędzia do każdego etapu (skrót)
    • Sześć pułapek dziennikarstwa danych
  • Przerwa (15 min)
  • Część 2 (~40 min): Praktyka: wizualizacja w Datawrapper
    • Analiza w jamovi → wizualizacja w Datawrapper → publikacja
  • Część 3 (~25 min): Ćwiczenie grupowe — dobór narzędzi
  • Część 4 (~5 min): Homework, deliverables, pobranie danych projektu przed seminarium 4

Co każda grupa przedstawia (2 min na grupę)

  1. Pytanie badawcze + „data-first” — o co pytacie i dlaczego akurat dane?
  2. Wybrane źródło główne + metoda dostępu + aktualny status (pobrano / w trakcie / wniosek złożony / problem)
  3. Największe ryzyko + odpowiadające kill criterion z datą
  4. Pytanie do grupy — czego sami jeszcze nie widzicie? Gdzie szukacie feedbacku?

Na co zwracamy uwagę słuchając

  • Pytanie badawcze: czy naprawdę konkretne? Czy każdy z czterech wymiarów (co / gdzie / kiedy / w podziale na co) jest jasno nazwany?
  • Uzasadnienie „data-first”: czy temat naprawdę wymaga danych, czy da się go zrobić reportażem?
  • Źródło: czy grupa sprawdziła dostępność (URL, zajrzała na stronę), czy tylko zakłada?
  • Status: jeśli „w trakcie” — czy jest realny plan, jak domknąć pozyskanie w tym tygodniu?
  • Kill criteria: czy mają konkretny warunek, datę i zaplanowaną reakcję — czy są życzeniem?
  • Plan B: czy cztery scenariusze z Plan B są konkretne i wykonalne?

Częste problemy, które widuję na tym etapie

  • Pytanie zbyt szerokie → zawężcie do konkretnego zakresu czasowego i geograficznego
  • Założenie, że dane muszą istnieć → jeśli jeszcze ich nie widzieliście na stronie, nie wiecie, że istnieją
  • Jedno źródło, brak weryfikacji → zidentyfikujcie drugie, niezależne źródło już teraz
  • Wniosek o informację publiczną nie został złożony → jeśli czekacie na dane niepubliczne, a wniosku nie ma, to 14 dni, których już nie odzyskacie
  • Kill criteria jako życzenie, nie decyzja„jeśli coś pójdzie nie tak, zmienimy plan” — to wyparcie, nie kill criterion
  • Plan B abstrakcyjny„zmienimy pytanie” bez wskazania, jak — dobry Plan B zmienia gatunek materiału, nie udaje, że projekt dokończy się „tak samo”

Cztery etapy pracy z danymi

Od pytania badawczego do publikacji

Każdy projekt data journalism — niezależnie od tematu i skali — przechodzi przez te same cztery etapy:

  • Etap 1: Pozyskiwanie — skąd bierzemy dane?
  • Etap 2: Czyszczenie — co z nimi robimy, żeby nadawały się do analizy?
  • Etap 3: Analiza — jakie pytania im zadajemy?
  • Etap 4: Wizualizacja — jak pokazujemy wyniki?

W praktyce proces jest iteracyjny — podczas analizy odkrywacie, że trzeba wrócić do czyszczenia; podczas wizualizacji okazuje się, że potrzeba dodatkowej zmiennej. To normalne.

Etap 1: pozyskiwanie — zwięźle

  • Oficjalne źródła statystyczne: GUS/BDL, NBP, NFZ, Eurostat, Bank Światowy
  • Dane pozyskiwane aktywnie: wnioski o informację publiczną, API, web scraping
  • Własne zbieranie: ankiety, crowdsourcing

Zasada: zaczynaj od najprostszej metody. Scraping i API to ostateczność, nie punkt startu.

Etap 2: czyszczenie — miejsce, gdzie giną projekty

  • Typowe problemy:
    • Braki danych (NA, puste komórki, zera)
    • Niespójne nazwy („Warszawa” vs „m. st. Warszawa”)
    • Błędy kodowania („Łódź”„Å•Ã³dź”)
    • Różne formaty dat i jednostek
  • Zasada: nigdy nie nadpisuj surowych danych — pracuj na kopiach
  • Dokumentuj każdą decyzję czyszczenia — inaczej za miesiąc nie będziecie pamiętać

Etap 3: analiza — od czego zacząć

Zawsze zacznijcie od podstaw:

  • Ile obserwacji? Jaki zakres wartości?
  • Ile braków i gdzie?
  • Czy są wartości odstające?

Dopiero potem:

  • Porównania między grupami/regionami
  • Trendy w czasie
  • Korelacje między zmiennymi

Etap 4: wizualizacja — dobór typu wykresu

Pytanie Typ wizualizacji
Jak coś zmieniało się w czasie? Wykres liniowy
Jak porównać kilka kategorii? Wykres słupkowy
Jaka jest struktura całości? Wykres kołowy / słupkowy skumulowany
Jak zjawisko rozkłada się w przestrzeni? Mapa choropleth
Czy istnieje związek między zmiennymi? Scatter plot

Narzędzia do każdego etapu

Rekomendowany zestaw dla początkujących

Etap Narzędzie Kiedy używać
Pozyskiwanie dane.gov.pl, GUS BDL Oficjalne dane polskie
Czyszczenie OpenRefine, Google Sheets Do ok. 50 tys. wierszy
Analiza jamovi, Orange Statystyki opisowe bez kodu
Wizualizacja Datawrapper, Flourish, Orange Publikacja interaktywna

⚠️ Pełny przegląd narzędzi zaawansowanych (Python, R, pandas, ggplot2, QGIS, Scrapy) znajdziecie w notatkach — dla większości projektów na tym kursie tego zestawu nie będziecie potrzebować.

Pipeline w praktyce: od dane.gov.pl do Datawrapper

Prześledźmy cały proces na jednym przykładzie — od surowego pliku do opublikowanego wykresu.

Pytanie badawcze i dane

Pytanie: Jak zmieniał się ruch na poszczególnych odcinkach granicy zewnętrznej Polski w pierwszym kwartale 2026 roku — i gdzie przyjazdów cudzoziemców jest więcej niż wyjazdów?

Źródło: Bazy ruchu granicznego — Straż Graniczna (dostawca: Komenda Główna Straży Granicznej, licencja CC0, aktualizacja miesięczna)

Konkretny plik: Baza ruchu granicznego STYCZEŃ–MARZEC 2026 — CSV/XLSX, ok. 18 tys. wierszy

Co otrzymujemy: jeden wiersz = jedno przejście graniczne × dzień × kategoria podróżnych (C = cudzoziemcy, RP = obywatele RP…) × kierunek (przyjazd/wyjazd). 24 kolumny: Placówka SG, Przejście, Rodzaj przejścia (drogowe/kolejowe/lotnicze/morskie), Odcinek, Oddział SG, Data, Kto, Kierunek, szczegóły odprawy (Paszportowy, MRG, Pozasystemowa…) i Razem.

Krok 1: pobranie z dane.gov.pl

  1. Wchodzimy na stronę datasetu 3595, klikamy zasób STYCZEŃ–MARZEC 2026
  2. Sprawdzamy metadane: data aktualizacji (10.04.2026), licencja CC0, opis przygotowany przez WIiS BAS KGSG
  3. Pobieramy CSV (ok. 2,3 MB) — nie XLSX, bo CSV jest prostszy i otwiera się w OpenRefine bez konwersji
  4. Zapisujemy kopię pod nazwą raw_ruch_graniczny_2026_Q1.csv
  5. Nie otwieramy go w Excelu na tym etapie — Excel potrafi zepsuć kodowanie polskich znaków i zamienić daty na format amerykański

💡 Zasada: surowy plik zostaje nietknięty. Wszystkie modyfikacje robimy na kopii.

Krok 2: czyszczenie w OpenRefine

Uruchamiamy OpenRefine lokalnie (działa w przeglądarce, ale dane nie opuszczają komputera). Importujemy CSV.

Typowe operacje na tych danych:

  • Text facet na kolumnie Odcinek → widzimy 5 wartości: z Federacją Rosyjską, z Ukrainą, z Republiką Białorusi, lotnicze, morskie
  • Text facet na kolumnie Kto → odkrywamy kody (C, RP, i inne) — dodajemy kolumnę Kto_pelne z czytelnymi opisami (C„cudzoziemcy”, RP„obywatele RP”)
  • Konwersja kolumny Data na typ date (zaraz szczegółowo) → dopiero potem Timeline facet działa
  • Numeric facet na Razem → wyłapujemy ekstremalne i zerowe wiersze
  • Export → CSV pod nazwą clean_ruch_graniczny_2026_Q1.csv

Krok 2 (cd.): co odkrywamy podczas czyszczenia

  • Wiele kolumn jest praktycznie pusta dla danego typu przejścia: Załogi statków rybackich ma wartości tylko na granicach morskich; Załogi samolotów — tylko na lotniczych. To nie są braki — to znaczenie „nie dotyczy”
  • Kod Kto nie jest opisany w pliku — wymaga zajrzenia do dokumentacji Straży Granicznej, zanim użyjemy go w publikacji
  • Granice wewnętrzne (TPKG) — kontrole wyrywkowe przywrócone tymczasowo — występują w danych obok granic zewnętrznych; decydujemy, czy je zostawiamy, czy filtrujemy

⚠️ Najważniejsze: OpenRefine zachowuje historię wszystkich operacji (JSON) — możecie ją wyeksportować i załączyć do projektu jako dokumentację czyszczenia. To wasz log decyzji czyszczenia.

Pułapka: „Invalid Date — Thu Jan 01 1970 01:00:00”

Kiedy klikacie Edit cells → Common transforms → To date na kolumnie Data i widzicie:

Invalid Date Invalid Date — Thu Jan 01 1970 01:00:00 GMT+0100

Co to znaczy: OpenRefine spróbował sparsować tekst jako datę, ale nie rozpoznał formatu. „1 stycznia 1970, 01:00 GMT+1” to epoch zero — uniksowy zerowy znacznik czasu, który pokazuje się, gdy parser dostał pusty ciąg lub coś, czego nie umie zinterpretować.

Dlaczego tak się dzieje tutaj: w pliku Straży Granicznej Data przychodzi jako tekst „2026-01-01” (lub czasem „01.01.2026”), ale OpenRefine nie zawsze wykrywa format ISO samodzielnie — zwłaszcza po imporcie z CSV z mieszanymi separatorami.

Fix: jawna konwersja z formatem

Na kolumnie Data klikamy Edit cells → Transform… i wpisujemy wyrażenie GREL zależnie od formatu:

Jeśli wartości wyglądają jak „2026-01-01” (ISO):

value.toDate("yyyy-MM-dd")

Jeśli jak „01.01.2026” (polski format z kropkami):

value.toDate("dd.MM.yyyy")

Jeśli są mieszane lub niepewnetoDate() z kilkoma formatami po kolei:

value.toDate("yyyy-MM-dd", "dd.MM.yyyy", "dd/MM/yyyy")

Po transformacji komórki zmieniają kolor na zielony (oznaczenie typu date w OpenRefine) i Timeline facet zaczyna działać.

Krok 3: analiza w jamovi

Otwieramy jamovi (darmowy, desktop) i wczytujemy clean-ruch-graniczny-2026-Q1.csv (dostępny w Resources/ruch-graniczny-walkthrough w repo kursu).

Zanim zaczniemy: w nagłówkach kolumn ustawiamy typ pomiaru (measure type) — Odcinek, Kierunek, Kto_pelne jako Nominal; Razem jako Continuous. Bez tego Split by nie zadziała.

Co liczymy na początek — zawsze:

  • Exploration → Descriptives: Razem do Variables, Odcinek do Split by → średnia, mediana, min/max dla każdej granicy; w panelu Statistics można dodać kwartyle, skośność, sumę
  • Exploration → Descriptives → Plots: histogram + box plot Razem per odcinek → widzimy skośność rozkładów
  • Frequencies → N Outcomes: Odcinek, Rodzaj przejścia, Kierunek, Kto_pelne → ile wierszy na kategorię
  • Frequencies → Contingency Tables: Odcinek × Kierunek z Counts na Razem (pole Counts) → czy przyjazdów jest więcej niż wyjazdów na każdej granicy

Wyniki jamovi są w formacie APA, gotowe do skopiowania do raportu.

Co pokazują frequency tables

Zanim policzymy cokolwiek dalej — co w ogóle jest w tym pliku?

  • 18 190 wierszy, dane dzienne styczeń–marzec 2026
  • 7 odcinków (nie 5, jak mogłoby się wydawać) — oprócz granic zewnętrznych są też z Republiką Federalną Niemiec i z Republiką Litewską (kontrole wyrywkowe TPKG na granicach wewnętrznych)
  • Kto_pelne: Cudzoziemcy (10 084 wiersze) vs Obywatele RP (8 106)
  • Kierunek: przyjazd (11 210) vs wyjazd (6 980) — już tu widać, że pliku nie można czytać symetrycznie

⚠️ Pierwsze odkrycie: asymetria liczby wierszy przyjazd vs wyjazd wymaga sprawdzenia, zanim cokolwiek zsumujemy — to nie jest równoważne pokrycie.

Descriptives Razem, split by Odcinek

Odcinek Valid średnia mediana max
droga lotnicza 4 546 1 083 363 9 978
z Ukrainą 4 554 790 82 8 814
z Rep. Federalną Niemiec 3 007 15 8 125
z Republiką Białorusi 2 173 362 68 4 648
granica morska 1 890 19 10 246
z Republiką Litewską 1 276 27 6 291
z Federacją Rosyjską 744 161 48 2 227

Odcinek × Kierunek — gdzie jest asymetria

Odcinek przyjazd wyjazd stosunek
droga lotnicza 2 472 420 2 451 208 1,01
z Ukrainą 1 790 109 1 809 218 0,99
z Republiką Białorusi 403 839 383 752 1,05
z Federacją Rosyjską 64 122 55 846 1,15
z Rep. Federalną Niemiec 45 441 8 5 680
z Republiką Litewską 34 141 0
granica morska 17 032 18 673 0,91

💡 Najciekawsze odkrycie: na granicach wewnętrznych (DE, LT) wyjazd ≈ 0 — TPKG rejestruje tylko wjazdy do Polski. Gdybyśmy policzyli „saldo migracji” bez tego rozróżnienia, wyszedłby absurd.

Top 10 przejść (suma Razem, Q1 2026)

Przejście Razem
Warszawa-Okęcie 1 720 515
Kraków-Balice 1 041 105
Medyka – Szeginie 879 072
Korczowa – Krakowiec 670 145
Katowice-Pyrzowice 585 865
Hrebenne – Rawa Ruska 463 364
Dorohusk – Jagodzin 460 560
Terespol – Brześć 444 428
Wrocław-Strachowice 381 807
Gdańsk-Rębiechowo 349 402

Pierwsze 4 przejścia to prawie połowa całego ruchu Q1 2026. Typowy long-tail — histogram potwierdza: mediana całego Razem = 48, ale 99. percentyl = 5 283.

Cudzoziemcy: saldo (przyjazd − wyjazd) na granicach zewnętrznych

Odcinek przyjazd wyjazd saldo
z Ukrainą 1 731 776 1 753 058 −21 282
droga lotnicza 810 455 816 169 −5 714
z Republiką Białorusi 374 845 357 227 +17 618
z Federacją Rosyjską 58 413 50 499 +7 914
granica morska 13 006 13 780 −774

Historia do opowiedzenia: w Q1 2026 więcej cudzoziemców wyjeżdża z Polski na Ukrainę niż przyjeżdża — saldo minus 21 tys. Odwrotnie na granicy białoruskiej (+17,6 tys.) i rosyjskiej (+7,9 tys.). Każda z tych trzech liczb to potencjalny artykuł.

Wniosek dla Kroku 4

Z analizy w jamovi wyszły trzy różne pytania wizualizacyjne, a nie jedno:

  1. Ruch w czasie per odcinek → wykres liniowy z 7 seriami, prawdopodobnie log-Y (różnice 3 rzędy wielkości)
  2. Przepływ cudzoziemców przyjazd vs wyjazd na granicach zewnętrznych → wykres słupkowy rozdzielony (split bars), saldo w podpisie
  3. Top przejścia → wykres słupkowy poziomy, posortowany, top 10

Nie wybieramy wizualizacji zanim nie zobaczymy liczb. Gdybyśmy od razu skoczyli do „mapy choropleth Polski”, zgubilibyśmy to, że ciekawy jest kierunek, nie geografia.

Krok 4: wizualizacja w Datawrapper

Bierzemy pytanie 2 (przepływ cudzoziemców) i robimy wykres słupkowy rozdzielony (split bars) w Datawrapper — dwa oddzielne słupki (przyjazd i wyjazd) obok siebie dla każdego odcinka.

  1. Przygotowanie: plik saldo-cudzoziemcy-granice-zewnetrzne-2026-Q1.csv — 5 wierszy (granice zewnętrzne), kolumny Odcinek, przyjazd, wyjazd, saldo
  2. Upload: wklejamy do Datawrapper
  3. Check & describe: przyjazd i wyjazd jako liczby, Odcinek jako etykieta (saldo pomijamy w tej wizualizacji — przyda się w podpisach)
  4. Visualize → Split bars:
    • Dwa słupki obok siebie per odcinek: przyjazd i wyjazd, paleta daltonizm-friendly (np. niebieski + pomarańczowy)
    • Sortowanie: malejąco po sumie (przyjazd + wyjazd) — największe przejścia na górze
    • Etykiety: wartości bezpośrednio na słupkach
  5. Annotate: tytuł mówi wniosek („Ruch cudzoziemców w obie strony, ale na Ukrainie saldo lekko ujemne”); źródło: „Straż Graniczna, dane.gov.pl, dataset 3595”; nota metodologiczna: „granice wewnętrzne DE/LT wyłączone — TPKG rejestruje tylko wjazdy”; saldo można dopisać w tooltipie albo jako adnotację przy Ukrainie
  6. Publish & embed: link + kod embed

Wynik: opublikowany wykres

Pipeline — podsumowanie

Krok Narzędzie Wynik
1. Pozyskanie dane.gov.pl (dataset 3595) raw_ruch_graniczny_2026_Q1.csv
2. Czyszczenie OpenRefine clean_ruch_graniczny_2026_Q1.csv + log operacji
3. Analiza jamovi Opis rozkładu, asymetria kierunków, saldo cudzoziemców → wybór pytania wizualizacyjnego
4. Wizualizacja Datawrapper Opublikowany wykres split bars (przyjazd vs wyjazd) + kod embed

Dlaczego akurat ten zestaw?

  • Wszystko darmowe, żadnych licencji
  • Bez programowania — żaden etap nie wymaga kodu
  • Dane nie opuszczają komputera na etapie czyszczenia i analizy (ważne dla RODO)
  • Każde narzędzie eksportuje do standardowego formatu (CSV, PNG, HTML) → nie wpadacie w vendor lock-in
  • Dokumentacja każdego kroku jest zachowana: log OpenRefine, plik .omv (jamovi), historia zmian Datawrapper

Pułapki dziennikarstwa danych

Pięć sposobów, na które liczby kłamią w twoim imieniu — nawet kiedy tego nie chcesz. Po przerwie wrócimy do nich jako filtra przy waszej własnej wizualizacji w Datawrapper.

Pułapka 1: korelacja jako przyczynowość

Dwie zmienne mogą rosnąć razem bez żadnego związku przyczynowego — bo obie reagują na coś trzeciego, albo zwyczajnie przez przypadek.

  • „Wzrost A zbiegł się ze wzrostem B” → nie znaczy, że A powoduje B
  • Confounder (zmienna ukryta): sprzedaż lodów i liczba utonięć rosną razem — bo latem jest gorąco
  • Odwrotna przyczynowość: może to B powoduje A, a nie odwrotnie

Czerwone flagi w nagłówku: „powoduje”, „prowadzi do”, „wywołuje” bez badania eksperymentalnego.

Jak pisać uczciwie: „wiąże się z”, „idzie w parze z”, „towarzyszy” — i zapytajcie eksperta o mechanizm.

Pułapka 2: cherry-picking — wybieranie tego, co pasuje

Pokazywanie tylko fragmentu danych, który potwierdza tezę, i milczenie o reszcie.

  • Dobór punktu startowego: „od 2020 roku…“ tak, żeby wyszło spektakularnie
  • Dobór podzbioru: tylko te regiony / lata / grupy, w których wynik jest mocny
  • Pominięcie outlierów bez uzasadnienia (czasem słusznie — ale wtedy trzeba to powiedzieć)

Test uczciwości: czy mogę pokazać te same dane w pełnym zakresie czasowym i nadal mam tę samą historię? Jeśli nie — to nie mam historii.

Pułapka 3: wykres, który oszukuje

To najczęstsza pułapka, bo popełnia się ją nieświadomie — Excel, Datawrapper i inne narzędzia same proponują ustawienia, które wyolbrzymiają różnice.

  • Oś Y nie od zera → różnica 2 % wygląda jak 200 %
  • Niekonsekwentne osie między wykresami w jednym artykule
  • Wykres kołowy z 8+ kategoriami → nikt tego nie odczyta
  • Trójwymiarowe słupki → zniekształcają proporcje
  • Czerwono-zielona paleta → dla ok. 8 % mężczyzn nieczytelna

Regułka: domyślnie oś od zera. Wyjątek (np. skala log dla danych silnie prawoskośnych — jak nasz ruch graniczny) wymaga podpisu w nocie wykresu.

Te same dane, dwie historie

Wykres A: oś Y 49–51 %, słupki dramatycznie różnej wysokości, tytuł „POPARCIE ZAŁAMAŁO SIĘ”

Wykres B: oś Y 0–100 %, słupki prawie identyczne, tytuł „Poparcie praktycznie bez zmian”

Dane: 50,3 % → 49,7 %.

  • Który wykres jest prawdziwszy? Żaden nie kłamie w danych — oba kłamią w narracji wokół nich
  • W jakim kontekście spadek o 0,6 pp naprawdę ma znaczenie? (np. w wyborach z marginesem błędu 2 pp — to jest w granicach szumu)
  • Co trzeba by dodać, żeby wykres A był uczciwy? (margines błędu, wcześniejszą serię, oznaczenie skali)

Pułapka 4: agregacja ukrywa różnice

Średnia krajowa to wygodna wymówka, żeby nie patrzeć dalej.

  • Średnia kraj ≠ średnia region ≠ średnia miasto — każdy poziom opowiada inną historię
  • Liczba bezwzględna czy wskaźnik? Warszawa ma najwięcej przestępstw, bo ma najwięcej ludzi — na 100 tys. mieszkańców wygląda przeciętnie
  • Tempo zmian: „wzrost o 100 %“ z 2 przypadków do 4 to nie to samo, co wzrost o 50 % z 2 mln do 3 mln

Praktyczna reguła dla waszych projektów: jeśli jednostką jest kraj/region/miasto, zawsze sprawdźcie wskaźnik per capita obok liczby bezwzględnej. Wybór między nimi to decyzja redakcyjna — ale musicie znać oba.

Pułapka 5: oficjalne ≠ prawdziwe

Dane z dane.gov.pl, GUS czy NBP są wiarygodnym punktem wyjścia — ale nie są prawdą objawioną.

  • Zmiany metodologii wyglądają jak zmiany zjawiska: nowa definicja bezrobocia = „nagły spadek”, który wynika z arkusza, nie z rynku pracy
  • Dane rejestrują to, co zostało zmierzone: ciemna liczba w statystykach przestępczości, nieraportowane przypadki przemocy domowej, szara strefa w PKB
  • Dane są nieaktualne: GUS publikuje z opóźnieniem kilku miesięcy do lat — sprawdźcie datę odniesienia, nie datę publikacji
  • Różne instytucje liczą to samo inaczej: inflacja GUS vs inflacja NBP vs koszyk Eurostatu — trzy różne liczby, wszystkie poprawne

Co robicie z tym w praktyce: czytacie notę metodologiczną (zawsze jest), porównujecie z drugim źródłem, zapisujecie datę odniesienia w artykule.

Wnioski z pułapek

Każda z pięciu pułapek ma ten sam kształt: dane są poprawne, ale historia wokół nich wprowadza w błąd.

To nie jest problem techniczny — to kwestia uczciwości narracji.

Po przerwie dostaniecie zbiór danych o przestępczości w polskich powiatach i wasze zadanie będzie proste: przeanalizować je w jamovi i zrobić wykres, który nie popełnia żadnej z tych pięciu pułapek.

☕ Przerwa

Praktyka: jamovi + Datawrapper

Pytanie redakcyjne: „Gdzie w Polsce jest najwięcej przestępstw — i czy to, co widzimy w nagłówkach, zmienia się, kiedy policzymy to per capita?“

Do końca tej części każdy z was opublikuje własny wykres oparty na własnej analizie w jamovi.

Dane

Na Classroom (i w Resources kursu) znajdziecie plik przestepstwa-powiaty-2025.csv — fikcyjny, ale zbudowany tak, żeby przypominał realne statystyki policyjne.

12 kolumn, wszystkie 380 powiatów Polski:

  • teryt — 4-cyfrowy kod TERYT (klucz do mapy w Datawrapper)
  • powiat, województwo, typ_powiatu (miejski / ziemski), ludność
  • przestępstwa_ogółem — suma wszystkich zdarzeń w 2025 r.
  • przestępstwa_na_100k — wskaźnik na 100 tys. mieszkańców
  • kryminalne, drogowe, gospodarcze, przeciwko_rodzinie, inne — rozbicie na kategorie

⚠️ 10 par powiatów ma te same nazwy (brzeski, grodziski, świdnicki…) w różnych województwach → dlatego w pliku jest kolumna teryt — klucz do poprawnego łączenia z mapą.

⚠️ Dane są dydaktyczne, nie publikujcie ich jako rzeczywistych. Celem jest warsztat analityczny, nie źródło cytowania.

Dlaczego to pytanie?

W polskich mediach regularnie pojawiają się nagłówki typu „Warszawa najbardziej niebezpiecznym miastem Polski” — na podstawie liczb bezwzględnych. To jest Pułapka 4: agregacja ukrywa różnice.

Wasze zadanie: sprawdzić, czy to prawda, i zdecydować jako redakcja — jaką historię naprawdę opowiadają te dane?

  • Historia A: „Duże miasta dominują” (absolutne liczby)
  • Historia B: „Hotspoty są gdzie indziej” (wskaźnik per capita)
  • Historia C: coś, czego jeszcze nie widzicie (zobaczycie po analizie)

Część 1: analiza w jamovi (15 min)

Otwórzcie jamovi i wczytajcie CSV. Ustawcie typy pomiaru w nagłówkach: typ_powiatu, województwo jako Nominal; zmienne liczbowe jako Continuous.

Policzcie trzy rzeczy:

  1. Descriptives dla przestępstwa_ogółem i przestępstwa_na_100k (bez split by) — średnia, mediana, min, max, skośność. Porównajcie skośność obu zmiennych. Która jest bardziej prawoskośna? Co to mówi o wyborze skali na osi wykresu?
  2. Descriptives ze Split by typ_powiatu — czy miejskie i ziemskie mają tę samą średnią na 100k? Która grupa ma większą rozrzut?
  3. Sortowanie — ręcznie w arkuszu jamovi (ikona sortowania w nagłówku) albo w Excelu: wypiszcie top 10 powiatów po przestępstwa_ogółem i top 10 po przestępstwa_na_100k. Porównajcie listy.

Pytania, na które odpowiadacie sobie sami

Po zakończeniu analizy zapiszcie sobie odpowiedzi (nie oddajemy, to dla waszej dyscypliny):

  • Które powiaty są w obu top-10 (absolut i per capita)?
  • Ile powiatów w top-10 per capita to miasta, a ile ziemskie?
  • Czy w danych są wyraźne outliery? Jak byście je opisali w tekście?
  • Gdybyście mieli jedno zdanie nagłówka, brzmiałoby ono jak?

💡 To nagłówek będzie waszym tytułem wykresu w Datawrapper. Nie opisowym („Przestępczość w powiatach 2025”), tylko komunikującym wniosek („Najwięcej przestępstw w Warszawie — ale per capita liderują małe powiaty na południu”).

Część 2: wizualizacja w Datawrapper (20 min)

Zalogujcie się na datawrapper.de. Macie do wyboru trzy formaty — wybierzcie jeden, który najlepiej odpowiada waszej historii z Części 1:

  • Mapa choropleth powiatów Polski — jeśli chcecie pokazać rozkład geograficzny. Datawrapper ma gotową mapę; klucz łączenia: kolumna teryt (nie powiat, bo są duplikaty nazw)
  • Wykres słupkowy poziomy, top 15 — jeśli chcecie ranking. Zdecydujcie, czy sortujecie po ogółem, czy na_100k (to jest wasza decyzja redakcyjna, nie techniczna)
  • Scatter plot ludność vs przestępstwa_ogółem, z kolorem wg typ_powiatu — jeśli chcecie pokazać, że to skala, a nie bezpieczeństwo, tłumaczy nagłówki

Cztery kroki Datawrapper

  1. Upload data — Ctrl+V albo wgrajcie CSV
  2. Check & describe — sprawdźcie typy kolumn (ludność, przestępstwa… — liczby; powiat, województwo — tekst)
  3. Visualize — wybierzcie typ, dopasujcie, dodajcie tytuł komunikujący wniosek i źródło („dane dydaktyczne, kurs Podstawy dziennikarstwa danych”)
  4. Publish & embed — opublikujcie, zapiszcie link

Szczegółowe kroki — handout Datawrapper.

Self-check przed publikacją (5 pułapek)

Zanim klikniecie Publish, sprawdźcie własny wykres:

Jeśli trzy lub więcej haków jest czerwone — wracacie do Datawrapper i poprawiacie. Nie publikujecie wykresu, który sami byście skrytykowali.

Oddajecie na Classroom

  • Link do opublikowanego wykresu + jedno zdanie uzasadnienia wyboru formatu („wybrałam mapę bo chciałam pokazać, że hotspoty per capita są w jednej części Polski”)

Do końca części 2 seminarium.

Część 3: dobór narzędzi do projektu

Ćwiczenie grupowe — dobór narzędzi (25 min)

  • Każda grupa wypełnia Część A w ćwiczeniu seminarium 3 (zapisujecie we własnym dokumencie)
  • Zadanie: wybierz narzędzie do każdego z czterech etapów i uzasadnij wybór
    • Pozyskiwanie — jak pobierzecie dane?
    • Czyszczenie — czym oczyścicie?
    • Analiza — w czym policzycie statystyki?
    • Wizualizacja — czym zrobicie wykresy/mapy?
  • Zidentyfikujcie luki kompetencyjne — czego musi się ktoś w grupie nauczyć?

Dlaczego właśnie teraz?

Po 40 minutach praktyki w Datawrapper macie znacznie lepszą podstawę do podjęcia decyzji o narzędziach:

  • Wiecie, co Datawrapper potrafi (i czego nie potrafi)
  • Macie pierwszy konkretny doświadczenie z workflow Upload → Check → Visualize → Publish
  • Możecie realnie ocenić, czy Datawrapper wystarczy waszemu projektowi, czy trzeba czegoś zaawansowanego

Prezentacja grup (5 min na wszystkie)

Każda grupa w 60 sekundach:

  1. Wasz zestaw narzędzi dla czterech etapów
  2. Największa luka kompetencyjna i plan jej uzupełnienia

Pozostałe grupy: czy widzicie lepszą opcję?

Część 4: homework i deliverables

Dwa deliverables do 08.05

  1. Link do waszego opublikowanego wykresu z Datawrapper (z ćwiczenia na zajęciach)
    • Wyślijcie na Classroom — wszyscy indywidualnie
  2. Plan narzędzi (Część A) + mapa ryzyk (Część B)
    • Jako grupa — pełna tabela narzędzi + 3–5 ryzyk z kategoriami, prawdopodobieństwem, wpływem i planem łagodzenia
    • Szczególnie: największe zagrożenie i plan B

⚠️ Musicie mieć własne dane projektu przed seminarium 4

Seminarium 4 (09.05) jest warsztatem wizualizacji waszych własnych danych projektu w Datawrapper. Bez pobranych danych nie będziecie mogli w pełni uczestniczyć w ćwiczeniu.

  • Do 09.05 musicie mieć pobrany i wstępnie oczyszczony zbiór danych — CSV, XLSX lub Google Sheet, gotowy do wgrania do Datawrapper
  • Jeśli czekacie na wniosek o informację publiczną — termin 14 dni oznacza, że wniosek powinien być złożony najpóźniej w tym tygodniu
  • Jeśli dane są w PDF — konwersja przez Tabulę/Camelot też zajmuje czas; zacznijcie wcześniej
  • Backup: jeśli główne źródło nie dotrze na czas, przywieźcie cokolwiek — fragment, podzbiór, dane testowe — żeby móc pracować nad prototypem

To nie jest opcja. Grupy bez danych na seminarium 4 będą musiały nadgonić w czasie warsztatu zamiast wykorzystać go do prototypowania finalnych wizualizacji projektu.

Seminarium 4 otwieramy od…

  • Krótkiego check-inu (5 min) — pokażemy 2–3 wybrane wykresy z Classroom i omówimy, co w nich działa
  • Przeglądu najczęstszych ryzyk, które grupy zidentyfikowały
  • Sprawdzenia, czy każda grupa ma przy sobie dane projektu — bez nich Część 2 seminarium 4 nie ma sensu

Ten rytm praca → deliverable → check-in działa tylko wtedy, gdy deliverables są na czas. Prześlijcie wcześniej, jeśli możecie.

Kluczowe wnioski

  • Cztery etapy — pozyskiwanie, czyszczenie, analiza, wizualizacja — dotyczą każdego projektu
  • Czyszczenie to 50–80% czasu — to nie są puste słowa
  • Datawrapper wystarcza do większości projektów data journalism
  • Pułapki są wszędzie — pre-publication checklist to wasz filtr
  • Macie pierwszy opublikowany wykres — to już portfolio
  • Na seminarium 4 (09.05) przychodzicie z pobranymi danymi projektu — bez tego warsztat wizualizacji nie zadziała