🌸こんにちは、Yuinaですっ😊💕
今回は《美容センサス💄📊》のデータを使って、
20代と30代の美容への関心や意識の違いをSQLで見ていきますっ✨
👀「どっちの年代がどの美容に夢中なの〜?」
💉「美容医療を受ける理由って、何だろう?」
などなど、気になるトピックにゆる〜く触れていきます🎶
ドリル風にクイズ形式📝で問題を作っているので、
クイズ感覚で一緒に楽しく勉強していきましょう〜っ🎓💡
使用するテーブルはこちらですっ👇📁
sences
→ 「美容への関心」を年代別に調査したデータです。
「とても関心がある」「やや関心がある」という感じで、その熱量がパーセンテージで入ってます♡
年代 | n数 | とても関心がある (%) | やや関心がある (%) | 関心がある合計 (%) | 関心がない合計 (%) |
---|---|---|---|---|---|
20代 | 1,076 | 36.0 | 39.2 | 75.2 | 24.8 |
30代 | 1,149 | 32.1 | 42.3 | 74.3 | 25.7 |
beauty_improvement
→ 「美容意識の改善ポイント」を年代別にまとめたテーブルです!
髪型とか肌質、体型とか、どこを気にしてるかがバッチリわかります。
項目 | 20代 (%) | 30代 (%) |
---|---|---|
髪型 | 58.6 | 57.1 |
髪質 | 60.0 | 56.8 |
顔の肌質 | 60.5 | 56.5 |
体型(全体のバランス) | 50.9 | 50.1 |
体毛(ムダ毛) | 62.1 | 51.5 |
体臭・口臭 | 56.3 | 50.8 |
beauty_medical_reason
→ 「美容医療を受ける理由」が載っているデータです👀
コンプレックス解消や自己満足など、どんな動機で美容医療を選んでるか、わかりますね!
理由 | 20代 (%) | 30代 (%) |
---|---|---|
コンプレックスの解消 | 24.4 | 29.0 |
老化の予防・アンチエイジング | 7.6 | 10.9 |
モテたい | 6.2 | 6.8 |
幸せを感じたい | 10.0 | 7.2 |
自己満足 | 24.2 | 25.6 |
自分へのご褒美として | 11.8 | 12.4 |
時短美容のため | 13.2 | 11.0 |
SNSでの投稿を見て | 7.1 | 4.1 |
周囲から勧められて | 7.8 | 8.6 |
それでは、よろしくお願いいたします!!
問題(+答え)🔥
問題1:
美容への関心(「とても関心がある」と「やや関心がある」の合計)が高いのはどちらの年代か?
SELECT
age_group,
SUM(value) AS total_interest --valueの合計値を算出
FROM
beauty
WHERE
item IN ('とても関心がある', 'やや関心がある') --比較的、高い関心がある人に条件を絞る
GROUP BY
age_group
ORDER BY
total_interest DESC;

30代のスコアが74.4、20代のスコアが75.2となりました。
結果、20代は30代と比べて関心が高い傾向にあることが推測できます✨
問題2:
美容意識改善の項目の中で、20代と30代で意識の差が大きいトップ3の項目は何か教えてください。
SELECT
item,
MAX(CASE WHEN age_group = '20代' THEN value ELSE NULL END) AS value_20,
MAX(CASE WHEN age_group = '30代' THEN value ELSE NULL END) AS value_30,
--ROUND関数で桁を揃えるために、valueをnumeric型に変換します
ROUND(
ABS(
MAX(CASE WHEN age_group = '20代' THEN value::numeric ELSE NULL END) - MAX(CASE WHEN age_group = '30代' THEN value::numeric ELSE NULL END)
), 1
) AS gap
FROM
beauty.beauty_improvement
GROUP BY
item
ORDER BY
gap DESC
LIMIT 3;

