# Projekt IUM - dokumentacja projektu etap 1
<p style='text-align: right;'>04.12.2022</p>
**Skład zespołu:**
Konstantin Panov, Dominik Nowak
**Repozytorium projektu:** https://github.com/Dumonoo/IUM_project
## Rozwiązywany problem klienta
“Większość serwisów udostępniających muzykę czy filmiki, poleca coś swoim użytkownikom. Przyszedł czas, abyśmy zaczęli robić tak samo”
**Kontekts problemu**
> W ramach projektu wcielamy się w rolę analityka pracującego dla portalu „Pozytywka” – serwisu muzycznego, który swoim użytkownikom pozwala na odtwarzanie ulubionych utworów online.
> Praca na tym stanowisku nie jest łatwa – zadanie dostajemy w formie enigmatycznego opisu i to do nas należy doprecyzowanie szczegółów tak, aby dało się je zrealizować. To oczywiście wymaga zrozumienia problemu, przeanalizowania danych, czasami negocjacji z szefostwem.
> Same modele musimy skonstruować tak, aby gotowe były do wdrożenia produkcyjnego – pamiętając, że w przyszłości będą pojawiać się kolejne ich wersje, z którymi będziemy eksperymentować.
## Słownik terminologi
* Portal muzyczny - portal muzyczny "Pozytywka"
* Użytkownik - osoba korzystająca z portalu muzycznego
## Problem biznesowy
Rekomendowanie użytkownikom interesujących dla nich utworów w postaci playlisty 10 utworów, generowanej co każde 24h.
## Biznesowe kryterium sukcesu
Portal muzyczny powinien generować przynajmniej 20% więcej przesłuchań utworów dziennie, dzieki rekomenowanym utworom.
## Analityczne kryterium sukcesu

