論文:Excelで知る数学の世界 タイトル画像

📝概要

小2の九九を“自動生成して学べる”Excel×VBAツールの制作記録です。
問題作成・答え合わせ・誤答分析までを一つにまとめ、子どもの理解を見える化した実践を紹介しています。

⚙️ツール

📥ツールのダウンロード

ツールは下記ページからダウンロードすることができます。
noteへ
なお、こちらからダウンロードできるExcelファイルには、ブックの保護とシートの保護をかけています。
ブックの保護を解除し非表示シートを表示したり、仕組みを見るためにシートの保護を解除する場合は、下記パスワードを使用します。
パスワード:math1234

📝ツールの概要

小2の九九を自分で作って学べるExcelツールの実践例です。
子どもが迷わず操作できるUI/UXを軸に、問題作成から誤答分析までを一つにまとめました。
児童が触るのは、てびきシート、もんだいシート、ランキングシートです。
非表示シートとして、解答シート、分析シート、設定シートがあります。

🎯ツールの目的と背景

小学校2年生の九九学習では、ただ暗記するだけでなく、 「自分で問題を作り、解き、振り返る」 という一連の流れが、理解の定着に大きく影響します。 しかし、紙のプリントでは問題作成や誤答分析に時間がかかり、 子ども自身が学びをコントロールすることが難しい場面もあります。
そこで、このツールでは Excel × VBA を活かし、 子どもが 自分で段を選び、問題数を決め、順番を指定して問題を生成できる 仕組みを作りました。 操作はシンプルで、UI/UXの工夫により、 小学生でも迷わず「自分で学びを進める」体験ができるよう設計しています。
さらに、正誤判定や誤答の集計を自動化することで、 どの段が苦手なのか、どこでつまずいているのか がすぐに可視化され、 先生や保護者はもちろん、子ども自身も学習の振り返りがしやすくなります。
このツールは、 「学習の主体性」 と 「理解の可視化」 を両立させるための実践例であり、 Excelが算数教育において“体験的な学び”を支える可能性を示しています。

🧩機能紹介

● 問題作成(段の選択・問題数・順番)
子どもが自分で条件を選ぶことで、学習の主体性が育つ。

● 答え合わせ(自動判定)
正誤がすぐにわかり、学習のテンポが崩れない。

● 誤答分析(弱点の可視化)
どの段が苦手かを自動で集計し、次の学習につなげられる。

📘実際の授業・家庭学習での使い方

  • 子どもが自分で問題を作って楽しむ
  • 苦手な段が見えることで学習が前向きになる
  • 先生や保護者が“どこでつまずいているか”を把握しやすい

💡まとめ

  • Excelは“算数・数学を体験する学び”を作ることができる
  • UI/UXの工夫で子どもが自立して学ぶことができる
  • 今後の教材開発にも応用可能

ここからはデザインの工夫やツールの紹介をします。

🧾このツールの仕様

シート構成は下記
・てびきシート
・もんだいシート
・ランキングシート
・解答シート
・分析シート
・設定シート

🧾てびきシート|子どもが迷わず設定できるUI

てびきシートとは

九九の問題を作る前に、 「どの段をつくる?」「何問つくる?」「順番はどうする?」 を子ども自身が選べるようにした、操作ガイド兼設定画面です。
小学生でも迷わず進められるよう、流れを4ステップに整理しています。

🧾UI/UXデザインの工夫


①〜④の番号で“やることの順番”が一目でわかる
子どもの視線が自然に上から下へ流れるように設計。
選択肢をグループ化して迷わない構造
九九の段は3列に整列し、どれを選んだかがすぐに把握できる。
余白を広くとり、情報量を最適化
小学生が読む前提で、文字量・行間・配置を丁寧に調整。
青いボタンで“次の行動”が明確
「もんだいをつくる」ボタンを視認性の高い色で統一し、 行動の迷いをなくす。

🧾教育的意義

自分で条件を選ぶことで、学習の主体性が育つ
“与えられた問題を解く”だけでなく、 “自分で問題を作る”という体験が学びの質を高める。
問題作成のプロセスが理解の整理につながる
どの段を選ぶか考えることで、九九の構造を自然に意識できる。
操作が簡単だから、学習のテンポが途切れない
UIの迷いがないことで、学習そのものに集中できる。

