リスクのものさし表示ツールの開発~非エンジニアがPythonでWebアプリを作ってみた

python リスク比較

要約

リスク比較の手法として有用な「リスクのものさし」を表示するWebアプリケーションをPythonを使って開発しました。私のような非エンジニアでもサクっとWebアプリを作って実装するための、さまざまなツールと学習するための教材(書籍やWeb上の情報)を紹介します。

本文:リスクのものさし表示ツールの開発

本ブログではリスク比較をメインコンテンツの一つにしており、リスクの指標としての10万人あたりの年間死者数を「リスクのものさし」という表現方法を用いて示しています。リスクのものさしについての解説は以下の記事をご覧ください

新型コロナウイルス感染症(COVID-19)のリスクを比較したいときに押さえおきたいポイント4つ。その2:リスクのものさし
リスク比較をする際には、比較対象を都合よく選んで「○○よりも小さいから気にするな」という類のメッセージを出してはいけません。それを避けるために、常に一定のリスク比較のセット(リスクのものさし)を使って新型コロナウイルス感染症のリスクを比較してみます。
リスク指標としての損失余命はわかりやすい?その2:リスクのものさし損失余命版
損失余命を指標としてリスク比較する際にもリスクのものさし(一定のリスク比較のセット)があると便利です。「がん、自殺、交通事故、火事、落雷」の5つの要因の損失余命を最新(令和元年)のデータを用いて解析し、リスクのものさしとして活用できるようにしました。

データは厚生労働省による人口動態調査をベースとしています。ところが、いちいちこのデータを調べてものさしとなる死因(がん、自殺、交通事故、火事、雷)を抽出し、ものさしとしてテーブルにするのは面倒です。そこで、年代と死因を選択するだけでリスク指標とリスクのものさしを表示するツール(以下のリンク、とりあえずRiskToolsと命名しました)を作ってみました。ブログのヘッダメニューからも飛ぶことができます。

http://risktools.nagaitakashi.net/

年齢階級と死因を選択し、最後に一番下にある決定ボタンを押すと評価結果が表示される、という非常にシンプルなWebアプリケーションです。こういうのをサクッと作って実装できるようになると便利なだと常々考えていたので、これはその第一歩です。

もちろんまだまだUI(ユーザーインターフェース、画面上の操作性のこと)は不十分ですし、機能も付け加えたいものがたくさんあります。リスクの経年変化や選択した二つの要因のリスク比較などもあると便利ですね。

ただしここで一つ問題があります。私はプログラマーでもなくエンジニアでもありません。仕事でデータ分析のためにRを10年以上使っていますが、アプリケーションの開発経験などは全くありません。

一方、最近データ分析の中でも機械学習などの分野でPythonという言語が良く使われるようになりました。そこでPythonに興味を持っていたところ、さらにPyhonを使うとWebアプリを簡単に作れるという話も聞き、奮起してPythonを勉強し始めることにしました

本記事では、非エンジニアがPythonでWebアプリを作って実装するまでにどんな知識・技術が必要かをまとめてみました(エンジニアの方に有用な情報はありません)。

全体論

まずはWebアプリを作る際の全体像というか心構えから始まります。ここでの原則は「あまり作りこまずに最低限の機能だけ組み込んだアプリ(MVP, minimum viable product)をさっさと公開してしまう」というものです。自分であれこれ考えるよりも、プロトタイプを使ってもらってユーザーの反応を聞きながら改良したほうがよい、という考えがベースです。こういうのをアジャイル開発と呼びます。

アジャイル開発では以下のプロセスを素早く繰り返し回します。

企画->デザイン->コード(プログラミング)->デプロイ(インターネット上に公開すること)->計測

ここではアクセス解析などの計測で得られたデータに最も価値があります。仮説検証に時間をかけ、企画に時間をかけないことがポイントとされています。

計測に価値があるというのはブログの運営でも同じだなと思います。実際に当ブログでもいろいろなデータを計測しており、運営にフィードバックさせています。

参考:吉田光利(2015)起業のWeb技術

Amazon.co.jp

Python

Webアプリの基本構造はサーバーサイド(データ解析などを担う部分)とフロントサイド(ユーザーの画面に表示される部分)の組み合わせです。サーバーサイドの言語としてここではPythonを使います。