$$
\frac{\#\space trafnych\space rekomendacji}{\#\space wszystkich\space rekomendacji} \geqslant \alpha
$$
**Gdzie:**
* $\alpha$ - parametr zależny od wszystkich dziennych odtworzeń utworów przez użytkowników
* $\#\space trafnych\space rekomendacji$ - utwór przesłuchany przynajmniej w 80%
* $\#\space wszystkich\space rekomendacji$ - wszystkie odtworzone rekomendacje
## Zadanie modelowania
Naszym zadaniem jest stworzenie systemu generowania rekomendacji utworów muzycznych dla użytkownika. Głownym zadaniem modelu będzie modelowanie zachowania użytkownika, tak aby przewidzieć jego gust muzyczny oraz określić utwory, które będą dla niego najbardziej odpowiedznie na w danym momencie, podstawie zebranych o nim danych.
## Analiza danych
W trakcie zbierania danych od klienta uzyskaliśmy następujące dane:
* lista dostępnych artystów - artists.jsonl
* lista utworów muzycznych - tracks.jsonl
* baza użytkowników - users.jsonl
* historia sesji użytkowników - sessions.jsonl
### Sesje użytkowników - plik: sessions.jsonl
#### Znaczenie atrybutów
- session_id - identyfikator danej sesji użytkownika
- timestamp - znacznik czasowy
- user_id - identyfikator użytkownika
- track_id identyfikator utworu
- event_type - typ akcji wykonanej

| | Typ atrybutu | Rodzaj atrybutu | Brak danych | Rozkład/Zbalansowanie |
| ---------- | ------------ | ------------------- | ----------- | ------------------------------- |
| session_id | Integer | Dyskretna nominalna | 0 | - |
| timestamp | DataTime | Znacznik czasowy | 0 | Jednostajny |
| user_id | Integer | Dyskretna nominalna | 1432 | - |
| track_id | String | Dyskretna nominalna | 5369 | - |
| event_type | String | Dyskretna nominalna | 1439 | like:play:skip $\approx$ 3:13:4 |
### Ścieżki - plik: tracks.jsonl
#### Znaczenie atrybutów
- id - identyfikator utworu
- name - nazwa utworu
- popularity - wskaźnik popularności
- duration_ms - długość utworu w ms
- explicit - nieodpowiednia / seksualny kontent
- id_artist - identyfikator artysty
- release_date - data wypuszczenia
- danceability - współczynnik taneczności
- Atrybuty związane z parametrami z dziedziny muzyki
- danceability - taneczność
- energy - energia
- key - tonacja
- loudness - poziom głośności
- speechiness - wymowność
- acousticness - akustyka
- instrumentalness - instumentalność
- liveness - żywotność
- valence - pozytywność
- tempo - tempo

| | Typ atrybutu | Rodzaj zmiennej | Brak danych | Rozkład/Zbalansowanie |
| ---------------- | ------------ | -------------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| id | String | Dyskretna nominalna | 1114 | - |
| name | String | Dyskretna nominalna | 1126 | - |
| popularity | Integer | Dyskretna porządkowa | 1114 | Częstość odwrotnie liniowo zależy od wartości |
| duration_ms | Integer | Ciągła | 0 | Rozkład "Z grubymi ogonami" (Większość ścieżek ma długość bliską 200 sekund, ale istnieją ścieżki od długości bliskiej jednej godziny.) |
| explicit | Boolean | Dyskretna nominalna | 0 | Nie:Tak $\approx 15:3$ |
| release_date | Date | Znacznik czasowy | 0 | - |
| danceability | Float | Ciągła | 0 | Normalny |
| energy | Float | Ciągła | 0 | Normalny |
| key | Integer | Dyskretna porządkowa | 0 | Pokazane na rysunku niżej |
| loudness | Float | Ciągła | 0 | Normalny |
| speechiness | Float | Ciągła | 0 | Normalny (Dominują wartości z przedziału od 0.02 do 0.04) |
| acousticness | Float | Ciągła | 0 | Normalny |
| instrumentalness | Float | Ciągła | 0 | Bardzo mocno dominuje wartość 0, reszta jednostajnie |
| liveness | Float | Ciągła | 0 | Normalny |
| valence | Float | Ciągła | 0 | Normalny |
| tempo | Float | Ciągła | 0 | Normalny |

### Artyści - plik: artists.jsonl
#### Znaczenie atrybutów
- id - identyfikator artysty
- name - nazwa artysty
- genres - nazwy gatunków jakie nagrywa dany artysta

| Nazwa atrybutu | Typ atrybutu | Rodzaj zmiennej | Brak danych | Wartości niepoprawne | Rozkład/Zbalansowanie |
| -------------- | --------------- | ----------------------------- | ----------- | -------------------- | --------------------- |
| id | String | Dyskretna nominalna | 0 | 83 | - |
| name | String | Dyskretna nominalna | 0 | 0 | - |
| genres | Array of String | Lista dyskretnych nominalnych | 78 | 0 | - |

Liczba wszystkich gatunków w pliku: 836
Najpopularniejszymi gatunkami to gatunki związane z pop-em: pop, dance pop, pop rap, post-teen pop, rap, rock, latin, hip hop.
### Użytkownicy - plik: users.jsonl
#### Znaczenie atrybutów
- user_id - unikalne id użytkownika
- name - imię i nazwisko użytkowniaka
- city - miasto
- street - ulica
- favourite_genres - lista ulubionych gatunków
- premium_user - czy użytkownik premium
- id - atrybut posiadany przez jednego użytkownika

#### Analiza wartości
| Nazwa atrybutu | Typ atrybutu | Rodzaj zmiennej | Brak danych | Wartości niepoprawne | Rozkład/Zbalansowanie |
| ---------------- | --------------- | ----------------------------- | ----------- | -------------------- | --------------------- |
| user_id | Integer | Dyskretna nominalna | 0 | 0 | Jednostajny |
| name | String | Dyskretna nominalna | 0 | 0 | - |
| city | String | Dyskretna nominalna | 0 | 0 | - |
| street | String | Dyskretna nominalna | 0 | 0 | - |
| favourite_genres | Array of String | Lista dyskretnych nominalnych | 1 | 0 | - |
| premium_user | Boolean | Dyskretna nominalna | 2 | 0 | zero-jedynkowy / 39:9 |
| id | Integer | Dyskretna nominalna | 49 | 1 | - |
Polubione gatunki przez użytkowników:

## Problemy z danymi
Wymienione są tutaj prawdopodobne problemy z błędnymi danymi
### Plik users.jsonl
1. Dodatkowy atrybut "id" dla użytkownika (user_id = 122). -> Nieznany atrybut, prawdopodobny błąd przy pozystkiwaniu danych.
2. Braki dla atrubutu “premium_user” dla dwóch użytkowników. ->Prawdopodobny błąd przy pozystkiwaniu danych.
3. Użytkownik (user_id = 140) nie ma ulubionych gatunków muzycznych "favourite_genres". -> Prawdopodobnie wartość odstająca.
### Plik tracks.jsonl
1. Brakujące wartości atrybutu "id" w przypadku 1114 utworów. -> Prawdopodobnie błąd w bazie danych lub błąd przy pozystkiwaniu danych.
2. Brakujące wartości atrybutu "id_artist" w przypadku 1139 utworów. -> Prawdopodobnie błąd w bazie danych lub błąd przy pozystkiwaniu danych.
3. Utwory bez nazwy - bez wartości atrybutu "name" w przypadku 1126 utworów. -> Prawdopodobnie błąd w bazie danych lub błąd przy pozystkiwaniu danych.
### Plik artists.jsonl
1. Niepoprawne wartości atrybutu "id" w przypadku 83 artystów. -> Prawdopodobnie błąd w bazie danych lub błąd przy pozystkiwaniu danych.
2. Niektórzy artyści nie należą do żadnego gatunku muzycznego, w przypadku 78 artystów. -> Prawdopodobnie błąd w bazie danych lub wartości odstające.
### Plik sessions.jsonl
1. Sesje bez atrybutu "user_id" w przypadku 1432 wpisów sesji. -> Prawdopodobnie błąd przy zbieraniu danych.
2. Sesje nie będące reklamą nie posiadają atrybutu "track_id" - identyfikatora utwóru odtwarzanego, w przypadku 1475 wpisów sesji. -> Prawdopodobny błędy w logach systemu lub błąd przy pozystkiwaniu danych.
3. Sesje bez typu wykonywanej akcji (atrybut "event_type") w przypadku 1439 wpisów sesji. -> Prawdopodobny błędy w logach systemu lub błąd przy pozystkiwaniu danych.