ロト6予測ツール - メイン画面

プロジェクト概要

過去のロト6抽選データを分析し、機械学習アルゴリズムを用いて次回の当選番号を予測するWebアプリケーションです。2つの異なる予測モデルを実装し、結果を比較表示することで、多角的な予測を提供します。

開発目的

  • 機械学習を活用した実践的なデータ分析スキルの習得
  • 複数の予測モデルの実装と比較検証
  • モダンなWebアプリケーション開発

使用技術

プログラミング言語

Python 3.x HTML5 CSS3 JavaScript

バックエンド

Flask 3.0.3 scikit-learn 1.7.1 pandas 2.3.1 NumPy 2.3.2 Selenium 4.34.2 webdriver-manager 4.0.2

Selenium: WebブラウザでのXPath要素取得によるデータ自動収集
webdriver-manager: ChromeDriverの自動管理

フロントエンド

Vanilla JavaScript CSS Grid/Flexbox CSS Animations

主な機能

1. 2つの予測モデルによる比較分析

モデルA: 確率モデル(ロジスティック回帰)

  • 過去の出現パターンを統計的に分析
  • 特徴量: 直近出現回数、累計出現数、経過回数など10種類
  • クラス不均衡対策として class_weight="balanced" を適用

モデルB: RandomForestモデル

  • アンサンブル学習による高精度予測
  • 複雑なパターン・非線形関係の学習
  • 特徴量重要度の可視化が可能

2. 自動データ収集機能

  • SeleniumによるWebブラウザ自動操作
  • XPathを使った要素取得による過去の抽選結果の自動収集
  • みずほ銀行公式サイトから複数URLを巡回してデータ取得
  • 取得データのCSV形式での保存

3. モダンなUI/UX

  • グラデーション背景による視覚的に魅力的なデザイン
  • ボールのバウンスアニメーション効果
  • 予測計算中のローディング表示
  • レスポンシブデザイン(PC・タブレット・スマートフォン対応)

4. 予測結果の視覚化

  • 本数字6個とボーナス数字を直感的に表示
  • 2つのモデルの予測結果を並列比較
  • ボール形式での見やすい表示

システム構成

データフロー

公式サイト
↓ Selenium XPath取得
collect_loto6.py(データ収集)
↓ CSV出力
loto6_results.csv
↓ データ読込
予測モデルA・B(学習・推論)
Flask(結果表示)
index.html(ブラウザ表示)

工夫した点

1. 機械学習モデルの工夫

  • クラス不均衡対策: 出現しない数字が圧倒的に多いため、class_weightで調整
  • 特徴量エンジニアリング: 10種類の独自特徴量を設計
    • 直近5回/10回の出現回数
    • 累計出現回数
    • 最終出現からの経過回数
    • ボーナス数字としての出現傾向
    • 時間トレンド

2. フォールバック機能

  • scikit-learnが利用できない環境でもヒューリスティック手法で動作
  • データ不足時の自動切り替え

3. UX/UIデザイン

  • 非同期処理: 予測計算中もUIが固まらない設計
  • 視覚フィードバック: ローディングアニメーションで待機時間を退屈させない
  • 色分け: 本数字(金色)とボーナス数字(青色)を明確に区別

4. 保守性・拡張性

  • 型ヒント(Type Hints)による可読性向上
  • 関数の単一責任原則(SRP)に基づいた設計
  • CSV形式の柔軟な対応(複数ヘッダー形式に対応)

特徴量設計の詳細

各数字(1~43)について以下の特徴量を抽出:

特徴量 説明 目的
recent5_cnt 直近5回での出現回数 短期トレンド
recent10_cnt 直近10回での出現回数 中期トレンド
cumulative_cnt 累計出現回数 長期的な出現頻度
last_draw_flag 前回出現したか 連続出現傾向
recent5_bonus_cnt 直近5回でボーナス出現 ボーナス短期傾向
recent10_bonus_cnt 直近10回でボーナス出現 ボーナス中期傾向
cumulative_bonus_cnt ボーナス累計出現 ボーナス長期傾向
gap_main 最終出現からの経過回数 Recency効果
gap_bonus ボーナス最終出現からの経過 ボーナスRecency
time_trend 時間的トレンド(正規化) 経年変化

技術的ハイライト

1. 複数モデルの並列実行

# 2つのモデルを同時に実行し結果を比較
prob_main, prob_bonus = predict_probabilities(draws_main, draws_bonus)
a_main_numbers, a_bonus_number = pick_numbers(prob_main, prob_bonus)

b_main_numbers, b_bonus_number = run_been_model("loto6_results.csv", time_to_predict=next_time)

2. 柔軟なCSV読み込み

# 複数の異なるヘッダー形式に対応
# 例: "数字1", "num_1", "当選番号1" など

3. エラーハンドリング

try:
    # メインロジック
except Exception as e:
    # フォールバック処理
    context["error"] = f"エラー: {e}"

開発情報

開発形態

個人開発

役割

企画・設計・実装・テスト

開発時の注意事項

本プロジェクトは教育・学習目的で開発しました。開発および使用にあたり、以下の点に配慮しています。

データ収集における配慮

  • 公開データのみを使用し、みずほ銀行公式サイトの利用規約を遵守
  • 適切な待機時間(sleep)を設定し、サーバーへの負荷を最小限に抑制
  • 過度なアクセスを避け、必要最小限のデータ取得に留める
  • 取得したデータは個人的な学習目的にのみ使用

予測システムの位置づけ

  • 機械学習技術の学習・検証を目的とした実験的プロジェクト
  • 予測結果は統計的な分析に基づくものであり、確実性を保証するものではない
  • 本システムを商用利用や実際の購入判断には使用していない
  • ギャンブル依存症への配慮から、あくまで技術研究の範囲内で運用

倫理的配慮

  • 本ツールはポートフォリオとしての技術紹介を目的としている
  • オープンソースとして公開せず、悪用防止に配慮
  • 教育目的の範囲を超えた利用を推奨しない立場を明示

謝辞

  • データ提供: みずほ銀行ロト6公式サイト
  • 機械学習ライブラリ: scikit-learn開発チーム
  • Webフレームワーク: Flask開発チーム
  • ブラウザ自動操作: Seleniumプロジェクト

デモ動画

実際の動作をご覧いただけます。予測モデルの動作や画面の使い方をわかりやすく紹介しています。