diff --git a/Pokemon.ipynb b/Pokemon.ipynb new file mode 100644 index 0000000..23a98ea --- /dev/null +++ b/Pokemon.ipynb @@ -0,0 +1,821 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Pokemon.ipynb", + "private_outputs": true, + "provenance": [], + "collapsed_sections": [], + "mount_file_id": "1yzFEOTOEa1kilB5kT5rNCS1Qrqy_Duzg", + "authorship_tag": "ABX9TyN2V91mlPZB+pXTq3xOGkHv", + "include_colab_link": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + }, + "accelerator": "GPU" + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Tr3UFhRgJdDe" + }, + "source": [ + "!nvidia-smi" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "VasUgK6dUOWc" + }, + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import os\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "import torch.optim as optim\n", + "import torchvision\n", + "\n", + "from torchvision import transforms\n", + "from torch.utils.data import DataLoader\n", + "from torch.utils.data import Dataset\n", + "from torchvision.datasets.folder import pil_loader\n", + "from matplotlib.pyplot import imshow\n", + "from glob import glob\n", + "from PIL import Image\n", + "\n", + "%matplotlib inline" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EBGcZZribFDP" + }, + "source": [ + "## Load Zip File" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "iwHvJUaRTOoH" + }, + "source": [ + "import zipfile\n", + "\n", + "# train.zip\n", + "output_unzip = zipfile.ZipFile('/content/drive/MyDrive/Colab Notebooks/train.zip', 'r')\n", + "output_unzip.extractall('/content/')\n", + "output_unzip.close()\n", + "\n", + "# test.zip\n", + "output_unzip = zipfile.ZipFile('/content/drive/MyDrive/Colab Notebooks/test.zip', 'r')\n", + "output_unzip.extractall('/content/')\n", + "output_unzip.close()" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "R89nDGkdKX6S" + }, + "source": [ + "!unzip '/content/drive/MyDrive/Colab Notebooks/train.zip' -d '/content'" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nw8jPcA6cjcx" + }, + "source": [ + "## Train data" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "nNCIL9VtUkau" + }, + "source": [ + "pokemon = []\n", + "\n", + "for dirname, _, filenames in os.walk('/content/train'):\n", + " pokemon.append(dirname.replace('/content/train/', ''))\n", + "\n", + "pokemon.pop(0)\n", + "pokemon.sort()\n", + "\n", + "# poketmon list\n", + "print(pokemon) \n", + " \n", + "# poketmon length \n", + "print(len(pokemon)) " + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "h44MFI6DdWKs" + }, + "source": [ + "## Test data" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "VSKn5su1DOa0" + }, + "source": [ + "test_pokemon = []\n", + "\n", + "for dirname, _, filenames in os.walk('/content/test/'):\n", + " test_pokemon.append(filenames)\n", + "\n", + "print(test_pokemon)\n", + "print(len(test_pokemon[0]))" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lZQAnIDb36t2" + }, + "source": [ + "## Custom Data" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ZFsVni9xQYEb" + }, + "source": [ + "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + "\n", + "torch.manual_seed(777)\n", + "if device == 'cuda':\n", + " torch.cuda.manual_seed_all(777)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "Wm9ZEbw55NN9" + }, + "source": [ + "class CustomDataset(Dataset):\n", + " def __init__(self, path, transform, data_type = 'train'):\n", + " super(CustomDataset, self).__init__()\n", + " \n", + " self.path = path\n", + " self.transform = transform\n", + " self.data_type = data_type\n", + " self.image_list = self.get_img_list()\n", + "\n", + " def __len__(self):\n", + " return len(self.image_list)\n", + "\n", + " def __getitem__(self, index):\n", + " image = Image.open(self.image_list[index]).convert('RGB')\n", + " image = self.transform(image)\n", + " return image\n", + "\n", + " def get_img_list(self):\n", + " if(self.data_type == 'train'):\n", + " pass\n", + " elif(self.data_type == 'val'):\n", + " pass\n", + " elif(self.data_type == 'test'):\n", + " return glob(self.path + '/*')\n" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "tMY7demdVSd1" + }, + "source": [ + "trans = torchvision.transforms.Compose([\n", + " transforms.Resize((256, 256)),\n", + " transforms.RandomCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),\n", + "])\n", + "\n", + "# Train data\n", + "train_data = torchvision.datasets.ImageFolder(root='/content/train', transform=trans)\n", + "print(len(train_data))\n", + "print(train_data)\n", + "data_loader = DataLoader(dataset=train_data, batch_size=32, shuffle=True, num_workers=2)\n", + "\n", + "trans = torchvision.transforms.Compose([\n", + " transforms.Resize((256, 256)),\n", + " transforms.ToTensor(),\n", + "])\n", + "\n", + "# Test data\n", + "test_data = CustomDataset('/content/test', trans, data_type='test')\n", + "test_set = DataLoader(dataset=test_data, batch_size=1)\n", + "print(len(test_data))" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rPlzn0ypd7U8" + }, + "source": [ + "## VGG_A" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "9MJ8bCqpQSVZ" + }, + "source": [ + "class VGG_A(nn.Module):\n", + " def __init__(self, num_classes: int = 501, init_weights: bool = True):\n", + " super(VGG_A, self).__init__()\n", + " self.convnet = nn.Sequential(\n", + " # Input Channel (RGB: 3)\n", + " nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, padding=1, stride=1),\n", + " nn.ReLU(inplace=True),\n", + " nn.MaxPool2d(kernel_size=2, stride=2), # 224 -> 112\n", + " \n", + " nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding=1, stride=1),\n", + " nn.ReLU(inplace=True),\n", + " nn.MaxPool2d(kernel_size=2, stride=2), # 112 -> 56\n", + " \n", + " nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, padding=1, stride=1),\n", + " nn.ReLU(inplace=True),\n", + " nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, padding=1, stride=1),\n", + " nn.ReLU(inplace=True),\n", + " nn.MaxPool2d(kernel_size=2, stride=2), # 56 -> 28\n", + "\n", + " nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, padding=1, stride=1),\n", + " nn.ReLU(inplace=True),\n", + " nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1, stride=1),\n", + " nn.ReLU(inplace=True),\n", + " nn.MaxPool2d(kernel_size=2, stride=2), # 28 -> 14\n", + "\n", + " nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1, stride=1),\n", + " nn.ReLU(inplace=True),\n", + " nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1, stride=1),\n", + " nn.ReLU(inplace=True),\n", + " nn.MaxPool2d(kernel_size=2, stride=2), # 14 -> 7\n", + " )\n", + "\n", + " self.fclayer = nn.Sequential(\n", + " nn.Linear(512 * 7 * 7, 4096),\n", + " nn.ReLU(inplace=True),\n", + " nn.Dropout(p=0.5),\n", + " nn.Linear(4096, 4096),\n", + " nn.ReLU(inplace=True),\n", + " nn.Dropout(p=0.5),\n", + " nn.Linear(4096, num_classes),\n", + " )\n", + "\n", + " def forward(self, x:torch.Tensor):\n", + " out = self.convnet(x)\n", + " out = torch.flatten(out, 1)\n", + " out = self.fclayer(out)\n", + " return out" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "QZh1KvLEJbfG" + }, + "source": [ + "vgg_a = VGG_A().to(device)\n", + "test_input = (torch.Tensor(8, 3, 256, 256)).to(device)\n", + "test_out = vgg_a(test_input)\n", + "print(test_out.shape)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6ZlrSE38WMRd" + }, + "source": [ + "## RESNET" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "x_Y5UEOg1Bad" + }, + "source": [ + "import torch.nn as nn\n", + "import torch.utils.model_zoo as model_zoo\n", + "\n", + "\n", + "__all__ = ['ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101',\n", + " 'resnet152']\n", + "\n", + "\n", + "model_urls = {\n", + " 'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth',\n", + " 'resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth',\n", + " 'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth',\n", + " 'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth',\n", + " 'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth',\n", + "}" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "1cqZreKq1eCt" + }, + "source": [ + "def conv3x3(in_planes, out_planes, stride=1):\n", + " \"\"\"3x3 convolution with padding\"\"\"\n", + " return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride,\n", + " padding=1, bias=False)\n", + "\n", + "\n", + "def conv1x1(in_planes, out_planes, stride=1):\n", + " \"\"\"1x1 convolution\"\"\"\n", + " return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "bShkD5Li1hBU" + }, + "source": [ + "class BasicBlock(nn.Module):\n", + " expansion = 1\n", + "\n", + " def __init__(self, inplanes, planes, stride=1, downsample=None):\n", + " super(BasicBlock, self).__init__()\n", + " self.conv1 = conv3x3(inplanes, planes, stride)\n", + " self.bn1 = nn.BatchNorm2d(planes)\n", + " self.relu = nn.ReLU(inplace=True)\n", + " self.conv2 = conv3x3(planes, planes)\n", + " self.bn2 = nn.BatchNorm2d(planes)\n", + " self.downsample = downsample\n", + " self.stride = stride\n", + "\n", + " def forward(self, x):\n", + "\n", + " identity = x\n", + "\n", + " out = self.conv1(x) # 3x3 stride = 2\n", + " out = self.bn1(out)\n", + " out = self.relu(out)\n", + "\n", + " out = self.conv2(out) # 3x3 stride = 1\n", + " out = self.bn2(out)\n", + "\n", + " if self.downsample is not None:\n", + " identity = self.downsample(x)\n", + "\n", + " out += identity\n", + " out = self.relu(out)\n", + "\n", + " return out" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "7F6MOKQv1jA6" + }, + "source": [ + "class Bottleneck(nn.Module):\n", + " expansion = 4\n", + "\n", + " def __init__(self, inplanes, planes, stride=1, downsample=None):\n", + " super(Bottleneck, self).__init__()\n", + " self.conv1 = conv1x1(inplanes, planes) #conv1x1(64,64)\n", + " self.bn1 = nn.BatchNorm2d(planes)\n", + " self.conv2 = conv3x3(planes, planes, stride)#conv3x3(64,64)\n", + " self.bn2 = nn.BatchNorm2d(planes)\n", + " self.conv3 = conv1x1(planes, planes * self.expansion) #conv1x1(64,256)\n", + " self.bn3 = nn.BatchNorm2d(planes * self.expansion)\n", + " self.relu = nn.ReLU(inplace=True)\n", + " self.downsample = downsample\n", + " self.stride = stride\n", + "\n", + " def forward(self, x):\n", + " identity = x\n", + "\n", + " out = self.conv1(x) # 1x1 stride = 1\n", + " out = self.bn1(out)\n", + " out = self.relu(out)\n", + "\n", + " out = self.conv2(out) # 3x3 stride = stride \n", + " out = self.bn2(out)\n", + " out = self.relu(out)\n", + "\n", + " out = self.conv3(out) # 1x1 stride = 1\n", + " out = self.bn3(out)\n", + "\n", + " if self.downsample is not None:\n", + " identity = self.downsample(x)\n", + "\n", + " out += identity\n", + " out = self.relu(out)\n", + "\n", + " return out" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "kBL7y4Io1ni-" + }, + "source": [ + "class ResNet(nn.Module):\n", + " # model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs) #resnet 50 \n", + " def __init__(self, block, layers, num_classes=1000, zero_init_residual=False):\n", + " super(ResNet, self).__init__()\n", + " \n", + " self.inplanes = 64\n", + "\n", + " # input [3x256x256]\n", + " self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False)\n", + " \n", + " self.bn1 = nn.BatchNorm2d(64)\n", + " self.relu = nn.ReLU(inplace=True)\n", + " \n", + " self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)\n", + " \n", + " self.layer1 = self._make_layer(block, 64, layers[0]'''3''')\n", + " self.layer2 = self._make_layer(block, 128, layers[1]'''4''', stride=2)\n", + " self.layer3 = self._make_layer(block, 256, layers[2]'''6''', stride=2)\n", + " self.layer4 = self._make_layer(block, 512, layers[3]'''3''', stride=2)\n", + " \n", + " self.avgpool = nn.AdaptiveAvgPool2d((1, 1))\n", + " self.fc = nn.Linear(512 * block.expansion, num_classes)\n", + "\n", + " for m in self.modules():\n", + " if isinstance(m, nn.Conv2d):\n", + " nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')\n", + " elif isinstance(m, nn.BatchNorm2d):\n", + " nn.init.constant_(m.weight, 1)\n", + " nn.init.constant_(m.bias, 0)\n", + "\n", + " # Zero-initialize the last BN in each residual branch,\n", + " # so that the residual branch starts with zeros, and each residual block behaves like an identity.\n", + " # This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677\n", + " if zero_init_residual:\n", + " for m in self.modules():\n", + " if isinstance(m, Bottleneck):\n", + " nn.init.constant_(m.bn3.weight, 0)\n", + " elif isinstance(m, BasicBlock):\n", + " nn.init.constant_(m.bn2.weight, 0)\n", + " \n", + " def _make_layer(self, block, planes, blocks, stride=1):\n", + " \n", + " downsample = None\n", + " \n", + " if stride != 1 or self.inplanes != planes * block.expansion: \n", + " \n", + " downsample = nn.Sequential(\n", + " conv1x1(self.inplanes, planes * block.expansion, stride), #conv1x1(256, 512, 2)\n", + " nn.BatchNorm2d(planes * block.expansion), #batchnrom2d(512)\n", + " )\n", + "\n", + " layers = []\n", + " layers.append(block(self.inplanes, planes, stride, downsample))\n", + " \n", + " self.inplanes = planes * block.expansion #self.inplanes = 128 * 4\n", + " \n", + " for _ in range(1, blocks): \n", + " layers.append(block(self.inplanes, planes)) # * 3\n", + "\n", + " return nn.Sequential(*layers)\n", + " \n", + "\n", + " def forward(self, x):\n", + " x = self.conv1(x)\n", + " x = self.bn1(x)\n", + " x = self.relu(x)\n", + " x = self.maxpool(x)\n", + "\n", + " x = self.layer1(x)\n", + " x = self.layer2(x)\n", + " x = self.layer3(x)\n", + " x = self.layer4(x)\n", + "\n", + " x = self.avgpool(x)\n", + " x = x.view(x.size(0), -1)\n", + " x = self.fc(x)\n", + "\n", + " return x" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "8TjFe5S41oJP" + }, + "source": [ + "def resnet18(pretrained=False, **kwargs):\n", + " model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs) #=> 2*(2+2+2+2) +1(conv1) +1(fc) = 16 +2 =resnet 18\n", + " return model" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "fg7nDNa21qpZ" + }, + "source": [ + "def resnet50(pretrained=False, **kwargs):\n", + " model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs) #=> 3*(3+4+6+3) +(conv1) +1(fc) = 48 +2 = 50\n", + " return model" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "L_MIMljR1r8l" + }, + "source": [ + "def resnet152(pretrained=False, **kwargs):\n", + " model = ResNet(Bottleneck, [3, 8, 36, 3], **kwargs) # 3*(3+8+36+3) +2 = 150+2 = resnet152 \n", + " return mode" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "y6C6macJ1wSE" + }, + "source": [ + "import torchvision.models.resnet as resnet" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "di-WYdYP1xDi" + }, + "source": [ + "res = resnet.resnet50()" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "zPxAHdDe11jM" + }, + "source": [ + "res" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "Sr84UDr-Dl4Y" + }, + "source": [ + "num_classes = 151\n", + "test_input = (torch.Tensor(8, 3, 256, 256)).to(device)\n", + "num_ftrs = res.fc.in_features\n", + "res.fc = nn.Linear(num_ftrs, num_classes)\n", + "res.to(device)\n", + "test_out = res(test_input)\n", + "print(test_out.shape)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DAjhXMHoet1L" + }, + "source": [ + "## Optimizer && Cost Function" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "dSBnC1IlKjap" + }, + "source": [ + "optimizer = optim.Adam(res.parameters(), lr=0.0001)\n", + "loss_func = nn.CrossEntropyLoss().to(device)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pPVsRjr-eyy1" + }, + "source": [ + "## Train 정확도 추가" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "gOsnXGRAK3za" + }, + "source": [ + "pre_accuracy = 0.0\n", + "total_batch = len(data_loader)\n", + "epochs = 30\n", + "\n", + "for epoch in range(epochs):\n", + " avg_cost = 0.0\n", + " for num, data in enumerate(data_loader):\n", + " imgs, labels = data\n", + " imgs = imgs.to(device)\n", + " labels = labels.to(device)\n", + " optimizer.zero_grad()\n", + " out = res(imgs)\n", + " loss = loss_func(out, labels)\n", + " loss.backward()\n", + " optimizer.step()\n", + "\n", + " avg_cost += loss / total_batch\n", + "\n", + " correct_prediction = torch.argmax(out, 1) == labels\n", + " \n", + " accuracy = correct_prediction.float().mean()\n", + "\n", + " if(pre_accuracy < accuracy):\n", + " pre_accuracy = accuracy\n", + " torch.save(res.state_dict(), '/content/drive/MyDrive/Colab Notebooks/train_data/res50.pth')\n", + "\n", + " print('[Epoch:{}] cost = {} accuracy = {}'.format(epoch+1, avg_cost, accuracy))\n", + "\n", + "print('Learning Finished!')" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e1wqqWOlenzL" + }, + "source": [ + "## 저장한 모델 불러오기" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "v3LkEiqRMGVI" + }, + "source": [ + "new_net = VGG_A().to(device)\n", + "new_net.load_state_dict(torch.load('/content/drive/MyDrive/Colab Notebooks/train_data/vgg_a_p05.pth'))" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "db3In36meI3u" + }, + "source": [ + "## Testing" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "HLJ3zjuoNO32" + }, + "source": [ + "l = []\n", + "\n", + "print(len(test_set))\n", + "with torch.no_grad():\n", + " for num, data in enumerate(test_set):\n", + "\n", + " imgs = data\n", + " imgs = imgs.to(device)\n", + " # label = label.to(device)\n", + "\n", + " prediction = vgg_a(imgs)\n", + "\n", + " index = torch.argmax(prediction, 1).tolist()[0]\n", + " l.append([pokemon[index], index])\n", + "\n", + " # correct_prediction = torch.argmax(prediction, 1) == label\n", + " \n", + " # accuracy = correct_prediction.float().mean()\n", + " # print('Accuracy', accuracy.item())" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EkruGWPFeT25" + }, + "source": [ + "## To CSV" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "mAK_VWHIYmov" + }, + "source": [ + "df = pd.DataFrame(l)\n", + "print(df)\n", + "df.to_csv('/content/test.csv', index=False)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "OjcPLRGPegoY" + }, + "source": [ + "from torch.utils.data.sampler import SubsetRandomSampler" + ], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git "a/assignments/yee/02-\355\225\234\354\204\261\355\235\254.ipynb" "b/assignments/yee/02-\355\225\234\354\204\261\355\235\254.ipynb" new file mode 100644 index 0000000..473859b --- /dev/null +++ "b/assignments/yee/02-\355\225\234\354\204\261\355\235\254.ipynb" @@ -0,0 +1,1505 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
TeamTournamentGoalsShots pgyellow_cardsred_cardsPossession%Pass%AerialsWonRating
0Manchester CityPremier League8315.846260.889.412.87.01
1Bayern MunichBundesliga9917.144358.185.512.96.95
2Paris Saint-GermainLigue 18615.073760.189.59.56.88
3BarcelonaLaLiga8515.368262.489.710.66.87
4Real MadridLaLiga6714.457257.787.711.86.86
5Manchester UnitedPremier League7313.864154.584.814.56.85
6JuventusSerie A7715.776655.488.311.46.85
7Aston VillaPremier League5513.763449.178.619.46.84
8Borussia DortmundBundesliga7514.643157.585.512.86.84
9Atletico MadridLaLiga6712.1100051.883.114.46.84
10AtalantaSerie A9016.366353.583.516.86.84
11ChelseaPremier League5814.649358.687.015.26.83
12LiverpoolPremier League6816.040059.085.714.36.82
13AC MilanSerie A7414.780451.484.015.26.82
14LilleLigue 16412.867252.683.515.86.82
15TottenhamPremier League6811.753251.381.816.46.81
16NapoliSerie A8617.071354.187.011.16.81
17LeicesterPremier League6812.861053.282.116.26.80
18WolfsburgBundesliga6114.156351.078.016.96.80
19InterSerie A8914.559252.087.011.86.80
20LyonLigue 18116.1601053.684.714.36.80
21RB LeipzigBundesliga6016.057057.383.218.66.78
22LeedsPremier League6213.761155.180.814.56.77
23West HamPremier League6212.348344.577.819.96.77
24EvertonPremier League4710.559247.381.417.76.73
25Bayer LeverkusenBundesliga5313.058057.384.413.16.73
26Eintracht FrankfurtBundesliga6913.280152.479.617.96.73
27MonacoLigue 17612.874754.282.716.56.73
28RomaSerie A6814.384351.584.512.16.71
29SevillaLaLiga5312.175258.786.216.66.70
.................................
68BolognaSerie A5113.178450.781.515.16.56
69AugsburgBundesliga369.965444.073.616.86.56
70UdineseSerie A4210.963247.282.513.16.55
71SD HuescaLaLiga3410.768248.779.815.76.55
72Athletic BilbaoLaLiga4610.681349.478.517.96.54
73OsasunaLaLiga379.874544.670.226.86.54
74LorientLigue 15011.267345.978.813.76.54
75GenoaSerie A479.085246.179.713.76.54
76Arminia BielefeldBundesliga269.852144.174.622.26.53
77AngersLigue 14010.763247.181.313.26.53
78EibarLaLiga2911.967349.272.624.46.53
79Werder BremenBundesliga3610.663345.276.218.36.52
80FiorentinaSerie A479.886546.881.014.26.52
81NimesLigue 14010.357545.877.514.06.52
82West Bromwich AlbionPremier League358.951441.072.219.16.51
83FC KolnBundesliga3410.662147.177.318.56.51
84Deportivo AlavesLaLiga369.187844.672.922.66.50
85LevanteLaLiga4610.170151.580.112.26.50
86SpeziaSerie A5210.292551.681.114.46.50
87GetafeLaLiga289.5117744.466.522.86.49
88Parma Calcio 1913Serie A3910.491148.482.516.96.49
89ElcheLaLiga347.195348.181.513.26.48
90GranadaLaLiga479.496643.470.018.36.47
91CadizLaLiga368.077338.568.818.56.47
92Real ValladolidLaLiga349.793446.274.817.16.46
93Sheffield UnitedPremier League208.573343.076.919.16.46
94CrotoneSerie A459.585447.280.412.76.43
95BeneventoSerie A4011.090544.277.713.46.43
96DijonLigue 1259.275546.980.014.36.42
97Schalke 04Bundesliga258.970246.276.515.66.41
\n", + "

98 rows × 10 columns

\n", + "
" + ], + "text/plain": [ + " Team Tournament Goals Shots pg yellow_cards \\\n", + "0 Manchester City Premier League 83 15.8 46 \n", + "1 Bayern Munich Bundesliga 99 17.1 44 \n", + "2 Paris Saint-Germain Ligue 1 86 15.0 73 \n", + "3 Barcelona LaLiga 85 15.3 68 \n", + "4 Real Madrid LaLiga 67 14.4 57 \n", + "5 Manchester United Premier League 73 13.8 64 \n", + "6 Juventus Serie A 77 15.7 76 \n", + "7 Aston Villa Premier League 55 13.7 63 \n", + "8 Borussia Dortmund Bundesliga 75 14.6 43 \n", + "9 Atletico Madrid LaLiga 67 12.1 100 \n", + "10 Atalanta Serie A 90 16.3 66 \n", + "11 Chelsea Premier League 58 14.6 49 \n", + "12 Liverpool Premier League 68 16.0 40 \n", + "13 AC Milan Serie A 74 14.7 80 \n", + "14 Lille Ligue 1 64 12.8 67 \n", + "15 Tottenham Premier League 68 11.7 53 \n", + "16 Napoli Serie A 86 17.0 71 \n", + "17 Leicester Premier League 68 12.8 61 \n", + "18 Wolfsburg Bundesliga 61 14.1 56 \n", + "19 Inter Serie A 89 14.5 59 \n", + "20 Lyon Ligue 1 81 16.1 60 \n", + "21 RB Leipzig Bundesliga 60 16.0 57 \n", + "22 Leeds Premier League 62 13.7 61 \n", + "23 West Ham Premier League 62 12.3 48 \n", + "24 Everton Premier League 47 10.5 59 \n", + "25 Bayer Leverkusen Bundesliga 53 13.0 58 \n", + "26 Eintracht Frankfurt Bundesliga 69 13.2 80 \n", + "27 Monaco Ligue 1 76 12.8 74 \n", + "28 Roma Serie A 68 14.3 84 \n", + "29 Sevilla LaLiga 53 12.1 75 \n", + ".. ... ... ... ... ... \n", + "68 Bologna Serie A 51 13.1 78 \n", + "69 Augsburg Bundesliga 36 9.9 65 \n", + "70 Udinese Serie A 42 10.9 63 \n", + "71 SD Huesca LaLiga 34 10.7 68 \n", + "72 Athletic Bilbao LaLiga 46 10.6 81 \n", + "73 Osasuna LaLiga 37 9.8 74 \n", + "74 Lorient Ligue 1 50 11.2 67 \n", + "75 Genoa Serie A 47 9.0 85 \n", + "76 Arminia Bielefeld Bundesliga 26 9.8 52 \n", + "77 Angers Ligue 1 40 10.7 63 \n", + "78 Eibar LaLiga 29 11.9 67 \n", + "79 Werder Bremen Bundesliga 36 10.6 63 \n", + "80 Fiorentina Serie A 47 9.8 86 \n", + "81 Nimes Ligue 1 40 10.3 57 \n", + "82 West Bromwich Albion Premier League 35 8.9 51 \n", + "83 FC Koln Bundesliga 34 10.6 62 \n", + "84 Deportivo Alaves LaLiga 36 9.1 87 \n", + "85 Levante LaLiga 46 10.1 70 \n", + "86 Spezia Serie A 52 10.2 92 \n", + "87 Getafe LaLiga 28 9.5 117 \n", + "88 Parma Calcio 1913 Serie A 39 10.4 91 \n", + "89 Elche LaLiga 34 7.1 95 \n", + "90 Granada LaLiga 47 9.4 96 \n", + "91 Cadiz LaLiga 36 8.0 77 \n", + "92 Real Valladolid LaLiga 34 9.7 93 \n", + "93 Sheffield United Premier League 20 8.5 73 \n", + "94 Crotone Serie A 45 9.5 85 \n", + "95 Benevento Serie A 40 11.0 90 \n", + "96 Dijon Ligue 1 25 9.2 75 \n", + "97 Schalke 04 Bundesliga 25 8.9 70 \n", + "\n", + " red_cards Possession% Pass% AerialsWon Rating \n", + "0 2 60.8 89.4 12.8 7.01 \n", + "1 3 58.1 85.5 12.9 6.95 \n", + "2 7 60.1 89.5 9.5 6.88 \n", + "3 2 62.4 89.7 10.6 6.87 \n", + "4 2 57.7 87.7 11.8 6.86 \n", + "5 1 54.5 84.8 14.5 6.85 \n", + "6 6 55.4 88.3 11.4 6.85 \n", + "7 4 49.1 78.6 19.4 6.84 \n", + "8 1 57.5 85.5 12.8 6.84 \n", + "9 0 51.8 83.1 14.4 6.84 \n", + "10 3 53.5 83.5 16.8 6.84 \n", + "11 3 58.6 87.0 15.2 6.83 \n", + "12 0 59.0 85.7 14.3 6.82 \n", + "13 4 51.4 84.0 15.2 6.82 \n", + "14 2 52.6 83.5 15.8 6.82 \n", + "15 2 51.3 81.8 16.4 6.81 \n", + "16 3 54.1 87.0 11.1 6.81 \n", + "17 0 53.2 82.1 16.2 6.80 \n", + "18 3 51.0 78.0 16.9 6.80 \n", + "19 2 52.0 87.0 11.8 6.80 \n", + "20 10 53.6 84.7 14.3 6.80 \n", + "21 0 57.3 83.2 18.6 6.78 \n", + "22 1 55.1 80.8 14.5 6.77 \n", + "23 3 44.5 77.8 19.9 6.77 \n", + "24 2 47.3 81.4 17.7 6.73 \n", + "25 0 57.3 84.4 13.1 6.73 \n", + "26 1 52.4 79.6 17.9 6.73 \n", + "27 7 54.2 82.7 16.5 6.73 \n", + "28 3 51.5 84.5 12.1 6.71 \n", + "29 2 58.7 86.2 16.6 6.70 \n", + ".. ... ... ... ... ... \n", + "68 4 50.7 81.5 15.1 6.56 \n", + "69 4 44.0 73.6 16.8 6.56 \n", + "70 2 47.2 82.5 13.1 6.55 \n", + "71 2 48.7 79.8 15.7 6.55 \n", + "72 3 49.4 78.5 17.9 6.54 \n", + "73 5 44.6 70.2 26.8 6.54 \n", + "74 3 45.9 78.8 13.7 6.54 \n", + "75 2 46.1 79.7 13.7 6.54 \n", + "76 1 44.1 74.6 22.2 6.53 \n", + "77 2 47.1 81.3 13.2 6.53 \n", + "78 3 49.2 72.6 24.4 6.53 \n", + "79 3 45.2 76.2 18.3 6.52 \n", + "80 5 46.8 81.0 14.2 6.52 \n", + "81 5 45.8 77.5 14.0 6.52 \n", + "82 4 41.0 72.2 19.1 6.51 \n", + "83 1 47.1 77.3 18.5 6.51 \n", + "84 8 44.6 72.9 22.6 6.50 \n", + "85 1 51.5 80.1 12.2 6.50 \n", + "86 5 51.6 81.1 14.4 6.50 \n", + "87 7 44.4 66.5 22.8 6.49 \n", + "88 1 48.4 82.5 16.9 6.49 \n", + "89 3 48.1 81.5 13.2 6.48 \n", + "90 6 43.4 70.0 18.3 6.47 \n", + "91 3 38.5 68.8 18.5 6.47 \n", + "92 4 46.2 74.8 17.1 6.46 \n", + "93 3 43.0 76.9 19.1 6.46 \n", + "94 4 47.2 80.4 12.7 6.43 \n", + "95 5 44.2 77.7 13.4 6.43 \n", + "96 5 46.9 80.0 14.3 6.42 \n", + "97 2 46.2 76.5 15.6 6.41 \n", + "\n", + "[98 rows x 10 columns]" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "df = pd.read_csv('./Football teams.csv')\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "각 Column의 정보는 다음 링크에 있는 것과 같습니다.\n", + "\n", + "https://www.kaggle.com/varpit94/football-teams-rankings-stats\n", + "\n", + "## Assignments 1\n", + "패스 성공률이 높은 상위 5개의 팀을 추출 해 보세요\n", + "(hint: sort_values, head)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
TeamTournamentGoalsShots pgyellow_cardsred_cardsPossession%Pass%AerialsWonRating
3BarcelonaLaLiga8515.368262.489.710.66.87
2Paris Saint-GermainLigue 18615.073760.189.59.56.88
0Manchester CityPremier League8315.846260.889.412.87.01
6JuventusSerie A7715.776655.488.311.46.85
35SassuoloSerie A6413.974458.287.810.96.67
\n", + "
" + ], + "text/plain": [ + " Team Tournament Goals Shots pg yellow_cards \\\n", + "3 Barcelona LaLiga 85 15.3 68 \n", + "2 Paris Saint-Germain Ligue 1 86 15.0 73 \n", + "0 Manchester City Premier League 83 15.8 46 \n", + "6 Juventus Serie A 77 15.7 76 \n", + "35 Sassuolo Serie A 64 13.9 74 \n", + "\n", + " red_cards Possession% Pass% AerialsWon Rating \n", + "3 2 62.4 89.7 10.6 6.87 \n", + "2 7 60.1 89.5 9.5 6.88 \n", + "0 2 60.8 89.4 12.8 7.01 \n", + "6 6 55.4 88.3 11.4 6.85 \n", + "35 4 58.2 87.8 10.9 6.67 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A1 = df.sort_values('Pass%',ascending = False).head()\n", + "A1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Assignments 2\n", + "모든 팀 중에서 점유율이 60% 이상인 팀을 추출 하세요" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
TeamTournamentGoalsShots pgyellow_cardsred_cardsPossession%Pass%AerialsWonRating
0Manchester CityPremier League8315.846260.889.412.87.01
2Paris Saint-GermainLigue 18615.073760.189.59.56.88
3BarcelonaLaLiga8515.368262.489.710.66.87
\n", + "
" + ], + "text/plain": [ + " Team Tournament Goals Shots pg yellow_cards \\\n", + "0 Manchester City Premier League 83 15.8 46 \n", + "2 Paris Saint-Germain Ligue 1 86 15.0 73 \n", + "3 Barcelona LaLiga 85 15.3 68 \n", + "\n", + " red_cards Possession% Pass% AerialsWon Rating \n", + "0 2 60.8 89.4 12.8 7.01 \n", + "2 7 60.1 89.5 9.5 6.88 \n", + "3 2 62.4 89.7 10.6 6.87 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A2 = df[df['Possession%']>=60]\n", + "A2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Assignments 3\n", + "5대 리그 중, 제일 과격 한 리그는 무엇일까요? 일단 Yellow Card 갯수 순서로 리그를 정렬 해 주고, 거기서 yellow_cards와 red_cards 수로 정렬 해 주세요!\n", + "(hint: groupby, sum, loc)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yellow_cardsred_cards
Tournament
LaLiga163975
Serie A159769
Ligue 11419102
Premier League109548
Bundesliga108133
\n", + "
" + ], + "text/plain": [ + " yellow_cards red_cards\n", + "Tournament \n", + "LaLiga 1639 75\n", + "Serie A 1597 69\n", + "Ligue 1 1419 102\n", + "Premier League 1095 48\n", + "Bundesliga 1081 33" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A3 = df.groupby(df['Tournament']).sum().sort_values(['yellow_cards','red_cards'],ascending= False)\n", + "A3 = A3.loc[:,['yellow_cards','red_cards']]\n", + "A3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Assignments 4\n", + "\n", + "생각해 보니 레드 카드도 감안을 해야 할 것 같습니다. 레드 카드 5점, 옐로우 카드 2점으로 점수를 산정 하여, 해당 점수를 바탕으로 정렬해서, 진짜 과격한 리그가 어느 리그인지 알아 보도록 해봐요!\n", + "\n", + "아 맞다, df['A'] = df['B'] * 5 + df['C'] * 2\n", + "\n", + "이런 식으로 새로운 Column을 만들면 되지 않을까요?" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yellow_cardsred_cardsscore
Tournament
LaLiga1639753653
Serie A1597693539
Ligue 114191023348
Premier League1095482430
Bundesliga1081332327
\n", + "
" + ], + "text/plain": [ + " yellow_cards red_cards score\n", + "Tournament \n", + "LaLiga 1639 75 3653\n", + "Serie A 1597 69 3539\n", + "Ligue 1 1419 102 3348\n", + "Premier League 1095 48 2430\n", + "Bundesliga 1081 33 2327" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A4 = A3\n", + "A4['score'] = A4['red_cards']*5 +A4['yellow_cards']*2\n", + "A4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Assignments 5\n", + "흠.. 근데 패스 성공률과 점유율의 상관관계에 대해서 알아보고 싶은데.. 선형 적인 면에서 이를 알 수 있을까요? numpy를 이용해서 covariance matrix를 통해서 알아 보면 될 것 같은데...\n", + "\n", + "hint: to_numpy, T, cov" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[21.99771618, 19.52841995],\n", + " [19.52841995, 23.91276667]])" + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A5 = df[['Pass%','Possession%']].to_numpy().T\n", + "\n", + "np.cov(A5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git "a/assignments/yee/03-\355\225\234\354\204\261\355\235\254.ipynb" "b/assignments/yee/03-\355\225\234\354\204\261\355\235\254.ipynb" new file mode 100644 index 0000000..e048a4f --- /dev/null +++ "b/assignments/yee/03-\355\225\234\354\204\261\355\235\254.ipynb" @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.8.5"},"colab":{"name":"03-한성희.ipynb","provenance":[],"collapsed_sections":[]}},"cells":[{"cell_type":"code","metadata":{"id":"ngGUnwGcb1tX","executionInfo":{"status":"ok","timestamp":1626007513570,"user_tz":-540,"elapsed":254,"user":{"displayName":"‍한성희[학생](소프트웨어융합대학 컴퓨터공학과)","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GgG6VMZOZyc2tLOjucvJGO7juNpAFWsB4PnwRPC=s64","userId":"13300250952191745553"}}},"source":["import numpy as np\n","import pandas as pd\n","import matplotlib.pyplot as plt"],"execution_count":2,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":745},"id":"_BiiSi4wb1tY","executionInfo":{"status":"ok","timestamp":1626007546779,"user_tz":-540,"elapsed":262,"user":{"displayName":"‍한성희[학생](소프트웨어융합대학 컴퓨터공학과)","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GgG6VMZOZyc2tLOjucvJGO7juNpAFWsB4PnwRPC=s64","userId":"13300250952191745553"}},"outputId":"697c549d-8e69-4473-9179-554d00381910"},"source":["df = pd.read_csv('./world-happiness-report-2021.csv')\n","df.sort_values(by=\"Ladder score\", ascending=False)"],"execution_count":4,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
Country nameRegional indicatorLadder scoreStandard error of ladder scoreupperwhiskerlowerwhiskerLogged GDP per capitaSocial supportHealthy life expectancyFreedom to make life choicesGenerosityPerceptions of corruptionLadder score in DystopiaExplained by: Log GDP per capitaExplained by: Social supportExplained by: Healthy life expectancyExplained by: Freedom to make life choicesExplained by: GenerosityExplained by: Perceptions of corruptionDystopia + residual
0FinlandWestern Europe7.8420.0327.9047.78010.7750.95472.0000.949-0.0980.1862.431.4461.1060.7410.6910.1240.4813.253
1DenmarkWestern Europe7.6200.0357.6877.55210.9330.95472.7000.9460.0300.1792.431.5021.1080.7630.6860.2080.4852.868
2SwitzerlandWestern Europe7.5710.0367.6437.50011.1170.94274.4000.9190.0250.2922.431.5661.0790.8160.6530.2040.4132.839
3IcelandWestern Europe7.5540.0597.6707.43810.8780.98373.0000.9550.1600.6732.431.4821.1720.7720.6980.2930.1702.967
4NetherlandsWestern Europe7.4640.0277.5187.41010.9320.94272.4000.9130.1750.3382.431.5011.0790.7530.6470.3020.3842.798
...............................................................
144LesothoSub-Saharan Africa3.5120.1203.7483.2767.9260.78748.7000.715-0.1310.9152.430.4510.7310.0070.4050.1030.0151.800
145BotswanaSub-Saharan Africa3.4670.0743.6113.3229.7820.78459.2690.824-0.2460.8012.431.0990.7240.3400.5390.0270.0880.648
146RwandaSub-Saharan Africa3.4150.0683.5483.2827.6760.55261.4000.8970.0610.1672.430.3640.2020.4070.6270.2270.4931.095
147ZimbabweSub-Saharan Africa3.1450.0583.2593.0307.9430.75056.2010.677-0.0470.8212.430.4570.6490.2430.3590.1570.0751.205
148AfghanistanSouth Asia2.5230.0382.5962.4497.6950.46352.4930.382-0.1020.9242.430.3700.0000.1260.0000.1220.0101.895
\n","

149 rows × 20 columns

\n","
"],"text/plain":[" Country name ... Dystopia + residual\n","0 Finland ... 3.253\n","1 Denmark ... 2.868\n","2 Switzerland ... 2.839\n","3 Iceland ... 2.967\n","4 Netherlands ... 2.798\n",".. ... ... ...\n","144 Lesotho ... 1.800\n","145 Botswana ... 0.648\n","146 Rwanda ... 1.095\n","147 Zimbabwe ... 1.205\n","148 Afghanistan ... 1.895\n","\n","[149 rows x 20 columns]"]},"metadata":{"tags":[]},"execution_count":4}]},{"cell_type":"markdown","metadata":{"id":"a893QiJlb1tZ"},"source":["## Assignment 1\n","행복 지수를 1점 간격으로 두고 다음과 같은 **Histogram**을 작성 해 주세요.\n","행복 지수의 키 값은 \"Ladder score\" 입니다."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":295},"id":"cZPrHFLqcrwi","executionInfo":{"status":"ok","timestamp":1626011383212,"user_tz":-540,"elapsed":254,"user":{"displayName":"‍한성희[학생](소프트웨어융합대학 컴퓨터공학과)","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GgG6VMZOZyc2tLOjucvJGO7juNpAFWsB4PnwRPC=s64","userId":"13300250952191745553"}},"outputId":"d5d20eb5-38a4-4bf0-fceb-5fe451a29795"},"source":["plt.hist(df.loc[:, \"Ladder score\"].astype(int), width=1.5)\n","plt.xlabel(\"score\")\n","plt.ylabel(\"count\")\n","plt.ylim(0, 50)\n","plt.xlim(0, 9)\n","plt.title(\"Happiniess Score\")\n","plt.show()"],"execution_count":81,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"fbq0GMuhb1ta"},"source":["## Assignment 2\n","행복 지수를 y축으로, GDP를 x축으로 하여, scatter 한 값을 한 번 입력 해 보세요."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":297},"id":"CW2vfQbBfn45","executionInfo":{"status":"ok","timestamp":1626007556439,"user_tz":-540,"elapsed":279,"user":{"displayName":"‍한성희[학생](소프트웨어융합대학 컴퓨터공학과)","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GgG6VMZOZyc2tLOjucvJGO7juNpAFWsB4PnwRPC=s64","userId":"13300250952191745553"}},"outputId":"7d0867f7-507a-4c69-98be-2c04adb59e3d"},"source":["x = df.loc[:, \"Explained by: Log GDP per capita\"]\n","y = df.loc[:, \"Ladder score\"]\n","\n","fig, ax = plt.subplots()\n","ax.scatter(x, y, c='green')\n","\n","ax.set_xlabel(\"GDP\")\n","ax.set_ylabel(\"score\")\n","ax.set_title(\"Happiniess Score per GDP\", fontsize = 15)\n","\n","plt.show()"],"execution_count":5,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"LHmSd2uEb1tb"},"source":["## Assignment 3\n","행복지수 상위 10개, 하위 10개를 선택 후, 각각의 Social support, Logged GDP per capita, Freedom to make life choices 의 평균을 구해서 막대 그래프로 나타내세요."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":268},"id":"yBbIlXQYp9H_","executionInfo":{"status":"ok","timestamp":1626009501154,"user_tz":-540,"elapsed":362,"user":{"displayName":"‍한성희[학생](소프트웨어융합대학 컴퓨터공학과)","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GgG6VMZOZyc2tLOjucvJGO7juNpAFWsB4PnwRPC=s64","userId":"13300250952191745553"}},"outputId":"768b6d49-c76d-475b-8816-0ba147205c5b"},"source":["high = df.loc[0:10, [\"Social support\", \"Logged GDP per capita\", \"Freedom to make life choices\"]]\n","low = df.loc[139:150, [\"Social support\", \"Logged GDP per capita\", \"Freedom to make life choices\"]]\n","high_low = pd.concat([high.mean(), low.mean()], axis = 1)\n","high_low.index = [\"Social\", \"GDP\", \"Freedom\"]\n","high_low.columns = [\"Happy\", \"Unhappy\"]\n","# print(high_low)\n","high_low.plot(kind='bar')\n","plt.xticks(rotation=0, fontsize=13)\n","plt.show()"],"execution_count":34,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"tags":[],"needs_background":"light"}}]}]} \ No newline at end of file diff --git "a/assignments/yee/04~08-\355\225\234\354\204\261\355\235\254.ipynb" "b/assignments/yee/04~08-\355\225\234\354\204\261\355\235\254.ipynb" new file mode 100644 index 0000000..2902ffa --- /dev/null +++ "b/assignments/yee/04~08-\355\225\234\354\204\261\355\235\254.ipynb" @@ -0,0 +1,2098 @@ +{ + "nbformat": 4, + "nbformat_minor": 5, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + }, + "colab": { + "name": "04~08_한성희.ipynb", + "provenance": [], + "collapsed_sections": [], + "include_colab_link": true + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "353b656363784babbdf7168e04d42bff": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_415a79dfcb4345efa71140beef8569d3", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_5c2fd5b155c349fdadf41ae6d76345bd", + "IPY_MODEL_6e49b7dfdd9b4912af67559f4e81e893" + ] + } + }, + "415a79dfcb4345efa71140beef8569d3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "5c2fd5b155c349fdadf41ae6d76345bd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_2bc865967b6746df9bd6b96869fe8a7d", + "_dom_classes": [], + "description": "", + "_model_name": "FloatProgressModel", + "bar_style": "success", + "max": 9912422, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 9912422, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_c77f9aa07f964781b4ade618f1bf91af" + } + }, + "6e49b7dfdd9b4912af67559f4e81e893": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_4b4da85d3901491790f6edc3d605fada", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 9913344/? [00:01<00:00, 6040097.53it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_d58fe7daecbc45bc8e4456abd8b08190" + } + }, + "2bc865967b6746df9bd6b96869fe8a7d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "c77f9aa07f964781b4ade618f1bf91af": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "4b4da85d3901491790f6edc3d605fada": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "d58fe7daecbc45bc8e4456abd8b08190": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "b6fee77315d64e3685d852ed13de847a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_b8695ee9d7a84789928dbbaa1be648e9", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_b711607275f84ef2a346709924334a94", + "IPY_MODEL_d254a8bf17bc4b58bc1cce7d0d6c5cd6" + ] + } + }, + "b8695ee9d7a84789928dbbaa1be648e9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "b711607275f84ef2a346709924334a94": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_266e60d353a04d20930335636178002e", + "_dom_classes": [], + "description": "", + "_model_name": "FloatProgressModel", + "bar_style": "success", + "max": 28881, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 28881, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_1a020ad5b06c476bb610f8264a44b1cb" + } + }, + "d254a8bf17bc4b58bc1cce7d0d6c5cd6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_0856acaf57df4c1a8663818c38846823", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 29696/? [00:00<00:00, 125513.48it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_329c5e3c31224258a65db70112b2f01a" + } + }, + "266e60d353a04d20930335636178002e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "1a020ad5b06c476bb610f8264a44b1cb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "0856acaf57df4c1a8663818c38846823": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "329c5e3c31224258a65db70112b2f01a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "e39a2751cb6c448c892fa8a79cba61d2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_adba00ef2ed444fc920139b2284a9d4f", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_b89bfedfa17a4c3aa56ed3799b491214", + "IPY_MODEL_ecead8ba38fb45cf966ad62c5de586e3" + ] + } + }, + "adba00ef2ed444fc920139b2284a9d4f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "b89bfedfa17a4c3aa56ed3799b491214": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_4036bbbcf5784fd5830354b29697b392", + "_dom_classes": [], + "description": "", + "_model_name": "FloatProgressModel", + "bar_style": "success", + "max": 1648877, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1648877, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_b5f84e8ae3814a5c84ddc0a1e04123ef" + } + }, + "ecead8ba38fb45cf966ad62c5de586e3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_03be632840a648e0a888c593af753b13", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 1649664/? [00:00<00:00, 2532944.87it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_dee451e4b91f40c89da109a8da5afdc4" + } + }, + "4036bbbcf5784fd5830354b29697b392": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "b5f84e8ae3814a5c84ddc0a1e04123ef": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "03be632840a648e0a888c593af753b13": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "dee451e4b91f40c89da109a8da5afdc4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "6ff8109d675549a6a82ee85bfe917e93": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_3e6af450a20c4758a987f642d31d5abc", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_5f138a42b92b4306b27de5e47c9eec71", + "IPY_MODEL_82560e863134419ea716e30ea45074b8" + ] + } + }, + "3e6af450a20c4758a987f642d31d5abc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "5f138a42b92b4306b27de5e47c9eec71": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_e231c7c71c4841cb8763d350b2eb78af", + "_dom_classes": [], + "description": "", + "_model_name": "FloatProgressModel", + "bar_style": "success", + "max": 4542, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 4542, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_31cce35321144cfab62513f30c76aac1" + } + }, + "82560e863134419ea716e30ea45074b8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_86e3118ad52f4c68bc4324879a14a2fd", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 5120/? [00:00<00:00, 20797.70it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_65b013d3b29e47118febf6f095c66a57" + } + }, + "e231c7c71c4841cb8763d350b2eb78af": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "31cce35321144cfab62513f30c76aac1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "86e3118ad52f4c68bc4324879a14a2fd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "65b013d3b29e47118febf6f095c66a57": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + } + } + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fb78f666" + }, + "source": [ + "## Module Import" + ], + "id": "fb78f666" + }, + { + "cell_type": "code", + "metadata": { + "id": "570828be" + }, + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import sklearn" + ], + "id": "570828be", + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5353befe" + }, + "source": [ + "## Assignment 1.\n", + "우리는 붓꽃의 **꽃받침의 길이, 꽃받침의 너비, 꽃잎의 길이, 꽃잎의 너비**를 통해서, **꽃의 종류**를 구분 해 볼 것입니다. **Input**으로 주어 지는 데이터는 다음과 같습니다.\n", + "\n", + "- Sepal Length: 꽃받침의 길이 정보이다.\n", + "- Sepal Width: 꽃받침의 너비 정보이다.\n", + "- Petal Length: 꽃잎의 길이 정보이다.\n", + "- Petal Width: 꽃잎의 너비 정보이다.\n", + "- Species: 꽃의 종류 정보이다. **setosa / versicolor / virginica** 의 3종류로 구분된다." + ], + "id": "5353befe" + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "a3b18df3", + "outputId": "573b1f9d-a895-42b9-b786-45b13b9816ba" + }, + "source": [ + "from sklearn.datasets import load_iris\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "data = load_iris()\n", + "X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.33, random_state=42, shuffle=True)\n", + "\n", + "print(\"X_train의 shape:\", X_train.shape)\n", + "print(\"X_test의 shape:\", X_test.shape)\n", + "print(\"y_train의 shape:\", y_train.shape)\n", + "print(\"y_test의 shape:\", y_test.shape)" + ], + "id": "a3b18df3", + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "text": [ + "X_train의 shape: (100, 4)\n", + "X_test의 shape: (50, 4)\n", + "y_train의 shape: (100,)\n", + "y_test의 shape: (50,)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9b53defd" + }, + "source": [ + "### 1-1. Data Normalization\n", + "첫 번째로, 데이터를 정규화 하는 것이 중요 할 것 같습니다. 데이터를 정규화 해 보세요.\n", + "\n", + "(Min - Max 정규화를 이용하면 될 것 같죠? hint: ndarray.min(), ndarray.max())" + ], + "id": "9b53defd" + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "25ebc396", + "outputId": "6c3d868b-8241-4181-a4c9-1b85133250f2" + }, + "source": [ + "X_train = (X_train - X_train.min()) / (X_train.max() - X_train.min())\n", + "X_test = (X_test - X_test.min()) / (X_test.max() - X_test.min())\n", + "print(X_train[:10])" + ], + "id": "25ebc396", + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[[0.73684211 0.36842105 0.53947368 0.15789474]\n", + " [0.98684211 0.38157895 0.85526316 0.26315789]\n", + " [0.72368421 0.38157895 0.57894737 0.18421053]\n", + " [0.65789474 0.44736842 0.17105263 0.01315789]\n", + " [1. 0.35526316 0.86842105 0.25 ]\n", + " [0.75 0.34210526 0.52631579 0.11842105]\n", + " [0.67105263 0.43421053 0.17105263 0.01315789]\n", + " [0.64473684 0.44736842 0.15789474 0.02631579]\n", + " [0.65789474 0.48684211 0.23684211 0.03947368]\n", + " [0.64473684 0.25 0.44736842 0.11842105]]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fd97af39" + }, + "source": [ + "## 1-2. Data Training\n", + "그 다음으로는 이제 데이터를 학습 시킬 시간입니다! SVM 모듈을 import 한 후, 학습을 시켜 보도록 하겠습니다." + ], + "id": "fd97af39" + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9c989b42", + "outputId": "a4d500a3-c238-429a-9a63-5d4b56555600" + }, + "source": [ + "from sklearn.svm import SVC\n", + "\n", + "svm = SVC(C=2)\n", + "# \n", + "svm.fit(X_train, y_train)\n", + "accuracy = (sum(svm.predict(X_test) == y_test) / 50) * 100\n", + "print(f'정확도 (accuracy): {accuracy}%')" + ], + "id": "9c989b42", + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "text": [ + "정확도 (accuracy): 100.0%\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "162aa7df" + }, + "source": [ + "## Assignment 2.\n", + "다음은 **MNIST 데이터**에 대해 분류를 해보는 연습을 해 보겠습니다. **MNIST**는 손글씨 데이터로, **Input Data**는 [28 x 28]의 데이터로 이루어져 있습니다. 일단, 우리가 이를 학습 시키기 전에 한번 데이터를 확인 해 볼까요?\n", + "\n", + "이 예제는 DNN을 이용하기 때문에, **Pytorch**로 진행 하겠습니다. 실습은 **Hyperparameter**만 고치면 됩니다.\n", + "\n", + "**학습률 95%에 도전 해 보세요!**" + ], + "id": "162aa7df" + }, + { + "cell_type": "code", + "metadata": { + "id": "09585b1f" + }, + "source": [ + "import time\n", + "import random\n", + "import torch\n", + "import torch.nn as nn\n", + "from torchvision.datasets import MNIST\n", + "from torchvision import transforms\n", + "from torch.utils.data import DataLoader\n", + "import torch.nn.functional as F" + ], + "id": "09585b1f", + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "52693fc8", + "outputId": "b42ae19d-2723-4c82-d946-81542b637eb3" + }, + "source": [ + "# 이 부분은 절대 변경하지 마세요.\n", + "\n", + "RANDOM_SEED = 123\n", + "DEVICE = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')\n", + "\n", + "random.seed(RANDOM_SEED)\n", + "torch.manual_seed(RANDOM_SEED)" + ], + "id": "52693fc8", + "execution_count": 6, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 6 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "c795ae90" + }, + "source": [ + "## 2-0. Data Load\n", + "데이터를 불러와 보겠습니다. `transforms.Compose`를 이용하여, 데이터를 pytorch에서 사용하는 **Tensor**형으로 바꾸고, 이를 **Gaussian Distribution**으로 정규화합니다." + ], + "id": "c795ae90" + }, + { + "cell_type": "code", + "metadata": { + "id": "6b9bbb9f" + }, + "source": [ + "# 수정 가능한 셀입니다.\n", + "BATCH_SIZE = 64 # 60000을 사용하면, Full-Batch 학습을 진행 합니다." + ], + "id": "6b9bbb9f", + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "d1eb9987" + }, + "source": [ + "# Don't Touch!\n", + "custom_train_transform = transforms.Compose([ \n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=(0.5,), std=(0.5,))\n", + "])\n", + "\n", + "custom_test_transform = transforms.Compose([\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=(0.5,), std=(0.5,))\n", + "])" + ], + "id": "d1eb9987", + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "946bb0ec" + }, + "source": [ + "`MNIST`를 이용하여 **MNIST** 데이터를 불러 오고, 이를 transform 해 줍니다. 또한, `DataLoader`를 이용하여, 셔플을 해준 후, 미니 배치를 생성 합니다." + ], + "id": "946bb0ec" + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 845, + "referenced_widgets": [ + "353b656363784babbdf7168e04d42bff", + "415a79dfcb4345efa71140beef8569d3", + "5c2fd5b155c349fdadf41ae6d76345bd", + "6e49b7dfdd9b4912af67559f4e81e893", + "2bc865967b6746df9bd6b96869fe8a7d", + "c77f9aa07f964781b4ade618f1bf91af", + "4b4da85d3901491790f6edc3d605fada", + "d58fe7daecbc45bc8e4456abd8b08190", + "b6fee77315d64e3685d852ed13de847a", + "b8695ee9d7a84789928dbbaa1be648e9", + "b711607275f84ef2a346709924334a94", + "d254a8bf17bc4b58bc1cce7d0d6c5cd6", + "266e60d353a04d20930335636178002e", + "1a020ad5b06c476bb610f8264a44b1cb", + "0856acaf57df4c1a8663818c38846823", + "329c5e3c31224258a65db70112b2f01a", + "e39a2751cb6c448c892fa8a79cba61d2", + "adba00ef2ed444fc920139b2284a9d4f", + "b89bfedfa17a4c3aa56ed3799b491214", + "ecead8ba38fb45cf966ad62c5de586e3", + "4036bbbcf5784fd5830354b29697b392", + "b5f84e8ae3814a5c84ddc0a1e04123ef", + "03be632840a648e0a888c593af753b13", + "dee451e4b91f40c89da109a8da5afdc4", + "6ff8109d675549a6a82ee85bfe917e93", + "3e6af450a20c4758a987f642d31d5abc", + "5f138a42b92b4306b27de5e47c9eec71", + "82560e863134419ea716e30ea45074b8", + "e231c7c71c4841cb8763d350b2eb78af", + "31cce35321144cfab62513f30c76aac1", + "86e3118ad52f4c68bc4324879a14a2fd", + "65b013d3b29e47118febf6f095c66a57" + ] + }, + "id": "c0b80568", + "outputId": "86915fac-eb04-4b0e-e512-7b772fab2eee" + }, + "source": [ + "train_dataset = MNIST(\".\", train=True, download=True, transform=custom_train_transform)\n", + "\n", + "train_loader = DataLoader(dataset=train_dataset,\n", + " batch_size=BATCH_SIZE,\n", + " shuffle=True,\n", + " drop_last=True,\n", + " num_workers=2)\n", + "\n", + "\n", + "test_dataset = MNIST(\".\", train=False, download=True, transform=custom_test_transform)\n", + "\n", + "test_loader = DataLoader(dataset=test_dataset,\n", + " batch_size=BATCH_SIZE,\n", + " shuffle=False,\n", + " num_workers=2)" + ], + "id": "c0b80568", + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz\n", + "Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz to ./MNIST/raw/train-images-idx3-ubyte.gz\n", + "Failed to download (trying next):\n", + "HTTP Error 503: Service Unavailable\n", + "\n", + "Downloading https://ossci-datasets.s3.amazonaws.com/mnist/train-images-idx3-ubyte.gz\n", + "Downloading https://ossci-datasets.s3.amazonaws.com/mnist/train-images-idx3-ubyte.gz to ./MNIST/raw/train-images-idx3-ubyte.gz\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "353b656363784babbdf7168e04d42bff", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=9912422.0), HTML(value='')))" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "\n", + "Extracting ./MNIST/raw/train-images-idx3-ubyte.gz to ./MNIST/raw\n", + "\n", + "Downloading http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz\n", + "Failed to download (trying next):\n", + "HTTP Error 503: Service Unavailable\n", + "\n", + "Downloading https://ossci-datasets.s3.amazonaws.com/mnist/train-labels-idx1-ubyte.gz\n", + "Downloading https://ossci-datasets.s3.amazonaws.com/mnist/train-labels-idx1-ubyte.gz to ./MNIST/raw/train-labels-idx1-ubyte.gz\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b6fee77315d64e3685d852ed13de847a", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=28881.0), HTML(value='')))" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "\n", + "Extracting ./MNIST/raw/train-labels-idx1-ubyte.gz to ./MNIST/raw\n", + "\n", + "Downloading http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz\n", + "Downloading http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz to ./MNIST/raw/t10k-images-idx3-ubyte.gz\n", + "Failed to download (trying next):\n", + "HTTP Error 503: Service Unavailable\n", + "\n", + "Downloading https://ossci-datasets.s3.amazonaws.com/mnist/t10k-images-idx3-ubyte.gz\n", + "Downloading https://ossci-datasets.s3.amazonaws.com/mnist/t10k-images-idx3-ubyte.gz to ./MNIST/raw/t10k-images-idx3-ubyte.gz\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e39a2751cb6c448c892fa8a79cba61d2", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=1648877.0), HTML(value='')))" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "\n", + "Extracting ./MNIST/raw/t10k-images-idx3-ubyte.gz to ./MNIST/raw\n", + "\n", + "Downloading http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz\n", + "Failed to download (trying next):\n", + "HTTP Error 503: Service Unavailable\n", + "\n", + "Downloading https://ossci-datasets.s3.amazonaws.com/mnist/t10k-labels-idx1-ubyte.gz\n", + "Downloading https://ossci-datasets.s3.amazonaws.com/mnist/t10k-labels-idx1-ubyte.gz to ./MNIST/raw/t10k-labels-idx1-ubyte.gz\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6ff8109d675549a6a82ee85bfe917e93", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=4542.0), HTML(value='')))" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "\n", + "Extracting ./MNIST/raw/t10k-labels-idx1-ubyte.gz to ./MNIST/raw\n", + "\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/torchvision/datasets/mnist.py:498: UserWarning: The given NumPy array is not writeable, and PyTorch does not support non-writeable tensors. This means you can write to the underlying (supposedly non-writeable) NumPy array using the tensor. You may want to copy the array to protect its data or make it writeable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at /pytorch/torch/csrc/utils/tensor_numpy.cpp:180.)\n", + " return torch.from_numpy(parsed.astype(m[2], copy=False)).view(*s)\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0908c769" + }, + "source": [ + "데이터가 잘 들어 왔는지 확인 합니다." + ], + "id": "0908c769" + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 332 + }, + "id": "da2ccbc2", + "outputId": "25026302-6b03-4c4e-b30a-b54883d6e267" + }, + "source": [ + "for batch_idx, (x, y) in enumerate(train_loader):\n", + " print(' | Batch index:', batch_idx, end='')\n", + " print(' | Batch size:', y.size()[0])\n", + "\n", + " x = x.to(DEVICE)\n", + " y = y.to(DEVICE)\n", + "\n", + " x_numpy = x.numpy()\n", + " y_numpy = y.numpy()\n", + " print('input batch의 모양:', x_numpy.shape)\n", + " plt.imshow(x_numpy[0].reshape(28, 28))\n", + " plt.title(f'Label {y_numpy[0]}')\n", + " plt.show()\n", + "\n", + " print('break minibatch for-loop')\n", + " break" + ], + "id": "da2ccbc2", + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "text": [ + " | Batch index: 0 | Batch size: 64\n", + "input batch의 모양: (64, 1, 28, 28)\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "stream", + "text": [ + "break minibatch for-loop\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "78dbdd43" + }, + "source": [ + "## 2-1. Deep Neural Network\n", + "아래 셀은 Deep Neural Network를 정의 합니다." + ], + "id": "78dbdd43" + }, + { + "cell_type": "code", + "metadata": { + "id": "aed9144c" + }, + "source": [ + "# 변경 가능 합니다.\n", + "class DNN(nn.Module):\n", + " def __init__(self, num_features, num_hidden_1, num_hidden_2, num_hidden_3, num_classes):\n", + " \"\"\"\n", + " num_features: input feature 갯수\n", + " num_hidden_1: 첫 번째 레이어의 노드 갯수\n", + " num_hidden_2: 두 번째 레이어의 노드 갯수\n", + " num_hidden_3: 세 번째 레이어의 노드 갯수\n", + " num_classes: 분류하고자 하는 class 갯수\n", + " \"\"\"\n", + " super(DNN, self).__init__()\n", + " \n", + " self.num_classes = num_classes\n", + " \n", + " # 수정 가능!: 레이어를 쌓는 법을 아신다면, 여기서 레이어를 쌓으셔도, 혹은 지우셔도 무방 합니다. (단, nn.Linear만)\n", + " self.linear_1 = nn.Linear(num_features, num_hidden_1)\n", + " self.linear_2 = nn.Linear(num_hidden_1, num_hidden_2)\n", + " self.linear_3 = nn.Linear(num_hidden_2, num_hidden_3)\n", + " self.linear_out = nn.Linear(num_hidden_3, num_classes)\n", + " \n", + " def forward(self, x):\n", + " out = self.linear_1(x)\n", + " out = torch.relu(out)\n", + " out = self.linear_2(out)\n", + " out = torch.relu(out)\n", + " out = self.linear_3(out)\n", + " out = torch.relu(out)\n", + " logits = self.linear_out(out)\n", + " probas = torch.sigmoid(logits)\n", + " return logits, probas\n", + "\n", + "# 수정 가능!\n", + "model = DNN(num_features=28*28,\n", + " num_hidden_1=100,\n", + " num_hidden_2=50,\n", + " num_hidden_3=20,\n", + " num_classes=10)\n", + "\n", + "model = model.to(DEVICE)" + ], + "id": "aed9144c", + "execution_count": 11, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "956117f2" + }, + "source": [ + "## 2-2. Training\n", + "여기서는 **Optimizer**와, **Epoch**를 설정 합니다. " + ], + "id": "956117f2" + }, + { + "cell_type": "code", + "metadata": { + "id": "5925349f" + }, + "source": [ + "# 수정 가능!\n", + "LEARNING_LATE = 0.05 # 흠.. 이 친구는 학습률로는 너무 큰 것 같네요..\n", + "NUM_EPOCHS = 5" + ], + "id": "5925349f", + "execution_count": 19, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "eaee3612" + }, + "source": [ + "optimizer = torch.optim.SGD(model.parameters(), lr=LEARNING_LATE)" + ], + "id": "eaee3612", + "execution_count": 20, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e7d2292a", + "outputId": "3861bcac-d092-473e-fd2a-dce22f30d194" + }, + "source": [ + "def compute_accuracy_and_loss(model, data_loader, device):\n", + " correct_pred, num_examples = 0, 0\n", + " cross_entropy = 0.\n", + " for i, (features, targets) in enumerate(data_loader):\n", + " \n", + " features = features.view(-1, 28*28).to(device)\n", + " targets = targets.to(device)\n", + "\n", + " logits, probas = model(features)\n", + " cross_entropy += F.cross_entropy(logits, targets).item()\n", + " _, predicted_labels = torch.max(probas, 1)\n", + " num_examples += targets.size(0)\n", + " correct_pred += (predicted_labels == targets).sum()\n", + " return correct_pred.float()/num_examples * 100, cross_entropy/num_examples\n", + " \n", + "\n", + "start_time = time.time()\n", + "train_acc_lst, test_acc_lst = [], []\n", + "train_loss_lst, test_loss_lst = [], []\n", + "\n", + "for epoch in range(NUM_EPOCHS):\n", + " \n", + " model.train()\n", + " \n", + " for batch_idx, (features, targets) in enumerate(train_loader):\n", + " \n", + " ### PREPARE MINIBATCH\n", + " features = features.view(-1, 28*28).to(DEVICE)\n", + " targets = targets.to(DEVICE)\n", + " \n", + " ### FORWARD AND BACK PROP\n", + " logits, probas = model(features) # 모델 계산\n", + " cost = F.cross_entropy(logits, targets) # 크로스 엔트로피 계산\n", + " optimizer.zero_grad() # 기울기 초기화\n", + " \n", + " cost.backward() # 역전파\n", + " \n", + " ### UPDATE MODEL PARAMETERS\n", + " optimizer.step() # step 적용\n", + " \n", + " ### LOGGING\n", + " if not batch_idx % 40:\n", + " print (f'Epoch: {epoch+1:03d}/{NUM_EPOCHS:03d} | '\n", + " f'Batch {batch_idx:03d}/{len(train_loader):03d} |' \n", + " f' Cost: {cost:.4f}')\n", + "\n", + " # 매 Epoch마다 evaluation을 진행합니다. \n", + " # Epoch마다 Loss를 기록하여 학습과정을 살펴보고 Underfitting, Overfitting 여부를 확인합니다.\n", + " model.eval()\n", + " with torch.set_grad_enabled(False): # Gradient 계산이 안되도록\n", + " train_acc, train_loss = compute_accuracy_and_loss(model, train_loader, device=DEVICE) # train acc, loss 계산\n", + " test_acc, test_loss = compute_accuracy_and_loss(model, test_loader, device=DEVICE) # test acc, loss 계산\n", + " \n", + " # list에 train, test의 acc, loss 추가\n", + " train_acc_lst.append(train_acc)\n", + " test_acc_lst.append(test_acc)\n", + " train_loss_lst.append(train_loss)\n", + " test_loss_lst.append(test_loss)\n", + " \n", + " # 로깅\n", + " print(f'Epoch: {epoch+1:03d}/{NUM_EPOCHS:03d} Train Acc.: {train_acc:.2f}%'\n", + " f' | Test Acc.: {test_acc:.2f}%')\n", + " \n", + " # 1 epoch 학습 소요시간\n", + " elapsed = (time.time() - start_time)/60\n", + " print(f'Time elapsed: {elapsed:.2f} min')\n", + "\n", + "# 총 학습 소요시간\n", + "elapsed = (time.time() - start_time)/60\n", + "print(f'Total Training Time: {elapsed:.2f} min')" + ], + "id": "e7d2292a", + "execution_count": 21, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Epoch: 001/005 | Batch 000/937 | Cost: 0.3845\n", + "Epoch: 001/005 | Batch 040/937 | Cost: 1.4855\n", + "Epoch: 001/005 | Batch 080/937 | Cost: 0.6567\n", + "Epoch: 001/005 | Batch 120/937 | Cost: 0.1849\n", + "Epoch: 001/005 | Batch 160/937 | Cost: 0.2180\n", + "Epoch: 001/005 | Batch 200/937 | Cost: 0.3019\n", + "Epoch: 001/005 | Batch 240/937 | Cost: 0.4417\n", + "Epoch: 001/005 | Batch 280/937 | Cost: 0.3386\n", + "Epoch: 001/005 | Batch 320/937 | Cost: 0.2664\n", + "Epoch: 001/005 | Batch 360/937 | Cost: 0.4847\n", + "Epoch: 001/005 | Batch 400/937 | Cost: 0.2179\n", + "Epoch: 001/005 | Batch 440/937 | Cost: 0.4800\n", + "Epoch: 001/005 | Batch 480/937 | Cost: 0.2106\n", + "Epoch: 001/005 | Batch 520/937 | Cost: 0.1408\n", + "Epoch: 001/005 | Batch 560/937 | Cost: 0.3541\n", + "Epoch: 001/005 | Batch 600/937 | Cost: 0.2148\n", + "Epoch: 001/005 | Batch 640/937 | Cost: 0.1283\n", + "Epoch: 001/005 | Batch 680/937 | Cost: 0.1777\n", + "Epoch: 001/005 | Batch 720/937 | Cost: 0.3163\n", + "Epoch: 001/005 | Batch 760/937 | Cost: 0.1141\n", + "Epoch: 001/005 | Batch 800/937 | Cost: 0.2345\n", + "Epoch: 001/005 | Batch 840/937 | Cost: 0.1537\n", + "Epoch: 001/005 | Batch 880/937 | Cost: 0.1347\n", + "Epoch: 001/005 | Batch 920/937 | Cost: 0.0460\n", + "Epoch: 001/005 Train Acc.: 93.94% | Test Acc.: 93.77%\n", + "Time elapsed: 0.42 min\n", + "Epoch: 002/005 | Batch 000/937 | Cost: 0.2860\n", + "Epoch: 002/005 | Batch 040/937 | Cost: 0.2271\n", + "Epoch: 002/005 | Batch 080/937 | Cost: 0.2413\n", + "Epoch: 002/005 | Batch 120/937 | Cost: 0.2236\n", + "Epoch: 002/005 | Batch 160/937 | Cost: 0.1182\n", + "Epoch: 002/005 | Batch 200/937 | Cost: 0.1305\n", + "Epoch: 002/005 | Batch 240/937 | Cost: 0.1073\n", + "Epoch: 002/005 | Batch 280/937 | Cost: 0.1356\n", + "Epoch: 002/005 | Batch 320/937 | Cost: 0.4012\n", + "Epoch: 002/005 | Batch 360/937 | Cost: 0.2410\n", + "Epoch: 002/005 | Batch 400/937 | Cost: 0.3347\n", + "Epoch: 002/005 | Batch 440/937 | Cost: 0.2132\n", + "Epoch: 002/005 | Batch 480/937 | Cost: 0.0692\n", + "Epoch: 002/005 | Batch 520/937 | Cost: 0.1262\n", + "Epoch: 002/005 | Batch 560/937 | Cost: 0.1420\n", + "Epoch: 002/005 | Batch 600/937 | Cost: 0.1930\n", + "Epoch: 002/005 | Batch 640/937 | Cost: 0.3942\n", + "Epoch: 002/005 | Batch 680/937 | Cost: 0.3024\n", + "Epoch: 002/005 | Batch 720/937 | Cost: 0.1577\n", + "Epoch: 002/005 | Batch 760/937 | Cost: 0.2364\n", + "Epoch: 002/005 | Batch 800/937 | Cost: 0.1813\n", + "Epoch: 002/005 | Batch 840/937 | Cost: 0.2037\n", + "Epoch: 002/005 | Batch 880/937 | Cost: 0.0469\n", + "Epoch: 002/005 | Batch 920/937 | Cost: 0.1095\n", + "Epoch: 002/005 Train Acc.: 95.85% | Test Acc.: 95.43%\n", + "Time elapsed: 0.83 min\n", + "Epoch: 003/005 | Batch 000/937 | Cost: 0.1664\n", + "Epoch: 003/005 | Batch 040/937 | Cost: 0.1343\n", + "Epoch: 003/005 | Batch 080/937 | Cost: 0.1430\n", + "Epoch: 003/005 | Batch 120/937 | Cost: 0.0465\n", + "Epoch: 003/005 | Batch 160/937 | Cost: 0.2572\n", + "Epoch: 003/005 | Batch 200/937 | Cost: 0.1860\n", + "Epoch: 003/005 | Batch 240/937 | Cost: 0.1844\n", + "Epoch: 003/005 | Batch 280/937 | Cost: 0.1998\n", + "Epoch: 003/005 | Batch 320/937 | Cost: 0.2601\n", + "Epoch: 003/005 | Batch 360/937 | Cost: 0.1366\n", + "Epoch: 003/005 | Batch 400/937 | Cost: 0.1652\n", + "Epoch: 003/005 | Batch 440/937 | Cost: 0.1177\n", + "Epoch: 003/005 | Batch 480/937 | Cost: 0.1296\n", + "Epoch: 003/005 | Batch 520/937 | Cost: 0.1103\n", + "Epoch: 003/005 | Batch 560/937 | Cost: 0.2221\n", + "Epoch: 003/005 | Batch 600/937 | Cost: 0.0638\n", + "Epoch: 003/005 | Batch 640/937 | Cost: 0.1259\n", + "Epoch: 003/005 | Batch 680/937 | Cost: 0.3730\n", + "Epoch: 003/005 | Batch 720/937 | Cost: 0.0860\n", + "Epoch: 003/005 | Batch 760/937 | Cost: 0.2398\n", + "Epoch: 003/005 | Batch 800/937 | Cost: 0.1201\n", + "Epoch: 003/005 | Batch 840/937 | Cost: 0.3931\n", + "Epoch: 003/005 | Batch 880/937 | Cost: 0.1188\n", + "Epoch: 003/005 | Batch 920/937 | Cost: 0.1674\n", + "Epoch: 003/005 Train Acc.: 96.33% | Test Acc.: 95.94%\n", + "Time elapsed: 1.24 min\n", + "Epoch: 004/005 | Batch 000/937 | Cost: 0.1120\n", + "Epoch: 004/005 | Batch 040/937 | Cost: 0.1436\n", + "Epoch: 004/005 | Batch 080/937 | Cost: 0.2680\n", + "Epoch: 004/005 | Batch 120/937 | Cost: 0.0702\n", + "Epoch: 004/005 | Batch 160/937 | Cost: 0.2267\n", + "Epoch: 004/005 | Batch 200/937 | Cost: 0.2731\n", + "Epoch: 004/005 | Batch 240/937 | Cost: 0.0933\n", + "Epoch: 004/005 | Batch 280/937 | Cost: 0.0682\n", + "Epoch: 004/005 | Batch 320/937 | Cost: 0.1285\n", + "Epoch: 004/005 | Batch 360/937 | Cost: 0.1682\n", + "Epoch: 004/005 | Batch 400/937 | Cost: 0.2223\n", + "Epoch: 004/005 | Batch 440/937 | Cost: 0.0413\n", + "Epoch: 004/005 | Batch 480/937 | Cost: 0.0911\n", + "Epoch: 004/005 | Batch 520/937 | Cost: 0.0169\n", + "Epoch: 004/005 | Batch 560/937 | Cost: 0.2510\n", + "Epoch: 004/005 | Batch 600/937 | Cost: 0.0856\n", + "Epoch: 004/005 | Batch 640/937 | Cost: 0.0706\n", + "Epoch: 004/005 | Batch 680/937 | Cost: 0.1067\n", + "Epoch: 004/005 | Batch 720/937 | Cost: 0.1464\n", + "Epoch: 004/005 | Batch 760/937 | Cost: 0.2804\n", + "Epoch: 004/005 | Batch 800/937 | Cost: 0.0298\n", + "Epoch: 004/005 | Batch 840/937 | Cost: 0.1674\n", + "Epoch: 004/005 | Batch 880/937 | Cost: 0.1124\n", + "Epoch: 004/005 | Batch 920/937 | Cost: 0.2335\n", + "Epoch: 004/005 Train Acc.: 97.09% | Test Acc.: 96.58%\n", + "Time elapsed: 1.66 min\n", + "Epoch: 005/005 | Batch 000/937 | Cost: 0.1059\n", + "Epoch: 005/005 | Batch 040/937 | Cost: 0.0163\n", + "Epoch: 005/005 | Batch 080/937 | Cost: 0.0987\n", + "Epoch: 005/005 | Batch 120/937 | Cost: 0.1055\n", + "Epoch: 005/005 | Batch 160/937 | Cost: 0.1014\n", + "Epoch: 005/005 | Batch 200/937 | Cost: 0.0736\n", + "Epoch: 005/005 | Batch 240/937 | Cost: 0.1394\n", + "Epoch: 005/005 | Batch 280/937 | Cost: 0.1070\n", + "Epoch: 005/005 | Batch 320/937 | Cost: 0.1879\n", + "Epoch: 005/005 | Batch 360/937 | Cost: 0.0848\n", + "Epoch: 005/005 | Batch 400/937 | Cost: 0.0318\n", + "Epoch: 005/005 | Batch 440/937 | Cost: 0.0724\n", + "Epoch: 005/005 | Batch 480/937 | Cost: 0.0593\n", + "Epoch: 005/005 | Batch 520/937 | Cost: 0.1051\n", + "Epoch: 005/005 | Batch 560/937 | Cost: 0.0548\n", + "Epoch: 005/005 | Batch 600/937 | Cost: 0.1083\n", + "Epoch: 005/005 | Batch 640/937 | Cost: 0.0434\n", + "Epoch: 005/005 | Batch 680/937 | Cost: 0.1236\n", + "Epoch: 005/005 | Batch 720/937 | Cost: 0.1237\n", + "Epoch: 005/005 | Batch 760/937 | Cost: 0.0204\n", + "Epoch: 005/005 | Batch 800/937 | Cost: 0.1242\n", + "Epoch: 005/005 | Batch 840/937 | Cost: 0.0848\n", + "Epoch: 005/005 | Batch 880/937 | Cost: 0.0860\n", + "Epoch: 005/005 | Batch 920/937 | Cost: 0.1750\n", + "Epoch: 005/005 Train Acc.: 97.34% | Test Acc.: 96.72%\n", + "Time elapsed: 2.08 min\n", + "Total Training Time: 2.08 min\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "02201bb2" + }, + "source": [ + "## 2-3. Evaluation\n", + "테스트 데이터와 학습 데이터의 Loss 변화를 확인 합니다." + ], + "id": "02201bb2" + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 279 + }, + "id": "88d756c7", + "outputId": "77428d70-32de-4af3-bf1c-f436736e2d90" + }, + "source": [ + "plt.plot(range(1, NUM_EPOCHS+1), train_loss_lst, label='Training loss')\n", + "plt.plot(range(1, NUM_EPOCHS+1), test_loss_lst, label='Test loss')\n", + "plt.legend(loc='upper right')\n", + "plt.ylabel('Cross entropy')\n", + "plt.xlabel('Epoch')\n", + "plt.show()" + ], + "id": "88d756c7", + "execution_count": 23, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZsAAAEGCAYAAACzYDhlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3gVZdrH8e+dQkIJPbRQErqUkNClF1EEFRsKdtFVdlFQ1lVYd1eWdfe1FyxrWcGGFLGhYEOUIk06BCkBAkSpAUIPKff7xwxwCKkkJ+ckuT/XdS7OmXlm5s7R8GNmnnkeUVWMMcYYbwrwdQHGGGNKPgsbY4wxXmdhY4wxxussbIwxxnidhY0xxhivC/J1Af6oevXqGhkZ6esyjDGmWFmxYsUBVQ3Pap2FTRYiIyNZvny5r8swxphiRUR2ZLfOLqMZY4zxOgsbY4wxXmdhY4wxxuvsno0xplhJTU0lMTGRU6dO+bqUUis0NJS6desSHByc520sbIwxxUpiYiJhYWFERkYiIr4up9RRVZKSkkhMTCQqKirP29llNGNMsXLq1CmqVatmQeMjIkK1atXyfWZpYWOMKXYsaHzrYr5/C5tClHwylXEz40g+merrUowxxq9Y2BSi7fuPsXfpDP7+2VpsniBjSqakpCRiYmKIiYmhVq1aREREnP18+vTpHLddvnw5I0eOzPUYXbp0KZRaf/rpJ6666qpC2VdBWQeBQhSTuor/Br/AGxs28+nKp7mhXV1fl2SMKWTVqlVj9erVAIwbN44KFSrwyCOPnF2flpZGUFDWf7W2b9+e9u3b53qMRYsWFU6xfsTObApTw95kdPgDw4O+YsMXz7Mj6bivKzLGFIG77rqL4cOH06lTJx599FGWLVvGpZdeSmxsLF26dGHTpk3A+Wca48aNY9iwYfTq1YuGDRsyYcKEs/urUKHC2fa9evXixhtvpHnz5tx6661nr5rMnj2b5s2b065dO0aOHJnrGczBgwe59tpriY6OpnPnzqxduxaAefPmnT0zi42N5ejRo+zevZsePXoQExNDq1atWLBgQYG/IzuzKUwiBFz5NCeTdvDXbZP4v/fq8diohwgOtEw3xhv++WUcG34/Uqj7bFGnIk9c3TLf2yUmJrJo0SICAwM5cuQICxYsICgoiDlz5vDXv/6VTz755IJtNm7cyI8//sjRo0dp1qwZf/zjHy94dmXVqlXExcVRp04dunbtys8//0z79u25//77mT9/PlFRUQwdOjTX+p544gliY2P5/PPPmTt3LnfccQerV6/mueee47XXXqNr164cO3aM0NBQ3nrrLa644goef/xx0tPTOXHiRL6/j8zsb8HCFhBI2SHvcrRKS0YnP8WUz7/wdUXGmCIwePBgAgMDAUhOTmbw4MG0atWKhx9+mLi4uCy3GThwICEhIVSvXp0aNWqwd+/eC9p07NiRunXrEhAQQExMDAkJCWzcuJGGDRuefc4lL2GzcOFCbr/9dgD69OlDUlISR44coWvXrowePZoJEyZw+PBhgoKC6NChA5MmTWLcuHGsW7eOsLCwi/1azrIzG28oU57K93zGwZe7c+XaUaxq0pDY6Da+rsqYEudizkC8pXz58mff//3vf6d379589tlnJCQk0KtXryy3CQkJOfs+MDCQtLS0i2pTEGPGjGHgwIHMnj2brl278u2339KjRw/mz5/PrFmzuOuuuxg9ejR33HFHgY5jZzbeUqEGoXd9SoikU+WzoSQf3OfriowxRSQ5OZmIiAgA3n333ULff7Nmzdi2bRsJCQkATJs2LddtunfvzuTJkwHnXlD16tWpWLEiW7dupXXr1jz22GN06NCBjRs3smPHDmrWrMkf/vAH7r33XlauXFngmi1svKhcREv2D5xInYy97H37RjTVxnIypjR49NFHGTt2LLGxsYV+JgJQtmxZXn/9dfr370+7du0ICwujUqVKOW4zbtw4VqxYQXR0NGPGjOG9994D4KWXXqJVq1ZER0cTHBzMlVdeyU8//USbNm2IjY1l2rRpjBo1qsA1iz0PcqH27dtrYU6eNmf6a1y24a/sqDOABvdOhgDLeGMu1q+//soll1zi6zJ87tixY1SoUAFVZcSIETRp0oSHH364yI6f1X8HEVmhqln27fbq33oi0l9ENolIvIiMyWJ9iIhMc9cvFZFIj3Vj3eWbROQKd1moiCwTkTUiEici//RoH+XuI97dZ5ncjlFU+tz4J6ZUHEaD32dzaNY/ivrwxpgS6O233yYmJoaWLVuSnJzM/fff7+uScuS1sBGRQOA14EqgBTBURFpkanYPcEhVGwMvAk+727YAhgAtgf7A6+7+UoA+qtoGiAH6i0hnd19PAy+6+zrk7jvbYxSl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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 282 + }, + "id": "3b3a090f", + "outputId": "6dd7b0ec-ed1b-4be9-d7a9-d1c693546100" + }, + "source": [ + "plt.plot(range(1, NUM_EPOCHS+1), train_acc_lst, label='Training accuracy')\n", + "plt.plot(range(1, NUM_EPOCHS+1), test_acc_lst, label='Test accuracy')\n", + "plt.legend(loc='upper left')\n", + "plt.ylabel('Cross entropy')\n", + "plt.xlabel('Epoch')\n", + "plt.show()" + ], + "id": "3b3a090f", + "execution_count": 24, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ccfebc8d", + "outputId": "e30ea964-da03-42a7-c411-91054075e60c" + }, + "source": [ + "model.eval()\n", + "with torch.set_grad_enabled(False): # save memory during inference\n", + " test_acc, test_loss = compute_accuracy_and_loss(model, test_loader, DEVICE)\n", + " print(f'Test accuracy: {test_acc:.2f}%')" + ], + "id": "ccfebc8d", + "execution_count": 25, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Test accuracy: 96.72%\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 122 + }, + "id": "0886fd6a", + "outputId": "44d01fe5-1019-4386-d897-c80f9bf304ed" + }, + "source": [ + "for batch_idx, (x, y) in enumerate(test_loader):\n", + " x = x.to(DEVICE)\n", + " y = y.to(DEVICE)\n", + "\n", + " x_numpy = x.numpy()\n", + " \n", + " fig, axes = plt.subplots(1, 5)\n", + " \n", + " for ax in axes:\n", + " index = random.randint(0, 64)\n", + " logits, probas = model(x[index].view(-1, 28*28))\n", + " _, predicted_labels = torch.max(probas, 1)\n", + " ax.imshow(x_numpy[index].reshape(28, 28))\n", + " ax.set_title(f'Label {predicted_labels[0]}')\n", + " \n", + " plt.show()\n", + " break" + ], + "id": "0886fd6a", + "execution_count": 26, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9606aff2" + }, + "source": [ + "## 2-4. Discussion\n", + "1. Train Data에 대한 정확도와, Test Data에 대한 정확도가 왜 다를까요?\n", + "- *학습된 모델이 Train Data에 overfitting 되어 unseen data에서 좋은 성능을 내지 못함.*\n", + "\n", + "2. 다른 사람들은 정확도가 99퍼가 넘는 모델도 만들던데, DNN의 한계가 있다면 어떤 점이 있을까요? (Hint: 우리는 28x28의 이미지를 768x1로 쫙 펴서 넣어 줬습니다.)\n", + "- *28x28 이미지를 1차원으로 펴주었기 때문에 28x28속 의미있는 데이터를 추출해내지 못함.*" + ], + "id": "9606aff2" + }, + { + "cell_type": "code", + "metadata": { + "id": "e72bd14c" + }, + "source": [ + "" + ], + "id": "e72bd14c", + "execution_count": 18, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/assignments/yee/Football teams.csv b/assignments/yee/Football teams.csv new file mode 100644 index 0000000..8bdf49e --- /dev/null +++ b/assignments/yee/Football teams.csv @@ -0,0 +1,99 @@ +Team,Tournament,Goals,Shots pg,yellow_cards,red_cards,Possession%,Pass%,AerialsWon,Rating +Manchester City,Premier League,83,15.8,46,2,60.8,89.4,12.8,7.01 +Bayern Munich,Bundesliga,99,17.1,44,3,58.1,85.5,12.9,6.95 +Paris Saint-Germain,Ligue 1,86,15,73,7,60.1,89.5,9.5,6.88 +Barcelona,LaLiga,85,15.3,68,2,62.4,89.7,10.6,6.87 +Real Madrid,LaLiga,67,14.4,57,2,57.7,87.7,11.8,6.86 +Manchester United,Premier League,73,13.8,64,1,54.5,84.8,14.5,6.85 +Juventus,Serie A,77,15.7,76,6,55.4,88.3,11.4,6.85 +Aston Villa,Premier League,55,13.7,63,4,49.1,78.6,19.4,6.84 +Borussia Dortmund,Bundesliga,75,14.6,43,1,57.5,85.5,12.8,6.84 +Atletico Madrid,LaLiga,67,12.1,100,0,51.8,83.1,14.4,6.84 +Atalanta,Serie A,90,16.3,66,3,53.5,83.5,16.8,6.84 +Chelsea,Premier League,58,14.6,49,3,58.6,87,15.2,6.83 +Liverpool,Premier League,68,16,40,0,59,85.7,14.3,6.82 +AC Milan,Serie A,74,14.7,80,4,51.4,84,15.2,6.82 +Lille,Ligue 1,64,12.8,67,2,52.6,83.5,15.8,6.82 +Tottenham,Premier League,68,11.7,53,2,51.3,81.8,16.4,6.81 +Napoli,Serie A,86,17,71,3,54.1,87,11.1,6.81 +Leicester,Premier League,68,12.8,61,0,53.2,82.1,16.2,6.8 +Wolfsburg,Bundesliga,61,14.1,56,3,51,78,16.9,6.8 +Inter,Serie A,89,14.5,59,2,52,87,11.8,6.8 +Lyon,Ligue 1,81,16.1,60,10,53.6,84.7,14.3,6.8 +RB Leipzig,Bundesliga,60,16,57,0,57.3,83.2,18.6,6.78 +Leeds,Premier League,62,13.7,61,1,55.1,80.8,14.5,6.77 +West Ham,Premier League,62,12.3,48,3,44.5,77.8,19.9,6.77 +Everton,Premier League,47,10.5,59,2,47.3,81.4,17.7,6.73 +Bayer Leverkusen,Bundesliga,53,13,58,0,57.3,84.4,13.1,6.73 +Eintracht Frankfurt,Bundesliga,69,13.2,80,1,52.4,79.6,17.9,6.73 +Monaco,Ligue 1,76,12.8,74,7,54.2,82.7,16.5,6.73 +Roma,Serie A,68,14.3,84,3,51.5,84.5,12.1,6.71 +Sevilla,LaLiga,53,12.1,75,2,58.7,86.2,16.6,6.7 +Borussia M.Gladbach,Bundesliga,64,13.4,61,2,51.5,82,15.3,6.7 +Arsenal,Premier League,55,12.1,47,5,52.7,85,13.5,6.69 +Rennes,Ligue 1,52,13.5,80,5,56.8,85.6,16.9,6.69 +VfB Stuttgart,Bundesliga,56,13.4,63,2,51.5,81.1,16.3,6.68 +Wolverhampton Wanderers,Premier League,36,12.2,53,1,49.7,83.2,15.3,6.67 +Sassuolo,Serie A,64,13.9,74,4,58.2,87.8,10.9,6.67 +Metz,Ligue 1,44,11.5,82,4,46.9,79.8,16.1,6.66 +Villarreal,LaLiga,60,10.7,65,5,54.3,84.4,13,6.66 +Real Sociedad,LaLiga,59,11.3,81,1,53.7,80.8,17.9,6.65 +Brighton,Premier League,40,12.8,45,6,50.7,81.3,14.2,6.65 +Real Betis,LaLiga,50,11.7,87,8,52.9,82,16.4,6.64 +Burnley,Premier League,33,10.1,48,0,43.5,71.6,23.4,6.64 +Lens,Ligue 1,55,11.7,84,7,51.1,81.8,17.4,6.64 +Brest,Ligue 1,50,11.8,60,4,49.4,81.3,18.6,6.64 +Fulham,Premier League,27,11.6,67,3,50,81.2,17.2,6.63 +Marseille,Ligue 1,54,10,94,9,52.4,82,14.9,6.63 +Sampdoria,Serie A,52,11.3,81,3,46.1,78.5,16.8,6.63 +Montpellier,Ligue 1,60,12.2,65,7,46.4,78.8,17.9,6.63 +Nice,Ligue 1,50,10.8,69,4,53.4,85.6,10.5,6.63 +Hoffenheim,Bundesliga,52,12.6,65,4,50.8,80.7,15.7,6.63 +Southampton,Premier League,47,11.2,52,3,51.4,79.3,14.1,6.62 +Newcastle United,Premier League,46,10.4,61,3,41.6,76,17.1,6.62 +Lazio,Serie A,61,13.8,100,5,52.2,83.8,14.6,6.62 +Nantes,Ligue 1,47,10.8,68,4,45.2,77,18.1,6.62 +Union Berlin,Bundesliga,50,11.7,55,2,45.9,76.2,17.6,6.62 +Strasbourg,Ligue 1,49,11.3,56,3,46.5,78.3,18.3,6.61 +Crystal Palace,Premier League,41,9.2,54,2,42.9,76.1,18.3,6.61 +Freiburg,Bundesliga,52,11.4,63,0,47.5,78.1,17.5,6.6 +Valencia,LaLiga,50,10.3,77,5,47.9,79.4,16.3,6.6 +Celta Vigo,LaLiga,55,9.4,104,5,52,79.9,16.5,6.6 +Reims,Ligue 1,42,9.6,75,8,46.3,80.7,13.4,6.6 +Torino,Serie A,50,12.2,72,4,48,80.5,16.1,6.59 +Verona,Serie A,43,10.6,91,1,49.6,76.3,20.6,6.59 +Saint-Etienne,Ligue 1,42,11.6,76,2,49,79.3,16.4,6.59 +Bordeaux,Ligue 1,42,11.1,74,4,50.2,83.3,15.4,6.59 +Hertha Berlin,Bundesliga,41,11.3,63,3,49.8,79.5,15.8,6.58 +Cagliari,Serie A,43,11.4,73,3,45.8,79.8,17.2,6.58 +Mainz 05,Bundesliga,39,11.1,61,1,42.7,71.3,18.3,6.57 +Bologna,Serie A,51,13.1,78,4,50.7,81.5,15.1,6.56 +Augsburg,Bundesliga,36,9.9,65,4,44,73.6,16.8,6.56 +Udinese,Serie A,42,10.9,63,2,47.2,82.5,13.1,6.55 +SD Huesca,LaLiga,34,10.7,68,2,48.7,79.8,15.7,6.55 +Athletic Bilbao,LaLiga,46,10.6,81,3,49.4,78.5,17.9,6.54 +Osasuna,LaLiga,37,9.8,74,5,44.6,70.2,26.8,6.54 +Lorient,Ligue 1,50,11.2,67,3,45.9,78.8,13.7,6.54 +Genoa,Serie A,47,9,85,2,46.1,79.7,13.7,6.54 +Arminia Bielefeld,Bundesliga,26,9.8,52,1,44.1,74.6,22.2,6.53 +Angers,Ligue 1,40,10.7,63,2,47.1,81.3,13.2,6.53 +Eibar,LaLiga,29,11.9,67,3,49.2,72.6,24.4,6.53 +Werder Bremen,Bundesliga,36,10.6,63,3,45.2,76.2,18.3,6.52 +Fiorentina,Serie A,47,9.8,86,5,46.8,81,14.2,6.52 +Nimes,Ligue 1,40,10.3,57,5,45.8,77.5,14,6.52 +West Bromwich Albion,Premier League,35,8.9,51,4,41,72.2,19.1,6.51 +FC Koln,Bundesliga,34,10.6,62,1,47.1,77.3,18.5,6.51 +Deportivo Alaves,LaLiga,36,9.1,87,8,44.6,72.9,22.6,6.5 +Levante,LaLiga,46,10.1,70,1,51.5,80.1,12.2,6.5 +Spezia,Serie A,52,10.2,92,5,51.6,81.1,14.4,6.5 +Getafe,LaLiga,28,9.5,117,7,44.4,66.5,22.8,6.49 +Parma Calcio 1913,Serie A,39,10.4,91,1,48.4,82.5,16.9,6.49 +Elche,LaLiga,34,7.1,95,3,48.1,81.5,13.2,6.48 +Granada,LaLiga,47,9.4,96,6,43.4,70,18.3,6.47 +Cadiz,LaLiga,36,8,77,3,38.5,68.8,18.5,6.47 +Real Valladolid,LaLiga,34,9.7,93,4,46.2,74.8,17.1,6.46 +Sheffield United,Premier League,20,8.5,73,3,43,76.9,19.1,6.46 +Crotone,Serie A,45,9.5,85,4,47.2,80.4,12.7,6.43 +Benevento,Serie A,40,11,90,5,44.2,77.7,13.4,6.43 +Dijon,Ligue 1,25,9.2,75,5,46.9,80,14.3,6.42 +Schalke 04,Bundesliga,25,8.9,70,2,46.2,76.5,15.6,6.41 diff --git a/assignments/yee/world-happiness-report-2021.csv b/assignments/yee/world-happiness-report-2021.csv new file mode 100644 index 0000000..dbc8659 --- /dev/null +++ b/assignments/yee/world-happiness-report-2021.csv @@ -0,0 +1,150 @@ +Country name,Regional indicator,Ladder score,Standard error of ladder score,upperwhisker,lowerwhisker,Logged GDP per capita,Social support,Healthy life expectancy,Freedom to make life choices,Generosity,Perceptions of corruption,Ladder score in Dystopia,Explained by: Log GDP per capita,Explained by: Social support,Explained by: Healthy life expectancy,Explained by: Freedom to make life choices,Explained by: Generosity,Explained by: Perceptions of corruption,Dystopia + residual +Finland,Western Europe,7.842,0.032,7.904,7.780,10.775,0.954,72.000,0.949,-0.098,0.186,2.430,1.446,1.106,0.741,0.691,0.124,0.481,3.253 +Denmark,Western Europe,7.620,0.035,7.687,7.552,10.933,0.954,72.700,0.946,0.030,0.179,2.430,1.502,1.108,0.763,0.686,0.208,0.485,2.868 +Switzerland,Western Europe,7.571,0.036,7.643,7.500,11.117,0.942,74.400,0.919,0.025,0.292,2.430,1.566,1.079,0.816,0.653,0.204,0.413,2.839 +Iceland,Western Europe,7.554,0.059,7.670,7.438,10.878,0.983,73.000,0.955,0.160,0.673,2.430,1.482,1.172,0.772,0.698,0.293,0.170,2.967 +Netherlands,Western Europe,7.464,0.027,7.518,7.410,10.932,0.942,72.400,0.913,0.175,0.338,2.430,1.501,1.079,0.753,0.647,0.302,0.384,2.798 +Norway,Western Europe,7.392,0.035,7.462,7.323,11.053,0.954,73.300,0.960,0.093,0.270,2.430,1.543,1.108,0.782,0.703,0.249,0.427,2.580 +Sweden,Western Europe,7.363,0.036,7.433,7.293,10.867,0.934,72.700,0.945,0.086,0.237,2.430,1.478,1.062,0.763,0.685,0.244,0.448,2.683 +Luxembourg,Western Europe,7.324,0.037,7.396,7.252,11.647,0.908,72.600,0.907,-0.034,0.386,2.430,1.751,1.003,0.760,0.639,0.166,0.353,2.653 +New Zealand,North America and ANZ,7.277,0.040,7.355,7.198,10.643,0.948,73.400,0.929,0.134,0.242,2.430,1.400,1.094,0.785,0.665,0.276,0.445,2.612 +Austria,Western Europe,7.268,0.036,7.337,7.198,10.906,0.934,73.300,0.908,0.042,0.481,2.430,1.492,1.062,0.782,0.640,0.215,0.292,2.784 +Australia,North America and ANZ,7.183,0.041,7.265,7.102,10.796,0.940,73.900,0.914,0.159,0.442,2.430,1.453,1.076,0.801,0.647,0.291,0.317,2.598 +Israel,Middle East and North Africa,7.157,0.034,7.224,7.090,10.575,0.939,73.503,0.800,0.031,0.753,2.430,1.376,1.074,0.788,0.509,0.208,0.119,3.083 +Germany,Western Europe,7.155,0.040,7.232,7.077,10.873,0.903,72.500,0.875,0.011,0.460,2.430,1.480,0.993,0.757,0.600,0.195,0.306,2.824 +Canada,North America and ANZ,7.103,0.042,7.185,7.021,10.776,0.926,73.800,0.915,0.089,0.415,2.430,1.447,1.044,0.798,0.648,0.246,0.335,2.585 +Ireland,Western Europe,7.085,0.040,7.164,7.006,11.342,0.947,72.400,0.879,0.077,0.363,2.430,1.644,1.092,0.753,0.606,0.238,0.367,2.384 +Costa Rica,Latin America and Caribbean,7.069,0.056,7.179,6.960,9.880,0.891,71.400,0.934,-0.126,0.809,2.430,1.134,0.966,0.722,0.673,0.105,0.083,3.387 +United Kingdom,Western Europe,7.064,0.038,7.138,6.990,10.707,0.934,72.500,0.859,0.233,0.459,2.430,1.423,1.062,0.757,0.580,0.340,0.306,2.596 +Czech Republic,Central and Eastern Europe,6.965,0.049,7.062,6.868,10.556,0.947,70.807,0.858,-0.208,0.868,2.430,1.370,1.090,0.703,0.580,0.052,0.046,3.124 +United States,North America and ANZ,6.951,0.049,7.047,6.856,11.023,0.920,68.200,0.837,0.098,0.698,2.430,1.533,1.030,0.621,0.554,0.252,0.154,2.807 +Belgium,Western Europe,6.834,0.034,6.901,6.767,10.823,0.906,72.199,0.783,-0.153,0.646,2.430,1.463,0.998,0.747,0.489,0.088,0.187,2.862 +France,Western Europe,6.690,0.037,6.762,6.618,10.704,0.942,74.000,0.822,-0.147,0.571,2.430,1.421,1.081,0.804,0.536,0.092,0.235,2.521 +Bahrain,Middle East and North Africa,6.647,0.068,6.779,6.514,10.669,0.862,69.495,0.925,0.089,0.722,2.430,1.409,0.899,0.662,0.661,0.246,0.139,2.631 +Malta,Western Europe,6.602,0.044,6.688,6.516,10.674,0.931,72.200,0.927,0.133,0.653,2.430,1.411,1.055,0.747,0.664,0.275,0.183,2.268 +Taiwan Province of China,East Asia,6.584,0.038,6.659,6.510,10.871,0.898,69.600,0.784,-0.070,0.721,2.430,1.480,0.982,0.665,0.490,0.142,0.139,2.687 +United Arab Emirates,Middle East and North Africa,6.561,0.039,6.637,6.484,11.085,0.844,67.333,0.932,0.074,0.589,2.430,1.555,0.860,0.594,0.670,0.236,0.223,2.422 +Saudi Arabia,Middle East and North Africa,6.494,0.056,6.604,6.384,10.743,0.891,66.603,0.877,-0.149,0.684,2.430,1.435,0.964,0.571,0.603,0.090,0.163,2.668 +Spain,Western Europe,6.491,0.042,6.574,6.408,10.571,0.932,74.700,0.761,-0.081,0.745,2.430,1.375,1.057,0.826,0.462,0.135,0.124,2.513 +Italy,Western Europe,6.483,0.045,6.572,6.395,10.623,0.880,73.800,0.693,-0.084,0.866,2.430,1.393,0.940,0.798,0.379,0.133,0.047,2.794 +Slovenia,Central and Eastern Europe,6.461,0.043,6.546,6.376,10.529,0.948,71.400,0.949,-0.101,0.806,2.430,1.360,1.093,0.722,0.690,0.122,0.085,2.388 +Guatemala,Latin America and Caribbean,6.435,0.073,6.577,6.292,9.053,0.813,64.958,0.906,-0.038,0.775,2.430,0.845,0.790,0.519,0.638,0.163,0.105,3.375 +Uruguay,Latin America and Caribbean,6.431,0.046,6.521,6.341,9.966,0.925,69.100,0.896,-0.092,0.590,2.430,1.164,1.042,0.649,0.625,0.128,0.223,2.600 +Singapore,Southeast Asia,6.377,0.043,6.460,6.293,11.488,0.915,76.953,0.927,-0.018,0.082,2.430,1.695,1.019,0.897,0.664,0.176,0.547,1.379 +Kosovo,Central and Eastern Europe,6.372,0.059,6.487,6.257,9.318,0.821,63.813,0.869,0.257,0.917,2.430,0.937,0.807,0.483,0.593,0.356,0.014,3.182 +Slovakia,Central and Eastern Europe,6.331,0.041,6.411,6.251,10.369,0.936,69.201,0.766,-0.124,0.911,2.430,1.304,1.066,0.653,0.468,0.107,0.018,2.714 +Brazil,Latin America and Caribbean,6.330,0.043,6.415,6.245,9.577,0.882,66.601,0.804,-0.071,0.756,2.430,1.028,0.944,0.571,0.514,0.142,0.117,3.015 +Mexico,Latin America and Caribbean,6.317,0.053,6.420,6.213,9.859,0.831,68.597,0.862,-0.147,0.799,2.430,1.126,0.830,0.634,0.585,0.092,0.089,2.961 +Jamaica,Latin America and Caribbean,6.309,0.156,6.615,6.004,9.186,0.877,67.500,0.890,-0.137,0.884,2.430,0.891,0.932,0.599,0.618,0.099,0.035,3.135 +Lithuania,Central and Eastern Europe,6.255,0.045,6.344,6.167,10.499,0.935,67.906,0.773,-0.203,0.826,2.430,1.350,1.065,0.612,0.476,0.056,0.073,2.624 +Cyprus,Western Europe,6.223,0.049,6.319,6.128,10.576,0.802,73.898,0.763,-0.015,0.844,2.430,1.377,0.765,0.801,0.464,0.178,0.061,2.578 +Estonia,Central and Eastern Europe,6.189,0.038,6.263,6.115,10.481,0.941,68.800,0.909,-0.106,0.527,2.430,1.344,1.079,0.640,0.641,0.119,0.263,2.103 +Panama,Latin America and Caribbean,6.180,0.073,6.323,6.036,10.350,0.896,69.652,0.872,-0.166,0.856,2.430,1.298,0.976,0.667,0.596,0.079,0.053,2.509 +Uzbekistan,Commonwealth of Independent States,6.179,0.068,6.312,6.045,8.836,0.918,65.255,0.970,0.311,0.515,2.430,0.769,1.027,0.528,0.716,0.391,0.271,2.477 +Chile,Latin America and Caribbean,6.172,0.046,6.262,6.081,10.071,0.882,70.000,0.742,-0.044,0.830,2.430,1.200,0.946,0.678,0.438,0.159,0.070,2.682 +Poland,Central and Eastern Europe,6.166,0.040,6.245,6.087,10.382,0.898,69.702,0.841,-0.165,0.735,2.430,1.309,0.982,0.668,0.558,0.080,0.130,2.438 +Kazakhstan,Commonwealth of Independent States,6.152,0.047,6.243,6.060,10.155,0.952,65.200,0.853,-0.069,0.733,2.430,1.230,1.103,0.527,0.573,0.143,0.132,2.446 +Romania,Central and Eastern Europe,6.140,0.057,6.253,6.027,10.284,0.832,67.355,0.845,-0.219,0.938,2.430,1.275,0.832,0.595,0.564,0.045,0.001,2.830 +Kuwait,Middle East and North Africa,6.106,0.066,6.235,5.977,10.817,0.843,66.900,0.867,-0.104,0.736,2.430,1.461,0.857,0.580,0.591,0.120,0.130,2.368 +Serbia,Central and Eastern Europe,6.078,0.053,6.181,5.974,9.787,0.873,68.600,0.778,0.002,0.835,2.430,1.101,0.924,0.634,0.482,0.189,0.066,2.682 +El Salvador,Latin America and Caribbean,6.061,0.065,6.188,5.933,9.054,0.762,66.402,0.888,-0.110,0.688,2.430,0.845,0.675,0.565,0.615,0.116,0.160,3.085 +Mauritius,Sub-Saharan Africa,6.049,0.059,6.165,5.933,10.008,0.905,66.701,0.867,-0.054,0.789,2.430,1.178,0.996,0.574,0.590,0.153,0.096,2.462 +Latvia,Central and Eastern Europe,6.032,0.036,6.103,5.961,10.315,0.927,67.100,0.715,-0.162,0.800,2.430,1.285,1.047,0.587,0.405,0.082,0.089,2.536 +Colombia,Latin America and Caribbean,6.012,0.061,6.132,5.892,9.557,0.847,68.001,0.837,-0.135,0.841,2.430,1.021,0.866,0.615,0.554,0.100,0.063,2.794 +Hungary,Central and Eastern Europe,5.992,0.047,6.085,5.899,10.358,0.943,68.000,0.755,-0.186,0.876,2.430,1.301,1.083,0.615,0.454,0.067,0.040,2.432 +Thailand,Southeast Asia,5.985,0.047,6.077,5.893,9.805,0.888,67.401,0.884,0.287,0.895,2.430,1.107,0.957,0.596,0.611,0.375,0.028,2.309 +Nicaragua,Latin America and Caribbean,5.972,0.083,6.134,5.810,8.620,0.864,67.657,0.836,0.020,0.664,2.430,0.693,0.904,0.604,0.553,0.201,0.176,2.841 +Japan,East Asia,5.940,0.040,6.020,5.861,10.611,0.884,75.100,0.796,-0.258,0.638,2.430,1.389,0.949,0.838,0.504,0.020,0.192,2.048 +Argentina,Latin America and Caribbean,5.929,0.056,6.040,5.819,9.962,0.898,69.000,0.828,-0.182,0.834,2.430,1.162,0.980,0.646,0.544,0.069,0.067,2.461 +Portugal,Western Europe,5.929,0.055,6.037,5.821,10.421,0.879,72.600,0.892,-0.244,0.887,2.430,1.323,0.939,0.760,0.621,0.029,0.033,2.225 +Honduras,Latin America and Caribbean,5.919,0.082,6.081,5.758,8.648,0.812,67.300,0.857,0.081,0.809,2.430,0.703,0.787,0.593,0.578,0.241,0.083,2.934 +Croatia,Central and Eastern Europe,5.882,0.048,5.975,5.788,10.217,0.924,70.799,0.754,-0.118,0.939,2.430,1.251,1.039,0.703,0.453,0.111,0.000,2.325 +Philippines,Southeast Asia,5.880,0.052,5.982,5.778,9.076,0.830,62.000,0.917,-0.097,0.742,2.430,0.853,0.828,0.426,0.651,0.125,0.126,2.872 +South Korea,East Asia,5.845,0.042,5.928,5.763,10.651,0.799,73.900,0.672,-0.083,0.727,2.430,1.403,0.758,0.801,0.353,0.134,0.135,2.262 +Peru,Latin America and Caribbean,5.840,0.075,5.988,5.692,9.458,0.832,68.250,0.822,-0.154,0.891,2.430,0.986,0.833,0.623,0.536,0.087,0.031,2.744 +Bosnia and Herzegovina,Central and Eastern Europe,5.813,0.050,5.911,5.715,9.590,0.870,68.098,0.706,0.113,0.931,2.430,1.032,0.919,0.618,0.395,0.261,0.005,2.583 +Moldova,Commonwealth of Independent States,5.766,0.046,5.856,5.677,9.454,0.857,65.699,0.822,-0.079,0.918,2.430,0.985,0.888,0.542,0.536,0.137,0.013,2.665 +Ecuador,Latin America and Caribbean,5.764,0.057,5.875,5.653,9.313,0.821,68.800,0.842,-0.124,0.843,2.430,0.935,0.806,0.640,0.560,0.107,0.062,2.653 +Kyrgyzstan,Commonwealth of Independent States,5.744,0.046,5.834,5.653,8.538,0.893,64.401,0.935,0.119,0.908,2.430,0.665,0.971,0.501,0.673,0.266,0.020,2.648 +Greece,Western Europe,5.723,0.046,5.813,5.632,10.279,0.823,72.600,0.582,-0.288,0.823,2.430,1.273,0.811,0.760,0.243,0.000,0.074,2.561 +Bolivia,Latin America and Caribbean,5.716,0.053,5.819,5.613,9.046,0.810,63.901,0.875,-0.077,0.839,2.430,0.842,0.782,0.486,0.600,0.138,0.064,2.805 +Mongolia,East Asia,5.677,0.042,5.760,5.595,9.400,0.935,62.500,0.708,0.116,0.856,2.430,0.966,1.065,0.442,0.397,0.263,0.053,2.492 +Paraguay,Latin America and Caribbean,5.653,0.092,5.832,5.473,9.448,0.893,65.900,0.876,0.028,0.882,2.430,0.983,0.970,0.549,0.602,0.206,0.037,2.306 +Montenegro,Central and Eastern Europe,5.581,0.054,5.686,5.475,9.940,0.858,68.699,0.708,-0.034,0.812,2.430,1.155,0.891,0.637,0.397,0.166,0.081,2.254 +Dominican Republic,Latin America and Caribbean,5.545,0.071,5.685,5.405,9.802,0.853,66.102,0.860,-0.133,0.714,2.430,1.106,0.879,0.555,0.581,0.101,0.144,2.178 +North Cyprus,Western Europe,5.536,0.051,5.636,5.435,10.576,0.820,73.898,0.795,0.012,0.626,2.430,1.377,0.806,0.801,0.503,0.196,0.200,1.653 +Belarus,Commonwealth of Independent States,5.534,0.047,5.625,5.442,9.853,0.910,66.253,0.650,-0.180,0.627,2.430,1.124,1.007,0.560,0.326,0.070,0.199,2.247 +Russia,Commonwealth of Independent States,5.477,0.033,5.541,5.413,10.189,0.903,64.703,0.718,-0.111,0.845,2.430,1.241,0.992,0.511,0.409,0.115,0.060,2.148 +Hong Kong S.A.R. of China,East Asia,5.477,0.049,5.573,5.380,11.000,0.836,76.820,0.717,0.067,0.403,2.430,1.525,0.841,0.893,0.408,0.232,0.342,1.236 +Tajikistan,Commonwealth of Independent States,5.466,0.034,5.532,5.400,8.091,0.860,64.281,0.832,-0.056,0.553,2.430,0.508,0.895,0.498,0.548,0.152,0.247,2.619 +Vietnam,Southeast Asia,5.411,0.039,5.488,5.334,8.973,0.850,68.034,0.940,-0.098,0.796,2.430,0.817,0.873,0.616,0.679,0.124,0.091,2.211 +Libya,Middle East and North Africa,5.410,0.076,5.558,5.262,9.622,0.827,62.300,0.771,-0.087,0.667,2.430,1.044,0.821,0.435,0.474,0.131,0.174,2.331 +Malaysia,Southeast Asia,5.384,0.049,5.480,5.289,10.238,0.817,67.102,0.895,0.125,0.839,2.430,1.259,0.797,0.587,0.624,0.270,0.064,1.784 +Indonesia,Southeast Asia,5.345,0.056,5.454,5.235,9.365,0.811,62.236,0.873,0.542,0.867,2.430,0.954,0.786,0.433,0.598,0.541,0.046,1.987 +Congo (Brazzaville),Sub-Saharan Africa,5.342,0.097,5.533,5.151,8.117,0.636,58.221,0.695,-0.068,0.745,2.430,0.518,0.392,0.307,0.381,0.144,0.124,3.476 +China,East Asia,5.339,0.029,5.397,5.281,9.673,0.811,69.593,0.904,-0.146,0.755,2.430,1.061,0.785,0.665,0.636,0.093,0.117,1.982 +Ivory Coast,Sub-Saharan Africa,5.306,0.078,5.460,5.152,8.551,0.644,50.114,0.741,-0.016,0.794,2.430,0.669,0.409,0.052,0.438,0.177,0.092,3.469 +Armenia,Commonwealth of Independent States,5.283,0.058,5.397,5.168,9.487,0.799,67.055,0.825,-0.168,0.629,2.430,0.996,0.758,0.585,0.540,0.079,0.198,2.127 +Nepal,South Asia,5.269,0.070,5.406,5.132,8.120,0.774,64.233,0.782,0.152,0.727,2.430,0.519,0.702,0.496,0.488,0.287,0.135,2.642 +Bulgaria,Central and Eastern Europe,5.266,0.054,5.371,5.160,10.016,0.931,67.000,0.788,-0.096,0.932,2.430,1.181,1.055,0.583,0.494,0.125,0.005,1.823 +Maldives,South Asia,5.198,0.072,5.339,5.057,9.826,0.913,70.600,0.854,0.024,0.825,2.430,1.115,1.015,0.697,0.575,0.204,0.073,1.520 +Azerbaijan,Commonwealth of Independent States,5.171,0.040,5.250,5.091,9.569,0.836,65.656,0.814,-0.223,0.506,2.430,1.025,0.841,0.541,0.526,0.043,0.276,1.919 +Cameroon,Sub-Saharan Africa,5.142,0.074,5.288,4.996,8.189,0.710,53.515,0.731,0.026,0.848,2.430,0.543,0.556,0.159,0.425,0.205,0.058,3.195 +Senegal,Sub-Saharan Africa,5.132,0.068,5.266,4.998,8.118,0.710,59.802,0.695,-0.046,0.801,2.430,0.518,0.558,0.357,0.381,0.158,0.088,3.071 +Albania,Central and Eastern Europe,5.117,0.059,5.234,5.001,9.520,0.697,68.999,0.785,-0.030,0.901,2.430,1.008,0.529,0.646,0.491,0.168,0.024,2.250 +North Macedonia,Central and Eastern Europe,5.101,0.051,5.202,5.001,9.693,0.805,65.474,0.751,0.038,0.905,2.430,1.068,0.772,0.535,0.450,0.212,0.022,2.042 +Ghana,Sub-Saharan Africa,5.088,0.067,5.219,4.958,8.580,0.727,57.586,0.807,0.123,0.848,2.430,0.680,0.595,0.287,0.517,0.268,0.058,2.684 +Niger,Sub-Saharan Africa,5.074,0.102,5.273,4.875,7.098,0.641,53.780,0.806,0.018,0.693,2.430,0.162,0.402,0.167,0.516,0.200,0.157,3.470 +Turkmenistan,Commonwealth of Independent States,5.066,0.036,5.136,4.996,9.629,0.983,62.409,0.877,0.273,0.888,2.430,1.046,1.172,0.439,0.602,0.366,0.033,1.409 +Gambia,Sub-Saharan Africa,5.051,0.089,5.225,4.877,7.686,0.690,55.160,0.697,0.424,0.746,2.430,0.367,0.511,0.210,0.384,0.465,0.123,2.990 +Benin,Sub-Saharan Africa,5.045,0.073,5.189,4.901,8.087,0.489,54.713,0.757,-0.034,0.661,2.430,0.507,0.058,0.196,0.457,0.166,0.178,3.482 +Laos,Southeast Asia,5.030,0.045,5.119,4.941,8.947,0.728,58.968,0.910,0.123,0.658,2.430,0.808,0.598,0.330,0.643,0.268,0.179,2.204 +Bangladesh,South Asia,5.025,0.046,5.115,4.934,8.454,0.693,64.800,0.877,-0.041,0.682,2.430,0.635,0.520,0.514,0.603,0.161,0.164,2.427 +Guinea,Sub-Saharan Africa,4.984,0.090,5.160,4.808,7.838,0.639,55.008,0.697,0.095,0.766,2.430,0.420,0.399,0.206,0.384,0.250,0.111,3.216 +South Africa,Sub-Saharan Africa,4.956,0.060,5.074,4.839,9.403,0.860,56.904,0.749,-0.067,0.860,2.430,0.967,0.895,0.265,0.447,0.144,0.051,2.187 +Turkey,Middle East and North Africa,4.948,0.046,5.038,4.857,10.240,0.822,67.199,0.576,-0.139,0.776,2.430,1.260,0.809,0.590,0.236,0.097,0.104,1.852 +Pakistan,South Asia,4.934,0.068,5.066,4.802,8.458,0.651,58.709,0.726,0.098,0.787,2.430,0.637,0.423,0.322,0.418,0.252,0.097,2.784 +Morocco,Middle East and North Africa,4.918,0.060,5.036,4.800,8.903,0.560,66.208,0.774,-0.236,0.801,2.430,0.792,0.219,0.558,0.477,0.034,0.088,2.749 +Venezuela,Latin America and Caribbean,4.892,0.064,5.017,4.767,9.073,0.861,66.700,0.615,-0.169,0.827,2.430,0.852,0.897,0.574,0.284,0.078,0.072,2.135 +Georgia,Commonwealth of Independent States,4.891,0.054,4.998,4.785,9.585,0.671,64.300,0.783,-0.238,0.655,2.430,1.030,0.470,0.498,0.488,0.032,0.181,2.191 +Algeria,Middle East and North Africa,4.887,0.053,4.991,4.783,9.342,0.802,66.005,0.480,-0.067,0.752,2.430,0.946,0.765,0.552,0.119,0.144,0.120,2.242 +Ukraine,Commonwealth of Independent States,4.875,0.052,4.977,4.773,9.436,0.888,64.902,0.724,-0.011,0.924,2.430,0.979,0.958,0.517,0.417,0.181,0.010,1.813 +Iraq,Middle East and North Africa,4.854,0.059,4.970,4.738,9.240,0.746,60.583,0.630,-0.053,0.875,2.430,0.910,0.638,0.381,0.302,0.153,0.041,2.429 +Gabon,Sub-Saharan Africa,4.852,0.075,4.998,4.706,9.603,0.776,59.962,0.731,-0.200,0.840,2.430,1.037,0.707,0.362,0.424,0.058,0.064,2.201 +Burkina Faso,Sub-Saharan Africa,4.834,0.081,4.993,4.675,7.678,0.672,54.151,0.695,-0.009,0.748,2.430,0.364,0.472,0.179,0.381,0.182,0.122,3.133 +Cambodia,Southeast Asia,4.830,0.067,4.963,4.698,8.360,0.765,62.000,0.959,0.034,0.843,2.430,0.603,0.680,0.426,0.702,0.210,0.061,2.148 +Mozambique,Sub-Saharan Africa,4.794,0.103,4.997,4.592,7.158,0.744,54.706,0.882,0.061,0.684,2.430,0.183,0.634,0.196,0.608,0.228,0.163,2.783 +Nigeria,Sub-Saharan Africa,4.759,0.052,4.861,4.658,8.533,0.740,50.102,0.737,0.037,0.878,2.430,0.663,0.625,0.051,0.433,0.212,0.039,2.736 +Mali,Sub-Saharan Africa,4.723,0.082,4.884,4.563,7.744,0.724,51.969,0.697,-0.036,0.827,2.430,0.387,0.590,0.110,0.384,0.164,0.072,3.016 +Iran,Middle East and North Africa,4.721,0.055,4.828,4.614,9.584,0.710,66.300,0.608,0.218,0.714,2.430,1.030,0.557,0.561,0.275,0.330,0.144,1.823 +Uganda,Sub-Saharan Africa,4.636,0.073,4.780,4.493,7.677,0.781,56.101,0.709,0.122,0.855,2.430,0.364,0.718,0.240,0.398,0.267,0.054,2.596 +Liberia,Sub-Saharan Africa,4.625,0.106,4.833,4.417,7.288,0.720,56.498,0.735,0.050,0.850,2.430,0.228,0.580,0.253,0.430,0.221,0.057,2.857 +Kenya,Sub-Saharan Africa,4.607,0.072,4.747,4.466,8.361,0.688,60.704,0.779,0.287,0.825,2.430,0.603,0.508,0.385,0.483,0.375,0.073,2.180 +Tunisia,Middle East and North Africa,4.596,0.058,4.709,4.484,9.266,0.691,67.201,0.656,-0.201,0.870,2.430,0.919,0.515,0.590,0.334,0.057,0.044,2.138 +Lebanon,Middle East and North Africa,4.584,0.055,4.691,4.477,9.626,0.848,67.355,0.525,-0.073,0.898,2.430,1.045,0.868,0.595,0.175,0.140,0.026,1.736 +Namibia,Sub-Saharan Africa,4.574,0.064,4.700,4.448,9.161,0.818,56.799,0.719,-0.149,0.847,2.430,0.882,0.801,0.262,0.411,0.091,0.059,2.068 +Palestinian Territories,Middle East and North Africa,4.517,0.067,4.649,4.384,8.485,0.826,62.250,0.653,-0.163,0.821,2.430,0.646,0.819,0.434,0.330,0.082,0.075,2.131 +Myanmar,Southeast Asia,4.426,0.052,4.527,4.324,8.541,0.779,59.302,0.876,0.509,0.660,2.430,0.666,0.713,0.341,0.601,0.520,0.178,1.407 +Jordan,Middle East and North Africa,4.395,0.062,4.516,4.273,9.182,0.767,67.000,0.755,-0.167,0.705,2.430,0.890,0.685,0.583,0.455,0.079,0.150,1.553 +Chad,Sub-Saharan Africa,4.355,0.094,4.540,4.171,7.364,0.619,48.478,0.579,0.041,0.807,2.430,0.255,0.353,0.000,0.240,0.215,0.084,3.209 +Sri Lanka,South Asia,4.325,0.066,4.454,4.196,9.470,0.827,67.299,0.841,0.079,0.863,2.430,0.990,0.820,0.593,0.559,0.239,0.049,1.075 +Swaziland,Sub-Saharan Africa,4.308,0.071,4.448,4.168,9.065,0.770,50.833,0.647,-0.185,0.708,2.430,0.849,0.693,0.074,0.323,0.067,0.147,2.155 +Comoros,Sub-Saharan Africa,4.289,0.084,4.454,4.123,8.031,0.626,57.349,0.548,0.082,0.781,2.430,0.488,0.367,0.279,0.202,0.241,0.101,2.610 +Egypt,Middle East and North Africa,4.283,0.045,4.371,4.195,9.367,0.750,61.998,0.749,-0.182,0.795,2.430,0.954,0.647,0.426,0.446,0.069,0.092,1.648 +Ethiopia,Sub-Saharan Africa,4.275,0.051,4.374,4.175,7.694,0.764,59.000,0.752,0.082,0.761,2.430,0.370,0.679,0.331,0.451,0.241,0.114,2.089 +Mauritania,Sub-Saharan Africa,4.227,0.070,4.365,4.090,8.542,0.795,57.161,0.561,-0.106,0.731,2.430,0.666,0.749,0.273,0.218,0.119,0.133,2.069 +Madagascar,Sub-Saharan Africa,4.208,0.072,4.349,4.068,7.396,0.686,59.305,0.552,-0.005,0.803,2.430,0.266,0.503,0.341,0.207,0.185,0.087,2.620 +Togo,Sub-Saharan Africa,4.107,0.077,4.258,3.956,7.362,0.569,54.914,0.619,0.032,0.772,2.430,0.254,0.239,0.203,0.289,0.209,0.107,2.806 +Zambia,Sub-Saharan Africa,4.073,0.069,4.209,3.938,8.145,0.708,55.809,0.782,0.061,0.823,2.430,0.528,0.552,0.231,0.487,0.227,0.074,1.975 +Sierra Leone,Sub-Saharan Africa,3.849,0.077,4.001,3.698,7.434,0.630,51.651,0.717,0.084,0.866,2.430,0.279,0.377,0.100,0.408,0.243,0.047,2.396 +India,South Asia,3.819,0.026,3.869,3.769,8.755,0.603,60.633,0.893,0.089,0.774,2.430,0.741,0.316,0.383,0.622,0.246,0.106,1.405 +Burundi,Sub-Saharan Africa,3.775,0.107,3.985,3.565,6.635,0.490,53.400,0.626,-0.024,0.607,2.430,0.000,0.062,0.155,0.298,0.172,0.212,2.876 +Yemen,Middle East and North Africa,3.658,0.070,3.794,3.521,7.578,0.832,57.122,0.602,-0.147,0.800,2.430,0.329,0.831,0.272,0.268,0.092,0.089,1.776 +Tanzania,Sub-Saharan Africa,3.623,0.071,3.762,3.485,7.876,0.702,57.999,0.833,0.183,0.577,2.430,0.433,0.540,0.300,0.549,0.307,0.231,1.263 +Haiti,Latin America and Caribbean,3.615,0.173,3.953,3.276,7.477,0.540,55.700,0.593,0.422,0.721,2.430,0.294,0.173,0.227,0.257,0.463,0.139,2.060 +Malawi,Sub-Saharan Africa,3.600,0.092,3.781,3.419,6.958,0.537,57.948,0.780,0.038,0.729,2.430,0.113,0.168,0.298,0.484,0.213,0.134,2.190 +Lesotho,Sub-Saharan Africa,3.512,0.120,3.748,3.276,7.926,0.787,48.700,0.715,-0.131,0.915,2.430,0.451,0.731,0.007,0.405,0.103,0.015,1.800 +Botswana,Sub-Saharan Africa,3.467,0.074,3.611,3.322,9.782,0.784,59.269,0.824,-0.246,0.801,2.430,1.099,0.724,0.340,0.539,0.027,0.088,0.648 +Rwanda,Sub-Saharan Africa,3.415,0.068,3.548,3.282,7.676,0.552,61.400,0.897,0.061,0.167,2.430,0.364,0.202,0.407,0.627,0.227,0.493,1.095 +Zimbabwe,Sub-Saharan Africa,3.145,0.058,3.259,3.030,7.943,0.750,56.201,0.677,-0.047,0.821,2.430,0.457,0.649,0.243,0.359,0.157,0.075,1.205 +Afghanistan,South Asia,2.523,0.038,2.596,2.449,7.695,0.463,52.493,0.382,-0.102,0.924,2.430,0.370,0.000,0.126,0.000,0.122,0.010,1.895