{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"- matplotlibやseaborn等各種ライブラリでplotする力が不足しているので30days challengeしていく  \n- EDAなどを早く出来るようになることが目標  \n- ベン図等も用意していきたい\n\n### 参考サイト\n- [早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9)\n- [Advanced exploratory data analysis (EDA)](https://miykael.github.io/blog/2022/advanced_eda/)\n\n![image.png](attachment:225f405d-86a1-486b-9168-0d0c4f2cb5a1.png)","metadata":{},"attachments":{"225f405d-86a1-486b-9168-0d0c4f2cb5a1.png":{"image/png":"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"}}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n# バージョン確認\nimport matplotlib\nprint(f\"matplotlib:{matplotlib.__version__}\")\nprint(f\"seaborn:{sns.__version__}\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-07-12T02:07:18.467047Z","iopub.execute_input":"2022-07-12T02:07:18.467893Z","iopub.status.idle":"2022-07-12T02:07:19.688127Z","shell.execute_reply.started":"2022-07-12T02:07:18.467759Z","shell.execute_reply":"2022-07-12T02:07:19.686828Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Day0\n\n- matplotlibのplot方法は大きく分けて2種類ある\n    - オブジェクト指向スタイル\n    - pyplotスタイル\n- ある程度柔軟に対応できることとpandasやseabornがそうである(らしい)ことから今回のチャレンジではオブジェクト指向スタイルをメインで勉強していく","metadata":{}},{"cell_type":"code","source":"# plot用データ\nx = np.linspace(0,5,11)\ny = x ** 2","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:19.690807Z","iopub.execute_input":"2022-07-12T02:07:19.691698Z","iopub.status.idle":"2022-07-12T02:07:19.698094Z","shell.execute_reply.started":"2022-07-12T02:07:19.691645Z","shell.execute_reply":"2022-07-12T02:07:19.696839Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### オブジェクト指向API\nfigとaxを明示的に宣言する","metadata":{}},{"cell_type":"code","source":"fig, ax = plt.subplots()\nax.plot(x,y)\nax.set_xlabel('X Label')\nax.set_ylabel('Y Label')\nax.set_title('Set Title')","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:19.700190Z","iopub.execute_input":"2022-07-12T02:07:19.701074Z","iopub.status.idle":"2022-07-12T02:07:19.964451Z","shell.execute_reply.started":"2022-07-12T02:07:19.701024Z","shell.execute_reply":"2022-07-12T02:07:19.963222Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### PyplotAPI\n- figやaxは暗黙的に宣言され基本的にplt.xxで対応していく\n- plt.show() を使えば複数の図を並べられる","metadata":{}},{"cell_type":"code","source":"plt.plot(x,y)\nplt.xlabel('X Label')\nplt.ylabel('Y Label')\nplt.title('Title')\n# plt.show() jupyter意外だと必要","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:19.967599Z","iopub.execute_input":"2022-07-12T02:07:19.968428Z","iopub.status.idle":"2022-07-12T02:07:20.171189Z","shell.execute_reply.started":"2022-07-12T02:07:19.968376Z","shell.execute_reply":"2022-07-12T02:07:20.170325Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"- PyplotAPI方式でもレイアウトを組むこともできる（あえて分割数をずらした\n- plt.show()を挟むと並べられる","metadata":{}},{"cell_type":"code","source":"plt.subplot(1,2,1)\nplt.plot(x,y,'r')\n\nplt.subplot(1,2,2)\nplt.plot(y,x, 'b')\nplt.show()\n\nplt.subplot(1,2,1)\nplt.plot(y,x,'r')\n\nplt.subplot(1,3,3)\nplt.plot(x,y, 'b')","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:20.172544Z","iopub.execute_input":"2022-07-12T02:07:20.172902Z","iopub.status.idle":"2022-07-12T02:07:20.694565Z","shell.execute_reply.started":"2022-07-12T02:07:20.172870Z","shell.execute_reply":"2022-07-12T02:07:20.693096Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### オブジェクト指向スタイルにはadd_axesという方法もある  \nadd_axesを使うと自由な場所に自由な大きさを指定してplotできる。  \n余裕があったら覚えておく...","metadata":{}},{"cell_type":"code","source":"fig = plt.figure()\naxes1 = fig.add_axes([0.1,0.1,0.8,0.8])\naxes2 = fig.add_axes([0.2,0.5,0.4,0.3])\n\naxes1.plot(x,y)\naxes1.set_title('LARGER PLOT')\naxes2.plot(y,x)\naxes2.set_title('Title')","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:20.696101Z","iopub.execute_input":"2022-07-12T02:07:20.696429Z","iopub.status.idle":"2022-07-12T02:07:20.966593Z","shell.execute_reply.started":"2022-07-12T02:07:20.696398Z","shell.execute_reply":"2022-07-12T02:07:20.965374Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"- plt.subplotsで配列型にはいったaxesを取得できるので便利\n- 数字の指定の方法は 行,列 なので覚えやすい","metadata":{}},{"cell_type":"code","source":"fig, axes = plt.subplots(nrows=1,ncols=2)\naxes[0].plot(x,y)\naxes[0].set_title('First Plot')\n\naxes[1].plot(y,x)\naxes[1].set_title('Second Plot')\n\nplt.tight_layout()","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:20.968111Z","iopub.execute_input":"2022-07-12T02:07:20.968462Z","iopub.status.idle":"2022-07-12T02:07:21.333923Z","shell.execute_reply.started":"2022-07-12T02:07:20.968431Z","shell.execute_reply":"2022-07-12T02:07:21.331600Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### plt.subplot と　plt.subplots があるから注意！！！","metadata":{}},{"cell_type":"markdown","source":"図の大きさを指定","metadata":{}},{"cell_type":"code","source":"fig, axes = plt.subplots(nrows=2,ncols=1,figsize=(8,2))\n\naxes[0].plot(x,y)\naxes[1].plot(y,x)\nplt.tight_layout()","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:21.336573Z","iopub.execute_input":"2022-07-12T02:07:21.337412Z","iopub.status.idle":"2022-07-12T02:07:21.704921Z","shell.execute_reply.started":"2022-07-12T02:07:21.337364Z","shell.execute_reply":"2022-07-12T02:07:21.703781Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Day1\n\nサンプルデータを使っていろんなグラフ","metadata":{}},{"cell_type":"code","source":"df = pd.read_csv('../input/data-science-job-salaries/ds_salaries.csv')\nprint(df.shape)\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:21.706295Z","iopub.execute_input":"2022-07-12T02:07:21.707293Z","iopub.status.idle":"2022-07-12T02:07:21.749143Z","shell.execute_reply.started":"2022-07-12T02:07:21.707258Z","shell.execute_reply":"2022-07-12T02:07:21.747670Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 棒グラフ\nカテゴリ変数を棒グラフで眺める\n\npandasの機能でplotできるし、 plt.show()を使えば縦に並ぶ","metadata":{}},{"cell_type":"code","source":"df[\"company_size\"].value_counts().plot.bar()\nplt.show()\ndf[\"salary_currency\"].value_counts().plot.bar()","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:21.754299Z","iopub.execute_input":"2022-07-12T02:07:21.754642Z","iopub.status.idle":"2022-07-12T02:07:22.238602Z","shell.execute_reply.started":"2022-07-12T02:07:21.754613Z","shell.execute_reply":"2022-07-12T02:07:22.237268Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"二つ並べるには引数にaxesを渡す  \n参考:https://note.nkmk.me/python-pandas-plot/\n\n他にもpandasからxとyの配列を準備して axes[0].plot(x,y) する方法も考えられるがコードが長くなるのでここではやらない","metadata":{}},{"cell_type":"code","source":"fig, axes = plt.subplots(nrows=1,ncols=2,figsize=(8,4))\ndf[\"company_size\"].value_counts().plot.barh(ax=axes[0])\ndf[\"salary_currency\"].value_counts().plot.bar(ax=axes[1],color=\"red\")\n# ラベルを後からつけることも可能\naxes[0].set_title(\"company_size\")\naxes[1].set_xlabel(\"salary_currency\")","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:22.240337Z","iopub.execute_input":"2022-07-12T02:07:22.241127Z","iopub.status.idle":"2022-07-12T02:07:22.608010Z","shell.execute_reply.started":"2022-07-12T02:07:22.241078Z","shell.execute_reply":"2022-07-12T02:07:22.606836Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 保存\nplt.savefig('image.png', bbox_inches='tight', pad_inches=0.3)","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:22.609448Z","iopub.execute_input":"2022-07-12T02:07:22.610684Z","iopub.status.idle":"2022-07-12T02:07:22.629820Z","shell.execute_reply.started":"2022-07-12T02:07:22.610636Z","shell.execute_reply":"2022-07-12T02:07:22.628357Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## day2","metadata":{}},{"cell_type":"code","source":"# https://twitter.com/amaebin/status/1542745660361154560\ndf = pd.DataFrame({\n    'a': np.random.randint(0,10, 100),\n    'b': np.random.randint(0,10, 100),\n})\n\nfig, axes = plt.subplots(1, 2, figsize=(8, 4))\n\nsns.countplot(data=df, x='a', ax=axes[0])\nsns.countplot(data=df, x='b', ax=axes[1])","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:22.631509Z","iopub.execute_input":"2022-07-12T02:07:22.632825Z","iopub.status.idle":"2022-07-12T02:07:23.157159Z","shell.execute_reply.started":"2022-07-12T02:07:22.632780Z","shell.execute_reply":"2022-07-12T02:07:23.155665Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# https://twitter.com/cocoinit23/status/1543095013923770368\nplt.subplot(1,2,1)\ndf['a'].value_counts().plot.bar(ax=plt.gca())\nplt.subplot(1,2,2)\ndf['b'].value_counts().plot.bar(ax=plt.gca())","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:23.158783Z","iopub.execute_input":"2022-07-12T02:07:23.159262Z","iopub.status.idle":"2022-07-12T02:07:23.500313Z","shell.execute_reply.started":"2022-07-12T02:07:23.159213Z","shell.execute_reply":"2022-07-12T02:07:23.498940Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### ヒストグラム\n\n回帰タスクなどで目的変数の分布を見るときによく使う","metadata":{}},{"cell_type":"code","source":"df = pd.read_csv('../input/myntra-reviews-on-women-dresses-comprehensive/Women Dresses Reviews Dataset .csv')\nprint(f\"shap:{df.shape}\")\ndisplay(df.head())","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:23.501847Z","iopub.execute_input":"2022-07-12T02:07:23.502185Z","iopub.status.idle":"2022-07-12T02:07:23.763095Z","shell.execute_reply.started":"2022-07-12T02:07:23.502155Z","shell.execute_reply":"2022-07-12T02:07:23.761971Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, axes = plt.subplots(1, 2, figsize=(8,4))\ndf[\"age\"].hist(ax=axes[0])\ndf[\"rating\"].hist(ax=axes[1])","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:23.764718Z","iopub.execute_input":"2022-07-12T02:07:23.765819Z","iopub.status.idle":"2022-07-12T02:07:24.080336Z","shell.execute_reply.started":"2022-07-12T02:07:23.765768Z","shell.execute_reply":"2022-07-12T02:07:24.079064Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df[\"age\"].hist(by=df[\"rating\"])","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:24.082080Z","iopub.execute_input":"2022-07-12T02:07:24.082407Z","iopub.status.idle":"2022-07-12T02:07:24.710407Z","shell.execute_reply.started":"2022-07-12T02:07:24.082377Z","shell.execute_reply":"2022-07-12T02:07:24.709159Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\nUserWarning: `displot` is a figure-level function and does not accept the ax= paramter.\nseabornのdisplotはaxesleveで設定できなさそう\n\"\"\"\nfig, axes = plt.subplots(1, 2, figsize=(2,2))\nsns.displot(data=df, x='age',ax=axes[0])","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:24.711656Z","iopub.execute_input":"2022-07-12T02:07:24.712035Z","iopub.status.idle":"2022-07-12T02:07:25.250041Z","shell.execute_reply.started":"2022-07-12T02:07:24.712001Z","shell.execute_reply":"2022-07-12T02:07:25.248812Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# histplotはaxesが指定できる\nfig, axes = plt.subplots(1, 2, figsize=(8,4))\nsns.histplot(data=df, x='age',bins=10, kde=True,label='age', ax=axes[0])\nsns.histplot(data=df, x='alike_feedback_count', ax=axes[1])","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:25.251405Z","iopub.execute_input":"2022-07-12T02:07:25.251754Z","iopub.status.idle":"2022-07-12T02:07:26.948786Z","shell.execute_reply.started":"2022-07-12T02:07:25.251707Z","shell.execute_reply":"2022-07-12T02:07:26.947509Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Day3-Day4\n\n- 画像コンペで何枚か画像を見る\n- ravel()を使うと2次元配列化したaxesをイテレーションできる  \n参考:[【Python】複数グラフを描くときはravel()が便利](https://qiita.com/hiroshi_ichihara/items/810a4839a1be0afe08c6)\n","metadata":{}},{"cell_type":"code","source":"import cv2\ntrain = pd.read_csv('../input/cassava-leaf-disease-classification/train.csv')\ntr_dir = \"../input/cassava-leaf-disease-classification/train_images\"\nimage_names = train[\"image_id\"].head(4).to_numpy()\nlabels = train[\"label\"].head(4).to_numpy()\nfig, axes = plt.subplots(2, 2, figsize=(6,6))\n\nfor ax, image_name,label in zip(axes.ravel(), image_names, labels):\n    file_path = f\"{tr_dir}/{image_name}\"\n    image = cv2.imread(file_path)\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    ax.imshow(image)\n    ax.set_title(label)","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:26.950214Z","iopub.execute_input":"2022-07-12T02:07:26.950535Z","iopub.status.idle":"2022-07-12T02:07:27.959811Z","shell.execute_reply.started":"2022-07-12T02:07:26.950505Z","shell.execute_reply":"2022-07-12T02:07:27.958676Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# こっちはpyplot形式\nplt.figure(figsize=(5, 5))\nrow, col = 2, 2\nfor i in range(row * col):\n    plt.subplot(col, row, i+1)\n    file_path = f\"{tr_dir}/{train.loc[i, 'image_id']}\"\n    image = cv2.imread(file_path)\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    target = train.loc[i, 'label']\n    plt.imshow(image)\n    plt.title(f\"target: {target}\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:07:27.961205Z","iopub.execute_input":"2022-07-12T02:07:27.961526Z","iopub.status.idle":"2022-07-12T02:07:28.604933Z","shell.execute_reply.started":"2022-07-12T02:07:27.961496Z","shell.execute_reply":"2022-07-12T02:07:28.603936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 特徴量同士の相関を見る\n\n- seabornのheatmapはaxが引数になる","metadata":{}},{"cell_type":"code","source":"from sklearn.datasets import fetch_openml\n\n# Download the dataset from openml\ndataset = fetch_openml(data_id=42803, as_frame=True)\n\n# Extract feature matrix X and show 5 random samples\ndf_X = dataset[\"frame\"]\nprint(df_X.shape)\ndisplay(df_X.head())","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:15:05.656985Z","iopub.execute_input":"2022-07-12T02:15:05.657679Z","iopub.status.idle":"2022-07-12T02:15:39.289459Z","shell.execute_reply.started":"2022-07-12T02:15:05.657634Z","shell.execute_reply":"2022-07-12T02:15:39.288166Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Computes feature correlation\nmini_X = df_X[df_X.columns.to_list()[:30]]\ndf_corr = mini_X.corr(method=\"pearson\")","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:15:39.291580Z","iopub.execute_input":"2022-07-12T02:15:39.292036Z","iopub.status.idle":"2022-07-12T02:15:40.208409Z","shell.execute_reply.started":"2022-07-12T02:15:39.292004Z","shell.execute_reply":"2022-07-12T02:15:40.207360Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Create labels for the correlation matrix\nlabels = np.where(np.abs(df_corr)>0.75, \"S\",\n                  np.where(np.abs(df_corr)>0.5, \"M\",\n                           np.where(np.abs(df_corr)>0.25, \"W\", \"\")))\n\n# Plot correlation matrix\n# plt.figure(figsize=(15, 15))\nfig, ax = plt.subplots(figsize=(10,10))\nsns.heatmap(df_corr, mask=np.eye(len(df_corr)), square=True,\n            center=0, annot=labels, fmt='', linewidths=.5,\n            cmap=\"vlag\", cbar_kws={\"shrink\": 0.8},ax=ax);","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:15:40.209508Z","iopub.execute_input":"2022-07-12T02:15:40.210711Z","iopub.status.idle":"2022-07-12T02:15:41.642239Z","shell.execute_reply.started":"2022-07-12T02:15:40.210671Z","shell.execute_reply":"2022-07-12T02:15:41.641007Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# https://note.nkmk.me/python-numpy-tril-triu-tri/\n# 第二引数kで境界となる対角線の位置を指定可能。正の値だと上側（右側）、負の値だと下側（左側）に移動する。\nlower_triangle_mask = np.tril(np.ones(df_corr.shape),k=-1).astype(\"bool\")\ndf_corr_stacked = df_corr.where(lower_triangle_mask).stack().sort_values()\ndisplay(df_corr_stacked)","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:18:55.877195Z","iopub.execute_input":"2022-07-12T02:18:55.877601Z","iopub.status.idle":"2022-07-12T02:18:55.893258Z","shell.execute_reply.started":"2022-07-12T02:18:55.877567Z","shell.execute_reply":"2022-07-12T02:18:55.891968Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"相関を見るときに欠損が大量にないか等の確認をすることが大切","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Day 5  \nベン図","metadata":{}},{"cell_type":"code","source":"from matplotlib_venn import venn2\ndf = pd.read_csv('../input/data-science-job-salaries/ds_salaries.csv')\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:08:12.573189Z","iopub.execute_input":"2022-07-12T02:08:12.573514Z","iopub.status.idle":"2022-07-12T02:08:12.609842Z","shell.execute_reply.started":"2022-07-12T02:08:12.573483Z","shell.execute_reply":"2022-07-12T02:08:12.608591Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# カテゴリ変数をベン図で表す\ncols = [\"experience_level\",\"employment_type\",\"job_title\",\"salary_currency\",\"employee_residence\",\"company_location\"]\nfig, axes = plt.subplots(2, 3, figsize=(10,5), facecolor=\"lightgray\")# デフォルトだと黒背景で醜くなる\n\nfor ax, col in zip(axes.ravel(), cols):\n    setA = set(df[:500][col])\n    setB = set(df[500:][col])\n    venn2([setA,setB], set_labels = ('A', 'B'), ax=ax)\n    ax.set_title(col)","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:08:12.611291Z","iopub.execute_input":"2022-07-12T02:08:12.611625Z","iopub.status.idle":"2022-07-12T02:08:13.054210Z","shell.execute_reply.started":"2022-07-12T02:08:12.611595Z","shell.execute_reply":"2022-07-12T02:08:13.052829Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 欠損値割合の可視化\ndf = pd.read_csv('../input/myntra-reviews-on-women-dresses-comprehensive/Women Dresses Reviews Dataset .csv')\ndf.isna().mean().sort_values().plot(\n    kind=\"bar\", figsize=(15, 4),\n    title=\"Percentage of missing values per feature\",\n    ylabel=\"Ratio of missing values per feature\");","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:08:13.055990Z","iopub.execute_input":"2022-07-12T02:08:13.056815Z","iopub.status.idle":"2022-07-12T02:08:13.448059Z","shell.execute_reply.started":"2022-07-12T02:08:13.056759Z","shell.execute_reply":"2022-07-12T02:08:13.447249Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.plot(lw=0, marker=\".\", subplots=True, layout=(-1, 4),\n          figsize=(10, 10), markersize=1)","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:08:13.452566Z","iopub.execute_input":"2022-07-12T02:08:13.453708Z","iopub.status.idle":"2022-07-12T02:08:14.686916Z","shell.execute_reply.started":"2022-07-12T02:08:13.453665Z","shell.execute_reply":"2022-07-12T02:08:14.685640Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# カテゴリの最頻値\ndf.describe(exclude=[\"number\", \"datetime\"])","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:08:14.688544Z","iopub.execute_input":"2022-07-12T02:08:14.688923Z","iopub.status.idle":"2022-07-12T02:08:14.769451Z","shell.execute_reply.started":"2022-07-12T02:08:14.688891Z","shell.execute_reply":"2022-07-12T02:08:14.768103Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df[\"division_name\"].value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:08:14.771203Z","iopub.execute_input":"2022-07-12T02:08:14.771706Z","iopub.status.idle":"2022-07-12T02:08:14.785546Z","shell.execute_reply.started":"2022-07-12T02:08:14.771660Z","shell.execute_reply":"2022-07-12T02:08:14.784596Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# pandasが一括でプロットしてくれる\ndf.hist(bins=25, figsize=(10, 5), layout=(-1, 5), edgecolor=\"black\")\nplt.tight_layout();","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:08:14.787221Z","iopub.execute_input":"2022-07-12T02:08:14.787670Z","iopub.status.idle":"2022-07-12T02:08:15.846922Z","shell.execute_reply.started":"2022-07-12T02:08:14.787638Z","shell.execute_reply":"2022-07-12T02:08:15.845824Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Day6\n\n- 数値データをRaincloud plotする\n- [PtitPrinceによるPythonでのRaincloud plotの描画](https://oumpy.github.io/blog/2020/12/ptitprince_tutorial.html)","metadata":{}},{"cell_type":"code","source":"!pip install ptitprince -q","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:08:15.848218Z","iopub.execute_input":"2022-07-12T02:08:15.848566Z","iopub.status.idle":"2022-07-12T02:08:32.432630Z","shell.execute_reply.started":"2022-07-12T02:08:15.848535Z","shell.execute_reply":"2022-07-12T02:08:32.430821Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from ptitprince import RainCloud\nfig, axes = plt.subplots(1,2,figsize=(10, 5))\n\"\"\"\ndataにdataframe,yにデータ配列を渡す。\nxにカテゴリ変数を渡すとカテゴリごとに分けてくれる\n\"\"\"\nRainCloud(data=df, y=\"age\", orient='h',ax=axes[0])\nRainCloud(data=df,x=\"rating\", y=\"age\", orient='h', pointplot=True,ax=axes[1])","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:08:32.436069Z","iopub.execute_input":"2022-07-12T02:08:32.437868Z","iopub.status.idle":"2022-07-12T02:08:33.666377Z","shell.execute_reply.started":"2022-07-12T02:08:32.437804Z","shell.execute_reply":"2022-07-12T02:08:33.665235Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"ニューラルネットワークの入力に使う特徴はスケーリングしたいのでスケーリング前後の分布を眺めることに使ったことがあります","metadata":{}},{"cell_type":"code","source":"from sklearn.preprocessing import QuantileTransformer,StandardScaler\n# StandardScaler\nst = StandardScaler()\ndf[\"st\"] = st.fit_transform(df[[\"age\"]])\n# RankGauss\nqt = QuantileTransformer(random_state=0, output_distribution='normal')\ndf[\"qt\"] = qt.fit_transform(df[[\"age\"]])\n\n#plot\nfig, axes = plt.subplots(1,3,figsize=(12, 4))\n\"\"\"\ndataにdataframe,yにデータ配列を渡す。\nxにカテゴリ変数を渡すとカテゴリごとに分けてくれる\n\"\"\"\nRainCloud(data=df, y=\"age\", orient='h',ax=axes[0])\nRainCloud(data=df, y=\"st\", orient='h',ax=axes[1])\nRainCloud(data=df, y=\"qt\", orient='h',ax=axes[2])","metadata":{"execution":{"iopub.status.busy":"2022-07-12T02:08:33.667951Z","iopub.execute_input":"2022-07-12T02:08:33.668284Z","iopub.status.idle":"2022-07-12T02:08:34.590162Z","shell.execute_reply.started":"2022-07-12T02:08:33.668253Z","shell.execute_reply":"2022-07-12T02:08:34.589340Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Day 12\n\n- (Rest from day 7 to day 11 :))","metadata":{}},{"cell_type":"markdown","source":"## 後で見る\nhttps://miykael.github.io/blog/2022/advanced_eda/","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}