こんにちは、数強塾代表の藤原進之介です。この記事は参考書『藤原進之介の最強120講義』の第36講「データ圧縮(可逆・非可逆・ランレングス・ハフマン)」のWeb版です。共通テスト「情報Ⅰ」での重要度はS(毎年出る。落とすと致命的)、情報Ⅱでの接続先は(3)情報とデータサイエンスです。
圧縮は「ランレングス法は同じ文字が続いたらまとめる、ハフマン法はよく出る文字に短い符号」と手順だけ覚えて終わりにされがちな分野です。しかしその暗記では、問題文で独自の記録形式を定義してくる共通テスト型の出題に太刀打ちできません。この講ではそもそもなぜデータが小さくなるのか、そしてなぜ「どんなデータでも縮む万能圧縮」が原理的に存在しないのかを証明つきで示し、その考え方が情報Ⅱのデータサイエンスにそのまま使われることまでお見せします。
1. この講の問い
なぜデータは小さくできるのか。そして、なぜ「どんなデータでも小さくできる万能の圧縮」は原理的に存在しないのか。
2. 結論
データが縮むのは、そこに偏り(同じものが続く/よく出る記号がある)があるからです。よく出る記号に短い符号を割り当てれば平均符号長が縮む——これがハフマン符号の核心です。偏りがまったく無いデータは縮みません。そしてあらゆるデータを短くする圧縮は存在しません(鳩の巣原理で証明できます)。だから、1ビットも変えられないデータには可逆圧縮を、人間の知覚が鈍い部分を持つデータには非可逆圧縮を使い分けるのです。
3. なぜそうなるのか
3-1. 「デジタル化」と「圧縮」は別の工程です
標本化・量子化・符号化はアナログを0と1に変える工程、圧縮はその後の0と1の列を言い直す工程です。順番に並んだ別の作業だと切り分けておいてください。デジタル化の手順そのものは第34講 画像のデジタル化(解像度・階調・データ量)にまとめてあります。
ところで、学習指導要領(平成30年告示)解説 情報編を読むと、圧縮は情報Ⅰの(2)「コミュニケーションと情報デザイン」の中に置かれています。書かれているのは次の一文です。
ファイルの圧縮方法については,完全に元に戻せる可逆圧縮と完全には元に戻せない非可逆圧縮を用いて,実際にファイルを圧縮・展開してそれぞれの特性の違いを把握する学習活動が考えられる
文部科学省「高等学校学習指導要領(平成30年告示)解説 情報編」平成30年7月(該当箇所は解説p.28相当)
求められているのは「実際に圧縮・展開して特性の違いを把握する」ことであり、なぜ縮むのかという原理は要求されていません。だから多くの授業で圧縮は用語と手順で終わります。本講はそこを埋めます。
3-2. なぜ縮むのか——冗長性という一語
情報を短く言い直せるのは、元の表現に無駄(冗長性)があるからです。冗長性には大きく2種類あります。
| 偏りの種類 | どんなデータに現れるか | 効く手法 |
|---|---|---|
| 同じものが続く | 白い紙の画像、無音区間のある音声、FAXの原稿 | ランレングス法 |
| 出やすい記号と出にくい記号がある | 日本語や英語の文章、プログラムのソースコード | ハフマン法 |
逆に言えば、どちらの偏りも無いデータは縮みません。ランダムなビット列や、すでに圧縮済みのZIPファイルをもう一度圧縮しても小さくならないのはこのためです。「圧縮ソフトを2回かければ半分の半分になる」は起きません。
3-3. なぜ「万能圧縮」は存在しないのか(鳩の巣原理)
「どんなファイルでも必ず1ビット以上小さくする圧縮ソフト」は作れません。これは実装が難しいという話ではなく、数学的に不可能です。証明は高校生でも追えます。
可逆圧縮は元に戻せなければなりません。つまり圧縮は一対一(異なる入力は必ず異なる出力になる)である必要があります。
いま、長さ n ビットのデータをすべて n−1 ビット以下に写せたとしましょう。入力は 2n 通りあります。一方、長さが n−1 ビット以下のビット列は全部でいくつあるでしょうか。
2n 個のものを 2n − 1 個の箱に一対一で入れることはできません。これが鳩の巣原理です。したがって必ずどこかで衝突が起き、元に戻せなくなります。
可逆圧縮は必ず「縮むデータ」と「かえって膨らむデータ」を両方持ちます。圧縮ソフトが実用になるのは、私たちが実際に扱うデータ(文章・画像・プログラム)が、全ビット列のごく一部の「偏った」ものに集中しているからです。圧縮は数学の勝利ではなく、現実のデータが偏っているという経験則の上に立っています。
3-4. だから可逆と非可逆を使い分ける
| 可逆圧縮 | 非可逆圧縮 | |
|---|---|---|
| 復元 | 完全に元に戻る | 元には戻らない |
| 何を捨てるか | 何も捨てない(表現を変えるだけ) | 人間が気づきにくい情報を捨てる |
| 圧縮率 | 上げにくい | 大きく上げられる |
| 代表例 | ZIP、PNG、GIF、文書、プログラム | JPEG、MP3、H.264(写真・音・動画) |
判断基準はただ一つ、「1ビット変わったら困るか」です。プログラムは1ビット変わったら動きません。会計データは1円変わったら別の数字です。だから可逆でなければなりません。一方、写真の空のグラデーションが隣の色に1段階ずれても、人間の目は気づきません。
ここを私はしつこく言います。非可逆圧縮は「人間の知覚の鈍さ」という外部条件を利用しているのであって、数学的に情報が保存されているわけではありません。だから同じJPEGでも、人間が見る写真なら十分でも、機械が微細な傷を検査する画像には使えないのです。
3-5. なぜ接頭符号でないと復号できないのか
ハフマン法は文字ごとに長さの違う符号を割り当てます(可変長符号)。ここで必ず問題になるのが区切りです。
文部科学省の「情報Ⅰ」教員研修用教材は、この失敗をわざわざ先に見せています。i に「1」、n に「01」、t に「100」を割り当てると、並べたビット列は別の読み方もできてしまう、と。
この部分だけでも,「101(g) 100(t)…」と読むこともでき,文字の区切りが分からない
文部科学省「高等学校情報科『情報Ⅰ』教員研修用教材」第2章 学習6「デジタルにするということ」(令和2年、該当箇所はp.61相当)
区切り記号を入れれば解決しますが、それではデータが増えて本末転倒です。そこで課す条件が接頭符号(prefix code)——どの符号も、他の符号の先頭部分になっていないことです。
なぜこれで復号できるのでしょうか。ビット列を左から1ビットずつ読み、手元のビット列が符号表のどれかに一致した瞬間に文字を確定させます。接頭符号なら「一致したけれど、実はもっと長い符号の途中だった」という事態が起こり得ません。だから先読みも後戻りも不要で、一意に復号できるのです。
ハフマン木を使うと接頭符号が自動的にできあがります。文字はすべて葉に置かれ、葉は他の葉の途中を通らないからです。これが「木で作る」ことの意味であり、単なる作図手順ではありません。
3-6. なぜ「よく出る記号に短い符号」で縮むのか
記号 i の符号長を 、出現確率を とすると、1文字あたりの平均符号長は次の式で表せます。
固定長符号ではすべての が同じなので、L はその値そのものです。ここで出現確率の大きい記号の符号長を1減らし、小さい記号の符号長を1増やすとどうなるでしょうか。L の変化は「−(大きい確率)+(小さい確率)」ですから、負になる=平均が縮みます。
これがハフマン法のすべてです。ハフマン木を「出現回数の小さい2つから順に併合する」のは、出現回数の小さいものほど木の深いところ(=長い符号)に押し込むための手続きにすぎません。手順を覚えるのではなく、この一行を覚えてください。
なお、この平均符号長には理論的な下限があり、情報量(エントロピー)と呼ばれます。情報処理推進機構(IPA)の基本情報技術者試験シラバスでは「情報量の概念,事象の生起確率と情報量との関係を理解する」が情報理論の項目として置かれ、符号理論の用語例に「ハフマン符号,情報源符号化(データ圧縮)」が並びます。高校の情報Ⅰでは確率の話が外されていますが、圧縮は本来「確率の話」であることは押さえておいてください。第43講 論理演算と同じで、情報Ⅰの各項目は必ずその先の理論につながっています。
4. 手で確かめる
4-1. ランレングス符号化——縮む例と、膨らむ例
「同じ文字が続いたら〈文字+連続回数〉に置き換える」だけです。
| 元データ | 符号化後 | 文字数 | 圧縮率 |
|---|---|---|---|
| AAAAAAAAAABBBBBAAAAA | A10B5A5 | 20 → 7 | 35.0% |
| ABCDEFGHIJ | A1B1C1D1E1F1G1H1I1J1 | 10 → 20 | 200% |
下の行を見てください。2倍に膨らんでいます。 3-3で証明した「必ず膨らむデータが存在する」が、最短の形で目に見えました。教員研修用教材も同じことを intelligence という単語で示しており、ランレングス法をかけると22文字になり「ほとんどの文字の後ろに『1』がつくために約2倍のデータ量となってしまう」と書いています。
4-2. 白黒画像の1行をビットで数える
32画素のモノクロ1行(1画素1ビット)を考えます。白が12、黒が3、白が17と並んでいるとしましょう。
11111111111100011111111111111111
(白12 → 黒3 → 白17 の3つのラン)
そのままなら32ビットです。これを「色1ビット+(長さ−1)を5ビット」の6ビット単位で3つのランとして書けば、6 × 3 = 18ビット。圧縮率は 18 ÷ 32 = 56.3% になります。
FAXが実用になるのはこの構造のおかげです(教員研修用教材もランレングス法をFAXの例で説明しています)。ランの数が少ないほど縮むので、細かい網点が並ぶ写真をこの方式で送ると悲惨なことになります。手法には向き不向きがあるのです。
4-3. ハフマン木を手で作る
文字列 abracadabra(11文字)を圧縮します。出現回数は a=5、b=2、r=2、c=1、d=1 の5種類です。
5種類なので固定長なら1文字3ビット必要です(22=4 では足りず、23=8 で足ります)。11 × 3 = 33ビット。これが比較の基準になります。
出現回数の小さい2つを選んで併合し、和を新しい節点にする。これを1つになるまで繰り返す。
① c(1) と d(1) を併合 → 2
② 残りは 2、b(2)、r(2)、a(5)。ここでは b と r を併合 → 4
③ 残りは 2、4、a(5)。小さい2つ 2 と 4 を併合 → 6
④ 残りは a(5) と 6。併合して根 11
できた木がこちらです。左の枝に0、右の枝に1を振ります。
abracadabra のハフマン木(筆者作成)。丸の中の数字は出現回数の合計、葉の下は「出現回数 / 割り当てられた符号」。
| 文字 | a | c | d | b | r |
|---|---|---|---|---|---|
| 出現回数 | 5 | 1 | 1 | 2 | 2 |
| 符号 | 0 | 100 | 101 | 110 | 111 |
| 符号長 | 1 | 3 | 3 | 3 | 3 |
接頭符号になっていることを確かめます。0 は他のどの符号の先頭でもありません(他はすべて1で始まります)。100 から 111 までは互いに同じ長さなので、一方が他方の先頭になることはあり得ません。合格です。
4-4. 圧縮率と平均符号長を計算する
abracadabra を符号化すると次のようになります。
a b r a c a d a b r a
0 110 111 0 100 0 101 0 110 111 0
→ 01101110100010101101110 (23ビット)
| 項目 | 値 | 計算 |
|---|---|---|
| 固定長のとき | 33ビット | 11文字 × 3ビット |
| ハフマンのとき | 23ビット | 5×1 + 2×3 + 2×3 + 1×3 + 1×3 |
| 圧縮率 | 約69.7% | 23 ÷ 33 |
| 平均符号長 | 約2.09ビット | 23 ÷ 11(固定長なら3.00) |
理論的な下限であるエントロピーも計算しておきます。
ハフマンの2.09ビットは、下限2.04ビットのわずか0.05ビット上です。ハフマン符号がほぼ最適だということが、自分の手で確認できました。
実務では符号表そのものもファイルに入れます。教員研修用教材も「実際には,これに各文字列に対応するハフマン符号の表がつくので圧縮率はこれより低くなる」と明記しています。11文字のような短いデータでは、表のほうが大きくなってしまいます。ハフマンが効くのは長い文書のときだけです。
4-5. 接頭符号でないと何が起きるか(実演)
わざと a=0、b=01、r=1 としてみます。b の符号「01」は、a の符号「0」で始まっていますね。接頭符号ではありません。すると 01 という2ビットは、
| ビット列 | 読み方1 | 読み方2 |
|---|---|---|
| 01 | 01 → b | 0 + 1 → a, r |
の2通りに読めてしまいます。どちらが正しいか、ビット列だけからは決まりません。 元に戻せない=可逆圧縮として失敗です。復号プログラムを書いても、入力によって答えが割れます。ハフマン木を経由して符号を作れば、この事故は原理的に起こりません。
4-6. Pythonで検算する
以下は私の手元(Python 3)で実際に実行し、出力を確認したものです。コメントの行が実際の出力です。
from collections import Counter
s = "abracadabra"
code = {'a':'0', 'c':'100', 'd':'101', 'b':'110', 'r':'111'}
ks = list(code.values())
print(all(not (x != y and y.startswith(x)) for x in ks for y in ks))
# True ← どの符号も他の符号の先頭になっていない(接頭符号)
bits = ''.join(code[c] for c in s)
print(bits, len(bits))
# 01101110100010101101110 23
print(3 * len(s), len(bits) / (3 * len(s)))
# 33 0.696969696969697
次に復号します。左から1ビットずつ足していき、符号表に一致したら確定させるだけです。先読みも後戻りもしていないことを目で確認してください。
inv = {v: k for k, v in code.items()}
buf, out = '', ''
for b in bits:
buf += b
if buf in inv:
out += inv[buf]
buf = ''
print(out, out == s)
# abracadabra True
最後にエントロピーです。
import math
n = len(s)
f = Counter(s)
H = -sum((c/n) * math.log2(c/n) for c in f.values())
print(H)
# 2.0403666152949836
自分で書いて動かすと、「接頭符号だから復号できる」が実感に変わります。第40講 2進数・10進数・16進数の変換と同じで、圧縮も手で確かめられる範囲の話なのです。
5. 共通テストではこう出る(重要度S)
デジタル化とデータ量の計算は毎年出ます。圧縮はその一部として問われます。ここでは設問の型だけを整理します(当塾では共通テストの問題文・選択肢・図表は転載していません)。
「圧縮前◯バイト、圧縮後◯バイト。圧縮率はいくつか」。定義の向きに注意してください。教員研修用教材は(圧縮後 ÷ 圧縮前)を圧縮率と呼び、10文字が4文字になる例を「元の40%に圧縮」、33ビット÷36ビットを「約92%に圧縮」と書いています。値が小さいほどよく縮んでいるという向きです。「何%削減できたか」と聞かれたら100%から引きます。問題文がどちらの定義を採っているかを必ず読むこと。
ランレングスは、問題文で独自の記録形式(色1ビット+長さ nビット、など)が定義され、それに従わせる形で出ます。手順ではなく問題文の規則を読む力が問われています。ハフマンは、出現頻度の表から木を作り、符号を決め、総ビット数を求める形。併合の順番が違っても総ビット数は一致するので、友達と符号表が違っても慌てないでください。
「この用途にはどちらの圧縮が適切か」。基準は1ビット変わったら困るかの一点です。ここで一段深い事実を。教員研修用教材は「ハフマン符号は,JPEG や ZIP (Deflate) などの圧縮フォーマットで使用されている」と補足しています。JPEGは非可逆なのに、内部でハフマン(可逆)を使っている。 「非可逆=全工程が非可逆」ではありません。情報を捨てる工程と、捨てた後を可逆に詰める工程が別なのです。
落とし穴
- 圧縮率の向きを取り違える。 「圧縮率が高い=よく縮んだ」と日常語で読むと、教材の定義と逆になります。
- 「圧縮すれば必ず小さくなる」と思い込む。 ランレングスは膨らむことがあります。
- 符号表の分を忘れる。 短いデータでは表のほうが大きくなります。
- 接頭符号でない符号表を平気で選ぶ。 選択肢に混ぜられます。必ず「他の符号の先頭になっていないか」を確認してください。
- 非可逆圧縮を「劣化コピー」とだけ覚える。 捨てているのは「人間が気づきにくい情報」であって、ランダムに削っているのではありません。
練習用の自作問題(本記事オリジナル)
(1)AAABBBBBBBCC(12文字)をランレングス法で符号化し、圧縮率を求めよ。
(2)符号 a=0、b=10、c=110、d=111 は接頭符号か。
(3)符号 a=0、b=01、c=1 は接頭符号か。接頭符号でないなら、2通りに読めるビット列を1つ挙げよ。
(4)出現回数が a=4、b=3、c=2、d=1 の10文字の列がある。固定長なら何ビットか。
(5)(4)でハフマン符号を作ると総ビット数はいくつか。
(1)A3B7C2 の6文字。6 ÷ 12 = 50.0% (2)接頭符号である(0 は 10・110・111 の先頭ではなく、10 は 110・111 の先頭でもない) (3)接頭符号ではない。a の符号 0 が、b の符号 01 の先頭になっています。ビット列 01 は「01 → b」とも「0 と 1 → a, c」とも読め、どちらが正しいか決まりません (4)4種類なので1文字2ビット、10文字で20ビット (5)併合は d(1)+c(2)=3、3+b(3)=6、6+a(4)=10。符号長は a=1、b=2、c=3、d=3 なので 4×1 + 3×2 + 2×3 + 1×3 = 19ビット
共通テスト情報Ⅰの学習計画全体については共通テスト「情報Ⅰ」対策はいつから何をやるべきかにまとめました。120講の全体像は情報Ⅰ 最強120講義の目次から辿れます。
6. 情報Ⅱではこうなる
6-1. 圧縮は情報Ⅱでも名指しで出てきます
学習指導要領解説 情報編の情報Ⅱ(2)ア(ウ)「コンテンツを様々な手段で適切かつ効果的に社会に発信する方法を理解すること」には、こう書かれています。
暗号化などの情報を保護する方法,データを圧縮する方法などについて理解するようにする
文部科学省「高等学校学習指導要領(平成30年告示)解説 情報編」平成30年7月(該当箇所は解説p.47相当)
情報Ⅰでは「実際に圧縮・展開して特性の違いを把握する」(=体験)だったものが、情報Ⅱでは発信のための技術として理解する対象に上がっています。同じ「圧縮」という語でも、要求水準が違うのです。
6-2. 本丸は「次元削減」——非可逆圧縮の一般化
そして情報Ⅱ(3)「情報とデータサイエンス」で、圧縮の発想は主成分分析による次元削減として再登場します。文部科学省「情報Ⅱ」教員研修用教材の学習14を読んだとき、私は思わず声が出ました。
対象の弁別に対して寄与の小さい下位の方の主成分を捨て上位の主成分のみ採用することで,元の個数 p より少ない数で,対象の特徴をプロファイルすることが可能になる。このことを次元削減(次元縮約)といい,特に高次元の変数を扱う画像データの処理では,機械学習の一つの手法として使用されている
文部科学省「高等学校情報科『情報Ⅱ』教員研修用教材」第3章 情報とデータサイエンス 前半(令和2年7月、該当箇所はp.136相当)
「捨てる」という動詞が一致しています。 非可逆圧縮が「人間の知覚に効かない情報を捨てる」のに対し、次元削減は「対象の弁別に効かない成分を捨てる」。捨てる基準が〈人間の目〉から〈データの分散〉に変わっただけで、構造はまったく同じです。
さらに文部科学省が公開している情報Ⅱ向けの教材スライドは、タイトルからしてこうなっています。
主成分分析による次元縮約 / データを圧縮して,関係を見よう!
多次元のデータを低次元の主成分に圧縮(要約)することで,データの構造を可視化できる
文部科学省「情報とデータサイエンス 主成分分析による次元縮約」(2024年3月公開)
国の教材そのものが、主成分分析を「圧縮」と呼んでいるのです。第36講と第114講がつながっているというのは、私の見立てではなく教材の文言そのものです。
6-3. 8次元を2次元に落として67%
この教材は、独立行政法人統計センターが公開している教育用標準データセット「SSDSE-家計消費(SSDSE-C)」を題材にしています。都道府県庁所在市別に、1世帯当たりの食料の年間支出金額を品目別に集めたデータ(出典は総務省統計局「家計調査」)です。これをRの prcomp 関数にかけて主成分分析を行い、こう結論します。
2軸でデータ全体の67%を説明できている!(今回の場合,元のデータは8次元)
前掲「主成分分析による次元縮約」(2024年3月公開)
8次元を2次元に落として、情報の67%が残った。 これはまさに、写真をJPEGで小さくしたときの圧縮率と画質のトレードオフそのものです。教材では寄与率(Proportion of Variance)を「データ全体のばらつきをどれくらい説明できているか」、累積寄与率(Cumulative Proportion)を「その成分までで,データ全体のばらつきをどれくらい説明できているか」と定義しています。これが情報Ⅱ版の「画質」だと思ってください。
6-4. 情報Ⅰと情報Ⅱの扱いの違い
| 情報Ⅰ | 情報Ⅱ | |
|---|---|---|
| 何を圧縮するか | ファイル(ビット列) | データセット(変数の集まり) |
| 何を捨てるか | 人間の知覚に効かない成分 | 対象の弁別に効かない主成分 |
| 残り具合の指標 | 圧縮率・画質 | 寄与率・累積寄与率 |
| 手法 | ランレングス、ハフマン、JPEG | 主成分分析、クラスタリング |
| 目的 | 保存・転送を軽くする | 構造を見る・機械学習の前処理 |
情報Ⅰの圧縮は「運ぶため」、情報Ⅱの圧縮は「見るため」。 捨てるという操作は同じでも、目的が変わります。この一段の跳躍を高校のうちに見ておくと、大学のデータサイエンスで主成分分析が出てきたときに「ああ、あのJPEGの話か」と着地できます。
まとめ
- データが縮むのは冗長性(同じものが続く/頻度の偏り)があるから。偏りが無いデータは縮まない。
- 鳩の巣原理により、あらゆるデータを短くする万能圧縮は存在しない。可逆圧縮は必ず膨らむデータを持つ。
- 可逆と非可逆の判断基準は「1ビット変わったら困るか」の一点。非可逆は人間の知覚の鈍さを利用している。
- 可変長符号は接頭符号でなければ復号できない。ハフマン木を使えば自動的に接頭符号になる。
- ハフマンの核心は「出現確率の大きい記号の符号長を減らせば平均符号長が縮む」の一行。手順は結果にすぎない。
- 情報Ⅱでは同じ発想が主成分分析による次元削減として再登場する。文科省の教材自身がそれを「圧縮」と呼んでいる。
出典(すべて2026年8月3日に取得)
- 文部科学省「高等学校学習指導要領(平成30年告示)解説 情報編」平成30年7月
- 文部科学省「高等学校情報科『情報Ⅰ』教員研修用教材」第2章 コミュニケーションと情報デザイン(令和2年)
- 文部科学省「高等学校情報科『情報Ⅱ』教員研修用教材」第3章 情報とデータサイエンス 前半(令和2年7月)
- 文部科学省「情報とデータサイエンス 主成分分析による次元縮約」(2024年3月公開)
- 独立行政法人統計センター「SSDSE(教育用標準データセット)」
- 情報処理推進機構(IPA)「基本情報技術者試験(レベル2)シラバス Ver.9.2」
制度に関する記述は2026年8月時点のものです。情報Ⅰがなぜ必修になったのかという背景は情報Ⅰはなぜ必修になったのかに書きました。
執筆:藤原進之介(数強塾グループ代表)
オンライン数学専門塾「数強塾」代表。累計3,500名以上の中高一貫校生を指導。東進ハイスクール・東進衛星予備校・代々木ゼミナールなど出講実績あり。情報Ⅰの参考書を複数執筆しており、KADOKAWA『ゼロから始める情報I』、Gakken『きめる!共通テスト 情報Ⅰ』などがあります。本記事は参考書『藤原進之介の最強120講義』第36講のWeb版です。
「情報Ⅰ、独学でいけるのか不安」という方へ
数強塾では数学と情報Ⅰの両方に対応したオンライン個別指導を行っています。学習相談は無料、体験授業は3,000円(税込)でお受けしています。
