기계학습 모델 구현 보고서

음악 청취 데이터로 음악 취향 군집화

정답이 하나도 없는 데이터를 세 덩어리로 나눴다.
그 덩어리에 이름을 붙인 것은 누구일까?

비지도학습 · 군집 (k-평균) 도구: 오렌지 엔터테인먼트 · 마케팅 · 데이터분석

기계학습 모델 구현 보고서를 어떻게 쓰는지 보여 주는 예시 프로젝트입니다. 문항을 푸는 순서와 근거를 대는 방식을 참고하되, 내용은 자신의 프로젝트로 채웁니다. 표와 그래프의 숫자는 수업에서 원리를 확인하려고 지어낸 값이며 실제 청취 기록이 아닙니다.

기계학습 모델 구현 보고서 예시 내려받기

이 페이지의 문항 1~8을 그대로 담은 보고서 파일입니다. 내려받아 작성 방법을 확인하고 자신의 프로젝트로 바꾸어 채웁니다.

아이디어에서 설계까지

정답이 하나도 없는 데이터로도 무언가를 배울 수 있을까?

레이블 없이 묶는다는 것이 무엇인지 따라가 봅시다.

보고서 여덟 문항은 이 여섯 단계를 따라간다 1 문제 정의 2 데이터 수집 3 데이터 전처리 4 유형· 알고리즘 선정 5 모델 생성 6 성능 평가 문항 1 · 2 문항 4 문항 3 문항 5 문항 6 · 7
문항 번호와 단계 번호가 나란히 가지 않는다. 유형과 알고리즘은 데이터를 모아 정리한 다음에 고르는 것이라 보고서에서는 문항 3이지만 실제 작업은 데이터 전처리를 마친 뒤에 한다.
1

어디서 아이디어를 얻었나 — 실생활의 궁금함

친구들과 재생 목록을 바꿔 들어 보니 겹치는 사람과 전혀 안 겹치는 사람이 나뉘었다. 장르 이름으로는 잘 설명되지 않았는데, 빠르기와 세기 같은 숫자로 보면 비슷한 사람끼리 모이지 않을까 궁금해졌다.

2

왜 기계학습인가 — 나눌 기준을 모른다

BPM 120 넘으면 활동적처럼 내가 선을 그을 수도 있다. 그런데 120은 어디서 나온 숫자인가? 애초에 몇 덩어리로 나뉘는지조차 모른다. 기계학습은 그 덩어리를 데이터에서 찾아 준다.

3

왜 군집인가 — 정답이 없다

예측이나 분류와 결정적으로 다른 점이 있다. 이 데이터에는 정답 칸이 없다. 누가 「힐링파」인지 적혀 있지 않고, 애초에 그런 이름이 있지도 않다. 정답 없이 비슷한 것끼리 묶는 것이 군집이다.

무엇을 풀 것인가

취향은 몇 가지로 나눌 수 있을까?

인공지능이 손댈 수 있는 모양으로 문제를 다시 써 봅시다.

문항 1. 문제 정의

실생활이나 학문 분야에서 인공지능으로 해결하고자 하는 문제를 구체적으로 정의하시오. 어떤 상황에서 어떤 불편함 또는 필요가 발생하는지를 포함하여 서술하시오.

음악 취향을 이야기할 때 흔히 장르 이름을 쓰는데, 같은 장르를 좋아한다고 해서 실제로 듣는 곡이 비슷하지는 않다. 반대로 장르가 다른데도 재생 목록이 크게 겹치는 경우가 있다. 장르라는 이름표가 실제 듣는 습관을 잘 나타내지 못한다는 것이 출발점이었다.

그래서 사람들이 듣는 음악의 빠르기와 세기 같은 숫자만 가지고, 비슷한 사람끼리 몇 덩어리로 모이는지 찾아내는 모델을 만들고자 한다. 몇 덩어리인지도, 각 덩어리가 무엇인지도 미리 정하지 않는다.

자기점검 체크리스트

  • ☑ 해결하고자 하는 문제가 실생활 또는 학문 분야와 연관되어 구체적으로 제시되어 있다.
  • ☑ 문제가 발생하는 상황(불편함·필요성)이 명확하게 서술되어 있다.

무엇이 들어가고 무엇이 나오는가

모델이 내놓는 것은 「힐링 음악파」일까?