20代と30代で意識の差が最も大きいのは体毛(ムダ毛)、
2番目に大きいのは体臭・口臭、3番目は顔の肌質という結果になりました。
問題3:
それぞれの年代で、美容医療を受ける理由のトップ3は何か教えてください。
WITH ranked_reasons AS (
SELECT
bmr.reason,
bmr.age_group,
bmr.value,
--age_group ごとにvalueの降順で並べて、それぞれに 1, 2, 3… という連番(rank)を振る
ROW_NUMBER() OVER (PARTITION BY bmr.age_group ORDER BY bmr.value DESC) AS rank
FROM
beauty.beauty_medical_reason bmr
WHERE
bmr.age_group IN ('20代', '30代')
)

WITH ranked_reasons AS (
SELECT
bmr.reason,
bmr.age_group,
bmr.value,
ROW_NUMBER() OVER (PARTITION BY bmr.age_group ORDER BY bmr.value DESC) AS rank
FROM
beauty.beauty_medical_reason bmr
WHERE
bmr.age_group IN ('20代', '30代')
)
--ここから新しいクエリ
SELECT
reason,
age_group,
value
FROM
ranked_reasons
WHERE
rank <= 3
ORDER BY
age_group,
rank;

♡20代の美容医療を受ける理由
1位 コンプレックスの解消、2位 自己満足、3位 時短美容のため
♡30代の美容医療を受ける理由
1位 コンプレックスの解消、2位 自己満足、3位 自分へのご褒美として
という結果が出ました✨
問題4:
「美容医療を受ける理由」の中で、「自己満足」の割合は20代と30代でどれだけ違う?
手順1:20代・30代が美容医療やる理由のvalueの合計を確認します💃
WITH total_per_age AS (
SELECT
age_group,
SUM(value) AS total_value
FROM
beauty.beauty_medical_reason
WHERE
age_group IN ('20代', '30代')
GROUP BY
age_group
)

手順2:20代と30代の中で『自己満足』と答えた方たちのスコアだけ取得します💁♀️
WITH total_per_age AS (
SELECT
age_group,
SUM(value) AS total_value
FROM
beauty.beauty_medical_reason
WHERE
age_group IN ('20代', '30代')
GROUP BY
age_group
)
SELECT
age_group,
value AS self_value
FROM
beauty.beauty_medical_reason
WHERE
reason = '自己満足'
AND
age_group IN ('20代', '30代')

手順3:「自己満足 / 全体の理由」=つまり割合を出しますっ!
ratio_20
:20代がどれだけ「自己満足」って言ってるかratio_30
:30代がどれだけ「自己満足」って言ってるかdiff_ratio
:その差!(30代 − 20代)
WITH total_per_age AS (
SELECT
age_group,
SUM(value) AS total_value
FROM
beauty.beauty_medical_reason
WHERE
age_group IN ('20代', '30代')
GROUP BY
age_group
),
self_satisfaction AS (
SELECT
age_group,
value AS self_value
FROM
beauty.beauty_medical_reason
WHERE
reason = '自己満足'
AND age_group IN ('20代', '30代')
)
SELECT
ROUND( (t20.self_value::numeric / total20.total_value)::numeric, 2) AS ratio_20,
ROUND( (t30.self_value::numeric / total30.total_value)::numeric, 2) AS ratio_30,
ROUND(
((t30.self_value::numeric / total30.total_value)::numeric - (t20.self_value::numeric / total20.total_value)::numeric)
, 2) AS diff_ratio
FROM
self_satisfaction t20
JOIN total_per_age total20 ON t20.age_group = total20.age_group
JOIN self_satisfaction t30 ON t30.age_group = '30代'
JOIN total_per_age total30 ON total30.age_group = '30代'
WHERE
t20.age_group = '20代';

20代のスコアは0.215(21.5%)、30代のスコアは0.221(21.1%)でその差は0.006(0.6%)となりました。
大差ないように感じますね。
![]() | 達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ (CodeZine BOOKS) [ ミック ] 価格:2750円 |

