Część 1: OLAP - Hi, I`m Łukasz Przywarty aka Lucc
Transkrypt
Część 1: OLAP - Hi, I`m Łukasz Przywarty aka Lucc
Łukasz Przywarty 171018 Wrocław, 05.12.2012 r. Grupa: CZW/N 10:00-13:00 Raport z zajęć laboratoryjnych w ramach przedmiotu Hurtownie i eksploracja danych Część 1: OLAP Prowadzący: dr inż. Henryk Maciejewski 1 / 11 1. ETL – Integration Services 1.1 Cel W ramach pierwszego etapu należało załadować dane z plików CSV do bazy MS SQL wykonując integrację i czyszczenie danych. Celem tych operacji jest uzyskanie spójnej i uporządkowanej bazy danych. Zadania integracji zostały wykonane przy użyciu narzędzia Integration Services pakietu MS SQL Server 2008. 1.2 Transformacje Podstawowe zadanie skryptów ETL to integracja i usunięcie niespójności w danych źródłowych (nieprawidłowe wartości danych, niespójne sposoby kodowania wartości, niespójne relacje klucz obcy – klucz główny itd.). • Wstępne przygotowanie bazy danych: usuwanie istniejących baz danych (jeśli istnieją) i tworzenie nowych baz. Rysunek 1 Listing 1: drop tables (fragment) IF OBJECT_ID('notes', 'U') IS NOT NULL DROP TABLE notes GO IF OBJECT_ID('course_group', 'U') IS NOT NULL DROP TABLE course_group GO ... Listing 2: create tables (fragment) CREATE TABLE course_group ( course varchar(8), course_group tinyint, course_type varchar(1) ) GO ... 2 / 11 • Import danych do bazy: dane są pobierane z plików CSV i wstępnie przetwarzane np. poprzez moduł Derived Column. Etap kończy się wczytaniem danych do tabeli w bazie MS SQL Server. Proces (rys. 3) jest powtarzany dla wszystkich danych źródłowych (6 plików). Rysunek 2 Rysunek 3 • Czyszczenie i ujednolicanie danych: najbardziej skomplikowany etap przetwarzania danych źródłowych (rys. 4). Rysunek 4 3 / 11 • Całość rozpoczyna się od skryptu notes – update, który: ◦ dodaje informacje o semestrze w kolumnie semester_type (letni gdy semestr parzysty, w przeciwnym razie parzysty), ◦ dodaje informacje o roku studiów na podstawie numeru semestru (1 oraz 2 semestr rok pierwszy, 2 i 3 – rok drugi itd.) w kolumnie study_year, ◦ uaktualnia kolumnę exam – w przypadku gdy komórka jest pusta zostaje w nią wpisane Z czyli zaliczenie. Listing 3: notes - update UPDATE [171018-dziekanat].[dbo].[notes] SET semester_type = 'zimowy' WHERE semester % 2 != 0 GO UPDATE [171018-dziekanat].[dbo].[notes] SET semester_type = 'letni' WHERE semester % 2 = 0 GO UPDATE [171018-dziekanat].[dbo].[notes] SET study_year = CASE WHEN semester = 1 THEN 1 WHEN semester = 2 THEN 1 WHEN semester = 3 THEN 2 WHEN semester = 4 THEN 2 WHEN semester = 5 THEN 3 WHEN semester = 6 THEN 3 WHEN semester = 7 THEN 4 WHEN semester = 8 THEN 4 WHEN semester = 9 THEN 5 ELSE 5 END GO UPDATE [171018-dziekanat].[dbo].[notes] SET exam = 'Z' WHERE exam = '' GO • Skypt notes – clear odpowiada za czyszczenie niewłaściwych danych w tabeli notes (nieprawidłowe oceny – 0 lub 1 – a także nieprawidłowy identyfikator nauczyciela – 0). Listing 4: notes - clear DELETE FROM [171018-dziekanat].[dbo].[notes] WHERE note = 0 OR note = 1 GO DELETE FROM [171018-dziekanat].[dbo].[notes] WHERE teacher_id = 0 GO 4 / 11 • Skrypt course_group – update usuwa niespójności między tabelami notes oraz course_group, a dokładnie niespójności pomiędzy kluczem obcym w tabeli faktów notes i kluczem głównym w tabeli wymiaru course_group. Listing 5: course_group - update INSERT INTO [171018-dziekanat].[dbo].[course_group] SELECT n.course, 1, 'W' FROM [171018-dziekanat].[dbo].[notes] AS n LEFT JOIN [171018-dziekanat].[dbo].[course_group] AS c ON n.course = c.course WHERE (c.course IS NULL) GROUP BY n.course GO • Skrypt course_group – clear czyści tabelę course_group – usuwa duplikaty wierszy oraz likwiduje rekordy, w których identyfikator kursu jest równy 0. Listing 6: course_group - clear DELETE SUB FROM (SELECT ROW_NUMBER() OVER (PARTITION BY course, course_group ORDER BY course) cnt FROM [171018-dziekanat].[dbo].[course_group]) SUB WHERE SUB.Cnt > 1 GO DELETE FROM [171018-dziekanat].[dbo].[course_group] WHERE course_group = 0 GO • Skrypt teacher_title – clear usuwa wiersze, które nie zawierają danych tzn. pole title lub title_long jest puste (w tabeli teacher_title). Listing 7: teeacher_title - clear DELETE FROM [171018-dziekanat].[dbo].[teacher_title] WHERE title_long = '' OR title = '' GO • Skrypt teachers – clear porządkuje tabelę teachers – usunięte zostają puste rekordy (title_id, faculty, institute równe 0). 5 / 11 Listing 8: teeachers - clear DELETE FROM [171018-dziekanat].[dbo].[teachers] WHERE faculty = 0 OR institute IS NULL OR institute = '' GO DELETE FROM [171018-dziekanat].[dbo].[teachers] WHERE title_id = 0 GO • Skrypt teachers – update usuwa niespójności między tabelami notes oraz teachers (podobnie jak w przypadku tabel course_group oraz notes). Listing 9: teachers - update INSERT INTO [171018-dziekanat].[dbo].[teachers] SELECT n.teacher_id, 'M', 1, 'I-00', 1 FROM [171018-dziekanat].[dbo].[notes] AS n LEFT JOIN [171018-dziekanat].[dbo].[teachers] t.teacher_id WHERE (t.teacher_id IS NULL) GROUP BY n.teacher_id GO • AS t ON n.teacher_id = Tworzenie i formatowanie nowo powstałych tabel: w ramach etapu tworzone są tabele: workload - opisująca obciążenie prowadzącego w danym semestrze mierzone liczbą kursów), tabela notes_desc – zawierająca kolumny, które nie są kluczami obcymi w tabeli faktów notes, oraz tabela notes_fact_table, która jest tabelą faktów. Rysunek 5 • Skrypt course_group – edit tworzy również kolumnę course_type w tabeli course_group oznaczającą typ zajęć (wykład W, laboratorium L itp.) Listing 10: course_group - edit UPDATE[171018-dziekanat].[dbo].[course_group] SET course_type = RIGHT(course, 1); GO 6 / 11 • Aby poprawnie utworzyć tabelę workload należało: ◦ sprawdzić czy tabela przypadkiem już nie istnieje (jeśli tak usunąć starą wersję), ◦ wybrać z tabeli notes unikalne rekordy reprezentujące identyfikator nauczyciela oraz semestr i skopiować je do tabeli workload, ◦ policzyć liczbę ocen wystawioną przez jednego prowadzącego w konkretnym semestrze. Listing 11: workload - create IF OBJECT_ID('workload', 'U') IS NOT NULL DROP TABLE workload GO SELECT DISTINCT teacher_id, semester INTO [171018-dziekanat].[dbo].[workload] FROM [171018-dziekanat].[dbo].[notes] ORDER BY teacher_id GO ALTER TABLE [171018-dziekanat].[dbo].[workload] ADD course_count int GO UPDATE [171018-dziekanat].[dbo].[workload] SET course_count = (SELECT COUNT (DISTINCT notes.course) FROM notes WHERE notes.teacher_id = workload.teacher_id workload.semester) GO • AND notes.semester = Tabele notes_desc i notes_fact_table tworzone są poprzez podzielenie tabeli tymczasowej notes_tmp. Listing 12: notes_desc - create IF OBJECT_ID('notes_desc', 'U') IS NOT NULL DROP TABLE notes_desc GO ... SELECT IDENTITY (bigint,1,1) AS notes_desc_id, teacher_id, note, exam, student_id, semester_type, study_year INTO [171018-dziekanat].[dbo].[notes_tmp] FROM [171018-dziekanat].[dbo].[notes] GO semester, year, SELECT notes_desc_id, semester, semester_type, study_year, year, exam INTO [171018-dziekanat].[dbo].[notes_desc] FROM [171018-dziekanat].[dbo].[notes_tmp] GO 7 / 11 course, Listing 13: notes_fact_table - create SELECT note, notes_desc_id, course, teacher_id, student_id, semester INTO [171018-dziekanat].[dbo].[notes_fact_table] FROM [171018-dziekanat].[dbo].[notes_tmp] GO 2. Model Analysis Services 2.1 Cel Drugi etap polega na zbudowaniu wielowymiarowego modelu danych. W tym celu należało określić relację między tabelami (tabelą faktów oraz tabelami wymiarów) oraz zdefiniować zmienne, które będą przedmiotem analizy, oraz zmienne wymiarów. Zadanie zostało wykonane przy pomocy narzędzia Analysis Services pakietu MS SQL Server 2008. 2.2 Operacje Etap rozpoczęto od stworzenia nowego projektu, a także zdefiniowana Data Source oraz Data Source View, gdzie określa się relacje pomiędzy tabelami faktów i wymiarów (rys. 6). Rysunek 6: 8 / 11 Kolejnym krokiem było utworzenie nowej kostki wielowymiarowej, która korzysta z Data Source View. Należało również spełnić wymagania dotyczące analizowanych zmiennych oraz wymiarów, po których można prowadzić analizy. Rysunek 7 Kostka uwzględnia wymiary: • courses – hierarchia według identyfikatora kursu, grupy kursów oraz typu kursu (wykład, laboratorium, ćwiczenia itd.), • student gender – płeć studenta, • teacher affiliation – hierarchia według afiliacji prowadzącego ( identyfikator prowadzącego, instytut, tytuł naukowy), • teacher gender – płeć nauczyciela, • teachers – hierarchia według prowadzących (identyfikator prowadzącego, tytuł naukowy), 9 / 11 • time – hierarchia według czasu (semestr, typ semestru, rok studiów, rok kalendarzowy), • workload – miara obciążenie prowadzącego w semestrze. Rysunek 8 Dodatkowo zdefiniowano zmienną notes average, która reprezentuje średnią ocenę (listing 14). Zmienna wyliczana jest na podstawie sumy ocen podzielonej przez ich liczbę (zakładka Calculations w widoku kostki – rys. 8). Listing 14: notes average [Measures][Notes summary]/[Measures][Notes count] Tak przygotowaną kostkę można umieścić na serwerze Analysis Services i przeglądać ją za pomocą Browsera. 2.3 Przykładowe analizy • Analiza 1: zależność średniej oceny od płci prowadzącego oraz jego stopnia naukowego. Okazuje się, że w bazie nie istnieją prowadzący posiadający niektóre tytuły naukowe (np. kobiety z tytułem docenta lub doktora habilitowanego). Mężczyźni wraz ze wzrostem stopnia naukowego oceniają surowiej (w przeciwieństwie do kobiet). Najłagodniej oceniają mężczyźni oraz kobiety magistrowie, najsurowiej – kobiety z tytułem doktora i mężczyźni z tytułem doktora habilitowanego. 10 / 11 Rysunek 9 • Analiza 2: zależność liczby ocen od semestru oraz płci prowadzącego: Kobiety podczas całego okresu kształcenia studentów wystawiają mniejszą liczbę ocen. Ponadto z semestru na semestr zarówno kobiety jak i mężczyźni wystawiają coraz więcej ocen. Tendencja wzrostowa utrzymuje się do 7 semestru, a następnie mocno spada. • Analiza 2: zależność liczby ocen od instytutu oraz roku kształcenia: Niektóre instytuty najwyraźniej nie kształcą studentów przez cały okres trwania studiów (np. I-17 czy I-22). Ponadto można zauważyć, że dalszy rok studiów charakteryzuje się wyższą średnią ocen. Prowadzący w instytutach oceniają bardzo różnie (świadczy to o wysokim poziomie kształcenia lub kiepskiej pracy studentów – w przypadku ocen niskich – oraz niskim poziomie kształcenia lub bardzo dobrej pracy studentów w przypadku ocen wysokich). Najwyżej ocenia instytut SWF, najniżej – wydział W-11. Rysunek 10 11 / 11