プレイデータ公開
記載日:2025/03/04
記載者:奥田真 (2025年卒業予定 M2)
記載の対象バージョン:v1.0.0
概要
ここはHanabiアプリで得られたデータセットについて説明するページです.
Hanabiアプリ研究そのもの,このデータがどのように集められたか,分析事例については以下を参照してください.
データセットはHanabiアプリ研究を改良したい,
またはデータを利用して新しいHanabiのAIを作ろうとする人にとって有用かもしれません.
公開データセット
データはSQLiteファイルで公開しています.以下からダウンロード可能です.
v1.0.0 (2025/03/03) SQLite
ER図

userテーブル:ユーザ情報
実験に参加したユーザの情報がここに記されます.
なお,ユーザが公開したデータを見て自分のプレイデータが識別できないよう,
ユーザ名など一部の項目は実験で実際に用いられたものにはなっていないことに注意してください.
- id
ユーザID.実験参加を辞退するなどしたユーザは除外されているため,
連番ではないことに注意してください.
- username
識別用に命名したユーザ名.実験終了後にPL〇〇の形式で,
〇〇の部分は連番になるよう割り振り直したもので,
実際に用いられたものにはなっていないことに注意してください.
- password_hash
ログインに用いられたパスワード(暗号化済).
こちらも実際に用いられたものとは異なる意味のない文字列に置換されています.
- consent
そのユーザが実験参加にあたる実験説明に同意したかどうか.
- pre_survey
そのユーザが事前アンケートに回答したかどうか.
- total_play_time
そのユーザの総ゲームプレイ時間.
- total_game_play_num
そのユーザの総ゲームプレイ回数.
pre_surveyテーブル:事前アンケート
ゲームプレイ開始前に,ボードゲームのプレイ経験などを問うアンケートを実施しました.その結果をここに記しています.
- id
ただの行番号以上の意味はありません.
- user_id
回答したユーザのユーザID.
- question_id
質問ID.
- answer_id
回答ID.
質問IDと回答IDの組み合わせは以下の通りです.
実験参加について
- あなたは本実験が対面の場合でも参加してくれていましたか? [participate_real]
- 参加しない理由はなぜですか? [reason_no_participate_real] ([participate_real] = "no" の場合)
- 時間がないから [time]
- 現地に集まるのが面倒だから [troublesome]
- その他 [other]
- その他の場合,理由を具体的に教えてください(特になければ「なし」と記入してください) [reason_no_participate_real_other] ([reason_no_participate_real] = "other" の場合)
ゲーム経験について
- ボードゲームやカードゲーム全般にどのくらい経験がありますか? [exp_bg]
- 全く経験がない [no_exp]
- あまり経験がない [little_exp]
- どちらともいえない [neutral]
- ある程度経験がある [some_exp]
- 非常に豊富な経験がある [high_exp]
- ゲーム「Hanabi」の経験はありますか? [exp_hanabi] ([exp_bg] ≠ "no_exp" の場合)
- 未プレイ [no_play]
- 1-10回 [play_1_10]
- 10-30回 [play_10_30]
- 30-50回 [play_30_50]
- 50回以上 [play_50_up]
- 最後にHanabiをプレイしたのはいつですか? [last_play_hanabi] ([exp_hanabi] ≠ "no_play" の場合)
- 覚えていない [no_memory]
- 1年以上前 [over_year]
- 3か月から1年前 [three_months_year]
- 3か月以内 [within_three]
- あなたのHanabi(25点満点)の平均スコアは? [score_hanabi] ([exp_hanabi] ≠ "no_play" の場合)
- 覚えていない [no_memory]
- 5点以下 [5_below]
- 6-10点 [6_10]
- 11-15点 [11_15]
- 16-20点 [16_20]
- 21点以上 [21_up]
participantテーブル:ゲームに参加したプレイヤの情報
分析の際はこのテーブルの扱いに注意してください.サーバ上で1ゲーム実施されるたび,
そのゲームのゲームIDと参加したユーザのユーザIDがプレイ人数ぶんの行数記録されます.
これは将来的により多くの人数のプレイを想定した設計になっているためですが,
v1.0.0では2人プレイのゲームしか記録されませんので,1ゲームあたり2行ずつ追加されていきます.
ER図にあるように,userテーブルとgame_infoテーブルとは1対多の関係にあります.
特定ユーザが参加したゲーム群を取得するには,このテーブルからゲームIDのリストを取得し,
それとgame_infoテーブルのidと照らし合わせて参照する必要があります.
なお,AIのuser_idは負の値が割り振られており,v1.0.0ではベースラインのAI「Alpha」が-1で,
比較のための工夫アリのAI「Beta」が-2です.
- id
ただの行番号以上の意味はなく,ほかテーブルとの参照の際にキーにはなりません.
- game_id
サーバ上で実施されたゲームのゲームID.game_infoテーブルのIDに対応します.
- user_id
そのゲームに参加したユーザのユーザID.
game_infoテーブル:ゲーム情報
ゲームごとの情報が記録されています.一手ごとの情報はplay_logテーブルに記載されています.
- id
そのゲームのゲームID.
- start_time
ゲーム開始時間 (JST).
- start_time_unix
ゲーム開始時間(UNIX).
- end_time
ゲーム終了時間 (JST).
- end_time_unix
ゲーム終了時間(UNIX).
- play_time
そのゲームにかかった時間[秒].
- number_of_players
プレイ人数.
- turn_order
プレイ順の情報.プレイヤIDと呼びます.
- JSONで「{"プレイヤID(0, 1, 2, ... )": "ユーザID", ...}」という形式で記録されます.
- スタートプレイヤがユーザID15のユーザ,次がユーザID-1のユーザの場合 (AI Alpha)⇒「{"0": "15", "1": "-1"}」
- final_score
最終獲得得点.
- final_turns
最終ターン数.
- final_hint_tokens
最終ヒントトークン数.
- final_miss_tokens
最終ミストークン数.
- max_hint_tokens
最大ヒントトークン数.v1.0.0ではすべてが8個.
- max_miss_tokens
最大ミストークン数.v1.0.0ではすべてが8個.
- turn_time_limit
一手の時間制限[秒].
- deck
そのゲームの山札枚数.
- seed
乱数のシード値(初期山札および手札の配布,AIルーチン内のランダムな意思決定に用いられます.)
- game_end_reason
3つあるゲーム終了理由.
- END_EXTRA_TURNS:山札の最後の1 枚のカードが引かれた後,この手番を除き,最後のカードを引いたプレイヤも含めた全プレイヤが1 回ずつ手番を完了した場合.
- 3OUT:ミストークン数を3つ失った場合.
- PERFECT:場に5 色すべての花火が完成した場合.
- 切断扱いのゲームが9ゲームありましたが,除外しています.
play_logテーブル:プレイログ
手番ごとの情報を記録しています.
- id
ただの行番号以上の意味はなく,ほかテーブルとの参照の際にキーにはなりません.手番の数は別項目に記録しています.
- game_id
どのゲームIDの手番ごとの情報を示すか.
- turn
経過手番数.1スタートです.
- hints
ヒントトークンの数.
- miss
ミストークンの数.
- deck_size
山札枚数.
- discard_b
青の捨て山内訳.
- 初期状態を0-0-0-0-0,全青カードが捨てられた状態を3-2-2-2-1と表現.
- 例:B1,B1,B5が捨てられた場合,2-0-0-0-1と表現.
- discard_g
緑の捨て山内訳.
- discard_r
赤の捨て山内訳.
- discard_w
白の捨て山内訳.
- discard_y
黄の捨て山内訳.
- fireworks_b
場に出て完成してる青色の花火の最大値.
- fireworks_g
場に出て完成してる緑色の花火の最大値.
- fireworks_r
場に出て完成してる赤色の花火の最大値.
- fireworks_w
場に出て完成してる白色の花火の最大値.
- fireworks_y
場に出て完成してる黄色の花火の最大値.
- hand_pid
各プレイヤの手札の内訳.
- 例:白1,青3,赤1,緑4,白3の場合,W1-B3-R1-G4-W3と表現.
- 色+数字でカードを表し,左から1,2,3,4,5枚目の手札を示す.
- これをプレイヤIDごとJSONで記載.プレイヤIDはgame_infoテーブルの turn_orderを参照.
- 例:{"0": "Y1-R5-B4-R3-R1", "1": "R3-Y4-R4-B1-W3"}
- hint_pid
各プレイヤのヒント状況の内訳.
- N0-N0-N0-N0-N0は初期状態で,ヒントがないことを示す.
- 色についてヒントが出ていない状態をNと表現.
- 数字についてヒントが出ていない状態を0と表現.
- 左から1,2,3,4,5枚目の手札を示す.
- 例:3枚目の手札に対して数字が2であることをヒントした場合,N0-N0-N2-N0-N0
- 例:1,2枚目の手札に対して色が赤であることをヒントした場合はR0-R0-N0-N0-N0
- current_pid
その手番を実行しているプレイヤを示す.プレイヤIDで記載.プレイヤIDはgame_infoテーブルの turn_orderを参照.
- turn_perform_unixtime
アクションを実施した時間 (UNIX)
- turn_perform_time
アクションを実施した時間 (JST)
- think_time
思考時間[秒]
- action_type
アクションの種類.
- PLAY:カードをプレイ
- DISCARD:カードを捨てる
- REVEAL_RANK:数字のヒントを出す
- REVEAL_COLOR:色のヒントを出す
- action
アクションの詳細情報.
- 詳細は以下「actionの定義」を参照してください.
- num_of_valid_actions
合法手の数.
- score_per_turn
その手番の得点.
- timeout
一手の制限時間に到達し,ランダムな行動をとったかどうか.
actionの定義
- action_type
以下4択のうちいずれか.
- PLAY:カードをプレイ
- DISCARD:カードを捨てる
- REVEAL_RANK:数字のヒントを出す
- REVEAL_COLOR:色のヒントを出す
- action_typeがPLAYのとき
- hand_index:自分の手札の左から何番目をプレイしたか.0スタート.
- card:プレイしたカードはなんだったか.青の4であればB4と記録.
- is_success:プレイに成功したか否か.
- action_typeがDISCARDのとき
- hand_index:自分の手札の左から何番目を捨てたか.0スタート.
- card:捨てたカードはなんだったか.青の4であればB4と記録.
- action_typeがREVEAL_RANKのとき
- target_pid:ヒント対象(ターゲット)のプレイヤID.
-
target_hand_index:ターゲットの手札の左から何番目にヒントを出したか.
0スタート.複数枚にヒントを出した場合,0-1-4といった具合に記載.
(手札の0,1,4番目にヒントを出す)
- rank:なんの数字のヒントを出したか.
- action_typeがREVEAL_COLORのとき
- target_pid:ヒント対象(ターゲット)のプレイヤID.
-
target_hand_index:ターゲットの手札の左から何番目にヒントを出したか.
0スタート.複数枚にヒントを出した場合,0-1-4といった具合に記載.
(手札の0,1,4番目にヒントを出す)
- color:何色のヒントを出したか.["B", "G", "R", "W", "Y"]のどれか.
game_surveyテーブル:ゲームごとアンケート
ゲーム終了ごと実施されたアンケートの結果を記録しています.
- 今回のゲームは楽しかったですか? [game_enjoyment]
- 全く楽しくなかった [not_enjoyable]
- あまり楽しくなかった [little_enjoyable]
- どちらともいえない [neutral]
- ある程度楽しかった [some_enjoyable]
- 非常に楽しかった [very_enjoyable]
- このAIの出すヒントは有益でしたか? [useful_ai_hint]
- 全く有益ではなかった [not_useful]
- あまり有益ではなかった [little_useful]
- どちらともいえない [neutral]
- ある程度有益だった [some_useful]
- 非常に有益だった [very_useful]
- 自分の出したヒントを十分に理解して役立ててくれましたか? [understanding_my_hint]
- 全く役立ててくれなかった [not_helpful]
- あまり役立ててくれなかった [little_helpful]
- どちらともいえない [neutral]
- ある程度役立ててくれた [some_helpful]
- 十分に役立ててくれた [very_helpful]
- このAIと次にゲームをプレイしたとき,さらにスコアを伸ばせそうですか? [next_potential]
- 全く伸ばせそうにない [not_possible]
- あまり伸ばせそうにない [little_possible]
- どちらともいえない [neutral]
- ある程度伸ばせそう [some_possible]
- 非常に伸ばせそう [very_possible]
- このAIの挙動は読めましたか? [ai_behavior_understanding]
- 全く読めなかった [not_understood]
- あまり読めなかった [little_understood]
- どちらともいえない [neutral]
- ある程度読めた [some_understood]
- 非常によく読めた [very_understood]
- (6回目のゲーム終了時1度だけ実施)アプリのインターフェース(UI)の操作性はどう感じましたか? [ui_usability]
- 非常に使いにくい [very_difficult]
- やや使いにくい [difficult]
- どちらともいえない [neutral]
- やや使いやすい [easy]
- 非常に使いやすい [very_easy]
- (6回目のゲーム終了時1度だけ実施)あなたはここまでのゲーム中,集中力は維持できましたか? [attention_maintenance]
- 全く維持できなかった [not_maintained]
- あまり維持できなかった [somewhat_not_maintained]
- どちらともいえない [neutral]
- ある程度維持できた [somewhat_maintained]
- 完全に維持できた [fully_maintained]
- アプリに改善してほしい点があれば自由に記入してください(AI以外。特になければ「なし」と記入ください。) [app_improvement]
簡単なガイド
SQLiteは良書やインターネット上に情報源も多いので,
基本はご自身の目的に応じて手段やソフトを調べていただく形になりますが,
ここではその調べるための情報やデータセットを読み込む一例について記します.
SQLiteとは
SQLiteはオープンソースで軽量のRDBMS
(Relational Database Management System:リレーショナルデータベース管理システム)です.
RDBMSは簡単に言うと,エクセルのシートが複数入ったファイルです.
SQLというDBを操作するための言語を用いて各テーブルの作成・更新・削除などが可能です.
SQLを用いたデータ操作については一度覚えてしまえば,
SQLite以外のDBでも利用可能なのでこれを機に学んでしまう手もあります.(そんなに難しくありません)
扱うための手段・ソフトもいろんなものが存在します.
データを読み込むだけであれば,既存のDBビュアー(DB Browser, DBeaverなど)がありますのでこれがお手軽です.
VSCodeでも拡張機能を導入することで閲覧が可能です.
閲覧以上のこと(条件抽出やDBの構造変更)は種々の言語やツールで可能です.
Pythonので一手の思考時間を扱う例を
コチラ
に添付します.
Pythonやパッケージのバージョン,説明についてはノートブック内に記載していますのでそちらをご覧ください.
なお,コードはあくまで一例であり,最善なものとは限らないことに注意してください.
バージョン管理
ざっくりと以下の運用で,セマンティックバージョニングで行っています.
新バージョンのDBを公開した場合,本ページ一番上の「記載の対象バージョン」を変更し変更部分説明を更新していますので,
過去のバージョンを見たい場合はコチラ(今後追加予定)から見てください.
vX.Y.Z
- X:後方互換性なし変更.研究テーマ,担当者,DB構造が変わったなど
- Y:後方互換性あり変更.実験1回ぶんのデータ追加など,大きめの変更.
- Z:後方互換性あり変更.バグ修正など小さめの変更.