Przyjazne wprowadzenie do analizy danych w Pythonie

Z biegiem czasu popularność Pythona jako narzędzia do analizy danych spektakularnie wzrosła i nadal dynamicznie się rozwija.

Dziedzina nauki o danych jest bardzo rozległa i obejmuje wiele specjalizacji. Analiza danych jest jedną z kluczowych z nich. Niezależnie od poziomu zaawansowania w tej dziedzinie, zrozumienie podstawowych zasad i umiejętności z nią związanych staje się coraz bardziej istotne.

Czym właściwie jest analiza danych?

Analiza danych to proces porządkowania, czyszczenia i przekształcania dużych, nieustrukturyzowanych zbiorów danych. Celem tego procesu jest wyodrębnienie istotnych informacji i wniosków, które mogą wspomóc podejmowanie trafnych decyzji.

Istnieje wiele narzędzi wykorzystywanych w analizie danych, takich jak Python, Microsoft Excel, Tableau czy SaS. W tym tekście skupimy się na analizie danych przy użyciu języka Python, a konkretnie na wykorzystaniu biblioteki Pandas.

Pandas – co to takiego?

Pandas to biblioteka o otwartym kodzie źródłowym, napisana w języku Python, która służy do manipulowania i przetwarzania danych. Charakteryzuje się szybkością i wysoką wydajnością. Oferuje narzędzia do ładowania różnorodnych formatów danych do pamięci operacyjnej. Może być stosowana do transformacji, etykietowania, indeksowania, a nawet grupowania danych.

Struktury danych w Pandas

W bibliotece Pandas występują trzy zasadnicze struktury danych:

Najłatwiej zrozumieć ich relację, wyobrażając sobie, że jedna struktura jest zbiorem innych. Zatem DataFrame to zbiór obiektów Series, a Panel to zbiór obiektów DataFrame.

Series – to jednowymiarowa tablica danych.

Zbiór kilku obiektów Series tworzy dwuwymiarową strukturę – DataFrame.

Zbiór kilku obiektów DataFrame tworzy trójwymiarową strukturę – Panel.

Najczęściej wykorzystywaną strukturą danych jest dwuwymiarowy DataFrame, który często jest domyślną formą reprezentacji zestawów danych.

Analiza danych z użyciem Pandas

W tym artykule nie będziemy zajmować się instalacją oprogramowania. Wykorzystamy środowisko Colaboratory, stworzone przez Google. Jest to internetowe środowisko Pythona, które jest dedykowane do analizy danych, uczenia maszynowego i sztucznej inteligencji. Colaboratory to chmurowe środowisko Jupyter Notebook, z preinstalowanymi wszystkimi pakietami Pythona, które mogą być potrzebne analitykowi danych.

Przejdź do strony https://colab.research.google.com/notebooks/intro.ipynb. Powinieneś zobaczyć ekran podobny do poniższego.

W lewym górnym rogu okna, w menu „Plik”, wybierz opcję „Nowy notatnik”. Nowa strona Jupyter Notebook otworzy się w przeglądarce. Pierwszym krokiem będzie zaimportowanie biblioteki Pandas do naszego środowiska pracy, co wykonujemy, uruchamiając następujący kod:

import pandas as pd

W celu demonstracji analizy danych, wykorzystamy zbiór danych dotyczący cen nieruchomości. Zbiór danych można pobrać stąd. Pierwszym zadaniem jest załadowanie tego zbioru danych do naszego środowiska.

Możemy to zrobić, dodając nowy blok kodu i wpisując w nim:

df =  pd.read_csv('https://firebasestorage.googleapis.com/v0/b/ai6-portfolio-abeokuta.appspot.com/o/kc_house_data.csv?alt=media &token=6a5ab32c-3cac-42b3-b534-4dbd0e4bdbc0 ', sep=',')

Funkcja `.read_csv` służy do wczytywania plików w formacie CSV, a parametr `sep` wskazuje, że dane rozdzielone są przecinkami.

Warto zaznaczyć, że załadowany plik CSV jest przechowywany w zmiennej `df`.

W Jupyter Notebook nie ma konieczności korzystania z funkcji `print()`. Wystarczy wpisać nazwę zmiennej w bloku kodu, a Jupyter Notebook wyświetli jej zawartość.

Możemy to wypróbować, wpisując `df` w nowym bloku kodu i uruchamiając go. Zostaną wyświetlone wszystkie dane w naszym zbiorze, przedstawione jako DataFrame.

Nie zawsze jednak chcemy oglądać cały zbiór danych. Czasami wystarczy wyświetlić kilka pierwszych wierszy wraz z nazwami kolumn. Do tego służą funkcje `df.head()` (wyświetla pierwsze pięć wierszy) i `df.tail()` (wyświetla ostatnie pięć wierszy). Wynik działania jednej z tych funkcji wyglądałby tak:

Chcemy przeanalizować relacje między danymi w poszczególnych wierszach i kolumnach. Do tego służy funkcja `.describe()`.

Uruchomienie `df.describe()` daje następujące rezultaty:

Jak widać, funkcja `.describe()` dostarcza średnią, odchylenie standardowe, wartości minimalne i maksymalne, a także percentyle dla każdej kolumny w DataFrame. Jest to bardzo przydatne narzędzie.

Możemy również sprawdzić wymiary naszej ramki danych, aby dowiedzieć się, ile ma wierszy i kolumn. Służy do tego funkcja `df.shape`, która zwraca krotkę w formacie (wiersze, kolumny).

Możemy także podejrzeć nazwy wszystkich kolumn w naszym DataFrame za pomocą `df.columns`.

