Zadanie 6 Nieklasyczne Metody Analizy Danych

Test pustych cel (test Davida-Hellwiga) z wykorzystaniem AI

Author

Jakub Siemek

1. Wstęp

1.1 Teoria testu pustych cel

Weryfikacja zgodności rozkładu danych z rozkładem normalnym stanowi jeden z podstawowych etapów analizy statystycznej. Wiele metod wykorzystywanych w statystyce matematycznej oraz ekonometrii wymaga spełnienia założenia normalności rozkładu badanej zmiennej lub reszt modelu.

Jednym z nieparametrycznych narzędzi służących do badania normalności jest test pustych cel, nazywany również testem Davida-Hellwiga. Test ten znajduje zastosowanie szczególnie w przypadku małych prób, dla których klasyczne testy normalności mogą charakteryzować się ograniczoną skutecznością.

Idea klasycznego testu opiera się na podziale zakresu zmienności badanej cechy na określoną liczbę przedziałów (\(k\)). Ponieważ klasyczny test weryfikuje hipotezę o rozkładzie jednostajnym, aby zastosować go do badania normalności rozkładu, należy dokonać standaryzacji danych, a następnie przetransformować je za pomocą dystrybuanty teoretycznej rozkładu normalnego \(\Phi(x)\).

Dzięki temu, przy prawdziwości hipotezy zerowej, dane zostaną sprowadzone do rozkładu jednostajnego na przedziale \((0,1)\), a ich podział na równe podprzedziały staje się matematycznie poprawny.

Hipotezy testowe mają postać: \[\begin{aligned} H_0 &: \text{badana zmienna posiada rozkład normalny} \\ H_1 &: \text{badana zmienna nie posiada rozkładu normalnego} \end{aligned}\]

Statystyką testową jest liczba pustych komórek oznaczana symbolem \(K\). Im większa liczba pustych cel, tym większe przesłanki do odrzucenia hipotezy o normalności rozkładu.

2. Implementacja testu pustych cel w języku R

2.1 Prompt wykorzystany do wygenerowania kodu

Do przygotowania implementacji wykorzystano narzędzie ChatGPT firmy OpenAI.

Wykorzystany prompt:

“Napisz funkcję w języku R realizującą ideę testu pustych cel Davida-Hellwiga. Funkcja powinna podzielić dane na przedziały oraz obliczyć liczbę pustych komórek.”

2.2 Pierwotna funkcja wygenerowana przez AI

Code
test_pustych_cel_ai = function(x, k = 6){

  granice = seq(
    min(x),
    max(x),
    length.out = k + 1
  )

  liczebnosci = hist(
    x,
    breaks = granice,
    plot = FALSE
  )$counts

  puste_cele = sum(liczebnosci == 0)

  return(
    list(
      liczebnosci = liczebnosci,
      puste_cele = puste_cele
    )
  )
}

2.3 Rezultaty sprawdzenia kodu AI i wersja poprawiona

Po krytycznej analizie kodu wygenerowanego przez ChatGPT zidentyfikowano istotne błędy merytoryczne i metodologiczne:

Błąd wyznaczania przedziałów: Kod AI tworzy przedziały na podstawie min(x) i max(x). W efekcie pierwsza i ostatnia komórka zawsze zawierają co najmniej jedną obserwację, co sztucznie zaniża statystykę \(K\).

Brak transformation zmiennej: Kod dzieli na równe przedziały surowe dane. W przypadku rozkładu normalnego skrajne przedziały naturalnie byłyby puste z powodu niskiej gęstości prawdopodobieństwa w “ogonach”, co prowadziłoby do błędnego odrzucania hipotezy zerowej.

Zła liczba klas: Sztywny podział na \(k=6\) klas uniemożliwia poprawne porównanie wyników z tablicami statystycznymi prof. Domańskiego, które najczęściej wymagają założenia liczby klas równej liczebności próby (\(k=n\)).

Poniżej przedstawiono poprawną matematycznie funkcję realizującą test Davida-Hellwiga:

Code
test_pustych_cel = function(x, k = length(x)){
  n = length(x)
  
  # Standaryzacja i transformacja dystrybuantą do rozkładu jednostajnego U(0,1)
  x_trans = pnorm(x, mean = mean(x), sd = sd(x))
  
  # Podział przedziału (0,1) na k równych części
  granice = seq(0, 1, length.out = k + 1)

  liczebnosci = hist(
    x_trans,
    breaks = granice,
    plot = FALSE
  )$counts

  puste_cele = sum(liczebnosci == 0)

  return(
    list(
      n = n,
      liczba_przedzialow = k,
      liczebnosci = liczebnosci,
      statystyka_K = puste_cele
    )
  )
}

3. Rozkład statystyki testowej

3.1 Idea liczby pustych komórek

Statystyką testową w teście Davida-Hellwiga jest liczba pustych komórek \(K\). Dla danych zgodnych z rozkładem normalnym obserwacje po transformacji dystrybuantą powinny być rozmieszczone względnie równomiernie pomiędzy kolejnymi przedziałami na odcinku \((0,1)\), co powoduje niewielką liczbę pustych cel.

W przypadku rozkładów odbiegających od normalności część przedziałów może nie zawierać żadnych obserwacji. Powoduje to wzrost wartości statystyki \(K\) i może prowadzić do odrzucenia hipotezy zerowej.

3.2 Wizualizacja rozkładu

dane_normalne = rnorm(1000)
dane_przetransformowane = pnorm(dane_normalne, mean = mean(dane_normalne), sd = sd(dane_normalne))

ggplot(
  data.frame(x = dane_przetransformowane),
  aes(x)
)+
  geom_histogram(
    breaks = seq(0, 1, length.out = 21),
    fill = kolor_niebieski,
    color = "white"
  )+
  labs(
    title = "Rozkład danych po transformacji dystrybuantą (Test jednostajności)",
    x = "Przetransformowana wartość (0-1)",
    y = "Liczebność"
  )+
  theme(
    panel.background = element_rect(fill = tlo_wykresu),
    plot.background = element_rect(fill = tlo_wykresu),
    text = element_text(color = kolor_tekstu_i_osi),
    axis.text = element_text(color = kolor_tekstu_i_osi)
  )

Na powyższym wykresie przedstawiono próbę po transformacji dystrybuantą. Widać, że liczebności w podprzedziałach oscylują wokół stałego poziomu, co obrazuje sprowadzenie cechy do rozkładu jednostajnego.

4. Przykład zastosowania

4.1 Analiza przykładowych danych

W celu zaprezentowania działania testu wygenerowano próbę składającą się z 25 obserwacji pochodzących z rozkładu normalnego.

Code
dane = rnorm(25)

wynik = test_pustych_cel(dane)

wynik
$n
[1] 25

$liczba_przedzialow
[1] 25

$liczebnosci
 [1] 0 0 1 2 1 0 4 1 3 1 2 1 1 1 0 0 0 0 1 0 1 1 2 0 2

$statystyka_K
[1] 9

4.2 Interpretacja wyniku

df = data.frame(
  przedzial = 1:length(wynik$liczebnosci),
  liczebnosc = wynik$liczebnosci
)

ggplot(
  df,
  aes(
    factor(przedzial),
    liczebnosc
  )
)+
  geom_col(fill = kolor_niebieski)+
  geom_hline(aes(yintercept = 1), color = kolor_czerwony, linetype = "dashed", linewidth = 1)+
  labs(
    title = paste("Liczebności obserwacji w komórkach (Zaobserwowane K =", wynik$statystyka_K, ")"),
    x = "Numer komórki",
    y = "Liczebność"
  )+
  theme(
    panel.background = element_rect(fill = tlo_wykresu),
    plot.background = element_rect(fill = tlo_wykresu),
    text = element_text(color = kolor_tekstu_i_osi),
    axis.text = element_text(color = kolor_tekstu_i_osi),
    axis.text.x = element_text(angle = 90, vjust = 0.5)
  )

Na podstawie wykresu oraz wartości zmiennej statystyka_K można określić, ile przedziałów pozostało pustych. Czerwona przerywana linia reprezentuje idealną, oczekiwaną liczebność (1 obserwacja na komórkę).

5. Tabela wartości krytycznych

5.1 Wartości krytyczne testu Davida-Hellwiga

W teście Davida-Hellwiga otrzymaną wartość statystyki \(K\) porównuje się z odpowiednią wartością krytyczną \(k_\alpha\).

wartosci_krytyczne = data.frame(
  alpha = c(
    rep("0.01",5),
    rep("0.05",5),
    rep("0.10",5)
  ),

  n = c(
    10,20,30,40,50,
    10,20,30,40,50,
    10,20,30,40,50
  ),

  k_alpha = c(
    6,11,16,20,24,
    6,10,15,18,22,
    5,10,14,18,22
  )
)

knitr::kable(wartosci_krytyczne, caption = "Wartości krytyczne testu Davida-Hellwiga przy założeniu k = n")
Wartości krytyczne testu Davida-Hellwiga przy założeniu k = n
alpha n k_alpha
0.01 10 6
0.01 20 11
0.01 30 16
0.01 40 20
0.01 50 24
0.05 10 6
0.05 20 10
0.05 30 15
0.05 40 18
0.05 50 22
0.10 10 5
0.10 20 10
0.10 30 14
0.10 40 18
0.10 50 22

Jak można zauważyć, wartości krytyczne rosną wraz ze wzrostem liczebności próby.

Reguła decyzyjna: Jeśli obliczona liczba pustych cel \(K \ge k_\alpha\), hipotezę \(H_0\) należy odrzucić. Dla analizowanej próby \(n=25\) przy poziomie istotności \(\alpha = 0.05\) wartość krytyczna wynosi w przybliżeniu ok. \(12-13\). Ponieważ uzyskana w sekcji 4.1 wartość empiryczna \(K\) jest znacznie niższa, brak jest podstaw do odrzucenia hipotezy \(H_0\) – rozkład cechy jest normalny.

6. Zakończenie i wnioski

W niniejszym projekcie przedstawiono test pustych cel, znany również jako test Davida-Hellwiga. Omówiono jego podstawy teoretyczne, zaprezentowano implementację w języku R oraz wykonano przykładową analizę danych.

Kluczowym elementem projektu było krytyczne zweryfikowanie wyników działania sztucznej inteligencji (ChatGPT). Wykazano błędy metodologiczne popełnione przez AI (brak transformacji standaryzującej, zły dobór granic klas) oraz przedstawiono poprawny algorytm. Wyniki pokazują, że test pustych cel może być z powodzeniem stosowany do oceny normalności, jednak automatyczne generowanie kodu przez AI zawsze wymaga nadzoru merytorycznego ze strony analityka.

7. Bibliografia

Domański C. (2009), Własności testu Davida-Hellwiga, Przegląd Statystyczny.

Domański C., Pruska K. (2000), Nieklasyczne metody statystyczne, PWE, Warszawa.

Hellwig Z. (1965), Zastosowanie metody pustych komórek w badaniu rozkładów empirycznych, Przegląd Statystyczny.

Dolnośląska Biblioteka Cyfrowa: https://www.dbc.wroc.pl/dlibra/publication/157415/edition/119110/content

Wikipedia, Normal distribution: https://en.wikipedia.org/wiki/Normal_distribution

Wikipedia, Statistical hypothesis testing: https://en.wikipedia.org/wiki/Statistical_hypothesis_testing