問題5:
美容医療を受ける理由の中で、20代と30代で「差分」となる理由をすべて抽出し、差分も一緒に表示してください。
SELECT
b20.item,
b20.value AS score_20s,
b30.value AS score_30s,
ROUND((b20.value - b30.value)::numeric, 2) AS diff_20_30
FROM
beauty.beauty_improvement b20
JOIN
beauty.beauty_improvement b30
ON
b20.item = b30.item
WHERE
b20.age_group = '20代'
AND
b30.age_group = '30代'
ORDER BY
--ABSは絶対値(数字の「符号を無視した大きさ」)を返す関数
ABS(b20.value::numeric - b30.value) DESC
LIMIT 5;

差分が最も大きいのは体毛(ムダ毛)となりました。
体毛(ムダ毛)については、20代は関心のスコアが62.1と最も高くなっています。
続いて、顔の肌質、髪質となっています。
一方で、30代では髪型への関心が最も高い傾向にありますね。
そして、2番目に髪質、3番目に顔の肌質に関心があるということが伺えます。
問題6:
美容への関心が「高い(とても関心がある + やや関心がある)」人が、
どの部位の改善に最も注力しているかを、20代・30代で比較してください。
SELECT
b20.item,
b20.age_group,
b20.value AS value_20,
b30.age_group,
b30.value AS value_30,
ROUND((b20.value - b30.value)::numeric,2) AS gap
FROM
beauty.beauty_improvement b20
INNER JOIN
beauty.beauty_improvement b30
ON
b20.item = b30.item
WHERE
b20.age_group = '20代'
AND
b30.age_group = '30代'
ORDER BY
--ABSは絶対値(数字の「符号を無視した大きさ」)を返す関数
ABS(b20.value::numeric - b30.value) DESC
LIMIT 5;

問題7:
20代と30代の中で、美容に関心ある人たち(「とても関心がある+やや関心がある」の合計が高い年代)が特に気にしてる美容の改善ポイント(髪型や肌質)を上位3つを教えてください!
その年代が美容医療を受ける理由で一番多い理由とパーセンテージも一緒に見せてください。
beauty_improvement
テーブルから 20代の改善項目を抽出しています。
そして、value
が高い(=関心が高い)上位3件を取得します。
SELECT
item,
value
FROM
beauty.beauty_improvement
WHERE
age_group = '20代'
ORDER BY
value DESC
LIMIT 3;

beauty_medical_reason
テーブルから 20代の医療美容の理由を抽出します。
そして、value
が最も高い理由1件を取得します。
SELECT
reason,
value
FROM
beauty.beauty_medical_reason
WHERE
age_group = '20代'
ORDER BY
value DESC
LIMIT 1;

上位3つの改善項目と最も多い理由1つをクロス結合(CROSS JOIN)します。
結果として「改善項目 × 理由」の3行が出力される。
WITH top_improvements AS (
SELECT
item,
value
FROM
beauty.beauty_improvement
WHERE
age_group = '20代'
ORDER BY
value DESC
LIMIT 3
),
top_reason AS (
SELECT
reason,
value
FROM
beauty.beauty_medical_reason
WHERE
age_group = '20代'
ORDER BY
value DESC
LIMIT 1
)
--ここから新しいクエリ追加
SELECT
t1.item,
t1.value AS improvement_value,
t2.reason,
t2.value AS reason_value
FROM
top_improvements t1
CROSS JOIN
top_reason t2;

![]() | 達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ (CodeZine BOOKS) [ ミック ] 価格:2750円 |

📝まとめ:データで見ると、美容の本音が見えてくる!
今回、「美容分析ドリル🧪💄」を使ってデータをいじってみたところ…
「美容医療を受ける理由💉」や「改善したいポイント👀」に、
年代ごとのリアルな違いが見えてきて、すごく面白かったですっ😳
美容って、なんとなく感覚的なものだと思いがちだけど、
📊データで見ると超具体的! そしてめっちゃ共感できる〜っ💞と思いました🌸
これからも、いろんな角度から
美意識のデータを深掘りしていきたいな〜って思いましたっ🌈✨
見てくれてありがとうございましたっ🙏💖💫
コメント