입력과 출력을 못 박으면 만들 것의 윤곽이 잡힙니다.

문항 2. 모델 설명 (입력 → 출력)

구현하려는 인공지능 모델을 설명하시오. 이 모델은 어떤 데이터를 입력받아, 어떤 결과를 출력하는가? 입력과 출력을 중심으로 모델의 역할을 구체적으로 서술하시오.

  • ■ 입력: 사람마다 자주 듣는 곡들의 평균 BPM과 평균 에너지(0~1) — 숫자 두 개
  • ■ 출력: 군집 번호 하나 — 0, 1, 2 가운데 하나

모델이 내놓는 것은 번호뿐이다. 「힐링 음악파」나 「운동할 때 듣는 음악」 같은 이름은 모델 안에 없다. 번호가 붙은 뒤에 내가 각 덩어리의 평균값을 보고 이름을 지어 붙이는 것이다.

이 구별이 이 프로젝트에서 가장 중요하다. 모델이 찾아 준 것은 덩어리이고, 뜻을 붙인 것은 사람이다.

모델은 번호까지만 준다. 이름은 사람이 붙인다 입력 평균 BPM 76 평균 에너지 0.24 학습된 모델 가장 가까운 중심 군집 1 사람이 붙인 이름 평균값을 보고 지음 「느리고 잔잔한 쪽」 오른쪽 상자는 모델 밖이다. 데이터는 이 이름이 맞는지 말해 주지 않는다

자기점검 체크리스트

  • ☑ 만들고자 하는 모델의 입력 데이터(종류·형태)가 명확히 제시되어 있다.
  • ☑ 모델이 출력하는 결과(레이블·수치·군집 등)가 구체적으로 서술되어 있다.
  • ☑ 입력과 출력을 통해 모델의 역할이 명확하게 드러난다.

어떤 방법으로 풀 것인가

정답이 없으면 어느 가지로 가게 될까?

두 번의 질문으로 유형이 정해지고, 정해진 유형이 도구를 정합니다.

문항 3. 기계학습 유형 및 구현 도구 선택

위에서 구상한 모델을 구현하기 위해 아래 ①, ② 순서대로 선택하고 그 이유를 서술하시오. ① 기계학습 유형: 지도학습과 비지도학습 중 이 모델에 적합한 유형을 선택하고, 분류·군집·예측 등의 개념을 활용하여 그 이유를 설명하시오. ② 구현 도구: ①에서 선택한 유형을 구현하기 위해 티처블머신·코랩·오렌지 중 어떤 도구를 선택했는지 밝히고, 그 이유를 서술하시오.

유형은 취향이 아니라 두 번의 질문으로 정해진다 데이터에 정답(레이블)이 함께 들어 있는가? 아니오 예 비지도학습 군집 ↑ 이 프로젝트 지도학습 출력이 숫자인가, 범주인가? 숫자 범주 예측 (회귀) 분류
첫 질문에서 이미 정해진다. 정답이 없으므로 왼쪽으로 가고, 두 번째 질문은 지나가지도 않는다. — 왼쪽 가지에는 「맞혔다」는 개념 자체가 없다.

① 기계학습 유형: 비지도학습 — 군집 (k-평균)

모아 둔 데이터에는 「이 사람은 어느 취향」이라는 정답이 없다. 있을 수가 없다 — 그런 이름을 붙인 사람이 아무도 없기 때문이다. 정답 없이 비슷한 것끼리 묶어야 하므로 비지도학습의 군집을 쓴다.

다른 방법이 아닌 이유: 분류를 쓰려면 먼저 내가 취향 이름을 정하고 200명에게 하나씩 붙여야 하는데, 그 이름이 맞는지 확인할 방법이 없다. 그리고 그렇게 하면 내가 정한 답을 모델이 반복할 뿐이라 새로 알게 되는 것이 없다. 예측(회귀)은 숫자 하나를 맞히는 방법인데, 내가 알고 싶은 것은 숫자가 아니라 덩어리가 몇 개이고 어떻게 나뉘는가다.

② 구현 도구: 오렌지(Orange)