Rなどの他言語を使っている人ならPythonの習得自体はそれほど難しくないと思います。以下に示すような基本の基本が書かれた入門書をこなし、データ分析にかかせないデータフレームの扱い(Pandasというライブラリを使う)がわかればなんとかなります。

開発環境は結構悩みます。データ分析屋さん(Jupyter推しが多い)と開発屋さんとでは使う環境が違い(言ってることが違い)、ここを理解するのにだいぶ時間がかかりました。私の場合はデータ解析の部分はAtom+Hydrogen(Rのような使い勝手でJupyterを使える)を使い、アプリ開発はPyCharmを使う、といったように使い分けています。

今回開発したツールでは、ダウンロードした人口動態統計のcsvファイルを読み込んで、年齢階級と死因から死亡率を抽出し、ものさしと合わせてデータフレームを作る、というプログラムを書いています。

参考:
鈴木たかのりほか(2020)いちばんやさしいPythonの教本 第2版 人気講師が教える基礎からサーバサイド開発まで

ご迷惑をおかけしています!

Daniel Y Chen(2019)Pythonデータ分析/機械学習のための基本コーディング! pandasライブラリ活用入門

Amazon.co.jp

Webアプリ開発(Flask)

Webアプリを開発する際にはフレームワークを使います。Pythonのライブラリとして、Bottle、Flask、Djangoなどいくつかフレームワークがあります。本格的な開発にはDjangoを使いますが、簡単なアプリならより簡単に学べるFlaskのほうが適しています。今回開発したツールもFlaskを使っています。

これらのフレームワークでは、どのページにアクセスがあった場合にどんな処理をしてその結果をどう表示するか、というのをひとつずつ作っていきます。

すでに紹介した「いちばんやさしいPythonの教本」では、Bottleを使ったWebアプリ開発の基本までを学べますが、その次には以下のYouTube動画がメチャメチャ参考になりました。Flaskを使ったWebアプリ開発からデプロイまで一通り学習できます。

【保存版】Python(Flask)×Webアプリ開発入門コース【1時間でOK!】

YouTube
作成した動画を友だち、家族、世界中の人たちと共有

動画のテキスト版:
【保存版】30分でFlask入門!Webアプリの作り方をPythonエンジニアが解説

【保存版】30分でFlask入門!Webアプリの作り方をPythonエンジニアが解説 | テックダイアリー
こんにちは、はやたす(@hayatasuuu )です。 この記事では「Flaskを使ったWebアプリ(Todoアプリ)の作り方」を分かりやすく紹介していきます。 Flaskの日本語情報は少ないので、この記事が間違いなく役立つはずです! この

より体系的に学ぶには以下の書籍が有用です。Djangoの本も紹介しますが、この本はDjango以外にも「一人でサクッと会員制Webアプリを作って運用する」ためのノウハウがたくさん書かれているので参考になります。例えば開発環境PyCharm、CSSライブラリBootstrap、データベースPostgreSQL、バージョン管理システムGit&Sourcetree、インターネット上に公開する環境Amazon AWSなどです。

参考:
クジラ飛行机(2020)Pythonではじめる Webサービス&スマホアプリの書きかた・作りかた

ご迷惑をおかけしています!

掌田津耶乃(2019)Pythonフレームワーク Flaskで学ぶWebアプリケーションのしくみとつくり方

ご迷惑をおかけしています!

大高隆(2019)動かして学ぶ! Python Django開発入門

Amazon.co.jp

フロントサイドの開発(HTML & CSS & JavaScript)

フロントサイドはユーザーがWebサイト上で処理をリクエストしたり、サーバーサイドで処理した結果をWebサイト上に表示する部分です。Webサイトの基本はHTMLですが、私の場合自分のWebサイトは昔から作っていたのでHTMLの基本は知っていました。

Python&Flaskを使ったWebアプリの場合は、HTMLにさらにJinjaテンプレートを組み合わせます。サーバーサイドから処理した結果を受け取る場合に必要になります。さらにHTMLは条件分岐(if文)とか繰り返し(for文)とかの関数がないので、Jinjaを使うとスッキリと書くことができます。

