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