표 형태의 CSV를 그대로 읽어 들이고, k-Means 블록에서 k를 바꿔 가며 결과를 비교할 수 있다. 산점도에 군집을 색으로 칠해 주고, 단위가 다른 열을 같은 자로 맞추는 기능(Preprocess 블록의 Normalize Features)이 따로 있다는 점이 중요했다. 군집은 거리로 판단하므로 이 단계를 빠뜨리면 결과가 통째로 달라진다. 티처블머신은 사진·소리를 다루는 도구라 표 데이터에 맞지 않고, 코랩은 같은 일을 할 수 있지만 코드를 직접 써야 해서 이번 목적에는 과하다.

자기점검 체크리스트

  • ☑ 지도학습 또는 비지도학습 중 하나를 명확히 선택하였다.
  • ☑ 분류·군집·예측 등의 개념을 활용하여 유형 선택 이유가 논리적으로 서술되어 있다.
  • ☑ 구현 도구를 선택하고 그 이유가 기계학습 유형과 연결되어 설명되어 있다.

무엇으로 배우게 할 것인가

정답 칸이 없는 데이터는 어떻게 생겼을까?

군집에 쓰는 데이터에는 무엇이 없는지를 봅시다.

문항 4. 데이터 설명

모델 학습에 사용한 데이터를 설명하시오. 데이터의 출처·유형·수량·특성 등을 작성하고, 필요한 경우 스크린샷을 첨부하시오.

  • • 출처: 공개 데이터 플랫폼에 올라온 음악 청취 기록 데이터셋 (누구인지 알 수 없게 처리된 자료, 이용 조건을 확인하고 내려받음)
  • • 유형: 수치형 정형 데이터 (CSV, 특성 2개)
  • • 수량: 200명 — 사람마다 자주 듣는 곡들의 평균값 한 줄
  • • 범위: 평균 BPM 60~180, 평균 에너지 0~1
  • • 없는 것: 취향 이름이 적힌 열이 없다. 맞힐 정답 칸이 없다는 뜻이다.
번호  | 평균 BPM | 평균 에너지
──────┼──────────┼────────────
 001  |    72    |    0.23
 002  |   168    |    0.91
 003  |   118    |    0.65
 004  |    85    |    0.31
 005  |   155    |    0.84
(이하 195행 생략 / 전체 200행)

실제 수행평가 때는 여기에 데이터셋 내려받기 화면 및 오렌지 CSV 불러오기 화면 스크린샷을 붙입니다.

군집에 쓰는 데이터에서 특히 조심할 것

  • 단위가 다르면 큰 숫자가 결과를 지배한다. BPM은 60~180이고 에너지는 0~1이다. 그대로 두면 BPM 차이 10이 에너지 차이 1.0보다 크게 계산되어, 사실상 BPM 하나로만 나뉜다. 군집은 거리로 판단하므로 반드시 같은 자로 맞춘 뒤에 실행한다. 군집에서 가장 자주 빠뜨리는 단계다.
  • 어떤 열을 넣느냐가 결과를 정한다. BPM과 에너지를 골랐으니 그 두 가지로 나뉜 덩어리가 나온다. 가사나 발매 연도를 넣었다면 전혀 다른 덩어리가 나왔을 것이다. 「진짜 취향 분류」를 찾은 것이 아니라, 내가 고른 두 숫자로 본 모습을 얻은 것이다.
  • 사람에 관한 기록이므로 누구인지 알 수 없어야 한다. 청취 기록은 생활 습관을 드러낸다. 번호만 남기고 이름·아이디는 지운 자료를 썼다.

자기점검 체크리스트

  • ☑ 데이터의 출처(직접 촬영·공개 데이터셋·직접 수집 등)가 명시되어 있다.
  • ☑ 데이터의 유형(이미지·텍스트·수치 등)과 수량이 구체적으로 서술되어 있다.
  • ☑ 학습에 사용된 데이터 화면 또는 데이터 목록 스크린샷이 첨부되어 있다.

모델은 무엇을 배웠는가

k를 3으로 정한 근거는 무엇일까?

몇 덩어리로 나눌지를 눈이 아니라 숫자로 정해 봅시다.

문항 5. 학습 결과

수집한 데이터로 모델을 학습시킨 결과를 서술하시오. 학습이 완료된 화면 또는 학습 결과를 스크린샷으로 첨부하고, 수치나 지표를 포함하여 결과의 의미를 간략히 설명하시오.

