{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "view-in-github" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 練習帳\n", "\n", "このノートブックでは、1-8章で抑えておくべき基本事項を確認するための練習問題を与える。\n", "\n", "この練習帳の目的は、皆さんが自分自身の理解・疑問点を確認するためであって、**練習帳で書いているコードや記述が正しいかどうかは一切授業の評点には関係がない**。 \n", "一方で、練習帳の記載内容が明らかな盗用・剽窃であると判断された場合、事実確認の上、厳正な措置を取ることがあるので注意されたい。\n", "\n", "したがって友人に見せてもらったり相談をして体裁を整える必要はまったく無い。 \n", "\n", "質問やその返答を円滑にするための連絡帳のようなものだと思ってもらえれば良い。 \n", "とにかく、自分の理解を確認するためにコードをどんどん書いてどんどん失敗しよう。\n", "\n", "また、教員に対する質問の見落としを防ぐため、リアクションシート(C-Learning)上で\n", "\n", ">練習帳に詳細な質問とコードを書きました\n", "\n", "などと教えてもらえるとスムーズな対応が可能になります。 \n", "**リアクションシートの提出やその他、連絡・相談などでの質問の際は、必ず毎回練習帳の共有リンクを添えてください**\n", "\n", "慣れないうちは、エラーの原因がわからない場合は**とにかく教員に聞く**。\n", "その際は、エラーメッセージを転記したりスクリーンショットを添えて質問しよう。\n", "\n", "慣れてくると、自分でエラーメッセージをWebで検索したり、[よくあるエラー集](https://sotayoshida.github.io/Lecture_DataScience/notebooks/Python_misc_Error.html)などを見て、原因の特定・解決ができるようになる。 \n", "\n", "\n", "## 練習帳のノートブックの共有の仕方\n", "\n", "以下の手順にならってください(1-3は1度やれば再び行う必要はありません)。\n", "\n", "1. まずノートブックのコピーを作成し、ファイル名を適当に編集する: 例: 練習帳_氏名_123456X.ipynb (123456Xは学籍番号のつもり)\n", "2. 右上の共有ボタンを押し、「制限付き」を「リンクを知っている全員」に変更\n", " (共有ボタンが見えない場合、編集権限がないつまり「ノートブックのコピーをつくる」というお約束を忘れていることを意味する)\n", "3. 「リンクを知っている全員」の右にある「閲覧者」を「編集者」に変更する\n", "4. 最後に、「リンクをコピー」をクリックし、そのURLをブックマークするか、どこか(メモ帳やメールの下書きなど)に保存しておこう. \n", " 2回目以降はC-Learningで一度提出した過去のURLをコピーするのが手っ取り早い.\n", " ※ここでの注意は、「リンクをコピー」を押して得られたURLを貼り付けること。自身が開いているノートブックのアドレスバーのURLをコピーするのではない。\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "元の問題文さえ残っていれば、練習帳のレイアウトは好きに改変してOK.\n", "コードセル・テキストセルともに自由に追加して構わない。\n", "\n", "なお、markdown形式の記述方法が知りたい方は、[WikipediaのMarkdownのページ](https://ja.wikipedia.org/wiki/Markdown)などを適宜参照すること。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第1章:Pythonの基礎\n", "\n", "練習問題: \n", "1. 身長と体重に相当する変数を適当に定義し、BMI(体重kg ÷ 身長mの二乗)を計算した上で`print`関数で表示せよ (自身の身長体重を用いる必要はない)\n", "2. 上で計算したBMIに対応する変数と`str`関数を用いて文字列を連結し、\"AさんのBMIは22.0です\"などと表示させよ。 \n", " もし、小数点以下第2位まで表示したいなど、表示を工夫したい場合は下のヒントを参考にためしてみよう。\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 問題1.&2.に対応するコードを以下に記載してください\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "例1 3.1416\n", "例2 3.14e+00\n", "例3 3.14\n", "例4 3.1416\n" ] } ], "source": [ "# 問題2.に関するフォーマット指定の例 (ややテクニカルなので、理解できなくても問題ありません)\n", "value = 3.141592653589793\n", "\n", "# 例1: 小数点以下4桁まで表示し、全体の幅を9にする\n", "print(\"例1\", str(\"%9.4f\" % value)) #\n", "\n", "# 例2: 指数表記で表示 (小数点以下2桁まで表示し、全体の幅を7にする)\n", "print(\"例2\", str(\"%7.2e\" % value)) \n", "\n", "# 例3: 小数点以下2桁まで表示\n", "print(\"例3\", f'{value:.2f}') \n", "\n", "# 例4: 小数点以下4桁まで表示し、全体の幅を9にする(1の別の書き方)\n", "print(\"例4\", \"{:9.4f}\".format(value)) # 小数点以下4桁までfloat型で表示し、全体の幅を9にする" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**1章の振り返り**\n", "\n", "これらの点をチェックし、必要ならコードセルを追加して練習しよう:\n", "\n", "* 変数の定義や四則演算の方法が分かる\n", "* `print`や`str`などの基本的な関数の使い方がわかる\n", "* プログラムの実行順序と、セルを跨いで実行する際の注意点がわかる\n", "* 基本的な変数の型とその調べ方が分かる" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第2章:Pythonの基礎2\n", "\n", "練習問題: \n", "1. 要素に身長(単位:cm)と体重(単位:kg)を持つ適当なリストを定義し、5人のデータ(リスト)を要素にもつ**入れ子構造のリスト**を作成せよ。 \n", " ただし3人目の身長と体重は必ず175,60とすること(それ以外は適当で構わない)。\n", "2. `for`文を使って、上で作成した5人分のデータ(入れ子構造のリストの各要素)を表示せよ.\n", "3. 上のリストから、5人の平均身長と平均体重をそれぞれ計算するコードを作成せよ。 \n", " 算術平均を取る際は、数字の5などを使うのではなく、リストの長さを使うなどして、 \n", " **リストの要素の数が5個以外(10や100)でも正しく計算できる汎用性のあるコード**にすること。\n", "\n", "4. 上のリストについて、`for`文を用いて全員のBMI(体重kg ÷ 身長mの二乗)を計算し、一人ずつBMIを表示させよ。(身長の単位に注意)\n", "\n", "5. `for`文のブロック内で`if`と`break`を用いて、「BMIが20.0以下なら、値を表示したあとにループを終了する」という処理を実現せよ。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# コードを以下に記載してください\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ヒント&助言:\n", "\n", "* **`list`という変数名のリストを作らない!**\n", " > `list`はリストと互換性のあるオブジェクトをリストに変換するための関数です。\n", " ```python\n", " list = [1, 2]\n", " ```\n", " などと一度実行してしまうと、以降でリスト関数が使えなくなります。\n", " 予約語やprint,listなどの組み込み関数を変数として上書きしてしまうと、元の機能が使えなくなり、不都合が生じる場合があります。\n", " ```python\n", " print = \"Hey!\"\n", " print(\"Hello\")\n", " ```\n", " などとすると、\n", " ```\n", " 'str' object is not callable\n", " ```\n", " 既に文字列(str)型になっているprintを関数みたく使う(callする)ことはできないよ!とエラーが発生し、print関数を使えなくなってしまいます。 \n", " そうしたときは、変数名を適切に変更した上で、【ランタイム】→【ランタイムの再起動】を行えば、元の予約語や組み込み関数を問題なく使えるようになります。\n", "\n", "* **ブロックに注意!**\n", "\n", " インデントによる処理のブロックの指定に注意が必要です。\n", " 例えばfor文を条件文(if)に応じてbreakする場合は、for文のブロックの中にif文のブロックを書く必要があります。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**2章の振り返り**\n", "\n", "**とくに2章は重要な概念が盛りだくさんなので、必ず練習したり、疑問があれば質問すること!**\n", "\n", "これらの点をチェックし、必要ならコードセルを追加して練習しよう:\n", "\n", "* リストの定義や要素へのアクセスの方法(インデックスやスライス)が分かる\n", "* リストに要素を加える方法が分かる\n", "* `if`文による条件分岐が分かる\n", "* `for`や`while`によるループ処理がわかる" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第3章:関数\n", "\n", "練習問題:\n", "1. 摂氏温度(℃,度)に対応する数値を受けとり、絶対温度(K,ケルビン)を返す関数をコードセルに書いておいた。\n", " この関数を用いて、摂氏0度,20.55度,42.199度に対応する絶対温度をそれぞれ計算し、print文で表示せよ。 \n", "\n", "2. 要素に実数値を持つ適当なリストを2つ以上定義し、任意の長さの実数値のリストについて平均と分散を返り値とする自作関数を作成せよ。\n", " なお、分散の定義は下記の標本分散とする: \n", "\n", " $$\n", " \\frac{1}{N}\\sum^N_{i=1} (x_i - \\bar{x})^2\n", " $$\n", " ここで$N$はデータの個数、$x_i$が各データ、$\\bar{x}$は平均を意味する。 \n", " 平均を計算する関数、分散を計算する関数をそれぞれ作成しても良いし、一つの関数でまとめても良い。\n", "\n", " ポイントは**任意の長さの**という点で、リストの長さが2とか3とか、特定の場合にしか対応していないコードを書くのではなく、リストの長さに依存しない汎用的なコードを書くこと。\n", "\n", "3. 2.で作った自作関数の返り値の型を`type`関数で調べて表示せよ。\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# コードを以下に記載してください\n", "#1. \n", "def K_from_C(C):\n", " K = C + 273.15\n", " return K" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**3章の振り返り**\n", "\n", "これらの点をチェックし、必要ならコードセルを追加して練習しよう:\n", "\n", "* 自作関数の定義の仕方・呼び出し方が分かる\n", "* 引数(インプット)や返り値(アウトプット)の扱い方が分かる" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第4章:ライブラリ/パッケージ/モジュールとデータの可視化\n", "\n", "練習問題:\n", "1. 授業で扱った`math`,`numpy`の何れかを使って、任意の半径`r`について円の面積と球の体積を計算する自作関数を作成せよ。\n", "\n", "2. `matplotlib`を用いて、好きな図を作成させノートブック上に表示させよ。その際、`matplotlib`(とくに`matplotlib.pyplot`)の使い方を調べて\n", " - 色をカラーコードで指定する\n", " - グラフを構成するオブジェクトの透過度を設定する\n", "\n", " など、授業で指定していないオプションを試してみよう。\n", "\n", "3. `math`モジュールの[公式Document](https://docs.python.org/ja/3/library/math.html)を参照し、 \n", " 授業で扱っていない関数を1つ選び、その関数を使ったコードとその説明を記載すること。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# コードを以下に記載してください\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**4章の振り返り**\n", "\n", "これらの点をチェックし、必要ならコードセルを追加して練習しよう:\n", "\n", "* ライブラリのインストールやインポートの仕方が分かる\n", "* matplotlibの簡単な使い方が分かる\n", "* Webの情報や公式ドキュメントを読んだりして、使い方を調べることができる" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第5章:確率と擬似乱数\n", "\n", "練習問題:\n", "1. 0からn-1(nは適当な整数)までのn個の整数から、重複なくランダムにn個選ぶ(つまり0からn-1の無作為な並べかえをする)コードを作成せよ。(`numpy.random.choice`を使うとよい)\n", "2. 1.を用いて、任意の文字列のリスト(例: 名前のリスト `[\"Aさん\",\"Bさん\",...]`)をランダムに並び替えて出力するコードを作成せよ。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# コードを以下に記載してください\n", "\n", "# 2.のヒント (AさんからZさんまで作っておきます)\n", "# 解説: Pythonの組み込み関数の`chr`には、Unicodeのコードポイントと呼ばれる整数値から、対応する文字列を返す機能があります。\n", "# 例えばchr(65)は'A'に、chr(66)は'B'に、... chr(90)は'Z'になります。\n", "names = [ str(chr(i)) for i in range(65, 91) ]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**5章の振り返り**\n", "\n", "これらの点をチェックし、必要ならコードセルを追加して練習しよう:\n", "\n", "* `random`や`numpy.random`モジュールを用いて、簡単な確率的事象を表現する方法がわかる\n", "* 適当な区間内でランダムな整数を生成することができる\n", "* 適当な実数の乱数(一様乱数・正規乱数)を生成することができる\n", "\n", "おまけ: Unicodeについて\n", "\n", "`chr`の反対に、文字からUnicodeのコードポイントを返す関数`ord`がある。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print( ord(\"吉\"), ord(\"田\"))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "これを活用すると、 下記のように簡単な暗号化・復号化を行うこともできる。※大した暗号になっていないので、実際に使って叱られたりしないように。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "code = [ ord(\"吉\"), ord(\"田\"), ord(\"の\"), ord(\"話\"), ord(\"は\"), ord(\"面\"), ord(\"白\"), ord(\"く\"), ord(\"な\"), ord(\"い\")]\n", "print(\"暗号化=>\", code)\n", "print(\"複号化=>\", \"\".join([ chr(i) for i in code ]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第6章:相関・回帰分析\n", "\n", "練習問題:\n", "1. 以下のデータ`x`(宇都宮市の月別平均気温)と`y`(アイスクリーム・シャーベットの消費量)のうち、 \n", " 8月のデータ(気温か消費量のいずれか)をランダムな値に変更し相関係数がどうなるか5通りほどで示せ。 \n", " なお、値を変更する際はインデックスやリストの対応する値を直接書き換えるのではなく、 \n", " ランダムな値をインデックスに使うことで、値を変更するコードを書くこと。 \n", " (なぜなら、データが大量の場合、手でインデックスや、対応するリストの値を書き換えるのは現実的ではないから)\n", " \n", "2. 疑似相関について調べ例をあげよ。(できれば自身の興味に近いものや日本の事例などを調べてみること)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# コードを以下に記載(追記)してください\n", "x= [3.1, 4.3, 6.6, 13.2, 19.1, 20.9, 26.4, 25.1, 21.9, 15.7, 9.6, 3.8]\n", "y= [568, 572, 804, 833, 930, 965, 1213, 1120, 835, 540, 451, 502]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**6章の振り返り**\n", "\n", "これらの点をチェックし、必要ならコードセルを追加して練習しよう:\n", "\n", "* 相関分析の意味を、友人等に説明できる\n", "* 長さの等しい2つのリストについて、相関係数を計算することができる\n", "* 簡単な場合について自作関数とライブラリの出力が同じであることを確認することができる" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第7章:最適化問題\n", "\n", "練習問題:\n", "1. 以下に示したデータ(`x`:年, `y`:男子100m走の世界記録(秒))について、6章で出てきたpolyfitを使って1-5次式までの多項式でフィッティングしてみよう。\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# コードを以下に記載(追記)してください\n", "y = [ 10.06, 10.03,10.02, 9.95,9.93, 9.92,9.9, 9.86,9.85, 9.84, 9.79, 9.78, 9.77, 9.74,9.72,9.69,9.58 ]\n", "x = [1964, 1968,1968,1968,1983,1988,1991,1991,1994,1996,1999,2002,2005,2007,2008,2008,2009 ]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**7章の振り返り**\n", "\n", "これらの点をチェックし、必要ならコードセルを追加して練習しよう:\n", "\n", "* 多項式回帰の意味を、友人等に説明できる \n", "* ライブラリを用いて多項式回帰(係数の最適化)を行うことができる\n", "* 係数の最適化の結果から、グラフの描画点を生成し、可視化することができる" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第8章:ファイル操作\n", "\n", "練習問題:\n", "1. コードセルに示したように、`Pandas`を用いてWeb上にあるcsvファイルを読み込んでみよう。 \n", "\n", " 例として、栃木県のオープンデータ「ベリーとちぎ」から[保育所一覧(2021年4月1日現在)](https://data.bodik.jp/dataset/090000_hoikusyo/resource/37469f20-ed3c-4f9e-a5c4-fa750fc3c673)を利用する。\n", "\n", " なお、このcsvファイルはShift-JISでエンコードされているため、`encoding`オプションを指定する必要がある。 \n", " また、適宜URLを別のcsvファイルに変更しても構わないが、その場合はURLのほか、簡単な説明やコメントを添えること。\n", "\n", "2. Google Driveをマウントし、1.で読み込んだデータをGoogle Driveに保存せよ。\n", "\n", " この問題はDriveのマウント・パスの指定などの一連の作業が理解できているかを確認するものなので、エラーが出た場合はそのログや自身が試した工程について、 \n", " スクリーンショットなども活用しながらできるだけ詳細に報告すること。特に問題なく作業ができた場合は、2の図を送るなどはしなくて構わない。 \n", "\n", " また、プライベートなGoogleアカウントを使用している(※授業では非推奨)場合、相談の際にはプログラムの出力結果やスクリーンショットなどに他人に見られて困るものが映っていないか配慮すること。\n", "\n", "3. 余力があれば、Pythonで地図上にデータをプロットする方法を調べてみよう。代表的なライブラリとしては`folium`や`geopandas`などがある。\n", "\n", " こちらは、地図上にプロットしたりできると楽しいよ、というだけで、とくにコード欄に記載したりする必要はない。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# コードを以下に記載(追記)してください\n", "#1. (コードは書いておきましたので、挙動を確認してください)\n", "import pandas as pd\n", "url = \"https://data.bodik.jp/dataset/47cb5069-7383-47d3-a7df-b84d59484432/resource/37469f20-ed3c-4f9e-a5c4-fa750fc3c673/download/42064_2021_hoikusyo_02184.csv\"\n", "df = pd.read_csv(url, encoding=\"cp932\")\n", "#df = pd.read_csv(url) #上の代わりにこの行のようにencodingの指定をなしにするとエラーになることも確認してみよう\n", "display(df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#2.\n", "# DataFrameにはcsvに変換して保存するためのto_csvメソッドが用意されているので、それを使うと簡単にcsvを作成できる。\n", "# 以下のコードのパスを書き換えて自身のGoogle Driveに保存してみよう。また、encodingオプションで文字コードのエンコーディングを指定することもできる。\n", "df.to_csv('content/drive/MyDrive/your_file.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**8章の振り返り**\n", "\n", "これらの点をチェックし、必要ならコードセルを追加して練習しよう:\n", "\n", "* Google ColaboratoryでGoogle Driveをマウントすることができる\n", "* Google Drive上にあるcsvなどのファイルを読み込むことができる\n", "* 読み込んだファイルの内容から、必要なデータを取り出してprintしたり、配列を作り、それをグラフとして描いたりすることができる" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 最終課題\n", "\n", "授業の後半で取り組む最終課題については、自由な発想で課題を設計し、取り組んでもらって構わない。 \n", "条件としては、以下のようなものが挙げられる:\n", "\n", "- 1人(ないし2名ペア)で取り組むこと \n", " ペアの場合は、それぞれの寄与が明確かつ十分と認められること、および、ペアでやる必然性を示すこと\n", "- 都度、教員に相談しながら、計画的に進めること\n", "- 事前に教員に確認すべき課題の例\n", " - 個人情報(例えば自営業をしている実家のデータを分析するなど)を含む場合は、それをマスクする処理が可能であること\n", " - 特定のサービス・ソフトウェア・アプリに関する分析(ゲームのデータなどは著作権等の理由から多くの場合不可)\n", " - アカウントの作成やライセンス等の購入が必要な外部サービスを使用する課題でないこと(≒教員が特段の手続きを経ずとも、課題作成者のサポートや採点・評価が可能なものであること)\n", "\n", "その他、教員が不適切と判断した課題については、課題の変更を求めることがある。\n", "\n", "何もないところから課題を設計するのは難しい。以下の例を参考に、計画をたてよう:\n", "\n", "**公開データを元に、栃木県のデータを可視化・分析したい**とする。\n", "その際に必要な工程や、分析を行うために学修すべき事項を列挙しながら、課題を設計していく。\n", "\n", "- データの収集: 興味のあるデータがオープンデータとして公開されているかを調べる。\n", " - 例1: [e-Stat](https://www.e-stat.go.jp/)\n", " - 例2: [オープンデータ・ベリーとちぎ](https://odcs.bodik.jp/090000/)\n", "- 地図を描き、市町村ごとに特定のデータをカラーマップとして表示する事を考える。\n", " - そのためには、市町村の境界線のデータが必要になる。例えば、[国土数値情報ダウンロードサービス](https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-v2_3.html)からデータを収集するとする。\n", " - 得られたデータを地図上で可視化するために、使えそうなライブラリを探す。例えば、[geopandas](https://geopandas.org/)や[folium](https://python-visualization.github.io/folium/)が使えそうである。\n", " - 簡単なデータから初めて、ライブラリの使い方を学びながら、地図を描くことを目指す。\n", " - その他、地図上に関連する(例えば...特定の商業施設やLRTの停留所など)ピンを打ってみる\n", "- 実際のデータを元に、分析を行う\n", "- 問題点が生じた場合、その原因を特定し、解決するために必要な知識を学ぶ。(以下試行錯誤...)\n", "\n", "といった具合。あくまで、例であるので、自身の興味に合わせて課題を設計していくこと。\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "colab": { "include_colab_link": true, "name": "Python_practice.ipynb", "provenance": [] }, "interpreter": { "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" }, "kernelspec": { "display_name": "Python 3.9.10 64-bit", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.14" } }, "nbformat": 4, "nbformat_minor": 0 }