├── 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 | " 0 | \n",
37 | " 1 | \n",
38 | " 2 | \n",
39 | "
\n",
40 | " \n",
41 | " \n",
42 | " \n",
43 | " | 0 | \n",
44 | " b80344d063b5ccb3212f76538f3d9e43d87dca9e | \n",
45 | " SOAKIMP12A8C130995 | \n",
46 | " 1 | \n",
47 | "
\n",
48 | " \n",
49 | " | 1 | \n",
50 | " b80344d063b5ccb3212f76538f3d9e43d87dca9e | \n",
51 | " SOAPDEY12A81C210A9 | \n",
52 | " 1 | \n",
53 | "
\n",
54 | " \n",
55 | " | 2 | \n",
56 | " b80344d063b5ccb3212f76538f3d9e43d87dca9e | \n",
57 | " SOBBMDR12A8C13253B | \n",
58 | " 1 | \n",
59 | "
\n",
60 | " \n",
61 | " | 3 | \n",
62 | " b80344d063b5ccb3212f76538f3d9e43d87dca9e | \n",
63 | " SOBFNSP12AF72A0E22 | \n",
64 | " 1 | \n",
65 | "
\n",
66 | " \n",
67 | " | 4 | \n",
68 | " b80344d063b5ccb3212f76538f3d9e43d87dca9e | \n",
69 | " SOBFOVM12A58A7D494 | \n",
70 | " 1 | \n",
71 | "
\n",
72 | " \n",
73 | "
\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 | " Rent | \n",
66 | " city_NYC | \n",
67 | " city_SF | \n",
68 | " city_Seattle | \n",
69 | "
\n",
70 | " \n",
71 | " \n",
72 | " \n",
73 | " | 0 | \n",
74 | " 3999 | \n",
75 | " 0 | \n",
76 | " 1 | \n",
77 | " 0 | \n",
78 | "
\n",
79 | " \n",
80 | " | 1 | \n",
81 | " 4000 | \n",
82 | " 0 | \n",
83 | " 1 | \n",
84 | " 0 | \n",
85 | "
\n",
86 | " \n",
87 | " | 2 | \n",
88 | " 4001 | \n",
89 | " 0 | \n",
90 | " 1 | \n",
91 | " 0 | \n",
92 | "
\n",
93 | " \n",
94 | " | 3 | \n",
95 | " 3499 | \n",
96 | " 1 | \n",
97 | " 0 | \n",
98 | " 0 | \n",
99 | "
\n",
100 | " \n",
101 | " | 4 | \n",
102 | " 3500 | \n",
103 | " 1 | \n",
104 | " 0 | \n",
105 | " 0 | \n",
106 | "
\n",
107 | " \n",
108 | " | 5 | \n",
109 | " 3501 | \n",
110 | " 1 | \n",
111 | " 0 | \n",
112 | " 0 | \n",
113 | "
\n",
114 | " \n",
115 | " | 6 | \n",
116 | " 2499 | \n",
117 | " 0 | \n",
118 | " 0 | \n",
119 | " 1 | \n",
120 | "
\n",
121 | " \n",
122 | " | 7 | \n",
123 | " 2500 | \n",
124 | " 0 | \n",
125 | " 0 | \n",
126 | " 1 | \n",
127 | "
\n",
128 | " \n",
129 | " | 8 | \n",
130 | " 2501 | \n",
131 | " 0 | \n",
132 | " 0 | \n",
133 | " 1 | \n",
134 | "
\n",
135 | " \n",
136 | "
\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 | " Rent | \n",
235 | " city_SF | \n",
236 | " city_Seattle | \n",
237 | "
\n",
238 | " \n",
239 | " \n",
240 | " \n",
241 | " | 0 | \n",
242 | " 3999 | \n",
243 | " 1 | \n",
244 | " 0 | \n",
245 | "
\n",
246 | " \n",
247 | " | 1 | \n",
248 | " 4000 | \n",
249 | " 1 | \n",
250 | " 0 | \n",
251 | "
\n",
252 | " \n",
253 | " | 2 | \n",
254 | " 4001 | \n",
255 | " 1 | \n",
256 | " 0 | \n",
257 | "
\n",
258 | " \n",
259 | " | 3 | \n",
260 | " 3499 | \n",
261 | " 0 | \n",
262 | " 0 | \n",
263 | "
\n",
264 | " \n",
265 | " | 4 | \n",
266 | " 3500 | \n",
267 | " 0 | \n",
268 | " 0 | \n",
269 | "
\n",
270 | " \n",
271 | " | 5 | \n",
272 | " 3501 | \n",
273 | " 0 | \n",
274 | " 0 | \n",
275 | "
\n",
276 | " \n",
277 | " | 6 | \n",
278 | " 2499 | \n",
279 | " 0 | \n",
280 | " 1 | \n",
281 | "
\n",
282 | " \n",
283 | " | 7 | \n",
284 | " 2500 | \n",
285 | " 0 | \n",
286 | " 1 | \n",
287 | "
\n",
288 | " \n",
289 | " | 8 | \n",
290 | " 2501 | \n",
291 | " 0 | \n",
292 | " 1 | \n",
293 | "
\n",
294 | " \n",
295 | "
\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 | " Rent | \n",
397 | " city_SF | \n",
398 | " city_Seattle | \n",
399 | "
\n",
400 | " \n",
401 | " \n",
402 | " \n",
403 | " | 0 | \n",
404 | " 3999 | \n",
405 | " 1.0 | \n",
406 | " 0.0 | \n",
407 | "
\n",
408 | " \n",
409 | " | 1 | \n",
410 | " 4000 | \n",
411 | " 1.0 | \n",
412 | " 0.0 | \n",
413 | "
\n",
414 | " \n",
415 | " | 2 | \n",
416 | " 4001 | \n",
417 | " 1.0 | \n",
418 | " 0.0 | \n",
419 | "
\n",
420 | " \n",
421 | " | 3 | \n",
422 | " 3499 | \n",
423 | " -1.0 | \n",
424 | " -1.0 | \n",
425 | "
\n",
426 | " \n",
427 | " | 4 | \n",
428 | " 3500 | \n",
429 | " -1.0 | \n",
430 | " -1.0 | \n",
431 | "
\n",
432 | " \n",
433 | " | 5 | \n",
434 | " 3501 | \n",
435 | " -1.0 | \n",
436 | " -1.0 | \n",
437 | "
\n",
438 | " \n",
439 | " | 6 | \n",
440 | " 2499 | \n",
441 | " 0.0 | \n",
442 | " 1.0 | \n",
443 | "
\n",
444 | " \n",
445 | " | 7 | \n",
446 | " 2500 | \n",
447 | " 0.0 | \n",
448 | " 1.0 | \n",
449 | "
\n",
450 | " \n",
451 | " | 8 | \n",
452 | " 2501 | \n",
453 | " 0.0 | \n",
454 | " 1.0 | \n",
455 | "
\n",
456 | " \n",
457 | "
\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 | " b | \n",
30 | " a | \n",
31 | " b | \n",
32 | "
\n",
33 | " \n",
34 | " \n",
35 | " \n",
36 | " | 10 | \n",
37 | " 1 | \n",
38 | " 2 | \n",
39 | " 3 | \n",
40 | "
\n",
41 | " \n",
42 | " | 11 | \n",
43 | " 4 | \n",
44 | " 5 | \n",
45 | " 6 | \n",
46 | "
\n",
47 | " \n",
48 | " | 11 | \n",
49 | " 7 | \n",
50 | " 8 | \n",
51 | " 9 | \n",
52 | "
\n",
53 | " \n",
54 | "
\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 | " b | \n",
134 | " a | \n",
135 | " b | \n",
136 | "
\n",
137 | " \n",
138 | " \n",
139 | " \n",
140 | " | 10 | \n",
141 | " 1 | \n",
142 | " 2 | \n",
143 | " 3 | \n",
144 | "
\n",
145 | " \n",
146 | "
\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 | " b | \n",
192 | " a | \n",
193 | " b | \n",
194 | "
\n",
195 | " \n",
196 | " \n",
197 | " \n",
198 | " | 11 | \n",
199 | " 4 | \n",
200 | " 5 | \n",
201 | " 6 | \n",
202 | "
\n",
203 | " \n",
204 | " | 11 | \n",
205 | " 7 | \n",
206 | " 8 | \n",
207 | " 9 | \n",
208 | "
\n",
209 | " \n",
210 | "
\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 | " a | \n",
282 | "
\n",
283 | " \n",
284 | " \n",
285 | " \n",
286 | " | 10 | \n",
287 | " 2 | \n",
288 | "
\n",
289 | " \n",
290 | " | 11 | \n",
291 | " 5 | \n",
292 | "
\n",
293 | " \n",
294 | " | 11 | \n",
295 | " 8 | \n",
296 | "
\n",
297 | " \n",
298 | "
\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 | " b | \n",
346 | " b | \n",
347 | "
\n",
348 | " \n",
349 | " \n",
350 | " \n",
351 | " | 10 | \n",
352 | " 1 | \n",
353 | " 3 | \n",
354 | "
\n",
355 | " \n",
356 | " | 11 | \n",
357 | " 4 | \n",
358 | " 6 | \n",
359 | "
\n",
360 | " \n",
361 | " | 11 | \n",
362 | " 7 | \n",
363 | " 9 | \n",
364 | "
\n",
365 | " \n",
366 | "
\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 | " b | \n",
480 | " a | \n",
481 | " b | \n",
482 | "
\n",
483 | " \n",
484 | " \n",
485 | " \n",
486 | " | 10 | \n",
487 | " 1 | \n",
488 | " 2 | \n",
489 | " 3 | \n",
490 | "
\n",
491 | " \n",
492 | "
\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 | " b | \n",
560 | "
\n",
561 | " \n",
562 | " \n",
563 | " \n",
564 | " | 10 | \n",
565 | " 1 | \n",
566 | "
\n",
567 | " \n",
568 | " | 11 | \n",
569 | " 4 | \n",
570 | "
\n",
571 | " \n",
572 | " | 11 | \n",
573 | " 7 | \n",
574 | "
\n",
575 | " \n",
576 | "
\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 | " clicks | \n",
83 | " no_clicks | \n",
84 | " total_clicks | \n",
85 | " N+ | \n",
86 | " N- | \n",
87 | " log_N+ | \n",
88 | "
\n",
89 | " \n",
90 | " \n",
91 | " \n",
92 | " | a99f214a | \n",
93 | " 1279 | \n",
94 | " 5878 | \n",
95 | " 7157 | \n",
96 | " 0.178706 | \n",
97 | " 0.821294 | \n",
98 | " 0.217591 | \n",
99 | "
\n",
100 | " \n",
101 | " | c357dbff | \n",
102 | " 2 | \n",
103 | " 12 | \n",
104 | " 14 | \n",
105 | " 0.142857 | \n",
106 | " 0.857143 | \n",
107 | " 0.166667 | \n",
108 | "
\n",
109 | " \n",
110 | " | 25635c83 | \n",
111 | " 2 | \n",
112 | " 0 | \n",
113 | " 2 | \n",
114 | " 1.000000 | \n",
115 | " 0.000000 | \n",
116 | " inf | \n",
117 | "
\n",
118 | " \n",
119 | " | e62f1261 | \n",
120 | " 2 | \n",
121 | " 1 | \n",
122 | " 3 | \n",
123 | " 0.666667 | \n",
124 | " 0.333333 | \n",
125 | " 2.000000 | \n",
126 | "
\n",
127 | " \n",
128 | " | 135f7d9a | \n",
129 | " 2 | \n",
130 | " 0 | \n",
131 | " 2 | \n",
132 | " 1.000000 | \n",
133 | " 0.000000 | \n",
134 | " inf | \n",
135 | "
\n",
136 | " \n",
137 | " | 9af87478 | \n",
138 | " 2 | \n",
139 | " 0 | \n",
140 | " 2 | \n",
141 | " 1.000000 | \n",
142 | " 0.000000 | \n",
143 | " inf | \n",
144 | "
\n",
145 | " \n",
146 | " | 77cf1a27 | \n",
147 | " 1 | \n",
148 | " 0 | \n",
149 | " 1 | \n",
150 | " 1.000000 | \n",
151 | " 0.000000 | \n",
152 | " inf | \n",
153 | "
\n",
154 | " \n",
155 | " | d62216cc | \n",
156 | " 1 | \n",
157 | " 0 | \n",
158 | " 1 | \n",
159 | " 1.000000 | \n",
160 | " 0.000000 | \n",
161 | " inf | \n",
162 | "
\n",
163 | " \n",
164 | " | fcc5c7c0 | \n",
165 | " 1 | \n",
166 | " 0 | \n",
167 | " 1 | \n",
168 | " 1.000000 | \n",
169 | " 0.000000 | \n",
170 | " inf | \n",
171 | "
\n",
172 | " \n",
173 | " | 7181509e | \n",
174 | " 1 | \n",
175 | " 0 | \n",
176 | " 1 | \n",
177 | " 1.000000 | \n",
178 | " 0.000000 | \n",
179 | " inf | \n",
180 | "
\n",
181 | " \n",
182 | " | 2a32a3ca | \n",
183 | " 1 | \n",
184 | " 0 | \n",
185 | " 1 | \n",
186 | " 1.000000 | \n",
187 | " 0.000000 | \n",
188 | " inf | \n",
189 | "
\n",
190 | " \n",
191 | " | 2ad16ba3 | \n",
192 | " 1 | \n",
193 | " 0 | \n",
194 | " 1 | \n",
195 | " 1.000000 | \n",
196 | " 0.000000 | \n",
197 | " inf | \n",
198 | "
\n",
199 | " \n",
200 | " | 938f494b | \n",
201 | " 1 | \n",
202 | " 0 | \n",
203 | " 1 | \n",
204 | " 1.000000 | \n",
205 | " 0.000000 | \n",
206 | " inf | \n",
207 | "
\n",
208 | " \n",
209 | " | 24dbae83 | \n",
210 | " 1 | \n",
211 | " 0 | \n",
212 | " 1 | \n",
213 | " 1.000000 | \n",
214 | " 0.000000 | \n",
215 | " inf | \n",
216 | "
\n",
217 | " \n",
218 | " | ca9b95aa | \n",
219 | " 1 | \n",
220 | " 0 | \n",
221 | " 1 | \n",
222 | " 1.000000 | \n",
223 | " 0.000000 | \n",
224 | " inf | \n",
225 | "
\n",
226 | " \n",
227 | " | 7c369899 | \n",
228 | " 1 | \n",
229 | " 0 | \n",
230 | " 1 | \n",
231 | " 1.000000 | \n",
232 | " 0.000000 | \n",
233 | " inf | \n",
234 | "
\n",
235 | " \n",
236 | " | 3bf8c26c | \n",
237 | " 1 | \n",
238 | " 0 | \n",
239 | " 1 | \n",
240 | " 1.000000 | \n",
241 | " 0.000000 | \n",
242 | " inf | \n",
243 | "
\n",
244 | " \n",
245 | " | 45378128 | \n",
246 | " 1 | \n",
247 | " 0 | \n",
248 | " 1 | \n",
249 | " 1.000000 | \n",
250 | " 0.000000 | \n",
251 | " inf | \n",
252 | "
\n",
253 | " \n",
254 | " | 023ca1f9 | \n",
255 | " 1 | \n",
256 | " 0 | \n",
257 | " 1 | \n",
258 | " 1.000000 | \n",
259 | " 0.000000 | \n",
260 | " inf | \n",
261 | "
\n",
262 | " \n",
263 | " | 3b9ab74d | \n",
264 | " 1 | \n",
265 | " 0 | \n",
266 | " 1 | \n",
267 | " 1.000000 | \n",
268 | " 0.000000 | \n",
269 | " inf | \n",
270 | "
\n",
271 | " \n",
272 | " | 9eb9a972 | \n",
273 | " 1 | \n",
274 | " 0 | \n",
275 | " 1 | \n",
276 | " 1.000000 | \n",
277 | " 0.000000 | \n",
278 | " inf | \n",
279 | "
\n",
280 | " \n",
281 | " | 59bcd1ae | \n",
282 | " 1 | \n",
283 | " 0 | \n",
284 | " 1 | \n",
285 | " 1.000000 | \n",
286 | " 0.000000 | \n",
287 | " inf | \n",
288 | "
\n",
289 | " \n",
290 | " | 7f8c00b4 | \n",
291 | " 1 | \n",
292 | " 0 | \n",
293 | " 1 | \n",
294 | " 1.000000 | \n",
295 | " 0.000000 | \n",
296 | " inf | \n",
297 | "
\n",
298 | " \n",
299 | " | 8d61d7eb | \n",
300 | " 1 | \n",
301 | " 0 | \n",
302 | " 1 | \n",
303 | " 1.000000 | \n",
304 | " 0.000000 | \n",
305 | " inf | \n",
306 | "
\n",
307 | " \n",
308 | " | b441c41f | \n",
309 | " 1 | \n",
310 | " 0 | \n",
311 | " 1 | \n",
312 | " 1.000000 | \n",
313 | " 0.000000 | \n",
314 | " inf | \n",
315 | "
\n",
316 | " \n",
317 | " | e317838f | \n",
318 | " 1 | \n",
319 | " 0 | \n",
320 | " 1 | \n",
321 | " 1.000000 | \n",
322 | " 0.000000 | \n",
323 | " inf | \n",
324 | "
\n",
325 | " \n",
326 | " | 2e7d4b65 | \n",
327 | " 1 | \n",
328 | " 0 | \n",
329 | " 1 | \n",
330 | " 1.000000 | \n",
331 | " 0.000000 | \n",
332 | " inf | \n",
333 | "
\n",
334 | " \n",
335 | " | 70d97ece | \n",
336 | " 1 | \n",
337 | " 0 | \n",
338 | " 1 | \n",
339 | " 1.000000 | \n",
340 | " 0.000000 | \n",
341 | " inf | \n",
342 | "
\n",
343 | " \n",
344 | " | 9809e6c9 | \n",
345 | " 1 | \n",
346 | " 0 | \n",
347 | " 1 | \n",
348 | " 1.000000 | \n",
349 | " 0.000000 | \n",
350 | " inf | \n",
351 | "
\n",
352 | " \n",
353 | " | cb73ba55 | \n",
354 | " 1 | \n",
355 | " 0 | \n",
356 | " 1 | \n",
357 | " 1.000000 | \n",
358 | " 0.000000 | \n",
359 | " inf | \n",
360 | "
\n",
361 | " \n",
362 | " | ... | \n",
363 | " ... | \n",
364 | " ... | \n",
365 | " ... | \n",
366 | " ... | \n",
367 | " ... | \n",
368 | " ... | \n",
369 | "
\n",
370 | " \n",
371 | " | 0c3bbac0 | \n",
372 | " 0 | \n",
373 | " 1 | \n",
374 | " 1 | \n",
375 | " 0.000000 | \n",
376 | " 1.000000 | \n",
377 | " 0.000000 | \n",
378 | "
\n",
379 | " \n",
380 | " | 34c9f908 | \n",
381 | " 0 | \n",
382 | " 1 | \n",
383 | " 1 | \n",
384 | " 0.000000 | \n",
385 | " 1.000000 | \n",
386 | " 0.000000 | \n",
387 | "
\n",
388 | " \n",
389 | " | 41a1ae5f | \n",
390 | " 0 | \n",
391 | " 1 | \n",
392 | " 1 | \n",
393 | " 0.000000 | \n",
394 | " 1.000000 | \n",
395 | " 0.000000 | \n",
396 | "
\n",
397 | " \n",
398 | " | 5d03585e | \n",
399 | " 0 | \n",
400 | " 1 | \n",
401 | " 1 | \n",
402 | " 0.000000 | \n",
403 | " 1.000000 | \n",
404 | " 0.000000 | \n",
405 | "
\n",
406 | " \n",
407 | " | 7d242dfd | \n",
408 | " 0 | \n",
409 | " 1 | \n",
410 | " 1 | \n",
411 | " 0.000000 | \n",
412 | " 1.000000 | \n",
413 | " 0.000000 | \n",
414 | "
\n",
415 | " \n",
416 | " | 9ffa0563 | \n",
417 | " 0 | \n",
418 | " 1 | \n",
419 | " 1 | \n",
420 | " 0.000000 | \n",
421 | " 1.000000 | \n",
422 | " 0.000000 | \n",
423 | "
\n",
424 | " \n",
425 | " | 2fd58990 | \n",
426 | " 0 | \n",
427 | " 1 | \n",
428 | " 1 | \n",
429 | " 0.000000 | \n",
430 | " 1.000000 | \n",
431 | " 0.000000 | \n",
432 | "
\n",
433 | " \n",
434 | " | 01e47a3d | \n",
435 | " 0 | \n",
436 | " 1 | \n",
437 | " 1 | \n",
438 | " 0.000000 | \n",
439 | " 1.000000 | \n",
440 | " 0.000000 | \n",
441 | "
\n",
442 | " \n",
443 | " | bcd5195e | \n",
444 | " 0 | \n",
445 | " 1 | \n",
446 | " 1 | \n",
447 | " 0.000000 | \n",
448 | " 1.000000 | \n",
449 | " 0.000000 | \n",
450 | "
\n",
451 | " \n",
452 | " | a318236b | \n",
453 | " 0 | \n",
454 | " 1 | \n",
455 | " 1 | \n",
456 | " 0.000000 | \n",
457 | " 1.000000 | \n",
458 | " 0.000000 | \n",
459 | "
\n",
460 | " \n",
461 | " | 1168ce02 | \n",
462 | " 0 | \n",
463 | " 1 | \n",
464 | " 1 | \n",
465 | " 0.000000 | \n",
466 | " 1.000000 | \n",
467 | " 0.000000 | \n",
468 | "
\n",
469 | " \n",
470 | " | 83c34e93 | \n",
471 | " 0 | \n",
472 | " 1 | \n",
473 | " 1 | \n",
474 | " 0.000000 | \n",
475 | " 1.000000 | \n",
476 | " 0.000000 | \n",
477 | "
\n",
478 | " \n",
479 | " | c8c31032 | \n",
480 | " 0 | \n",
481 | " 1 | \n",
482 | " 1 | \n",
483 | " 0.000000 | \n",
484 | " 1.000000 | \n",
485 | " 0.000000 | \n",
486 | "
\n",
487 | " \n",
488 | " | 004270bf | \n",
489 | " 0 | \n",
490 | " 1 | \n",
491 | " 1 | \n",
492 | " 0.000000 | \n",
493 | " 1.000000 | \n",
494 | " 0.000000 | \n",
495 | "
\n",
496 | " \n",
497 | " | e6d0facc | \n",
498 | " 0 | \n",
499 | " 1 | \n",
500 | " 1 | \n",
501 | " 0.000000 | \n",
502 | " 1.000000 | \n",
503 | " 0.000000 | \n",
504 | "
\n",
505 | " \n",
506 | " | 844524dc | \n",
507 | " 0 | \n",
508 | " 1 | \n",
509 | " 1 | \n",
510 | " 0.000000 | \n",
511 | " 1.000000 | \n",
512 | " 0.000000 | \n",
513 | "
\n",
514 | " \n",
515 | " | c90a30a1 | \n",
516 | " 0 | \n",
517 | " 1 | \n",
518 | " 1 | \n",
519 | " 0.000000 | \n",
520 | " 1.000000 | \n",
521 | " 0.000000 | \n",
522 | "
\n",
523 | " \n",
524 | " | 5015495b | \n",
525 | " 0 | \n",
526 | " 1 | \n",
527 | " 1 | \n",
528 | " 0.000000 | \n",
529 | " 1.000000 | \n",
530 | " 0.000000 | \n",
531 | "
\n",
532 | " \n",
533 | " | a12e8a45 | \n",
534 | " 0 | \n",
535 | " 1 | \n",
536 | " 1 | \n",
537 | " 0.000000 | \n",
538 | " 1.000000 | \n",
539 | " 0.000000 | \n",
540 | "
\n",
541 | " \n",
542 | " | 7b5c2c3b | \n",
543 | " 0 | \n",
544 | " 1 | \n",
545 | " 1 | \n",
546 | " 0.000000 | \n",
547 | " 1.000000 | \n",
548 | " 0.000000 | \n",
549 | "
\n",
550 | " \n",
551 | " | 4a6b5af3 | \n",
552 | " 0 | \n",
553 | " 1 | \n",
554 | " 1 | \n",
555 | " 0.000000 | \n",
556 | " 1.000000 | \n",
557 | " 0.000000 | \n",
558 | "
\n",
559 | " \n",
560 | " | 2c8ae68c | \n",
561 | " 0 | \n",
562 | " 1 | \n",
563 | " 1 | \n",
564 | " 0.000000 | \n",
565 | " 1.000000 | \n",
566 | " 0.000000 | \n",
567 | "
\n",
568 | " \n",
569 | " | 84565c92 | \n",
570 | " 0 | \n",
571 | " 1 | \n",
572 | " 1 | \n",
573 | " 0.000000 | \n",
574 | " 1.000000 | \n",
575 | " 0.000000 | \n",
576 | "
\n",
577 | " \n",
578 | " | 2a6fe2a5 | \n",
579 | " 0 | \n",
580 | " 1 | \n",
581 | " 1 | \n",
582 | " 0.000000 | \n",
583 | " 1.000000 | \n",
584 | " 0.000000 | \n",
585 | "
\n",
586 | " \n",
587 | " | e0f70006 | \n",
588 | " 0 | \n",
589 | " 1 | \n",
590 | " 1 | \n",
591 | " 0.000000 | \n",
592 | " 1.000000 | \n",
593 | " 0.000000 | \n",
594 | "
\n",
595 | " \n",
596 | " | cef4c8cc | \n",
597 | " 0 | \n",
598 | " 1 | \n",
599 | " 1 | \n",
600 | " 0.000000 | \n",
601 | " 1.000000 | \n",
602 | " 0.000000 | \n",
603 | "
\n",
604 | " \n",
605 | " | 7f4b1f1e | \n",
606 | " 0 | \n",
607 | " 1 | \n",
608 | " 1 | \n",
609 | " 0.000000 | \n",
610 | " 1.000000 | \n",
611 | " 0.000000 | \n",
612 | "
\n",
613 | " \n",
614 | " | 7efe14f0 | \n",
615 | " 0 | \n",
616 | " 1 | \n",
617 | " 1 | \n",
618 | " 0.000000 | \n",
619 | " 1.000000 | \n",
620 | " 0.000000 | \n",
621 | "
\n",
622 | " \n",
623 | " | 02b99e77 | \n",
624 | " 0 | \n",
625 | " 1 | \n",
626 | " 1 | \n",
627 | " 0.000000 | \n",
628 | " 1.000000 | \n",
629 | " 0.000000 | \n",
630 | "
\n",
631 | " \n",
632 | " | cbb50c1c | \n",
633 | " 0 | \n",
634 | " 1 | \n",
635 | " 1 | \n",
636 | " 0.000000 | \n",
637 | " 1.000000 | \n",
638 | " 0.000000 | \n",
639 | "
\n",
640 | " \n",
641 | "
\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+ | \n",
769 | " N- | \n",
770 | " log_N+ | \n",
771 | "
\n",
772 | " \n",
773 | " \n",
774 | " \n",
775 | " | a99f214a | \n",
776 | " 0.178706 | \n",
777 | " 0.821294 | \n",
778 | " 0.217591 | \n",
779 | "
\n",
780 | " \n",
781 | " | c357dbff | \n",
782 | " 0.142857 | \n",
783 | " 0.857143 | \n",
784 | " 0.166667 | \n",
785 | "
\n",
786 | " \n",
787 | " | 25635c83 | \n",
788 | " 1.000000 | \n",
789 | " 0.000000 | \n",
790 | " inf | \n",
791 | "
\n",
792 | " \n",
793 | " | e62f1261 | \n",
794 | " 0.666667 | \n",
795 | " 0.333333 | \n",
796 | " 2.000000 | \n",
797 | "
\n",
798 | " \n",
799 | " | 135f7d9a | \n",
800 | " 1.000000 | \n",
801 | " 0.000000 | \n",
802 | " inf | \n",
803 | "
\n",
804 | " \n",
805 | " | 9af87478 | \n",
806 | " 1.000000 | \n",
807 | " 0.000000 | \n",
808 | " inf | \n",
809 | "
\n",
810 | " \n",
811 | " | 77cf1a27 | \n",
812 | " 1.000000 | \n",
813 | " 0.000000 | \n",
814 | " inf | \n",
815 | "
\n",
816 | " \n",
817 | " | d62216cc | \n",
818 | " 1.000000 | \n",
819 | " 0.000000 | \n",
820 | " inf | \n",
821 | "
\n",
822 | " \n",
823 | " | fcc5c7c0 | \n",
824 | " 1.000000 | \n",
825 | " 0.000000 | \n",
826 | " inf | \n",
827 | "
\n",
828 | " \n",
829 | " | 7181509e | \n",
830 | " 1.000000 | \n",
831 | " 0.000000 | \n",
832 | " inf | \n",
833 | "
\n",
834 | " \n",
835 | " | 2a32a3ca | \n",
836 | " 1.000000 | \n",
837 | " 0.000000 | \n",
838 | " inf | \n",
839 | "
\n",
840 | " \n",
841 | " | 2ad16ba3 | \n",
842 | " 1.000000 | \n",
843 | " 0.000000 | \n",
844 | " inf | \n",
845 | "
\n",
846 | " \n",
847 | " | 938f494b | \n",
848 | " 1.000000 | \n",
849 | " 0.000000 | \n",
850 | " inf | \n",
851 | "
\n",
852 | " \n",
853 | " | 24dbae83 | \n",
854 | " 1.000000 | \n",
855 | " 0.000000 | \n",
856 | " inf | \n",
857 | "
\n",
858 | " \n",
859 | " | ca9b95aa | \n",
860 | " 1.000000 | \n",
861 | " 0.000000 | \n",
862 | " inf | \n",
863 | "
\n",
864 | " \n",
865 | " | 7c369899 | \n",
866 | " 1.000000 | \n",
867 | " 0.000000 | \n",
868 | " inf | \n",
869 | "
\n",
870 | " \n",
871 | " | 3bf8c26c | \n",
872 | " 1.000000 | \n",
873 | " 0.000000 | \n",
874 | " inf | \n",
875 | "
\n",
876 | " \n",
877 | " | 45378128 | \n",
878 | " 1.000000 | \n",
879 | " 0.000000 | \n",
880 | " inf | \n",
881 | "
\n",
882 | " \n",
883 | " | 023ca1f9 | \n",
884 | " 1.000000 | \n",
885 | " 0.000000 | \n",
886 | " inf | \n",
887 | "
\n",
888 | " \n",
889 | " | 3b9ab74d | \n",
890 | " 1.000000 | \n",
891 | " 0.000000 | \n",
892 | " inf | \n",
893 | "
\n",
894 | " \n",
895 | " | 9eb9a972 | \n",
896 | " 1.000000 | \n",
897 | " 0.000000 | \n",
898 | " inf | \n",
899 | "
\n",
900 | " \n",
901 | " | 59bcd1ae | \n",
902 | " 1.000000 | \n",
903 | " 0.000000 | \n",
904 | " inf | \n",
905 | "
\n",
906 | " \n",
907 | " | 7f8c00b4 | \n",
908 | " 1.000000 | \n",
909 | " 0.000000 | \n",
910 | " inf | \n",
911 | "
\n",
912 | " \n",
913 | " | 8d61d7eb | \n",
914 | " 1.000000 | \n",
915 | " 0.000000 | \n",
916 | " inf | \n",
917 | "
\n",
918 | " \n",
919 | " | b441c41f | \n",
920 | " 1.000000 | \n",
921 | " 0.000000 | \n",
922 | " inf | \n",
923 | "
\n",
924 | " \n",
925 | " | e317838f | \n",
926 | " 1.000000 | \n",
927 | " 0.000000 | \n",
928 | " inf | \n",
929 | "
\n",
930 | " \n",
931 | " | 2e7d4b65 | \n",
932 | " 1.000000 | \n",
933 | " 0.000000 | \n",
934 | " inf | \n",
935 | "
\n",
936 | " \n",
937 | " | 70d97ece | \n",
938 | " 1.000000 | \n",
939 | " 0.000000 | \n",
940 | " inf | \n",
941 | "
\n",
942 | " \n",
943 | " | 9809e6c9 | \n",
944 | " 1.000000 | \n",
945 | " 0.000000 | \n",
946 | " inf | \n",
947 | "
\n",
948 | " \n",
949 | " | cb73ba55 | \n",
950 | " 1.000000 | \n",
951 | " 0.000000 | \n",
952 | " inf | \n",
953 | "
\n",
954 | " \n",
955 | " | ... | \n",
956 | " ... | \n",
957 | " ... | \n",
958 | " ... | \n",
959 | "
\n",
960 | " \n",
961 | " | 0c3bbac0 | \n",
962 | " 0.000000 | \n",
963 | " 1.000000 | \n",
964 | " 0.000000 | \n",
965 | "
\n",
966 | " \n",
967 | " | 34c9f908 | \n",
968 | " 0.000000 | \n",
969 | " 1.000000 | \n",
970 | " 0.000000 | \n",
971 | "
\n",
972 | " \n",
973 | " | 41a1ae5f | \n",
974 | " 0.000000 | \n",
975 | " 1.000000 | \n",
976 | " 0.000000 | \n",
977 | "
\n",
978 | " \n",
979 | " | 5d03585e | \n",
980 | " 0.000000 | \n",
981 | " 1.000000 | \n",
982 | " 0.000000 | \n",
983 | "
\n",
984 | " \n",
985 | " | 7d242dfd | \n",
986 | " 0.000000 | \n",
987 | " 1.000000 | \n",
988 | " 0.000000 | \n",
989 | "
\n",
990 | " \n",
991 | " | 9ffa0563 | \n",
992 | " 0.000000 | \n",
993 | " 1.000000 | \n",
994 | " 0.000000 | \n",
995 | "
\n",
996 | " \n",
997 | " | 2fd58990 | \n",
998 | " 0.000000 | \n",
999 | " 1.000000 | \n",
1000 | " 0.000000 | \n",
1001 | "
\n",
1002 | " \n",
1003 | " | 01e47a3d | \n",
1004 | " 0.000000 | \n",
1005 | " 1.000000 | \n",
1006 | " 0.000000 | \n",
1007 | "
\n",
1008 | " \n",
1009 | " | bcd5195e | \n",
1010 | " 0.000000 | \n",
1011 | " 1.000000 | \n",
1012 | " 0.000000 | \n",
1013 | "
\n",
1014 | " \n",
1015 | " | a318236b | \n",
1016 | " 0.000000 | \n",
1017 | " 1.000000 | \n",
1018 | " 0.000000 | \n",
1019 | "
\n",
1020 | " \n",
1021 | " | 1168ce02 | \n",
1022 | " 0.000000 | \n",
1023 | " 1.000000 | \n",
1024 | " 0.000000 | \n",
1025 | "
\n",
1026 | " \n",
1027 | " | 83c34e93 | \n",
1028 | " 0.000000 | \n",
1029 | " 1.000000 | \n",
1030 | " 0.000000 | \n",
1031 | "
\n",
1032 | " \n",
1033 | " | c8c31032 | \n",
1034 | " 0.000000 | \n",
1035 | " 1.000000 | \n",
1036 | " 0.000000 | \n",
1037 | "
\n",
1038 | " \n",
1039 | " | 004270bf | \n",
1040 | " 0.000000 | \n",
1041 | " 1.000000 | \n",
1042 | " 0.000000 | \n",
1043 | "
\n",
1044 | " \n",
1045 | " | e6d0facc | \n",
1046 | " 0.000000 | \n",
1047 | " 1.000000 | \n",
1048 | " 0.000000 | \n",
1049 | "
\n",
1050 | " \n",
1051 | " | 844524dc | \n",
1052 | " 0.000000 | \n",
1053 | " 1.000000 | \n",
1054 | " 0.000000 | \n",
1055 | "
\n",
1056 | " \n",
1057 | " | c90a30a1 | \n",
1058 | " 0.000000 | \n",
1059 | " 1.000000 | \n",
1060 | " 0.000000 | \n",
1061 | "
\n",
1062 | " \n",
1063 | " | 5015495b | \n",
1064 | " 0.000000 | \n",
1065 | " 1.000000 | \n",
1066 | " 0.000000 | \n",
1067 | "
\n",
1068 | " \n",
1069 | " | a12e8a45 | \n",
1070 | " 0.000000 | \n",
1071 | " 1.000000 | \n",
1072 | " 0.000000 | \n",
1073 | "
\n",
1074 | " \n",
1075 | " | 7b5c2c3b | \n",
1076 | " 0.000000 | \n",
1077 | " 1.000000 | \n",
1078 | " 0.000000 | \n",
1079 | "
\n",
1080 | " \n",
1081 | " | 4a6b5af3 | \n",
1082 | " 0.000000 | \n",
1083 | " 1.000000 | \n",
1084 | " 0.000000 | \n",
1085 | "
\n",
1086 | " \n",
1087 | " | 2c8ae68c | \n",
1088 | " 0.000000 | \n",
1089 | " 1.000000 | \n",
1090 | " 0.000000 | \n",
1091 | "
\n",
1092 | " \n",
1093 | " | 84565c92 | \n",
1094 | " 0.000000 | \n",
1095 | " 1.000000 | \n",
1096 | " 0.000000 | \n",
1097 | "
\n",
1098 | " \n",
1099 | " | 2a6fe2a5 | \n",
1100 | " 0.000000 | \n",
1101 | " 1.000000 | \n",
1102 | " 0.000000 | \n",
1103 | "
\n",
1104 | " \n",
1105 | " | e0f70006 | \n",
1106 | " 0.000000 | \n",
1107 | " 1.000000 | \n",
1108 | " 0.000000 | \n",
1109 | "
\n",
1110 | " \n",
1111 | " | cef4c8cc | \n",
1112 | " 0.000000 | \n",
1113 | " 1.000000 | \n",
1114 | " 0.000000 | \n",
1115 | "
\n",
1116 | " \n",
1117 | " | 7f4b1f1e | \n",
1118 | " 0.000000 | \n",
1119 | " 1.000000 | \n",
1120 | " 0.000000 | \n",
1121 | "
\n",
1122 | " \n",
1123 | " | 7efe14f0 | \n",
1124 | " 0.000000 | \n",
1125 | " 1.000000 | \n",
1126 | " 0.000000 | \n",
1127 | "
\n",
1128 | " \n",
1129 | " | 02b99e77 | \n",
1130 | " 0.000000 | \n",
1131 | " 1.000000 | \n",
1132 | " 0.000000 | \n",
1133 | "
\n",
1134 | " \n",
1135 | " | cbb50c1c | \n",
1136 | " 0.000000 | \n",
1137 | " 1.000000 | \n",
1138 | " 0.000000 | \n",
1139 | "
\n",
1140 | " \n",
1141 | "
\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 | " clicks | \n",
1268 | " no_clicks | \n",
1269 | " total_clicks | \n",
1270 | " N+ | \n",
1271 | " N- | \n",
1272 | " log_N+ | \n",
1273 | "
\n",
1274 | " \n",
1275 | " \n",
1276 | " \n",
1277 | " | a99f214a | \n",
1278 | " 1279 | \n",
1279 | " 5878 | \n",
1280 | " 7157 | \n",
1281 | " 0.178706 | \n",
1282 | " 0.821294 | \n",
1283 | " 0.217591 | \n",
1284 | "
\n",
1285 | " \n",
1286 | " | c357dbff | \n",
1287 | " 2 | \n",
1288 | " 12 | \n",
1289 | " 14 | \n",
1290 | " 0.142857 | \n",
1291 | " 0.857143 | \n",
1292 | " 0.166667 | \n",
1293 | "
\n",
1294 | " \n",
1295 | " | a167aa83 | \n",
1296 | " 0 | \n",
1297 | " 7 | \n",
1298 | " 7 | \n",
1299 | " 0.000000 | \n",
1300 | " 1.000000 | \n",
1301 | " 0.000000 | \n",
1302 | "
\n",
1303 | " \n",
1304 | " | d2bbb640 | \n",
1305 | " 0 | \n",
1306 | " 6 | \n",
1307 | " 6 | \n",
1308 | " 0.000000 | \n",
1309 | " 1.000000 | \n",
1310 | " 0.000000 | \n",
1311 | "
\n",
1312 | " \n",
1313 | "
\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 | " business_id | \n",
37 | " categories | \n",
38 | " city | \n",
39 | " full_address | \n",
40 | " latitude | \n",
41 | " longitude | \n",
42 | " name | \n",
43 | " neighborhoods | \n",
44 | " open | \n",
45 | " review_count | \n",
46 | " stars | \n",
47 | " state | \n",
48 | " type | \n",
49 | "
\n",
50 | " \n",
51 | " \n",
52 | " \n",
53 | " | 0 | \n",
54 | " rncjoVoEFUJGCUoC1JgnUA | \n",
55 | " [Accountants, Professional Services, Tax Servi... | \n",
56 | " Peoria | \n",
57 | " 8466 W Peoria Ave\\nSte 6\\nPeoria, AZ 85345 | \n",
58 | " 33.581867 | \n",
59 | " -112.241596 | \n",
60 | " Peoria Income Tax Service | \n",
61 | " [] | \n",
62 | " True | \n",
63 | " 3 | \n",
64 | " 5.0 | \n",
65 | " AZ | \n",
66 | " business | \n",
67 | "
\n",
68 | " \n",
69 | " | 1 | \n",
70 | " 0FNFSzCFP_rGUoJx8W7tJg | \n",
71 | " [Sporting Goods, Bikes, Shopping] | \n",
72 | " Phoenix | \n",
73 | " 2149 W Wood Dr\\nPhoenix, AZ 85029 | \n",
74 | " 33.604054 | \n",
75 | " -112.105933 | \n",
76 | " Bike Doctor | \n",
77 | " [] | \n",
78 | " True | \n",
79 | " 5 | \n",
80 | " 5.0 | \n",
81 | " AZ | \n",
82 | " business | \n",
83 | "
\n",
84 | " \n",
85 | " | 2 | \n",
86 | " 3f_lyB6vFK48ukH6ScvLHg | \n",
87 | " [] | \n",
88 | " Phoenix | \n",
89 | " 1134 N Central Ave\\nPhoenix, AZ 85004 | \n",
90 | " 33.460526 | \n",
91 | " -112.073933 | \n",
92 | " Valley Permaculture Alliance | \n",
93 | " [] | \n",
94 | " True | \n",
95 | " 4 | \n",
96 | " 5.0 | \n",
97 | " AZ | \n",
98 | " business | \n",
99 | "
\n",
100 | " \n",
101 | " | 3 | \n",
102 | " usAsSV36QmUej8--yvN-dg | \n",
103 | " [Food, Grocery] | \n",
104 | " Phoenix | \n",
105 | " 845 W Southern Ave\\nPhoenix, AZ 85041 | \n",
106 | " 33.392210 | \n",
107 | " -112.085377 | \n",
108 | " Food City | \n",
109 | " [] | \n",
110 | " True | \n",
111 | " 5 | \n",
112 | " 3.5 | \n",
113 | " AZ | \n",
114 | " business | \n",
115 | "
\n",
116 | " \n",
117 | " | 4 | \n",
118 | " PzOqRohWw7F7YEPBz6AubA | \n",
119 | " [Food, Bagels, Delis, Restaurants] | \n",
120 | " Glendale Az | \n",
121 | " 6520 W Happy Valley Rd\\nSte 101\\nGlendale Az, ... | \n",
122 | " 33.712797 | \n",
123 | " -112.200264 | \n",
124 | " Hot Bagels & Deli | \n",
125 | " [] | \n",
126 | " True | \n",
127 | " 14 | \n",
128 | " 3.5 | \n",
129 | " AZ | \n",
130 | " business | \n",
131 | "
\n",
132 | " \n",
133 | "
\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 |
--------------------------------------------------------------------------------