이 결과를 직접 만들어 보려면 — 오렌지에서 잇는 순서

  1. File 블록을 놓고 청취 기록 CSV를 불러온다.
  2. Preprocess 블록을 반드시 먼저 잇고 Normalize Features를 고른다. BPM과 에너지의 자릿수가 달라서, 이걸 빠뜨리면 사실상 BPM 하나로만 나뉜 결과가 나온다.
  3. k-Means 블록을 잇고 k를 2부터 5까지 바꿔 가며 흩어진 정도가 얼마나 줄어드는지 적어 둔다.
  4. 줄어드는 폭이 갑자기 작아지는 k를 고른다. 눈으로 보고 고르는 것보다 근거를 댈 수 있다.
  5. Scatter Plot으로 색이 잘 나뉘었는지 보고, Box Plot으로 군집별 평균값을 확인한다.
  6. 여기서부터가 사람의 일이다 — 평균값을 읽고 각 군집에 이름을 붙인다. 모델은 여기까지 오지 않는다.

이 상자는 보고서에 쓰는 답이 아니라 따라 해 보라는 안내다.

■ k를 몇으로 할지 정한 근거

k를 2부터 5까지 바꿔 가며 같은 군집 안에서 점들이 얼마나 흩어져 있는지를 측정했다. 이 값은 k를 키우면 반드시 줄어들지만, 줄어드는 폭이 갑자기 작아지는 지점이 있다.

k 흩어진 정도 앞보다 줄어든 폭
2 48.2 —
3 26.5 21.7
4 22.8 3.7
5 20.1 2.7

2에서 3으로 갈 때는 21.7이 줄었는데 3에서 4로 갈 때는 3.7밖에 줄지 않았다. 3 다음부터는 나눠도 별로 나아지지 않는다는 뜻이라 k=3으로 정했다.

■ 모델이 내놓은 것 — 군집 셋과 그 중심

  • 군집 1 (78명): 중심 BPM 78 / 에너지 0.26
  • 군집 2 (68명): 중심 BPM 120 / 에너지 0.67
  • 군집 3 (54명): 중심 BPM 160 / 에너지 0.88

모델의 출력은 여기까지다. 번호와 중심 좌표, 그리고 각 사람이 어느 번호에 속하는지. 「느리고 잔잔한 쪽」, 「빠르고 힘 있는 쪽」 같은 말은 내가 평균값을 보고 붙인 이름이며 모델이 알려 준 것이 아니다.

실제 수행평가 때는 여기에 오렌지 k-Means 결과 및 Scatter Plot 화면 스크린샷을 붙입니다.

군집에는 「정확도」가 없다

예측이나 분류에서는 정확도나 R²처럼 「얼마나 맞혔는가」를 측정하는 숫자가 있었다. 군집에는 그런 숫자가 없다. 맞고 틀림을 판정할 정답이 애초에 없기 때문이다.

대신 측정하는 것은 「얼마나 잘 뭉쳤는가」다. 같은 군집 안의 점들이 서로 가깝고 다른 군집과는 멀수록 잘 나뉜 것으로 본다. 위 표의 「흩어진 정도」가 그런 숫자다.

그러나 잘 뭉쳤다는 것이 그 덩어리가 의미 있다는 뜻은 아니다. 아무 숫자나 넣어도 k-평균은 언제나 k개의 덩어리를 만들어 낸다. 그 덩어리가 뜻이 있는지는 사람이 판단해야 한다.

평균 에너지 군집 1 군집 2 군집 3 중심 0 0.5 1.0 60 90 120 150 180 평균 BPM 경계에 놓인 사람 군집 1까지 0.25 / 군집 2까지 0.29
모델이 아는 것은 이 그림까지다 — 점의 색과 X 표시된 중심 세 개. 각 덩어리가 무엇을 뜻하는지는 그림 어디에도 적혀 있지 않다. 빨간 동그라미는 두 중심까지의 거리가 거의 같아 조금만 달라도 소속이 바뀌는 사람이다.

자기점검 체크리스트

  • ☑ 학습이 완료된 모델 화면 또는 학습 결과 스크린샷이 첨부되어 있다.
  • ☑ 모델의 학습 결과를 확인할 수 있는 수치나 지표가 언급되어 있다.
  • ☑ 학습 결과의 의미(모델이 잘 학습되었는지 여부 등)가 서술되어 있다.

새로운 값을 넣으면 맞히는가