Co zrobić, jeśli chcemy wybrać tylko jedną kolumnę i wyświetlić jej zawartość? Robi się to w sposób przypominający wycinanie elementu ze słownika. Wpisz poniższy kod w nowym bloku kodu i uruchom go:

df['price ']

Powyższy kod zwróci kolumnę „price”. Możemy zapisać tę kolumnę w nowej zmiennej:

price = df['price']

Teraz możemy wykonywać na zmiennej `price` wszystkie operacje, jakie można wykonać na DataFrame, ponieważ jest to jej podzbiór. Możemy więc użyć na przykład `df.head()`, `df.shape` itp.

Możemy też wybrać wiele kolumn, przekazując listę nazw kolumn do `df` w następujący sposób:

data = df[['price ', 'bedrooms']]

Powyższy kod wybiera kolumny o nazwach „price” i „bedrooms”. Jeśli wpiszemy `data.head()` w nowym bloku kodu, otrzymamy:

Powyższy sposób wycinania kolumn zwraca wszystkie elementy wierszy w danej kolumnie. Co jednak, jeśli chcemy zwrócić podzbiór wierszy i podzbiór kolumn z naszego zbioru danych? Możemy to zrobić za pomocą funkcji `.iloc`, która działa podobnie do indeksowania list w Pythonie. Zatem, możemy zrobić coś takiego:

df.iloc[50: , 3]

Ten kod zwróci trzecią kolumnę, od wiersza 50 aż do końca. Jest to wygodny sposób na wycinanie danych, znany z list w Pythonie.

Teraz wykonajmy coś naprawdę interesującego. Nasz zbiór danych dotyczący cen nieruchomości zawiera kolumnę z ceną oraz inną z liczbą sypialni. Cena jest wartością ciągłą, więc jest mało prawdopodobne, że znajdziemy dwa domy o identycznej cenie. Natomiast liczba sypialni jest wartością dyskretną, zatem możemy mieć kilka domów z taką samą liczbą sypialni.

Załóżmy, że chcemy znaleźć wszystkie domy z identyczną liczbą sypialni, a następnie obliczyć średnią cenę dla każdej z tych grup. W Pandas jest to bardzo proste. Można to zrobić tak:

df.groupby('bedrooms ')['price '].mean()

Powyższy kod najpierw grupuje DataFrame według identycznej liczby sypialni za pomocą funkcji `df.groupby()`. Następnie wybiera kolumnę „price” i oblicza średnią cenę dla każdego z tych zbiorów za pomocą funkcji `.mean()`.

Co jeśli chcemy przedstawić powyższe dane na wykresie? Chcielibyśmy zobaczyć, jak zmienia się średnia cena dla każdej liczby sypialni. Wystarczy połączyć poprzedni kod z funkcją `.plot()` w następujący sposób:

df.groupby('bedrooms ')['price '].mean().plot()

Otrzymamy następujący wykres:

Wykres ten pokazuje pewne tendencje w danych. Na osi poziomej mamy liczbę sypialni, a na osi pionowej – średnią cenę. Widzimy, że domy z 5-10 sypialniami są znacznie droższe niż te z 3 sypialniami. Zauważamy też, że domy z około 7-8 sypialniami są znacznie droższe od domów z 15, 20 a nawet 30 pokojami.

Informacje tego typu pokazują, jak ważna jest analiza danych. Umożliwia wyciągnięcie wniosków, które nie są oczywiste na pierwszy rzut oka.

Brakujące dane

Załóżmy, że przeprowadzamy ankietę z szeregiem pytań. Rozsyłamy link do ankiety do tysięcy osób. Naszym celem jest analiza zebranych danych, aby wyciągnąć z nich wnioski.

W tym procesie wiele może pójść nie tak. Niektórzy respondenci mogą czuć się niekomfortowo, odpowiadając na niektóre pytania, i pominą je. Inni mogą postąpić tak samo z innymi pytaniami. Może nie byłby to problem, gdybyśmy nie zbierali danych liczbowych, które potem chcemy sumować, uśredniać i wykonywać na nich operacje arytmetyczne. Brakujące wartości mogłyby znacząco wpłynąć na poprawność analizy. Musimy znaleźć sposób na identyfikację takich brakujących wartości i zastąpienie ich odpowiednimi danymi.

Biblioteka Pandas udostępnia funkcję `isnull()`, która pomaga w identyfikacji brakujących danych w DataFrame.

Funkcji `isnull()` używamy w następujący sposób:

df.isnull()

Funkcja ta zwraca DataFrame z wartościami logicznymi. True oznacza, że w danej komórce brakuje danych, a False oznacza, że dane w komórce istnieją. Wynik działania tej funkcji wyglądałby tak:

Musimy znaleźć sposób, aby zastąpić te brakujące wartości. Najczęściej stosowanym rozwiązaniem jest zastąpienie ich zerem. Czasem może być to średnia ze wszystkich innych wartości lub średnia wartości sąsiednich – w zależności od rodzaju danych i analizy.

Aby wypełnić wszystkie brakujące wartości w DataFrame, używamy funkcji `.fillna()`, w następujący sposób:

df.fillna(0)

Powyższy kod zastępuje wszystkie brakujące dane wartością zero. Możemy oczywiście użyć dowolnej innej wartości, którą określimy.

Znaczenie danych jest ogromne, ponieważ to one dostarczają nam odpowiedzi! Mówi się, że analiza danych jest nową ropą naftową cyfrowej gospodarki.

Wszystkie przykłady z tego artykułu można znaleźć tutaj.

Aby dowiedzieć się więcej, zapoznaj się z kursem online Analiza danych w Pythonie i Pandas.


newsblog.pl