Ł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 IF OBJECT_ID('course_group', 'U') IS NOT NULL DROP TABLE course_group... Listing 2: create tables (fragment) CREATE TABLE course_group ( course varchar(8), course_group tinyint, course_type varchar(1) )... 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 UPDATE [171018-dziekanat].[dbo].[notes] SET semester_type = 'letni' WHERE semester % 2 = 0 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 UPDATE [171018-dziekanat].[dbo].[notes] SET exam = 'Z' WHERE exam = '' 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 DELETE FROM [171018-dziekanat].[dbo].[notes] WHERE teacher_id = 0 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 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 DELETE FROM [171018-dziekanat].[dbo].[course_group] WHERE course_group = 0 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 = '' 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 = '' DELETE FROM [171018-dziekanat].[dbo].[teachers] WHERE title_id = 0 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] AS t ON n.teacher_id = t.teacher_id WHERE (t.teacher_id IS NULL) GROUP BY 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); 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 SELECT DISTINCT teacher_id, semester INTO [171018-dziekanat].[dbo].[workload] FROM [171018-dziekanat].[dbo].[notes] ORDER BY teacher_id ALTER TABLE [171018-dziekanat].[dbo].[workload] ADD course_count int UPDATE [171018-dziekanat].[dbo].[workload] SET course_count = (SELECT COUNT (DISTINCT notes.course) FROM notes WHERE notes.teacher_id = workload.teacher_id AND notes.semester = workload.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... SELECT IDENTITY (bigint,1,1) AS notes_desc_id, semester, year, course, teacher_id, note, exam, student_id, semester_type, study_year INTO [171018-dziekanat].[dbo].[notes_tmp] FROM [171018-dziekanat].[dbo].[notes] SELECT notes_desc_id, semester, semester_type, study_year, year, exam INTO [171018-dziekanat].[dbo].[notes_desc] FROM [171018-dziekanat].[dbo].[notes_tmp] 7 / 11
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] 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