Skip to content

Instantly share code, notes, and snippets.

@wutali
Last active September 11, 2021 08:48
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wutali/a5e6b34be1d9357e0b82a064567640b9 to your computer and use it in GitHub Desktop.
Save wutali/a5e6b34be1d9357e0b82a064567640b9 to your computer and use it in GitHub Desktop.
basic-data-analysis.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "basic-data-analysis.ipynb",
"provenance": [],
"collapsed_sections": [],
"authorship_tag": "ABX9TyNVjGFEUhagHgOnEbRrlEbQ",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/wutali/a5e6b34be1d9357e0b82a064567640b9/basic-data-analysis.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_YKOMaiJVQaf"
},
"source": [
"## 高専向けデータ分析基礎\n",
"\n",
"この記事はフラー [Advent Calendar 2020](https://adventar.org/calendars/5034) の5日目の記事です。4日目は [@furusax](https://twitter.com/furusax) さんで「[CloudFormation でドリフトを検出してしまった Aurora MySQL クラスターを再インポートした話](https://furusax0621.hatenablog.com/entry/2020/12/04/000000)」でした。\n",
"\n",
"---\n",
"\n",
"フラーでは高専向けにデータ分析の授業を行っております。\n",
"\n",
"* 苫小牧高専\n",
"* 函館高専\n",
"* 長岡高専 (予定)\n",
"\n",
"データ分析と言っても、とても簡素なものです。全部で3部構成の授業となっており、授業が終わった後には、Pythonの基礎構文と簡単なクローラーの作り方、データの可視化の仕方を学ぶことが出来ます。\n",
"\n",
"1. Jupyter Notebookの使い方とPythonの基礎構文\n",
"2. ライブラリの使い方とCSSセレクタの書き方\n",
"3. クローラーの作成とデータの可視化\n",
"\n",
"それぞれの内容をまとめていこうと思います。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "44H-RL9KWHTl"
},
"source": [
"## Jyupyter Notebookの使い方とPythonの基礎構文\n",
"\n",
"ここではJupyter Notebookのセルの概念とPythonのデータ型や条件分岐、繰り返し文などを学びます。簡単にC言語のコードを紹介しながら、授業を進めています。\n",
"\n",
"初めに、自己紹介と今日やることをMarkdownで書いてもらっています。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "g9--8KO-j-LF"
},
"source": [
"### 自己紹介\n",
"\n",
"* 名前: 藤原敬弘(ふじわらたかひろ)\n",
"* 仕事: フラー株式会社CTO\n",
"* 趣味: クラフトビール\n",
"* Twitter: @wutali"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rbDm81FEk0yJ"
},
"source": [
"### 今日やること\n",
"\n",
"* Pythonのデータ型\n",
"* Pythonの条件分岐と繰り返し\n",
"* Pythonの関数の書き方\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4oSPtMM5Xy2x"
},
"source": [
"次にPythonのデータ型や関数の書き方、繰り返しなどを教えていきます。途中、 *TODO* で書いた部分は課題となっており、高専生同士で相談しながら解いてもらいます。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "jFwgxBxLXEo6"
},
"source": [
"### Pythonのデータ型"
]
},
{
"cell_type": "code",
"metadata": {
"id": "31rPu248mHTL",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "1883cedb-03af-4918-f337-522ae92ccdb4"
},
"source": [
"# 整数型 (int)\n",
"\n",
"a = 1\n",
"a"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"1"
]
},
"metadata": {
"tags": []
},
"execution_count": 2
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "nxCTGtmnmuE4",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "94890795-91b0-4101-f241-90e3dc3515e5"
},
"source": [
"# 浮動小数点 (float)\n",
"a = 2.3\n",
"a"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"2.3"
]
},
"metadata": {
"tags": []
},
"execution_count": 3
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "R4rf4WeGnDY0",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 37
},
"outputId": "a095e4d7-0cc7-4a2c-a126-1f21e646d23e"
},
"source": [
"# 文字列 (str)\n",
"a = \"Hello Hakodate!\"\n",
"a"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "string"
},
"text/plain": [
"'Hello Hakodate!'"
]
},
"metadata": {
"tags": []
},
"execution_count": 4
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "8AKSz_9_nhqZ",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "b5cfa168-ff72-4ceb-8396-8dc6261b1418"
},
"source": [
"# 配列 (list)\n",
"a = [1, 2, 3, 4, 5]\n",
"a"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[1, 2, 3, 4, 5]"
]
},
"metadata": {
"tags": []
},
"execution_count": 5
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "0zGCDne2n14K",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "d9a7c314-34cf-4932-c013-c9eee041ff1b"
},
"source": [
"# マップ (dict)\n",
"a = {\"key1\": \"value1\", \"key2\": \"value2\", \"key3\": \"value3\"}\n",
"a"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}"
]
},
"metadata": {
"tags": []
},
"execution_count": 6
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_lT8NfakpBWT"
},
"source": [
"## 条件分岐と繰り返し"
]
},
{
"cell_type": "code",
"metadata": {
"id": "4JV58Nd3pJ-y",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "279c85a0-359b-48df-8f2e-12327ef84924"
},
"source": [
"# 条件分岐\n",
"# if (true) {\n",
"# printf(\"hello world\"); \n",
"# }\n",
"\n",
"# TODO: 変数aを用意して、変数aが10以上の場合、\n",
"# hello worldが出力される条件分岐を書く\n",
"a = 11\n",
"if a >= 10:\n",
" print(\"hello world\")"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"hello world\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "qzX4hQzkqrdI",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "78d53ebe-ab87-4037-a6fe-40731eacacc2"
},
"source": [
"# 繰り返し\n",
"# for (int i = 0; i < 10; i++) {\n",
"# printf(\"%d\", i);\n",
"# }\n",
"\n",
"# TODO1: rangeをlist型のデータに変えて、繰り返しを実行してみる\n",
"# TODO2: rangeをstr型のデータに変えて、繰り返しを実行してみる\n",
"a = [1, 2, 3]\n",
"b = \"Hello World!\" \n",
"for i in b:\n",
" print(i)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"H\n",
"e\n",
"l\n",
"l\n",
"o\n",
" \n",
"W\n",
"o\n",
"r\n",
"l\n",
"d\n",
"!\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "VutD34HVs3Xa",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "3697cfd5-29d2-458a-c94e-fcbf1996a761"
},
"source": [
"for i in range(3):\n",
" print(i)\n",
"\n",
"for i in [0, 1, 2]:\n",
" print(i)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"0\n",
"1\n",
"2\n",
"0\n",
"1\n",
"2\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1ihx56fjtI6O"
},
"source": [
"## 関数の書き方"
]
},
{
"cell_type": "code",
"metadata": {
"id": "21LVtuSktLkW",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "8ba1ef7d-0fad-4880-882a-6f7a66a5972b"
},
"source": [
"# int add(int a, int b) {\n",
"# return a + b;\n",
"# }\n",
"\n",
"# TODO1: 掛け算するmulti関数を定義して、実行してみる\n",
"# TODO2: list型のデータを受け取って、その合計値を返すsum関数を定義して、\n",
"# 実行してみる\n",
"def add(a, b):\n",
" return a + b\n",
"\n",
"add(102, 2)"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"104"
]
},
"metadata": {
"tags": []
},
"execution_count": 10
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DIZ3dYNBYL7W"
},
"source": [
"ここまでで1日目 (90分) の授業が終了です。基礎はそこそこにして、実際に動くプログラムを書いていきます。また、授業はライブコーディング形式で行っており、自分が書いたコードを書き写してもらっています。\n",
"\n",
"その時の気分で課題を変えたりしているので、上記は例です。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "C3RUa7U7XoVY"
},
"source": [
"## ライブラリの使い方とCSSセレクタの書き方\n",
"\n",
"requestsライブラリの使い方、Beautiful Soupライブラリの使い方を教えます。フラーのニュースサイトのクローリングとデータ可視化を行ってもらいます。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0vvexCFkDtHH"
},
"source": [
"## 今日やること\n",
"\n",
"* フラーのニュースサイトをクローリングしてみる\n",
"* 酒造免許をクローリングしてみる\n",
"* グラフ化してみる"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "BTM0Nt7ZaLY0"
},
"source": [
"### フラーのニュースサイトを取得する"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "BeVEm6MfD6PM",
"outputId": "78223936-e0cf-40d8-9fce-803c53857619"
},
"source": [
"import requests\n",
"\n",
"res = requests.get(\"https://fuller-inc.com/news/\")\n",
"res"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<Response [200]>"
]
},
"metadata": {
"tags": []
},
"execution_count": 2
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CKALW7l9aOfk"
},
"source": [
"### HTMLをパースする"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "cgGd5HveESvl",
"outputId": "065c9644-dac0-4d5a-ab6e-be5f453b4ec9"
},
"source": [
"from bs4 import BeautifulSoup\n",
"\n",
"soup = BeautifulSoup(res.content)\n",
"soup"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<!DOCTYPE html>\n",
"<html lang=\"ja\">\n",
"<head>\n",
"<script>(function (w, d, s, l, i) {\n",
" w[l] = w[l] || [];\n",
" w[l].push({\n",
" 'gtm.start': new Date().getTime(), event: 'gtm.js'\n",
" });\n",
" var f = d.getElementsByTagName(s)[0],\n",
" j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : '';\n",
" j.async = true;\n",
" j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl + '&gtm_auth=_ZgIb2eTMTwaqb2s0D_nZw&gtm_preview=env-15&gtm_cookies_win=x';\n",
" f.parentNode.insertBefore(j, f);\n",
" })(window, document, 'script', 'dataLayer', 'GTM-NCX3698');</script>\n",
"<script src=\"/modernizr-custom.js\"></script>\n",
"<title>ニュース - フラー株式会社</title>\n",
"<meta content=\"フラーは『世界一、ヒトを惹きつける会社を創る。』というユメに挑戦し続け、アプリとデータをテーマに事業を展開するIT企業です。柏の葉キャンパスに本社を構え、新潟・韓国・東京にも拠点があります。\" name=\"description\"/>\n",
"<meta charset=\"utf-8\"/>\n",
"<meta content=\"IE=edge\" http-equiv=\"X-UA-Compatible\"/>\n",
"<meta content=\"width=device-width, initial-scale=1, viewport-fit=cover\" name=\"viewport\"/>\n",
"<meta content=\"https://fuller-inc.com/news/\" property=\"og:url\"/>\n",
"<meta content=\"ニュース - フラー株式会社\" property=\"og:title\"/>\n",
"<meta content=\"website\" property=\"og:type\"/>\n",
"<meta content=\"フラー株式会社\" property=\"og:site_name\"/>\n",
"<meta content=\"ja_JP\" property=\"og:locale\"/>\n",
"<meta content=\"フラーは『世界一、ヒトを惹きつける会社を創る。』というユメに挑戦し続け、アプリとデータをテーマに事業を展開するIT企業です。柏の葉キャンパスに本社を構え、新潟・韓国・東京にも拠点があります。\" property=\"og:description\"/>\n",
"<meta content=\"ニュース - フラー株式会社\" name=\"twitter:title\"/>\n",
"<meta content=\"フラーは『世界一、ヒトを惹きつける会社を創る。』というユメに挑戦し続け、アプリとデータをテーマに事業を展開するIT企業です。柏の葉キャンパスに本社を構え、新潟・韓国・東京にも拠点があります。\" name=\"twitter:description\"/>\n",
"<meta content=\"summary_large_image\" name=\"twitter:card\"/>\n",
"<meta content=\"@fuller_inc\" name=\"twitter:site\"/>\n",
"<meta content=\"https://fuller-inc.com/news/ogp.jpeg\" property=\"og:image\"/>\n",
"<meta content=\"1710\" property=\"og:image:width\"/>\n",
"<meta content=\"900\" property=\"og:image:height\"/>\n",
"<meta content=\"https://fuller-inc.com/news/ogp.jpeg\" name=\"twitter:image\"/>\n",
"<meta content=\"#ffffff\" name=\"theme-color\"/>\n",
"<link href=\"/apple-touch-icon.png\" rel=\"apple-touch-icon\" sizes=\"180x180\"/>\n",
"<link href=\"/favicon-32x32.png\" rel=\"icon\" sizes=\"32x32\" type=\"image/png\"/>\n",
"<link href=\"/favicon-16x16.png\" rel=\"icon\" sizes=\"16x16\" type=\"image/png\"/>\n",
"<link href=\"/manifest.json\" rel=\"manifest\"/>\n",
"<link color=\"#2a5caa\" href=\"/safari-pinned-tab.svg\" rel=\"mask-icon\"/>\n",
"<script type=\"application/ld+json\">\n",
" {\n",
" \"@context\": \"http://schema.org\",\n",
" \"@type\": \"Organization\",\n",
" \"url\": \"https://fuller-inc.com\",\n",
" \"name\": \"Fuller, Inc.\",\n",
" \"logo\": \"https://fuller-inc.com/apple-touch-icon.png\",\n",
" \"sameAs\": [\n",
" \"https://www.facebook.com/fuller.official\",\n",
" \"https://twitter.com/fuller_inc\"\n",
" ]\n",
" }\n",
" </script>\n",
"<link as=\"style\" href=\"/main.css?1605577977\" rel=\"preload\"/>\n",
"<link as=\"script\" href=\"/main.js?1605577977\" rel=\"preload\"/>\n",
"<link href=\"/main.css?1605577977\" id=\"main-style\" rel=\"stylesheet\"/>\n",
"</head>\n",
"<body>\n",
"<noscript>\n",
"<iframe height=\"0\" src=\"https://www.googletagmanager.com/ns.html?id=GTM-NCX3698&amp;gtm_auth=_ZgIb2eTMTwaqb2s0D_nZw&amp;gtm_preview=env-15&amp;gtm_cookies_win=x\" style=\"display:none;visibility:hidden\" width=\"0\"></iframe>\n",
"</noscript>\n",
"<section class=\"hero is-halfheight center-cover\" style=\"background-image: linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.62)), url(/news/header.jpeg);\">\n",
"<div class=\"hero-head\">\n",
"<nav class=\"navbar has-change-on-scroll-white-to-black is-fixed-top\">\n",
"<div class=\"navbar-brand\">\n",
"<a class=\"navbar-item fuller-logo\" href=\"/\">\n",
"<div style=\"width: 130px; height: 25px;\">\n",
"<svg data-name=\"レイヤー 1\" id=\"レイヤー_1\" viewbox=\"0 0 155.57 30\" xmlns=\"http://www.w3.org/2000/svg\"><defs><style>.cls-1{fill:#fff;}</style></defs><title>アートボード 2</title><path class=\"cls-1\" d=\"M76.87,17c0,1.38-.43,3.89-3.25,3.89s-3.31-2.5-3.31-3.87V4.76h-4a.84.84,0,0,0-.83.85v12c0,2.33.88,7.58,8.05,7.58s8.21-6,8.21-7.52V4.76H76.87Z\"></path><path class=\"cls-1\" d=\"M120.8,23.21v1a.84.84,0,0,0,.84.83h12.24V20.86H126.5a.84.84,0,0,1-.83-.84V16.59h6.54a.83.83,0,0,0,.83-.83V12.39h-6.63a.84.84,0,0,1-.74-.84V10.21h0V9h8.21V4.76H120.8Z\"></path><path class=\"cls-1\" d=\"M91.45,4.76H86.59V24.22a.84.84,0,0,0,.84.83h11.4V20.86H91.45Z\"></path><path class=\"cls-1\" d=\"M48.18,4.76a.85.85,0,0,0-.84.84V25.05h4.87V18.51a.84.84,0,0,1,.83-.84h5.71a.84.84,0,0,0,.84-.83V13.49H52.21V9.79A.84.84,0,0,1,53,9h7.38V4.76Z\"></path><path class=\"cls-1\" d=\"M108.56,4.76h-4.87V24.22a.84.84,0,0,0,.84.83h11.41V20.86h-7.38Z\"></path><path class=\"cls-1\" d=\"M149.87,16.65a6.46,6.46,0,0,0-3.49-11.89h-7.63V24.22a.83.83,0,0,0,.84.83h4V17.67h1.65l4.58,7.38h5.73Zm-4.25-3.17h-2V9h2a2.27,2.27,0,1,1,0,4.53Z\"></path><path class=\"cls-1\" d=\"M25.09,12.88a1.65,1.65,0,0,1,1.76.17l3.22,2.76a1.08,1.08,0,0,0,1.53-.12L34,12.85a1.09,1.09,0,0,0-.11-1.53l-4-3.45a3.65,3.65,0,0,1-1-1.78l-1-5.2A1.09,1.09,0,0,0,26.63,0L23,.71A1.09,1.09,0,0,0,22.08,2l.79,4.16a1.67,1.67,0,0,1-.74,1.62l-4,2.32a2.08,2.08,0,0,1-1.88,0l-4-2.32a1.64,1.64,0,0,1-.74-1.62L12.22,2A1.09,1.09,0,0,0,11.35.71L7.67,0A1.09,1.09,0,0,0,6.4.89l-1,5.2a3.57,3.57,0,0,1-1,1.78l-4,3.45a1.08,1.08,0,0,0-.12,1.53L2.7,15.69a1.09,1.09,0,0,0,1.54.12l3.21-2.76a1.65,1.65,0,0,1,1.76-.17l4,2.33a2.09,2.09,0,0,1,.94,1.63V21.5a1.64,1.64,0,0,1-1,1.45l-4,1.4a1.09,1.09,0,0,0-.67,1.39l1.24,3.53a1.09,1.09,0,0,0,1.39.67l5-1.75a3.58,3.58,0,0,1,2.05,0l5,1.75a1.09,1.09,0,0,0,1.39-.67l1.24-3.53a1.09,1.09,0,0,0-.67-1.39l-4-1.4a1.64,1.64,0,0,1-1-1.45V16.84a2.12,2.12,0,0,1,.94-1.63Z\"></path></svg>\n",
"</div>\n",
"</a>\n",
"<span class=\"navbar-burger burger\" data-target=\"navbar-menu-hero\">\n",
"<span></span>\n",
"<span></span>\n",
"<span></span>\n",
"</span>\n",
"</div>\n",
"<div class=\"navbar-menu\" id=\"navbar-menu-hero\">\n",
"<div class=\"navbar-end\">\n",
"<a class=\" has-margin-vertical-5 navbar-item is-fuller-navbar-item is-letter-spacing-2px has-text-weight-bold\" href=\"/corporate/\">\n",
" 企業情報\n",
" </a>\n",
"<a class=\" has-margin-vertical-5 navbar-item is-fuller-navbar-item is-letter-spacing-2px has-text-weight-bold\" href=\"/business/\">\n",
" 事業内容\n",
" </a>\n",
"<a class=\" has-margin-vertical-5 navbar-item is-fuller-navbar-item is-letter-spacing-2px has-text-weight-bold\" href=\"/approach/\">\n",
" 取り組み\n",
" </a>\n",
"<a class=\"is-active has-margin-vertical-5 navbar-item is-fuller-navbar-item is-letter-spacing-2px has-text-weight-bold\" href=\"/news/\">\n",
" ニュース\n",
" </a>\n",
"<a class=\" has-margin-vertical-5 navbar-item is-fuller-navbar-item is-letter-spacing-2px has-text-weight-bold\" href=\"/story/\">\n",
" ストーリー\n",
" </a>\n",
"<a class=\" has-margin-vertical-5 navbar-item is-fuller-navbar-item is-letter-spacing-2px has-text-weight-bold\" href=\"/fulife/\">\n",
" フライフ\n",
" </a>\n",
"<a class=\" has-margin-vertical-5 navbar-item is-fuller-navbar-item is-letter-spacing-2px has-text-weight-bold\" href=\"/career/\">\n",
" 採用情報\n",
" </a>\n",
"</div>\n",
"</div>\n",
"</nav>\n",
"</div>\n",
"<div class=\"hero-body\">\n",
"<div class=\"container has-text-centered\">\n",
"<h1 class=\"has-text-weight-bold has-text-white is-size-4 is-letter-spacing-4px\">\n",
" ニュース\n",
" </h1>\n",
"<h2 class=\"has-text-weight-bold has-text-white is-size-7 has-margin-top-3 is-letter-spacing-2px\">\n",
" フラーの様々なニュースをお届け。\n",
" </h2>\n",
"</div>\n",
"</div>\n",
"</section>\n",
"<section class=\"section\">\n",
"<div class=\"container\">\n",
"<div class=\"columns is-multiline is-centered\">\n",
"<div class=\"column is-one-third\">\n",
"<a href=\"/news/2020/11/niigata-headquarter/\">\n",
"<div class=\"card is-full-height\">\n",
"<div class=\"card-image\">\n",
"<figure class=\"image is-16by9\">\n",
"<img class=\"is-cover\" src=\"/news/2020/11/niigata-headquarter/thumbnail_huc5de0a07fd31ad9bbe36ee678ed88566_819825_1200x630_resize_q75_box.jpeg\"/>\n",
"</figure>\n",
"</div>\n",
"<div class=\"card-content\">\n",
"<div class=\"card-top-content\">\n",
"<div class=\"tag-for-xxx\">\n",
"<span>リリース</span>\n",
"</div>\n",
"<div class=\"is-date-text\">\n",
" 2020年11月16日\n",
" </div>\n",
"</div>\n",
"<h2 class=\"is-news-title\">\n",
" フラー株式会社 本店移転のお知らせ\n",
" </h2>\n",
"<p class=\"has-padding-vertical-5 is-read-more\">\n",
" さらに詳しく 〉\n",
" </p>\n",
"</div>\n",
"</div>\n",
"</a>\n",
"</div>\n",
"<div class=\"column is-one-third\">\n",
"<a href=\"/news/2020/11/kosencaravan2020-1111/\">\n",
"<div class=\"card is-full-height\">\n",
"<div class=\"card-image\">\n",
"<figure class=\"image is-16by9\">\n",
"<img class=\"is-cover\" src=\"/news/2020/11/kosencaravan2020-1111/thumbnail_hueab7309064aa33b732383879961dd314_251967_600x315_resize_box_2.png\"/>\n",
"</figure>\n",
"</div>\n",
"<div class=\"card-content\">\n",
"<div class=\"card-top-content\">\n",
"<div class=\"tag-for-xxx\">\n",
"<span>リリース</span>\n",
"</div>\n",
"<div class=\"is-date-text\">\n",
" 2020年11月11日\n",
" </div>\n",
"</div>\n",
"<h2 class=\"is-news-title\">\n",
" フラー、全国の高専生を対象にしたオンラインキャリアイベント「高専キャラバン 2020 冬の陣」開催を決定!\n",
" </h2>\n",
"<p class=\"has-padding-vertical-5 is-read-more\">\n",
" さらに詳しく 〉\n",
" </p>\n",
"</div>\n",
"</div>\n",
"</a>\n",
"</div>\n",
"<div class=\"column is-one-third\">\n",
"<a href=\"/news/2020/10/niigata-nagaoka-kosen-prof/\">\n",
"<div class=\"card is-full-height\">\n",
"<div class=\"card-image\">\n",
"<figure class=\"image is-16by9\">\n",
"<img class=\"is-cover\" src=\"/news/2020/10/niigata-nagaoka-kosen-prof/thumbnail_hu0f092d082311b4b780f5b0bc91e7feca_2221845_3000x1575_resize_q75_box.jpeg\"/>\n",
"</figure>\n",
"</div>\n",
"<div class=\"card-content\">\n",
"<div class=\"card-top-content\">\n",
"<div class=\"tag-for-xxx\">\n",
"<span>リリース</span>\n",
"</div>\n",
"<div class=\"is-date-text\">\n",
" 2020年10月20日\n",
" </div>\n",
"</div>\n",
"<h2 class=\"is-news-title\">\n",
" フラー代表取締役会長 渋谷、長岡高専の客員教授に就任\n",
" </h2>\n",
"<p class=\"has-padding-vertical-5 is-read-more\">\n",
" さらに詳しく 〉\n",
" </p>\n",
"</div>\n",
"</div>\n",
"</a>\n",
"</div>\n",
"<div class=\"column is-one-third\">\n",
"<a href=\"/news/2020/10/team-change-announcement/\">\n",
"<div class=\"card is-full-height\">\n",
"<div class=\"card-image\">\n",
"<figure class=\"image is-16by9\">\n",
"<img class=\"is-cover\" src=\"/news/2020/10/team-change-announcement/thumbnail_hu8518e79cdda948a7ad9007db9ed30243_3707784_1500x844_resize_q75_box.jpeg\"/>\n",
"</figure>\n",
"</div>\n",
"<div class=\"card-content\">\n",
"<div class=\"card-top-content\">\n",
"<div class=\"tag-for-xxx\">\n",
"<span>リリース</span>\n",
"</div>\n",
"<div class=\"is-date-text\">\n",
" 2020年10月01日\n",
" </div>\n",
"</div>\n",
"<h2 class=\"is-news-title\">\n",
" フラー株式会社 会長及び社長就任のお知らせ\n",
" </h2>\n",
"<p class=\"has-padding-vertical-5 is-read-more\">\n",
" さらに詳しく 〉\n",
" </p>\n",
"</div>\n",
"</div>\n",
"</a>\n",
"</div>\n",
"<div class=\"column is-one-third\">\n",
"<a href=\"/news/2020/09/2020-09-29-tbs-app-ape-use-case/\">\n",
"<div class=\"card is-full-height\">\n",
"<div class=\"card-image\">\n",
"<figure class=\"image is-16by9\">\n",
"<img class=\"is-cover\" src=\"/news/2020/09/2020-09-29-tbs-app-ape-use-case/thumbnail_hud5519d2c3bc71c395724fcdb42b10e6a_94475_800x450_resize_box_2.png\"/>\n",
"</figure>\n",
"</div>\n",
"<div class=\"card-content\">\n",
"<div class=\"card-top-content\">\n",
"<div class=\"tag-for-xxx\">\n",
"<span>リリース</span>\n",
"</div>\n",
"<div class=\"is-date-text\">\n",
" 2020年09月29日\n",
" </div>\n",
"</div>\n",
"<h2 class=\"is-news-title\">\n",
" TBSが国内No.1 アプリ分析ツール「App Ape」導入\n",
" </h2>\n",
"<p class=\"has-padding-vertical-5 is-read-more\">\n",
" さらに詳しく 〉\n",
" </p>\n",
"</div>\n",
"</div>\n",
"</a>\n",
"</div>\n",
"<div class=\"column is-one-third\">\n",
"<a href=\"/news/2020/09/officialclubpartner-20200921/\">\n",
"<div class=\"card is-full-height\">\n",
"<div class=\"card-image\">\n",
"<figure class=\"image is-16by9\">\n",
"<img class=\"is-cover\" src=\"/news/2020/09/officialclubpartner-20200921/thumbnail_hu87548c528f0a46b9981a5c6654ef04dc_131964_800x450_resize_q75_box.jpeg\"/>\n",
"</figure>\n",
"</div>\n",
"<div class=\"card-content\">\n",
"<div class=\"card-top-content\">\n",
"<div class=\"tag-for-xxx\">\n",
"<span>リリース</span>\n",
"</div>\n",
"<div class=\"is-date-text\">\n",
" 2020年09月21日\n",
" </div>\n",
"</div>\n",
"<h2 class=\"is-news-title\">\n",
" フラー、アルビレックス新潟とオフィシャルクラブパートナー契約を締結\n",
" </h2>\n",
"<p class=\"has-padding-vertical-5 is-read-more\">\n",
" さらに詳しく 〉\n",
" </p>\n",
"</div>\n",
"</div>\n",
"</a>\n",
"</div>\n",
"<div class=\"column is-one-third\">\n",
"<a href=\"/news/2020/09/2020-09-11-ntt-data-app-ape-use-case/\" rel=\"noopener noreferrer\" target=\"_blank\">\n",
"<div class=\"card is-full-height\">\n",
"<div class=\"card-image\">\n",
"<figure class=\"image is-16by9\">\n",
"<img class=\"is-cover\" src=\"/news/2020/09/2020-09-11-ntt-data-app-ape-use-case/thumbnail_huf17ca9bbb9c2394dc528156bafb77001_88073_800x450_resize_box_2.png\"/>\n",
"</figure>\n",
"</div>\n",
"<div class=\"card-content\">\n",
"<div class=\"card-top-content\">\n",
"<div class=\"tag-for-xxx\">\n",
"<span>メディア</span>\n",
"</div>\n",
"<div class=\"is-date-text\">\n",
" 2020年09月11日\n",
" </div>\n",
"</div>\n",
"<h2 class=\"is-news-title\">\n",
" NTTデータにおけるエンタープライズ向けモバイルアプリ開発をサポート\n",
" </h2>\n",
"<p class=\"has-padding-vertical-5 is-read-more\">\n",
" さらに詳しく 〉\n",
" </p>\n",
"</div>\n",
"</div>\n",
"</a>\n",
"</div>\n",
"<div class=\"column is-one-third\">\n",
"<a href=\"/news/2020/09/nva/\">\n",
"<div class=\"card is-full-height\">\n",
"<div class=\"card-image\">\n",
"<figure class=\"image is-16by9\">\n",
"<img class=\"is-cover\" src=\"/news/2020/09/nva/thumbnail_hue925fc66d93cb127a07d07c9acff29ad_162726_932x493_resize_q75_box.jpeg\"/>\n",
"</figure>\n",
"</div>\n",
"<div class=\"card-content\">\n",
"<div class=\"card-top-content\">\n",
"<div class=\"tag-for-xxx\">\n",
"<span>リリース</span>\n",
"</div>\n",
"<div class=\"is-date-text\">\n",
" 2020年09月10日\n",
" </div>\n",
"</div>\n",
"<h2 class=\"is-news-title\">\n",
" フラー代表取締役 渋谷が新潟ベンチャー協会代表理事に就任\n",
" </h2>\n",
"<p class=\"has-padding-vertical-5 is-read-more\">\n",
" さらに詳しく 〉\n",
" </p>\n",
"</div>\n",
"</div>\n",
"</a>\n",
"</div>\n",
"<div class=\"column is-one-third\">\n",
"<a href=\"/news/2020/08/2020-08-11-united-app-ape-use-case/\" rel=\"noopener noreferrer\" target=\"_blank\">\n",
"<div class=\"card is-full-height\">\n",
"<div class=\"card-image\">\n",
"<figure class=\"image is-16by9\">\n",
"<img class=\"is-cover\" src=\"/news/2020/08/2020-08-11-united-app-ape-use-case/thumbnail_hudc4d7c1404173ce2e95506845634889e_114215_800x450_resize_box_2.png\"/>\n",
"</figure>\n",
"</div>\n",
"<div class=\"card-content\">\n",
"<div class=\"card-top-content\">\n",
"<div class=\"tag-for-xxx\">\n",
"<span>メディア</span>\n",
"</div>\n",
"<div class=\"is-date-text\">\n",
" 2020年08月11日\n",
" </div>\n",
"</div>\n",
"<h2 class=\"is-news-title\">\n",
" ユナイテッドが国内No.1 アプリ分析ツール「App Ape」導入\n",
" </h2>\n",
"<p class=\"has-padding-vertical-5 is-read-more\">\n",
" さらに詳しく 〉\n",
" </p>\n",
"</div>\n",
"</div>\n",
"</a>\n",
"</div>\n",
"<div class=\"has-margin-vertical-8 is-hidden-mobile\">\n",
"<nav class=\"pagination is-rounded has-text-centered\">\n",
"<ul class=\"pagination-list is-rounded\" style=\"justify-content: center;\">\n",
"<li><a class=\"pagination-link is-news-page-nav is-current\" href=\"/news/\">1</a></li>\n",
"<li><a class=\"pagination-link is-news-page-nav\" href=\"/news/page/2/\">2</a></li>\n",
"<li><a class=\"pagination-link is-news-page-nav\" href=\"/news/page/3/\">3</a></li>\n",
"<li><p class=\"pagination-ellipsis is-news-page-nav\">…</p></li>\n",
"<li><a class=\"pagination-link is-news-page-nav\" href=\"/news/page/24/\">24</a></li>\n",
"<li>\n",
"<a class=\"pagination-next is-news-page-nav-button\" href=\"/news/page/2/\">→</a>\n",
"</li>\n",
"</ul>\n",
"</nav>\n",
"</div>\n",
"<div class=\"has-margin-vertical-8 is-hidden-tablet\">\n",
"<nav class=\"pagination is-rounded has-text-centered\">\n",
"<ul class=\"pagination-list is-rounded\" style=\"justify-content: center;\">\n",
"<li><a class=\"pagination-link is-news-page-nav is-current\" href=\"/news/\">1</a></li>\n",
"<li><a class=\"pagination-link is-news-page-nav\" href=\"/news/page/2/\">2</a></li>\n",
"<li><a class=\"pagination-link is-news-page-nav\" href=\"/news/page/3/\">3</a></li>\n",
"<li>\n",
"<a class=\"pagination-next is-news-page-nav-button\" href=\"/news/page/2/\">→</a>\n",
"</li>\n",
"</ul>\n",
"</nav>\n",
"</div>\n",
"</div>\n",
"</div>\n",
"</section>\n",
"<a class=\"career-banner hero is-medium is-primary has-bg-img\" href=\"/career/\">\n",
"<div class=\"hero-body\">\n",
"<div class=\"container has-text-white\">\n",
"<h1 class=\"is-title has-text-weight-bold has-text-white has-padding-top-9 is-size-3 is-size-5-mobile is-letter-spacing-5px\">モバイルの未来を共に創る仲間、募集中。</h1>\n",
"<h2 class=\"has-padding-top-4 has-text-weight-bold has-padding-bottom-10 is-size-5 is-size-6-mobile\">採用情報へ 〉</h2>\n",
"</div>\n",
"</div>\n",
"</a>\n",
"<footer class=\"footer fullerblue-gradation-bg\">\n",
"<div class=\"container\">\n",
"<div class=\"content has-text-centered\">\n",
"<div class=\"has-padding-top-5 has-padding-bottom-10\">\n",
"<div class=\"columns is-centered\">\n",
"<div class=\"column is-te\">\n",
"<a href=\"/\">\n",
"<img src=\"/img/logo.svg\" style=\"max-width: 200px;\"/>\n",
"</a>\n",
"</div>\n",
"</div>\n",
"</div>\n",
"<div class=\"columns is-multiline is-centered\">\n",
"<div class=\"column is-narrow\">\n",
"<a class=\"button is-rounded is-lang-link\" href=\"https://en.fuller-inc.com/\"> English </a>\n",
"</div>\n",
"<div class=\"column is-narrow\">\n",
"<a class=\"button is-rounded is-lang-link\" href=\"https://ko.fuller-inc.com/\"> 한국어 </a>\n",
"</div>\n",
"</div>\n",
" \n",
" <div class=\"columns is-multiline is-centered\">\n",
"<div class=\"column is-narrow\">\n",
"<a class=\"has-text-white\" href=\"/docs/privacy-policy/\"> プライバシーポリシー </a>\n",
"</div>\n",
"<div class=\"column is-narrow\">\n",
"<a class=\"has-text-white\" href=\"/docs/terms/\"> サイト利用規約 </a>\n",
"</div>\n",
"<div class=\"column is-narrow\">\n",
"<a class=\"has-text-white\" href=\"/contact-us/\"> お問い合わせ </a>\n",
"</div>\n",
"</div>\n",
"<div class=\"has-margin-vertical-7 align-items-horizontal-centered\">\n",
"<a class=\"has-margin-horizontal-5\" href=\"https://www.facebook.com/fuller.official/\">\n",
"<img class=\"image is-32x32\" src=\"/img/facebook.svg\"/>\n",
"</a>\n",
"<a class=\"has-margin-horizontal-5\" href=\"https://www.instagram.com/fulife_official/\">\n",
"<img class=\"image is-32x32\" src=\"/img/instagram.svg\"/>\n",
"</a>\n",
"<a class=\"has-margin-horizontal-5\" href=\"https://www.youtube.com/channel/UCzqj8Da2DVcqWdPvpc5_tqg\">\n",
"<img class=\"image is-32x32\" src=\"/img/you-tube.svg\"/>\n",
"</a>\n",
"<a class=\"has-margin-horizontal-5\" href=\"https://twitter.com/fuller_inc\">\n",
"<img class=\"image is-32x32\" src=\"/img/twitter.svg\"/>\n",
"</a>\n",
"</div>\n",
"<div>\n",
"<p class=\"has-text-white\">Copyright © 2018 Fuller, Inc.</p>\n",
"</div>\n",
"</div>\n",
"</div>\n",
"</footer>\n",
"<script src=\"/main.js?1605577982\"></script>\n",
"</body>\n",
"</html>"
]
},
"metadata": {
"tags": []
},
"execution_count": 5
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "sKAcUCS0aSGg"
},
"source": [
"### CSSセレクタについて"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "KMtWlKr7EqqO",
"outputId": "cf3b1d57-4cdb-4953-a939-09e26d587af7"
},
"source": [
"from bs4 import BeautifulSoup\n",
"\n",
"practise_soup = BeautifulSoup(\"\"\"\n",
"<html>\n",
" <head>\n",
" <title>こんにちは</title>\n",
" </head>\n",
"<body>\n",
" <h1>これはタイトルです</h1>\n",
" <div>\n",
" <div class=\"news\">\n",
" <h1>これはニュース1です</h1>\n",
" <p>これは説明です</p>\n",
" </div>\n",
" <div class=\"news\">\n",
" <h1>これはニュース2です</h1>\n",
" <p>これは説明です</p>\n",
" </div>\n",
" <div class=\"news\">\n",
" <h1>これはニュース3です</h1>\n",
" <p>これは説明です</p>\n",
" </div>\n",
" </div>\n",
"</body>\n",
"</html>\n",
"\"\"\")\n",
"\n",
"# headのtitleを取り出してみる\n",
"print(practise_soup.select_one(\"head title\").text)\n",
"\n",
"# newsのタイトルを取り出してみる\n",
"print(practise_soup.select(\".news\"))\n",
"\n",
"# TODO1: newsクラスの中のh1だけを取り出すCSSセレクタを書く\n",
"print(practise_soup.select(\".news h1\"))\n",
"\n",
"# TODO2: TODO1の結果をループで回して、タイトルのテキストだけprintする\n",
"for h1 in practise_soup.select(\".news h1\"):\n",
" print(h1.text)\n",
"\n",
"# 期待する出力 (下記が出力される)\n",
"# これはニュース1です\n",
"# これはニュース2です\n",
"# これはニュース3です"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"こんにちは\n",
"[<div class=\"news\">\n",
"<h1>これはニュース1です</h1>\n",
"<p>これは説明です</p>\n",
"</div>, <div class=\"news\">\n",
"<h1>これはニュース2です</h1>\n",
"<p>これは説明です</p>\n",
"</div>, <div class=\"news\">\n",
"<h1>これはニュース3です</h1>\n",
"<p>これは説明です</p>\n",
"</div>]\n",
"[<h1>これはニュース1です</h1>, <h1>これはニュース2です</h1>, <h1>これはニュース3です</h1>]\n",
"これはニュース1です\n",
"これはニュース2です\n",
"これはニュース3です\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "5sM07MY5aYDo"
},
"source": [
"### データを取得してみる"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "uYslXT1_I0Lu",
"outputId": "cbae4830-b4ca-43bd-b2d8-7b77e29a0303"
},
"source": [
"news_data = []\n",
"for content in soup.select(\".card-content\"):\n",
" # 日付を取得する\n",
" date = content.select_one(\".is-date-text\").text.strip()\n",
" # TODO: タイトルをprintするコードを追加する\n",
" title = content.select_one(\"h2\").text.strip()\n",
" # 取り出したデータを保存しておく\n",
" news_data.append({\n",
" \"date\": date,\n",
" \"title\": title,\n",
" })\n",
"news_data"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[{'date': '2020年11月16日', 'title': 'フラー株式会社 本店移転のお知らせ'},\n",
" {'date': '2020年11月11日',\n",
" 'title': 'フラー、全国の高専生を対象にしたオンラインキャリアイベント「高専キャラバン 2020 冬の陣」開催を決定!'},\n",
" {'date': '2020年10月20日', 'title': 'フラー代表取締役会長 渋谷、長岡高専の客員教授に就任'},\n",
" {'date': '2020年10月01日', 'title': 'フラー株式会社 会長及び社長就任のお知らせ'},\n",
" {'date': '2020年09月29日', 'title': 'TBSが国内No.1 アプリ分析ツール「App Ape」導入'},\n",
" {'date': '2020年09月21日', 'title': 'フラー、アルビレックス新潟とオフィシャルクラブパートナー契約を締結'},\n",
" {'date': '2020年09月11日', 'title': 'NTTデータにおけるエンタープライズ向けモバイルアプリ開発をサポート'},\n",
" {'date': '2020年09月10日', 'title': 'フラー代表取締役 渋谷が新潟ベンチャー協会代表理事に就任'},\n",
" {'date': '2020年08月11日', 'title': 'ユナイテッドが国内No.1 アプリ分析ツール「App Ape」導入'}]"
]
},
"metadata": {
"tags": []
},
"execution_count": 26
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MrVi-qNCaaTo"
},
"source": [
"### データを加工してみる"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 507
},
"id": "VbKKjjESKte6",
"outputId": "590737e1-855a-4d8c-abb0-5f9d829f2938"
},
"source": [
"import pandas as pd\n",
"\n",
"# 入力サンプル: d = \"2020年11月10日\"\n",
"# 出力サンプル: \"2020年11月\"\n",
"def parse_month(d):\n",
" # TODO: 日付を取り除くコードを書く\n",
" parts = d.split(\"月\") \n",
" return parts[0] + \"月\" # parts[:-3]\n",
"\n",
"print(parse_month(\"2020年11月10日\"))\n",
"\n",
"# TODO: news_dataをDataFrameに変換するコードを追加する\n",
"df = pd.DataFrame(news_data)\n",
"df[\"month\"] = df[\"date\"].apply(parse_month)\n",
"df"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"2020年11月\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>date</th>\n",
" <th>title</th>\n",
" <th>month</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2020年11月16日</td>\n",
" <td>フラー株式会社 本店移転のお知らせ</td>\n",
" <td>2020年11月</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2020年11月11日</td>\n",
" <td>フラー、全国の高専生を対象にしたオンラインキャリアイベント「高専キャラバン 2020 冬の陣...</td>\n",
" <td>2020年11月</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2020年10月20日</td>\n",
" <td>フラー代表取締役会長 渋谷、長岡高専の客員教授に就任</td>\n",
" <td>2020年10月</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2020年10月01日</td>\n",
" <td>フラー株式会社 会長及び社長就任のお知らせ</td>\n",
" <td>2020年10月</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2020年09月29日</td>\n",
" <td>TBSが国内No.1 アプリ分析ツール「App Ape」導入</td>\n",
" <td>2020年09月</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>2020年09月21日</td>\n",
" <td>フラー、アルビレックス新潟とオフィシャルクラブパートナー契約を締結</td>\n",
" <td>2020年09月</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>2020年09月11日</td>\n",
" <td>NTTデータにおけるエンタープライズ向けモバイルアプリ開発をサポート</td>\n",
" <td>2020年09月</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>2020年09月10日</td>\n",
" <td>フラー代表取締役 渋谷が新潟ベンチャー協会代表理事に就任</td>\n",
" <td>2020年09月</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>2020年08月11日</td>\n",
" <td>ユナイテッドが国内No.1 アプリ分析ツール「App Ape」導入</td>\n",
" <td>2020年08月</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" date title month\n",
"0 2020年11月16日 フラー株式会社 本店移転のお知らせ 2020年11月\n",
"1 2020年11月11日 フラー、全国の高専生を対象にしたオンラインキャリアイベント「高専キャラバン 2020 冬の陣... 2020年11月\n",
"2 2020年10月20日 フラー代表取締役会長 渋谷、長岡高専の客員教授に就任 2020年10月\n",
"3 2020年10月01日 フラー株式会社 会長及び社長就任のお知らせ 2020年10月\n",
"4 2020年09月29日 TBSが国内No.1 アプリ分析ツール「App Ape」導入 2020年09月\n",
"5 2020年09月21日 フラー、アルビレックス新潟とオフィシャルクラブパートナー契約を締結 2020年09月\n",
"6 2020年09月11日 NTTデータにおけるエンタープライズ向けモバイルアプリ開発をサポート 2020年09月\n",
"7 2020年09月10日 フラー代表取締役 渋谷が新潟ベンチャー協会代表理事に就任 2020年09月\n",
"8 2020年08月11日 ユナイテッドが国内No.1 アプリ分析ツール「App Ape」導入 2020年08月"
]
},
"metadata": {
"tags": []
},
"execution_count": 33
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "POOpfWhUae_e"
},
"source": [
"### データを集計してみる"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "tqxIZSOFOuRh",
"outputId": "c50d32a3-a325-4daa-d41b-934531de13a0"
},
"source": [
"df_count = df.groupby(\"month\").count()\n",
"df_count = df_count[[\"date\"]].rename(columns={\"date\": \"count\"})\n",
"df_count"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>count</th>\n",
" </tr>\n",
" <tr>\n",
" <th>month</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2020年08月</th>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2020年09月</th>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2020年10月</th>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2020年11月</th>\n",
" <td>2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" count\n",
"month \n",
"2020年08月 1\n",
"2020年09月 4\n",
"2020年10月 2\n",
"2020年11月 2"
]
},
"metadata": {
"tags": []
},
"execution_count": 40
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 516
},
"id": "03xzZCSuPkPT",
"outputId": "9b84f7f8-5c84-4d06-a309-755644ea0219"
},
"source": [
"!pip install japanize-matplotlib\n",
"import japanize_matplotlib\n",
"df_count.plot.bar(y=\"count\")"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Requirement already satisfied: japanize-matplotlib in /usr/local/lib/python3.6/dist-packages (1.1.3)\n",
"Requirement already satisfied: matplotlib in /usr/local/lib/python3.6/dist-packages (from japanize-matplotlib) (3.2.2)\n",
"Requirement already satisfied: numpy>=1.11 in /usr/local/lib/python3.6/dist-packages (from matplotlib->japanize-matplotlib) (1.18.5)\n",
"Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->japanize-matplotlib) (2.8.1)\n",
"Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->japanize-matplotlib) (1.3.1)\n",
"Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib->japanize-matplotlib) (0.10.0)\n",
"Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->japanize-matplotlib) (2.4.7)\n",
"Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil>=2.1->matplotlib->japanize-matplotlib) (1.15.0)\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7f83d12c3fd0>"
]
},
"metadata": {
"tags": []
},
"execution_count": 44
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "OncGaprgZE6x"
},
"source": [
"ここまでで2日目が終了です。可視化まで行かないこともありますが、授業の進捗によって途中を端折ったりしています。\n",
"\n",
"ちなみに授業の進捗は、Slackを使ってこんな感じで同期しています。完全にオンラインの授業のため、相手のリアクションがわかりません。終わったらSlackのリアクションを押してもらうようにしています。人数が把握出来るため、結構便利です。\n",
"\n",
"![image.png](data:image/png;base64,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b2SegaxEzOwzWDznMTyZWPD85+BUsJXD8n/dsDrLXdY6nU5nwD4Dgc7lYmfPniU+Pp7k5GScTifh4eHUrl274N4QxaxLRERERERESocSHSBATn8Aj8dztcvIl8PhwG4v3MMwihIi/FEKD0RERERERORiJT5AgCt74V0UxblIvxLnovBAREREREREfq9UBAiQ00fA5XLlaqx4NVitVpxOZ7F7C5imidvtDthYsahsNhsOh0M9D0RERERERCSXUhMgXGAYBl6vF8MwME0zV5PFy8FisWCxWLBardhstiL3IsiPaZp4vV68Xm+xzuVCXTabDZvNpuBARERERERE8lXqAgQRERERERERKbpL81W4iIiIiIiIiJRoChBEREREREREJCAFCCIiIiIiIiISkAIEEREREREREQlIAYKIiIiIiIiIBKQAQUREREREREQCUoAgIiIiIiIiIgEpQBARERERERGRgBQgiIiIiIiIiEhAChBEREREREREJCAFCCIiIiIiIiISkAIEEREREREREQlIAYKIiIiIiIiIBKQAQUREREREREQCUoAgIiIiIiIiIgEpQBARERERERGRgBQgSKm0du1azpw5c7XLEBERERER+Z9RIgOE9PR0bml+Cy+9+NLVLiVP77z9DqmpqVe7jEsqPj6eTZs2Ffv4IYOHcPr06WIf3+ehPixZsqRQczdv3sxLL72E0+nkkYcfIbJuZJ6vNWvWFLseERERERGRksZ+tQu4XOx2O1bbf18+YhgGU6ZMoW27tpQrV+5ql3PJbNq4iYTEBNq2bVuo+ampqSQlJQFw9OhRdu3aRVpaGocPH/abV65cOcLCwvzG7mh5BykpKdjsNt/Y+XPn2bt3L9OmTfONpael07t3b8aMHeMbW7t2LRPGT2DRu4soX748896YV+RzFRERERERKY1KZIAQEhLC9h3br3YZeTp16hQul+tql3HJHTt2DIvVUuj5X3/9Na+//joAB/YfICIigokTJ+aad2uLW3nk0UdyjS9ZsoTIqEjfdp+H+tCufTseeOAB39ismbNIT0/3ba9Zs4bJkybzzqJ3iIqKKnStIiIiIiIiUkJ/wgBwS/NbmDt3LgDz58+nd+/ezHt9Hg0aNCA2NpZt27axaeMmWt7ekuioaB4e9DDJycm+4+vH1Ofjjz9m4MCB1K1TlxZ/bsGCBQv83mP1qtW0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PQ9EREREREQkl1ITIFxgGAZerxfDMDBNM1eTxcvBYrFgsViwWq3YbLYi9yLIj2maeL1evF5vsc7lQl02mw2bzabgQERERERERPJV6gIEERERERERESm6S/NVuIiIiIiIiIiUaAoQRERERERERCQgBQgiIiIiIiIiEpACBBEREREREREJSAGCiIiIiIiIiASkAEFEREREREREAlKAICIiIiIiIiIBKUAQERERERERkYAUIIiIiIiIiIhIQAoQRERERERERCQgBQgiIiIiIiIiEpACBBEREREREREJSAGCiIiIiIiIiASkAEFEREREREREAlKAICIiIiIiIiIBKUAQERERERERkYAUIIiIiIiIiIhIQAoQ/gulp6fz9sK3L/m6W7Zs4bvvvitwzpDBQzh9+nSx36NXr17ExcUVam7L21sSWTeywFffPn3zPPbkyZPUqVOn2HWKiIiIiIhI0divdgGS27fffsuCBQvo07fPJV13wfwFdL2vK9HR0b6x1NRUkpKSADh69Ci7du0iLS2Nw4cP+x1brlw5wsLC/MamTJnCR+s/8hv75Zdf+PrA10yfNt1vfPqM6TRv3txv7LNtnxX7XFwuF8FBwUU+bttn25i/YD6G18Dr9eI1vBheA5fLRVZWlu+VmZVJy5YtmTNnju/YzMxMWvy5hd96v/zyCwe+PkDFihUDvvcHSz7g1Wmv5ho3vAZnzpwhJiaGjzd8XORzEhERERERuRIUIPwXOnbs2BVb9+uvv+b1118H4MD+A0RERDBx4sRc825tcSuPPPqI39j48eMZP36831ivXr245557uP/++y9d4XnIzsomKCioyMdFRkYyaNAg7HY7drsdp9OJw+Fg1cpVrFq1ipub38wdd9xBdHQ0NWvW9Du2TJkyfLXvK9+22+2mbp26hIaGAnDw4EEmT5rM0rileb539we60/2B7n5jXx/4mjFjxlC3bl3+/sLfi3w+IiIiIiIiV0qJDRAa1G/AzFkzefMfb7Jnzx4Wvr2QW2+9laUfLGX27Nn8/PPP1KtXj2fGPUNsbCwAH330Ea+8/AonT54kMjKSUaNH8ec//znX2i6XixdffJHly5aTnp5ObGwsU5+fSq1atQBYvWo106ZN4/jx44SHhzN8+HDu6XgPkHOR2blTZ+a9MY9nJzzLiRMniK4XzSuvvEJUVBTjxo3jvcXv4fV6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)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_kNq0_RUZWiM"
},
"source": [
"## クローラーの作成とデータの可視化\n",
"\n",
"今回はアドバンスドな授業をまとめてみます。本当はもっと簡素なバージョンで行っています。集中講義など、Pythonを学びたい学生がたくさんいるときは、こちらのバージョンを使います。\n",
"\n",
"今年はクラフトビールにハマっているので、データの対象は酒造免許ですが、自分の趣味に応じで取得するデータは変えています。\n",
"\n",
"データ可視化のガイドラインは、Material DesignのData Visualizationがわかりやすいため、これを読むように伝えています。\n",
"\n",
"https://material.io/design/communication/data-visualization.html"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "J3T7_5r_SrxG"
},
"source": [
"### 今日やること\n",
"\n",
"1. エクセルのURLリストをrequestsとBeautifulSoupのライブラリを使って、クローリングする\n",
"2. エクセルのURLから、直接Pandas DataFrameの形式に変換する\n",
"3. データを整形して、正規化する\n",
"4. 様々な角度からデータを切り出して、グラフで表示してみる"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_AXX4p-wTiZE"
},
"source": [
"### エクセルのURLリストをクローリングする"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "MDY6a87kThZB",
"outputId": "23a13f97-e687-47fa-9cbb-b072de44e1de"
},
"source": [
"import requests\n",
"\n",
"res = requests.get(\"https://www.nta.go.jp/taxes/sake/menkyo/shinki/seizo/02/zenkoku.htm\")\n",
"res"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<Response [200]>"
]
},
"metadata": {
"tags": []
},
"execution_count": 2
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "r-oE50fdT9yc",
"outputId": "eab66197-1676-4e9d-ed14-603efdb4216f"
},
"source": [
"from bs4 import BeautifulSoup\n",
"\n",
"soup = BeautifulSoup(res.content)\n",
"soup"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<!DOCTYPE html>\n",
"<html lang=\"ja\">\n",
"<head>\n",
"<meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\"/>\n",
"<meta content=\"IE=edge\" http-equiv=\"X-UA-Compatible\"/>\n",
"<meta content=\"width=device-width, initial-scale=1\" name=\"viewport\"/>\n",
"<title>全国分 | 酒類の免許|国税庁</title>\n",
"<link href=\"/template/css/bootstrap.min.css\" rel=\"stylesheet\"/>\n",
"<!--[if lt IE 9]>\n",
"\t\t\t<script src=\"/template/js/html5shiv.min.js\"></script>\n",
"\t\t\t<script src=\"/template/js/respond.min.js\"></script>\n",
"\t\t<![endif]-->\n",
"<script src=\"/template/js/jquery.min.js\"></script>\n",
"<script src=\"/template/js/bootstrap.min.js\"></script>\n",
"<link href=\"/template/css/common.css\" rel=\"stylesheet\"/>\n",
"<link href=\"/template/css/import.css\" rel=\"stylesheet\"/>\n",
"<script src=\"/template/js/custom.js\"></script>\n",
"<script src=\"/template/js/include.js\"></script>\n",
"</head>\n",
"<body>\n",
"<noscript>すべての機能をご利用いただくにはJavascriptを有効にしてください。</noscript>\n",
"<div class=\"container\">\n",
"<div id=\"header\"></div>\n",
"<div class=\"wrap\">\n",
"<div class=\"clearfix\">\n",
"<div class=\"left-content contents\">\n",
"<div id=\"contents\">\n",
"<div class=\"imp-cnt\" id=\"bodyArea\">\n",
"<p class=\"skip\"></p>\n",
"<ol class=\"breadcrumb\"><li><a href=\"/\">ホーム</a></li><li><a href=\"/taxes/index.htm\">税の情報・手続・用紙</a></li><li><a href=\"/taxes/sake/index.htm\">お酒に関する情報</a></li><li><a href=\"/taxes/sake/menkyo/mokuji.htm\">酒類の免許</a></li><li class=\"active\">全国分</li></ol>\n",
"<div class=\"page-header\" id=\"page-top\"><h1>酒類等製造免許の新規取得者名等一覧</h1></div>\n",
"<p> 酒類等製造免許の新規取得者名等については、平成26年より、品目別に全国分をまとめたものを掲載します。</p>\n",
"<div class=\"table-responsive\"><table class=\"table table-bordered tbl_kohyo3\">\n",
"<colgroup>\n",
"<col class=\"\" span=\"1\"/>\n",
"<col class=\"\" span=\"7\"/>\n",
"</colgroup>\n",
"<tbody><tr>\n",
"<th scope=\"col\" width=\"20%\">品目</th>\n",
"<th scope=\"col\" width=\"11%\">平成26年</th>\n",
"<th scope=\"col\" width=\"11%\">平成27年</th>\n",
"<th scope=\"col\" width=\"11%\">平成28年</th>\n",
"<th scope=\"col\" width=\"11%\">平成29年</th>\n",
"<th scope=\"col\" width=\"11%\">平成30年</th>\n",
"<th scope=\"col\" width=\"11%\">令和元年<br/></th>\n",
"<th scope=\"col\" width=\"11%\">令和2年<br/>\n",
" (8月分まで)</th>\n",
"</tr>\n",
"<tr>\n",
"<td>果実酒</td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/15.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/01.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/08.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/22.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/h30/12/01.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/r01/10/01.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/></a><br/></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/r02/02/01.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/></a><br/></td>\n",
"</tr>\n",
"<tr>\n",
"<td>ビール</td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/16.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/02.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/09.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/23.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/h30/12/02.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/r01/10/02.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/r02/02/02.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"</tr>\n",
"<tr>\n",
"<td>発泡酒</td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/17.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/03.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/10.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/24.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/h30/12/03.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/r01/10/03.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/r02/02/03.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"</tr>\n",
"<tr>\n",
"<td>ウイスキー</td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/18.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/04.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/11.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/25.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/h30/12/04.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/r01/10/04.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/r02/02/04.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"</tr>\n",
"<tr>\n",
"<td>その他の醸造酒</td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/19.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/05.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/12.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/26.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/h30/12/05.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/r01/10/05.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/r02/02/05.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"</tr>\n",
"<tr>\n",
"<td>リキュール</td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/20.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/06.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/13.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/27.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/h30/12/06.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/r01/10/06.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/r02/02/06.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"</tr>\n",
"<tr>\n",
"<td>上記以外</td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/21.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/07.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/14.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/28.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/h30/12/07.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/r01/10/07.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"<td class=\"center\"><a href=\"/taxes/sake/menkyo/shinki/seizo/02/r02/02/07.htm\"><img alt=\"詳細ページへのリンク\" src=\"/template/img/template/html_icon.png\"/><br/></a></td>\n",
"</tr>\n",
"</tbody></table></div><br/>\n",
"<p class=\"marginLeft2em\" style=\"margin-top:-2em;\">(注)氏名又は名称等については、常用漢字による表示をする場合があります。</p>\n",
"<br/>\n",
"<p class=\"marginLeft2em\">全ての品目の一覧はこちらをご覧ください。<br/>\n",
"<a href=\"/taxes/sake/menkyo/shinki/seizo/02/h26.xlsx\">平成26年Excelファイル/45KB</a><br/>\n",
"<a href=\"/taxes/sake/menkyo/shinki/seizo/02/h27.xlsx\">平成27年Excelファイル/53KB</a><br/>\n",
"<a href=\"/taxes/sake/menkyo/shinki/seizo/02/h28.xlsx\">平成28年Excelファイル/43KB</a><br/>\n",
"<a href=\"/taxes/sake/menkyo/shinki/seizo/02/h29.xlsx\">平成29年Excelファイル/42KB</a><br/>\n",
"<a href=\"/taxes/sake/menkyo/shinki/seizo/02/h30/12/h30.xlsx\">平成30年Excelファイル/45KB</a><br/>\n",
"<a href=\"/taxes/sake/menkyo/shinki/seizo/02/r01/10/r01.xlsx\">令和元年Excelファイル/49KB</a><br/>\n",
"<a href=\"/taxes/sake/menkyo/shinki/seizo/02/r02/02/r02.xlsx\">令和2年(8月分まで)Excelファイル/45KB</a>\n",
"</p>\n",
"</div>\n",
"</div><p class=\"page-top-link\"><a href=\"#page-top\">このページの先頭へ</a></p>\n",
"</div>\n",
"<!--/left-menu-->\n",
"<div class=\"right-menu\">\n",
"<div class=\"panel panel-default sidenavi bmg20\">\n",
"<div class=\"panel-heading\">\n",
"<h2 class=\"panel-title\"><a href=\"/taxes/index.htm\">税の情報・手続・用紙</a></h2>\n",
"</div>\n",
"<div class=\"panel-group\" id=\"navi-Accordion\">\n",
"<h3 class=\"sidenavi-title\"><a class=\"navi_title\" href=\"/taxes/shiraberu/index.htm\">税について調べる</a><a class=\"navi_btn collapsed\" data-parent=\"#sidenaviAccordion\" data-toggle=\"collapse\" href=\"#sidenaviAccordionCollapse1\"><img alt=\"メニューを開く\" src=\"/template/img/template/navi_down.png\"/></a></h3><div class=\"panel-collapse collapse\" id=\"sidenaviAccordionCollapse1\"><ul><li><a href=\"/taxes/shiraberu/shinkoku/kakutei.htm\">所得税(確定申告書等作成コーナー)</a></li><li><a href=\"/taxes/shiraberu/taxanswer/index2.htm\">タックスアンサー(よくある税の質問)</a></li><li><a href=\"/taxes/shiraberu/sodan/index.htm\">税の相談</a></li><li><a href=\"/taxes/shiraberu/zeimokubetsu/index.htm\">税目別情報</a></li><li><a href=\"http://www.rosenka.nta.go.jp/\">路線価図・評価倍率表</a></li><li><a href=\"/taxes/shiraberu/saigai/index.htm\">災害関連情報</a></li><li><a href=\"/taxes/shiraberu/kokusai/index.htm\">国際税務関係情報</a></li><li><a href=\"/taxes/shiraberu/shirabekata/info.htm\">税についての上手な調べ方</a></li></ul></div><h3 class=\"sidenavi-title\"><a class=\"navi_title\" href=\"/taxes/tetsuzuki/index.htm\">申告手続・用紙</a><a class=\"navi_btn collapsed\" data-parent=\"#sidenaviAccordion\" data-toggle=\"collapse\" href=\"#sidenaviAccordionCollapse2\"><img alt=\"メニューを開く\" src=\"/template/img/template/navi_down.png\"/></a></h3><div class=\"panel-collapse collapse\" id=\"sidenaviAccordionCollapse2\"><ul><li><a href=\"/taxes/tetsuzuki/shinsei/index.htm\">申告・申請・届出等、用紙(手続の案内・様式)</a></li><li><a href=\"/taxes/tetsuzuki/mynumberinfo/index.htm\">社会保障・税番号制度(マイナンバー)</a></li></ul></div><h3 class=\"sidenavi-title\"><a class=\"navi_title\" href=\"/taxes/nozei/index.htm\">納税・納税証明書手続</a><a class=\"navi_btn collapsed\" data-parent=\"#sidenaviAccordion\" data-toggle=\"collapse\" href=\"#sidenaviAccordionCollapse3\"><img alt=\"メニューを開く\" src=\"/template/img/template/navi_down.png\"/></a></h3><div class=\"panel-collapse collapse\" id=\"sidenaviAccordionCollapse3\"><ul><li><a href=\"/taxes/nozei/nofu/01.htm\">国税の納付手続</a></li><li><a href=\"/taxes/nozei/nozei-shomei/01.htm\">納税証明書</a></li><li><a href=\"/taxes/nozei/enno-butsuno/01.htm\">延納・物納申請等</a></li><li><a href=\"/taxes/nozei/entaizei/keisan/entai.htm\">延滞税</a></li></ul></div><h3 class=\"sidenavi-title\"><a class=\"navi_title\" href=\"/taxes/zeirishi/index.htm\">税理士に関する情報</a><a class=\"navi_btn collapsed\" data-parent=\"#sidenaviAccordion\" data-toggle=\"collapse\" href=\"#sidenaviAccordionCollapse4\"><img alt=\"メニューを開く\" src=\"/template/img/template/navi_down.png\"/></a></h3><div class=\"panel-collapse collapse\" id=\"sidenaviAccordionCollapse4\"><ul><li><a href=\"/taxes/zeirishi/index.htm#news\">新着情報</a></li><li><a href=\"/taxes/zeirishi/zeirishiseido/seido.htm\">税理士制度</a></li><li><a href=\"/taxes/zeirishi/zeirishishiken/zeirishi.htm\">税理士試験</a></li><li><a href=\"/taxes/zeirishi/chokai/chokai.htm\">税理士に関する懲戒処分等</a></li><li><a href=\"/taxes/zeirishi/search/search.htm\">税理士をお探しの方</a></li><li><a href=\"/taxes/zeirishi/zeirishiseido/qa.htm\">税理士関係法令等・Q&A</a></li></ul></div><h3 class=\"sidenavi-title\"><a class=\"navi_title\" href=\"/taxes/sake/index.htm\">お酒に関する情報</a><a class=\"navi_btn\" data-parent=\"#sidenaviAccordion\" data-toggle=\"collapse\" href=\"#sidenaviAccordionCollapse5\"><img alt=\"メニューを閉じる\" src=\"/template/img/template/navi_up.png\"/></a></h3><div class=\"panel-collapse collapse in\" id=\"sidenaviAccordionCollapse5\"><ul><li><a href=\"/taxes/sake/index.htm#syuzei\">酒税関係及び各種施策</a></li><li><a href=\"/taxes/sake/index.htm#ippan\">一般的な酒税の取扱い</a></li><li><a href=\"/taxes/sake/index.htm#senmonsyuzei\">専門的な酒税の取扱い</a></li><li><a href=\"/taxes/sake/index.htm#senmonsodan\">専門的な酒税の相談</a></li><li><a href=\"/taxes/sake/index.htm#shinkoku\">酒税の申告・納付や届出等</a></li><li><a href=\"/taxes/sake/index.htm#denwa\">電話相談センター・税務署の案内</a></li><li><a href=\"/taxes/sake/index.htm#shingikai\">審議会等</a></li><li><a href=\"/taxes/sake/index.htm#tokei\">統計情報・各種資料</a></li><li><a href=\"/taxes/sake/index.htm#qa\">お酒に関するQ&A(よくある質問)</a></li></ul></div><h3 class=\"sidenavi-title\"><a class=\"navi_title\" href=\"/taxes/kids/index.htm\">税の学習コーナー</a></h3>\n",
"</div>\n",
"</div>\n",
"</div>\n",
"<!--/right-menu-->\n",
"</div>\n",
"<!--/clearfix-->\n",
"</div>\n",
"<!--/wrap-->\n",
"<footer>\n",
"<h2>サイトマップ(コンテンツ一覧)</h2>\n",
"<ol class=\"breadcrumb footer\"><li><a href=\"/\">ホーム</a></li><li><a href=\"/taxes/index.htm\">税の情報・手続・用紙</a></li><li><a href=\"/taxes/sake/index.htm\">お酒に関する情報</a></li><li><a href=\"/taxes/sake/menkyo/mokuji.htm\">酒類の免許</a></li><li class=\"active\">全国分</li></ol>\n",
"<div id=\"footer\"></div>\n",
"</footer>\n",
"</div>\n",
"<!--/container-->\n",
"</body>\n",
"</html>"
]
},
"metadata": {
"tags": []
},
"execution_count": 3
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "NqF8r2otUR7b",
"outputId": "d114eb67-fe6c-4933-d9ec-69a285a71ef9"
},
"source": [
"# TODO: エクセルのURLリストをCSSセレクタを使って取得する\n",
"url_list = []\n",
"# for a in soup.select(\".marginLeft2em a\"):\n",
"for a in soup.select(\"a[href$='.xlsx']\"):\n",
" url_list.append(\"https://www.nta.go.jp\" + a.get(\"href\"))\n",
"url_list"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"['https://www.nta.go.jp/taxes/sake/menkyo/shinki/seizo/02/h26.xlsx',\n",
" 'https://www.nta.go.jp/taxes/sake/menkyo/shinki/seizo/02/h27.xlsx',\n",
" 'https://www.nta.go.jp/taxes/sake/menkyo/shinki/seizo/02/h28.xlsx',\n",
" 'https://www.nta.go.jp/taxes/sake/menkyo/shinki/seizo/02/h29.xlsx',\n",
" 'https://www.nta.go.jp/taxes/sake/menkyo/shinki/seizo/02/h30/12/h30.xlsx',\n",
" 'https://www.nta.go.jp/taxes/sake/menkyo/shinki/seizo/02/r01/10/r01.xlsx',\n",
" 'https://www.nta.go.jp/taxes/sake/menkyo/shinki/seizo/02/r02/02/r02.xlsx']"
]
},
"metadata": {
"tags": []
},
"execution_count": 4
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "epdG1I16YjCX",
"outputId": "23aab629-ff96-4ad1-9248-3bc4d79987ca"
},
"source": [
"import pandas as pd\n",
"\n",
"dataset = []\n",
"for url in url_list:\n",
" df = pd.read_excel(url)\n",
" dataset.append(df)\n",
"dataset"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[ 酒類等製造免許の新規取得者名等一覧(平成26年分) ... Unnamed: 9\n",
" 0 NaN ... NaN\n",
" 1 NaN ... NaN\n",
" 2   平成26年1月1日から平成26年12月31日までの酒類等製造免許の取得者等は次のとおりです。 ... NaN\n",
" 3 NaN ... NaN\n",
" 4 都道府県名 ... 審査項目\n",
" .. ... ... ...\n",
" 223 岩手 ... M1\n",
" 224 山梨 ... M1\n",
" 225 大阪 ... M4\n",
" 226 長野 ... M1\n",
" 227 長野 ... M1\n",
" \n",
" [228 rows x 10 columns],\n",
" 酒類等製造免許の新規取得者名等一覧(平成27年分) ... Unnamed: 9\n",
" 0 NaN ... NaN\n",
" 1 NaN ... NaN\n",
" 2   平成27年1月1日から平成27年12月31日までの酒類等製造免許の取得者等は次のとおりです。 ... NaN\n",
" 3 NaN ... NaN\n",
" 4 都道府県名 ... 審査項目\n",
" .. ... ... ...\n",
" 261 島根 ... M1\n",
" 262 島根 ... M1\n",
" 263 北海道 ... M1\n",
" 264 神奈川 ... M1\n",
" 265 東京 ... M1\n",
" \n",
" [266 rows x 10 columns],\n",
" 酒類等製造免許の新規取得者名等一覧(平成28年分) ... Unnamed: 9\n",
" 0 NaN ... NaN\n",
" 1 NaN ... NaN\n",
" 2   平成28年1月1日から平成28年12月31日までの酒類等製造免許の取得者等は次のとおりです。 ... NaN\n",
" 3 NaN ... NaN\n",
" 4 都道府県名 ... 審査項目\n",
" .. ... ... ...\n",
" 220 長野 ... M1\n",
" 221 徳島 ... M1\n",
" 222 和歌山 ... M4\n",
" 223 大阪 ... M1\n",
" 224 兵庫 ... M1\n",
" \n",
" [225 rows x 10 columns],\n",
" 酒類等製造免許の新規取得者名等一覧(平成29年分) ... Unnamed: 8\n",
" 0 NaN ... NaN\n",
" 1 NaN ... NaN\n",
" 2   平成29年1月1日から平成29年12月31日までの酒類等製造免許の取得者等は次のとおりです。 ... NaN\n",
" 3 NaN ... NaN\n",
" 4 都道府県名 ... 処理区分\n",
" .. ... ... ...\n",
" 231 佐賀 ... 新規\n",
" 232 香川 ... 新規\n",
" 233 滋賀 ... 新規\n",
" 234 滋賀 ... 新規\n",
" 235 滋賀 ... 新規\n",
" \n",
" [236 rows x 9 columns],\n",
" 酒類等製造免許の新規取得者名等一覧(平成30年分) ... Unnamed: 8\n",
" 0 NaN ... NaN\n",
" 1 NaN ... NaN\n",
" 2   平成30年1月1日から平成30年12月31日までの酒類等製造免許の取得者等は次のとおりです。 ... NaN\n",
" 3 NaN ... NaN\n",
" 4 都道府県名 ... 処理区分\n",
" .. ... ... ...\n",
" 289 長野 ... 新規\n",
" 290 京都 ... 新規\n",
" 291 栃木 ... 新規\n",
" 292 鹿児島 ... 新規\n",
" 293 福島 ... 移転\n",
" \n",
" [294 rows x 9 columns],\n",
" 酒類等製造免許の新規取得者名等一覧(令和元年分) ... Unnamed: 8\n",
" 0 NaN ... NaN\n",
" 1 NaN ... NaN\n",
" 2   平成31年1月1日から令和元年12月31日までの酒類等製造免許の取得者等は次のとおりです。 ... NaN\n",
" 3 NaN ... NaN\n",
" 4 都道府県名 ... 処理区分\n",
" .. ... ... ...\n",
" 321 熊本 ... 新規\n",
" 322 新潟 ... 新規\n",
" 323 東京 ... 新規\n",
" 324 岐阜 ... 新規\n",
" 325 山形 ... 新規\n",
" \n",
" [326 rows x 9 columns],\n",
" 酒類等製造免許の新規取得者名等一覧(令和2年分) ... Unnamed: 8\n",
" 0 NaN ... NaN\n",
" 1 NaN ... NaN\n",
" 2   令和2年1月1日から令和2年8月31日までの酒類等製造免許の取得者等は次のとおりです。 ... NaN\n",
" 3 NaN ... NaN\n",
" 4 都道府県名 ... 処理区分\n",
" .. ... ... ...\n",
" 290 新潟 ... 新規\n",
" 291 東京 ... 新規\n",
" 292 山梨 ... 新規\n",
" 293 北海道 ... 新規\n",
" 294 北海道 ... 新規\n",
" \n",
" [295 rows x 9 columns]]"
]
},
"metadata": {
"tags": []
},
"execution_count": 5
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ebxrOgC-b3Cx"
},
"source": [
"### データを整形して、正規化する"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 133
},
"id": "j1l39r1lZ3B_",
"outputId": "325625fd-934a-40ea-de71-8a44e651e2c7"
},
"source": [
"df = dataset[0]\n",
"df[4:5]"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>酒類等製造免許の新規取得者名等一覧(平成26年分)</th>\n",
" <th>Unnamed: 1</th>\n",
" <th>Unnamed: 2</th>\n",
" <th>Unnamed: 3</th>\n",
" <th>Unnamed: 4</th>\n",
" <th>Unnamed: 5</th>\n",
" <th>Unnamed: 6</th>\n",
" <th>Unnamed: 7</th>\n",
" <th>Unnamed: 8</th>\n",
" <th>Unnamed: 9</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>都道府県名</td>\n",
" <td>税務署名</td>\n",
" <td>免許等年月日</td>\n",
" <td>申請等年月日</td>\n",
" <td>製造者氏名又は名称</td>\n",
" <td>製造場所在地</td>\n",
" <td>免許等区分</td>\n",
" <td>品目</td>\n",
" <td>処理区分</td>\n",
" <td>審査項目</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 酒類等製造免許の新規取得者名等一覧(平成26年分) Unnamed: 1 ... Unnamed: 8 Unnamed: 9\n",
"4 都道府県名 税務署名 ... 処理区分 審査項目\n",
"\n",
"[1 rows x 10 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 6
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 133
},
"id": "iv9ndLwGcoY9",
"outputId": "a8cca43e-9c61-4ac3-8f63-ec44baefff0e"
},
"source": [
"df = dataset[3]\n",
"df[4:5]"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>酒類等製造免許の新規取得者名等一覧(平成29年分)</th>\n",
" <th>Unnamed: 1</th>\n",
" <th>Unnamed: 2</th>\n",
" <th>Unnamed: 3</th>\n",
" <th>Unnamed: 4</th>\n",
" <th>Unnamed: 5</th>\n",
" <th>Unnamed: 6</th>\n",
" <th>Unnamed: 7</th>\n",
" <th>Unnamed: 8</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>都道府県名</td>\n",
" <td>税務署名</td>\n",
" <td>免許等年月日</td>\n",
" <td>申請等年月日</td>\n",
" <td>製造者氏名又は名称</td>\n",
" <td>製造場所在地</td>\n",
" <td>免許等区分</td>\n",
" <td>品目</td>\n",
" <td>処理区分</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 酒類等製造免許の新規取得者名等一覧(平成29年分) Unnamed: 1 ... Unnamed: 7 Unnamed: 8\n",
"4 都道府県名 税務署名 ... 品目 処理区分\n",
"\n",
"[1 rows x 9 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 7
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "S0mqioPDdShO",
"outputId": "e264d5a2-d5d5-4bfe-ef29-0ec5be1b8dc4"
},
"source": [
"df.columns"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Index(['酒類等製造免許の新規取得者名等一覧(平成29年分)', 'Unnamed: 1', 'Unnamed: 2', 'Unnamed: 3',\n",
" 'Unnamed: 4', 'Unnamed: 5', 'Unnamed: 6', 'Unnamed: 7', 'Unnamed: 8'],\n",
" dtype='object')"
]
},
"metadata": {
"tags": []
},
"execution_count": 8
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "uOE5zKlsdEVC",
"outputId": "ade1af27-9dbc-4d46-9ee8-bf55e731b596"
},
"source": [
"clean_dataset = []\n",
"for df in dataset:\n",
" if \"Unnamed: 9\" in df:\n",
" df = df.drop(columns=[\"Unnamed: 9\"])\n",
" df = df[5:]\n",
" df.columns = [\n",
" \"都道府県名\",\n",
" \"税務署名\",\n",
" \"免許等年月日\",\n",
" \"申請等年月日\",\n",
" \"製造者氏名又は名称\",\n",
" \"製造場所在地\",\n",
" \"免許等区分\",\n",
" \"品目\",\n",
" \"処理区分\"\n",
" ]\n",
" clean_dataset.append(df)\n",
"clean_dataset"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[ 都道府県名 税務署名 免許等年月日 ... 免許等区分 品目 処理区分\n",
" 5 岩手 一関 2014-01-01 00:00:00 ... 酒類 単式蒸留しょうちゅう 新規\n",
" 6 愛知 名古屋中村 2014-01-08 00:00:00 ... 酒類 ビール 新規\n",
" 7 愛知 名古屋中村 2014-01-08 00:00:00 ... 酒類 発泡酒 新規\n",
" 8 福岡 八女 2014-01-08 00:00:00 ... 試験免許 その他の醸造酒 新規\n",
" 9 熊本 山鹿 2014-01-27 00:00:00 ... 酒類 単式蒸留しょうちゅう 法人成り等\n",
" .. ... ... ... ... ... ... ...\n",
" 223 岩手 花巻 2014-12-15 00:00:00 ... もろみ NaN 新規\n",
" 224 山梨 甲府 2014-12-17 00:00:00 ... もろみ NaN 新規\n",
" 225 大阪 堺 2014-12-19 00:00:00 ... 酒類 清酒 移転\n",
" 226 長野 伊那 2014-12-24 00:00:00 ... 試験免許 清酒 新規\n",
" 227 長野 伊那 2014-12-24 00:00:00 ... 試験免許 その他の醸造酒 新規\n",
" \n",
" [223 rows x 9 columns],\n",
" 都道府県名 税務署名 免許等年月日 ... 免許等区分 品目 処理区分\n",
" 5 北海道 函館 42005 ... 酒類 果実酒 法人成り等\n",
" 6 熊本 熊本東 42005 ... 酒類 清酒 法人成り等\n",
" 7 熊本 熊本東 42005 ... 酒類 単式蒸留しょうちゅう 法人成り等\n",
" 8 熊本 熊本東 42005 ... 酒類 リキュール 新規\n",
" 9 北海道 深川 42013 ... 酒類 果実酒 新規\n",
" .. ... ... ... ... ... ... ...\n",
" 261 島根 益田 2015-12-22 00:00:00 ... 酒類 果実酒 新規\n",
" 262 島根 浜田 2015-12-22 00:00:00 ... 酒類 発泡酒 新規\n",
" 263 北海道 函館 42360 ... 試験\\n免許 清酒 新規\n",
" 264 神奈川 横浜中 42362 ... 試験\\n免許 スピリッツ 新規\n",
" 265 東京 神田 42363 ... 酒類 その他の醸造酒 新規\n",
" \n",
" [261 rows x 9 columns],\n",
" 都道府県名 税務署名 免許等年月日 ... 免許等区分 品目 処理区分\n",
" 5 埼玉 川口 2016-01-01 00:00:00 ... 酒類 発泡酒 新規\n",
" 6 岡山 瀬戸 2016-01-01 00:00:00 ... 酒類 果実酒 法人成り等\n",
" 7 岡山 瀬戸 2016-01-01 00:00:00 ... 酒類 甘味果実酒 法人成り等\n",
" 8 岡山 瀬戸 2016-01-01 00:00:00 ... 酒類 ブランデー 法人成り等\n",
" 9 岡山 瀬戸 2016-01-01 00:00:00 ... 酒類 スピリッツ 法人成り等\n",
" .. ... ... ... ... ... ... ...\n",
" 220 長野 飯田 42724 ... 酒類 果実酒 新規\n",
" 221 徳島 徳島 42724 ... 酒母 NaN 新規\n",
" 222 和歌山 和歌山 42726 ... 酒類 発泡酒 移転\n",
" 223 大阪 富田林 42726 ... 試験免許 果実酒 新規\n",
" 224 兵庫 明石 42730 ... 酒類 発泡酒 新規\n",
" \n",
" [220 rows x 9 columns],\n",
" 都道府県名 税務署名 免許等年月日 申請等年月日 ... 製造場所在地 免許等区分 品目 処理区分\n",
" 5 三重 上野 42736 42551 ... 名張市緑が丘東182番地 酒類 その他の醸造酒 新規\n",
" 6 長崎 島原 42736 42641 ... 南島原市布津町丙271番地4 酒類 その他の醸造酒 新規\n",
" 7 岩手 一関 42741 42580 ... 西磐井郡平泉町長島字砂子沢172番地6 酒類 果実酒 新規\n",
" 8 高知 須崎 42747 42620 ... 高岡郡檮原町松原400番地1 酒類 その他の醸造酒 新規\n",
" 9 京都 下京 42751 42657 ... 京都市南区西九条高畠町25番地1 酒類 ビール 新規\n",
" .. ... ... ... ... ... ... ... ... ...\n",
" 231 佐賀 伊万里 43089 43041 ... 西松浦郡有田町戸矢乙340番地28 試験免許 発泡酒 新規\n",
" 232 香川 丸亀 43090 42846 ... 丸亀市北平山町二丁目21番地41 酒類 発泡酒 新規\n",
" 233 滋賀 大津 43095 43034 ... 大津市瀬田大江町1番地5 龍谷大学瀬田学舎9号館 試験免許 清酒 新規\n",
" 234 滋賀 大津 43095 43034 ... 大津市瀬田大江町1番地5 龍谷大学瀬田学舎9号館 試験免許 ビール 新規\n",
" 235 滋賀 大津 43095 43034 ... 大津市瀬田大江町1番地5 龍谷大学瀬田学舎9号館 試験免許 果実酒 新規\n",
" \n",
" [231 rows x 9 columns],\n",
" 都道府県名 税務署名 免許等年月日 ... 免許等区分 品目 処理区分\n",
" 5 鳥取 倉吉 平成30年1月1日 ... 酒類 果実酒 法人成り等\n",
" 6 鳥取 倉吉 平成30年1月1日 ... 酒類 甘味果実酒 法人成り等\n",
" 7 埼玉 朝霞 平成30年1月11日 ... 酒類 発泡酒 新規\n",
" 8 静岡 浜松西 平成30年1月11日 ... 酒類 発泡酒 新規\n",
" 9 静岡 掛川 平成30年1月11日 ... 酒類 発泡酒 新規\n",
" .. ... ... ... ... ... ... ...\n",
" 289 長野 信濃中野 平成30年12月20日 ... 酒類 その他の醸造酒 新規\n",
" 290 京都 宮津 平成30年12月20日 ... 酒類 その他の醸造酒 新規\n",
" 291 栃木 大田原 平成30年12月21日 ... 酒類 果実酒 新規\n",
" 292 鹿児島 種子島 平成30年12月21日 ... もろみ NaN 新規\n",
" 293 福島 相馬 平成30年12月25日 ... 酒類 その他の醸造酒 移転\n",
" \n",
" [289 rows x 9 columns],\n",
" 都道府県名 税務署名 免許等年月日 ... 免許等区分 品目 処理区分\n",
" 5 熊本 人吉 平成31年1月1日 ... 酒類 単式蒸留焼酎 法人成り等\n",
" 6 東京 麹町 平成31年1月1日 ... 酒類 ビール 法人成り等\n",
" 7 長野 上田 平成31年1月1日 ... 酒類 ウイスキー 新規\n",
" 8 長野 佐久 平成31年1月1日 ... 酒類 発泡酒 新規\n",
" 9 東京 麻布 平成31年1月1日 ... 酒類 発泡酒 新規\n",
" .. ... ... ... ... ... ... ...\n",
" 321 熊本 熊本東 令和元年12月19日 ... 酒類 スピリッツ 新規\n",
" 322 新潟 新津 令和元年12月20日 ... 試験免許 清酒 新規\n",
" 323 東京 蒲田 令和元年12月20日 ... 酒類 リキュール 新規\n",
" 324 岐阜 関 令和元年12月20日 ... 酒類 リキュール 新規\n",
" 325 山形 山形 令和元年12月23日 ... 酒類 発泡酒 新規\n",
" \n",
" [321 rows x 9 columns],\n",
" 都道府県名 税務署名 免許等年月日 ... 免許等区分 品目 処理区分\n",
" 5 北海道 札幌中 令和2年1月1日 ... 酒類 発泡酒 法人成り等\n",
" 6 北海道 札幌中 令和2年1月1日 ... 酒類 ビール 法人成り等\n",
" 7 青森 五所川原 令和2年1月1日 ... 酒類 清酒 移転\n",
" 8 青森 五所川原 令和2年1月1日 ... 酒類 雑酒 移転\n",
" 9 青森 五所川原 令和2年1月1日 ... 酒類 スピリッツ 移転\n",
" .. ... ... ... ... ... ... ...\n",
" 290 新潟 十日町 令和2年8月31日 ... 酒類 発泡酒 新規\n",
" 291 東京 神田 令和2年8月31日 ... 酒類 発泡酒 新規\n",
" 292 山梨 甲府 令和2年8月31日 ... 酒類 単式蒸留焼酎 新規\n",
" 293 北海道 札幌南 令和2年8月31日 ... 酒類 スピリッツ 新規\n",
" 294 北海道 札幌南 令和2年8月31日 ... 酒類 リキュール 新規\n",
" \n",
" [290 rows x 9 columns]]"
]
},
"metadata": {
"tags": []
},
"execution_count": 9
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 962
},
"id": "EF_lMI0lephj",
"outputId": "50275461-5395-4783-f084-45b6132e00ac"
},
"source": [
"df_all = pd.concat(clean_dataset, ignore_index=True)\n",
"df_all"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>都道府県名</th>\n",
" <th>税務署名</th>\n",
" <th>免許等年月日</th>\n",
" <th>申請等年月日</th>\n",
" <th>製造者氏名又は名称</th>\n",
" <th>製造場所在地</th>\n",
" <th>免許等区分</th>\n",
" <th>品目</th>\n",
" <th>処理区分</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>岩手</td>\n",
" <td>一関</td>\n",
" <td>2014-01-01 00:00:00</td>\n",
" <td>2013-08-26 00:00:00</td>\n",
" <td>岩手銘醸株式会社</td>\n",
" <td>一関市千厩町千厩字北方134番地</td>\n",
" <td>酒類</td>\n",
" <td>単式蒸留しょうちゅう</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>愛知</td>\n",
" <td>名古屋中村</td>\n",
" <td>2014-01-08 00:00:00</td>\n",
" <td>2013-06-21 00:00:00</td>\n",
" <td>株式会社ワイマーケット\\nY.MARKET BREWING</td>\n",
" <td>名古屋市中村区名駅四丁目1705番地</td>\n",
" <td>酒類</td>\n",
" <td>ビール</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>愛知</td>\n",
" <td>名古屋中村</td>\n",
" <td>2014-01-08 00:00:00</td>\n",
" <td>2013-06-21 00:00:00</td>\n",
" <td>株式会社ワイマーケット\\nY.MARKET BREWING</td>\n",
" <td>名古屋市中村区名駅四丁目1705番地</td>\n",
" <td>酒類</td>\n",
" <td>発泡酒</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>福岡</td>\n",
" <td>八女</td>\n",
" <td>2014-01-08 00:00:00</td>\n",
" <td>2013-12-06 00:00:00</td>\n",
" <td>西吉田酒造株式会社</td>\n",
" <td>筑後市大字和泉612番地</td>\n",
" <td>試験免許</td>\n",
" <td>その他の醸造酒</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>熊本</td>\n",
" <td>山鹿</td>\n",
" <td>2014-01-27 00:00:00</td>\n",
" <td>2013-09-12 00:00:00</td>\n",
" <td>株式会社VinEx山鹿\\nVinEx山鹿</td>\n",
" <td>山鹿市鹿央町合里980番地1</td>\n",
" <td>酒類</td>\n",
" <td>単式蒸留しょうちゅう</td>\n",
" <td>法人成り等</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1830</th>\n",
" <td>新潟</td>\n",
" <td>十日町</td>\n",
" <td>令和2年8月31日</td>\n",
" <td>令和2年2月25日</td>\n",
" <td>法人番号3110001034090\\n株式会社 醸燻酒類研究所</td>\n",
" <td>十日町市本町5丁目55番地8</td>\n",
" <td>酒類</td>\n",
" <td>発泡酒</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1831</th>\n",
" <td>東京</td>\n",
" <td>神田</td>\n",
" <td>令和2年8月31日</td>\n",
" <td>令和元年12月16日</td>\n",
" <td>法人番号7010401007149\\n株式会社魚金</td>\n",
" <td>千代田区神田錦町2丁目2番1号 KANDA SQUARE1階店舗9区画</td>\n",
" <td>酒類</td>\n",
" <td>発泡酒</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1832</th>\n",
" <td>山梨</td>\n",
" <td>甲府</td>\n",
" <td>令和2年8月31日</td>\n",
" <td>令和2年6月26日</td>\n",
" <td>法人番号1090001011219\\n山梨銘醸株式会社</td>\n",
" <td>北杜市白州町台ヶ原2283番地</td>\n",
" <td>酒類</td>\n",
" <td>単式蒸留焼酎</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1833</th>\n",
" <td>北海道</td>\n",
" <td>札幌南</td>\n",
" <td>令和2年8月31日</td>\n",
" <td>令和2年4月9日</td>\n",
" <td>法人番号9430001021794\\n北海道コカ・コーラボトリング株式会社\\n北海道コカ・コ...</td>\n",
" <td>札幌市清田区清田一条一丁目2番1号</td>\n",
" <td>酒類</td>\n",
" <td>スピリッツ</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1834</th>\n",
" <td>北海道</td>\n",
" <td>札幌南</td>\n",
" <td>令和2年8月31日</td>\n",
" <td>令和2年4月9日</td>\n",
" <td>法人番号9430001021794\\n北海道コカ・コーラボトリング株式会社\\n北海道コカ・コ...</td>\n",
" <td>札幌市清田区清田一条一丁目2番1号</td>\n",
" <td>酒類</td>\n",
" <td>リキュール</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1835 rows × 9 columns</p>\n",
"</div>"
],
"text/plain": [
" 都道府県名 税務署名 免許等年月日 ... 免許等区分 品目 処理区分\n",
"0 岩手 一関 2014-01-01 00:00:00 ... 酒類 単式蒸留しょうちゅう 新規\n",
"1 愛知 名古屋中村 2014-01-08 00:00:00 ... 酒類 ビール 新規\n",
"2 愛知 名古屋中村 2014-01-08 00:00:00 ... 酒類 発泡酒 新規\n",
"3 福岡 八女 2014-01-08 00:00:00 ... 試験免許 その他の醸造酒 新規\n",
"4 熊本 山鹿 2014-01-27 00:00:00 ... 酒類 単式蒸留しょうちゅう 法人成り等\n",
"... ... ... ... ... ... ... ...\n",
"1830 新潟 十日町 令和2年8月31日 ... 酒類 発泡酒 新規\n",
"1831 東京 神田 令和2年8月31日 ... 酒類 発泡酒 新規\n",
"1832 山梨 甲府 令和2年8月31日 ... 酒類 単式蒸留焼酎 新規\n",
"1833 北海道 札幌南 令和2年8月31日 ... 酒類 スピリッツ 新規\n",
"1834 北海道 札幌南 令和2年8月31日 ... 酒類 リキュール 新規\n",
"\n",
"[1835 rows x 9 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 10
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 962
},
"id": "nfjrsfvgjjy6",
"outputId": "bc01d501-2da3-40b3-e7a7-d5b2fb6fc43b"
},
"source": [
"import datetime\n",
"\n",
"def parse_date(d):\n",
" if type(d) is int:\n",
" if d < 60:\n",
" # 1900-03-01より前の場合\n",
" days = d - 1\n",
" else:\n",
" # 1900-03-01以降の場合\n",
" days = d - 2\n",
" return pd.Timestamp(pd.to_datetime('1900/01/01') + datetime.timedelta(days=days))\n",
" elif type(d) is datetime.datetime:\n",
" return pd.Timestamp(d)\n",
" elif type(d) is str:\n",
" d = d.strip()\n",
" year, others = d.split(\"年\")\n",
" month, day = others.split(\"月\")\n",
" day = day.replace(\"日\", \"\")\n",
" if year.startswith(\"平成元\"):\n",
" year = 1989\n",
" elif year.startswith(\"平成\"):\n",
" year = int(year[2:]) + 1988\n",
" elif year.startswith(\"令和元\"):\n",
" year = 2019 \n",
" elif year.startswith(\"令和\"):\n",
" year = int(year[2:]) + 2018\n",
" else:\n",
" raise Exception(\"Invalid year format\")\n",
" return pd.Timestamp(year, int(month), int(day))\n",
" else:\n",
" raise Exception(\"Invalid data format\")\n",
"\n",
"df_clean = df_all.copy()\n",
"df_clean = df_clean.dropna()\n",
"df_clean[\"免許等年月日\"] = df_clean[\"免許等年月日\"].apply(parse_date)\n",
"df_clean[\"申請等年月日\"] = df_clean[\"申請等年月日\"].apply(parse_date)\n",
"df_clean"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>都道府県名</th>\n",
" <th>税務署名</th>\n",
" <th>免許等年月日</th>\n",
" <th>申請等年月日</th>\n",
" <th>製造者氏名又は名称</th>\n",
" <th>製造場所在地</th>\n",
" <th>免許等区分</th>\n",
" <th>品目</th>\n",
" <th>処理区分</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>岩手</td>\n",
" <td>一関</td>\n",
" <td>2014-01-01</td>\n",
" <td>2013-08-26</td>\n",
" <td>岩手銘醸株式会社</td>\n",
" <td>一関市千厩町千厩字北方134番地</td>\n",
" <td>酒類</td>\n",
" <td>単式蒸留しょうちゅう</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>愛知</td>\n",
" <td>名古屋中村</td>\n",
" <td>2014-01-08</td>\n",
" <td>2013-06-21</td>\n",
" <td>株式会社ワイマーケット\\nY.MARKET BREWING</td>\n",
" <td>名古屋市中村区名駅四丁目1705番地</td>\n",
" <td>酒類</td>\n",
" <td>ビール</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>愛知</td>\n",
" <td>名古屋中村</td>\n",
" <td>2014-01-08</td>\n",
" <td>2013-06-21</td>\n",
" <td>株式会社ワイマーケット\\nY.MARKET BREWING</td>\n",
" <td>名古屋市中村区名駅四丁目1705番地</td>\n",
" <td>酒類</td>\n",
" <td>発泡酒</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>福岡</td>\n",
" <td>八女</td>\n",
" <td>2014-01-08</td>\n",
" <td>2013-12-06</td>\n",
" <td>西吉田酒造株式会社</td>\n",
" <td>筑後市大字和泉612番地</td>\n",
" <td>試験免許</td>\n",
" <td>その他の醸造酒</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>熊本</td>\n",
" <td>山鹿</td>\n",
" <td>2014-01-27</td>\n",
" <td>2013-09-12</td>\n",
" <td>株式会社VinEx山鹿\\nVinEx山鹿</td>\n",
" <td>山鹿市鹿央町合里980番地1</td>\n",
" <td>酒類</td>\n",
" <td>単式蒸留しょうちゅう</td>\n",
" <td>法人成り等</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1830</th>\n",
" <td>新潟</td>\n",
" <td>十日町</td>\n",
" <td>2020-08-31</td>\n",
" <td>2020-02-25</td>\n",
" <td>法人番号3110001034090\\n株式会社 醸燻酒類研究所</td>\n",
" <td>十日町市本町5丁目55番地8</td>\n",
" <td>酒類</td>\n",
" <td>発泡酒</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1831</th>\n",
" <td>東京</td>\n",
" <td>神田</td>\n",
" <td>2020-08-31</td>\n",
" <td>2019-12-16</td>\n",
" <td>法人番号7010401007149\\n株式会社魚金</td>\n",
" <td>千代田区神田錦町2丁目2番1号 KANDA SQUARE1階店舗9区画</td>\n",
" <td>酒類</td>\n",
" <td>発泡酒</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1832</th>\n",
" <td>山梨</td>\n",
" <td>甲府</td>\n",
" <td>2020-08-31</td>\n",
" <td>2020-06-26</td>\n",
" <td>法人番号1090001011219\\n山梨銘醸株式会社</td>\n",
" <td>北杜市白州町台ヶ原2283番地</td>\n",
" <td>酒類</td>\n",
" <td>単式蒸留焼酎</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1833</th>\n",
" <td>北海道</td>\n",
" <td>札幌南</td>\n",
" <td>2020-08-31</td>\n",
" <td>2020-04-09</td>\n",
" <td>法人番号9430001021794\\n北海道コカ・コーラボトリング株式会社\\n北海道コカ・コ...</td>\n",
" <td>札幌市清田区清田一条一丁目2番1号</td>\n",
" <td>酒類</td>\n",
" <td>スピリッツ</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1834</th>\n",
" <td>北海道</td>\n",
" <td>札幌南</td>\n",
" <td>2020-08-31</td>\n",
" <td>2020-04-09</td>\n",
" <td>法人番号9430001021794\\n北海道コカ・コーラボトリング株式会社\\n北海道コカ・コ...</td>\n",
" <td>札幌市清田区清田一条一丁目2番1号</td>\n",
" <td>酒類</td>\n",
" <td>リキュール</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1722 rows × 9 columns</p>\n",
"</div>"
],
"text/plain": [
" 都道府県名 税務署名 免許等年月日 ... 免許等区分 品目 処理区分\n",
"0 岩手 一関 2014-01-01 ... 酒類 単式蒸留しょうちゅう 新規\n",
"1 愛知 名古屋中村 2014-01-08 ... 酒類 ビール 新規\n",
"2 愛知 名古屋中村 2014-01-08 ... 酒類 発泡酒 新規\n",
"3 福岡 八女 2014-01-08 ... 試験免許 その他の醸造酒 新規\n",
"4 熊本 山鹿 2014-01-27 ... 酒類 単式蒸留しょうちゅう 法人成り等\n",
"... ... ... ... ... ... ... ...\n",
"1830 新潟 十日町 2020-08-31 ... 酒類 発泡酒 新規\n",
"1831 東京 神田 2020-08-31 ... 酒類 発泡酒 新規\n",
"1832 山梨 甲府 2020-08-31 ... 酒類 単式蒸留焼酎 新規\n",
"1833 北海道 札幌南 2020-08-31 ... 酒類 スピリッツ 新規\n",
"1834 北海道 札幌南 2020-08-31 ... 酒類 リキュール 新規\n",
"\n",
"[1722 rows x 9 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 11
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "wjx9MTAZXlHU",
"outputId": "ae1dc7ba-0e4c-4b1b-ea47-6fa222f2184d"
},
"source": [
"df_clean[\"都道府県名\"].unique()"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array(['岩手', '愛知', '福岡', '熊本', '愛媛', '兵庫', '山梨', '東京', '栃木', '京都', '鳥取',\n",
" '宮崎', '新潟', '長崎', '和歌山', '大阪', '山口', '徳島', '三重', '鹿児島', '山形', '青森',\n",
" '岐阜', '神奈川', '静岡', '沖縄', '茨城', '北海道', '埼玉', '奈良', '長野', '広島', '千葉',\n",
" '秋田', '群馬', '福島', '香川', '福井', '高知', '宮城', '石川', '富山', '滋賀', '大分',\n",
" '岡山', '島根', '佐賀', '札幌', '宮﨑'], dtype=object)"
]
},
"metadata": {
"tags": []
},
"execution_count": 12
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "6PDTEfUKknAm",
"outputId": "b9b80bf3-894f-422d-c4f4-e46cc3a17ea3"
},
"source": [
"df_clean[\"免許等区分\"].unique()"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array(['酒類', '試験免許', '試験\\n免許', ' 試験免許', '試験免許 '], dtype=object)"
]
},
"metadata": {
"tags": []
},
"execution_count": 13
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "R0vkv_-XmV9h",
"outputId": "1c333304-5d91-415b-de81-bbddd0aa0d74"
},
"source": [
"df_clean[\"品目\"].unique()"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array(['単式蒸留しょうちゅう', 'ビール', '発泡酒', 'その他の醸造酒', 'リキュール', 'みりん', '果実酒',\n",
" 'スピリッツ', '清酒', '合成清酒', '連続式蒸留しょうちゅう', '粉末酒', '原料用アルコール', '雑酒',\n",
" '甘味果実酒', 'ブランデー', 'ウイスキー', '連続式蒸留焼酎', '単式蒸留焼酎', 'スピリッツ・リキュール',\n",
" 'その他の醸\\n造酒', '原料用アル\\nコール', '単式蒸留\\n焼酎'], dtype=object)"
]
},
"metadata": {
"tags": []
},
"execution_count": 14
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 168
},
"id": "0uCidOpaoFoF",
"outputId": "7a976fc2-1bd6-4248-857f-f13d31d86b58"
},
"source": [
"df_clean[df_clean[\"品目\"] == \"スピリッツ・リキュール\"]"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>都道府県名</th>\n",
" <th>税務署名</th>\n",
" <th>免許等年月日</th>\n",
" <th>申請等年月日</th>\n",
" <th>製造者氏名又は名称</th>\n",
" <th>製造場所在地</th>\n",
" <th>免許等区分</th>\n",
" <th>品目</th>\n",
" <th>処理区分</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1634</th>\n",
" <td>滋賀</td>\n",
" <td>草津</td>\n",
" <td>2020-04-01</td>\n",
" <td>2019-12-10</td>\n",
" <td>法人番号4011001007970\\n株式会社コカ・コーラ東京研究開発センター\\n株式会社コ...</td>\n",
" <td>守山市阿村町49番地</td>\n",
" <td>試験免許</td>\n",
" <td>スピリッツ・リキュール</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 都道府県名 税務署名 免許等年月日 申請等年月日 ... 製造場所在地 免許等区分 品目 処理区分\n",
"1634 滋賀 草津 2020-04-01 2019-12-10 ... 守山市阿村町49番地 試験免許 スピリッツ・リキュール 新規\n",
"\n",
"[1 rows x 9 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 15
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "tlvuBS_9mflw",
"outputId": "1da1537e-70d4-4a45-b91d-aa589f5aa16c"
},
"source": [
"df_clean[\"処理区分\"].unique()"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array(['新規', '法人成り等', '相続', '移転', '条件解除', '条件緩和', '新規\\u3000'],\n",
" dtype=object)"
]
},
"metadata": {
"tags": []
},
"execution_count": 16
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 945
},
"id": "eHOtRZ3AnKJQ",
"outputId": "2dff69e7-dc32-4429-e254-f03df5b14d35"
},
"source": [
"def cleanse_string(d):\n",
" d = d.replace(\"\\n\", \"\")\n",
" d = d.strip() \n",
" return d\n",
"\n",
"def normalize_category(d):\n",
" d = d.replace(\"しょうちゅう\", \"焼酎\")\n",
" d = d.replace(\"スピリッツ・リキュール\", \"スピリッツ\")\n",
" return d\n",
"\n",
"def normalize_prefecture(d):\n",
" if d == \"札幌\":\n",
" return \"北海道\"\n",
" elif d == \"宮﨑\":\n",
" return \"宮崎\"\n",
" else:\n",
" return d\n",
"\n",
"df_normalize = df_clean.copy()\n",
"df_normalize[\"免許等区分\"] = df_normalize[\"免許等区分\"].apply(cleanse_string)\n",
"df_normalize[\"品目\"] = df_normalize[\"品目\"].apply(normalize_category)\n",
"df_normalize[\"処理区分\"] = df_normalize[\"処理区分\"].apply(cleanse_string)\n",
"df_normalize[\"都道府県名\"] = df_normalize[\"都道府県名\"].apply(cleanse_string).apply(normalize_prefecture)\n",
"df_normalize"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>都道府県名</th>\n",
" <th>税務署名</th>\n",
" <th>免許等年月日</th>\n",
" <th>申請等年月日</th>\n",
" <th>製造者氏名又は名称</th>\n",
" <th>製造場所在地</th>\n",
" <th>免許等区分</th>\n",
" <th>品目</th>\n",
" <th>処理区分</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>岩手</td>\n",
" <td>一関</td>\n",
" <td>2014-01-01</td>\n",
" <td>2013-08-26</td>\n",
" <td>岩手銘醸株式会社</td>\n",
" <td>一関市千厩町千厩字北方134番地</td>\n",
" <td>酒類</td>\n",
" <td>単式蒸留焼酎</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>愛知</td>\n",
" <td>名古屋中村</td>\n",
" <td>2014-01-08</td>\n",
" <td>2013-06-21</td>\n",
" <td>株式会社ワイマーケット\\nY.MARKET BREWING</td>\n",
" <td>名古屋市中村区名駅四丁目1705番地</td>\n",
" <td>酒類</td>\n",
" <td>ビール</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>愛知</td>\n",
" <td>名古屋中村</td>\n",
" <td>2014-01-08</td>\n",
" <td>2013-06-21</td>\n",
" <td>株式会社ワイマーケット\\nY.MARKET BREWING</td>\n",
" <td>名古屋市中村区名駅四丁目1705番地</td>\n",
" <td>酒類</td>\n",
" <td>発泡酒</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>福岡</td>\n",
" <td>八女</td>\n",
" <td>2014-01-08</td>\n",
" <td>2013-12-06</td>\n",
" <td>西吉田酒造株式会社</td>\n",
" <td>筑後市大字和泉612番地</td>\n",
" <td>試験免許</td>\n",
" <td>その他の醸造酒</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>熊本</td>\n",
" <td>山鹿</td>\n",
" <td>2014-01-27</td>\n",
" <td>2013-09-12</td>\n",
" <td>株式会社VinEx山鹿\\nVinEx山鹿</td>\n",
" <td>山鹿市鹿央町合里980番地1</td>\n",
" <td>酒類</td>\n",
" <td>単式蒸留焼酎</td>\n",
" <td>法人成り等</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1830</th>\n",
" <td>新潟</td>\n",
" <td>十日町</td>\n",
" <td>2020-08-31</td>\n",
" <td>2020-02-25</td>\n",
" <td>法人番号3110001034090\\n株式会社 醸燻酒類研究所</td>\n",
" <td>十日町市本町5丁目55番地8</td>\n",
" <td>酒類</td>\n",
" <td>発泡酒</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1831</th>\n",
" <td>東京</td>\n",
" <td>神田</td>\n",
" <td>2020-08-31</td>\n",
" <td>2019-12-16</td>\n",
" <td>法人番号7010401007149\\n株式会社魚金</td>\n",
" <td>千代田区神田錦町2丁目2番1号 KANDA SQUARE1階店舗9区画</td>\n",
" <td>酒類</td>\n",
" <td>発泡酒</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1832</th>\n",
" <td>山梨</td>\n",
" <td>甲府</td>\n",
" <td>2020-08-31</td>\n",
" <td>2020-06-26</td>\n",
" <td>法人番号1090001011219\\n山梨銘醸株式会社</td>\n",
" <td>北杜市白州町台ヶ原2283番地</td>\n",
" <td>酒類</td>\n",
" <td>単式蒸留焼酎</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1833</th>\n",
" <td>北海道</td>\n",
" <td>札幌南</td>\n",
" <td>2020-08-31</td>\n",
" <td>2020-04-09</td>\n",
" <td>法人番号9430001021794\\n北海道コカ・コーラボトリング株式会社\\n北海道コカ・コ...</td>\n",
" <td>札幌市清田区清田一条一丁目2番1号</td>\n",
" <td>酒類</td>\n",
" <td>スピリッツ</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1834</th>\n",
" <td>北海道</td>\n",
" <td>札幌南</td>\n",
" <td>2020-08-31</td>\n",
" <td>2020-04-09</td>\n",
" <td>法人番号9430001021794\\n北海道コカ・コーラボトリング株式会社\\n北海道コカ・コ...</td>\n",
" <td>札幌市清田区清田一条一丁目2番1号</td>\n",
" <td>酒類</td>\n",
" <td>リキュール</td>\n",
" <td>新規</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1722 rows × 9 columns</p>\n",
"</div>"
],
"text/plain": [
" 都道府県名 税務署名 免許等年月日 ... 免許等区分 品目 処理区分\n",
"0 岩手 一関 2014-01-01 ... 酒類 単式蒸留焼酎 新規\n",
"1 愛知 名古屋中村 2014-01-08 ... 酒類 ビール 新規\n",
"2 愛知 名古屋中村 2014-01-08 ... 酒類 発泡酒 新規\n",
"3 福岡 八女 2014-01-08 ... 試験免許 その他の醸造酒 新規\n",
"4 熊本 山鹿 2014-01-27 ... 酒類 単式蒸留焼酎 法人成り等\n",
"... ... ... ... ... ... ... ...\n",
"1830 新潟 十日町 2020-08-31 ... 酒類 発泡酒 新規\n",
"1831 東京 神田 2020-08-31 ... 酒類 発泡酒 新規\n",
"1832 山梨 甲府 2020-08-31 ... 酒類 単式蒸留焼酎 新規\n",
"1833 北海道 札幌南 2020-08-31 ... 酒類 スピリッツ 新規\n",
"1834 北海道 札幌南 2020-08-31 ... 酒類 リキュール 新規\n",
"\n",
"[1722 rows x 9 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 22
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "3HdE6Q2KsVM9",
"outputId": "511005b3-95ee-4b17-8a57-2b757106d852"
},
"source": [
"df_normalize[\"都道府県名\"].unique()"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array(['岩手', '愛知', '福岡', '熊本', '愛媛', '兵庫', '山梨', '東京', '栃木', '京都', '鳥取',\n",
" '宮崎', '新潟', '長崎', '和歌山', '大阪', '山口', '徳島', '三重', '鹿児島', '山形', '青森',\n",
" '岐阜', '神奈川', '静岡', '沖縄', '茨城', '北海道', '埼玉', '奈良', '長野', '広島', '千葉',\n",
" '秋田', '群馬', '福島', '香川', '福井', '高知', '宮城', '石川', '富山', '滋賀', '大分',\n",
" '岡山', '島根', '佐賀'], dtype=object)"
]
},
"metadata": {
"tags": []
},
"execution_count": 25
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "oCw5T5rYp2OP"
},
"source": [
"### 様々な角度でデータを眺める\n",
"\n",
"酒造免許取得社数\n",
"\n",
"* 観点\n",
" * 品目別\n",
" * 処理区分別\n",
" * 免許区分別\n",
" * 比較\n",
"* 分析\n",
" * 新規取得が多い品目はどれか\n",
" * 新規取得が多い年は何年か\n",
" * 申請が多い月は何月か\n",
" * 申請にどれぐらいかかっているのか\n",
" * どのエリアが取得社数が多いか"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 542
},
"id": "htriwueiWpW8",
"outputId": "4e57ec23-4c24-40b0-9aba-062cec8ea894"
},
"source": [
"import plotly.express as px\n",
"\n",
"df_license = df_normalize.copy()\n",
"df_license = df_license.groupby([\"都道府県名\"]).count()\n",
"df_license = df_license[[\"免許等年月日\"]].rename(columns={\"免許等年月日\": \"件数\"})\n",
"df_license = df_license.sort_values(\"件数\", ascending=False)\n",
"df_license = df_license.reset_index()\n",
"px.bar(df_license, x=\"都道府県名\", y=\"件数\")"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"<html>\n",
"<head><meta charset=\"utf-8\" /></head>\n",
"<body>\n",
" <div>\n",
" <script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_SVG\"></script><script type=\"text/javascript\">if (window.MathJax) {MathJax.Hub.Config({SVG: {font: \"STIX-Web\"}});}</script>\n",
" <script type=\"text/javascript\">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>\n",
" <script src=\"https://cdn.plot.ly/plotly-latest.min.js\"></script> \n",
" <div id=\"8b4c9303-e3cf-4c0e-ab0d-bd83cee2ad7a\" class=\"plotly-graph-div\" style=\"height:525px; width:100%;\"></div>\n",
" <script type=\"text/javascript\">\n",
" \n",
" window.PLOTLYENV=window.PLOTLYENV || {};\n",
" \n",
" if (document.getElementById(\"8b4c9303-e3cf-4c0e-ab0d-bd83cee2ad7a\")) {\n",
" Plotly.newPlot(\n",
" '8b4c9303-e3cf-4c0e-ab0d-bd83cee2ad7a',\n",
" [{\"alignmentgroup\": \"True\", \"hoverlabel\": {\"namelength\": 0}, \"hovertemplate\": \"\\u90fd\\u9053\\u5e9c\\u770c\\u540d=%{x}<br>\\u4ef6\\u6570=%{y}\", \"legendgroup\": \"\", \"marker\": {\"color\": \"#636efa\"}, \"name\": \"\", \"offsetgroup\": \"\", \"orientation\": \"v\", \"showlegend\": false, \"textposition\": \"auto\", \"type\": \"bar\", \"x\": [\"\\u6771\\u4eac\", \"\\u9577\\u91ce\", \"\\u795e\\u5948\\u5ddd\", \"\\u5927\\u962a\", \"\\u4eac\\u90fd\", \"\\u5317\\u6d77\\u9053\", \"\\u65b0\\u6f5f\", \"\\u798f\\u5ca1\", \"\\u6c96\\u7e04\", \"\\u9e7f\\u5150\\u5cf6\", \"\\u9759\\u5ca1\", \"\\u5175\\u5eab\", \"\\u5343\\u8449\", \"\\u798f\\u5cf6\", \"\\u5c71\\u68a8\", \"\\u5c90\\u961c\", \"\\u611b\\u77e5\", \"\\u5ca9\\u624b\", \"\\u9752\\u68ee\", \"\\u5bae\\u57ce\", \"\\u57fc\\u7389\", \"\\u5c71\\u5f62\", \"\\u8328\\u57ce\", \"\\u5e83\\u5cf6\", \"\\u5bae\\u5d0e\", \"\\u718a\\u672c\", \"\\u548c\\u6b4c\\u5c71\", \"\\u9ce5\\u53d6\", \"\\u9ad8\\u77e5\", \"\\u5fb3\\u5cf6\", \"\\u4e09\\u91cd\", \"\\u6803\\u6728\", \"\\u77f3\\u5ddd\", \"\\u5c71\\u53e3\", \"\\u5cf6\\u6839\", \"\\u5948\\u826f\", \"\\u5ca1\\u5c71\", \"\\u79cb\\u7530\", \"\\u6ecb\\u8cc0\", \"\\u9577\\u5d0e\", \"\\u9999\\u5ddd\", \"\\u7fa4\\u99ac\", \"\\u5bcc\\u5c71\", \"\\u5927\\u5206\", \"\\u798f\\u4e95\", \"\\u611b\\u5a9b\", \"\\u4f50\\u8cc0\"], \"xaxis\": \"x\", \"y\": [133, 95, 83, 83, 76, 70, 61, 55, 54, 50, 49, 47, 42, 42, 41, 40, 40, 39, 38, 36, 36, 36, 34, 34, 32, 29, 27, 25, 24, 23, 22, 22, 21, 20, 19, 19, 18, 14, 12, 12, 12, 11, 11, 11, 10, 10, 4], \"yaxis\": \"y\"}],\n",
" {\"barmode\": \"relative\", \"legend\": {\"tracegroupgap\": 0}, \"margin\": {\"t\": 60}, \"template\": {\"data\": {\"bar\": [{\"error_x\": {\"color\": \"#2a3f5f\"}, \"error_y\": {\"color\": \"#2a3f5f\"}, \"marker\": {\"line\": {\"color\": \"#E5ECF6\", \"width\": 0.5}}, \"type\": \"bar\"}], \"barpolar\": [{\"marker\": {\"line\": {\"color\": \"#E5ECF6\", \"width\": 0.5}}, \"type\": \"barpolar\"}], \"carpet\": [{\"aaxis\": {\"endlinecolor\": \"#2a3f5f\", \"gridcolor\": \"white\", \"linecolor\": \"white\", \"minorgridcolor\": \"white\", \"startlinecolor\": \"#2a3f5f\"}, \"baxis\": {\"endlinecolor\": \"#2a3f5f\", \"gridcolor\": \"white\", \"linecolor\": \"white\", \"minorgridcolor\": \"white\", \"startlinecolor\": \"#2a3f5f\"}, \"type\": \"carpet\"}], \"choropleth\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"type\": \"choropleth\"}], \"contour\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"contour\"}], \"contourcarpet\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"type\": \"contourcarpet\"}], \"heatmap\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"heatmap\"}], \"heatmapgl\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"heatmapgl\"}], \"histogram\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"histogram\"}], \"histogram2d\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"histogram2d\"}], \"histogram2dcontour\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"histogram2dcontour\"}], \"mesh3d\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"type\": \"mesh3d\"}], \"parcoords\": [{\"line\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"parcoords\"}], \"pie\": [{\"automargin\": true, \"type\": \"pie\"}], \"scatter\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scatter\"}], \"scatter3d\": [{\"line\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scatter3d\"}], \"scattercarpet\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scattercarpet\"}], \"scattergeo\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scattergeo\"}], \"scattergl\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scattergl\"}], \"scattermapbox\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scattermapbox\"}], \"scatterpolar\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scatterpolar\"}], \"scatterpolargl\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scatterpolargl\"}], \"scatterternary\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scatterternary\"}], \"surface\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"surface\"}], \"table\": [{\"cells\": {\"fill\": {\"color\": \"#EBF0F8\"}, \"line\": {\"color\": \"white\"}}, \"header\": {\"fill\": {\"color\": \"#C8D4E3\"}, \"line\": {\"color\": \"white\"}}, \"type\": \"table\"}]}, \"layout\": {\"annotationdefaults\": {\"arrowcolor\": \"#2a3f5f\", \"arrowhead\": 0, \"arrowwidth\": 1}, \"coloraxis\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"colorscale\": {\"diverging\": [[0, \"#8e0152\"], [0.1, \"#c51b7d\"], [0.2, \"#de77ae\"], [0.3, \"#f1b6da\"], [0.4, \"#fde0ef\"], [0.5, \"#f7f7f7\"], [0.6, \"#e6f5d0\"], [0.7, \"#b8e186\"], [0.8, \"#7fbc41\"], [0.9, \"#4d9221\"], [1, \"#276419\"]], \"sequential\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"sequentialminus\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]]}, \"colorway\": [\"#636efa\", \"#EF553B\", \"#00cc96\", \"#ab63fa\", \"#FFA15A\", \"#19d3f3\", \"#FF6692\", \"#B6E880\", \"#FF97FF\", \"#FECB52\"], \"font\": {\"color\": \"#2a3f5f\"}, \"geo\": {\"bgcolor\": \"white\", \"lakecolor\": \"white\", \"landcolor\": \"#E5ECF6\", \"showlakes\": true, \"showland\": true, \"subunitcolor\": \"white\"}, \"hoverlabel\": {\"align\": \"left\"}, \"hovermode\": \"closest\", \"mapbox\": {\"style\": \"light\"}, \"paper_bgcolor\": \"white\", \"plot_bgcolor\": \"#E5ECF6\", \"polar\": {\"angularaxis\": {\"gridcolor\": \"white\", \"linecolor\": \"white\", \"ticks\": \"\"}, \"bgcolor\": \"#E5ECF6\", \"radialaxis\": {\"gridcolor\": \"white\", \"linecolor\": \"white\", \"ticks\": \"\"}}, \"scene\": {\"xaxis\": {\"backgroundcolor\": \"#E5ECF6\", \"gridcolor\": \"white\", \"gridwidth\": 2, \"linecolor\": \"white\", \"showbackground\": true, \"ticks\": \"\", \"zerolinecolor\": \"white\"}, \"yaxis\": {\"backgroundcolor\": \"#E5ECF6\", \"gridcolor\": \"white\", \"gridwidth\": 2, \"linecolor\": \"white\", \"showbackground\": true, \"ticks\": \"\", \"zerolinecolor\": \"white\"}, \"zaxis\": {\"backgroundcolor\": \"#E5ECF6\", \"gridcolor\": \"white\", \"gridwidth\": 2, \"linecolor\": \"white\", \"showbackground\": true, \"ticks\": \"\", \"zerolinecolor\": \"white\"}}, \"shapedefaults\": {\"line\": {\"color\": \"#2a3f5f\"}}, \"ternary\": {\"aaxis\": {\"gridcolor\": \"white\", \"linecolor\": \"white\", \"ticks\": \"\"}, \"baxis\": {\"gridcolor\": \"white\", \"linecolor\": \"white\", \"ticks\": \"\"}, \"bgcolor\": \"#E5ECF6\", \"caxis\": {\"gridcolor\": \"white\", \"linecolor\": \"white\", \"ticks\": \"\"}}, \"title\": {\"x\": 0.05}, \"xaxis\": {\"automargin\": true, \"gridcolor\": \"white\", \"linecolor\": \"white\", \"ticks\": \"\", \"title\": {\"standoff\": 15}, \"zerolinecolor\": \"white\", \"zerolinewidth\": 2}, \"yaxis\": {\"automargin\": true, \"gridcolor\": \"white\", \"linecolor\": \"white\", \"ticks\": \"\", \"title\": {\"standoff\": 15}, \"zerolinecolor\": \"white\", \"zerolinewidth\": 2}}}, \"xaxis\": {\"anchor\": \"y\", \"domain\": [0.0, 1.0], \"title\": {\"text\": \"\\u90fd\\u9053\\u5e9c\\u770c\\u540d\"}}, \"yaxis\": {\"anchor\": \"x\", \"domain\": [0.0, 1.0], \"title\": {\"text\": \"\\u4ef6\\u6570\"}}},\n",
" {\"responsive\": true}\n",
" ).then(function(){\n",
" \n",
"var gd = document.getElementById('8b4c9303-e3cf-4c0e-ab0d-bd83cee2ad7a');\n",
"var x = new MutationObserver(function (mutations, observer) {{\n",
" var display = window.getComputedStyle(gd).display;\n",
" if (!display || display === 'none') {{\n",
" console.log([gd, 'removed!']);\n",
" Plotly.purge(gd);\n",
" observer.disconnect();\n",
" }}\n",
"}});\n",
"\n",
"// Listen for the removal of the full notebook cells\n",
"var notebookContainer = gd.closest('#notebook-container');\n",
"if (notebookContainer) {{\n",
" x.observe(notebookContainer, {childList: true});\n",
"}}\n",
"\n",
"// Listen for the clearing of the current output cell\n",
"var outputEl = gd.closest('.output');\n",
"if (outputEl) {{\n",
" x.observe(outputEl, {childList: true});\n",
"}}\n",
"\n",
" })\n",
" };\n",
" \n",
" </script>\n",
" </div>\n",
"</body>\n",
"</html>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 300
},
"id": "CxJj4d8GMXha",
"outputId": "f3e10c82-bac3-484c-8cbf-b9357bcb23fd"
},
"source": [
"df_license = df_normalize.copy()\n",
"df_license[\"取得日数\"] = (df_license[\"免許等年月日\"] - df_license[\"申請等年月日\"]).dt.days\n",
"df_license.describe()"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>取得日数</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1722.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>106.144599</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>271.564423</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>-10769.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>63.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>95.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>150.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>493.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 取得日数\n",
"count 1722.000000\n",
"mean 106.144599\n",
"std 271.564423\n",
"min -10769.000000\n",
"25% 63.000000\n",
"50% 95.000000\n",
"75% 150.000000\n",
"max 493.000000"
]
},
"metadata": {
"tags": []
},
"execution_count": 32
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 542
},
"id": "ysr0ztMyPIkF",
"outputId": "1ed40862-d881-435f-9a4f-4fc3cc25d1c2"
},
"source": [
"import plotly.express as px\n",
"\n",
"px.box(df_license[\n",
" (df_license[\"取得日数\"] <= 365) & \n",
" (df_license[\"取得日数\"] > 0)\n",
"], y=\"取得日数\", points=\"all\")"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"<html>\n",
"<head><meta charset=\"utf-8\" /></head>\n",
"<body>\n",
" <div>\n",
" <script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_SVG\"></script><script type=\"text/javascript\">if (window.MathJax) {MathJax.Hub.Config({SVG: {font: \"STIX-Web\"}});}</script>\n",
" <script type=\"text/javascript\">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>\n",
" <script src=\"https://cdn.plot.ly/plotly-latest.min.js\"></script> \n",
" <div id=\"f709506e-5f98-4ecf-9cbc-1d4306d7042a\" class=\"plotly-graph-div\" style=\"height:525px; width:100%;\"></div>\n",
" <script type=\"text/javascript\">\n",
" \n",
" window.PLOTLYENV=window.PLOTLYENV || {};\n",
" \n",
" if (document.getElementById(\"f709506e-5f98-4ecf-9cbc-1d4306d7042a\")) {\n",
" Plotly.newPlot(\n",
" 'f709506e-5f98-4ecf-9cbc-1d4306d7042a',\n",
" [{\"alignmentgroup\": \"True\", \"boxpoints\": \"all\", \"hoverlabel\": {\"namelength\": 0}, \"hovertemplate\": \"\\u53d6\\u5f97\\u65e5\\u6570=%{y}\", \"legendgroup\": \"\", \"marker\": {\"color\": \"#636efa\"}, \"name\": \"\", \"notched\": false, \"offsetgroup\": \"\", \"orientation\": \"v\", \"showlegend\": false, \"type\": \"box\", \"x0\": \" \", \"xaxis\": \"x\", \"y\": [128, 201, 201, 33, 137, 155, 72, 89, 154, 120, 177, 94, 39, 188, 65, 116, 98, 98, 67, 67, 55, 42, 48, 209, 196, 55, 166, 8, 167, 116, 7, 7, 7, 63, 63, 90, 90, 90, 90, 90, 90, 77, 40, 160, 157, 106, 79, 104, 51, 51, 30, 30, 66, 19, 19, 110, 179, 127, 36, 68, 175, 57, 174, 120, 42, 42, 42, 125, 232, 98, 41, 45, 45, 30, 30, 34, 176, 125, 125, 188, 31, 46, 26, 186, 79, 79, 79, 66, 57, 48, 140, 81, 80, 156, 142, 147, 66, 87, 162, 96, 96, 96, 96, 96, 96, 96, 121, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 70, 58, 58, 66, 66, 66, 66, 66, 66, 66, 66, 58, 58, 208, 170, 15, 15, 15, 15, 15, 15, 60, 42, 37, 27, 125, 62, 91, 169, 71, 70, 70, 43, 176, 81, 120, 120, 142, 52, 158, 145, 56, 56, 56, 56, 56, 56, 56, 223, 115, 178, 75, 75, 93, 83, 83, 83, 157, 48, 151, 45, 45, 45, 45, 45, 45, 81, 122, 116, 87, 71, 153, 137, 58, 190, 142, 142, 190, 154, 159, 107, 224, 146, 52, 128, 56, 110, 56, 56, 76, 76, 130, 197, 161, 126, 121, 121, 121, 121, 121, 121, 110, 82, 62, 62, 54, 50, 40, 65, 54, 39, 155, 111, 121, 192, 199, 60, 81, 81, 58, 52, 144, 111, 63, 63, 63, 63, 63, 63, 118, 103, 108, 43, 92, 92, 182, 182, 182, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 67, 67, 67, 67, 211, 91, 59, 125, 47, 115, 21, 103, 152, 112, 133, 42, 42, 28, 63, 144, 147, 43, 53, 140, 76, 17, 124, 282, 38, 149, 126, 126, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 7, 151, 34, 134, 92, 92, 70, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 111, 57, 57, 147, 241, 60, 45, 109, 109, 74, 153, 111, 62, 62, 62, 62, 63, 146, 182, 165, 97, 80, 23, 100, 265, 265, 160, 33, 33, 33, 178, 56, 186, 148, 148, 106, 71, 71, 186, 108, 207, 21, 128, 58, 64, 64, 193, 55, 165, 165, 271, 118, 281, 150, 111, 74, 35, 136, 136, 116, 153, 147, 126, 159, 301, 37, 266, 141, 56, 59, 219, 226, 130, 130, 130, 130, 130, 130, 70, 70, 70, 70, 70, 70, 70, 70, 70, 109, 128, 24, 153, 165, 83, 77, 54, 192, 181, 189, 147, 81, 149, 195, 69, 26, 21, 58, 58, 58, 58, 70, 77, 161, 113, 345, 88, 49, 204, 133, 100, 267, 126, 126, 126, 84, 84, 77, 64, 63, 63, 44, 74, 60, 125, 18, 18, 18, 18, 18, 18, 185, 115, 130, 63, 60, 21, 79, 361, 151, 71, 24, 133, 100, 72, 171, 118, 85, 76, 161, 16, 91, 142, 122, 94, 94, 297, 109, 92, 119, 28, 167, 138, 14, 118, 193, 193, 151, 143, 96, 56, 180, 111, 178, 131, 56, 50, 184, 104, 55, 93, 55, 250, 183, 80, 80, 80, 80, 80, 171, 143, 182, 92, 356, 49, 222, 36, 212, 187, 159, 120, 110, 197, 98, 64, 64, 64, 64, 64, 64, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 81, 174, 76, 176, 162, 56, 118, 75, 75, 75, 75, 75, 75, 189, 161, 161, 85, 85, 34, 34, 34, 175, 211, 74, 74, 133, 131, 131, 123, 123, 102, 102, 72, 72, 153, 55, 166, 119, 64, 50, 50, 123, 123, 149, 70, 160, 185, 95, 161, 127, 94, 336, 55, 115, 115, 168, 8, 15, 145, 57, 57, 146, 61, 87, 73, 26, 26, 206, 148, 148, 148, 148, 148, 154, 159, 192, 245, 101, 59, 44, 131, 64, 64, 61, 46, 153, 153, 339, 138, 174, 161, 77, 124, 89, 250, 168, 168, 55, 170, 28, 57, 57, 57, 57, 57, 57, 57, 174, 106, 106, 52, 150, 185, 182, 154, 125, 100, 204, 72, 309, 133, 23, 23, 23, 23, 23, 23, 23, 23, 23, 45, 71, 213, 127, 37, 52, 52, 122, 122, 107, 203, 142, 132, 122, 170, 162, 67, 358, 157, 101, 73, 62, 62, 62, 19, 121, 65, 44, 166, 198, 126, 140, 149, 49, 154, 57, 57, 57, 110, 110, 110, 110, 110, 110, 172, 218, 157, 84, 79, 117, 88, 150, 58, 144, 110, 36, 167, 146, 87, 112, 43, 93, 245, 74, 98, 117, 72, 25, 169, 107, 149, 144, 35, 35, 35, 35, 35, 170, 205, 234, 269, 58, 261, 261, 166, 212, 120, 120, 65, 65, 168, 42, 42, 253, 64, 169, 16, 96, 45, 221, 54, 211, 83, 53, 138, 126, 32, 32, 32, 160, 174, 163, 86, 276, 101, 93, 45, 46, 193, 97, 54, 38, 161, 150, 192, 192, 325, 84, 84, 168, 182, 48, 244, 61, 61, 61, 122, 81, 205, 213, 192, 164, 182, 182, 96, 86, 108, 335, 130, 61, 41, 282, 119, 189, 189, 50, 143, 321, 217, 38, 170, 108, 160, 237, 57, 168, 112, 84, 126, 56, 36, 112, 236, 145, 158, 151, 151, 92, 180, 128, 89, 155, 203, 56, 56, 56, 138, 113, 183, 215, 44, 119, 69, 164, 119, 158, 178, 149, 161, 152, 140, 90, 105, 140, 104, 139, 153, 147, 230, 230, 174, 137, 175, 189, 185, 151, 146, 159, 153, 140, 125, 116, 152, 137, 67, 162, 153, 131, 180, 167, 141, 155, 118, 127, 156, 149, 119, 150, 122, 121, 151, 205, 112, 112, 112, 82, 51, 156, 46, 120, 57, 58, 132, 46, 63, 48, 154, 118, 64, 64, 72, 146, 146, 146, 77, 117, 107, 84, 200, 91, 40, 119, 170, 175, 332, 109, 55, 18, 91, 76, 76, 76, 76, 76, 304, 304, 105, 69, 131, 131, 49, 138, 12, 104, 134, 90, 191, 115, 115, 115, 115, 115, 73, 73, 75, 73, 72, 115, 124, 62, 62, 128, 79, 43, 42, 112, 112, 96, 97, 103, 282, 56, 161, 242, 50, 167, 177, 24, 38, 38, 38, 38, 38, 38, 152, 124, 121, 141, 82, 82, 82, 188, 127, 210, 163, 51, 169, 27, 139, 140, 76, 177, 217, 20, 209, 108, 70, 58, 87, 87, 121, 36, 36, 70, 230, 310, 83, 168, 49, 183, 146, 98, 82, 70, 70, 91, 91, 78, 126, 228, 228, 126, 101, 182, 202, 228, 286, 339, 140, 229, 282, 181, 100, 138, 138, 277, 162, 110, 62, 57, 57, 53, 189, 162, 60, 65, 170, 148, 150, 161, 63, 76, 70, 82, 82, 203, 183, 70, 257, 139, 37, 188, 254, 143, 267, 146, 69, 69, 212, 236, 92, 49, 43, 138, 165, 56, 73, 265, 64, 75, 162, 262, 65, 151, 22, 77, 126, 51, 131, 131, 69, 49, 79, 79, 57, 160, 66, 66, 120, 148, 283, 142, 163, 226, 344, 344, 232, 226, 127, 105, 105, 105, 105, 143, 122, 151, 80, 105, 126, 126, 105, 42, 105, 56, 105, 56, 42, 42, 105, 56, 105, 105, 56, 42, 56, 105, 56, 105, 56, 300, 291, 106, 106, 245, 124, 50, 264, 56, 78, 134, 36, 30, 30, 58, 44, 210, 167, 69, 188, 162, 254, 69, 69, 69, 69, 69, 69, 69, 69, 97, 164, 91, 104, 104, 154, 61, 322, 175, 175, 175, 175, 175, 175, 175, 175, 89, 50, 140, 140, 118, 118, 69, 66, 66, 126, 228, 64, 64, 64, 78, 283, 15, 141, 64, 158, 147, 56, 149, 148, 203, 228, 98, 107, 114, 143, 93, 84, 252, 28, 28, 50, 70, 137, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 55, 49, 133, 190, 84, 84, 57, 132, 57, 136, 153, 255, 88, 88, 88, 88, 88, 174, 46, 62, 84, 32, 32, 32, 102, 203, 235, 235, 155, 43, 115, 115, 157, 60, 60, 66, 137, 148, 150, 94, 156, 151, 63, 168, 84, 68, 119, 163, 163, 163, 87, 226, 276, 299, 141, 84, 84, 198, 206, 235, 130, 130, 144, 102, 102, 102, 102, 102, 102, 81, 58, 181, 112, 150, 77, 56, 21, 217, 217, 178, 45, 65, 62, 62, 80, 80, 43, 159, 233, 87, 87, 58, 73, 105, 182, 148, 200, 51, 39, 119, 119, 178, 152, 152, 49, 49, 49, 49, 49, 49, 92, 42, 114, 84, 140, 155, 217, 75, 75, 75, 127, 177, 47, 47, 351, 122, 59, 177, 91, 123, 124, 124, 124, 124, 124, 103, 319, 131, 196, 70, 128, 60, 60, 60, 160, 80, 70, 85, 51, 193, 39, 89, 92, 113, 240, 240, 15, 15, 15, 240, 122, 122, 117, 93, 219, 95, 7, 264, 244, 187, 64, 64, 44, 203, 72, 17, 37, 47, 47, 112, 117, 275, 23, 246, 143, 47, 99, 99, 113, 147, 98, 98, 98, 98, 98, 201, 83, 218, 178, 269, 50, 167, 24, 24, 24, 58, 179, 179, 158, 158, 158, 179, 70, 70, 14, 4, 6, 134, 213, 134, 60, 35, 11, 19, 19, 11, 5, 18, 12, 5, 3, 7, 11, 123, 88, 88, 154, 4, 159, 214, 214, 214, 126, 11, 79, 266, 97, 121, 154, 132, 55, 26, 6, 223, 35, 70, 70, 70, 5, 32, 78, 52, 10, 48, 181, 68, 80, 323, 181, 22, 53, 57, 90, 153, 7, 7, 7, 7, 7, 7, 83, 33, 83, 129, 125, 125, 125, 125, 125, 44, 147, 70, 70, 117, 117, 117, 117, 112, 55, 16, 223, 112, 55, 43, 111, 117, 138, 70, 112, 117, 112, 36, 61, 83, 30, 254, 280, 291, 238, 56, 238, 291, 238, 291, 71, 46, 46, 82, 174, 308, 34, 73, 61, 112, 61, 26, 221, 95, 95, 95, 115, 95, 95, 95, 95, 61, 81, 188, 54, 210, 210, 162, 56, 91, 80, 64, 64, 64, 85, 44, 196, 49, 315, 176, 108, 108, 49, 254, 79, 56, 169, 135, 128, 188, 259, 66, 144, 144], \"y0\": \" \", \"yaxis\": \"y\"}],\n",
" {\"boxmode\": \"group\", \"legend\": {\"tracegroupgap\": 0}, \"margin\": {\"t\": 60}, \"template\": {\"data\": {\"bar\": [{\"error_x\": {\"color\": \"#2a3f5f\"}, \"error_y\": {\"color\": \"#2a3f5f\"}, \"marker\": {\"line\": {\"color\": \"#E5ECF6\", \"width\": 0.5}}, \"type\": \"bar\"}], \"barpolar\": [{\"marker\": {\"line\": {\"color\": \"#E5ECF6\", \"width\": 0.5}}, \"type\": \"barpolar\"}], \"carpet\": [{\"aaxis\": {\"endlinecolor\": \"#2a3f5f\", \"gridcolor\": \"white\", \"linecolor\": \"white\", \"minorgridcolor\": \"white\", \"startlinecolor\": \"#2a3f5f\"}, \"baxis\": {\"endlinecolor\": \"#2a3f5f\", \"gridcolor\": \"white\", \"linecolor\": \"white\", \"minorgridcolor\": \"white\", \"startlinecolor\": \"#2a3f5f\"}, \"type\": \"carpet\"}], \"choropleth\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"type\": \"choropleth\"}], \"contour\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"contour\"}], \"contourcarpet\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"type\": \"contourcarpet\"}], \"heatmap\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"heatmap\"}], \"heatmapgl\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"heatmapgl\"}], \"histogram\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"histogram\"}], \"histogram2d\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"histogram2d\"}], \"histogram2dcontour\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"histogram2dcontour\"}], \"mesh3d\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"type\": \"mesh3d\"}], \"parcoords\": [{\"line\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"parcoords\"}], \"pie\": [{\"automargin\": true, \"type\": \"pie\"}], \"scatter\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scatter\"}], \"scatter3d\": [{\"line\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scatter3d\"}], \"scattercarpet\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scattercarpet\"}], \"scattergeo\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scattergeo\"}], \"scattergl\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scattergl\"}], \"scattermapbox\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scattermapbox\"}], \"scatterpolar\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scatterpolar\"}], \"scatterpolargl\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scatterpolargl\"}], \"scatterternary\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scatterternary\"}], \"surface\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"surface\"}], \"table\": [{\"cells\": {\"fill\": {\"color\": \"#EBF0F8\"}, \"line\": {\"color\": \"white\"}}, \"header\": {\"fill\": {\"color\": \"#C8D4E3\"}, \"line\": {\"color\": \"white\"}}, \"type\": \"table\"}]}, \"layout\": {\"annotationdefaults\": {\"arrowcolor\": \"#2a3f5f\", \"arrowhead\": 0, \"arrowwidth\": 1}, \"coloraxis\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"colorscale\": {\"diverging\": [[0, \"#8e0152\"], [0.1, \"#c51b7d\"], [0.2, \"#de77ae\"], [0.3, \"#f1b6da\"], [0.4, \"#fde0ef\"], [0.5, \"#f7f7f7\"], [0.6, \"#e6f5d0\"], [0.7, \"#b8e186\"], [0.8, \"#7fbc41\"], [0.9, \"#4d9221\"], [1, \"#276419\"]], \"sequential\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"sequentialminus\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]]}, \"colorway\": [\"#636efa\", \"#EF553B\", \"#00cc96\", \"#ab63fa\", \"#FFA15A\", \"#19d3f3\", \"#FF6692\", \"#B6E880\", \"#FF97FF\", \"#FECB52\"], \"font\": {\"color\": \"#2a3f5f\"}, \"geo\": {\"bgcolor\": \"white\", \"lakecolor\": \"white\", \"landcolor\": \"#E5ECF6\", \"showlakes\": true, \"showland\": true, \"subunitcolor\": \"white\"}, \"hoverlabel\": {\"align\": \"left\"}, \"hovermode\": \"closest\", \"mapbox\": {\"style\": \"light\"}, \"paper_bgcolor\": \"white\", \"plot_bgcolor\": \"#E5ECF6\", \"polar\": {\"angularaxis\": {\"gridcolor\": \"white\", \"linecolor\": \"white\", \"ticks\": \"\"}, \"bgcolor\": \"#E5ECF6\", \"radialaxis\": {\"gridcolor\": \"white\", \"linecolor\": \"white\", \"ticks\": \"\"}}, \"scene\": {\"xaxis\": {\"backgroundcolor\": \"#E5ECF6\", \"gridcolor\": \"white\", \"gridwidth\": 2, \"linecolor\": \"white\", \"showbackground\": true, \"ticks\": \"\", \"zerolinecolor\": \"white\"}, \"yaxis\": {\"backgroundcolor\": \"#E5ECF6\", \"gridcolor\": \"white\", \"gridwidth\": 2, \"linecolor\": \"white\", \"showbackground\": true, \"ticks\": \"\", \"zerolinecolor\": \"white\"}, \"zaxis\": {\"backgroundcolor\": \"#E5ECF6\", \"gridcolor\": \"white\", \"gridwidth\": 2, \"linecolor\": \"white\", \"showbackground\": true, \"ticks\": \"\", \"zerolinecolor\": \"white\"}}, \"shapedefaults\": {\"line\": {\"color\": \"#2a3f5f\"}}, \"ternary\": {\"aaxis\": {\"gridcolor\": \"white\", \"linecolor\": \"white\", \"ticks\": \"\"}, \"baxis\": {\"gridcolor\": \"white\", \"linecolor\": \"white\", \"ticks\": \"\"}, \"bgcolor\": \"#E5ECF6\", \"caxis\": {\"gridcolor\": \"white\", \"linecolor\": \"white\", \"ticks\": \"\"}}, \"title\": {\"x\": 0.05}, \"xaxis\": {\"automargin\": true, \"gridcolor\": \"white\", \"linecolor\": \"white\", \"ticks\": \"\", \"title\": {\"standoff\": 15}, \"zerolinecolor\": \"white\", \"zerolinewidth\": 2}, \"yaxis\": {\"automargin\": true, \"gridcolor\": \"white\", \"linecolor\": \"white\", \"ticks\": \"\", \"title\": {\"standoff\": 15}, \"zerolinecolor\": \"white\", \"zerolinewidth\": 2}}}, \"xaxis\": {\"anchor\": \"y\", \"domain\": [0.0, 1.0]}, \"yaxis\": {\"anchor\": \"x\", \"domain\": [0.0, 1.0], \"title\": {\"text\": \"\\u53d6\\u5f97\\u65e5\\u6570\"}}},\n",
" {\"responsive\": true}\n",
" ).then(function(){\n",
" \n",
"var gd = document.getElementById('f709506e-5f98-4ecf-9cbc-1d4306d7042a');\n",
"var x = new MutationObserver(function (mutations, observer) {{\n",
" var display = window.getComputedStyle(gd).display;\n",
" if (!display || display === 'none') {{\n",
" console.log([gd, 'removed!']);\n",
" Plotly.purge(gd);\n",
" observer.disconnect();\n",
" }}\n",
"}});\n",
"\n",
"// Listen for the removal of the full notebook cells\n",
"var notebookContainer = gd.closest('#notebook-container');\n",
"if (notebookContainer) {{\n",
" x.observe(notebookContainer, {childList: true});\n",
"}}\n",
"\n",
"// Listen for the clearing of the current output cell\n",
"var outputEl = gd.closest('.output');\n",
"if (outputEl) {{\n",
" x.observe(outputEl, {childList: true});\n",
"}}\n",
"\n",
" })\n",
" };\n",
" \n",
" </script>\n",
" </div>\n",
"</body>\n",
"</html>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ejF77fDjcFp9"
},
"source": [
"## まとめ\n",
"\n",
"高専だとプログラミングの基礎で結構な時間を費やすと思いますが、その部分は高専の授業に譲って、ここでは実践的で、しかも面白いと思える授業を目指しています。クローラーを書ければ、高専のニュースなどクローリングしてボットにすることもできるだろうし、少しだけプログラミングが面白くなるかな、などと考えて授業構成を作りました。\n",
"\n",
"内容もちょっとずつアップデートしています。去年はフラーのニュースサイトからデータを取得するだけでしたが、今年は外部データを可視化するところまでいけました。\n",
"\n",
"今後も、技術のトレンドや自分の趣味に応じて、授業をバージョンアップしていければと思います。"
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment