📈 ステップ15: パーセンテージと比率
割合を計算して、データを分かりやすく表現しよう!
ステップ14では、分散と標準偏差について学びました。今回は、データ分析で最もよく使う「パーセンテージ(%)」と「比率」の計算を学びます。ビジネスでは「売上が前年比120%」「シェア30%」などの表現をよく目にしますよね。
📖 このステップで学ぶこと
・割合の基本的な計算方法
・パーセンテージへの変換
・構成比(内訳の割合)の計算
・前年比・伸び率(成長率)の計算
・目標達成率の計算
学習時間の目安: 2.5〜3時間
🎯 1. 割合とパーセンテージの基本
まず、割合とパーセンテージの基本を理解しましょう。
🔰 割合とは?
割合とは、全体に対して部分がどれだけあるかを表す値です。
💡 割合のイメージ
ピザを4等分して、1切れ食べたとします。
・全体:4切れ
・食べた部分:1切れ
・割合:1 ÷ 4 = 0.25
・パーセント:0.25 × 100 = 25%
📝 割合とパーセントの計算式
📝 書き方:割合とパーセントの計算式
割合 = 部分 ÷ 全体
パーセント = 割合 × 100
または、1つの式にまとめると:
パーセント = (部分 ÷ 全体) × 100
📘 基本的な計算
テストの正答率を例に、Pythonで計算してみましょう。
コード:正答率の計算
# テストの正解数
correct = 85 # 正解した問題数
total = 100 # 全問題数
# 割合を計算(0〜1の小数)
ratio = correct / total
print(f"割合: {ratio}")
# パーセントに変換(0〜100の数値)
percentage = ratio * 100
print(f"パーセント: {percentage}%")
# より簡潔に1行で書く
percentage = (correct / total) * 100
print(f"正答率: {percentage}%")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
割合: 0.85 パーセント: 85.0% 正答率: 85.0%
💡 コードの解説
ratio = correct / total
・正解数を全問題数で割って「割合」を計算
・結果は0〜1の間の小数になります
percentage = ratio * 100
・割合に100をかけて「パーセント」に変換
・人間が理解しやすい形式になります
📘 小数点以下の表示を整える
割り切れない場合、小数点以下が長くなります。表示を整えましょう。
コード:小数点以下の表示
# 割り切れない場合
correct = 23
total = 30
percentage = (correct / total) * 100
print(f"正答率: {percentage}%") # そのまま表示
print(f"正答率: {percentage:.1f}%") # 小数第1位まで
print(f"正答率: {percentage:.2f}%") # 小数第2位まで
print(f"正答率: {percentage:.0f}%") # 整数(小数なし)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
正答率: 76.66666666666667% 正答率: 76.7% 正答率: 76.67% 正答率: 77%
💡 書式指定の解説
{percentage:.1f}
・: の後ろに書式を指定
・.1 は小数点以下1桁
・f は浮動小数点数(float)の意味
実務では小数第1位(.1f)がよく使われます。
📘 パーセントの読み方
📌 パーセントの基本知識
| パーセント | 意味 | 割合(小数) |
| 100% | 全体(1倍) | 1.0 |
| 50% | 半分(2分の1) | 0.5 |
| 25% | 4分の1 | 0.25 |
| 200% | 2倍 | 2.0 |
| 10% | 10分の1 | 0.1 |
📊 2. 構成比(割合の内訳)
構成比とは、全体の中で各項目が占める割合のことです。円グラフでよく見かけますね。
🔰 構成比とは?
💡 構成比のイメージ
月の生活費10万円の内訳を考えてみましょう。
・食費:3万円 → 30%
・家賃:5万円 → 50%
・光熱費:1万円 → 10%
・その他:1万円 → 10%
合計:100%(全ての構成比を足すと100%になる)
📘 例1:商品カテゴリ別の売上構成比
辞書を使って、各カテゴリの構成比を計算してみましょう。
コード:売上構成比の計算
# 商品カテゴリ別売上(万円)
sales = {
"電子機器": 500,
"衣類": 300,
"食品": 150,
"雑貨": 50
}
# 合計売上を計算
total_sales = sum(sales.values())
print("【売上構成比】")
print(f"合計売上: {total_sales}万円")
print()
# 各カテゴリの構成比を計算
for category, amount in sales.items():
# 構成比 = (各カテゴリの売上 / 合計売上) × 100
ratio = (amount / total_sales) * 100
print(f"{category}: {amount}万円 ({ratio:.1f}%)")
# 合計が100%になることを確認
print()
total_ratio = sum((amount / total_sales) * 100 for amount in sales.values())
print(f"構成比の合計: {total_ratio:.1f}%")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【売上構成比】 合計売上: 1000万円 電子機器: 500万円 (50.0%) 衣類: 300万円 (30.0%) 食品: 150万円 (15.0%) 雑貨: 50万円 (5.0%) 構成比の合計: 100.0%
💡 コードの解説
sum(sales.values())
・sales.values()で辞書の値(売上額)だけを取り出します
・sum()でそれらを全て足し合わせます
for category, amount in sales.items():
・items()でキーと値のペアを取り出してループします
・categoryにはカテゴリ名、amountには売上額が入ります
📘 例2:年齢層別の顧客構成(可視化付き)
棒グラフ風に表示すると、データがより分かりやすくなります。
コード:顧客構成の可視化
# 年齢層別の顧客数
age_groups = {
"10代": 50,
"20代": 200,
"30代": 300,
"40代": 250,
"50代以上": 200
}
total_customers = sum(age_groups.values())
print("【顧客の年齢層構成】")
print(f"総顧客数: {total_customers}人")
print()
# 構成比を計算して、バーグラフ風に表示
for age, count in age_groups.items():
percentage = (count / total_customers) * 100
# ■を使って棒グラフ風に表示
# percentage / 2 で、50%なら25個の■になる
bar = "■" * int(percentage / 2)
print(f"{age:8}: {count:3}人 ({percentage:5.1f}%) {bar}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【顧客の年齢層構成】 総顧客数: 1000人 10代 : 50人 ( 5.0%) ■■ 20代 : 200人 (20.0%) ■■■■■■■■■■ 30代 : 300人 (30.0%) ■■■■■■■■■■■■■■■ 40代 : 250人 (25.0%) ■■■■■■■■■■■■ 50代以上: 200人 (20.0%) ■■■■■■■■■■
💡 コードの解説
{age:8}
・8文字分の幅で表示(文字列の右側に空白を追加)
・これにより表示が揃って見やすくなります
{count:3}
・3桁分の幅で表示(数値の左側に空白を追加)
“■” * int(percentage / 2)
・文字列に数値をかけると、その回数だけ繰り返します
・int()で整数に変換(小数のままだとエラー)
📘 構成比を計算する関数
構成比の計算を関数にまとめて、再利用できるようにしましょう。
コード:構成比表示関数
def show_composition(data, name="データ"):
"""
構成比を表示する関数
引数:
data: 辞書形式のデータ {項目名: 値}
name: データの名前(タイトル用)
"""
total = sum(data.values())
print(f"【{name}の構成比】")
print(f"合計: {total:,}") # :, でカンマ区切り
print()
# 値が大きい順にソートして表示
sorted_data = sorted(data.items(), key=lambda x: x[1], reverse=True)
for item, value in sorted_data:
percentage = (value / total) * 100
print(f"{item}: {value:,} ({percentage:.1f}%)")
print()
# 使用例
monthly_sales = {
"1月": 120, "2月": 135, "3月": 142,
"4月": 158, "5月": 165, "6月": 172
}
show_composition(monthly_sales, "上半期売上(万円)")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【上半期売上(万円)の構成比】 合計: 892 6月: 172 (19.3%) 5月: 165 (18.5%) 4月: 158 (17.7%) 3月: 142 (15.9%) 2月: 135 (15.1%) 1月: 120 (13.5%)
💡 コードの解説
{total:,}
・:, を付けると、3桁ごとにカンマ区切りで表示されます
・例:1000 → 1,000
sorted(data.items(), key=lambda x: x[1], reverse=True)
・data.items()をソート(並べ替え)します
・key=lambda x: x[1] で「値(x[1])」を基準にソート
・reverse=True で降順(大きい順)に
📈 3. 前年比と伸び率(成長率)
ビジネスでよく使う「前年比」や「伸び率」の計算方法を学びましょう。
🔰 前年比(成長率)とは?
前年比とは、前年と比べてどれだけ増減したかを表す指標です。
📝 書き方:前年比(成長率)の計算式
増減額 = 今年 – 前年
増減率(%)= (増減額 ÷ 前年) × 100
または、別の計算方法:
増減率(%)= ((今年 ÷ 前年) – 1) × 100
📘 基本的な計算
コード:前年比の計算
# 売上データ
last_year = 1000 # 前年の売上(万円)
this_year = 1200 # 今年の売上(万円)
# 増減額を計算
diff = this_year - last_year
print(f"前年: {last_year}万円")
print(f"今年: {this_year}万円")
print(f"増減: {diff:+}万円") # :+ でプラス記号を表示
# 増減率(前年比)を計算
growth_rate = (diff / last_year) * 100
print(f"前年比: {growth_rate:+.1f}%")
# 別の計算方法(結果は同じ)
growth_rate2 = ((this_year / last_year) - 1) * 100
print(f"前年比: {growth_rate2:+.1f}%")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
前年: 1000万円 今年: 1200万円 増減: +200万円 前年比: +20.0% 前年比: +20.0%
💡 コードの解説
{diff:+}
・:+ を付けると、正の数にも「+」記号が表示されます
・増減が一目で分かるようになります
{growth_rate:+.1f}
・+と.1fを組み合わせることも可能
・「+20.0%」や「-10.0%」のように表示されます
📘 前年比の関数
コード:前年比を計算する関数
def calculate_growth(previous, current, name="データ"):
"""
前年比(成長率)を計算する関数
引数:
previous: 前期の値
current: 今期の値
name: データの名前
戻り値:
成長率(%)
"""
# 0で割るエラーを防ぐ
if previous == 0:
print("⚠️ 前期の値が0のため、成長率を計算できません")
return None
diff = current - previous
growth_rate = (diff / previous) * 100
print(f"【{name}】")
print(f"前期: {previous:,}")
print(f"今期: {current:,}")
print(f"増減: {diff:+,}")
print(f"増減率: {growth_rate:+.1f}%")
# 判定メッセージ
if growth_rate > 0:
print("📈 成長しています")
elif growth_rate < 0:
print("📉 減少しています")
else:
print("➡️ 横ばいです")
return growth_rate
# テスト1:成長
print("=" * 40)
calculate_growth(1500, 1800, "売上推移")
print()
print("=" * 40)
# テスト2:減少
calculate_growth(500, 450, "来店者数推移")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
======================================== 【売上推移】 前期: 1,500 今期: 1,800 増減: +300 増減率: +20.0% 📈 成長しています ======================================== 【来店者数推移】 前期: 500 今期: 450 増減: -50 増減率: -10.0% 📉 減少しています
📘 複数期間の推移
月別データなど、複数期間の前月比を一覧で表示してみましょう。
コード:月次推移の表示
# 月別売上データ
monthly_sales = [100, 120, 115, 130, 125, 140, 138, 145, 150, 155, 160, 170]
months = ["1月", "2月", "3月", "4月", "5月", "6月",
"7月", "8月", "9月", "10月", "11月", "12月"]
print("【月次売上推移】")
print("月 売上 前月比")
print("-" * 30)
for i in range(len(monthly_sales)):
current = monthly_sales[i]
if i == 0:
# 1月は前月比なし
print(f"{months[i]} {current:3}万円 -")
else:
# 前月と比較
previous = monthly_sales[i - 1]
growth = ((current / previous) - 1) * 100
print(f"{months[i]} {current:3}万円 {growth:+5.1f}%")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【月次売上推移】 月 売上 前月比 ------------------------------ 1月 100万円 - 2月 120万円 +20.0% 3月 115万円 -4.2% 4月 130万円 +13.0% 5月 125万円 -3.8% 6月 140万円 +12.0% 7月 138万円 -1.4% 8月 145万円 +5.1% 9月 150万円 +3.4% 10月 155万円 +3.3% 11月 160万円 +3.2% 12月 170万円 +6.2%
💡 コードの解説
monthly_sales[i - 1]
・i - 1 で1つ前の要素(前月)にアクセスします
・i = 0 のとき、i - 1 = -1 となり、最後の要素を参照してしまうので注意
if i == 0:
・1月(i = 0)のときは前月がないので、条件分岐で処理を変えます
💰 4. 目標達成率
目標に対してどれだけ達成できたかを計算する方法を学びましょう。
🔰 目標達成率とは?
📝 書き方:目標達成率の計算式
達成率(%)= (実績 ÷ 目標) × 100
達成率の意味:
・100%以上 → 目標達成
・100%未満 → 目標未達成
📘 目標達成状況の分析
コード:各部門の目標達成状況
# 各部門の売上目標と実績
departments = {
"営業1部": {"target": 500, "actual": 520},
"営業2部": {"target": 400, "actual": 380},
"営業3部": {"target": 300, "actual": 315}
}
print("【目標達成状況】")
print()
total_target = 0
total_actual = 0
for dept, data in departments.items():
target = data["target"]
actual = data["actual"]
# 達成率を計算
achievement = (actual / target) * 100
# 目標との差
diff = actual - target
# 合計を累積
total_target += target
total_actual += actual
# 達成判定
if achievement >= 100:
status = "✅ 達成"
elif achievement >= 90:
status = "⚠️ ほぼ達成"
else:
status = "❌ 未達成"
print(f"{dept}")
print(f" 目標: {target}万円")
print(f" 実績: {actual}万円")
print(f" 達成率: {achievement:.1f}% {status}")
print(f" 差異: {diff:+}万円")
print()
# 全体の達成率
overall_achievement = (total_actual / total_target) * 100
print(f"【全体】")
print(f"目標合計: {total_target}万円")
print(f"実績合計: {total_actual}万円")
print(f"全体達成率: {overall_achievement:.1f}%")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【目標達成状況】 営業1部 目標: 500万円 実績: 520万円 達成率: 104.0% ✅ 達成 差異: +20万円 営業2部 目標: 400万円 実績: 380万円 達成率: 95.0% ⚠️ ほぼ達成 差異: -20万円 営業3部 目標: 300万円 実績: 315万円 達成率: 105.0% ✅ 達成 差異: +15万円 【全体】 目標合計: 1200万円 実績合計: 1215万円 全体達成率: 101.2%
💡 コードの解説
data["target"]
・辞書の中にある辞書(入れ子構造)から値を取得
・departments["営業1部"]["target"] → 500
total_target += target
・ループしながら合計を計算(累積加算)
・最後に全体の達成率を計算するために使います
📊 5. 実践例:総合分析レポート
ここまで学んだことを組み合わせて、実践的な分析レポートを作成しましょう。
📘 例:市場シェア分析
コード:市場シェア分析
# 企業別売上(億円)
companies = {
"A社": 500,
"B社": 300,
"C社": 150,
"D社": 50,
"その他": 100
}
total_market = sum(companies.values())
print("【市場シェア分析】")
print(f"市場規模: {total_market}億円")
print()
# シェアの大きい順にソート
sorted_companies = sorted(companies.items(), key=lambda x: x[1], reverse=True)
# 累積シェアを計算しながら表示
cumulative = 0
for company, sales in sorted_companies:
share = (sales / total_market) * 100
cumulative += share
print(f"{company:8}: {sales:3}億円 シェア{share:5.1f}% 累積{cumulative:5.1f}%")
print()
# トップ3のシェア合計
top3_sales = sum([sales for _, sales in sorted_companies[:3]])
top3_share = (top3_sales / total_market) * 100
print(f"💡 トップ3社の合計シェア: {top3_share:.1f}%")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【市場シェア分析】 市場規模: 1100億円 A社 : 500億円 シェア 45.5% 累積 45.5% B社 : 300億円 シェア 27.3% 累積 72.7% C社 : 150億円 シェア 13.6% 累積 86.4% その他 : 100億円 シェア 9.1% 累積 95.5% D社 : 50億円 シェア 4.5% 累積100.0% 💡 トップ3社の合計シェア: 86.4%
💡 累積シェアの意味
累積シェアは、上位からの合計シェアを示します。
・A社だけで45.5%
・A社+B社で72.7%
・A社+B社+C社で86.4%
これにより「上位何社で市場の何%を占めるか」が分かります。
📘 例:総合販売レポート
構成比、前年比、達成率を全てまとめた総合レポートを作成します。
コード:総合販売レポート
def sales_report(data):
"""
総合販売レポートを表示する関数
引数:
data: 商品別データ {商品名: {"今年": 値, "前年": 値, "目標": 値}}
"""
# 今年の合計
total_current = sum(item["今年"] for item in data.values())
print("【総合販売レポート】")
print(f"今年の総売上: {total_current}万円")
print()
# ヘッダー
print(f"{'商品':<8} {'今年':>6} {'構成比':>6} {'前年比':>7} {'達成率':>7}")
print("-" * 50)
for product, values in data.items():
current = values["今年"]
previous = values["前年"]
target = values["目標"]
# 構成比
composition = (current / total_current) * 100
# 前年比
yoy = ((current / previous) - 1) * 100
# 達成率
achievement = (current / target) * 100
print(f"{product:<8} {current:>4}万円 {composition:>5.1f}% {yoy:>+6.1f}% {achievement:>6.1f}%")
print()
# テストデータ
products = {
"商品A": {"今年": 300, "前年": 250, "目標": 280},
"商品B": {"今年": 200, "前年": 220, "目標": 230},
"商品C": {"今年": 150, "前年": 140, "目標": 160}
}
sales_report(products)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【総合販売レポート】 今年の総売上: 650万円 商品 今年 構成比 前年比 達成率 -------------------------------------------------- 商品A 300万円 46.2% +20.0% 107.1% 商品B 200万円 30.8% -9.1% 87.0% 商品C 150万円 23.1% +7.1% 93.8%
💡 レポートの読み方
商品A:構成比が最大(46.2%)、前年比も+20%で成長、目標も達成(107.1%)
商品B:前年より減少(-9.1%)、目標未達(87.0%)→ 要改善
商品C:前年より成長(+7.1%)だが、目標にはあと少し(93.8%)
📝 練習問題
ここまで学んだことを、実際に手を動かして確認しましょう。
問題1:正答率の計算(初級)
📋 問題
50問中42問正解した場合の正答率をパーセントで計算してください。
解答例を見る
コード
correct = 42
total = 50
# 正答率を計算
accuracy = (correct / total) * 100
print(f"正解数: {correct}問")
print(f"総問題数: {total}問")
print(f"正答率: {accuracy:.1f}%")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
正解数: 42問 総問題数: 50問 正答率: 84.0%
問題2:構成比の計算(初級)
📋 問題
辞書 {"A": 30, "B": 20, "C": 50} の各要素の構成比(%)を計算してください。
解答例を見る
コード
data = {"A": 30, "B": 20, "C": 50}
total = sum(data.values())
print(f"合計: {total}")
print()
for key, value in data.items():
percentage = (value / total) * 100
print(f"{key}: {value} ({percentage:.1f}%)")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
合計: 100 A: 30 (30.0%) B: 20 (20.0%) C: 50 (50.0%)
問題3:前年比の計算(中級)
📋 問題
前年の売上が800万円、今年の売上が950万円の場合、前年比を計算し、成長したかどうかを判定してください。
解答例を見る
コード
last_year = 800
this_year = 950
# 増減額
diff = this_year - last_year
# 前年比
growth_rate = (diff / last_year) * 100
print(f"前年: {last_year}万円")
print(f"今年: {this_year}万円")
print(f"増減: {diff:+}万円")
print(f"前年比: {growth_rate:+.1f}%")
if growth_rate > 0:
print("📈 売上が増加しました")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
前年: 800万円 今年: 950万円 増減: +150万円 前年比: +18.8% 📈 売上が増加しました
問題4:目標達成率(中級)
📋 問題
目標1200万円に対して実績が1150万円だった場合、達成率を計算し、100%以上なら「達成」、90%以上なら「ほぼ達成」、それ未満なら「未達成」と表示してください。
解答例を見る
コード
target = 1200
actual = 1150
# 達成率
achievement = (actual / target) * 100
print(f"目標: {target}万円")
print(f"実績: {actual}万円")
print(f"達成率: {achievement:.1f}%")
# 判定
if achievement >= 100:
print("✅ 達成")
elif achievement >= 90:
print("⚠️ ほぼ達成")
else:
print("❌ 未達成")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
目標: 1200万円 実績: 1150万円 達成率: 95.8% ⚠️ ほぼ達成
問題5:複数月の前月比(上級)
📋 問題
リスト [100, 110, 105, 115, 120, 125] の各月の前月比を計算して表示してください(1月目は前月比なし)。
解答例を見る
コード
monthly_data = [100, 110, 105, 115, 120, 125]
print("月 データ 前月比")
print("-" * 25)
for i in range(len(monthly_data)):
month = i + 1
value = monthly_data[i]
if i == 0:
print(f"{month}月 {value:3} -")
else:
# 前月比を計算
prev_value = monthly_data[i - 1]
growth = ((value / prev_value) - 1) * 100
print(f"{month}月 {value:3} {growth:+6.1f}%")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
月 データ 前月比 ------------------------- 1月 100 - 2月 110 +10.0% 3月 105 -4.5% 4月 115 +9.5% 5月 120 +4.3% 6月 125 +4.2%
🎯 このステップのまとめ
✅ 学んだこと
✓ 割合 = 部分 ÷ 全体
✓ パーセント = 割合 × 100
✓ 構成比:全体の中での各項目の割合(合計100%)
✓ 前年比:前期に対する増減率
✓ 達成率:目標に対する実績の割合
✓ 小数点以下の表示を:.1fで制御できる
✓ プラス記号の表示を:+で制御できる
💡 次のステップに進む前に確認
以下のことができるようになったか確認しましょう:
□ 割合とパーセントを計算できる
□ 構成比を計算して表示できる
□ 前年比(成長率)を計算できる
□ 目標達成率を計算できる
これらができたら、次のステップに進みましょう!
❓ よくある質問
Q1: 割合と比率の違いは何ですか?
A: 割合は全体に対する部分(0〜1の小数)、比率は2つの量の関係(例:3:2)です。パーセントは割合を100倍したものです。実務ではほぼ同じ意味で使われることが多いです。
Q2: 構成比が100%にならないのはなぜ?
A: 小数点以下の四捨五入が原因です。各項目を四捨五入すると、合計が99.9%や100.1%になることがあります。これは正常な動作で、計算ミスではありません。
Q3: 前年比がマイナスの場合の表示は?
A: {growth_rate:+.1f}%のように+記号をつけると、プラスは「+」、マイナスは「-」が自動で付きます。増減が一目で分かりやすくなります。
Q4: 0で割るとエラーになります
A: 前年や目標が0の場合、割り算ができません。if文で0チェックをしてからパーセントを計算しましょう。例:if previous != 0:
Q5: パーセントポイントとは何ですか?
A: パーセントポイント(pp)は、パーセント同士の差です。例えば、シェアが20%から25%に増えた場合、「5ポイント増」と言います。「25%増」とは意味が違うので注意しましょう(25%増だと20%→25%ではなく、20%の25%増=25%になります)。
学習メモ
Pythonデータ分析入門 - Step 15