군집에는 정답이 없는데 무엇을 테스트할까?

같은 데이터를 두 번 실행해 보면 알 수 있는 것이 있습니다.

문항 6. 테스트 및 결과 분석

학습된 모델에 새로운 데이터를 직접 입력하여 성능을 테스트하시오. 테스트 전 예상했던 결과와 실제 결과를 비교하고, 차이가 발생했다면 그 원인을 분석하시오.

먼저 확인할 것: 군집에는 정답이 없으므로 「맞혔다」를 확인할 수 없다. 대신 배정이 납득할 만한지, 그리고 얼마나 안정적인지를 본다.

■ 테스트 1 — 중심에 가까운 사람 (BPM 76 / 에너지 0.24)

  • 예상: 군집 1(느리고 잔잔한 쪽)에 들어갈 것
  • 실제 출력: 군집 1, 중심까지 거리 0.03 — 아주 가깝다
  • 예상대로였다. 이런 사람은 k를 바꿔도 대체로 같은 쪽에 남는다.

■ 테스트 2 — 경계에 놓인 사람 (BPM 98 / 에너지 0.44)

  • 예상: 판단하기 어려움
  • 실제 출력: 군집 1 — 다만 군집 1까지 0.25, 군집 2까지 0.29로 차이가 0.04밖에 되지 않는다.
  • k를 4로 바꿔 다시 실행하자 이 사람은 다른 덩어리로 옮겨 갔다.

■ 테스트 3 — 같은 데이터를 그대로 다시 실행하기

  • 예상: 똑같은 결과가 나올 것
  • 실제 출력: 덩어리의 구성원은 같았지만 번호가 바뀌었다. 처음에 「군집 1」이던 78명이 두 번째에는 「군집 3」이 되어 있었다.
  • 예상과 달랐다.

■ 분석

테스트 3의 원인은 k-평균이 시작점을 무작위로 잡기 때문이다. 중심을 아무 데나 세 개 찍어 놓고 조금씩 옮겨 가며 자리를 잡는 방식이라, 어느 덩어리가 몇 번을 받을지는 그때그때 다르다.

여기서 중요한 것은 번호가 이름이 아니라는 점이다. 「군집 1」은 순서도 등급도 아니고 그저 붙은 딱지다. 그러므로 보고서에 「군집 1은 이러이러하다」고만 쓰면 다시 실행했을 때 말이 어긋난다. 번호가 아니라 중심 좌표로 덩어리를 가리켜야 한다.

테스트 2는 실패가 아니라 군집의 성질이다. 덩어리 사이에는 뚜렷한 선이 없고 경계 부근은 원래 흐릿하다. 그러므로 이런 사람을 한 덩어리에 넣어 놓고 그 이름으로 부르는 것은 모델이 보증하는 일이 아니다. 중심까지의 거리를 함께 봐야 얼마나 믿을 만한 배정인지 알 수 있다.

자기점검 체크리스트

  • ☑ 학습에 사용하지 않은 새로운 데이터로 테스트를 수행하였다.
  • ☑ 테스트 전 예상 결과와 실제 결과가 모두 서술되어 있다.
  • ☑ 예상과 실제 사이에 차이가 있다면 그 원인이 분석되어 있다. (차이가 없으면 이유 서술)

어디에 쓰고 무엇을 고칠 것인가

취향에 이름을 붙여도 될까?

쓸모와 한계를 나란히 놓고, 개선해도 남는 어려움까지 봅시다.

문항 7. 기대 효과 및 개선 사항

기대 효과: 이 모델을 자신의 관심 분야(예: 의료·환경·스포츠 등)에 적용한다면 어떤 효과를 기대할 수 있는지 서술하시오. 개선 사항: 현재 모델의 한계를 바탕으로, 성능을 향상시키기 위해 필요한 개선사항을 구체적으로 서술하시오.

기대 효과

관심 분야: 엔터테인먼트 · 데이터분석

새로 온 사람이 어느 덩어리에 가까운지 알면 같은 덩어리 사람들이 많이 들은 곡을 먼저 보여 줄 수 있다. 아무 정보가 없을 때보다 나은 출발점이 된다.

덩어리가 몇 개인지 미리 정해 두지 않고 데이터를 보며 고를 수 있다. 장르라는 기존 이름표에 기대지 않고 실제 듣는 습관으로 나뉜 모습을 볼 수 있었다.

