├── 5-5.ipynb ├── 2-2-1.ipynb ├── check_version.ipynb ├── 3.ipynb ├── 5-1.ipynb ├── explain_loc_iloc_get_loc.ipynb ├── 7-1.ipynb ├── 5-6.ipynb └── 2-2-2.ipynb /5-5.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 例5-5. 特徴量ハッシング(別名「ハッシングトリック」)" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": null, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import pandas as pd\n", 17 | "import json\n", 18 | "\n", 19 | "# 最初の10,000件のレビューを読み込み\n", 20 | "with open('data/yelp/yelp_academic_dataset_review.json') as f:\n", 21 | " js = []\n", 22 | " for i in range(10000):\n", 23 | " js.append(json.loads(f.readline()))\n", 24 | "\n", 25 | "review_df = pd.DataFrame(js)\n", 26 | "# mにbusiness_idのユニーク数を代入\n", 27 | "m = len(review_df['business_id'].unique())\n", 28 | "\n", 29 | "m" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 2, 35 | "metadata": {}, 36 | "outputs": [ 37 | { 38 | "data": { 39 | "text/plain": [ 40 | "['9yKzy9PApeiPPOUJEtnvkg',\n", 41 | " 'ZRJwVLyzEJq1VAihDhYiow',\n", 42 | " '6oRAC4uyJCsJl1X0WZpVSA',\n", 43 | " '_1QQZuf4zZOyFCvXc0o6Vg',\n", 44 | " '6ozycU1RpktNG2-1BroVtw']" 45 | ] 46 | }, 47 | "execution_count": 2, 48 | "metadata": {}, 49 | "output_type": "execute_result" 50 | } 51 | ], 52 | "source": [ 53 | "from sklearn.feature_extraction import FeatureHasher\n", 54 | "h = FeatureHasher(n_features=m, input_type='string')\n", 55 | "f = h.transform(review_df['business_id'])\n", 56 | "\n", 57 | "# 変換後の特徴量が解釈が困難であることを確認\n", 58 | "review_df['business_id'].unique().tolist()[0:5]" 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "execution_count": 7, 64 | "metadata": {}, 65 | "outputs": [ 66 | { 67 | "data": { 68 | "text/plain": [ 69 | "array([[0., 0., 0., ..., 0., 0., 0.],\n", 70 | " [0., 0., 0., ..., 0., 0., 0.],\n", 71 | " [0., 0., 0., ..., 0., 0., 0.],\n", 72 | " ...,\n", 73 | " [0., 0., 0., ..., 0., 0., 0.],\n", 74 | " [0., 0., 0., ..., 0., 0., 0.],\n", 75 | " [0., 0., 0., ..., 0., 0., 0.]])" 76 | ] 77 | }, 78 | "execution_count": 7, 79 | "metadata": {}, 80 | "output_type": "execute_result" 81 | } 82 | ], 83 | "source": [ 84 | "f.toarray()" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 8, 90 | "metadata": {}, 91 | "outputs": [ 92 | { 93 | "name": "stdout", 94 | "output_type": "stream", 95 | "text": [ 96 | "Our pandas Series, in bytes: 790104\n", 97 | "Our hashed numpy array, in bytes: 56\n" 98 | ] 99 | } 100 | ], 101 | "source": [ 102 | "# 変換後の特徴量のストレージサイズが大きく減っていることを確認\n", 103 | "from sys import getsizeof\n", 104 | "print('Our pandas Series, in bytes: ', getsizeof(review_df['business_id']))\n", 105 | "print('Our hashed numpy array, in bytes: ', getsizeof(f))" 106 | ] 107 | }, 108 | { 109 | "cell_type": "code", 110 | "execution_count": null, 111 | "metadata": {}, 112 | "outputs": [], 113 | "source": [] 114 | } 115 | ], 116 | "metadata": { 117 | "kernelspec": { 118 | "display_name": "Python 3", 119 | "language": "python", 120 | "name": "python3" 121 | }, 122 | "language_info": { 123 | "codemirror_mode": { 124 | "name": "ipython", 125 | "version": 3 126 | }, 127 | "file_extension": ".py", 128 | "mimetype": "text/x-python", 129 | "name": "python", 130 | "nbconvert_exporter": "python", 131 | "pygments_lexer": "ipython3", 132 | "version": "3.7.0" 133 | } 134 | }, 135 | "nbformat": 4, 136 | "nbformat_minor": 2 137 | } 138 | -------------------------------------------------------------------------------- /2-2-1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 例2-1. The Echo Nest データセットの再生回数の二値化" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 4, 13 | "metadata": {}, 14 | "outputs": [ 15 | { 16 | "data": { 17 | "text/html": [ 18 | "
\n", 19 | "\n", 32 | "\n", 33 | " \n", 34 | " \n", 35 | " \n", 36 | " \n", 37 | " \n", 38 | " \n", 39 | " \n", 40 | " \n", 41 | " \n", 42 | " \n", 43 | " \n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | "
012
0b80344d063b5ccb3212f76538f3d9e43d87dca9eSOAKIMP12A8C1309951
1b80344d063b5ccb3212f76538f3d9e43d87dca9eSOAPDEY12A81C210A91
2b80344d063b5ccb3212f76538f3d9e43d87dca9eSOBBMDR12A8C13253B1
3b80344d063b5ccb3212f76538f3d9e43d87dca9eSOBFNSP12AF72A0E221
4b80344d063b5ccb3212f76538f3d9e43d87dca9eSOBFOVM12A58A7D4941
\n", 74 | "
" 75 | ], 76 | "text/plain": [ 77 | " 0 1 2\n", 78 | "0 b80344d063b5ccb3212f76538f3d9e43d87dca9e SOAKIMP12A8C130995 1\n", 79 | "1 b80344d063b5ccb3212f76538f3d9e43d87dca9e SOAPDEY12A81C210A9 1\n", 80 | "2 b80344d063b5ccb3212f76538f3d9e43d87dca9e SOBBMDR12A8C13253B 1\n", 81 | "3 b80344d063b5ccb3212f76538f3d9e43d87dca9e SOBFNSP12AF72A0E22 1\n", 82 | "4 b80344d063b5ccb3212f76538f3d9e43d87dca9e SOBFOVM12A58A7D494 1" 83 | ] 84 | }, 85 | "execution_count": 4, 86 | "metadata": {}, 87 | "output_type": "execute_result" 88 | } 89 | ], 90 | "source": [ 91 | "import pandas as pd\n", 92 | "listen_count = pd.read_csv('data/millionsong/train_triplets.txt.zip', header=None, delimiter='\\t', compression='zip')\n", 93 | "\n", 94 | "# このデータはユーザID、曲ID、再生回数の3つの列で構成されます。\n", 95 | "# 再生回数 0 を含まないため、単に再生回数の列をすべて 1 で上書きすることで\n", 96 | "# 再生回数を二値化できます。\n", 97 | "listen_count.iloc[:, 2] = 1\n", 98 | "\n", 99 | "listen_count.head()" 100 | ] 101 | }, 102 | { 103 | "cell_type": "code", 104 | "execution_count": null, 105 | "metadata": {}, 106 | "outputs": [], 107 | "source": [] 108 | } 109 | ], 110 | "metadata": { 111 | "kernelspec": { 112 | "display_name": "Python 3", 113 | "language": "python", 114 | "name": "python3" 115 | }, 116 | "language_info": { 117 | "codemirror_mode": { 118 | "name": "ipython", 119 | "version": 3 120 | }, 121 | "file_extension": ".py", 122 | "mimetype": "text/x-python", 123 | "name": "python", 124 | "nbconvert_exporter": "python", 125 | "pygments_lexer": "ipython3", 126 | "version": "3.7.0" 127 | } 128 | }, 129 | "nbformat": 4, 130 | "nbformat_minor": 2 131 | } 132 | -------------------------------------------------------------------------------- /check_version.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 21, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "data": { 10 | "text/plain": [ 11 | "'1.15.3'" 12 | ] 13 | }, 14 | "execution_count": 21, 15 | "metadata": {}, 16 | "output_type": "execute_result" 17 | } 18 | ], 19 | "source": [ 20 | "import numpy as np\n", 21 | "np.version.full_version" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 22, 27 | "metadata": {}, 28 | "outputs": [ 29 | { 30 | "data": { 31 | "text/plain": [ 32 | "'1.1.0'" 33 | ] 34 | }, 35 | "execution_count": 22, 36 | "metadata": {}, 37 | "output_type": "execute_result" 38 | } 39 | ], 40 | "source": [ 41 | "import scipy as sp\n", 42 | "sp.version.full_version" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 23, 48 | "metadata": {}, 49 | "outputs": [ 50 | { 51 | "data": { 52 | "text/plain": [ 53 | "'3.0.0'" 54 | ] 55 | }, 56 | "execution_count": 23, 57 | "metadata": {}, 58 | "output_type": "execute_result" 59 | } 60 | ], 61 | "source": [ 62 | "import matplotlib\n", 63 | "matplotlib.__version__" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 24, 69 | "metadata": {}, 70 | "outputs": [ 71 | { 72 | "data": { 73 | "text/plain": [ 74 | "'0.20.0'" 75 | ] 76 | }, 77 | "execution_count": 24, 78 | "metadata": {}, 79 | "output_type": "execute_result" 80 | } 81 | ], 82 | "source": [ 83 | "import sklearn\n", 84 | "sklearn.__version__" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 20, 90 | "metadata": {}, 91 | "outputs": [ 92 | { 93 | "name": "stdout", 94 | "output_type": "stream", 95 | "text": [ 96 | "\n", 97 | "INSTALLED VERSIONS\n", 98 | "------------------\n", 99 | "commit: None\n", 100 | "python: 3.7.0.final.0\n", 101 | "python-bits: 64\n", 102 | "OS: Darwin\n", 103 | "OS-release: 17.7.0\n", 104 | "machine: x86_64\n", 105 | "processor: i386\n", 106 | "byteorder: little\n", 107 | "LC_ALL: None\n", 108 | "LANG: ja_JP.UTF-8\n", 109 | "LOCALE: ja_JP.UTF-8\n", 110 | "\n", 111 | "pandas: 0.23.4\n", 112 | "pytest: None\n", 113 | "pip: 18.0\n", 114 | "setuptools: 40.2.0\n", 115 | "Cython: None\n", 116 | "numpy: 1.15.3\n", 117 | "scipy: 1.1.0\n", 118 | "pyarrow: None\n", 119 | "xarray: None\n", 120 | "IPython: 7.0.1\n", 121 | "sphinx: None\n", 122 | "patsy: None\n", 123 | "dateutil: 2.7.3\n", 124 | "pytz: 2018.5\n", 125 | "blosc: None\n", 126 | "bottleneck: None\n", 127 | "tables: None\n", 128 | "numexpr: None\n", 129 | "feather: None\n", 130 | "matplotlib: 3.0.0\n", 131 | "openpyxl: None\n", 132 | "xlrd: None\n", 133 | "xlwt: None\n", 134 | "xlsxwriter: None\n", 135 | "lxml: None\n", 136 | "bs4: None\n", 137 | "html5lib: None\n", 138 | "sqlalchemy: None\n", 139 | "pymysql: None\n", 140 | "psycopg2: None\n", 141 | "jinja2: 2.10\n", 142 | "s3fs: None\n", 143 | "fastparquet: None\n", 144 | "pandas_gbq: None\n", 145 | "pandas_datareader: None\n" 146 | ] 147 | } 148 | ], 149 | "source": [ 150 | "import pandas as pd\n", 151 | "pd.show_versions()" 152 | ] 153 | }, 154 | { 155 | "cell_type": "code", 156 | "execution_count": null, 157 | "metadata": {}, 158 | "outputs": [], 159 | "source": [] 160 | } 161 | ], 162 | "metadata": { 163 | "kernelspec": { 164 | "display_name": "Python 3", 165 | "language": "python", 166 | "name": "python3" 167 | }, 168 | "language_info": { 169 | "codemirror_mode": { 170 | "name": "ipython", 171 | "version": 3 172 | }, 173 | "file_extension": ".py", 174 | "mimetype": "text/x-python", 175 | "name": "python", 176 | "nbconvert_exporter": "python", 177 | "pygments_lexer": "ipython3", 178 | "version": "3.7.0" 179 | } 180 | }, 181 | "nbformat": 4, 182 | "nbformat_minor": 2 183 | } 184 | -------------------------------------------------------------------------------- /3.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 例3-1. nグラムの計算" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [ 15 | { 16 | "name": "stdout", 17 | "output_type": "stream", 18 | "text": [ 19 | "29222 368943 881620\n" 20 | ] 21 | }, 22 | { 23 | "data": { 24 | "text/plain": [ 25 | "['0', '00', '000', '007', '00a', '00am', '00pm', '01', '02', '03']" 26 | ] 27 | }, 28 | "execution_count": 1, 29 | "metadata": {}, 30 | "output_type": "execute_result" 31 | } 32 | ], 33 | "source": [ 34 | "import pandas as pd\n", 35 | "import json\n", 36 | "from sklearn.feature_extraction.text import CountVectorizer\n", 37 | "\n", 38 | "# 最初の 10,000 件のレビューを読み込む\n", 39 | "with open('data/yelp/yelp_academic_dataset_review.json') as f:\n", 40 | " js = []\n", 41 | " for i in range(10000):\n", 42 | " js.append(json.loads(f.readline()))\n", 43 | "review_df = pd.DataFrame(js)\n", 44 | "\n", 45 | "# scikit-learn の CountVectorizer を使ってユニグラム(BoW)、\n", 46 | "# バイグラム、トライグラムの特徴量変換器を作成する。\n", 47 | "# CountVectorizer はデフォルトでは1文字の単語を無視するが、\n", 48 | "# これは意味のない単語を除外するため実用的である。\n", 49 | "# ただしここでは全ての単語を含むように設定している。\n", 50 | "bow_converter = CountVectorizer(token_pattern='(?u)\\\\b\\\\w+\\\\b')\n", 51 | "bigram_converter = CountVectorizer(ngram_range=(2,2), token_pattern='(?u)\\\\b\\\\w+\\\\b')\n", 52 | "trigram_converter = CountVectorizer(ngram_range=(3,3), token_pattern='(?u)\\\\b\\\\w+\\\\b')\n", 53 | "\n", 54 | "# 変換器を適用し、語彙数を確認する\n", 55 | "bow_converter.fit(review_df['text'])\n", 56 | "words = bow_converter.get_feature_names()\n", 57 | "\n", 58 | "bigram_converter.fit(review_df['text'])\n", 59 | "bigrams = bigram_converter.get_feature_names()\n", 60 | "\n", 61 | "trigram_converter.fit(review_df['text'])\n", 62 | "trigrams = trigram_converter.get_feature_names()\n", 63 | "\n", 64 | "print (len(words), len(bigrams), len(trigrams))\n", 65 | "\n", 66 | "# n-グラムを確認する\n", 67 | "words[:10]" 68 | ] 69 | }, 70 | { 71 | "cell_type": "code", 72 | "execution_count": 3, 73 | "metadata": {}, 74 | "outputs": [ 75 | { 76 | "data": { 77 | "text/plain": [ 78 | "['zuzu was',\n", 79 | " 'zuzus room',\n", 80 | " 'zweigel wine',\n", 81 | " 'zwiebel kräuter',\n", 82 | " 'zy world',\n", 83 | " 'zzed in',\n", 84 | " 'éclairs napoleons',\n", 85 | " 'école lenôtre',\n", 86 | " 'ém all',\n", 87 | " 'òc châm']" 88 | ] 89 | }, 90 | "execution_count": 3, 91 | "metadata": {}, 92 | "output_type": "execute_result" 93 | } 94 | ], 95 | "source": [ 96 | "bigrams[-10:]" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 4, 102 | "metadata": {}, 103 | "outputs": [ 104 | { 105 | "data": { 106 | "text/plain": [ 107 | "['0 0 eye',\n", 108 | " '0 20 less',\n", 109 | " '0 39 oz',\n", 110 | " '0 39 pizza',\n", 111 | " '0 5 i',\n", 112 | " '0 50 to',\n", 113 | " '0 6 can',\n", 114 | " '0 75 oysters',\n", 115 | " '0 75 that',\n", 116 | " '0 75 to']" 117 | ] 118 | }, 119 | "execution_count": 4, 120 | "metadata": {}, 121 | "output_type": "execute_result" 122 | } 123 | ], 124 | "source": [ 125 | "trigrams[:10]" 126 | ] 127 | }, 128 | { 129 | "cell_type": "markdown", 130 | "metadata": {}, 131 | "source": [ 132 | "## 例3-2. 品詞タグ付けとチャンク化" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": 2, 138 | "metadata": {}, 139 | "outputs": [ 140 | { 141 | "name": "stdout", 142 | "output_type": "stream", 143 | "text": [ 144 | "['General', 'PROPN', 'NNP']\n", 145 | "['Manager', 'PROPN', 'NNP']\n", 146 | "['Scott', 'PROPN', 'NNP']\n", 147 | "['Petello', 'PROPN', 'NNP']\n", 148 | "['is', 'VERB', 'VBZ']\n", 149 | "['a', 'DET', 'DT']\n", 150 | "['good', 'ADJ', 'JJ']\n", 151 | "['egg', 'NOUN', 'NN']\n", 152 | "['!', 'PUNCT', '.']\n", 153 | "['!', 'PUNCT', '.']\n", 154 | "['!', 'PUNCT', '.']\n", 155 | "['Not', 'ADV', 'RB']\n", 156 | "['to', 'PART', 'TO']\n", 157 | "['go', 'VERB', 'VB']\n", 158 | "['into', 'ADP', 'IN']\n", 159 | "['detail', 'NOUN', 'NN']\n", 160 | "[',', 'PUNCT', ',']\n", 161 | "['but', 'CCONJ', 'CC']\n", 162 | "['let', 'VERB', 'VB']\n", 163 | "['me', 'PRON', 'PRP']\n", 164 | "['assure', 'VERB', 'VB']\n", 165 | "['you', 'PRON', 'PRP']\n", 166 | "['if', 'ADP', 'IN']\n", 167 | "['you', 'PRON', 'PRP']\n", 168 | "['have', 'VERB', 'VBP']\n", 169 | "['any', 'DET', 'DT']\n", 170 | "['issues', 'NOUN', 'NNS']\n", 171 | "['(', 'PUNCT', '-LRB-']\n", 172 | "['albeit', 'ADP', 'IN']\n", 173 | "['rare', 'ADJ', 'JJ']\n", 174 | "[')', 'PUNCT', '-RRB-']\n", 175 | "['speak', 'VERB', 'VBP']\n", 176 | "['with', 'ADP', 'IN']\n", 177 | "['Scott', 'PROPN', 'NNP']\n", 178 | "['and', 'CCONJ', 'CC']\n", 179 | "['treat', 'VERB', 'VB']\n", 180 | "['the', 'DET', 'DT']\n", 181 | "['guy', 'NOUN', 'NN']\n", 182 | "['with', 'ADP', 'IN']\n", 183 | "['some', 'DET', 'DT']\n", 184 | "['respect', 'NOUN', 'NN']\n", 185 | "['as', 'ADP', 'IN']\n", 186 | "['you', 'PRON', 'PRP']\n", 187 | "['state', 'VERB', 'VBP']\n", 188 | "['your', 'ADJ', 'PRP$']\n", 189 | "['case', 'NOUN', 'NN']\n", 190 | "['and', 'CCONJ', 'CC']\n", 191 | "['I', 'PRON', 'PRP']\n", 192 | "[\"'d\", 'VERB', 'MD']\n", 193 | "['be', 'VERB', 'VB']\n", 194 | "['surprised', 'ADJ', 'JJ']\n", 195 | "['if', 'ADP', 'IN']\n", 196 | "['you', 'PRON', 'PRP']\n", 197 | "['do', 'VERB', 'VBP']\n", 198 | "[\"n't\", 'ADV', 'RB']\n", 199 | "['walk', 'VERB', 'VB']\n", 200 | "['out', 'ADV', 'RB']\n", 201 | "['totally', 'ADV', 'RB']\n", 202 | "['satisfied', 'ADJ', 'JJ']\n", 203 | "['as', 'ADP', 'IN']\n", 204 | "['I', 'PRON', 'PRP']\n", 205 | "['just', 'ADV', 'RB']\n", 206 | "['did', 'VERB', 'VBD']\n", 207 | "['.', 'PUNCT', '.']\n", 208 | "['Like', 'INTJ', 'UH']\n", 209 | "['I', 'PRON', 'PRP']\n", 210 | "['always', 'ADV', 'RB']\n", 211 | "['say', 'VERB', 'VBP']\n", 212 | "['.....', 'PUNCT', 'NFP']\n", 213 | "['\"', 'PUNCT', '``']\n", 214 | "['Mistakes', 'NOUN', 'NNS']\n", 215 | "['are', 'VERB', 'VBP']\n", 216 | "['inevitable', 'ADJ', 'JJ']\n", 217 | "[',', 'PUNCT', ',']\n", 218 | "['it', 'PRON', 'PRP']\n", 219 | "[\"'s\", 'VERB', 'VBZ']\n", 220 | "['how', 'ADV', 'WRB']\n", 221 | "['we', 'PRON', 'PRP']\n", 222 | "['recover', 'VERB', 'VBP']\n", 223 | "['from', 'ADP', 'IN']\n", 224 | "['them', 'PRON', 'PRP']\n", 225 | "['that', 'ADJ', 'WDT']\n", 226 | "['is', 'VERB', 'VBZ']\n", 227 | "['important', 'ADJ', 'JJ']\n", 228 | "['\"', 'PUNCT', \"''\"]\n", 229 | "['!', 'PUNCT', '.']\n", 230 | "['!', 'PUNCT', '.']\n", 231 | "['!', 'PUNCT', '.']\n", 232 | "['\\n\\n', 'SPACE', '_SP']\n", 233 | "['Thanks', 'NOUN', 'NNS']\n", 234 | "['to', 'ADP', 'IN']\n", 235 | "['Scott', 'PROPN', 'NNP']\n", 236 | "['and', 'CCONJ', 'CC']\n", 237 | "['his', 'ADJ', 'PRP$']\n", 238 | "['awesome', 'ADJ', 'JJ']\n", 239 | "['staff', 'NOUN', 'NN']\n", 240 | "['.', 'PUNCT', '.']\n", 241 | "['You', 'PRON', 'PRP']\n", 242 | "[\"'ve\", 'VERB', 'VB']\n", 243 | "['got', 'VERB', 'VBN']\n", 244 | "['a', 'DET', 'DT']\n", 245 | "['customer', 'NOUN', 'NN']\n", 246 | "['for', 'ADP', 'IN']\n", 247 | "['life', 'NOUN', 'NN']\n", 248 | "['!', 'PUNCT', '.']\n", 249 | "['!', 'PUNCT', '.']\n", 250 | "['..........', 'PUNCT', 'NFP']\n", 251 | "[':', 'PUNCT', ':']\n", 252 | "['^', 'PUNCT', 'NFP']\n", 253 | "[')', 'PUNCT', '-RRB-']\n", 254 | "[General Manager Scott Petello, a good egg, detail, me, you, you, any issues, Scott, the guy, some respect, you, your case, I, you, I, I, Mistakes, it, we, them, Thanks, Scott, his awesome staff, You, a customer, life]\n" 255 | ] 256 | } 257 | ], 258 | "source": [ 259 | "import pandas as pd\n", 260 | "import json\n", 261 | "\n", 262 | "# 最初の10レビューを読み込む\n", 263 | "with open('data/yelp/yelp_academic_dataset_review.json') as f:\n", 264 | " js = []\n", 265 | " for i in range(10):\n", 266 | " js.append(json.loads(f.readline()))\n", 267 | "review_df = pd.DataFrame(js)\n", 268 | "\n", 269 | "# まずは Spacy を使った方法\n", 270 | "import spacy\n", 271 | "# 言語モデル(英語)を読み込む\n", 272 | "nlp = spacy.load('en')\n", 273 | "\n", 274 | "# spaCy の言語モデルを使ってテキストから Pandas Series を作成する\n", 275 | "doc_df = review_df['text'].apply(nlp)\n", 276 | "\n", 277 | "# spaCy は細かい品詞タグを .pos_ で、粗い品詞タグを .tag_ で提供します\n", 278 | "for doc in doc_df[4]:\n", 279 | " print([doc.text, doc.pos_, doc.tag_])\n", 280 | "\n", 281 | "# spaCy は基本的な名詞句も .noun_chunks で提供します\n", 282 | "print([chunk for chunk in doc_df[4].noun_chunks])" 283 | ] 284 | }, 285 | { 286 | "cell_type": "code", 287 | "execution_count": 7, 288 | "metadata": {}, 289 | "outputs": [ 290 | { 291 | "data": { 292 | "text/plain": [ 293 | "[('General', 'NNP'),\n", 294 | " ('Manager', 'NNP'),\n", 295 | " ('Scott', 'NNP'),\n", 296 | " ('Petello', 'NNP'),\n", 297 | " ('is', 'VBZ'),\n", 298 | " ('a', 'DT'),\n", 299 | " ('good', 'JJ'),\n", 300 | " ('egg', 'NN'),\n", 301 | " ('Not', 'RB'),\n", 302 | " ('to', 'TO'),\n", 303 | " ('go', 'VB'),\n", 304 | " ('into', 'IN'),\n", 305 | " ('detail', 'NN'),\n", 306 | " ('but', 'CC'),\n", 307 | " ('let', 'VB'),\n", 308 | " ('me', 'PRP'),\n", 309 | " ('assure', 'VB'),\n", 310 | " ('you', 'PRP'),\n", 311 | " ('if', 'IN'),\n", 312 | " ('you', 'PRP'),\n", 313 | " ('have', 'VBP'),\n", 314 | " ('any', 'DT'),\n", 315 | " ('issues', 'NNS'),\n", 316 | " ('albeit', 'IN'),\n", 317 | " ('rare', 'NN'),\n", 318 | " ('speak', 'NN'),\n", 319 | " ('with', 'IN'),\n", 320 | " ('Scott', 'NNP'),\n", 321 | " ('and', 'CC'),\n", 322 | " ('treat', 'VB'),\n", 323 | " ('the', 'DT'),\n", 324 | " ('guy', 'NN'),\n", 325 | " ('with', 'IN'),\n", 326 | " ('some', 'DT'),\n", 327 | " ('respect', 'NN'),\n", 328 | " ('as', 'IN'),\n", 329 | " ('you', 'PRP'),\n", 330 | " ('state', 'NN'),\n", 331 | " ('your', 'PRP$'),\n", 332 | " ('case', 'NN'),\n", 333 | " ('and', 'CC'),\n", 334 | " ('I', 'PRP'),\n", 335 | " (\"'d\", 'MD'),\n", 336 | " ('be', 'VB'),\n", 337 | " ('surprised', 'VBN'),\n", 338 | " ('if', 'IN'),\n", 339 | " ('you', 'PRP'),\n", 340 | " ('do', 'VBP'),\n", 341 | " (\"n't\", 'RB'),\n", 342 | " ('walk', 'VB'),\n", 343 | " ('out', 'RP'),\n", 344 | " ('totally', 'RB'),\n", 345 | " ('satisfied', 'JJ'),\n", 346 | " ('as', 'IN'),\n", 347 | " ('I', 'PRP'),\n", 348 | " ('just', 'RB'),\n", 349 | " ('did', 'VBD'),\n", 350 | " ('Like', 'IN'),\n", 351 | " ('I', 'PRP'),\n", 352 | " ('always', 'RB'),\n", 353 | " ('say', 'VBP'),\n", 354 | " ('..', 'VBP'),\n", 355 | " ('Mistakes', 'NNS'),\n", 356 | " ('are', 'VBP'),\n", 357 | " ('inevitable', 'JJ'),\n", 358 | " ('it', 'PRP'),\n", 359 | " (\"'s\", 'VBZ'),\n", 360 | " ('how', 'WRB'),\n", 361 | " ('we', 'PRP'),\n", 362 | " ('recover', 'VBP'),\n", 363 | " ('from', 'IN'),\n", 364 | " ('them', 'PRP'),\n", 365 | " ('that', 'WDT'),\n", 366 | " ('is', 'VBZ'),\n", 367 | " ('important', 'JJ'),\n", 368 | " ('Thanks', 'NNS'),\n", 369 | " ('to', 'TO'),\n", 370 | " ('Scott', 'NNP'),\n", 371 | " ('and', 'CC'),\n", 372 | " ('his', 'PRP$'),\n", 373 | " ('awesome', 'JJ'),\n", 374 | " ('staff', 'NN'),\n", 375 | " ('You', 'PRP'),\n", 376 | " (\"'ve\", 'VBP'),\n", 377 | " ('got', 'VBN'),\n", 378 | " ('a', 'DT'),\n", 379 | " ('customer', 'NN'),\n", 380 | " ('for', 'IN'),\n", 381 | " ('life', 'NN'),\n", 382 | " ('^', 'NN')]" 383 | ] 384 | }, 385 | "execution_count": 7, 386 | "metadata": {}, 387 | "output_type": "execute_result" 388 | } 389 | ], 390 | "source": [ 391 | "# TextBlob ライブラリを使って同じことができる\n", 392 | "from textblob import TextBlob\n", 393 | "\n", 394 | "# TextBlob はデフォルトでは PatternTagger を使ってタグ付けを行う。\n", 395 | "# これは今回の例ではうまくいくが、文法の正しくない文章を含む場合は \n", 396 | "# NLTKTagger を使うことをおすすめする。\n", 397 | "blob_df = review_df['text'].apply(TextBlob)\n", 398 | "\n", 399 | "blob_df[4].tags" 400 | ] 401 | }, 402 | { 403 | "cell_type": "code", 404 | "execution_count": 8, 405 | "metadata": {}, 406 | "outputs": [ 407 | { 408 | "name": "stdout", 409 | "output_type": "stream", 410 | "text": [ 411 | "['general manager', 'scott petello', 'good egg', 'scott', \"n't walk\", '... ..', 'mistakes', 'thanks', 'scott', 'awesome staff', '... ... ...']\n" 412 | ] 413 | } 414 | ], 415 | "source": [ 416 | "print([np for np in blob_df[4].noun_phrases])" 417 | ] 418 | }, 419 | { 420 | "cell_type": "code", 421 | "execution_count": null, 422 | "metadata": {}, 423 | "outputs": [], 424 | "source": [] 425 | } 426 | ], 427 | "metadata": { 428 | "kernelspec": { 429 | "display_name": "Python 3", 430 | "language": "python", 431 | "name": "python3" 432 | }, 433 | "language_info": { 434 | "codemirror_mode": { 435 | "name": "ipython", 436 | "version": 3 437 | }, 438 | "file_extension": ".py", 439 | "mimetype": "text/x-python", 440 | "name": "python", 441 | "nbconvert_exporter": "python", 442 | "pygments_lexer": "ipython3", 443 | "version": "3.7.0" 444 | } 445 | }, 446 | "nbformat": 4, 447 | "nbformat_minor": 2 448 | } 449 | -------------------------------------------------------------------------------- /5-1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 例5-1. One-Hotエンコーディングとダミーコーディングを利用した線形回帰モデリング" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [ 15 | { 16 | "data": { 17 | "text/plain": [ 18 | "3333.3333333333335" 19 | ] 20 | }, 21 | "execution_count": 1, 22 | "metadata": {}, 23 | "output_type": "execute_result" 24 | } 25 | ], 26 | "source": [ 27 | "import pandas as pd\n", 28 | "from sklearn import linear_model\n", 29 | "\n", 30 | "# 3つの都市におけるアパートの家賃のデータセットを設定\n", 31 | "df = pd.DataFrame({\n", 32 | " 'City': ['SF', 'SF', 'SF', 'NYC', 'NYC', 'NYC', 'Seattle', 'Seattle', 'Seattle'],\n", 33 | " 'Rent': [3999, 4000, 4001, 3499, 3500, 3501, 2499, 2500, 2501]\n", 34 | "})\n", 35 | "\n", 36 | "df['Rent'].mean()" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 2, 42 | "metadata": {}, 43 | "outputs": [ 44 | { 45 | "data": { 46 | "text/html": [ 47 | "
\n", 48 | "\n", 61 | "\n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | "
Rentcity_NYCcity_SFcity_Seattle
03999010
14000010
24001010
33499100
43500100
53501100
62499001
72500001
82501001
\n", 137 | "
" 138 | ], 139 | "text/plain": [ 140 | " Rent city_NYC city_SF city_Seattle\n", 141 | "0 3999 0 1 0\n", 142 | "1 4000 0 1 0\n", 143 | "2 4001 0 1 0\n", 144 | "3 3499 1 0 0\n", 145 | "4 3500 1 0 0\n", 146 | "5 3501 1 0 0\n", 147 | "6 2499 0 0 1\n", 148 | "7 2500 0 0 1\n", 149 | "8 2501 0 0 1" 150 | ] 151 | }, 152 | "execution_count": 2, 153 | "metadata": {}, 154 | "output_type": "execute_result" 155 | } 156 | ], 157 | "source": [ 158 | "# One-Hotエンコーディングをカテゴリ値であるcity列に適用\n", 159 | "# 特徴量をOne-Hotエンコーディングで生成した列に、ターゲット変数を家賃に指定し、線形回帰モデルを学習\n", 160 | "one_hot_df = pd.get_dummies(df, prefix=['city'])\n", 161 | "one_hot_df" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": 6, 167 | "metadata": {}, 168 | "outputs": [ 169 | { 170 | "data": { 171 | "text/plain": [ 172 | "array([ 166.66666667, 666.66666667, -833.33333333])" 173 | ] 174 | }, 175 | "execution_count": 6, 176 | "metadata": {}, 177 | "output_type": "execute_result" 178 | } 179 | ], 180 | "source": [ 181 | "model = linear_model.LinearRegression()\n", 182 | "model.fit(one_hot_df[['city_NYC', 'city_SF', 'city_Seattle']], one_hot_df['Rent'])\n", 183 | "model.coef_" 184 | ] 185 | }, 186 | { 187 | "cell_type": "code", 188 | "execution_count": 7, 189 | "metadata": {}, 190 | "outputs": [ 191 | { 192 | "data": { 193 | "text/plain": [ 194 | "3333.3333333333335" 195 | ] 196 | }, 197 | "execution_count": 7, 198 | "metadata": {}, 199 | "output_type": "execute_result" 200 | } 201 | ], 202 | "source": [ 203 | "model.intercept_" 204 | ] 205 | }, 206 | { 207 | "cell_type": "code", 208 | "execution_count": 8, 209 | "metadata": { 210 | "scrolled": true 211 | }, 212 | "outputs": [ 213 | { 214 | "data": { 215 | "text/html": [ 216 | "
\n", 217 | "\n", 230 | "\n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | "
Rentcity_SFcity_Seattle
0399910
1400010
2400110
3349900
4350000
5350100
6249901
7250001
8250101
\n", 296 | "
" 297 | ], 298 | "text/plain": [ 299 | " Rent city_SF city_Seattle\n", 300 | "0 3999 1 0\n", 301 | "1 4000 1 0\n", 302 | "2 4001 1 0\n", 303 | "3 3499 0 0\n", 304 | "4 3500 0 0\n", 305 | "5 3501 0 0\n", 306 | "6 2499 0 1\n", 307 | "7 2500 0 1\n", 308 | "8 2501 0 1" 309 | ] 310 | }, 311 | "execution_count": 8, 312 | "metadata": {}, 313 | "output_type": "execute_result" 314 | } 315 | ], 316 | "source": [ 317 | "# ダミーコーディングを利用して線形回帰モデルを学習\n", 318 | "dummy_df = pd.get_dummies(df, prefix=['city'], drop_first=True)\n", 319 | "dummy_df" 320 | ] 321 | }, 322 | { 323 | "cell_type": "code", 324 | "execution_count": 9, 325 | "metadata": {}, 326 | "outputs": [ 327 | { 328 | "data": { 329 | "text/plain": [ 330 | "array([ 500., -1000.])" 331 | ] 332 | }, 333 | "execution_count": 9, 334 | "metadata": {}, 335 | "output_type": "execute_result" 336 | } 337 | ], 338 | "source": [ 339 | "model.fit(dummy_df[['city_SF', 'city_Seattle']], dummy_df['Rent'])\n", 340 | "model.coef_" 341 | ] 342 | }, 343 | { 344 | "cell_type": "code", 345 | "execution_count": 10, 346 | "metadata": {}, 347 | "outputs": [ 348 | { 349 | "data": { 350 | "text/plain": [ 351 | "3500.0" 352 | ] 353 | }, 354 | "execution_count": 10, 355 | "metadata": {}, 356 | "output_type": "execute_result" 357 | } 358 | ], 359 | "source": [ 360 | "model.intercept_" 361 | ] 362 | }, 363 | { 364 | "cell_type": "markdown", 365 | "metadata": {}, 366 | "source": [ 367 | "## 例5-2. Effectコーディングを用いた線形回帰モデル" 368 | ] 369 | }, 370 | { 371 | "cell_type": "code", 372 | "execution_count": 11, 373 | "metadata": {}, 374 | "outputs": [ 375 | { 376 | "data": { 377 | "text/html": [ 378 | "
\n", 379 | "\n", 392 | "\n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | "
Rentcity_SFcity_Seattle
039991.00.0
140001.00.0
240011.00.0
33499-1.0-1.0
43500-1.0-1.0
53501-1.0-1.0
624990.01.0
725000.01.0
825010.01.0
\n", 458 | "
" 459 | ], 460 | "text/plain": [ 461 | " Rent city_SF city_Seattle\n", 462 | "0 3999 1.0 0.0\n", 463 | "1 4000 1.0 0.0\n", 464 | "2 4001 1.0 0.0\n", 465 | "3 3499 -1.0 -1.0\n", 466 | "4 3500 -1.0 -1.0\n", 467 | "5 3501 -1.0 -1.0\n", 468 | "6 2499 0.0 1.0\n", 469 | "7 2500 0.0 1.0\n", 470 | "8 2501 0.0 1.0" 471 | ] 472 | }, 473 | "execution_count": 11, 474 | "metadata": {}, 475 | "output_type": "execute_result" 476 | } 477 | ], 478 | "source": [ 479 | "effect_df = dummy_df.copy()\n", 480 | "effect_df.loc[3:5, ['city_SF', 'city_Seattle']] = -1.0\n", 481 | "effect_df" 482 | ] 483 | }, 484 | { 485 | "cell_type": "code", 486 | "execution_count": 12, 487 | "metadata": {}, 488 | "outputs": [ 489 | { 490 | "data": { 491 | "text/plain": [ 492 | "array([ 666.66666667, -833.33333333])" 493 | ] 494 | }, 495 | "execution_count": 12, 496 | "metadata": {}, 497 | "output_type": "execute_result" 498 | } 499 | ], 500 | "source": [ 501 | "model.fit(effect_df[['city_SF', 'city_Seattle']], effect_df['Rent'])\n", 502 | "model.coef_" 503 | ] 504 | }, 505 | { 506 | "cell_type": "code", 507 | "execution_count": 13, 508 | "metadata": {}, 509 | "outputs": [ 510 | { 511 | "data": { 512 | "text/plain": [ 513 | "3333.3333333333335" 514 | ] 515 | }, 516 | "execution_count": 13, 517 | "metadata": {}, 518 | "output_type": "execute_result" 519 | } 520 | ], 521 | "source": [ 522 | "model.intercept_" 523 | ] 524 | }, 525 | { 526 | "cell_type": "code", 527 | "execution_count": null, 528 | "metadata": {}, 529 | "outputs": [], 530 | "source": [] 531 | } 532 | ], 533 | "metadata": { 534 | "kernelspec": { 535 | "display_name": "Python 3", 536 | "language": "python", 537 | "name": "python3" 538 | }, 539 | "language_info": { 540 | "codemirror_mode": { 541 | "name": "ipython", 542 | "version": 3 543 | }, 544 | "file_extension": ".py", 545 | "mimetype": "text/x-python", 546 | "name": "python", 547 | "nbconvert_exporter": "python", 548 | "pygments_lexer": "ipython3", 549 | "version": "3.7.0" 550 | } 551 | }, 552 | "nbformat": 4, 553 | "nbformat_minor": 2 554 | } 555 | -------------------------------------------------------------------------------- /explain_loc_iloc_get_loc.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "data": { 10 | "text/html": [ 11 | "
\n", 12 | "\n", 25 | "\n", 26 | " \n", 27 | " \n", 28 | " \n", 29 | " \n", 30 | " \n", 31 | " \n", 32 | " \n", 33 | " \n", 34 | " \n", 35 | " \n", 36 | " \n", 37 | " \n", 38 | " \n", 39 | " \n", 40 | " \n", 41 | " \n", 42 | " \n", 43 | " \n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | "
bab
10123
11456
11789
\n", 55 | "
" 56 | ], 57 | "text/plain": [ 58 | " b a b\n", 59 | "10 1 2 3\n", 60 | "11 4 5 6\n", 61 | "11 7 8 9" 62 | ] 63 | }, 64 | "execution_count": 2, 65 | "metadata": {}, 66 | "output_type": "execute_result" 67 | } 68 | ], 69 | "source": [ 70 | "import pandas as pd\n", 71 | "\n", 72 | "# DataFrame基礎知識\n", 73 | "# pandasにはIndexクラスがある\n", 74 | "# pandas.DataFrameには、indexとcolumnsというプロパティがあり、\n", 75 | "# indexとcolumnsプロパティはIndexクラスが設定される\n", 76 | "# pandas.Index https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.html\n", 77 | "\n", 78 | "df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], index=[10, 11, 11],columns=['b', 'a', 'b'])\n", 79 | "df" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": 21, 85 | "metadata": {}, 86 | "outputs": [ 87 | { 88 | "data": { 89 | "text/plain": [ 90 | "b 1\n", 91 | "a 2\n", 92 | "b 3\n", 93 | "Name: 10, dtype: int64" 94 | ] 95 | }, 96 | "execution_count": 21, 97 | "metadata": {}, 98 | "output_type": "execute_result" 99 | } 100 | ], 101 | "source": [ 102 | "# locは、1次元の場合、index値で指定(pd.DataFrameは、indexとcolumnsというプロパティを持っている)\n", 103 | "# 指定する値が1つで、該当件数が1件の場合pd.Seriesで返される\n", 104 | "df.loc[10]" 105 | ] 106 | }, 107 | { 108 | "cell_type": "code", 109 | "execution_count": 4, 110 | "metadata": {}, 111 | "outputs": [ 112 | { 113 | "data": { 114 | "text/html": [ 115 | "
\n", 116 | "\n", 129 | "\n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | "
bab
10123
\n", 147 | "
" 148 | ], 149 | "text/plain": [ 150 | " b a b\n", 151 | "10 1 2 3" 152 | ] 153 | }, 154 | "execution_count": 4, 155 | "metadata": {}, 156 | "output_type": "execute_result" 157 | } 158 | ], 159 | "source": [ 160 | "# locは、1次元の場合、index値で指定\n", 161 | "# 指定する値がリストの場合は、該当件数が1件でもpd.DataFrameで返される\n", 162 | "df.loc[[10]]" 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": 5, 168 | "metadata": {}, 169 | "outputs": [ 170 | { 171 | "data": { 172 | "text/html": [ 173 | "
\n", 174 | "\n", 187 | "\n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | "
bab
11456
11789
\n", 211 | "
" 212 | ], 213 | "text/plain": [ 214 | " b a b\n", 215 | "11 4 5 6\n", 216 | "11 7 8 9" 217 | ] 218 | }, 219 | "execution_count": 5, 220 | "metadata": {}, 221 | "output_type": "execute_result" 222 | } 223 | ], 224 | "source": [ 225 | "# locは、1次元の場合、index値で指定\n", 226 | "# 指定する値が1つでも、該当件数が2件以上の場合pd.DataFrameで返される\n", 227 | "df.loc[11]" 228 | ] 229 | }, 230 | { 231 | "cell_type": "code", 232 | "execution_count": 6, 233 | "metadata": {}, 234 | "outputs": [ 235 | { 236 | "data": { 237 | "text/plain": [ 238 | "10 2\n", 239 | "11 5\n", 240 | "11 8\n", 241 | "Name: a, dtype: int64" 242 | ] 243 | }, 244 | "execution_count": 6, 245 | "metadata": {}, 246 | "output_type": "execute_result" 247 | } 248 | ], 249 | "source": [ 250 | "# locは、2次元の場合、1次元目がindex値、2次元目がcolumns値で指定\n", 251 | "# 該当件数が1件の場合は、pd.Seriesになる\n", 252 | "df.loc[:, 'a']" 253 | ] 254 | }, 255 | { 256 | "cell_type": "code", 257 | "execution_count": 7, 258 | "metadata": {}, 259 | "outputs": [ 260 | { 261 | "data": { 262 | "text/html": [ 263 | "
\n", 264 | "\n", 277 | "\n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | "
a
102
115
118
\n", 299 | "
" 300 | ], 301 | "text/plain": [ 302 | " a\n", 303 | "10 2\n", 304 | "11 5\n", 305 | "11 8" 306 | ] 307 | }, 308 | "execution_count": 7, 309 | "metadata": {}, 310 | "output_type": "execute_result" 311 | } 312 | ], 313 | "source": [ 314 | "# locは、2次元の場合、1次元目がindex値、2次元目がcolumns値で指定\n", 315 | "# リストで指定した場合は、該当件数が1件でもpd.DataFrameになる\n", 316 | "df.loc[:, ['a']]" 317 | ] 318 | }, 319 | { 320 | "cell_type": "code", 321 | "execution_count": 8, 322 | "metadata": {}, 323 | "outputs": [ 324 | { 325 | "data": { 326 | "text/html": [ 327 | "
\n", 328 | "\n", 341 | "\n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | "
bb
1013
1146
1179
\n", 367 | "
" 368 | ], 369 | "text/plain": [ 370 | " b b\n", 371 | "10 1 3\n", 372 | "11 4 6\n", 373 | "11 7 9" 374 | ] 375 | }, 376 | "execution_count": 8, 377 | "metadata": {}, 378 | "output_type": "execute_result" 379 | } 380 | ], 381 | "source": [ 382 | "# locは、2次元の場合、1次元目がindex値、2次元目がcolumns値で指定\n", 383 | "# 指定する値が1つでも、該当件数が2件以上の場合pd.DataFrameで返される\n", 384 | "\n" 385 | ] 386 | }, 387 | { 388 | "cell_type": "code", 389 | "execution_count": 17, 390 | "metadata": {}, 391 | "outputs": [ 392 | { 393 | "data": { 394 | "text/plain": [ 395 | "2" 396 | ] 397 | }, 398 | "execution_count": 17, 399 | "metadata": {}, 400 | "output_type": "execute_result" 401 | } 402 | ], 403 | "source": [ 404 | "# locは、2次元の場合、1次元目がindex値、2次元目がcolumns値で指定\n", 405 | "# 返り値が1つだと値の型に応じた返り値になる\n", 406 | "df.loc[10, 'a']" 407 | ] 408 | }, 409 | { 410 | "cell_type": "code", 411 | "execution_count": 18, 412 | "metadata": {}, 413 | "outputs": [ 414 | { 415 | "data": { 416 | "text/plain": [ 417 | "numpy.int64" 418 | ] 419 | }, 420 | "execution_count": 18, 421 | "metadata": {}, 422 | "output_type": "execute_result" 423 | } 424 | ], 425 | "source": [ 426 | "type(df.loc[10, 'a'])" 427 | ] 428 | }, 429 | { 430 | "cell_type": "code", 431 | "execution_count": 58, 432 | "metadata": {}, 433 | "outputs": [ 434 | { 435 | "data": { 436 | "text/plain": [ 437 | "b 1\n", 438 | "a 2\n", 439 | "b 3\n", 440 | "Name: 10, dtype: int64" 441 | ] 442 | }, 443 | "execution_count": 58, 444 | "metadata": {}, 445 | "output_type": "execute_result" 446 | } 447 | ], 448 | "source": [ 449 | "# ilocは、1次元の場合、行番号で指定\n", 450 | "df.iloc[0]" 451 | ] 452 | }, 453 | { 454 | "cell_type": "code", 455 | "execution_count": 59, 456 | "metadata": {}, 457 | "outputs": [ 458 | { 459 | "data": { 460 | "text/html": [ 461 | "
\n", 462 | "\n", 475 | "\n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | "
bab
10123
\n", 493 | "
" 494 | ], 495 | "text/plain": [ 496 | " b a b\n", 497 | "10 1 2 3" 498 | ] 499 | }, 500 | "execution_count": 59, 501 | "metadata": {}, 502 | "output_type": "execute_result" 503 | } 504 | ], 505 | "source": [ 506 | "df.iloc[[0]]" 507 | ] 508 | }, 509 | { 510 | "cell_type": "code", 511 | "execution_count": 60, 512 | "metadata": {}, 513 | "outputs": [ 514 | { 515 | "data": { 516 | "text/plain": [ 517 | "10 1\n", 518 | "11 4\n", 519 | "11 7\n", 520 | "Name: b, dtype: int64" 521 | ] 522 | }, 523 | "execution_count": 60, 524 | "metadata": {}, 525 | "output_type": "execute_result" 526 | } 527 | ], 528 | "source": [ 529 | "# ilocは、2次元の場合、行番号と列番号で指定\n", 530 | "df.iloc[:, 0]" 531 | ] 532 | }, 533 | { 534 | "cell_type": "code", 535 | "execution_count": 61, 536 | "metadata": {}, 537 | "outputs": [ 538 | { 539 | "data": { 540 | "text/html": [ 541 | "
\n", 542 | "\n", 555 | "\n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | "
b
101
114
117
\n", 577 | "
" 578 | ], 579 | "text/plain": [ 580 | " b\n", 581 | "10 1\n", 582 | "11 4\n", 583 | "11 7" 584 | ] 585 | }, 586 | "execution_count": 61, 587 | "metadata": {}, 588 | "output_type": "execute_result" 589 | } 590 | ], 591 | "source": [ 592 | "df.iloc[:, [0]]" 593 | ] 594 | }, 595 | { 596 | "cell_type": "code", 597 | "execution_count": 62, 598 | "metadata": {}, 599 | "outputs": [ 600 | { 601 | "data": { 602 | "text/plain": [ 603 | "0" 604 | ] 605 | }, 606 | "execution_count": 62, 607 | "metadata": {}, 608 | "output_type": "execute_result" 609 | } 610 | ], 611 | "source": [ 612 | "# get_loc関数は、pd.Indexクラスが持っている関数\n", 613 | "# Indexの値を検索して該当したインデックス番号を返す関数\n", 614 | "\n", 615 | "df.index.get_loc(10)" 616 | ] 617 | }, 618 | { 619 | "cell_type": "code", 620 | "execution_count": 63, 621 | "metadata": {}, 622 | "outputs": [ 623 | { 624 | "data": { 625 | "text/plain": [ 626 | "slice(1, 3, None)" 627 | ] 628 | }, 629 | "execution_count": 63, 630 | "metadata": {}, 631 | "output_type": "execute_result" 632 | } 633 | ], 634 | "source": [ 635 | "# 連続だとsliceになる\n", 636 | "df.index.get_loc(11)" 637 | ] 638 | }, 639 | { 640 | "cell_type": "code", 641 | "execution_count": 64, 642 | "metadata": {}, 643 | "outputs": [ 644 | { 645 | "data": { 646 | "text/plain": [ 647 | "1" 648 | ] 649 | }, 650 | "execution_count": 64, 651 | "metadata": {}, 652 | "output_type": "execute_result" 653 | } 654 | ], 655 | "source": [ 656 | "df.columns.get_loc('a')" 657 | ] 658 | }, 659 | { 660 | "cell_type": "code", 661 | "execution_count": 65, 662 | "metadata": {}, 663 | "outputs": [ 664 | { 665 | "data": { 666 | "text/plain": [ 667 | "array([ True, False, True])" 668 | ] 669 | }, 670 | "execution_count": 65, 671 | "metadata": {}, 672 | "output_type": "execute_result" 673 | } 674 | ], 675 | "source": [ 676 | "# 非連続だとarrayになる\n", 677 | "df.columns.get_loc('b')" 678 | ] 679 | }, 680 | { 681 | "cell_type": "code", 682 | "execution_count": null, 683 | "metadata": {}, 684 | "outputs": [], 685 | "source": [] 686 | } 687 | ], 688 | "metadata": { 689 | "kernelspec": { 690 | "display_name": "Python 3", 691 | "language": "python", 692 | "name": "python3" 693 | }, 694 | "language_info": { 695 | "codemirror_mode": { 696 | "name": "ipython", 697 | "version": 3 698 | }, 699 | "file_extension": ".py", 700 | "mimetype": "text/x-python", 701 | "name": "python", 702 | "nbconvert_exporter": "python", 703 | "pygments_lexer": "ipython3", 704 | "version": "3.7.0" 705 | } 706 | }, 707 | "nbformat": 4, 708 | "nbformat_minor": 2 709 | } 710 | -------------------------------------------------------------------------------- /7-1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 例7-1. k-meansの適用例を実行するコード" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [ 15 | { 16 | "data": { 17 | "text/plain": [ 18 | "(-0.07086790846959401,\n", 19 | " 1.0713297683670353,\n", 20 | " -0.08072533667047069,\n", 21 | " 1.082584430361733)" 22 | ] 23 | }, 24 | "execution_count": 1, 25 | "metadata": {}, 26 | "output_type": "execute_result" 27 | }, 28 | { 29 | "data": { 30 | "image/png": "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\n", 31 | "text/plain": [ 32 | "
" 33 | ] 34 | }, 35 | "metadata": { 36 | "needs_background": "light" 37 | }, 38 | "output_type": "display_data" 39 | } 40 | ], 41 | "source": [ 42 | "%matplotlib inline\n", 43 | "import numpy as np\n", 44 | "from sklearn.cluster import KMeans\n", 45 | "from sklearn.datasets import make_blobs\n", 46 | "import matplotlib.pyplot as plt\n", 47 | "\n", 48 | "n_data = 1000\n", 49 | "seed = 1\n", 50 | "n_centers = 4\n", 51 | "\n", 52 | "# 4つの二変量正規分布に従うデータを生成し、k-meansを実行する\n", 53 | "blobs, blob_labels = make_blobs(n_samples=n_data, n_features=2, centers=n_centers, random_state=seed)\n", 54 | "clusters_blob = KMeans(n_clusters=n_centers, random_state=seed).fit_predict(blobs)\n", 55 | "\n", 56 | "# 2次元の一様分布に従うデータを生成し、k-meansを実行する\n", 57 | "uniform = np.random.rand(n_data, 2)\n", 58 | "clusters_uniform = KMeans(n_clusters=n_centers, random_state=seed).fit_predict(uniform)\n", 59 | "\n", 60 | "# 結果を可視化するためのMatplotlibのおまじない\n", 61 | "figure = plt.figure()\n", 62 | "plt.subplot(221)\n", 63 | "plt.scatter(blobs[:, 0], blobs[:, 1], c=blob_labels, cmap='gist_rainbow')\n", 64 | "plt.title('(a) Four randomly generated blobs', fontsize=14)\n", 65 | "plt.axis('off')\n", 66 | "\n", 67 | "plt.subplot(222)\n", 68 | "plt.scatter(blobs[:, 0], blobs[:, 1], c=clusters_blob, cmap='gist_rainbow')\n", 69 | "plt.title('(b) Clusters found via K-means', fontsize=14)\n", 70 | "plt.axis('off')\n", 71 | "\n", 72 | "plt.subplot(223)\n", 73 | "plt.scatter(uniform[:, 0], uniform[:, 1])\n", 74 | "plt.title('(c) 1000 randomly generated points', fontsize=14)\n", 75 | "plt.axis('off')\n", 76 | "\n", 77 | "plt.subplot(224)\n", 78 | "plt.scatter(uniform[:, 0], uniform[:, 1], c=clusters_uniform, cmap='gist_rainbow')\n", 79 | "plt.title('(d) Clusters found via K-means', fontsize=14)\n", 80 | "plt.axis('off')" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": null, 86 | "metadata": {}, 87 | "outputs": [], 88 | "source": [] 89 | } 90 | ], 91 | "metadata": { 92 | "kernelspec": { 93 | "display_name": "Python 3", 94 | "language": "python", 95 | "name": "python3" 96 | }, 97 | "language_info": { 98 | "codemirror_mode": { 99 | "name": "ipython", 100 | "version": 3 101 | }, 102 | "file_extension": ".py", 103 | "mimetype": "text/x-python", 104 | "name": "python", 105 | "nbconvert_exporter": "python", 106 | "pygments_lexer": "ipython3", 107 | "version": "3.7.0" 108 | } 109 | }, 110 | "nbformat": 4, 111 | "nbformat_minor": 2 112 | } 113 | -------------------------------------------------------------------------------- /5-6.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 例5-6. ビンカウンティングの例" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 10, 13 | "metadata": {}, 14 | "outputs": [ 15 | { 16 | "data": { 17 | "text/plain": [ 18 | "(8208, 24)" 19 | ] 20 | }, 21 | "execution_count": 10, 22 | "metadata": {}, 23 | "output_type": "execute_result" 24 | } 25 | ], 26 | "source": [ 27 | "import pandas as pd\n", 28 | "# train_subsetを読み込み(サンプルコードの対象のデータ件数が、8208件です。)\n", 29 | "df = pd.read_csv('data/avazu/train_subset.csv')\n", 30 | "\n", 31 | "df.shape" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 11, 37 | "metadata": {}, 38 | "outputs": [ 39 | { 40 | "data": { 41 | "text/plain": [ 42 | "906" 43 | ] 44 | }, 45 | "execution_count": 11, 46 | "metadata": {}, 47 | "output_type": "execute_result" 48 | } 49 | ], 50 | "source": [ 51 | "\n", 52 | "# device_idが何種類あるか計算\n", 53 | "len(df['device_id'].unique())" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 12, 59 | "metadata": {}, 60 | "outputs": [ 61 | { 62 | "data": { 63 | "text/html": [ 64 | "
\n", 65 | "\n", 78 | "\n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | "
clicksno_clickstotal_clicksN+N-log_N+
a99f214a1279587871570.1787060.8212940.217591
c357dbff212140.1428570.8571430.166667
25635c832021.0000000.000000inf
e62f12612130.6666670.3333332.000000
135f7d9a2021.0000000.000000inf
9af874782021.0000000.000000inf
77cf1a271011.0000000.000000inf
d62216cc1011.0000000.000000inf
fcc5c7c01011.0000000.000000inf
7181509e1011.0000000.000000inf
2a32a3ca1011.0000000.000000inf
2ad16ba31011.0000000.000000inf
938f494b1011.0000000.000000inf
24dbae831011.0000000.000000inf
ca9b95aa1011.0000000.000000inf
7c3698991011.0000000.000000inf
3bf8c26c1011.0000000.000000inf
453781281011.0000000.000000inf
023ca1f91011.0000000.000000inf
3b9ab74d1011.0000000.000000inf
9eb9a9721011.0000000.000000inf
59bcd1ae1011.0000000.000000inf
7f8c00b41011.0000000.000000inf
8d61d7eb1011.0000000.000000inf
b441c41f1011.0000000.000000inf
e317838f1011.0000000.000000inf
2e7d4b651011.0000000.000000inf
70d97ece1011.0000000.000000inf
9809e6c91011.0000000.000000inf
cb73ba551011.0000000.000000inf
.....................
0c3bbac00110.0000001.0000000.000000
34c9f9080110.0000001.0000000.000000
41a1ae5f0110.0000001.0000000.000000
5d03585e0110.0000001.0000000.000000
7d242dfd0110.0000001.0000000.000000
9ffa05630110.0000001.0000000.000000
2fd589900110.0000001.0000000.000000
01e47a3d0110.0000001.0000000.000000
bcd5195e0110.0000001.0000000.000000
a318236b0110.0000001.0000000.000000
1168ce020110.0000001.0000000.000000
83c34e930110.0000001.0000000.000000
c8c310320110.0000001.0000000.000000
004270bf0110.0000001.0000000.000000
e6d0facc0110.0000001.0000000.000000
844524dc0110.0000001.0000000.000000
c90a30a10110.0000001.0000000.000000
5015495b0110.0000001.0000000.000000
a12e8a450110.0000001.0000000.000000
7b5c2c3b0110.0000001.0000000.000000
4a6b5af30110.0000001.0000000.000000
2c8ae68c0110.0000001.0000000.000000
84565c920110.0000001.0000000.000000
2a6fe2a50110.0000001.0000000.000000
e0f700060110.0000001.0000000.000000
cef4c8cc0110.0000001.0000000.000000
7f4b1f1e0110.0000001.0000000.000000
7efe14f00110.0000001.0000000.000000
02b99e770110.0000001.0000000.000000
cbb50c1c0110.0000001.0000000.000000
\n", 642 | "