🧾もんだいシート|即時フィードバックで理解を深める

もんだいシートとは

子どもが自分で作った九九の問題を、 その場で答え合わせできる学習シートです。
入力した答えに対して、正解・不正解がすぐに表示され、 学習のテンポを崩さずに取り組めるように設計しています。

こたえ欄は「日本語入力」を無効にする設定を入れています。また、数字の1~100までしか入れることができないようになっています。
つまり、誤入力がしづらい設計になっているのです。

解答をすべて入力し終わったら答え合わせをします。
正解すると、問題番号が緑色になり、「この下に 「せいかい」か 「ざんねん」かが でてくるよ」の欄に正解の文字列がランダムで表示されます。
不正解だと、問題番号が赤色になり、「この下に 「せいかい」か 「ざんねん」かが でてくるよ」の欄に不正解の文字列がランダムで表示されます。

大きなボタンで操作が迷わない
「こたえあわせをする」ボタンを大きく配置し、 小学生でも直感的に次の行動がわかるようにしています。
1行ごとに“問題 → 答え → 結果”が完結
視線の流れが自然で、どこを見ればいいか迷わない構造。
フィードバックがやさしい言葉で返ってくる
「せいかい」「ざんねん」など、 子どもが前向きに取り組める表現を採用。

余白を広くとり、見やすさを最優先
小さな画面でも読みやすく、ストレスなく学習できる。

🧾教育的意義

即時フィードバックで理解が深まる
答えを入力してすぐ結果がわかるため、 正しい九九のイメージが定着しやすい。
誤答の気づきが次の学習につながる
どの段で間違えたかが明確になり、 苦手の把握と克服に役立つ。
自分で作った問題だから学習意欲が高まる
“自分で選んだ問題を解く”という体験が、 主体的な学びを自然に引き出す。

🧾ランキングシート|得意・苦手を見える化

ランキングシートとは


もんだいシートで答えた結果をもとに、 「どの段が得意か・どの段が苦手か」 を自動でランキング表示するシートです。
正答率の高い段は「すごい!!」、 もう少し練習が必要な段は「がんばろう!」として、 子どもが前向きに学べるように工夫しています。
ランキングの部分は分析シートと連動しており、分析シートの正解率がランキングシートのランキングに反映されます。
ただし、問題を解き直した際には反映されません。

🧾UI/UXデザインの工夫

得意・苦手を“2つの枠”で直感的に表示
色と見出しでグループ化し、子どもでも一目で理解できる。
ランキングを3位までに絞って見やすく
情報を最小限に整理し、視線の負担を減らす。
データ表は縦横の整列で読みやすく
日付・段・正答数が整然と並び、先生や保護者も分析しやすい。
余白を広くとり、数字が苦手な子でも安心
“ぎゅうぎゅう感”をなくし、落ち着いて見られるデザイン。

🧾教育的意義

苦手の可視化で、次の学習が明確になる
どの段を優先して練習すべきかが一目でわかる。
成功体験を強調して学習意欲を高める
「すごい!!」の枠に入ることで、子どもが自信を持つことができる。
データを蓄積して成長を見える化
日ごとの記録が残るため、 “できるようになってきた”変化を親子で共有できる。
先生・保護者の指導が効率化
どの段でつまずいているかが明確なので、 ピンポイントで声かけや補助ができる。

🧾その他のシート

🧾解答シート


問題番号、問題、解答、段を管理しています。 解答は答え合わせをする際に、段は分析をする際に役立てます。

🧾分析シート


こちらは正解率を管理しているシートです。
各段ごとの正解率を出しています。

🧾設定シート<


設定シートではてびきシートで選択されたものや、再解答判定、正解時や不正解時の表示文字列を管理しています。
表示文字列はいくつでも指定でき、ここで指定したものが答え合わせの際にランダムで表示されます。

ここからはVBAのコードの紹介をします。

💻VBAのプログラムの構成

下記モジュールで構成されています。
①共通定数モジュール
②出題モジュール
③解答(答え合わせ)と分析モジュール

💻共通定数モジュール

💻コード


                        
Option Explicit

'シート名
Public Const SHEET_NAME_QES = "もんだい"
Public Const SHEET_NAME_ANS = "解答"
Public Const SHEET_NAME_SET = "設定"
Public Const SHEET_NAME_RANK = "ランキング"
Public Const SHEET_NAME_ANALYSIS = "分析"

Public Const PW = "math1234"

💡説明

最近、私がプログラムを組む傾向としては、共通の定数は定数モジュールにおき、それを呼び出す形を取っています。
定数名はすべて大文字で記述するという暗黙のルールがあります。
定数名が変わっても容易に変更できるというメリットがあります。

💻問題作成モジュール

コードの流れ

💻コード


                        
Option Explicit

Sub makeQes()
    
'【変数の宣言】
    Dim wb           As Workbook  'このファイル
    Dim wsQes        As Worksheet 'もんだいシート
    Dim wsAns        As Worksheet '解答シート
    Dim wsSet        As Worksheet '設定シート
    Dim ArrQes()     As String    '問題
    Dim ArrAns()     As Long      '解答
    Dim ArrNum()     As Long      '段
    Dim cntArr       As Long      '問題と解答のデータ数
    Dim boolChoice() As Boolean   '選択状況
    Dim cntBool      As Long      '選択状況でTrueの数
    Dim selectNumber As Long      '作成する問題 セレクトナンバー
    Dim numQes       As Long      '作成する問題数
    Dim makeOrder    As Long      '作成順番
    Dim outputQes()  As String    '出力する問題の順番
    Dim outputAns()  As Long      '出力する解答の順番
    Dim outputNum()  As Long      '出力する段
    Dim i            As Long      'カウンタ変数
    Dim j            As Long      'カウンタ変数
    Dim bool         As Boolean   '判定変数
    Dim aRnd         As Long      '乱数
    Dim low          As Long      '出力行
    
    
'【動作】
    '動作が速くなるコード
    With Application
        .ScreenUpdating = False            '画面遷移→しない
        .EnableEvents = False              'イベントの発生→しない
        .Calculation = xlCalculationManual '再計算→手動
        .Cursor = xlWait                   'カーソル→ウェイト
        .DisplayAlerts = False             '確認ダイアログボックスの表示→なし
    End With
    
    'このファイルとシートを変数格納
    Set wb = ThisWorkbook                   'このファイル
    With wb
        Set wsQes = .Sheets(SHEET_NAME_QES) 'もんだいシート
        Set wsAns = .Sheets(SHEET_NAME_ANS) '解答シート
        Set wsSet = .Sheets(SHEET_NAME_SET) '設定シート
    End With
    
    '設定シート
    With wsSet
        '段の選択状況で1つでもTRUEがないときはマクロを終了する
        '合わせて、選択状況のTrueとFalseを格納する
        bool = False
        ReDim boolChoice(8)
        cntBool = 0
        For i = 3 To 11
            If .Range("C" & i).Value = True Then
                bool = True
                boolChoice(i - 3) = True
                cntBool = cntBool + 1
            Else
                boolChoice(i - 3) = False
            End If
        Next i
        
        If bool = False Then
            'もとに戻すコード
            With Application
                .ScreenUpdating = True                '画面遷移→する
                .EnableEvents = True                  'イベントの発生→あり
                .Calculation = xlCalculationAutomatic '再計算→自動
                .Cursor = xlDefault                   'カーソル→動かす
                .DisplayAlerts = True                 '確認ダイアログボックスの表示→あり
            End With
            
            MsgBox "①の つくる だんに チェックを 入れてね"
            Exit Sub
        End If
        
        'セレクトナンバーから作成する問題数を変数に代入する
        selectNumber = .Range("E3").Value
        Select Case selectNumber
            Case 1
                numQes = cntBool * 9
            
            Case 2
                numQes = 5
            
            Case 3
                numQes = 10
            
            Case 4
                numQes = 20
            
            Case 5
                numQes = 30
            
            Case 6
                numQes = 50
            
        End Select
        
        '作成順番を変数に代入
        '1→順番通り、2→ランダム
        makeOrder = .Range("G3").Value
        
        '再解答判定をTrueにする
        .Range("J3").Value = True
    End With
    
    'かけ算の問題と解答を配列に代入
    cntArr = 0
    For i = 0 To 8
        If boolChoice(i) = True Then
            For j = 1 To 9
                ReDim Preserve ArrQes(cntArr)
                ReDim Preserve ArrAns(cntArr)
                ReDim Preserve ArrNum(cntArr)
                ArrQes(cntArr) = (i + 1) & " × " & j
                ArrAns(cntArr) = (i + 1) * j
                ArrNum(cntArr) = i + 1
                cntArr = cntArr + 1
            Next j
        End If
    Next i
    cntArr = cntArr - 1
    
    '出力問題と解答の配列を宣言
    ReDim outputQes(numQes - 1)
    ReDim outputAns(numQes - 1)
    ReDim outputNum(numQes - 1)
    
    '順番に出力するとき
    If makeOrder = 1 Then
        For i = 0 To numQes - 1
            outputQes(i) = ArrQes(i)
            outputAns(i) = ArrAns(i)
            outputNum(i) = ArrNum(i)
        Next i
    
    'ランダムに出力するとき
    Else
        For i = 0 To numQes - 1
            'ランダムの数値をリセットする
            Randomize
            'ランダムな整数をaRndに代入する
            aRnd = Int(Rnd() * (cntArr + 1))
            
            '問題と解答を配列に出力用の配列に代入する
            outputQes(i) = ArrQes(aRnd)
            outputAns(i) = ArrAns(aRnd)
            outputNum(i) = ArrNum(aRnd)
            
            '使用した配列番号の配列を削除し整理する
            For j = aRnd To UBound(ArrQes) - 1
                ArrQes(j) = ArrQes(j + 1)
            Next j
            If cntArr > 0 Then
                ReDim Preserve ArrQes(cntArr - 1)
            End If
            
            For j = aRnd To UBound(ArrAns) - 1
                ArrAns(j) = ArrAns(j + 1)
            Next j
            If cntArr > 0 Then
                ReDim Preserve ArrAns(cntArr - 1)
            End If
            
            For j = aRnd To UBound(ArrNum) - 1
                ArrNum(j) = ArrNum(j + 1)
            Next j
            If cntArr > 0 Then
                ReDim Preserve ArrNum(cntArr - 1)
            End If
            
            cntArr = cntArr - 1
        Next i
    End If
    
    'もんだいシートの保護がかかっていてもマクロでは操作できるようにする
    'もんだいシートの値をクリアする
    '問題を出力する
    With wsQes
        .Protect Password:=PW, UserInterfaceOnly:=True
        .Range("B8:E88").ClearContents
        .Range("B8:B88").Interior.ColorIndex = xlNone
        
        low = 8
        For i = 0 To numQes - 1
            .Range("B" & low).Value = i + 1
            .Range("C" & low).Value = outputQes(i)
            low = low + 1
        Next i
    End With
    
    '解答シートの値をクリアする
    With wsAns
        .Range("A2:D82").ClearContents
        
        low = 2
        For i = 0 To numQes - 1
            .Range("A" & low).Value = i + 1
            .Range("B" & low).Value = outputQes(i)
            .Range("C" & low).Value = outputAns(i)
            .Range("D" & low).Value = outputNum(i)
            low = low + 1
        Next i
    End With
    
    'もとに戻すコード
    With Application
        .ScreenUpdating = True                '画面遷移→する
        .EnableEvents = True                  'イベントの発生→あり
        .Calculation = xlCalculationAutomatic '再計算→自動
        .Cursor = xlDefault                   'カーソル→動かす
        .DisplayAlerts = True                 '確認ダイアログボックスの表示→あり
    End With
    
    wsQes.Activate
    wb.Save
    
    MsgBox "もんだいが できました。OKを おして やってみてね。"
End Sub

💡コードのポイント

① 「子どもが選んだ条件から問題を自動生成する」仕組み
47行目から107行目
設定シートで「どの段を使うか」「何問作るか」「順番 or ランダム」を選ぶ。 その選択をもとに、問題と答えを配列で生成する。
UI(てびきシート)とロジック(VBA)が完全に連動しているのが強み。
② 配列で問題を作り、最後に一気に出力する
109行目から129行目 ArrQes / ArrAns / ArrNum に「問題文」「答え」「段」を格納。
最後に outputQes / outputAns に並べ替えて出力。
シートを直接いじらず、配列で完結させることで高速・安全。
③ ランダム生成は「使った問題を配列から削除」して重複を防ぐ
142行目から145行目、152行目から158行目
「同じ問題が出ない」ことを保証する丁寧な実装。
④ シート保護をかけたまま操作できるようにしている
182行目
子どもが触っても壊れない UI を実現するための工夫。
⑤ Application の高速化設定を最初と最後で切り替える
30行目から37行目、208行目から215行目
教材としての“サクサク動く体験”を大切にしている。

💡技術面でのポイント

① Option Explicit で変数のミスを防ぐ
② 定数モジュールでシート名を一元管理
③ ReDim Preserve を使って配列を動的に拡張
④ 変数名がすべて意味を持っている

💻答え合わせと分析モジュール

コードの流れ

💻コード


                        
Option Explicit

Sub ansAnalysis()
    
'【変数の宣言】
    Dim wb              As Workbook  'このファイル
    Dim wsQes           As Worksheet 'もんだいシート
    Dim wsAns           As Worksheet '解答シート
    Dim wsSet           As Worksheet '設定シート
    Dim wsRank          As Worksheet 'ランキングシート
    Dim wsAnalysis      As Worksheet '分析シート
    Dim mulAns()        As Long      '解答
    Dim mulNum()        As Long      '段
    Dim cntMul          As Long      '解答のデータ数
    Dim ArrCorrect()    As String    '正解時に表示する文字列
    Dim cntArrCorrect   As Long      '正解時に表示する文字列のデータ数
    Dim ArrIncorrect()  As String    '不正解時に表示する文字列
    Dim cntArrIncorrect As Long      '不正解時に表示する文字列のデータ数
    Dim mul(8, 1)       As Long      '段に対する0→正解数 / 1→総問題数
    Dim i               As Long      'カウンタ変数
    Dim j               As Long      'カウンタ変数
    Dim boolAns         As Boolean   '再解答判定
    Dim low             As Long      '行
    Dim col             As Long      '列
    Dim aRnd            As Long      '乱数
    
'【動作】
    '動作が速くなるコード
    With Application
        .ScreenUpdating = False            '画面遷移→しない
        .EnableEvents = False              'イベントの発生→しない
        .Calculation = xlCalculationManual '再計算→手動
        .Cursor = xlWait                   'カーソル→ウェイト
        .DisplayAlerts = False             '確認ダイアログボックスの表示→なし
    End With
    
    '正解数と総数をまとめている配列に0を代入する
    For i = 0 To 8
        For j = 0 To 1
            mul(i, j) = 0
        Next j
    Next i
    
    'このファイルとシートを変数格納
    Set wb = ThisWorkbook                             'このファイル
    With wb
        Set wsQes = .Sheets(SHEET_NAME_QES)           'もんだいシート
        Set wsAns = .Sheets(SHEET_NAME_ANS)           '解答シート
        Set wsSet = .Sheets(SHEET_NAME_SET)           '設定シート
        Set wsRank = .Sheets(SHEET_NAME_RANK)         'ランキングシート
        Set wsAnalysis = .Sheets(SHEET_NAME_ANALYSIS) '分析シート
    End With
    
    '解答シートの解答と段を配列格納
    With wsAns
        low = 2
        cntMul = 0
        Do While .Range("A" & low).Value <> ""
            ReDim Preserve mulAns(cntMul)
            ReDim Preserve mulNum(cntMul)
            
            mulAns(cntMul) = .Range("C" & low).Value
            mulNum(cntMul) = .Range("D" & low).Value
            
            cntMul = cntMul + 1
            low = low + 1
        Loop
        cntMul = cntMul - 1
    End With
    
    '設定シートの正解時に表示する文字列と不正解時に表示する文字列を配列に代入
    With wsSet
        '再解答判定
        boolAns = .Range("J3").Value
        .Range("J3").Value = False
        
        '正解時に表示する文字列
        cntArrCorrect = 0
        low = 3
        Do While .Range("L" & low).Value <> ""
            ReDim Preserve ArrCorrect(cntArrCorrect)
            ArrCorrect(cntArrCorrect) = .Range("L" & low).Value
            cntArrCorrect = cntArrCorrect + 1
            low = low + 1
        Loop
        cntArrCorrect = cntArrCorrect - 1
        
        '不正解時に表示する文字列
        cntArrIncorrect = 0
        low = 3
        Do While .Range("N" & low).Value <> ""
            ReDim Preserve ArrIncorrect(cntArrIncorrect)
            ArrIncorrect(cntArrIncorrect) = .Range("N" & low).Value
            cntArrIncorrect = cntArrIncorrect + 1
            low = low + 1
        Loop
        cntArrIncorrect = cntArrIncorrect - 1
    End With
    
    'もんだいシートの答えあわせをする
    With wsQes
        .Protect Password:=PW, UserInterfaceOnly:=True
    
        low = 8
        For i = 0 To cntMul
            '正解時
            If .Range("D" & low).Value = mulAns(i) Then
                '番号の色を設定する(薄い緑色)
                .Range("B" & low).Interior.Color = RGB(225, 245, 235)
                
                'ランダムの数値をリセットする
                Randomize
                'ランダムな整数をaRndに代入する
                aRnd = Int(Rnd() * (cntArrCorrect + 1))
                .Range("E" & low).Value = ArrCorrect(aRnd)
                
                '正解数に1を加算する
                mul(mulNum(i) - 1, 0) = mul(mulNum(i) - 1, 0) + 1
            '不正解時
            Else
                '番号の色を設定する(薄い緑色)
                .Range("B" & low).Interior.Color = RGB(255, 235, 240)
                
                'ランダムの数値をリセットする
                Randomize
                'ランダムな整数をaRndに代入する
                aRnd = Int(Rnd() * (cntArrIncorrect + 1))
                .Range("E" & low).Value = ArrIncorrect(aRnd)
            End If
            
            '総問題数に1を加算する
            mul(mulNum(i) - 1, 1) = mul(mulNum(i) - 1, 1) + 1
            low = low + 1
        Next i
    End With
    
    '再解答判定がTrueのときのみ分析とランキングに反映する
    If boolAns = True Then
        
        '分析シートに正解数と総問題数を加算して出力する
        With wsAnalysis
            low = 2
            For i = 0 To 8
                .Range("B" & low).Value = .Range("B" & low).Value + mul(i, 0)
                .Range("C" & low).Value = .Range("C" & low).Value + mul(i, 1)
                low = low + 1
            Next i
        End With
        
        'ランキングシートに結果を出力する
        With wsRank
            .Protect Password:=PW, UserInterfaceOnly:=True
            
            low = .Range("E10000").End(xlUp).Row + 1
            
            '当日の日付
            col = 5
            .Cells(low, col).Value = Now
            
            '正解数と総問題数
            For i = 0 To 8
                col = col + 1
                .Cells(low, col).Value = mul(i, 0)
                
                col = col + 1
                .Cells(low, col).Value = mul(i, 1)
            Next i
        End With
    End If
    
    'もとに戻すコード
    With Application
        .ScreenUpdating = True                '画面遷移→する
        .EnableEvents = True                  'イベントの発生→あり
        .Calculation = xlCalculationAutomatic '再計算→自動
        .Cursor = xlDefault                   'カーソル→動かす
        .DisplayAlerts = True                 '確認ダイアログボックスの表示→あり
    End With
    
    wsQes.Activate
    wb.Save
    
    MsgBox "こたえあわせが できたよ。OKを おして みなおしてみてね。"
End Sub

💡コードのポイント

① 子どもの解答を読み取り、正解・不正解を判定する
解答シートから「正しい答え(mulAns)」「その段(mulNum)」を配列に読み込む。
そして、もんだいシートの入力と照合して正解か不正解かを判定する。
教材の“答え合わせ”の中心処理。

💡技術面でのポイント

① 正解・不正解で色とメッセージを変える
107行目から129行目
さらに、設定シートから「正解時のメッセージ」「不正解時のメッセージ」をランダムに選んで表示。
子どもが前向きに取り組める UI/UX の工夫。
② 段ごとの「正解数」と「総問題数」を集計する
118行目、132行目
9段 × 2種類のデータをまとめて管理。
分析・ランキングの基礎データを作る重要な処理。
③ 再解答判定(boolAns)で“分析に反映するか”を制御
74行目
 True → 分析シート・ランキングシートに反映
 False → 反映しない(再挑戦時など)
学習履歴を正しく管理するための安全装置。
④ 分析シートに累積データとして加算する
141行目から148行目
1日の結果ではなく学習の積み重ねを記録する。
成長を“見える化”するための仕組み。
⑤ ランキングシートに日付つきで記録する
158行目
その日の「正解数」「総問題数」を横並びで記録。
あとでグラフ化・ランキング化しやすい構造。