개선 사항

한계: 특성이 두 개뿐이라 가사 유무·발매 연도·장르 같은 것이 빠져 있다. 그리고 실행할 때마다 번호가 바뀌고, 경계에 있는 사람의 소속은 흔들린다.

개선 방향: ① 특성을 늘려 여러 각도에서 나뉘는지 본다. ② 여러 번 실행해 늘 함께 묶이는 사람들만 같은 덩어리로 본다. ③ 중심에서 먼 사람은 어느 덩어리로도 부르지 않는다.

개선해도 남는 어려움

이름을 붙이는 순간 사람에게 꼬리표가 달린다. 「군집 2」는 아무 뜻이 없는 번호지만, 거기에 「파티를 좋아하는 사람들」 같은 이름을 붙이면 당사자가 동의한 적 없는 설명이 그 사람에게 붙는다. 이름은 편의를 위해 내가 붙인 것인데, 붙는 순간 사실처럼 다뤄지기 쉽다. 편하게 부르기 위한 이름과 사실 사이의 거리를 계속 의식해야 한다.

추천에 쓰면 취향이 좁아질 수 있다. 같은 덩어리 음악만 계속 보여 주면 잘 맞는 곡이 나오지만, 다른 덩어리의 음악을 만날 기회는 줄어든다. 잘 맞히는 추천과 새로운 것을 만나게 하는 추천은 방향이 다르고, 어느 쪽을 택할지는 군집 성능으로 정해지지 않는다.

그리고 k를 몇으로 하느냐가 결과를 정하는데 정답이 없다. 흩어진 정도가 근거를 주기는 하지만 그것도 「3쯤이 무난하다」는 정도이지 「취향은 세 가지다」라는 뜻이 아니다. 사람의 취향이 원래 몇 덩어리인지는 데이터가 답해 줄 수 있는 질문이 아니다.

자기점검 체크리스트

  • ☑ 자신의 관심 분야가 명시되고, 모델 적용 시 기대되는 효과가 구체적으로 서술되어 있다.
  • ☑ 현재 모델의 한계 또는 부족한 점이 언급되어 있다.
  • ☑ 성능 향상을 위한 개선사항(데이터 확충·모델 변경·파라미터 조정 등)이 제시되어 있다.

무엇이 남았는가

만들기 전과 후, 무엇이 달라졌을까?

점수가 아니라 생각의 변화를 적는 자리입니다.

문항 8. 소감

기계학습 모델을 직접 구현하는 과정에서 달라진 생각, 어려웠던 점, 새롭게 알게 된 것, 또는 느낀 점을 자유롭게 서술하시오.

정답이 하나도 없는 데이터로 무언가가 나온다는 것이 신기했다. 예측이나 분류에서는 늘 정답 칸이 있었는데, 이번에는 맞았는지 확인할 방법 자체가 없었다. 처음에는 그게 이상하게 느껴졌다.

가장 크게 놀란 것은 같은 데이터를 다시 실행했더니 번호가 바뀐 것이었다. 사람들은 그대로 묶였는데 「군집 1」이 「군집 3」이 되어 있었다. 번호는 이름이 아니라 그냥 딱지였다. 이걸 모르고 보고서를 썼다면 말이 어긋났을 것이다.

단위가 다른 열을 같은 자로 맞추는 정규화를 빠뜨리고 한 번 실행해 봤더니 결과가 완전히 달랐다. BPM은 60~180이고 에너지는 0~1이라, 그냥 실행하면 사실상 BPM 하나로만 나뉘었다. 거리로 판단하는 방법에서는 자를 맞추는 일이 계산보다 먼저라는 걸 배웠다.

그리고 「느리고 잔잔한 쪽」이라는 이름을 붙이면서 잠깐 멈칫했다. 모델은 번호까지만 줬고 그 이름은 내가 지은 것인데, 적어 놓고 보니 마치 데이터가 알려 준 사실처럼 보였다. 사람을 묶어서 이름 붙이는 일이 생각보다 조심스러운 일이라는 것을 느꼈다.

자기점검 체크리스트

  • ☑ 기계학습 구현 과정에서 새롭게 알게 된 것 또는 달라진 생각이 포함되어 있다.
  • ☑ 자신의 경험을 바탕으로 진솔하게 작성되어 있다.