diff --git a/IUM_00.Organizacyjne.ipynb b/IUM_00.Organizacyjne.ipynb
index 4922fe2..032e660 100644
--- a/IUM_00.Organizacyjne.ipynb
+++ b/IUM_00.Organizacyjne.ipynb
@@ -139,8 +139,26 @@
"| dobry (db; 4,0)\t | >= 70% |\n",
"| dostateczny plus (+dst; 3,5)| >= 60% |\n",
"| dostateczny (dst; 3,0) | >= 50% |\n",
- "| niedostateczny (ndst; 2,0) | < 50% |"
+ "| niedostateczny (ndst; 2,0) | < 50% |\n"
]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Obecność\n",
+ "\n",
+ "# ZMIANY! #\n",
+ "Zgodnie z oficjalnymi zasadami obowiązującymi w projekcie AITech, dopuszczalna liczba nieobecności na zajęciach wynosi 3 (obowiązkowa obecność na 80% zajęć).\n",
+ "Powyżej 3 nieobecności przemiot nie może być zaliczony."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
}
],
"metadata": {
@@ -160,7 +178,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.8.5"
+ "version": "3.8.3"
},
"toc": {
"base_numbering": 1,
diff --git a/IUM_02.Dane.ipynb b/IUM_02.Dane.ipynb
new file mode 100644
index 0000000..147ec44
--- /dev/null
+++ b/IUM_02.Dane.ipynb
@@ -0,0 +1,1477 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "# Plan na dzisiaj\n",
+ "1. Motywacja\n",
+ "2. Podział danych\n",
+ "3. Skąd wziąć dane?\n",
+ "4. Przygotowanie danych\n",
+ "5. Zadanie"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "# Motywacja\n",
+ "- Zasada \"Garbage in - garbage out\"\n",
+ "- Im lepszej jakości dane - tym lepszy model\n",
+ "- Najlepsza architektura, najpotężniejsze zasoby obliczeniowe i najbardziej wyrafinowane metody nie pomogą, jeśli dane użyte do rozwoju modelu nie odpowiadają tym, z którymi będzie on używany, albo jeśli w danych nie będzie żadnych zależności\n",
+ "- Możemy stracić dużo czasu, energii i zasobów optymalizując nasz model w złym kierunku, jeśli dane są źle dobrane"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "# Źródła danych\n",
+ "- Gotowe zbiory:\n",
+ " - Otwarte wyzwania (challenge)\n",
+ " - Repozytoria otwartych zbiorów danych\n",
+ " - Dane udostępniane przez firmy\n",
+ " - Repozytoria zbiorów komercyjnych\n",
+ " - Dane wewnętrzne (np. firmy)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "# Źródła danych\n",
+ "- Tworzenie danych:\n",
+ " - Generowanie syntetyczne\n",
+ " - Crowdsourcing\n",
+ " - Data scrapping\n",
+ " - Ekstrakcja\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "## Otwarte wyzwania (shared task / challenge)\n",
+ "- Kaggle: https://www.kaggle.com/datasets\n",
+ "- Gonito: https://gonito.net/list-challenges - polski (+poznański +z UAM) Kaggle\n",
+ "- Semeval: https://semeval.github.io/ - zadania z semantyki\n",
+ "- Poleval: http://poleval.pl/ - przetwarzanie języka polskiego\n",
+ "- WMT http://www.statmt.org/wmt20/ (tłumaczenie maszynowe)\n",
+ "- IWSLT https://iwslt.org/2021/#shared-tasks (tłumaczenie mowy)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "## Repozytoria/wyszukiwarki otwartych zbiorów danych\n",
+ "- Papers with code: https://paperswithcode.com/datasets\n",
+ "- UCI Machine Learning Repository: https://archive.ics.uci.edu/ml/\n",
+ "- Google dataset search: https://datasetsearch.research.google.com/\n",
+ "- Zbiory google:https://research.google/tools/datasets/\n",
+ "- https://registry.opendata.aws/\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "## Otwarte zbiory\n",
+ "- Rozpoznawanie mowy:\n",
+ " - https://www.openslr.org/ - Libri Speech, TED Lium\n",
+ " - Mozilla Open Voice: https://commonvoice.mozilla.org/\n",
+ "- NLP:\n",
+ " - Clarin PL: https://lindat.cz/repository/xmlui/\n",
+ " - Clarin: https://clarin-pl.eu/index.php/zasoby/\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "## Crowdsourcing\n",
+ "- Amazon Mechanical Turk: https://www.mturk.com/\n",
+ "- Yandex Toloka\n",
+ "- reCAPTCHA\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "## Licencje\n",
+ "- Przed podjęciem decyzji o użyciu danego zbioru koniecznie sprawdź jego licencję!\n",
+ "- Wiele dostępnych w internecie zbiorów jest udostępniana na podstawie otwartych licencji\n",
+ "- Zazwyczaj jednak ich użycie wymaga spełnienia pewnych warunków, np. podania źródła\n",
+ "- Wiele ogólnie dostępnych zbiorów nie może być jednak użytych za darmo w celach komercyjnych!\n",
+ "- Niektóre z nich mogą nawet powodować, że praca pochodna, która zostanie stworzona z ich wykorzystaniem, będzie musiała być udostępniona na tej samej licencji (GPL). Jest to \"niebezpieczeństwo\" w przypadku wykorzystania zasobów przez firmę komercyjną!\n",
+ "- Zasady działania licencji CC: https://creativecommons.pl/\n",
+ "- Najbardziej popularne licencje:\n",
+ " - Przyjazne również w zastosowaniach komercyjnych: MIT, BSD, Appache, CC (bez dopisku NC)\n",
+ " - GPL (GNU Public License) - \"zaraźliwa\" licencja Open Source"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "### Przykład \n",
+ "- Za pomocą standardowych narzędzi bash dokonamy wstępnej inspekcji i podziału danych\n",
+ "- Jako przykładu użyjemy klasycznego zbioru IRIS: https://archive.ics.uci.edu/ml/datasets/Iris\n",
+ "- Zbiór zawiera dane dotyczące długości i szerokości płatków kwiatowych trzech gatunków irysa:\n",
+ " - Iris Setosa\n",
+ " - Iris Versicolour\n",
+ " - Iris Virginica\n",
+ " \n",
+ "\n",
+ "https://www.kaggle.com/vinayshaw/iris-species-100-accuracy-using-naive-bayes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "## Inspekcja\n",
+ "- Zanim zaczniemy trenować model na danych, powinniśmy poznać ich specyfikę\n",
+ "- Pozwoli nam to:\n",
+ " - usunąć lub naprawić nieprawidłowe przykłady\n",
+ " - dokonać selekcji cech, których użyjemy w naszym modelu\n",
+ " - wybrać odpowiedni algorytm uczenia\n",
+ " - podjąć dezycję dotyczącą podziału zbioru i ewentualnej normalizacji\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "## Inspekcja\n",
+ "- Do inspekcji danych użyjemy popularnej biblioteki pythonowej Pandas: https://pandas.pydata.org/\n",
+ "- Do wizualizacji użyjemy biblioteki Seaborn: https://seaborn.pydata.org/index.html\n",
+ "- Służy ona do analizy i operowania na danych tabelarycznych jak i szeregach czasowych"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "scrolled": true,
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Requirement already satisfied: kaggle in /home/tomek/.local/lib/python3.8/site-packages (1.5.12)\n",
+ "Requirement already satisfied: python-dateutil in /home/tomek/anaconda3/lib/python3.8/site-packages (from kaggle) (2.8.1)\n",
+ "Requirement already satisfied: six>=1.10 in /home/tomek/anaconda3/lib/python3.8/site-packages (from kaggle) (1.15.0)\n",
+ "Requirement already satisfied: urllib3 in /home/tomek/anaconda3/lib/python3.8/site-packages (from kaggle) (1.25.11)\n",
+ "Requirement already satisfied: python-slugify in /home/tomek/.local/lib/python3.8/site-packages (from kaggle) (4.0.1)\n",
+ "Requirement already satisfied: certifi in /home/tomek/anaconda3/lib/python3.8/site-packages (from kaggle) (2020.6.20)\n",
+ "Requirement already satisfied: tqdm in /home/tomek/anaconda3/lib/python3.8/site-packages (from kaggle) (4.50.2)\n",
+ "Requirement already satisfied: requests in /home/tomek/anaconda3/lib/python3.8/site-packages (from kaggle) (2.24.0)\n",
+ "Requirement already satisfied: text-unidecode>=1.3 in /home/tomek/.local/lib/python3.8/site-packages (from python-slugify->kaggle) (1.3)\n",
+ "Requirement already satisfied: chardet<4,>=3.0.2 in /home/tomek/anaconda3/lib/python3.8/site-packages (from requests->kaggle) (3.0.4)\n",
+ "Requirement already satisfied: idna<3,>=2.5 in /home/tomek/anaconda3/lib/python3.8/site-packages (from requests->kaggle) (2.10)\n",
+ "Requirement already satisfied: pandas in /home/tomek/anaconda3/lib/python3.8/site-packages (1.1.3)\n",
+ "Requirement already satisfied: python-dateutil>=2.7.3 in /home/tomek/anaconda3/lib/python3.8/site-packages (from pandas) (2.8.1)\n",
+ "Requirement already satisfied: numpy>=1.15.4 in /home/tomek/anaconda3/lib/python3.8/site-packages (from pandas) (1.19.2)\n",
+ "Requirement already satisfied: pytz>=2017.2 in /home/tomek/anaconda3/lib/python3.8/site-packages (from pandas) (2020.1)\n",
+ "Requirement already satisfied: six>=1.5 in /home/tomek/anaconda3/lib/python3.8/site-packages (from python-dateutil>=2.7.3->pandas) (1.15.0)\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Zainstalujmy potrzebne biblioteki \n",
+ "!pip install --user kaggle #API Kaggle, do pobrania zbioru\n",
+ "!pip install --user pandas"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Warning: Your Kaggle API key is readable by other users on this system! To fix this, you can run 'chmod 600 /home/tomek/.kaggle/kaggle.json'\n",
+ "iris.zip: Skipping, found more recently modified local copy (use --force to force download)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Żeby poniższa komenda zadziałała, musisz posiadać plik /.kaggle/kaggle.json, zawierający Kaggle API token.\n",
+ "# Instrukcje: https://www.kaggle.com/docs/api\n",
+ "!kaggle datasets download -d uciml/iris"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Archive: iris.zip\r\n",
+ " inflating: Iris.csv \r\n",
+ " inflating: database.sqlite \r\n"
+ ]
+ }
+ ],
+ "source": [
+ "!unzip -o iris.zip"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Id,SepalLengthCm,SepalWidthCm,PetalLengthCm,PetalWidthCm,Species\r\n",
+ "1,5.1,3.5,1.4,0.2,Iris-setosa\r\n",
+ "2,4.9,3.0,1.4,0.2,Iris-setosa\r\n",
+ "3,4.7,3.2,1.3,0.2,Iris-setosa\r\n",
+ "4,4.6,3.1,1.5,0.2,Iris-setosa\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "!head -n 5 Iris.csv"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Id | \n",
+ " SepalLengthCm | \n",
+ " SepalWidthCm | \n",
+ " PetalLengthCm | \n",
+ " PetalWidthCm | \n",
+ " Species | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 5.1 | \n",
+ " 3.5 | \n",
+ " 1.4 | \n",
+ " 0.2 | \n",
+ " Iris-setosa | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 2 | \n",
+ " 4.9 | \n",
+ " 3.0 | \n",
+ " 1.4 | \n",
+ " 0.2 | \n",
+ " Iris-setosa | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 3 | \n",
+ " 4.7 | \n",
+ " 3.2 | \n",
+ " 1.3 | \n",
+ " 0.2 | \n",
+ " Iris-setosa | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 4 | \n",
+ " 4.6 | \n",
+ " 3.1 | \n",
+ " 1.5 | \n",
+ " 0.2 | \n",
+ " Iris-setosa | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 5 | \n",
+ " 5.0 | \n",
+ " 3.6 | \n",
+ " 1.4 | \n",
+ " 0.2 | \n",
+ " Iris-setosa | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 145 | \n",
+ " 146 | \n",
+ " 6.7 | \n",
+ " 3.0 | \n",
+ " 5.2 | \n",
+ " 2.3 | \n",
+ " Iris-virginica | \n",
+ "
\n",
+ " \n",
+ " 146 | \n",
+ " 147 | \n",
+ " 6.3 | \n",
+ " 2.5 | \n",
+ " 5.0 | \n",
+ " 1.9 | \n",
+ " Iris-virginica | \n",
+ "
\n",
+ " \n",
+ " 147 | \n",
+ " 148 | \n",
+ " 6.5 | \n",
+ " 3.0 | \n",
+ " 5.2 | \n",
+ " 2.0 | \n",
+ " Iris-virginica | \n",
+ "
\n",
+ " \n",
+ " 148 | \n",
+ " 149 | \n",
+ " 6.2 | \n",
+ " 3.4 | \n",
+ " 5.4 | \n",
+ " 2.3 | \n",
+ " Iris-virginica | \n",
+ "
\n",
+ " \n",
+ " 149 | \n",
+ " 150 | \n",
+ " 5.9 | \n",
+ " 3.0 | \n",
+ " 5.1 | \n",
+ " 1.8 | \n",
+ " Iris-virginica | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
150 rows × 6 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm \\\n",
+ "0 1 5.1 3.5 1.4 0.2 \n",
+ "1 2 4.9 3.0 1.4 0.2 \n",
+ "2 3 4.7 3.2 1.3 0.2 \n",
+ "3 4 4.6 3.1 1.5 0.2 \n",
+ "4 5 5.0 3.6 1.4 0.2 \n",
+ ".. ... ... ... ... ... \n",
+ "145 146 6.7 3.0 5.2 2.3 \n",
+ "146 147 6.3 2.5 5.0 1.9 \n",
+ "147 148 6.5 3.0 5.2 2.0 \n",
+ "148 149 6.2 3.4 5.4 2.3 \n",
+ "149 150 5.9 3.0 5.1 1.8 \n",
+ "\n",
+ " Species \n",
+ "0 Iris-setosa \n",
+ "1 Iris-setosa \n",
+ "2 Iris-setosa \n",
+ "3 Iris-setosa \n",
+ "4 Iris-setosa \n",
+ ".. ... \n",
+ "145 Iris-virginica \n",
+ "146 Iris-virginica \n",
+ "147 Iris-virginica \n",
+ "148 Iris-virginica \n",
+ "149 Iris-virginica \n",
+ "\n",
+ "[150 rows x 6 columns]"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "iris=pd.read_csv('Iris.csv')\n",
+ "iris"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "scrolled": true,
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Id | \n",
+ " SepalLengthCm | \n",
+ " SepalWidthCm | \n",
+ " PetalLengthCm | \n",
+ " PetalWidthCm | \n",
+ " Species | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " count | \n",
+ " 150.000000 | \n",
+ " 150.000000 | \n",
+ " 150.000000 | \n",
+ " 150.000000 | \n",
+ " 150.000000 | \n",
+ " 150 | \n",
+ "
\n",
+ " \n",
+ " unique | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " top | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Iris-virginica | \n",
+ "
\n",
+ " \n",
+ " freq | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 50 | \n",
+ "
\n",
+ " \n",
+ " mean | \n",
+ " 75.500000 | \n",
+ " 5.843333 | \n",
+ " 3.054000 | \n",
+ " 3.758667 | \n",
+ " 1.198667 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " std | \n",
+ " 43.445368 | \n",
+ " 0.828066 | \n",
+ " 0.433594 | \n",
+ " 1.764420 | \n",
+ " 0.763161 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " min | \n",
+ " 1.000000 | \n",
+ " 4.300000 | \n",
+ " 2.000000 | \n",
+ " 1.000000 | \n",
+ " 0.100000 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 25% | \n",
+ " 38.250000 | \n",
+ " 5.100000 | \n",
+ " 2.800000 | \n",
+ " 1.600000 | \n",
+ " 0.300000 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 50% | \n",
+ " 75.500000 | \n",
+ " 5.800000 | \n",
+ " 3.000000 | \n",
+ " 4.350000 | \n",
+ " 1.300000 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 75% | \n",
+ " 112.750000 | \n",
+ " 6.400000 | \n",
+ " 3.300000 | \n",
+ " 5.100000 | \n",
+ " 1.800000 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " max | \n",
+ " 150.000000 | \n",
+ " 7.900000 | \n",
+ " 4.400000 | \n",
+ " 6.900000 | \n",
+ " 2.500000 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm \\\n",
+ "count 150.000000 150.000000 150.000000 150.000000 150.000000 \n",
+ "unique NaN NaN NaN NaN NaN \n",
+ "top NaN NaN NaN NaN NaN \n",
+ "freq NaN NaN NaN NaN NaN \n",
+ "mean 75.500000 5.843333 3.054000 3.758667 1.198667 \n",
+ "std 43.445368 0.828066 0.433594 1.764420 0.763161 \n",
+ "min 1.000000 4.300000 2.000000 1.000000 0.100000 \n",
+ "25% 38.250000 5.100000 2.800000 1.600000 0.300000 \n",
+ "50% 75.500000 5.800000 3.000000 4.350000 1.300000 \n",
+ "75% 112.750000 6.400000 3.300000 5.100000 1.800000 \n",
+ "max 150.000000 7.900000 4.400000 6.900000 2.500000 \n",
+ "\n",
+ " Species \n",
+ "count 150 \n",
+ "unique 3 \n",
+ "top Iris-virginica \n",
+ "freq 50 \n",
+ "mean NaN \n",
+ "std NaN \n",
+ "min NaN \n",
+ "25% NaN \n",
+ "50% NaN \n",
+ "75% NaN \n",
+ "max NaN "
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "iris.describe(include='all')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "scrolled": true,
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Iris-virginica 50\n",
+ "Iris-setosa 50\n",
+ "Iris-versicolor 50\n",
+ "Name: Species, dtype: int64"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "iris[\"Species\"].value_counts()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {
+ "scrolled": true,
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "iris[\"Species\"].value_counts().plot(kind=\"bar\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " PetalLengthCm | \n",
+ "
\n",
+ " \n",
+ " Species | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Iris-setosa | \n",
+ " 1.464 | \n",
+ "
\n",
+ " \n",
+ " Iris-versicolor | \n",
+ " 4.260 | \n",
+ "
\n",
+ " \n",
+ " Iris-virginica | \n",
+ " 5.552 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PetalLengthCm\n",
+ "Species \n",
+ "Iris-setosa 1.464\n",
+ "Iris-versicolor 4.260\n",
+ "Iris-virginica 5.552"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "iris[[\"Species\",\"PetalLengthCm\"]].groupby(\"Species\").mean()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWoAAAFACAYAAACV7zazAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAY+ElEQVR4nO3dfZRU9Z3n8c+nGxQSMG603WPEBFRGI0+NNixCIFHiw4qTmU1iiJKsZ+LT7IYdNpnokTiYE0ej2XjUjJPEIIO46xNO8GnUzGhURs1xeZIGRXQh2kZGFDQZRPAB8Lt/1K22hYa+jV11f9X1fp1Tp+reunXr21TXh1//7u/+riNCAIB0NRRdAABgzwhqAEgcQQ0AiSOoASBxBDUAJI6gBoDE9anETg888MAYPHhwJXYNAL3SsmXLXo+Ips6eq0hQDx48WEuXLq3ErgGgV7L90u6eo+sDABJHUANA4ghqAEhcRfqoO7Nt2zatW7dO77zzTrXeEj2gX79+GjRokPr27Vt0KUDdqlpQr1u3TgMHDtTgwYNlu1pvi48gIvTGG29o3bp1GjJkSNHlAHWral0f77zzjg444ABCuobY1gEHHMBfQUDBqtpHTUjXHj4zoHh1dTCxsbFRzc3NGj58uE4//XRt3bp1t9u2trbqgQce6HKfCxcu1GmnnSZJmjdvnqZPn95j9e6sra1Nt956a/vynt7vrbfe0vnnn6/DDz9cw4YN06RJk7Ro0aKK1QagcqrWR72zwRfd36P7a7tySpfb9O/fX62trZKkadOm6frrr9d3v/vdTrdtbW3V0qVLdeqpp/ZkmR9JOajPPPPMLrc955xzNGTIEK1Zs0YNDQ164YUXtHr16ipUiXrS09/jlOTJlGqpqxZ1RxMnTtTatWu1ZcsWfetb39KYMWM0evRo3XPPPXrvvfd0ySWXaP78+Wpubtb8+fO1ePFijR8/XqNHj9b48eP1/PPP536vm2++WWPHjlVzc7POP/987dixQ5I0YMAAXXzxxRo1apTGjRun1157TZL0u9/9TuPGjdOYMWN0ySWXaMCAAZKkiy66SI8//riam5t1zTXXSJJeeeUVnXLKKRo6dKguvPDC9tcvWrRIl112mRoaSh/xYYcdpilTpqitrU1HHXWUzjnnHA0fPlzTpk3Tb37zG02YMEFDhw7V4sWLe+zfGEDPqMug3r59u379619rxIgRuvzyy3XCCSdoyZIlevTRR3XBBRdo27ZtuvTSSzV16lS1trZq6tSpOuqoo/TYY49p+fLluvTSS/X9738/13utXr1a8+fP129/+1u1traqsbFRt9xyiyRpy5YtGjdunFasWKFJkybphhtukCTNmDFDM2bM0JIlS/SpT32qfV9XXnmlJk6cqNbWVn3nO9+RVGr5z58/X08//bTmz5+vl19+WatWrVJzc7MaGxs7rWnt2rWaMWOGVq5cqeeee0633nqrnnjiCV111VX60Y9+9FH+aQFUQGFdH0V4++231dzcLKnUoj777LM1fvx43XvvvbrqqqsklUan/P73v9/ltZs2bdJZZ52lNWvWyLa2bduW6z0ffvhhLVu2TGPGjGmv4aCDDpIk7bPPPu3928cee6weeughSdKTTz6pu+++W5J05pln6nvf+95u9z958mR94hOfkCQdffTReuml3U4X0G7IkCEaMWKEJGnYsGGaPHmybGvEiBFqa2vL9XMBqJ66CuqOfdRlEaEFCxboyCOP/ND6nQ+8zZo1S8cff7zuuusutbW16Qtf+EKu94wInXXWWbriiit2ea5v377toyoaGxu1ffv2/D9MZt99921/XN7HsGHDtGLFCr3//vvtXR+7e01DQ0P7ckNDw17VAKCy6rLro6OTTz5Z1113ncpXY1++fLkkaeDAgdq8eXP7dps2bdIhhxwiqTTaIq/JkyfrV7/6lTZs2CBJ+sMf/tBlq3fcuHFasGCBJOn2229vX79zTbtz+OGHq6WlRT/4wQ/af641a9bonnvuyV03gHTUfVDPmjVL27Zt08iRIzV8+HDNmjVLknT88cfr2WefbT+YeOGFF2rmzJmaMGFC+8HAzsybN0+DBg1qv+2333667LLLdNJJJ2nkyJE68cQTtX79+j3WdO211+rqq6/W2LFjtX79+vaujZEjR6pPnz4aNWpU+8HE3ZkzZ45effVVHXHEERoxYoTOPffcD/V3A6gdLre4elJLS0vsPB/16tWr9dnPfrbH36s32rp1q/r37y/buv3223XbbbcV2hrms8PuMDyv59heFhEtnT1XV33UtWLZsmWaPn26IkL777+/5s6dW3RJAApEUCdo4sSJWrFiRdFlAEhE3fdRA0DqqhrUlegPR2XxmQHFq1pQ9+vXT2+88QZf/BpSno+6X79+RZcC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\n",
+ "text/plain": [
+ "