SNS 使いすぎをサイのキャラクターが通知・応援する、スマホ習慣改善アプリです。
lib/services/analytics_service.dart にすべての分析ロジックが集約されています。
過去 30 日分の 1 日ごとの使用時間データをもとに、以下の 7 つの分析を実行します。
| 分析 | 内容 |
|---|---|
| 記述統計 | 平均・中央値・標準偏差・最大/最小 |
| トレンド分析 | 線形回帰 + 7 日移動平均 |
| 曜日別パターン | 曜日ごとの平均使用時間・休日効果 |
| 時間帯別パターン | 朝/昼/夜/深夜の合計・ピーク時刻 |
| 異常値検出 | Z スコア法(|z| > 2.0)で「使いすぎた日」を抽出 |
| セッション分析 | 1 日の起動回数・1 回あたりの使用時間・使い方タイプ判定 |
| スマホ習慣スコア | 上記を統合した 0〜100 点のスコア(後述) |
100 点スタートの減点・加点方式です(_computeHealthScore() で実装)。
| 状態 | 例(制限 60 分) | 減点 |
|---|---|---|
| 制限内 | 平均 60 分 | 0 |
| 1.5 倍 | 平均 90 分 | −15 |
| 2 倍以上 | 平均 120 分以上 | −30(上限) |
線形回帰の傾き slope(分/日)を利用します。
毎日 2 分ずつ増加していれば −20 点(上限)。逆に毎日 2 分ずつ減少していれば +10 点。
日によって使い方が乱高下しているほどスコアが下がります。
| タイプ | 判定条件 | 減点 |
|---|---|---|
binge(長時間集中型) |
1 回の平均使用 > 30 分 かつ 起動回数が少ない | −15 |
frequent(頻繁開閉型) |
1 日の起動回数 > 10 回 | −10 |
balance |
上記以外 | 0 |
グラフには 3 つのレイヤーがあります。
| 表示 | 何を描画しているか | 算出方法 |
|---|---|---|
| 薄い点線(日ごとの記録) | 実測値そのまま | — |
| 太い金色の線(週間の流れ) | 7 日移動平均 | 直近 7 日の単純平均を各日に計算 |
| 赤い点線(目標ライン) | ユーザー設定の制限時間 | — |
「増えている / 減っている / 安定」の判定と「明日の予測: XX 分」は、
OLS(最小二乗法)線形回帰 の傾き slope と外挿値を使っています。
傾きの絶対値が 0.3 分/日 未満なら「安定」、それ以上なら増加 or 減少と判定します。
lib/
├── main.dart # アプリエントリ・BottomNavigation
├── constants/app_constants.dart # カラー・対象アプリ定義
├── models/app_usage.dart # データモデル群
├── providers/app_providers.dart # Riverpod プロバイダー
├── services/
│ ├── analytics_service.dart # 統計分析エンジン(コア)
│ ├── notification_service.dart
│ ├── sound_service.dart
│ └── usage_stats_service.dart
└── screens/
├── home_screen.dart
├── analysis_screen.dart # 分析 UI
├── ranking_screen.dart
└── settings_screen.dart
flutter pub get
flutter runAndroid で実際の使用時間データを取得するには PACKAGE_USAGE_STATS 権限が必要です。
設定アプリ → 「使用状況へのアクセス」からアプリを許可してください。