906 rows × 6 columns

\n", 643 | "
" 644 | ], 645 | "text/plain": [ 646 | " clicks no_clicks total_clicks N+ N- log_N+\n", 647 | "a99f214a 1279 5878 7157 0.178706 0.821294 0.217591\n", 648 | "c357dbff 2 12 14 0.142857 0.857143 0.166667\n", 649 | "25635c83 2 0 2 1.000000 0.000000 inf\n", 650 | "e62f1261 2 1 3 0.666667 0.333333 2.000000\n", 651 | "135f7d9a 2 0 2 1.000000 0.000000 inf\n", 652 | "9af87478 2 0 2 1.000000 0.000000 inf\n", 653 | "77cf1a27 1 0 1 1.000000 0.000000 inf\n", 654 | "d62216cc 1 0 1 1.000000 0.000000 inf\n", 655 | "fcc5c7c0 1 0 1 1.000000 0.000000 inf\n", 656 | "7181509e 1 0 1 1.000000 0.000000 inf\n", 657 | "2a32a3ca 1 0 1 1.000000 0.000000 inf\n", 658 | "2ad16ba3 1 0 1 1.000000 0.000000 inf\n", 659 | "938f494b 1 0 1 1.000000 0.000000 inf\n", 660 | "24dbae83 1 0 1 1.000000 0.000000 inf\n", 661 | "ca9b95aa 1 0 1 1.000000 0.000000 inf\n", 662 | "7c369899 1 0 1 1.000000 0.000000 inf\n", 663 | "3bf8c26c 1 0 1 1.000000 0.000000 inf\n", 664 | "45378128 1 0 1 1.000000 0.000000 inf\n", 665 | "023ca1f9 1 0 1 1.000000 0.000000 inf\n", 666 | "3b9ab74d 1 0 1 1.000000 0.000000 inf\n", 667 | "9eb9a972 1 0 1 1.000000 0.000000 inf\n", 668 | "59bcd1ae 1 0 1 1.000000 0.000000 inf\n", 669 | "7f8c00b4 1 0 1 1.000000 0.000000 inf\n", 670 | "8d61d7eb 1 0 1 1.000000 0.000000 inf\n", 671 | "b441c41f 1 0 1 1.000000 0.000000 inf\n", 672 | "e317838f 1 0 1 1.000000 0.000000 inf\n", 673 | "2e7d4b65 1 0 1 1.000000 0.000000 inf\n", 674 | "70d97ece 1 0 1 1.000000 0.000000 inf\n", 675 | "9809e6c9 1 0 1 1.000000 0.000000 inf\n", 676 | "cb73ba55 1 0 1 1.000000 0.000000 inf\n", 677 | "... ... ... ... ... ... ...\n", 678 | "0c3bbac0 0 1 1 0.000000 1.000000 0.000000\n", 679 | "34c9f908 0 1 1 0.000000 1.000000 0.000000\n", 680 | "41a1ae5f 0 1 1 0.000000 1.000000 0.000000\n", 681 | "5d03585e 0 1 1 0.000000 1.000000 0.000000\n", 682 | "7d242dfd 0 1 1 0.000000 1.000000 0.000000\n", 683 | "9ffa0563 0 1 1 0.000000 1.000000 0.000000\n", 684 | "2fd58990 0 1 1 0.000000 1.000000 0.000000\n", 685 | "01e47a3d 0 1 1 0.000000 1.000000 0.000000\n", 686 | "bcd5195e 0 1 1 0.000000 1.000000 0.000000\n", 687 | "a318236b 0 1 1 0.000000 1.000000 0.000000\n", 688 | "1168ce02 0 1 1 0.000000 1.000000 0.000000\n", 689 | "83c34e93 0 1 1 0.000000 1.000000 0.000000\n", 690 | "c8c31032 0 1 1 0.000000 1.000000 0.000000\n", 691 | "004270bf 0 1 1 0.000000 1.000000 0.000000\n", 692 | "e6d0facc 0 1 1 0.000000 1.000000 0.000000\n", 693 | "844524dc 0 1 1 0.000000 1.000000 0.000000\n", 694 | "c90a30a1 0 1 1 0.000000 1.000000 0.000000\n", 695 | "5015495b 0 1 1 0.000000 1.000000 0.000000\n", 696 | "a12e8a45 0 1 1 0.000000 1.000000 0.000000\n", 697 | "7b5c2c3b 0 1 1 0.000000 1.000000 0.000000\n", 698 | "4a6b5af3 0 1 1 0.000000 1.000000 0.000000\n", 699 | "2c8ae68c 0 1 1 0.000000 1.000000 0.000000\n", 700 | "84565c92 0 1 1 0.000000 1.000000 0.000000\n", 701 | "2a6fe2a5 0 1 1 0.000000 1.000000 0.000000\n", 702 | "e0f70006 0 1 1 0.000000 1.000000 0.000000\n", 703 | "cef4c8cc 0 1 1 0.000000 1.000000 0.000000\n", 704 | "7f4b1f1e 0 1 1 0.000000 1.000000 0.000000\n", 705 | "7efe14f0 0 1 1 0.000000 1.000000 0.000000\n", 706 | "02b99e77 0 1 1 0.000000 1.000000 0.000000\n", 707 | "cbb50c1c 0 1 1 0.000000 1.000000 0.000000\n", 708 | "\n", 709 | "[906 rows x 6 columns]" 710 | ] 711 | }, 712 | "execution_count": 12, 713 | "metadata": {}, 714 | "output_type": "execute_result" 715 | } 716 | ], 717 | "source": [ 718 | "def click_counting(x, bin_column):\n", 719 | " clicks = pd.Series(x[x['click'] > 0][bin_column].value_counts(), name='clicks')\n", 720 | " no_clicks = pd.Series(x[x['click'] < 1][bin_column].value_counts(), name='no_clicks')\n", 721 | "\n", 722 | " counts = pd.DataFrame([clicks,no_clicks]).T.fillna('0')\n", 723 | " counts['total_clicks'] = counts['clicks'].astype('int64') + counts['no_clicks'].astype('int64')\n", 724 | " return counts\n", 725 | "\n", 726 | "def bin_counting(counts):\n", 727 | " counts['N+'] = counts['clicks'].astype('int64').divide(counts['total_clicks'].astype('int64'))\n", 728 | " counts['N-'] = counts['no_clicks'].astype('int64').divide(counts['total_clicks'].astype('int64'))\n", 729 | " counts['log_N+'] = counts['N+'].divide(counts['N-'])\n", 730 | " # Bin Countingのプロパティを返すだけの場合、ここでフィルタリングを実行\n", 731 | " bin_counts = counts.filter(items= ['N+', 'N-', 'log_N+'])\n", 732 | " return counts, bin_counts\n", 733 | "\n", 734 | "# device_idを対象としたビンカウンティング\n", 735 | "bin_column = 'device_id'\n", 736 | "device_clicks = click_counting(df.filter(items=[bin_column, 'click']), bin_column)\n", 737 | "device_all, device_bin_counts = bin_counting(device_clicks)\n", 738 | "\n", 739 | "device_all" 740 | ] 741 | }, 742 | { 743 | "cell_type": "code", 744 | "execution_count": 13, 745 | "metadata": {}, 746 | "outputs": [ 747 | { 748 | "data": { 749 | "text/html": [ 750 | "
\n", 751 | "\n", 764 | "\n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | " \n", 792 | " \n", 793 | " \n", 794 | " \n", 795 | " \n", 796 | " \n", 797 | " \n", 798 | " \n", 799 | " \n", 800 | " \n", 801 | " \n", 802 | " \n", 803 | " \n", 804 | " \n", 805 | " \n", 806 | " \n", 807 | " \n", 808 | " \n", 809 | " \n", 810 | " \n", 811 | " \n", 812 | " \n", 813 | " \n", 814 | " \n", 815 | " \n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | " \n", 824 | " \n", 825 | " \n", 826 | " \n", 827 | " \n", 828 | " \n", 829 | " \n", 830 | " \n", 831 | " \n", 832 | " \n", 833 | " \n", 834 | " \n", 835 | " \n", 836 | " \n", 837 | " \n", 838 | " \n", 839 | " \n", 840 | " \n", 841 | " \n", 842 | " \n", 843 | " \n", 844 | " \n", 845 | " \n", 846 | " \n", 847 | " \n", 848 | " \n", 849 | " \n", 850 | " \n", 851 | " \n", 852 | " \n", 853 | " \n", 854 | " \n", 855 | " \n", 856 | " \n", 857 | " \n", 858 | " \n", 859 | " \n", 860 | " \n", 861 | " \n", 862 | " \n", 863 | " \n", 864 | " \n", 865 | " \n", 866 | " \n", 867 | " \n", 868 | " \n", 869 | " \n", 870 | " \n", 871 | " \n", 872 | " \n", 873 | " \n", 874 | " \n", 875 | " \n", 876 | " \n", 877 | " \n", 878 | " \n", 879 | " \n", 880 | " \n", 881 | " \n", 882 | " \n", 883 | " \n", 884 | " \n", 885 | " \n", 886 | " \n", 887 | " \n", 888 | " \n", 889 | " \n", 890 | " \n", 891 | " \n", 892 | " \n", 893 | " \n", 894 | " \n", 895 | " \n", 896 | " \n", 897 | " \n", 898 | " \n", 899 | " \n", 900 | " \n", 901 | " \n", 902 | " \n", 903 | " \n", 904 | " \n", 905 | " \n", 906 | " \n", 907 | " \n", 908 | " \n", 909 | " \n", 910 | " \n", 911 | " \n", 912 | " \n", 913 | " \n", 914 | " \n", 915 | " \n", 916 | " \n", 917 | " \n", 918 | " \n", 919 | " \n", 920 | " \n", 921 | " \n", 922 | " \n", 923 | " \n", 924 | " \n", 925 | " \n", 926 | " \n", 927 | " \n", 928 | " \n", 929 | " \n", 930 | " \n", 931 | " \n", 932 | " \n", 933 | " \n", 934 | " \n", 935 | " \n", 936 | " \n", 937 | " \n", 938 | " \n", 939 | " \n", 940 | " \n", 941 | " \n", 942 | " \n", 943 | " \n", 944 | " \n", 945 | " \n", 946 | " \n", 947 | " \n", 948 | " \n", 949 | " \n", 950 | " \n", 951 | " \n", 952 | " \n", 953 | " \n", 954 | " \n", 955 | " \n", 956 | " \n", 957 | " \n", 958 | " \n", 959 | " \n", 960 | " \n", 961 | " \n", 962 | " \n", 963 | " \n", 964 | " \n", 965 | " \n", 966 | " \n", 967 | " \n", 968 | " \n", 969 | " \n", 970 | " \n", 971 | " \n", 972 | " \n", 973 | " \n", 974 | " \n", 975 | " \n", 976 | " \n", 977 | " \n", 978 | " \n", 979 | " \n", 980 | " \n", 981 | " \n", 982 | " \n", 983 | " \n", 984 | " \n", 985 | " \n", 986 | " \n", 987 | " \n", 988 | " \n", 989 | " \n", 990 | " \n", 991 | " \n", 992 | " \n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | " \n", 1022 | " \n", 1023 | " \n", 1024 | " \n", 1025 | " \n", 1026 | " \n", 1027 | " \n", 1028 | " \n", 1029 | " \n", 1030 | " \n", 1031 | " \n", 1032 | " \n", 1033 | " \n", 1034 | " \n", 1035 | " \n", 1036 | " \n", 1037 | " \n", 1038 | " \n", 1039 | " \n", 1040 | " \n", 1041 | " \n", 1042 | " \n", 1043 | " \n", 1044 | " \n", 1045 | " \n", 1046 | " \n", 1047 | " \n", 1048 | " \n", 1049 | " \n", 1050 | " \n", 1051 | " \n", 1052 | " \n", 1053 | " \n", 1054 | " \n", 1055 | " \n", 1056 | " \n", 1057 | " \n", 1058 | " \n", 1059 | " \n", 1060 | " \n", 1061 | " \n", 1062 | " \n", 1063 | " \n", 1064 | " \n", 1065 | " \n", 1066 | " \n", 1067 | " \n", 1068 | " \n", 1069 | " \n", 1070 | " \n", 1071 | " \n", 1072 | " \n", 1073 | " \n", 1074 | " \n", 1075 | " \n", 1076 | " \n", 1077 | " \n", 1078 | " \n", 1079 | " \n", 1080 | " \n", 1081 | " \n", 1082 | " \n", 1083 | " \n", 1084 | " \n", 1085 | " \n", 1086 | " \n", 1087 | " \n", 1088 | " \n", 1089 | " \n", 1090 | " \n", 1091 | " \n", 1092 | " \n", 1093 | " \n", 1094 | " \n", 1095 | " \n", 1096 | " \n", 1097 | " \n", 1098 | " \n", 1099 | " \n", 1100 | " \n", 1101 | " \n", 1102 | " \n", 1103 | " \n", 1104 | " \n", 1105 | " \n", 1106 | " \n", 1107 | " \n", 1108 | " \n", 1109 | " \n", 1110 | " \n", 1111 | " \n", 1112 | " \n", 1113 | " \n", 1114 | " \n", 1115 | " \n", 1116 | " \n", 1117 | " \n", 1118 | " \n", 1119 | " \n", 1120 | " \n", 1121 | " \n", 1122 | " \n", 1123 | " \n", 1124 | " \n", 1125 | " \n", 1126 | " \n", 1127 | " \n", 1128 | " \n", 1129 | " \n", 1130 | " \n", 1131 | " \n", 1132 | " \n", 1133 | " \n", 1134 | " \n", 1135 | " \n", 1136 | " \n", 1137 | " \n", 1138 | " \n", 1139 | " \n", 1140 | " \n", 1141 | "
N+N-log_N+
a99f214a0.1787060.8212940.217591
c357dbff0.1428570.8571430.166667
25635c831.0000000.000000inf
e62f12610.6666670.3333332.000000
135f7d9a1.0000000.000000inf
9af874781.0000000.000000inf
77cf1a271.0000000.000000inf
d62216cc1.0000000.000000inf
fcc5c7c01.0000000.000000inf
7181509e1.0000000.000000inf
2a32a3ca1.0000000.000000inf
2ad16ba31.0000000.000000inf
938f494b1.0000000.000000inf
24dbae831.0000000.000000inf
ca9b95aa1.0000000.000000inf
7c3698991.0000000.000000inf
3bf8c26c1.0000000.000000inf
453781281.0000000.000000inf
023ca1f91.0000000.000000inf
3b9ab74d1.0000000.000000inf
9eb9a9721.0000000.000000inf
59bcd1ae1.0000000.000000inf
7f8c00b41.0000000.000000inf
8d61d7eb1.0000000.000000inf
b441c41f1.0000000.000000inf
e317838f1.0000000.000000inf
2e7d4b651.0000000.000000inf
70d97ece1.0000000.000000inf
9809e6c91.0000000.000000inf
cb73ba551.0000000.000000inf
............
0c3bbac00.0000001.0000000.000000
34c9f9080.0000001.0000000.000000
41a1ae5f0.0000001.0000000.000000
5d03585e0.0000001.0000000.000000
7d242dfd0.0000001.0000000.000000
9ffa05630.0000001.0000000.000000
2fd589900.0000001.0000000.000000
01e47a3d0.0000001.0000000.000000
bcd5195e0.0000001.0000000.000000
a318236b0.0000001.0000000.000000
1168ce020.0000001.0000000.000000
83c34e930.0000001.0000000.000000
c8c310320.0000001.0000000.000000
004270bf0.0000001.0000000.000000
e6d0facc0.0000001.0000000.000000
844524dc0.0000001.0000000.000000
c90a30a10.0000001.0000000.000000
5015495b0.0000001.0000000.000000
a12e8a450.0000001.0000000.000000
7b5c2c3b0.0000001.0000000.000000
4a6b5af30.0000001.0000000.000000
2c8ae68c0.0000001.0000000.000000
84565c920.0000001.0000000.000000
2a6fe2a50.0000001.0000000.000000
e0f700060.0000001.0000000.000000
cef4c8cc0.0000001.0000000.000000
7f4b1f1e0.0000001.0000000.000000
7efe14f00.0000001.0000000.000000
02b99e770.0000001.0000000.000000
cbb50c1c0.0000001.0000000.000000
\n", 1142 | "

