Oracle Statistical Functions 11g: statystyka dla dużych i małych
Transkrypt
Oracle Statistical Functions 11g: statystyka dla dużych i małych
XVI Konferencja PLOUG Kościelisko Październik 2010 Oracle Statistical Functions 11g: statystyka dla dużych i małych Mikołaj Morzy Instytut Informatyki Politechniki Poznańskiej [email protected] Abstrakt. Baza danych Oracle 11g posiada wbudowany bardzo szeroki wachlarz narzędzi statystycznych. W połączeniu z narzędziami Oracle OLAP i Oracle Data Mining zbiór narzędzi statystycznych, w które wyposażona jest baza danych Oracle 11g tworzy potężne środowisko analityczne. W zależności od potrzeb użytkownicy mogą wykorzystywać tylko najprostsze funkcje, np. statystykę opisową lub testowanie hipotez, funkcje analityczne lub funkcje regresji liniowej, ale mogą także sięgnąć po mocniejsze narzędzia: testowa-nie dopasowania rozkładów, analizę wariancji (ANOVA), parametryczne i bezparemetryczne modele kore-lacji czy testy c2. W niniejszym artykule przedstawiono przegląd narzędzi statystycznych oferowanych przez bazę danych Oracle 11g, ilustrując poszczególne narzędzia przykładami zastosowań.. Informacja o autorze. Dr hab. inż. Mikołaj Morzy jest adiunktem w Instytucie Informatyki Politechniki Poznańskiej. Jego zainteresowania naukowe koncentrują się przede wszystkim na tematyce eksploracji danych - jest on autorem ponad czterdziestu publikacji dotyczących tej tematyki. Drugą dziedziną zainteresowań i głównym tematem działalności dydaktycznej Mikołaja Morzego są technologie aplikacji internetowych i rozproszonych oraz technologie związane z bazami danych i hurtowniami danych. Oracle Statistical Functions 11g: statystyka dla dużych i małych 283 1. Analiza statystyczna w bazie danych Historycznie, silniki zarządzania bazami danych były przeznaczone do wykonywania nieskomplikowanych obliczeń na danych relacyjnych. Język SQL został zaprojektowany w oparciu o algebrę relacji i operatory relacyjne działające na zbiorach krotek. Początkowo, jedyna możliwość dokonywania jakichkolwiek obliczeń statystycznych ograniczała się do niewielkiego zbioru podstawowych funkcji grupowych, takich jak wyznaczanie najmniejszej i największej wartości w zbiorze, wyznaczanie wartości średniej, wariancji i odchylenia standardowego, czy wreszcie wyznaczanie liczności zbioru. Oprócz pracy na całym zbiorze krotek zwróconym przez zapytanie, język SQL oferował także klauzulę GROUP BY umożliwiającą dokonanie partycjonowania zbioru krotek na rozłączne podgrupy i wyznaczenie wybranych statystyk niezależnie w każdej grupie. Z biegiem lat okazało się, że tak proste możliwości analityczne są dalece niewystarczające i że konieczne jest rozszerzenie funkcjonalności baz danych o nowe, silniejsze narzędzia analityczne. Dostawcy systemów baz danych szybko dostrzegli możliwość zbudowania przewagi konkurencyjnej poprzez dostarczenie wraz z bazą danych narzędzi analitycznych. Tradycyjne podejście, bazujące na eksportowaniu surowych danych z bazy danych i wykonywaniu analiz statystycznych za pomocą narzędzi zewnętrznych, takich jak arkusze kalkulacyjne lub pakiety statystyczne, niosło ze sobą wiele niedogodności. Po pierwsze, wymagało fizycznego przenoszenia danych pomiędzy różnymi systemami. Po drugie, moment przeniesienia danych do systemu zewnętrznego zawsze obarczony był dużym ryzykiem. Niezależnie od jakości procedur bezpieczeństwa implementowanych na poziomie bazy danych, dane „wyciekały” poza organizację w wyniku ich rozproszenia pomiędzy różnymi narzędziami. Wreszcie, gwałtowny rozwój systemów informatycznych i gigantyczny wzrost wolumenów przetwarzanych danych postawił przed użytkownikami problem efektywności przetwarzania analitycznego za pomocą narzędzi uruchamianych na komputerach klasy desktop. Przeniesienie przetwarzania analitycznego bezpośrednio do silnika bazy danych niesie ze sobą wiele zalet. System informatyczny wykorzystujący bazę danych jako środowisko przeprowadzania analiz statystycznych jest bezpieczniejszy i solidniejszy, aplikacje krytyczne dla działania przedsiębiorstwa lub organizacji działają pewniej i cechują się zwiększoną dostępnością, przetwarzanie statystyczne wykorzystuje zasoby obliczeniowe przydzielone do serwera bazy danych (najczęściej te zasoby są wielokrotnie większe niż zasoby dostępne dla komputerów klasy desktop). Nie należy także bagatelizować zysków wynikających z uproszczonej integracji przetwarzania statystycznego z aplikacjami klienckimi: taka integracja jest dużo prostsza na poziomie serwera bazy danych niż samej aplikacji. Przetwarzanie statystyczne i analityczne realizowane na poziomie bazy danych może być bezpośrednio wplecione w złożone zapytania dostarczające dane do aplikacji desktopowych. W ten sposób aplikacje mogą być wzbogacone o wartość dodaną wynikającą ze zwiększenia jakości i użyteczności danych prezentowanych użytkownikowi końcowemu. Nawet najtrudniejsze i najbardziej zasobochłonne zapytania statystyczne mogą być efektywnie przetworzone, np. poprzez wykorzystanie możliwości zrównoleglenia przetwarzania realizowanego na poziomie serwera bazy danych. Realizowanie przetwarzania statystycznego na poziomie bazy danych umożliwia także rozproszenie kosztownych obliczeń pomiędzy węzły systemu gridowego, jeśli baza danych pracuje w takiej architekturze. Obliczenia mogą być realizowane praktycznie w trybie czasu rzeczywistego, dostarczając wymaganą informację (oraz wiedzę) do użytkowników końcowych i umożliwiając im podejmowanie świadomych decyzji biznesowych. Wreszcie, architektura serwera bazy danych pozwala także na planowanie i szeregowanie zadań w postaci pakietów obliczeń wsadowych, co umożliwia przeniesienie najkosztowniejszych obliczeń do najbardziej odpowiednich okien czasowych i pełniejsze wykorzystanie zasobów. 284 Mikołaj Morzy 2. Funkcje grupowe i analityczne Jak już wcześniej wspomniano, poszczególni dostawcy systemów baz danych szybko rozpoczęli rozszerzanie możliwości analitycznych oferowanych przez siebie produktów poprzez dodawanie nowych, niestandardowych funkcji grupowych. Przykładowo, w bazie danych Oracle 11g „wartość średnią” w zbiorze można wyznaczyć na trzy sposoby, w zależności od rozumienia pojęcia „wartość średnia” (użytego w sensie kolokwialnym): SQL> SELECT AVG(sal), MEDIAN(sal), STATS_MODE(sal) FROM emp; AVG(SAL) MEDIAN(SAL) STATS_MODE(SAL) ---------- ----------- --------------2073.21429 1550 1250 W powyższym przykładzie funkcja AVG(sal) wyznacza średnią arytmetyczną zbioru liczb reprezentujących pensje pracowników, funkcja MEDIAN(sal) wyznacza medianę zbioru, natomiast funkcja STATS_MODE(sal) wyznacza wartość modalną w zbiorze. Dla przypomnienia, medianą zbioru (wartością środkową, drugim kwantylem) nazywamy tę wartość cechy w szeregu uporządkowanym, powyżej i poniżej której znajduje się dokładnie tyle samo wartości. Jeśli w zbiorze mamy nieparzystą liczbę wartości n, to medianą zbioru będzie wartość elementu o numerze , jeśli zaś zbiór zawiera parzystą liczbę elementów, to medianą zbioru jest średnia arytmetyczna między elementami o numerach oraz (oczywiście mowa tu o numerach elementów zbioru w szeregu uporządkowanym). Wartość modalna (wartość najczęstsza, moda, dominanta) w zbiorze to wartość najczęściej występująca, zatem o ile wartość średnia i wartość środkowa nie muszą zawierać się w zbiorze, o tyle wartość modalna zawsze jest zawarta w zbiorze. W trakcie analizy zbiorów liczb statystycy bardzo często posługują się pojęciami wariancji i odchylenia standardowego. Wariancja zbioru liczb jest miarą zróżnicowania tego zbioru, tzn. miarą odchylenia wartości w zbiorze od wartości średniej. Formalnie, wariancja jest zdefiniowana jako Var[ X ] = E[( X − μ )] gdzie oznacza wartość oczekiwaną zmiennej. Wariancję najczęściej estymuje się na podstawie reprezentatywnej próby, w takim wypadku wariancję populacji można oszacować za pomocą następującego estymatora Podstawową wadą wariancji jest fakt, że wariancja jest wyrażona w innych jednostkach niż zmienna, której wariancja podlega badaniu. Przykładowo, jeśli zmienna reprezentuje pensje pracowników, to wariancja jest mierzona w PLN podniesionych do kwadratu. Z tego względu w praktycznych zastosowaniach wygodniej jest posługiwać się pojęciem odchylenia standardowego. Odchylenie standardowe informuje, jak „szeroko” wartości zmiennej są rozproszone wokół wartości średniej tej zmiennej. Pod pojęciem odchylenia standardowego kryją się w rzeczywistości trzy różne pojęcia: • odchylenie standardowe w populacji: jeśli zbiór zawiera wszystkie wartości z badanej populacji (np. jeśli dysponujemy wszystkimi pensjami pracowników), to odchylenie standardowe zmiennej będzie identyczne z odchyleniem standardowym mierzonej cechy w populacji, ponieważ zmienna będzie miała identyczny rozkład co cecha w populacji Oracle Statistical Functions 11g: statystyka dla dużych i małych 285 • odchylenie standardowe w próbce: jeśli zbiór zawiera jedynie próbkę wartości cechy z populacji, to odchylenie standardowe zmiennej stanowi jedynie oszacowanie (estymator) odchylenia standardowego cechy w populacji • odchylenie standardowe zmiennej losowej: stanowi informację o cesze wyliczoną na podstawie rozkładu wartości badanej cechy, w rzeczywistości rozkład ten jest rzadko znany, stąd wartość odchylenia standardowego zmiennej losowej jest w praktyce mało przydatna. Baza danych Oracle 11g zawiera funkcje do wyznaczenia każdego z rodzajów odchylenia standardowego. Przykładowo, wyznaczenie powyższych odchyleń standardowych dla pensji pracowniczych może być wyrażone w języku SQL w następujący sposób: SQL> SELECT STDDEV(sal), STDDEV_SAMP(sal), STDDEV_POP(sal) FROM emp; STDDEV(SAL) STDDEV_SAMP(SAL) STDDEV_POP(SAL) ----------- ---------------- --------------1182.50322 1182.50322 1139.48862 Funkcje STDDEV(sal) i STDDEV_SAMP(sal) wyliczają odchylenie standardowe zmiennej losowej oraz odchylenie standardowe w próbce, odpowiednio. Jedyna różnica między tymi funkcjami polega na tym, że funkcja STDDEV(sal) zwraca wartość 0 dla zbioru składającego się z jednego elementu, podczas gdy funkcja STDDEV_SAMP(sal) zwróciłaby w takim przypadku wartość NULL. Funkcja STDDEV_POP(sal) zwraca wartość odchylenia standardowego w populacji, korzystając z estymatora nieobciążonego: n s= ∑ (x − x ) i =i 2 i n −1 Dla wyznaczania wartości wariancji baza danych Oracle 11g oferuje analogiczne trzy funkcje: VARIANCE(), VAR_SAMP() oraz VAR_POP(). Jednym z najciekawszych rozwiązań w domenie przetwarzania analitycznego i statystycznego było wprowadzenie przez Oracle funkcji analitycznych. Jest to rozszerzenie standardu funkcji grupowych o możliwości wyznaczania agregatów na różnych poziomach agregacji, raportowania, oraz wyznaczania agregatów za pomocą okienek o zmiennym rozmiarze (tzw. funkcje okienkowe). Funkcje analityczne zrewolucjonizowały rynek i szybko zdobyły sobie ogromną popularność, przede wszystkim ze względu na prostotę i bardzo dużą moc wyrażania. Poniżej przedstawiono przykład funkcji analitycznej wyznaczającej procentowy udział poszczególnych wartości w sumie oraz przykład zapytania wykorzystującego funkcje grupowe wyliczające agregaty na różnych poziomach agregacji. SQL> SELECT job, SUM(sal), RATIO_TO_REPORT(SUM(sal)) OVER () FROM emp GROUP BY job; JOB SUM(SAL) RATIO_TO_REPORT(SUM(SAL))OVER() --------- ---------- ------------------------------ANALYST 6000 .206718346 CLERK 4150 .142980189 MANAGER 8275 .285099053 PRESIDENT 5000 .172265289 SALESMAN 5600 .192937123 286 Mikołaj Morzy SQL> SELECT ename, sal, job, deptno, SUM(sal) OVER () AS S1, SUM(sal) OVER (PARTITION BY job) AS S2, SUM(sal) OVER (PARTITION BY deptno) AS S3 FROM emp GROUP BY ename, sal, job, deptno; ENAME SAL JOB DEPTNO S1 S2 S3 ---------- ---------- --------- ---------- ---------- ---------- ---------CLARK 2450 MANAGER 10 29025 8275 8750 KING 5000 PRESIDENT 10 29025 5000 8750 MILLER 1300 CLERK 10 29025 4150 8750 JONES 2975 MANAGER 20 29025 8275 10875 SCOTT 3000 ANALYST 20 29025 6000 10875 SMITH 800 CLERK 20 29025 4150 10875 FORD 3000 ANALYST 20 29025 6000 10875 ADAMS 1100 CLERK 20 29025 4150 10875 MARTIN 1250 SALESMAN 30 29025 5600 9400 BLAKE 2850 MANAGER 30 29025 8275 9400 ALLEN 1600 SALESMAN 30 29025 5600 9400 WARD 1250 SALESMAN 30 29025 5600 9400 TURNER 1500 SALESMAN 30 29025 5600 9400 JAMES 950 CLERK 30 29025 4150 9400 Równie interesująca jest możliwość wyznaczania wartości statystycznych za pomocą funkcji okienkowych. Funkcje te umożliwiają dynamiczne wyznaczanie partycji danych, dla których wyliczane są statystyki, w zależności od bezwzględnej liczby krotek, różnicy w wartościach atrybutów, lub w zmiennych przedziałach czasu. Przykładowo, w wielu analizach statystycznych wygodnie jest posługiwać się pojęciem wygładzonej średniej, która zmienia się wolniej niż sama zmienna lub trend. Wyznaczenie takiej statystyki przy wykorzystaniu okienkowych funkcji analitycznych staje się bardzo proste. Poniżej przedstawiono przykład zapytania wyznaczającego wygładzoną pensję pracowników, gdzie wygładzanie odbywa się w przedziałach o szerokości jednego roku. SQL> SELECT ename, sal, hiredate, AVG(sal) OVER (ORDER BY hiredate RANGE BETWEEN INTERVAL '1' YEAR PRECEDING AND CURRENT ROW) AS smooth_sal FROM emp; ENAME SAL ---------- ---------SMITH 800 ALLEN 1600 WARD 1250 JONES 2975 BLAKE 2850 CLARK 2450 TURNER 1500 MARTIN 1250 KING 5000 JAMES 950 FORD 3000 MILLER 1300 SCOTT 3000 ADAMS 1100 HIREDATE --------17-DEC-80 20-FEB-81 22-FEB-81 02-APR-81 01-MAY-81 09-JUN-81 08-SEP-81 28-SEP-81 17-NOV-81 03-DEC-81 03-DEC-81 23-JAN-82 19-APR-87 23-MAY-87 SMOOTH_SAL ---------800 1200 1216.66667 1656.25 1895 1987.5 1917.85714 1834.375 2186.11111 2147.72727 2147.72727 2193.18182 3000 2050 Oracle Statistical Functions 11g: statystyka dla dużych i małych 287 3. Pakiet DBMS_STAT_FUNCS Pakiet DBMS_STAT_FUNCS zawiera kilka przydatnych procedur, umożliwiających testowanie zgodności rozkładu badanej cechy z jednym z popularnych rozkładów zmiennych losowych. Pakiet umożliwia sprawdzenie, czy badana cecha ma rozkład zgodny z rozkładem normalnym, rozkładem Poissona, rozkładem wykładniczym, rozkładem jednostajnym oraz rozkładem Weibulla. Oprócz procedur do testowania zgodności rozkładów pakiet zawiera przydatną procedurę SUMMARY(), która zbiera i prezentuje ogólną charakterystykę wybranego atrybutu. Poniżej przedstawiono przykład zastosowania tej procedury. DECLARE l_sigma_value NUMBER; l_summary DBMS_STAT_FUNCS.summaryType; BEGIN l_sigma_value := 2; DBMS_STAT_FUNCS.SUMMARY('SCOTT','EMP','SAL', l_sigma_value, l_summary); DBMS_OUTPUT.PUT_LINE('Count: '||l_summary.count); DBMS_OUTPUT.PUT_LINE('Min: '||l_summary.min); DBMS_OUTPUT.PUT_LINE('Max: '||l_summary.max); DBMS_OUTPUT.PUT_LINE('Range: '||l_summary.range); DBMS_OUTPUT.PUT_LINE('Mean: '||round(l_summary.mean)); DBMS_OUTPUT.PUT_LINE('Mode Count: '||l_summary.cmode.count); DBMS_OUTPUT.PUT_LINE('Mode: '||l_summary.cmode(1)); DBMS_OUTPUT.PUT_LINE('Variance: '||round(l_summary.variance)); DBMS_OUTPUT.PUT_LINE('Stddev: '||round(l_summary.stddev)); DBMS_OUTPUT.PUT_LINE('Quantile 5 '||l_summary.quantile_5); DBMS_OUTPUT.PUT_LINE('Quantile 25 '||l_summary.quantile_25); DBMS_OUTPUT.PUT_LINE('Median '||l_summary.median); DBMS_OUTPUT.PUT_LINE('Quantile 75 '||l_summary.quantile_75); DBMS_OUTPUT.PUT_LINE('Quantile 95 '||l_summary.quantile_95); DBMS_OUTPUT.PUT_LINE('Extreme Count: '||l_summary.extreme_values.count); DBMS_OUTPUT.PUT_LINE('Extremes: '||l_summary.extreme_values(1)); DBMS_OUTPUT.PUT_LINE('Top 3: '||l_summary.top_5_values(1)||', '||l_summary.top_5_values(2)||','||l_summary.top_5_values(3)); DBMS_OUTPUT.PUT_LINE('Bottom 3: '||l_summary.bottom_5_values(5)||', '||l_summary.bottom_5_values(4)||','||l_summary.bottom_5_values(3)); END; / Count: 14 Min: 800 Max: 5000 Range: 4200 Mean: 2073 Mode Count: 2 Mode: 1250 Variance: 1398314 Stddev: 1183 Quantile 5 897.5 Quantile 25 1250 Median 1550 Quantile 75 2943.75 Quantile 95 3700 Extreme Count: 1 Extremes: 5000 288 Mikołaj Morzy Top 3: 5000,3000,3000 Bottom 3: 800,950,1100 akiet DBMS_STAT_FUNCS służy jednak przede wszystkim do testowania zgodności rozkładu badanej cechy z jednym z dobrze znanych rozkładów. Aby prawidłowo dokonać dopasowania, konieczna jest znajomość podstawowych parametrów rozkładów, do których następuje dopasowanie. Przykładowo, dopasowując rozkład cechy do rozkładu normalnego konieczne jest podanie wartości średniej i odchylenia standardowego dopasowywanego rozkładu, a dopasowując rozkład cechy do rozkładu Poissona konieczne jest podanie wartości parametru λ. Poniżej przedstawiono procedurę dopasowania rozkładu płacy pracowników do rozkładu normalnego i rozkładu Poissona. DECLARE l_fit NUMBER := 0; l_mean NUMBER := 2073; l_stddev NUMBER := 1182; l_lambda NUMBER := 1; BEGIN DBMS_STAT_FUNCS.NORMAL_DIST_FIT('SCOTT','EMP','SAL','SHAPIRO_WILKS', l_mean,l_stddev,l_fit); DBMS_OUTPUT.PUT_LINE('Fit: ' || l_fit); DBMS_STAT_FUNCS.POISSON_DIST_FIT('SCOTT','EMP','SAL','KOLMOGOROV_SMIRNOV', l_lambda,l_fit); DBMS_OUTPUT.PUT_LINE('Fit: ' || l_fit); END; / W value : .8575388742601245725066612757922867898795 Fit: .0281580633742863600087274203642870442654 D value : .9285714285714285714285714285714285714286 Fit: .000000000009159987558715018 Jak widać, w obu przypadkach dopasowanie jest poniżej domyślnego poziomu istotności (p=0.05), zatem możemy założyć, że badana cecha nie jest scharakteryzowana ani rozkładem normalnym, ani rozkładem Poissona. W przypadku każdego z testów (oraz testów wykonywanych przez procedury EXPONENTIAL_DIST_FIT(), UNIFORM_DIST_FIT() i WEIBULL_ DIST_FIT()) zakładana jest hipoteza zerowa o zgodności rozkładu badanej cechy z danym rozkładem. Niska wartość zwrócona przez każdą z procedur umożliwia odrzucenie hipotezy zerowej. Procedury dopasowywania rozkładu cechy do zadanego rozkładu wykorzystują jeden z wielu dostępnych w literaturze testów. Przykładowo, testowanie zgodności z rozkładem normalnym może być wykonane za pomocą standardowego testu Shapiro-Wilksa, ale można się też posłużyć testem χ2, testem Kołmogorowa-Smirnowa, lub testem Andersona-Darlinga. 3. Testowanie hipotez Jedną z najczęściej wykorzystywanych technik statystycznych jest przeprowadzanie testów parametrycznych dla wartości średnich i wariancji. Baza danych Oracle 11g umożliwia wykonywanie takich testów w kilku trybach. Dostępne są m.in. test t-Studenta zgodności ze średnią dla zmiennej opisanej rozkładem normalnym, test t-Studenta na statystyczną istotność różnic średnich z niezależnych próbek, a także sparowany test t-Studenta. Dla zbadania statystycznej istotności różnicy w wariancjach można posłużyć się testem f-Fishera. Informację o statystycznej istotności w różnicach średnich można także uzyskać stosując analizę wariancji, zaimplementowaną w Oracle 11g jako ANOVA (do wykonania tego obliczenia należy posłużyć się funkcją STATS_ ONE_WAY_ANOVA()). Baza danych umożliwia także testowanie, czy dwie próbki pochodzą z tej Oracle Statistical Functions 11g: statystyka dla dużych i małych 289 samej populacji, ew. czy dwie próbki są scharakteryzowane tym samym rozkładem. Należy przy tym zaznaczyć, że nie chodzi tu o sprawdzenie dopasowania do konkretnego rozkładu (jak w przypadku pakietu DBMS_STAT_FUNCS), a raczej sprawdzenie, czy dwie próbki mają ten sam dowolny rozkład. Oracle 11g oferuje test Manna-Whitneya zgodności rozkładów oraz test Kołmogorowa-Smirnowa zgodności rozkładów. Wreszcie, można uruchomić także test Wilcoxona do sprawdzenia, czy mediana różnic między próbkami jest istotnie różna od zera (ten test jest popularną alternatywą dla sparowanego testu t-Studenta w sytuacji, gdy nie można zakładać, że badane próbki są opisane rozkładem normalnym). Poniżej zaprezentowano przykłady wykorzystania wybranych funkcji statystycznych. Pierwszy przykład pokazuje testowanie hipotezy dotyczącej średniej płacy pracowników (badamy, czy średnia pensja pracowników jest statystycznie istotnie różna od 2000). SQL> SELECT AVG(sal), STATS_T_TEST_ONE(sal, 2000, 'STATISTIC') t_statistic, STATS_T_TEST_ONE(sal, 2000,'TWO_SIDED_SIG') t_sig FROM emp; AVG(SAL) T_STATISTIC T_SIG ---------- ----------- ---------2073.21429 .231663447 .820406047 Jak widać, niska wartość statystyki i duża istotność pozwalają na przyjęcie hipotezy, że średnia płaca pracowników nie jest istotnie różna od 2000. Kolejne zapytanie przedstawia weryfikację hipotezy o tym, czy średnia płaca pracowników jest istotnie różna od średniej płacy przełożonych. W tym celu należy się posłużyć sparowanym testem t-Studenta. SQL> SELECT AVG(sal), AVG(mgr_sal), STATS_T_TEST_PAIRED(sal, mgr_sal, 'STATISTIC') t_statistic, STATS_T_TEST_PAIRED(sal, mgr_sal, 'TWO_SIDED_SIG') t_sig FROM ( SELECT e.sal, m.sal AS mgr_sal FROM emp e JOIN emp m ON (e.mgr = m.empno) ); AVG(SAL) AVG(MGR_SAL) T_STATISTIC T_SIG ---------- ------------ ----------- ---------1848.07692 3357.69231 -6.8903404 .000016737 W tym przypadku bardzo niska wartość istotności (poniżej domyślnego poziomu istotności) pozwala jednoznacznie odrzucić hipotezę zerową o braku różnic między płacami pracowników i ich przełożonych. Następny przykład pokazuje użycie testu t-Studenta w przypadku, gdy dysponujemy dwoma niezależnymi próbkami. Funkcja STATS_T_STAT_INDEP() pozwoli nam sprawdzić, czy istnieje istotna różnica między średnimi płacami dla dwóch wybranych etatów. SQL> SELECT (SELECT AVG(sal) FROM emp WHERE job='SALESMAN') AS salesman_avg, (SELECT AVG(sal) FROM emp WHERE job='CLERK') AS clerk_avg, t_statistic, t_sig FROM ( SELECT STATS_T_TEST_INDEP(job, sal, 'STATISTIC', 'SALESMAN') t_statistic, STATS_T_TEST_INDEP(job, sal, 'TWO_SIDED_SIG') t_sig FROM emp WHERE job IN ('SALESMAN','CLERK')); SALESMAN_AVG CLERK_AVG T_STATISTIC T_SIG ------------ ---------- ----------- ---------1400 1037.5 2.60778432 .040239811 290 Mikołaj Morzy Wynik testu jest niejednoznaczny. Co prawda obserwowana istotność leży poniżej domyślnej wartości progowej (p = 0.05), ale jest na tyle blisko progu, że należy wykazać ostrożność przy decydowaniu o odrzuceniu hipotezy zerowej. Najprawdopodobniej należałoby wykonać dodatkowe testy, np. sprawdzić, czy badana cecha ma rozkład normalny (w przeciwnym wypadku należałoby się posłużyć innym testem na statystyczną istotność różnicy średnich). 4. Badanie korelacji Przykłady narzędzi przedstawionych w poprzednim rozdziale umożliwiały analizę pojedynczej cechy. W wielu aplikacjach interesujące jest zbadanie współzależności między dwoma lub więcej cechami. W takich przypadkach najczęściej wykorzystywaną techniką statystyczną jest badanie korelacji między zmiennymi. Baza danych Oracle 11g oferuje trzy różne metody badania korelacji między zmiennymi dostępne z poziomu funkcji języka SQL. Najpopularniejszym narzędziem jeśli chodzi o badanie korelacji jest bez wątpienia klasyczny współczynnik korelacji Pearsona, zdefiniowany jako Jest to iloraz kowariancji zmiennych i iloczynu odchyleń standardowych tych zmiennych. Współczynnik korelacji Pearsona przyjmuje wartości z przedziału , przy czym wartość -1 reprezentuje pełną ujemną zależność liniową między zmiennymi, wartość 0 oznacza brak zależności liniowej, zaś wartość 1 oznacza pełną dodatnią zależność liniową. Należy przy tym podkreślić, że wartość 0 nie pozwala stwierdzić, że między zmiennymi nie występuje żadna zależność. Oznacza ona jedynie brak występowania zależności liniowej. Do wyliczenia współczynnika korelacji służy w bazie danych Oracle 11g funkcja CORR() przedstawiona na poniższym przykładzie. SQL> SELECT CORR(sal, EXTRACT(YEAR FROM hiredate)) AS pearson_corr FROM emp; PEARSON_CORR -----------.006506407 Jak widać, między płacą pracownika a datą jego zatrudnienia nie występuje absolutnie żadna zależność liniowa. Poza współczynnikiem korelacji Pearsona baza danych Oracle 11g oferuje także dwie dodatkowe metody wyznaczania współzależności między zmiennymi. Korelacja rangowa jest realizowana za pomocą funkcji CORR_S(), która wylicza współczynnik korelacji ρ Spearmana. W przeciwieństwie do współczynnika korelacji Pearsona, współczynnik korelacji ρ Spearmana nie bierze pod uwagę wartości badanych zmiennych, a jedynie ich numer porządkowy w rankingu. W rezultacie, współczynnik korelacji ρ Spearmana informuje o istnieniu jakiejkolwiek zależności monotonicznej między zmiennymi (a nie jedynie zależności liniowej). Poniższy przykład pokazuje użycie korelacji rangowej. SQL> SELECT FROM emp; CORR_S(sal,DECODE(job,'PRESIDENT',5,'MANAGER',4,'ANALYST',3, 'SALESMAN',2, 'CLERK',1)) AS spearman_corr SPEARMAN_CORR ------------.870057381 Bardzo podobny do współczynnika korelacji ρ Spearmana jest współczynnik korelacji τ Kendalla. Jest to miara badająca zgodność par wartości analizowanych zmiennych, przy czym para obserwacji jest uważana za zgodną, jeśli większym wartościom jednej zmiennej odpowiadają Oracle Statistical Functions 11g: statystyka dla dużych i małych 291 większe wartości drugiej zmiennej. W poniższym przykładzie zbadano, czy istnieje taki związek między płacą pracownika i procentowym zyskiem ze sprzedaży. SQL> SELECT CORR_K(sal, NVL(comm,0), 'COEFFICIENT') AS coeff, CORR_K(sal, NVL(comm,0), 'TWO_SIDED_SIG') AS sig FROM emp; COEFF SIG ---------- ----------.22966621 .252562432 Ostatnia metoda badania współzależności między dwoma zmiennymi wykorzystuje test χ2. Jest ona dostępna w bazie danych Oracle 11g pod postacią funkcji STATS_CROSSTAB(). Funkcja ta przyjmuje, jako parametry, nazwy badanych zmiennych, oraz trzeci argument definiujący zwracaną wartość. Funkcja może zwrócić obserwowaną wartość statystyki, istotność obserwowanej statystyki, liczbę stopni swobody rozkładu, ale także współczynnik ϕ lub współczynnik κ Cohena. Poniższy przykład pokazuje sposób odczytania wybranych wyników testu χ2 SQL> SELECT STATS_CROSSTAB(sal, NVL(comm,0), 'CHISQ_OBS') AS chi_obs, STATS_CROSSTAB(sal, NVL(comm,0), 'CHISQ_SIG') AS chi_sig FROM emp; CHI_OBS CHI_SIG ---------- ---------27.7857143 .724358321 5. Regresja liniowa Ostatnią metodą statystyczną omawianą w niniejszym artykule jest regresja liniowa. Jest to bez wątpienia jedna z najpopularniejszych i najczęściej stosowanych technik statystycznych. W dużym uproszczeniu metoda regresji liniowej polega na znalezieniu zależności w postaci między zmienną objaśnianą y (zwaną także zmienną zależną) a zmienną objaśniającą x (zwaną także zmienną niezależną). Najczęściej do znalezienia konkretnych wartości współczynników a i b wykorzystuje się metodę najmniejszych kwadratów. Istnieją także bardziej złożone rodzaje zależności, które mogą być wykrywane za pomocą metod takich, jak regresja logarytmiczna, regresja logitowa, czy regresja wieloraka. W przypadku bazy danych Oracle 11g prosta regresja liniowa jest dostępna z poziomu funkcji języka SQL, natomiast bardziej zaawansowane modele można tworzyć przy wykorzystaniu opcji Oracle Data Mining (jest tam między innymi dostępny w postaci algorytmów Generalized Linear Models i Support Vector Machines). Poniższe zapytanie pokazuje sposób użycia prostych funkcji języka SQL do skonstruowania równania regresji. Wykorzystamy do tego celu funkcje REGR_SLOPE() i REGR_INTERCEPT(), zwracające wartości parametrów modelu a i b, odpowiednio. SQL> SELECT REGR_SLOPE(sal, EXTRACT (YEAR FROM EXTRACT (YEAR FROM REGR_INTERCEPT(sal, EXTRACT (YEAR EXTRACT (YEAR FROM FROM emp; sysdate) – hiredate)) AS reg_slope, FROM sysdate) – hiredate)) AS reg_intercept REG_SLOPE REG_INTERCEPT ---------- -------------3.4753363 2171.02018 Wynik powyższego zapytania oznacza, że aby oszacować pensję pracownika, który przepracował 35 lat, należałoby skorzystać z formuły (w rzeczywistości w przypadku tabeli EMP proste wykreślenie zmiennej objaśnianej i objaśniającej dobitnie wskazuje, że pomiędzy nimi nie występuje żadna zależność liniowa i w tym przypadku użycie modelu regresji liniowej jest całkowicie nieuzasadnione. 292 Mikołaj Morzy 6. Podsumowanie W niniejszym artykule przedstawiono przegląd podstawowych narzędzi oferowanych przez bazę danych Oracle 11g do przetwarzania statystycznego. Omówione zostały podstawowe funkcje grupowe oraz funkcje analityczne, które umożliwiają wykonywanie zaawansowanych zapytań bezpośrednio z poziomu języka SQL. Dalej, przedstawiono zawartość pakietu DBMS_STAT_FUNCS który zawiera przede wszystkim procedury do testowania zgodności rozkładu badanej cechy z jednym z dobrze znanych rozkładów statystycznych. Baza danych Oracle 11g umożliwia także testowanie różnorakich hipotez, np. testowanie statystycznej istotności różnic średnich. Przykładowe zapytania zawarte w artykule prezentowały podstawowe funkcje SQL wykorzystywane do przeprowadzania testów parametrycznych i bezparametrycznych. W drugiej części artykułu skupiono się na narzędziach umożliwiających badanie korelacji między cechami i przedstawiono cztery różne funkcje realizujące to zadanie. Na koniec przedstawiono w dużym skrócie prostą metodę wyliczania współczynników regresji liniowej. Środowisko współczesnego systemu zarządzania bazą danych stanowi kompletne i bogate rozwiązanie dla przetwarzania statystycznego. Wiele zadań, w szczególności zadań nie wymagających najbardziej skomplikowanego aparatu statystycznego, może być z powodzeniem realizowane wewnątrz bazy danych, bez konieczności eksportowania danych do zewnętrznych specjalizowanych narzędzi. Dodatkowo, dostępność narzędzi statystycznych umożliwia prostą integrację modeli statystycznych w aplikacjach bazodanowych, co może zaowocować znaczącym wzrostem użyteczności tych aplikacji. Bibliografia [1] Hastie, T., Tibshirani, R., & Friedman, J. (2001). Elements of Statistical Learning. New York: Springer. [2] Koronacki, J., & Ćwik, J. (2005). Statystyczne systemy uczące się. Warszawa: Wydawnictwa Naukowo-Techniczne. [3] Koronacki, J., & Mielniczuk, J. (2001). Statystyka dla studentów kierunków technicznych i przyrodniczych. Warszawa: Wydawnictwa Naukowo-Techniczne. [4] Lorentz, D., & Roese, M. B. (2009). Oracle Database SQL Language Reference, 11g Release 2 (11.2). Oracle Corporation. [5] Raphaely, D. (2009). Oracle Database PL/SQL Packages and Types Reference, 11g Release 2 (11.2). Oracle Corporation.