{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Statystyka i Analiza danych\n", "# Laboratorium 2 - Wprowadzenie do R\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Konsola języka R może służyć jako kalkulator. Wypróbuj podstawowe operacje arytmetyczne: dodawanie, odejmowanie, dzielenie, mnożenie, potęgowanie (`^`), operator modulo (`%%`). Aby wykonać kod z pola naciśnij `Ctrl+Enter`, aby skorzystać w autouzupełniania wciśnij `Tab`.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sprawdź też czy dzieląc dwie liczby całkowite wynik również jest całkowity (np. w języku Python $5/2=2$)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Szeregi rozdzielcze\n", "Szeregi rozdzielcze można łatwo skonstruować w pakiecie R. \n", "W tym celu najpierw wprowadźmy do systemu nasze dane. \n", "Możemy to zrobić np. poprzez ręczne utworzenie wektora z danymi wydając polecenie:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dane <- c(1123, 198, 473, 784, 305, 423, 397, 298, 698, 237)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Operator `<-` oznacza przypisanie, a funkcja `c()` tworzy z podanych liczb wektor.\n", "Wektor w R nie koniecznie musi zawierać liczby -- może to być dowolny typ danych np. ciąg znaków, jednakże dane w całym wektorze zawsze muszą być jednakowego typu.\n", "\n", "Aby utworzyć szereg rozdzielczy musimy podzielić nasze dane na przedziały.\n", "Możemy zrobić to za pomocą funkcji `cut(dane, breaks=liczba_przedziałów)` w której musimy ręcznie wyspecyfikować liczbę przedziałów poprzez podanie argumentu `breaks=`. \n", "Załóżmy, że dla naszego krótkiego wektora danych wystarczą 3 przedziały i wywołajmy polecenie:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "dane_w_przedzialach <- ...\n", "print(dane_w_przedzialach)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Utworzona właśnie zmienna `dane_w_przedzialach` nie jest już wektorem, ale zmienną typu factor. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "is.vector(dane_w_przedzialach)\n", "is.factor(dane_w_przedzialach)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Stało się tak dlatego, że funkcja `cut()` po określeniu zakresu przedziałów automatycznie przekonwertowała wszystkie wartości wektora `dane` na nazwy odpowiadających im przedziałów.\n", "Dane zmieniły więc swój typ i są teraz typu jakościowego. Zwróć uwagę, że po wypisaniu zawartości naszej zmiennej pojawiła się dodatkowa linijka `Levels: ...` która pokazuje kolejne możliwe wartości naszej zmiennej nominalnej.\n", "\n", "Mając tak przygotowane dane, wystarczy zliczyć wartości poszczególnych przedziałów funkcją `table()`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ćwiczenia\n", "Podczas wykonywania tutorial'a poznałeś typ factor służący do przechowywania wartości nominalnych.\n", "Możesz przekonwertować wektor tekstów do wektora typu factor poprzez wywołanie `factor(nazwa_wektora)`.\n", "\n", "Stwórz wektor o wartościach `[\"Mężczyzna\", \"Kobieta\", \"Kobieta\", \"Mężczyzna\", \"Mężczyzna\"]` i przekonwertuj do typu factor. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Spróbuj porównać (np. znakiem większości) pierwszy i drugi element nowo utworzonego wektora." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Typ wektorowy pozwala na przechowywanie danych tylko jednego typu. \n", "Co się stanie jeśli spróbujesz utworzyć wektor zawierający np. liczby i ciągi znaków? " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Poniższy wektor" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ulubiony_przedmiot <- c(\"SiAD\", \"PP\", \"PO\", \"AiSD\", \"MD\", \"PO\", \"SiAD\", \"SiAD\", \"SiAD\", \"AiSD\", \"SiAD\", \"PO\", \"SiAD\", \"PP\", \"SiAD\", \"SiAD\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "zawiera dane o ulubionych przedmiotach studentów. Stwórz tablekę pokazującą ilu studentów lubi dany przedmiot." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Operacje na wektorach\n", "Język R, podobnie jak poznany na przedmiocie ,,Narzędzia informatyki'' MATLAB/Octave, operuje na wektorach i macierzach.\n", "Pracując w R możesz więc wykonywać operacje na całych wektorach (tak samo jak w MATLAB).\n", "\n", "Dla szybkiego przypomnienia, przetestuj w R następujące komendy:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "dane <- c(1123, 198, 473, 784, 305, 423, 397, 298, 698, 237)\n", "dane*2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "dane[5]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "dane[c(1,5)]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "dane > 500" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "dane[dane > 500]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ćwiczenia\n", "Spróbuj wyciągnąć z wektora `dane` element o niecałkowitym indeksie np. 2.5. Co się stało?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wypisz z wektora `dane` wszystkie liczby parzyste." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Oprócz funkcji `c()` możemy stworzyć wektor poprzez wywołanie funkcji `seq(od, do, co_ile)` np. `seq(1,10,1)` wypisze wszystkie liczby od 1 do 10. W przypadku generowania kolejnych cyfr można też posłużyć się konstrukcją `od:do` np. `1:10`.\n", "\n", "Wygeneruj wszystkie liczby od 1 do 20" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wygeneruj wszystkie liczby parzyste mniejsze od 50" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wygeneruj wszystkie wielokrotności liczby 3 mniejsze od 100, a następnie zlicz ile z nich kończy się daną cyfrą." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Przekonwertuj podane temperatury w Fahrenheitach na stopnie Celsjusza\n", "`fahrenheit<-c(32, 59, 86)`. Wzór na konwersję masz podany poniżej.\n", "$$c = \\frac{(f-32)\\cdot 5}{9}$$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "fahrenheit<-c(32, 59, 86)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Jeżeli `x<-c(5,9,2,3,4,6,7,0,8,12,2,9)` to co zwrócą poniższe komendy? Odpowiedz a następnie sprawdź swoje hipotezy w R.\n", "+ `x[2]`\n", "+ `x[2:4]`\n", "+ `x[c(2,3,6)]`\n", "+ `x[c(1:5,10:12)]`\n", "+ `x[-(10:12)]`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x<-c(5,9,2,3,4,6,7,0,8,12,2,9)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dane" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "y<-c(33,44,29,16,25,45,33,19,54,22,21,49,11,24,56)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "zawierają sprzedaż mleka w litrach dla 5 dni w 3 różnych sklepach (pierwsze 3 wartości są sprzedażą mleka w poniedziałek w kolejnych sklepach).\n", "Wygeneruj podsumowanie statystyczne sprzedaży (średnia, mediana, kwartyle) dla każdego ze sklepów." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Graficzna analiza danych w R\n", "Jednym z popularnych zastosowań analizy danych w ostatnich latach jest analiza wydźwięku (ang. *sentiment analysis*).\n", "Firmy takie jak np. Samsung czy Apple chcąc dowiedzieć się co (nie) podoba się użytkownikom w ich produktach analizując wpisy pojawiające się na portalach takich jak Twitter czy Facebook.\n", "\n", "Na każdym takim wpisie (,,tweecie'') dotyczącym np. nowego modelu smartfona jest przeprowadzana analiza statystyczna, która przydziela mu liczbę z pewnego zakresu np. od 1 do 10.\n", "Tę liczbę będziemy nazywać współczynnikiem wydźwięku.\n", "Wysokie wartości tego współczynnika, bliskie 10, oznaczają wpisy silnie pozytywne (,,*Kocham mojego nowego Galaxy S6!!!*''), a wartości niskie oznaczają wpisy niezadowolonych użytkowników (,,*Co za badziew! #rozczarowanie*'').\n", "\n", "W tym ćwiczeniu będziesz pracował na właśnie takich danych, które zostały już specjalnie przetworzone i ułożone w tabelki, abyś nie musiał dokonywać żmudnych manipulacji na tekstach.\n", "Twoim zadaniem jest dokonanie graficznej analizy danych, podczas której powinieneś dowiedzieć się czego dotyczą analizowane wpisy (nie są to wpisy dot. smartfonów jak w przykładzie wyżej).\n", "\n", "Powodzenia!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Część 1: Czego dotyczą zebrane tweety?\n", "Na początku przygotuj twoje środowisko pracy poprzez wywołanie polecenia, które ściągnie z Internetu wszystkie potrzebne dane." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "source(\"http://www.cs.put.poznan.pl/mlango/siad/data/ead.R\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dane w R najczęściej są przechowywane w tzw. ramkach danych (*data frame*), która są kolekcjami wektorów (kolumn).\t\n", "Jedną z załadowanych przez skrypt struktur jest ramka danych `vocabulary`. \n", "Sprawdźmy jej rozmiar poprzez wywołane polecenia:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "dim(vocabulary)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Zostały zwrócone dwie liczby: pierwsza z nich to liczba wierszy (obserwacji), a druga to liczba kolumn (atrybutów).\n", "\n", "Dostęp do tych danych wygląda analogicznie jak do wektorów, z tym że jest to struktura dwuwymiarowa, więc trzeba podawać 2 indeksy (numer wiersza, numer kolumny).\n", "Na szczęście jeden z indeksów można pominąć -- zostanie wtedy wyświetlony cały wiersz lub cała kolumna.\n", "Na przykład aby wyświetlić piąty wiersz ramki wystarczy wpisać:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "vocabulary[5,]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Zauważ, że pominęliśmy indeks kolumny w związku z czym zostały wyświetlone wszystkie kolumny piątego wiersza.\n", "\n", "Innym sposobem na wyświetlenie większej liczby danych jest funkcja (analogiczna do Unix'owej) `head()`.\n", "Wywołaj ją na naszej strukturze, aby zobaczyć pierwsze pięć wierszy." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Jak pewnie się już domyślasz tabela ta zawiera słowa wraz z liczbą wystąpień we wszystkich wpisach użytkowników. \n", "Aby wyświetlić nazwy kolumn wystarczy wywołać polecenie:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "names(vocabulary)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ojej! Nazwy tych kolumn nic nam nie mówią -- pora to zmienić! \n", "Skorzystajmy z magii języka R i przypiszmy wartość do wyniku funkcji (!).\n", "```\n", "names(vocabulary) <- ...\n", "```\n", "W miejsce trzech kropek należy podać wektor nazw kolumn, w naszym przypadku dwuelementowy. \n", "Aby zachować spójność z dalej przyjętą notacją nazwij pierwszą kolumnę ,,word'', a drugą ,,count''." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "names(vocabulary) <- ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Teraz, gdy kolumny już są nazwane możemy odwoływać się do poszczególnych kolumn w sposób znacznie wygodniejszy.\n", "Na przykład aby uzyskać dostęp do całej kolumny ,,count'' możemy użyć następującej składni: `vocabulary$count`.\n", "Na wektorze tym możemy np. policzyć średnią arytmetyczną:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mean(vocabulary$count)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Istnieją też analogiczne funkcje: `max()`, `min()`, `median()` czy `sort()`.\n", "Na szczególną uwagę zasługuje funkcja wyświetlająca podstawowe statystyki dotyczące każdej z kolumn: `summary()` (możemy ją wywołać na całej ramce danych, a nie tylko na kolumnie)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "summary(vocabulary)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Przystąpmy do analizy: chcielibyśmy się dowiedzieć czego dotyczą zebrane przez nas wpisy użytkowników.\n", "W tym celu sprawdźmy jak wyglądają częstotliwości występowania poszczególnych słów. \n", "Utwórz wykres słupkowy na kolumnie ,,count'' poprzez wpisanie komendy:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "barplot(vocabulary$count)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Niestety, na wykresie niezbyt wiele widać... Spróbuj posortować wartości wektora zanim utworzysz wykres. Może teraz uda Ci się wyciągnąć jakieś wnioski?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Z wykresu wynika, że istnieje pewna mała grupa słów, które występują bardzo często w stosunku do reszty.\n", "Jeśli jakieś słowo ma dużą częstotliwość to znaczy, że wystąpiło w wielu wpisach użytkowników -- może więc dzięki nim dowiemy się czego dotyczą obserwowane przez nas wpisy?\n", "Odczytaj z wykresu wartość powyżej której występuje bardzo mała liczba słów, a następnie używając filtrowania wypisz je na ekran." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Spotkało nas rozczarowanie: większość z wyświetlonych słów nie ma żadnego realnego znaczenia, a ich częste występowanie nie niesie żadnej informacji o temacie wpisów w zbiorze danych.\n", "Na szczęście jest to znany problem w analizie tekstu, a takie słowa nazywamy z angielskiego *stopwords* (https://pl.wikipedia.org/wiki/Stop_lista_\\%28wyszukiwarki\\%29).\n", "\n", "Wśród zmiennych w środowisku roboczym jest wektor `stopwords`, zawierający powszechnie używaną listę takich słów (możesz sobie ją wyświetlić)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Utwórz nową ramkę danych `vocabulary_filtered` poprzez wyfiltrowanie wszystkich wierszy zawierających *stopwords*. \n", "Użyj operatora `%in%` sprawdzającego czy wartość zmiennej występuje w zbiorze oraz operatora negacji `!`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "vocabulary_filtered <- ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sprawdź poleceniem `dim()` czy liczba wierszy w nowej ramce jest trochę mniejsza niż w oryginalnej." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Utwórz wykres słupkowy na nowej ramce danych (pamiętaj o posortowaniu wektora)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wykres szczególnie się nie zmienił, poza tym że zakres wartości jest trochę mniejszy. \n", "Jednak teraz najczęściej występujące słowa powinny być bardziej znaczące -- wyświetl je. Czy już wiesz czego dotyczą wpisy użytkowników?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Teraz, gdy już wiemy, że wpisy użytkowników dotyczą odwiecznego sporu informatyków o to który system operacyjny jest najlepszy, spróbujmy sprawdzić o którym systemie użytkownicy częściej piszą oraz który system ma więcej pozytywnych wpisów.\n", "\n", "#### Część 2: Który system operacyjny jest najlepszy? Linux vs Windows.\n", "\n", "W tej części ćwiczenia będziemy analizować nową ramkę danych dostępną w zmiennej `day_stats`. Ramka ta zawiera 4 kolumny:\n", "+ datę (date)\n", "+ nazwę systemu operacyjnego (os: ,,linux'' lub ,,windows'')\n", "+ liczbę tweetów opublikowanych w danym dniu i dotyczącego danego systemu operacyjnego (count)\n", "+ średnią ocenę pozytywnego wydźwięku wpisów (positive\\_coeff) - im wyższa średnia, tym bardziej pozytywnie mówiono o danym systemie operacyjnym\n", "\n", "Obejrzyj kilka rekordów z tabeli (funkcja `head()`)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wyświetl podsumowanie informacji o tych danych (`summary()`). Z jakiego okresu czasu pochodzą dane? Jaka jest średni współczynnik pozytywnego wydźwięku analizowanych wpisów?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ " W celu dokładniejszego zbadania wartości współczynnika wydźwięku skonstruujmy dla niego histogram:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "hist(day_stats$positive_coeff)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Chcielibyśmy uzyskać\thistogram z większą liczbą słupków oraz z słupkami pokolorowanymi na czerwono (`\"red\"`).\n", " Korzystając z pomocy do funkcji `hist` (aby ją wyświetlić wpisz znak zapytania i nazwę funkcji) zbuduj takie histogramy dla liczby słupków 70 i 150." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "?hist" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Histogram mający 70 słupków" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Histogram mający 150 słupków\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Obraz histogramu przy 150 słupkach jest ,,szarpany'' (raz słupek raz wolne miejsce).\n", "Dlaczego się tak stało?\n", "Aby odpowiedzieć na to pytanie zobacz do ilu miejsc po przecinku są raportowe współczynniki wydźwięku i jaki jest ich zakres wartości." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Jaka jest szerokość przedziału, który obejmuje jeden słupek na wykresie?\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Jak sądzisz czy ten histogram ze 150 słupkami jest prawidłowy?\n", "\n", "Innym sposobem zobaczenia rozkładu wartości (z mniejszą szczegółowością) jest narysowanie wykresu pudełkowego.\n", " Narysuj go w R poprzez wywołanie funkcji `boxplot()`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pewną zaletą wykresu pudełkowego nad histogramem jest to, że na jednym wykresie możemy zaprezentować kilka serii wartości.\n", "Chcielibyśmy się dowiedzieć jak różni się rozkład współczynnika wydźwięku dla różnych systemów operacyjnych.\n", "Aby to zrobić narysujmy wykres pudełkowy współczynnika wydźwięku w zależności od zmiennej system operacyjny.\n", "```\n", "boxplot(day_stats$positive_coeff ~ day_stats$os)\n", "```\n", "Wyrażenia typu `y ~ x` możesz czytać jako ,,y zależy od x'', ,,y jako funkcja od x''..." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "O którym systemie operacyjnym użytkownicy piszą pozytywniej?\n", "Czy możesz wyciągnąć z wykresu jakieś inne wnioski?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Kończąc naszą analizę sprawdźmy czy są dni w których użytkownicy piszą częściej o którymś z systemów operacyjnych np. o systemie Linux.\n", "W tym celu utwórzmy nową ramkę zawierającą tylko dane o systemie Linux:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "day_stats_linux <- ...." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A następnie użyj funkcji `plot()` do narysowania wykresu liczby tweetów w czasie.\n", "Argumentem tej funkcji powinno być wyrażenie ,,liczba wpisów zależy od daty'' (konstrukcja z operatorem `~`)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Otrzymaliśmy wykres punktowy, a chcielibyśmy otrzymać wykres liniowy. Korzystając z pomocy pakietu R znajdź dodatkowy argument funkcji `plot()`, który spowoduje utworzenie porządanego typu wykresu." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wygląda na to, że liczba wpisów o systemie Linux waha się pomiędzy kolejnymi dniami, ale nie widzimy żadnego trendu tj. liczba wpisów nie rośnie ani nie maleje. Spróbuj zbudować analogiczny wykres dla systemu Windows -- może tam zobaczysz coś ciekawego?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Korzystając z internetu spróbuj znaleźć przyczynę, która spowodowała nagły wzrost tweetów dotyczących systemu Windows w drugiej połowie sierpnia 2015?." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ćwiczenia\n", "Behavioral Risk Factor Surveillance System (BRFSS) to doroczna ankieta telefoniczna przeprowadzana w Stanach Zjednoczonych mająca na celu zidentyfikowanie i kontrolowanie zagrożeń zdrowotnych w populacji ludzi dorosłych.\n", "Respondenci udzielają odpowiedzi na pytania dotyczące ich diety, cotygodniowej aktywności fizycznej, użycia papierosów, chorowania na HIV/AIDS itd. (Pełen opis tego badania możesz znaleźć na stornie http://www.cdc.gov/brfss). \n", "Losowa próbka 20 tysięcy obserwacji z tego badania jest dostępna w zmiennej `medical_data`.\n", "\n", "Przeprowadź graficzną analizę tych danych, a w szczególności:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "+ narysuj wykres słupkowy pokazujący liczbę osób palących i nie palących (kolumna ,,smoke100'' zawiera odpowiednio ,,0'' lub ,,1'' gdy ktoś pali lub nie). Podpisz osie wykresu.\n", "\n", "*Wskazówka: Do konstrukcji tabeli częstości występowania wartości zmiennej można wykorzystać funkcję `table()`*" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "+ narysuj wykres pudełkowy wysokości człowieka (`height`) w zależności od płci (`gender`). " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "+ używając wykresu pudełkowego sprawdź zależność pomiędzy wskaźnikiem masy ciała BMI (patrz: https://pl.wikipedia.org/wiki/Wska%C5%BAnik_masy_cia%C5%82a) a ogólną oceną stanu zdrowia (genhlth). Wskaźnik BMI (biorąc pod uwagę jednostki użyte do mierzenia wysokości i wagi w zbiorze danych) można wyrazić wzorem:\n", "$$BMI=\\frac{weigth}{height^2} \\cdot 703 $$ \n", "Zdrowy człowiek powinien mieć BMI pomiędzy 18.5 a 25." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "+ narysuj histogram wieku badanych (age)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "+ zbadaj zależność pomiędzy różnicą pomiędzy pożądaną wagą (wtdesire) a wagą aktualną (weight) oraz płcią (gender)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "R", "language": "R", "name": "ir" }, "language_info": { "codemirror_mode": "r", "file_extension": ".r", "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", "version": "3.3.2" } }, "nbformat": 4, "nbformat_minor": 2 }