906 rows × 3 columns

\n", 1143 | "
" 1144 | ], 1145 | "text/plain": [ 1146 | " N+ N- log_N+\n", 1147 | "a99f214a 0.178706 0.821294 0.217591\n", 1148 | "c357dbff 0.142857 0.857143 0.166667\n", 1149 | "25635c83 1.000000 0.000000 inf\n", 1150 | "e62f1261 0.666667 0.333333 2.000000\n", 1151 | "135f7d9a 1.000000 0.000000 inf\n", 1152 | "9af87478 1.000000 0.000000 inf\n", 1153 | "77cf1a27 1.000000 0.000000 inf\n", 1154 | "d62216cc 1.000000 0.000000 inf\n", 1155 | "fcc5c7c0 1.000000 0.000000 inf\n", 1156 | "7181509e 1.000000 0.000000 inf\n", 1157 | "2a32a3ca 1.000000 0.000000 inf\n", 1158 | "2ad16ba3 1.000000 0.000000 inf\n", 1159 | "938f494b 1.000000 0.000000 inf\n", 1160 | "24dbae83 1.000000 0.000000 inf\n", 1161 | "ca9b95aa 1.000000 0.000000 inf\n", 1162 | "7c369899 1.000000 0.000000 inf\n", 1163 | "3bf8c26c 1.000000 0.000000 inf\n", 1164 | "45378128 1.000000 0.000000 inf\n", 1165 | "023ca1f9 1.000000 0.000000 inf\n", 1166 | "3b9ab74d 1.000000 0.000000 inf\n", 1167 | "9eb9a972 1.000000 0.000000 inf\n", 1168 | "59bcd1ae 1.000000 0.000000 inf\n", 1169 | "7f8c00b4 1.000000 0.000000 inf\n", 1170 | "8d61d7eb 1.000000 0.000000 inf\n", 1171 | "b441c41f 1.000000 0.000000 inf\n", 1172 | "e317838f 1.000000 0.000000 inf\n", 1173 | "2e7d4b65 1.000000 0.000000 inf\n", 1174 | "70d97ece 1.000000 0.000000 inf\n", 1175 | "9809e6c9 1.000000 0.000000 inf\n", 1176 | "cb73ba55 1.000000 0.000000 inf\n", 1177 | "... ... ... ...\n", 1178 | "0c3bbac0 0.000000 1.000000 0.000000\n", 1179 | "34c9f908 0.000000 1.000000 0.000000\n", 1180 | "41a1ae5f 0.000000 1.000000 0.000000\n", 1181 | "5d03585e 0.000000 1.000000 0.000000\n", 1182 | "7d242dfd 0.000000 1.000000 0.000000\n", 1183 | "9ffa0563 0.000000 1.000000 0.000000\n", 1184 | "2fd58990 0.000000 1.000000 0.000000\n", 1185 | "01e47a3d 0.000000 1.000000 0.000000\n", 1186 | "bcd5195e 0.000000 1.000000 0.000000\n", 1187 | "a318236b 0.000000 1.000000 0.000000\n", 1188 | "1168ce02 0.000000 1.000000 0.000000\n", 1189 | "83c34e93 0.000000 1.000000 0.000000\n", 1190 | "c8c31032 0.000000 1.000000 0.000000\n", 1191 | "004270bf 0.000000 1.000000 0.000000\n", 1192 | "e6d0facc 0.000000 1.000000 0.000000\n", 1193 | "844524dc 0.000000 1.000000 0.000000\n", 1194 | "c90a30a1 0.000000 1.000000 0.000000\n", 1195 | "5015495b 0.000000 1.000000 0.000000\n", 1196 | "a12e8a45 0.000000 1.000000 0.000000\n", 1197 | "7b5c2c3b 0.000000 1.000000 0.000000\n", 1198 | "4a6b5af3 0.000000 1.000000 0.000000\n", 1199 | "2c8ae68c 0.000000 1.000000 0.000000\n", 1200 | "84565c92 0.000000 1.000000 0.000000\n", 1201 | "2a6fe2a5 0.000000 1.000000 0.000000\n", 1202 | "e0f70006 0.000000 1.000000 0.000000\n", 1203 | "cef4c8cc 0.000000 1.000000 0.000000\n", 1204 | "7f4b1f1e 0.000000 1.000000 0.000000\n", 1205 | "7efe14f0 0.000000 1.000000 0.000000\n", 1206 | "02b99e77 0.000000 1.000000 0.000000\n", 1207 | "cbb50c1c 0.000000 1.000000 0.000000\n", 1208 | "\n", 1209 | "[906 rows x 3 columns]" 1210 | ] 1211 | }, 1212 | "execution_count": 13, 1213 | "metadata": {}, 1214 | "output_type": "execute_result" 1215 | } 1216 | ], 1217 | "source": [ 1218 | "device_bin_counts" 1219 | ] 1220 | }, 1221 | { 1222 | "cell_type": "code", 1223 | "execution_count": 14, 1224 | "metadata": {}, 1225 | "outputs": [ 1226 | { 1227 | "data": { 1228 | "text/plain": [ 1229 | "906" 1230 | ] 1231 | }, 1232 | "execution_count": 14, 1233 | "metadata": {}, 1234 | "output_type": "execute_result" 1235 | } 1236 | ], 1237 | "source": [ 1238 | "len(device_bin_counts)" 1239 | ] 1240 | }, 1241 | { 1242 | "cell_type": "code", 1243 | "execution_count": 15, 1244 | "metadata": {}, 1245 | "outputs": [ 1246 | { 1247 | "data": { 1248 | "text/html": [ 1249 | "
\n", 1250 | "\n", 1263 | "\n", 1264 | " \n", 1265 | " \n", 1266 | " \n", 1267 | " \n", 1268 | " \n", 1269 | " \n", 1270 | " \n", 1271 | " \n", 1272 | " \n", 1273 | " \n", 1274 | " \n", 1275 | " \n", 1276 | " \n", 1277 | " \n", 1278 | " \n", 1279 | " \n", 1280 | " \n", 1281 | " \n", 1282 | " \n", 1283 | " \n", 1284 | " \n", 1285 | " \n", 1286 | " \n", 1287 | " \n", 1288 | " \n", 1289 | " \n", 1290 | " \n", 1291 | " \n", 1292 | " \n", 1293 | " \n", 1294 | " \n", 1295 | " \n", 1296 | " \n", 1297 | " \n", 1298 | " \n", 1299 | " \n", 1300 | " \n", 1301 | " \n", 1302 | " \n", 1303 | " \n", 1304 | " \n", 1305 | " \n", 1306 | " \n", 1307 | " \n", 1308 | " \n", 1309 | " \n", 1310 | " \n", 1311 | " \n", 1312 | " \n", 1313 | "
clicksno_clickstotal_clicksN+N-log_N+
a99f214a1279587871570.1787060.8212940.217591
c357dbff212140.1428570.8571430.166667
a167aa830770.0000001.0000000.000000
d2bbb6400660.0000001.0000000.000000
\n", 1314 | "
" 1315 | ], 1316 | "text/plain": [ 1317 | " clicks no_clicks total_clicks N+ N- log_N+\n", 1318 | "a99f214a 1279 5878 7157 0.178706 0.821294 0.217591\n", 1319 | "c357dbff 2 12 14 0.142857 0.857143 0.166667\n", 1320 | "a167aa83 0 7 7 0.000000 1.000000 0.000000\n", 1321 | "d2bbb640 0 6 6 0.000000 1.000000 0.000000" 1322 | ] 1323 | }, 1324 | "execution_count": 15, 1325 | "metadata": {}, 1326 | "output_type": "execute_result" 1327 | } 1328 | ], 1329 | "source": [ 1330 | "device_all.sort_values(by = 'total_clicks', ascending=False).head(4)" 1331 | ] 1332 | }, 1333 | { 1334 | "cell_type": "code", 1335 | "execution_count": null, 1336 | "metadata": {}, 1337 | "outputs": [], 1338 | "source": [] 1339 | } 1340 | ], 1341 | "metadata": { 1342 | "kernelspec": { 1343 | "display_name": "Python 3", 1344 | "language": "python", 1345 | "name": "python3" 1346 | }, 1347 | "language_info": { 1348 | "codemirror_mode": { 1349 | "name": "ipython", 1350 | "version": 3 1351 | }, 1352 | "file_extension": ".py", 1353 | "mimetype": "text/x-python", 1354 | "name": "python", 1355 | "nbconvert_exporter": "python", 1356 | "pygments_lexer": "ipython3", 1357 | "version": "3.7.0" 1358 | } 1359 | }, 1360 | "nbformat": 4, 1361 | "nbformat_minor": 2 1362 | } 1363 | -------------------------------------------------------------------------------- /2-2-2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 例2-2. Yelp データセット内の店舗に対するレビュー件数の可視化" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 7, 13 | "metadata": {}, 14 | "outputs": [ 15 | { 16 | "data": { 17 | "text/html": [ 18 | "
\n", 19 | "\n", 32 | "\n", 33 | " \n", 34 | " \n", 35 | " \n", 36 | " \n", 37 | " \n", 38 | " \n", 39 | " \n", 40 | " \n", 41 | " \n", 42 | " \n", 43 | " \n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | "
business_idcategoriescityfull_addresslatitudelongitudenameneighborhoodsopenreview_countstarsstatetype
0rncjoVoEFUJGCUoC1JgnUA[Accountants, Professional Services, Tax Servi...Peoria8466 W Peoria Ave\\nSte 6\\nPeoria, AZ 8534533.581867-112.241596Peoria Income Tax Service[]True35.0AZbusiness
10FNFSzCFP_rGUoJx8W7tJg[Sporting Goods, Bikes, Shopping]Phoenix2149 W Wood Dr\\nPhoenix, AZ 8502933.604054-112.105933Bike Doctor[]True55.0AZbusiness
23f_lyB6vFK48ukH6ScvLHg[]Phoenix1134 N Central Ave\\nPhoenix, AZ 8500433.460526-112.073933Valley Permaculture Alliance[]True45.0AZbusiness
3usAsSV36QmUej8--yvN-dg[Food, Grocery]Phoenix845 W Southern Ave\\nPhoenix, AZ 8504133.392210-112.085377Food City[]True53.5AZbusiness
4PzOqRohWw7F7YEPBz6AubA[Food, Bagels, Delis, Restaurants]Glendale Az6520 W Happy Valley Rd\\nSte 101\\nGlendale Az, ...33.712797-112.200264Hot Bagels & Deli[]True143.5AZbusiness
\n", 134 | "
" 135 | ], 136 | "text/plain": [ 137 | " business_id categories \\\n", 138 | "0 rncjoVoEFUJGCUoC1JgnUA [Accountants, Professional Services, Tax Servi... \n", 139 | "1 0FNFSzCFP_rGUoJx8W7tJg [Sporting Goods, Bikes, Shopping] \n", 140 | "2 3f_lyB6vFK48ukH6ScvLHg [] \n", 141 | "3 usAsSV36QmUej8--yvN-dg [Food, Grocery] \n", 142 | "4 PzOqRohWw7F7YEPBz6AubA [Food, Bagels, Delis, Restaurants] \n", 143 | "\n", 144 | " city full_address latitude \\\n", 145 | "0 Peoria 8466 W Peoria Ave\\nSte 6\\nPeoria, AZ 85345 33.581867 \n", 146 | "1 Phoenix 2149 W Wood Dr\\nPhoenix, AZ 85029 33.604054 \n", 147 | "2 Phoenix 1134 N Central Ave\\nPhoenix, AZ 85004 33.460526 \n", 148 | "3 Phoenix 845 W Southern Ave\\nPhoenix, AZ 85041 33.392210 \n", 149 | "4 Glendale Az 6520 W Happy Valley Rd\\nSte 101\\nGlendale Az, ... 33.712797 \n", 150 | "\n", 151 | " longitude name neighborhoods open review_count \\\n", 152 | "0 -112.241596 Peoria Income Tax Service [] True 3 \n", 153 | "1 -112.105933 Bike Doctor [] True 5 \n", 154 | "2 -112.073933 Valley Permaculture Alliance [] True 4 \n", 155 | "3 -112.085377 Food City [] True 5 \n", 156 | "4 -112.200264 Hot Bagels & Deli [] True 14 \n", 157 | "\n", 158 | " stars state type \n", 159 | "0 5.0 AZ business \n", 160 | "1 5.0 AZ business \n", 161 | "2 5.0 AZ business \n", 162 | "3 3.5 AZ business \n", 163 | "4 3.5 AZ business " 164 | ] 165 | }, 166 | "execution_count": 7, 167 | "metadata": {}, 168 | "output_type": "execute_result" 169 | } 170 | ], 171 | "source": [ 172 | "import pandas as pd\n", 173 | "import json\n", 174 | "\n", 175 | "# 店舗についてのデータを読み込む\n", 176 | "with open('data/yelp/yelp_academic_dataset_business.json') as biz_file:\n", 177 | " biz_df = pd.DataFrame([json.loads(x) for x in biz_file.readlines()])\n", 178 | "\n", 179 | "biz_df.head()" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": 8, 185 | "metadata": {}, 186 | "outputs": [ 187 | { 188 | "data": { 189 | "text/plain": [ 190 | "Text(0, 0.5, 'Occurrence')" 191 | ] 192 | }, 193 | "execution_count": 8, 194 | "metadata": {}, 195 | "output_type": "execute_result" 196 | }, 197 | { 198 | "data": { 199 | "image/png": "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\n", 200 | "text/plain": [ 201 | "
" 202 | ] 203 | }, 204 | "metadata": {}, 205 | "output_type": "display_data" 206 | } 207 | ], 208 | "source": [ 209 | "%matplotlib inline\n", 210 | "import matplotlib.pyplot as plt\n", 211 | "import seaborn as sns\n", 212 | "\n", 213 | "# レビュー件数のヒストグラムを描画\n", 214 | "sns.set_style('whitegrid')\n", 215 | "fig, ax = plt.subplots()\n", 216 | "biz_df['review_count'].hist(ax=ax, bins=100)\n", 217 | "ax.set_yscale('log')\n", 218 | "ax.tick_params(labelsize=14)\n", 219 | "ax.set_xlabel('Review Count', fontsize=14)\n", 220 | "ax.set_ylabel('Occurrence', fontsize=14)" 221 | ] 222 | }, 223 | { 224 | "cell_type": "markdown", 225 | "metadata": {}, 226 | "source": [ 227 | "## 例 2-3. 固定幅によるカウントの離散化" 228 | ] 229 | }, 230 | { 231 | "cell_type": "code", 232 | "execution_count": 9, 233 | "metadata": {}, 234 | "outputs": [ 235 | { 236 | "data": { 237 | "text/plain": [ 238 | "array([37, 12, 72, 9, 75, 5, 79, 64, 16, 1, 76, 71, 6, 25, 50, 20, 18,\n", 239 | " 84, 11, 28])" 240 | ] 241 | }, 242 | "execution_count": 9, 243 | "metadata": {}, 244 | "output_type": "execute_result" 245 | } 246 | ], 247 | "source": [ 248 | "import numpy as np\n", 249 | "\n", 250 | "np.random.seed(seed=1)\n", 251 | "\n", 252 | "# 0から99までの整数を一様分布からランダムに20個生成する\n", 253 | "small_counts = np.random.randint(0, 100, 20)\n", 254 | "\n", 255 | "small_counts" 256 | ] 257 | }, 258 | { 259 | "cell_type": "code", 260 | "execution_count": 10, 261 | "metadata": {}, 262 | "outputs": [ 263 | { 264 | "data": { 265 | "text/plain": [ 266 | "array([3, 1, 7, 0, 7, 0, 7, 6, 1, 0, 7, 7, 0, 2, 5, 2, 1, 8, 1, 2])" 267 | ] 268 | }, 269 | "execution_count": 10, 270 | "metadata": {}, 271 | "output_type": "execute_result" 272 | } 273 | ], 274 | "source": [ 275 | "# 除算により 0-9 までの階級を割り当てる\n", 276 | "np.floor_divide(small_counts, 10)" 277 | ] 278 | }, 279 | { 280 | "cell_type": "code", 281 | "execution_count": 11, 282 | "metadata": {}, 283 | "outputs": [ 284 | { 285 | "data": { 286 | "text/plain": [ 287 | "array([2., 3., 4., 1., 0., 2., 2., 3., 3., 4., 4., 1., 1., 3., 2., 2., 4.])" 288 | ] 289 | }, 290 | "execution_count": 11, 291 | "metadata": {}, 292 | "output_type": "execute_result" 293 | } 294 | ], 295 | "source": [ 296 | "# 複数の桁にまたがるカウントデータの配列\n", 297 | "large_counts = [296, 8286, 64011, 80, 3, 725, 867, 2215, 7689, 11495, 91897, \n", 298 | " 44, 28, 7971, 926, 122, 22222]\n", 299 | "# 対数変換により指数幅の階級を割り当てる\n", 300 | "np.floor(np.log10(large_counts))" 301 | ] 302 | }, 303 | { 304 | "cell_type": "markdown", 305 | "metadata": {}, 306 | "source": [ 307 | "## 例 2-4. Yelp ビジネスレビュー件数の十分位数を計算する" 308 | ] 309 | }, 310 | { 311 | "cell_type": "code", 312 | "execution_count": 12, 313 | "metadata": {}, 314 | "outputs": [ 315 | { 316 | "data": { 317 | "text/plain": [ 318 | "0.1 3.0\n", 319 | "0.2 3.0\n", 320 | "0.3 4.0\n", 321 | "0.4 5.0\n", 322 | "0.5 6.0\n", 323 | "0.6 8.0\n", 324 | "0.7 12.0\n", 325 | "0.8 23.0\n", 326 | "0.9 50.0\n", 327 | "Name: review_count, dtype: float64" 328 | ] 329 | }, 330 | "execution_count": 12, 331 | "metadata": {}, 332 | "output_type": "execute_result" 333 | } 334 | ], 335 | "source": [ 336 | "deciles = biz_df['review_count'].quantile([.1, .2, .3, .4, .5, .6, .7, .8, .9])\n", 337 | "deciles" 338 | ] 339 | }, 340 | { 341 | "cell_type": "code", 342 | "execution_count": 13, 343 | "metadata": {}, 344 | "outputs": [ 345 | { 346 | "data": { 347 | "text/plain": [ 348 | "Text(0, 0.5, 'Occurrence')" 349 | ] 350 | }, 351 | "execution_count": 13, 352 | "metadata": {}, 353 | "output_type": "execute_result" 354 | }, 355 | { 356 | "data": { 357 | "image/png": "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C0OFegx3d3cMHToUAPDGG29gwYIF+Pjjj/HKK68AuPuiIh8fnzb/n3vLEJKzszOeeOIJ5OfnIzY2FgcOHMD06dPh7u7e5jF1Oh1GjBiBDz74wGRZy1VnY8eOhUajwenTp1FUVISkpCTU19dj9erVKC4uRt++fREaGtruzzVs2DBcunTJvC+jFScnJwB3h8ru1dzc3OY2rYcNW7bX6XRdroF6Dw5/UY+1ZMkSfPrppygvLwcAyGQyVFZWok+fPhg6dKjRf63nS5566in88MMP+Omnn3D06NF2h75a9llaWgovLy+Tfd5///0AYJhX+eKLL3Dnzh3IZDKMGTMG169fR35+fofzKQAwa9YsKBQKw2R6azqdDnfu3MGQIUPg7OyMkydPGpZptVqcOnUKQUFBAICBAwcCgNEci1KpFPJVGnF2doZWqzV7O+odGCrUY0VEROCRRx7Btm3bANy95DgsLAyLFy/Gd999h7KyMhQXF2PLli1GV0mFhYXB398faWlpuP/++02Gy1qbPXs2vL29sXjxYhQWFqKsrAxFRUXIysoyXAEG3B0CO3DgAMLDwyGRSODq6orRo0fjwIEDHc6nAMDChQsxduxYJCcn47PPPoNSqURZWRn+/ve/Y/78+SgpKUG/fv3wm9/8Bhs3bsR3332Hixcv4q233kJVVRXmz58PABgyZAgeeOABbN26FZcvX8bRo0cN3405AgIC0NjYiO+//x43btxAfX292fugnouhQj3aokWLsHfvXvz8889wcnLC9u3bERERgczMTDzxxBNYunQpLl++bJg3aDF79mycO3cOTz75JCQSSbv7d3d3R05ODgIDA/Haa6/hiSeeQHp6Om7duoUBAwYY1hs/fjyam5uNAqSttra4uLhg586dSElJwd69e/Hss88iPj4ef/jDHxAbGwu5XA4A+M///E888cQTyMjIwJw5c3D+/Hl8+umnhp/N2dkZmzZtQllZGebMmYPs7GwsW7bM7O80LCwM8+bNw7JlyzBx4kT84Q9/MHsf1HPxjnoiIhINeypERCQahgoREYmGoUJERKJhqBARkWgYKkREJBqGChERiYahQkREomGoEBGRaP4/Ca94dmET6L0AAAAASUVORK5CYII=\n", 358 | "text/plain": [ 359 | "
" 360 | ] 361 | }, 362 | "metadata": {}, 363 | "output_type": "display_data" 364 | } 365 | ], 366 | "source": [ 367 | "# ヒストグラムに十分位数を上書きする\n", 368 | "sns.set_style('whitegrid')\n", 369 | "fig, ax = plt.subplots()\n", 370 | "biz_df['review_count'].hist(ax=ax, bins=100)\n", 371 | "for pos in deciles:\n", 372 | " handle = plt.axvline(pos, color='r')\n", 373 | "ax.legend([handle], ['deciles'], fontsize=14)\n", 374 | "ax.set_yscale('log')\n", 375 | "ax.set_xscale('log')\n", 376 | "ax.tick_params(labelsize=14)\n", 377 | "ax.set_xlabel('Review Count', fontsize=14)\n", 378 | "ax.set_ylabel('Occurrence', fontsize=14)" 379 | ] 380 | }, 381 | { 382 | "cell_type": "markdown", 383 | "metadata": {}, 384 | "source": [ 385 | "## 例 2-5. 分位数によるカウントの離散化" 386 | ] 387 | }, 388 | { 389 | "cell_type": "code", 390 | "execution_count": 14, 391 | "metadata": {}, 392 | "outputs": [ 393 | { 394 | "data": { 395 | "text/plain": [ 396 | "array([1, 2, 3, 0, 0, 1, 1, 2, 2, 3, 3, 0, 0, 2, 1, 0, 3])" 397 | ] 398 | }, 399 | "execution_count": 14, 400 | "metadata": {}, 401 | "output_type": "execute_result" 402 | } 403 | ], 404 | "source": [ 405 | "# 例2-3の large_count を引き続き使う\n", 406 | "import pandas as pd\n", 407 | "\n", 408 | "# 四分位数に変換\n", 409 | "pd.qcut(large_counts, 4, labels=False)" 410 | ] 411 | }, 412 | { 413 | "cell_type": "code", 414 | "execution_count": 15, 415 | "metadata": {}, 416 | "outputs": [ 417 | { 418 | "data": { 419 | "text/plain": [ 420 | "0.25 122.0\n", 421 | "0.50 926.0\n", 422 | "0.75 8286.0\n", 423 | "dtype: float64" 424 | ] 425 | }, 426 | "execution_count": 15, 427 | "metadata": {}, 428 | "output_type": "execute_result" 429 | } 430 | ], 431 | "source": [ 432 | "# 分位数の計算\n", 433 | "large_counts_series = pd.Series(large_counts)\n", 434 | "large_counts_series.quantile([0.25, 0.5, 0.75])" 435 | ] 436 | }, 437 | { 438 | "cell_type": "markdown", 439 | "metadata": {}, 440 | "source": [ 441 | "## 例 2-6. 対数変換の前後でレビュー件数のヒストグラムを比較する" 442 | ] 443 | }, 444 | { 445 | "cell_type": "code", 446 | "execution_count": 16, 447 | "metadata": {}, 448 | "outputs": [ 449 | { 450 | "data": { 451 | "text/plain": [ 452 | "Text(0, 0.5, 'Occurrence')" 453 | ] 454 | }, 455 | "execution_count": 16, 456 | "metadata": {}, 457 | "output_type": "execute_result" 458 | }, 459 | { 460 | "data": { 461 | "image/png": "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\n", 462 | "text/plain": [ 463 | "
" 464 | ] 465 | }, 466 | "metadata": {}, 467 | "output_type": "display_data" 468 | } 469 | ], 470 | "source": [ 471 | "import numpy as np\n", 472 | "\n", 473 | "# 例2-2で読み込んだ Yelp データセットの\n", 474 | "# データフレーム biz_df を使用して、レビュー件数を対数変換する。\n", 475 | "# レビュー件数 0 を対数変換してマイナス無限大になるのを防ぐために\n", 476 | "# 対数変換の前に生データに 1 を加算していることに注意。\n", 477 | "biz_df['log_review_count'] = np.log10(biz_df['review_count'] + 1)\n", 478 | "\n", 479 | "fig, (ax1, ax2) = plt.subplots(2,1)\n", 480 | "biz_df['review_count'].hist(ax=ax1, bins=100)\n", 481 | "ax1.tick_params(labelsize=14)\n", 482 | "ax1.set_xlabel('review_count', fontsize=14)\n", 483 | "ax1.set_ylabel('Occurrence', fontsize=14)\n", 484 | "\n", 485 | "biz_df['log_review_count'].hist(ax=ax2, bins=100)\n", 486 | "ax2.tick_params(labelsize=14)\n", 487 | "ax2.set_xlabel('log10(review_count))', fontsize=14)\n", 488 | "ax2.set_ylabel('Occurrence', fontsize=14)" 489 | ] 490 | }, 491 | { 492 | "cell_type": "code", 493 | "execution_count": null, 494 | "metadata": {}, 495 | "outputs": [], 496 | "source": [] 497 | } 498 | ], 499 | "metadata": { 500 | "kernelspec": { 501 | "display_name": "Python 3", 502 | "language": "python", 503 | "name": "python3" 504 | }, 505 | "language_info": { 506 | "codemirror_mode": { 507 | "name": "ipython", 508 | "version": 3 509 | }, 510 | "file_extension": ".py", 511 | "mimetype": "text/x-python", 512 | "name": "python", 513 | "nbconvert_exporter": "python", 514 | "pygments_lexer": "ipython3", 515 | "version": "3.7.0" 516 | } 517 | }, 518 | "nbformat": 4, 519 | "nbformat_minor": 2 520 | } 521 | --------------------------------------------------------------------------------