次にCSS(スタイルシート)ですが、これはいまどきのWebデザインには必須です。いろんな部品がセットになったCSSフレームワークとしてBootstrapが有名です。今回開発したツールでもBootstrapを使っています(ちなみにデータ分析でBootstrap法というと全く別のものを意味しますが)。

この辺のJinjaやBootstrapについても先に紹介したYouTube動画と以下の書籍が参考になります。 

ご迷惑をおかけしています!

JavaScriptは動的な(スライドショーとかハンバーガーメニューとか)Webサイトを作るのに役立ちます。今回開発したツールでは今のところ使っていませんが、今後使うかもしれません。非エンジニアにとってはjQuery(JavaScriptを簡単に記述できるようにするライブラリ)を使えればとりあえず十分と思われます。

データベース(PostgreSQL & pgAdmin)

今回開発したツールでは操作ログの記録などでデータベースを使っています。Webアプリをインターネット上に公開する際にHEROKUというWebサービスを使っており、HEROKUでのデータベースとしてPostgreSQLを使います。Pythonで一番簡単に使えるデータベースはSQLiteですが、これはHEROKUでは使えません。

PythonアプリでのPostgresSQLの利用については以下の書籍を参考にしました。 

Amazon.co.jp

また、Python上でSQLという別の言語を使うのはややこしいので、SQL AlchemyというPython言語でデータベースを扱うライブラリも使っています。これについては以下の書籍を参考にしました。 

ご迷惑をおかけしています!

また、pgAdminというソフトを使うとGUI(Windowsのソフトっぽいアイコンが並んだ画面)でPostgreSQLを操作できます。

バージョン管理システム(Git & SourceTree & GitHub)

Gitはバージョン管理システムですが、作成したWebアプリを公開まで持っていく際に有用なものです。私の場合はSourceTreeというソフトを使って、GUIでGitを使っています。これをクラウド上のGitHubにプッシュして(同期させて)、GitHubからさらにHEROKUにデプロイすることでWebアプリをインターネット上に公開できます。

SourceTreeの使い方は以下の書籍が参考になります。 

Amazon.co.jp

HEROKU

HEROKUはいわゆるPaaS(Platform as a Service)と呼ばれるサービスで、サーバーの管理(ハードウェア、OS、ソフト、セキュリティなど)の必要がなく、アプリケーションさえ開発すればそれを実行してくれるプラットフォームです

今回開発したツールは無料枠で公開しています。無料だといろいろな制限がありますが、とりあえず無料版でしばらく様子を見ます。

FlaskのWebアプリをHEROKUで公開するまでのやり方は上記のYouTube動画が参考になります。

セキュリティ

最後に必要なのがWebアプリのセキュリティです。以下のWebサイトの資料と書籍が参考になります。書籍のほうは700ページくらいのボリュームのある本で、私もすべての内容を理解したとはほど遠い状況ですが、一通りの脆弱性とその対策は理解しておく必要があります。オープンソースの脆弱性診断ソフトウェアOWASP ZAPの使い方も掲載されています。

今回開発したツールはシンプルな作りであまり脆弱性につながる機能がないのですが、一応一通りのチェックと、OWASP ZAPによる自動診断を行っています。

参考:

IPA(情報処理推進機構):安全なWebサイトの作り方&別冊「ウェブ健康診断仕様」 

安全なウェブサイトの作り方 | 情報セキュリティ | IPA 独立行政法人 情報処理推進機構
情報処理推進機構(IPA)の「安全なウェブサイトの作り方」に関する情報です。

徳丸浩(2018)体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践

ご迷惑をおかけしています!

まとめ:リスクのものさし表示ツールの開発

リスクのものさしを表示するWebアプリケーションをPythonを使って開発しました。PythonでWebアプリを作って公開するまでは「簡単」とまでは言いませんが、さまざまなツールが利用できるため、私のような非エンジニアでもなんとかなることはわかりました。

ここで紹介したたくさんのツール(Python, Atom, PyCharm, Flask, Bootstrap, jQuery, PostgreSQL, pgAdmin, Git, SourceTree, GitHub, HEROKU, OWASP ZAP)はすべて利用が「タダ!」です(一部有料版もあります)。学習も本を買ったほうがよいですが、YouTubeだけで(つまりタダで)学ぶことも可能です。スゴい時代になったものです。

コメント

タイトルとURLをコピーしました