行と列と1行の単位|表・単位・割合・グラフ
このページはプロモーション(広告)を含みます。
表・単位・割合・グラフ(初級・読む20分+演習25分)
この授業のゴール
- 表を見て「1行が何を表すか」を一文で言い切れる
- 行数・注文数・顧客数・数量合計を別々の数として数え分けられる
- 合計行や重複行が混ざった表で、二重計上の危険を見つけられる
- 1行の単位に合わせて、平均や割合の分母を選べる
仕事でどう使うか
どの仕事でも、最初にすることは表の1行が何を表すかを確かめることです。ここを間違えると、その後の合計・平均・割合がすべてずれます。
| 路線 | この授業の使いどころ |
|---|---|
| DS(データサイエンティスト) | 集計の前に「1行=1注文か、1人か、1日か」を確認し、顧客数と注文数を取り違えない。分析レポートの冒頭に分析単位として書く |
| ML(機械学習エンジニア) | 学習データの1行は「予測したい1件」に対応させる。1人が複数行あると、同じ人が訓練側と評価側の両方に入る事故につながる |
| DX(DX推進・AI企画) | KPI(Key Performance Indicator:重要業績評価指標)定義書に「何を1件と数えるか」を明記する。現場のExcelの1行が何かを聞き取る |
| RS(研究者) | 観測の単位(1人、1回の測定、1日)を明確にする。同じ人を何度も測った行を独立な標本として扱うと、結論が強く見えすぎる |
この授業は、数字を出す前の確認作業の練習です。「行数」と「人数」が違うことを数値で確かめます。
前提
この授業では、ファイルやブラウザの基本操作を前提にします。CSV(カンマで区切った表形式のテキストファイル)やスプレッドシートを開いた経験があれば十分です。不安があれば先に戻ってください。
- ファイルを開く・保存する操作 → ファイル・フォルダ・拡張子、保存・ダウンロード・アップロード
- 文字化けしたCSVの確認 → 文字コードと安全なファイル確認
画面内のPythonは 実行 ボタンで動きます。コードは読むだけでも構いません。四則計算(足し算・引き算・掛け算・割り算)ができれば計算はすべて追えます。
身近な状況:「注文は何件?」と聞かれた
小さなネットショップの売上表があります。表の各行は、次のとおりです。
| order_id | customer | item | qty | price |
|---|---|---|---|---|
| 1001 | 佐藤 | りんご | 3 | 120 |
| 1001 | 佐藤 | 牛乳 | 1 | 200 |
| 1002 | 鈴木 | りんご | 2 | 120 |
| 1003 | 佐藤 | パン | 1 | 180 |
| 1004 | 田中 | 牛乳 | 2 | 200 |
列の意味は次のとおりです。qty(quantity:数量)は買った個数、price は商品1個あたりの価格(円)です。
上司に「今月の注文は何件ですか」と聞かれました。この表は5行あります。そこで「5件です」と答えたらどうなるでしょう。
注文番号 1001 は2行あります。1つの注文の中に、りんごと牛乳の2種類が入っているからです。注文番号の種類を数えると 1001、1002、1003、1004 の4件です。さらに、買った人は佐藤・鈴木・田中の3人です。
つまり、同じ表から「5」「4」「3」という3つの異なる数が出ます。どれも間違いではなく、何を数えているかが違うだけです。答える前に「1行は何を表す表か」を確認しないと、正しい数字を選べません。
直感的な説明:1行=1つの出来事の記録
表は行(row)と列(column)でできています。
- 行:1つの出来事や1つの対象の記録。横に読みます。
- 列:同じ種類の情報を縦に並べたもの。名前(見出し)がつきます。
- 1行の単位(粒度):その行が「何1つぶんの記録か」。
先ほどの表の1行は、1つの注文の中の1商品を表します。専門的には「注文明細(めいさい)」と呼びます。レシートを思い浮かべてください。レシート1枚が1注文で、その中の印字された1行1行が、この表の1行にあたります。
同じ店でも、表の作り方で1行の意味は変わります。
| 表の名前 | 1行が表すもの | 行数が表すもの |
|---|---|---|
| 注文明細表 | 注文の中の1商品 | 商品の売れた行の数 |
| 注文表 | 1注文 | 注文の件数 |
| 顧客表 | 1人の顧客 | 顧客の人数 |
| 日別売上表 | 1日 | 営業した日数 |
行数がそのまま「人数」「注文数」「日数」になるのは、1行の単位がそれと一致している表だけです。この確認を毎回の習慣にしてください。
正確な定義:行・列・単位・キー
ここで言葉を整理します。
- レコード(record):行の別名。1件の記録。
- フィールド(field):列の別名。項目。
- 粒度(りゅうど、grain):1行が表す単位。本講座では「1行の単位」とも書きます。
- キー(key):行を区別するための列(または列の組)。注文明細表では、order_id だけでは行を区別できません(1001が2行あります)。order_id と item の組み合わせならば区別できます。
- 重複(ちょうふく):本来1つであるべき記録が、2行以上入っていること。
1行の単位を言い切るための型を覚えましょう。
「この表の1行は、〇〇ごとの△△を表す」(例:注文ごとの商品、顧客ごとの会員情報、日ごとの売上)
この文を書けない表は、まだ使ってはいけません。
数え分けの規則は次のとおりです。
- 行数:全部の行を数える。
行の数。 - 種類数:ある列に何種類の値があるか。同じ値は1回だけ数える。
注文数や顧客数はこれ。 - 合計:数値の列を足す。ただし足してよい列かを考える(個数は足せるが、単価を足しても意味が薄い)。
金額は行ごとに qty × price で求め、それを足します。先頭行は $3 \times 120 = 360$ 円です。式にすると、売上合計は次のとおりです。
$$\text{売上合計} = \sum_{i=1}^{n} \text{qty}_i \times \text{price}_i$$
ここで $n$ は行数、$\text{qty}_i$ は $i$ 行目の数量(個)、$\text{price}_i$ は $i$ 行目の価格(円/個)、$\sum$ は「$i=1$ から $n$ まで足す」という記号です。単位は(個)×(円/個)=円です。
段階付き例題:同じ表から4つの数を出す
問題:前の表から、行数・注文数・顧客数・売上合計(円)を求める。
ステップ1:1行の単位を書く。「注文ごとの商品」。
ステップ2:行数を数える。5行。
ステップ3:注文数を数える。order_id の種類は 1001、1002、1003、1004 の4種類。
ステップ4:顧客数を数える。customer の種類は、佐藤・鈴木・田中の3種類。佐藤さんは3行に出ますが、1人と数えます。
ステップ5:行ごとの金額を作って足す。
| order_id | item | qty × price | 金額(円) |
|---|---|---|---|
| 1001 | りんご | 3 × 120 | 360 |
| 1001 | 牛乳 | 1 × 200 | 200 |
| 1002 | りんご | 2 × 120 | 240 |
| 1003 | パン | 1 × 180 | 180 |
| 1004 | 牛乳 | 2 × 200 | 400 |
合計は 360 + 200 + 240 + 180 + 400 = 1,380円です。
画面で確かめましょう。len(df) は行数、df['order_id'].nunique() は order_id の種類の数(number of unique:重複を除いた個数)を返します。どちらも整数(int型)です。
import pandas as pd
df = pd.DataFrame({
'order_id': [1001, 1001, 1002, 1003, 1004],
'customer': ['佐藤', '佐藤', '鈴木', '佐藤', '田中'],
'item': ['りんご', '牛乳', 'りんご', 'パン', '牛乳'],
'qty': [3, 1, 2, 1, 2],
'price': [120, 200, 120, 180, 200],
})
df['amount'] = df['qty'] * df['price']
print('行数', len(df))
print('注文数', df['order_id'].nunique())
print('顧客数', df['customer'].nunique())
print('数量合計', df['qty'].sum())
print('売上合計', df['amount'].sum())
ステップ6:結果を読む。行数5、注文数4、顧客数3、数量合計9個、売上合計1,380円です。平均も分母で変わります。
| 指標 | 計算 | 値 |
|---|---|---|
| 1行あたり金額 | 1380 ÷ 5 | 276円 |
| 1注文あたり金額(注文単価) | 1380 ÷ 4 | 345円 |
| 1人あたり金額(顧客単価) | 1380 ÷ 3 | 460円 |
「平均はいくら?」と聞かれたら、何あたりの平均かを必ず聞き返します。
操作して理解する:表を変えて数え直す
次のコードは、さきほどの表に1行を足したときの数を確かめます。実行する前に、行数・注文数・顧客数がそれぞれいくつになるか、予想してください。
import pandas as pd
df = pd.DataFrame({
'order_id': [1001, 1001, 1002, 1003, 1004],
'customer': ['佐藤', '佐藤', '鈴木', '佐藤', '田中'],
'item': ['りんご', '牛乳', 'りんご', 'パン', '牛乳'],
'qty': [3, 1, 2, 1, 2],
'price': [120, 200, 120, 180, 200],
})
new_row = pd.DataFrame({'order_id': [1005], 'customer': ['鈴木'], 'item': ['パン'], 'qty': [4], 'price': [180]})
df2 = pd.concat([df, new_row], ignore_index=True)
print('行数', len(df2))
print('注文数', df2['order_id'].nunique())
print('顧客数', df2['customer'].nunique())
print('鈴木さんの行数', (df2['customer'] == '鈴木').sum())
print('鈴木さんの人数', df2[df2['customer'] == '鈴木']['customer'].nunique())
答えは、行数6、注文数5、顧客数3(鈴木さんは既に表にいるため増えない)、鈴木さんの行数2、鈴木さんの人数1です。
pd.concat は2つの表を縦につなぐ関数、(df2['customer'] == '鈴木') は各行が「鈴木」かどうかの真偽(True/False)を並べたもの、.sum() は True を1として足すので該当行数になります。
さらに次を試してください。
- 1005 の行を、同じ内容でもう一度足すと、行数・注文数はどう変わるか。→ 行数だけ増え、注文数は変わらない。重複行は行数を増やすのに、種類数は変えません。
new_rowの顧客を '山田' に変えると、顧客数はいくつか。→ 4。
行数と種類数が一致しないとき、どちらの数を使うべきかを毎回考えましょう。
発展:複合キーと「1行の単位」を壊す結合
注文明細表の行を一意に決めるキーは、order_id と item の複合キー(複数の列の組で作るキー)です。ただし、同じ注文の中に同じ商品が2行(例:サイズ違い)入る仕様なら、これでも足りません。その場合は line_no(明細行番号)のような列を表に加えます。キーを決めるときは、「この組み合わせで行が1つに決まるか」を実際に数えて確かめます。種類数と行数が一致すれば、その列の組はキーとして使えます。
もう1つ大事なのは、表を結合したときに1行の単位が変わることです。注文表(1行=1注文)に、注文明細表(1行=1商品)を結合すると、結果は明細の単位になります。注文表の「配送料500円」という列を、結合後の表でそのまま合計すると、商品の行数ぶん配送料を足してしまいます。結合については 「1対多と多対多」(有料版) で扱いますが、基本の姿勢は同じです。結合の前後で、1行の単位と合計値を照合してください。
最後に、単位を言い切れない表の例を挙げます。Excelで、各ブロックの下に小計行が挟まっている表です。1行が「商品」の行と「小計」の行で混ざっていて、1つの列を丸ごと合計すると二重計上になります。このような表は、分析の前に、小計行を取り除くか別の表に分けます。
よくある失敗
失敗1:行数をそのまま人数や注文数として報告する
誤った例:「表は5行あるので、注文は5件、お客さんは5人です。」
この表では、1001は2行、佐藤さんは3行あります。正しくは注文4件、顧客3人です。
import pandas as pd
df = pd.DataFrame({
'order_id': [1001, 1001, 1002, 1003, 1004],
'customer': ['佐藤', '佐藤', '鈴木', '佐藤', '田中'],
'item': ['りんご', '牛乳', 'りんご', 'パン', '牛乳'],
'qty': [3, 1, 2, 1, 2],
'price': [120, 200, 120, 180, 200],
})
print('誤:行数を注文数として報告', len(df))
print('正:注文数', df['order_id'].nunique())
print('誤:行数を顧客数として報告', len(df))
print('正:顧客数', df['customer'].nunique())
直し方:数える前に「1行の単位」を一文で書く。注文数・顧客数は nunique() のように種類を数える。
失敗2:単価の列をそのまま足して売上にする
誤った例:「price の列を合計すれば売上です。」
price は商品1個あたりの価格なので、数量(qty)を掛けないと金額になりません。
import pandas as pd
df = pd.DataFrame({
'order_id': [1001, 1001, 1002, 1003, 1004],
'customer': ['佐藤', '佐藤', '鈴木', '佐藤', '田中'],
'item': ['りんご', '牛乳', 'りんご', 'パン', '牛乳'],
'qty': [3, 1, 2, 1, 2],
'price': [120, 200, 120, 180, 200],
})
print('誤:priceの合計', df['price'].sum())
print('正:qty×priceの合計', (df['qty'] * df['price']).sum())
誤った値は820円、正しい値は1,380円です。誤りは、単位が「円/個」の列を足した点にあります。足してよいのは、金額(円)のように足し合わせて意味のある量の列です。直し方:行ごとの金額の列を先に作り、それを足す。
失敗3:合計行が混ざった表を丸ごと合計する
表の最後に「合計」行が入っている売上表を、金額の列ごと合計すると、合計行の分が上乗せされます。
import pandas as pd
sales = pd.DataFrame({
'item': ['りんご', '牛乳', 'パン', '合計'],
'amount': [600, 600, 180, 1380],
})
print('誤:合計行を含めて足す', sales['amount'].sum())
body = sales[sales['item'] != '合計']
print('正:合計行を除いて足す', body['amount'].sum())
誤った値は2,760円で、正しい値1,380円のちょうど2倍です。ある集計結果が、期待のちょうど2倍になったら、合計行や重複行の混入を疑います。sales['item'] != '合計' は「item が '合計' でない行」を選ぶ条件です。直し方:集計前に、1行の単位が揃っているか目で確認し、合計行・小計行・空行を取り除く。
まとめ
- 表を使う前に、「1行は〇〇ごとの△△」と一文で言い切る。
- 行数、種類数(注文数・顧客数)、合計は別の数。何を数えるかで答えが変わる。
- 金額は行ごとに数量×単価を求めてから足す。単価の列を足さない。
- 合計行・重複行・結合で複製された行は、ちょうど2倍のようなずれの原因になる。
用語
- 行(レコード)(row / record)
表の横の1本。1つの出来事や対象の1件の記録。
- 列(フィールド)(column / field)
表の縦の1本。同じ種類の情報を並べたもの。見出しがつく。
- 粒度(1行の単位)(grain)
表の1行が何1つぶんの記録かという単位。注文ごと、顧客ごと、日ごとなど。
- キー(key)
行を1つに特定するための列、または複数の列の組。
よくある質問
なぜ最初に「1行の単位」を確認するのですか。
分母と分子が数えているものを揃えるためです。1行が注文なのか商品なのか人なのかで、同じ「平均」や「割合」でも意味が変わります。確認は数秒で済みますが、誤りは報告後に発覚すると訂正が大変です。
行数と種類数は何が違いますか。
行数は同じ値が何度出ても全部数えます。種類数は同じ値を1回だけ数えます。顧客ごとの注文が複数ある表では、行数は注文の件数、種類数は人数に近づきます。
表を見ただけで1行の単位がわからないときは、どうしますか。
キーになりそうな列(order_id など)の種類数と行数を比べます。一致すればその列で1行が決まります。一致しなければ、同じ値の行を2〜3個取り出して中身を見比べます。それでも不明なら、データを作った人に確認します。
合計行がある表は、使ってはいけないのですか。
使えます。ただし集計する前に、合計行を除いた表にします。または合計行の値を、自分で出した合計との照合(検算)に使うと便利です。
同じ顧客が複数行に出る表で、機械学習の訓練と評価に分けるとどうなりますか。
同じ人の行が訓練側と評価側の両方に入ると、モデルがその人を覚えて、実際より良い成績に見えます。1人が複数行ある表では、人単位で分ける必要があります。詳しくはML分野の授業で扱います。
実務で「1行の単位」はどこに書けばよいですか。
データ定義書(列の意味をまとめた文書)の先頭、またはシートの上部に「1行=〇〇ごとの△△」と書きます。KPI定義書では、分子と分母を「何を何件と数えるか」とあわせて書きます。
確認問題
問1 注文明細表(1行=注文の中の1商品)で、order_id が 1001 の行が2行あるとき、正しい説明はどれか。
- ① 注文が2件ある
- ② 1つの注文に2商品が含まれている可能性が高い
- ③ 必ずデータの重複である
- ④ 顧客が2人いる
解答と解説
正解:②
明細表では、1つの注文に複数の商品があれば同じ order_id が複数行に出ます。重複と決めつける前に、1行の単位を確認します。
問2 5行の表で、customer 列の値が 佐藤, 佐藤, 鈴木, 佐藤, 田中 のとき、顧客数はいくつか。
- ① 5人
- ② 4人
- ③ 3人
- ④ 2人
解答と解説
正解:③
種類を数えます。佐藤・鈴木・田中の3人です。
問3 売上合計を求めるとき、price(円/個)の列と qty(個)の列をどう使うのが正しいか。
- ① price の列を合計する
- ② qty の列を合計する
- ③ 各行で qty × price を求めてから合計する
- ④ price の平均に qty の合計を掛ける
解答と解説
正解:③
金額は行ごとに数量×単価です。単価どうしを足しても円/個のままで、金額になりません。
問4 集計結果が期待のちょうど2倍になった。最初に疑うべきものはどれか。
- ① 小数の丸め誤差
- ② 合計行や重複行の混入
- ③ グラフの色
- ④ ファイル名の拡張子
解答と解説
正解:②
合計行を明細と一緒に足すと、ちょうど2倍になります。重複行の混入も同様です。
問5 日別売上表(1行=1日)が30行ある。「1日あたり平均売上」の分母として最も適切なのはどれか。
- ① 30(営業日の行数)
- ② その月の来店者数
- ③ 売上の合計
- ④ 商品の種類数
解答と解説
正解:①
1行が1日なので、日数が分母です。休業日の行が含まれているかどうかは別に確認します。
問6 注文表(1行=1注文。「配送料」列がある)と注文明細表(1行=注文の中の1商品)を結合して、顧客ごとの配送料を合計したところ、実際より大きくなった。起こりうる原因はどれか。
- ① 注文表の行数が少ないから
- ② 配送料が注文ごとの値なのに、商品の行に複製されて何度も足されたから
- ③ 列の名前が日本語だから
- ④ 合計の関数が使えないから
解答と解説
正解:②
1行の単位が変わる結合で、注文ごとの値が複数行に複製されると、足すたびに二重計上になります。
次に学ぶこと
次は 数値・カテゴリ・日時・欠損 で、列に入っている値の種類(数値・カテゴリ・日時・欠損)を区別します。1行の単位の確認は、この後のすべての授業の最初の手順です。
この授業の確認問題だけで習得とはしません。ON04 の総合テストと、別の表を使った自力課題で判定します。
キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。
アプリを無料で開く有料版と無料版の違い