献血者数を予測するモデルを作成して予測結果をWebサイトに掲載してみた

## はじめに

この記事では、私が初めて個人開発に取り組んだWebアプリケーションの紹介と制作過程を振り返ります。


### 制作背景
私は大学のボランティア部に所属しているのですが、献血ボランティアに参加した際、献血事業の現状を知る機会がありました。献血により提供された血液は、献血供給量が輸血需要量を超えて余ってしまった場合、保存期限を過ぎてしまうと廃棄処分となってしまいます。一方で、輸血需要量が献血供給量を上回る場合は、他県からの血液の融通が必要となります。このような状況を知り、何かできないかと考えました。
そこで私が取り組んだのは、献血者数の月次データを基に今後3か月間の献血者数の推移を予測するモデルの開発です。供給の過不足を軽減し、必要な血液量を適切に確保することに貢献できないかと思い、今回の制作に取り組みました。

## Webサイト概要
以下が今回制作したサイトになります。

献血ナビ
[https://kenketsu-navi.azurewebsite.net](https://kenketsu-navi-bvf7hwdne8gyaqav.japaneast-01.azurewebsites.net/)
GitHub
https://github.com/5522079/kenketsu-navi

### 実装機能

**献血者数の予測**
SARIMA（季節変動自己回帰移動平均）モデルを用いて月次レベルでの予測モデルを開発しました。このモデルは、時系列データの分析に使用される統計的手法の一つで、データの季節性、トレンド、および不規則な変動を考慮し、将来の値を予測するのに適しています。SARIMAモデルを用いた時系列分析は別の記事でまとめました。

https://qiita.com/5522079/items/8a6b0ceac8d81f053ca1

また、[Chart.js](https://www.chartjs.org/)を実装することで、モダンかつインタラクティブなグラフを制作しました。
![img_1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828517/cae8d09a-26f1-41c2-b04a-f7d6f913cdea.png)


**現在の献血状況**
1週間ごとに各地方の献血センターが更新している献血状況を、スクレイピングで取得し、カラーリングマップとして掲載しています。これによりサイトを訪れた人が正確な最新情報を把握できるようにしました。スケジュールトリガーでスクレイピングを行うプログラムは別の記事でまとめました。

https://qiita.com/5522079/items/8f2b4c71b65082fe1a1a

日本地図の表示には、jQueryのプラグインである[jmap](https://yugokimura.github.io/jmap/)を採用しました。

![img_2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828517/d6ec493c-cf97-1433-8143-8a057176b97c.png)
![img_3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828517/89502d71-2a88-f907-70d7-060f1196428d.png)

**数字で見る献血**
献血事業に関する統計情報を、カウントアップアニメーションを用いてインフォグラフィックとしてわかりやすく掲載しました。

![%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828517/2e7d8898-984f-400d-7bfa-ef495892ac51.gif)

### 技術スタック
| **カテゴリ** | **技術** | **選定理由** |
| --- | --- | --- |
| フロントエンド | HTML, CSS, JavaScript,jQuery | HTMLとCSSはWeb開発の基礎であると認識していて、拡張性が高いと考えたから |
| バックエンド | Python 3.9, Flask | 機械学習やデータ処理のための豊富なライブラリが揃っているため |
| インフラ | Microsoft Azure | [学割](https://azure.microsoft.com/ja-jp/free/students)が使えて手軽にクラウドサービスの学習ができるから |
| バージョン管理 | Git, GitHub | バージョン管理システムやリポジトリなど、チーム開発の基本的な知識を習得しておきたかったから |

## 振り返り

今回、授業外の取り組みとして、時系列分析を初めて一から行い、SARIMAモデルを用いて全国の献血者数の予測に挑戦しました。PDFからのデータ抽出を始め、モデル構築までの全過程を通じて、データ分析のスキルを習得する貴重な機会となりました。同時に、初めてWebサイトを制作し、Web開発の基礎スキルも学ぶことができました。

### 工夫・意識したところ

- **情報の信頼性**
    
    グラフや図の表現には特に注意を払いました。サイトを訪れた方に誤解を生じさせないよう、グラフの軸の設定や色使い、スケールの設定などを慎重に行い、データの傾向を適切に反映させるよう心掛けました。以下の画像だと縦軸の開始値が0でないため、小さな変化であっても大きな変化があるように見えてしまいます。
    
    ![%E3%80%87.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828517/c824a536-c570-f8df-1e2d-f7cecdabe626.png)
    
    予測結果の提示においても、その精度や限界について明確に説明し、過度な期待や誤った解釈を防ぐよう努めました。
    

### 詰まったところ・苦労したところ

- **データの収集**
    日本赤十字社が公開しているPDFから学習データを収集するのに苦労しました。PythonのOCRライブラリ色々を試したのですが認識率を上げることができず、画像の前処理などを行っても十分な精度が得られなかったので、最終的にAzure Vision AIのForm Recognizerを導入しました。このツールは表形式データの抽出に優れていて効率的にデータを収集できました。AIツールすごい

- **Azure Web Appsでのデプロイ**
    Azure Web Appsは、AWSなどと比べると日本語の解説や技術記事が少なく、英語の資料を参照しながら作業する必要があったため大変でした。軽い気持ちでクラウドサービスを使って勉強がてらにサーバーを立ててみようとしたら痛い目をみました。
    振り返ると、SSL/TLSの設定やCI/CDなどの概念を十分に理解せずに触れるべきではなかったかもしれません。正直今もよくわからないところの方が多く、ひとまずデプロイできたからよしという状態なので、勉強してセキュリティや性能面での改善を進めていく必要があると感じています。

### 今後の課題

- **モデルの精度向上**
    現在のモデルには改善の余地があり、精度向上が見込めると考えていてます。SARIMAモデル以外にも深層学習を用いた時系列分析にもチャレンジしてみたいです。
    
- **継続的な運営と改善**
    このプロジェクトを長期的に運営し、常に正確で価値ある情報を提供し続けていきたいと考えています。使ってもらえるサービスを作るためには、リリースして終わりではなくリリースしてからも重要だと思うので頑張って継続したいです。
    

## おわりに

今回の取り組みを通じて、実社会のデータを扱いながら問題解決に取り組む一連の流れを学ぶことができ、有意義な経験となりました。今後も更なるスキルアップを目指して精進していきたいと思います。
拙い文章ではありますが、最後まで読んでいただきありがとうございました。

## 参考にしたサイト等

https://zenn.dev/shungo_a/articles/716021eba3042c#本記事の目的

https://qiita.com/tk-tatsuro/items/16ce74fc954b5a58df00

https://qiita.com/iwasan06/items/d75d24d10f16965ea04d