Project

[기초 프로젝트] DAY 3

임빵빵 2024. 7. 26. 17:08

20240726 TIL

오늘은 어제 각자 해오기로 한 시각화를 보고 피드백을 해준 뒤 마지막으로 점검하는 시간을 가졌다.

 

<팀원들과 얘기를 나눈 결과 받은 피드백>

1. 범례 넣기 --> 오른쪽 위로 통일

2. 막대 그래프에 값 넣기 --> 발표할 때 보기 편함

3. 모든 그래프 한글로 통일

 

<내가 고민이었던 부분>

1) 순서 정렬

2) 막대 그래프에 값 넣기

3) 색 고민

 

나의 고민과 피드백이 겹치는 부분들이 있어 이 것들을 다 다시 해보았다.


 10-20 세대 별 가장 좋아하는 음악 감상 시간

1) 영어 --> 한글로 변경

처음 했을때는 시각화 그래프에서 한글 깨짐이 있길래 어떻게 해야 하나 구글링을 해봤다. 찾아보니 내 컴퓨터 안에 있는 폰트폴더를 찾아 있는 폴더를 코드 안에 지정을 해줘야했다. 

나는 애플고딕이 있길래 지정해줬다 (다른 코드들은 블로그에 있는 걸 그대로 복붙했다)

plt.rcParams['font.family']= 'AppleGothic'
plt.rcParams['axes.unicode_minus']=False

 

나는 사실 한글로 적으면 자꾸 한글깨짐이 발생하여 영어로 적었다. 그런데 아무래도 한글로 적는게 발표할때나 누가 볼때 이해하기 더 편할 것 같아 우리 팀은 시각화 한 것을 한글로  바꾸기로 했다. 나는 대부분이 영어라서 바꿀 것이 많았다.

영어를 한글로 바꾸기 위해서는 replace() 를 사용해줬다.

 

- afternoon, evining, morning --> 저녁, 밤, 아침

data['music_time_slot'] = data['music_time_slot'].replace({
    'Morning' : '아침',
    'Night' : '밤',
    'Afternoon' : '저녁'
})

print(data['music_time_slot'].unique())

#['밤' '저녁' '아침']

2) 순서 정렬 

내가 어제는 머리가 잘 안돌아갔었던 것 같다. 찾아보니 굉장히 쉬웠다 ...

그냥 sort.counts()만 붙이면 됐었다! (ascending=Flase) --> 내림차순

원래 순서는 아침 밤 저녁 이었는데 범례를 오른쪽 위에 넣으려면 어쩔 수 없이 내림차순을 통해 그래프 순서를 바꿔야만 했다.

ages = data[(data['Age'] == '12-20')]['music_time_slot'].value_counts().sort_values(ascending=False)

#저녁    33
#밤     21
#아침    17
#Name: music_time_slot, dtype: int64

 


3) 시각화 ( 범례 추가, 그래프 위 값 추가, 한글 변경)

 

<범례 추가>

범례를 추가하는 것도 그냥 강의시간때만 보고 실제로 해보는 것은 처음이었다. 그래서 코드를 잘 몰라서 구글링을 통해 알아냈다.

좀 복잡해서 한 번만에 이해하는 것이 어려웠다.

colors = {'저녁': 'hotpink', '밤': 'green', '아침': 'yellow'}
labels = list(colors.keys())
handles = [plt.Rectangle((0,0),1,1, color=colors[label], alpha=0.3) for label in labels]
plt.legend(handles, labels, loc='right', bbox_to_anchor=(1,0.9))

이게 내가 짠 범레 추가 코드이다.

(1) 색상 사전 정의

  • 내가 정했던 컬러들에 어떤 이름들로 범례가 들어갈 지 사전에 먼저 정해준다.
colors = {'저녁': 'hotpink', '밤': 'green', '아침': 'yellow'}

(2) 라벨 리스트 만들기

  • 컬러의 키(즉, 저녁 밤 아침)을 리스트로 변환해서 labels라는 리스트를 만들어준다.
labels = list(colors.keys())

(3) 범례 항목에 대한 막대기 모양 만들기

  • plt.Rectangle() 을 사용하여 사각형을 만들고 그 안의 (0,0) 은 사각형의 시작점이고
  • 1,1은 사각형의 너비와 높이
  • color=colors[label]을 통해 사각형의 색을 두번째로 만들었던 컬러의 값으로 설정
  • alpha=0.3은 색상의 투명도인데 나는 연한게 좋아서 0에 가깝게 함
handles = [plt.Rectangle((0,0),1,1, color=colors[label], alpha=0.3) for label in labels]

(4) 마지막으로 범례 추가

  • plt.legend 라는 함수를 이용해 범례를 그래프에 추가
  • handles는 범례에 표시할 모양(아까 정했던 사각형) 지정
  • lables는 범례에 표시할 텍스트(저녁 밤 아침) 지정
  • loc='right'는 범례를 그래프에 왼쪽에 지정할지 오른쪽에 지정할지 정하는 것 (right니까 오른쪽)
  • bbox_to_anchor=(1,0.9)는 범례의 위치를 더 정확하게 조정하는 것 
  • (1은 점점 왼쪽으로 이동, 0.9는 1로 갈수록 더 위로 0.9보다 아래로 갈수록 밑으로 내려감)
plt.legend(handles, labels, loc='right', bbox_to_anchor=(1,0.9))

 

--> 범례를 지정할때 뭔가 이것보다 쉬운 코드도 있을 것 같다.. 내가 괜히 돌아간 것만 같은 느낌이 ....

처음에는 도통 무슨소리인지 몰랐는데 하나하나 검색해가면서 찾아보니 그래도 조금씩 이해가 됐다. 이렇게 블로그에도 정리를 하니 다시 한번 내가 잘 기억하고 있는지 정리할 수 있어 좋다.

 

<그래프 위 값 추가>

이건 범례보다 사실 더 어려웠다 .. 그래서 구글링을 해봤고 대다수 블로그들이 나에게는 너무 어려운 코드들이었다. 그래서 chatGPT한테 정답없이 막대그래프에 값을 어떻게 추가하는지 물었다. 그랬더니 블로그들보단 좀 더 쉬운 답변을 알려줘서 그걸 내 시각화 그래프에 사용해봤다.

for i in bar.containers:
    bar.bar_label(i, fmt='%.1f', label_type='edge')
  • bar.containers - 막대 그래프들의 막대들을 그룹으로 묶어놓은 것
  • 반복문을 통해 반복 작업을 수행 --> 각 막대에 하나씩 값이 나타나야 하기 때문에
  • bar.bar_label - 막대 그래프에 값을 추가하는 함수
  • i는 각 막대에 라벨을 추가
  • fmt='%.1f' 는 소수점 첫째 자리까지 표시하라는 의미이다. (내 값들은 소수점이 여러개 있었기 때문에 깔끔해보이기 위해 지정)
  • 'label_type='edge'는 막대 끝에 값이 위치하도록 지정한 것

대다수의 블로그들은 어렵게 계산을 해야했는데 이건 계산할 필요 없이 함수들로 간단하게 코드를 적을 수 있어서 이해할 수 있었다.

 

<한글변경>

아까 music_time_slot에 대한 한글 변경은 위에서해줬기 때문에 남은 것들은 그냥 영어로 적어놨던 레이블이나 타이틀들을 영어에서 한글로만 바꿔줬다 그래서 내 그래프는 최종적으로 이렇게 변했다.

plt.figure(figsize=(10,6))
bar = ages.plot(kind='bar', color=['hotpink', 'g', 'y'], alpha = 0.3)

for i in bar.containers:
    bar.bar_label(i, fmt='%.1f', label_type='edge')

colors = {'오후': 'hotpink', '밤': 'green', '아침': 'yellow'}  # 각 색상에 대한 설명
labels = list(colors.keys())
handles = [plt.Rectangle((0,0),1,1, color=colors[label], alpha=0.3) for label in labels]
plt.legend(handles, labels, loc='right', bbox_to_anchor=(1,0.9))

plt.xlabel('음악 듣는 시간대')
plt.ylabel('비율')
plt.title('10대 음악 시간대 분포')
plt.xticks(rotation=0)
plt.show()

<결과 값>


② 10-20 세대 별 음악 추천 평가도

이 컬럼은 값이 숫자라 굳이 한글로 변경할 건 없었다

 

1) 순서 정렬

얘는 앞에 것과 달리 값을 인덱스로 인지해서인지 sort_counts가 아닌 sort_index()로 정렬해줬더니 깔끔하게 1~5까지 순서대로 나왔다.

#12-20 세대 별 빈도 수 확인, 인덱스 기준 정렬
ages2 = data[(data['Age'] == '12-20')]['music_recc_rating'].value_counts().sort_index()

#1     1
#2    14
#3    38
#4    12
#5     6
#Name: music_recc_rating, dtype: int64

2) 시각화 ( 범례 추가, 그래프 위 값 추가, 한글 변경)

 

(1) 범례 추가

위 그래프와 범례 추가하는 코드는 동일하다. 값이 약간 다르기 때문에 값만 다르게 변경해줬다.

이 컬럼은 값이 총 5개가 나오기때문에 색상 별 알맞은 값을 넣어줬다.

그리고 그래프 마다 각각 위치 설정도 다르기 때문에 이 그래프에는 0.88로 맞춰야지 예쁘게 딱 오른쪽 위에 자리 잡았다.

colors = {'1': 'green', '2': 'hotpink', '3': 'skyblue', '4': 'yellow', '5': 'red'}
labels = list(colors.keys())
handles = [plt.Rectangle((0,0),1,1, color=colors[label], alpha=0.3) for label in labels]
plt.legend(handles, labels, loc='right', bbox_to_anchor=(1,0.88))

 

(2) 그래프 위 값 추가

이것도 위 그래프와 아예 동일했다. 어차피 그 내가 미리 지정한 그래프 값에 대해서 자동으로 바뀌는거기 때문에 바꿀 것이 없었다.

for i in bar.containers:
    bar.bar_label(i, fmt='%.1f', label_type='edge')

 

(3) 영어 -> 한글 변경

이 그래프도 영어로 된 부분을 한글로 바꾸기만 하면 돼서 큰 어려움이 없었다.

plt.figure(figsize=(10,6))
bar = ages2.plot(kind='bar', color = ['green','hotpink','skyblue','yellow','red'], alpha = 0.3)

for i in bar.containers:
    bar.bar_label(i, fmt='%.1f', label_type='edge')

colors = {'1': 'green', '2': 'hotpink', '3': 'skyblue', '4': 'yellow', '5': 'red'}  # 각 색상에 대한 설명
labels = list(colors.keys())
handles = [plt.Rectangle((0,0),1,1, color=colors[label], alpha=0.3) for label in labels]
plt.legend(handles, labels, loc='right', bbox_to_anchor=(1,0.88))

plt.xlabel('음악 추천 평점')
plt.ylabel('비율')
plt.title('10대 음악 추천 평점 분포')
plt.xticks(rotation=0) #X축의 라벨이 수평으로 표시되도록 설정
plt.show()

<결과 값>


③ 데이터 분석 결과

청취 시간대와 평점을 고려한 맞춤형 추천 서비스 강화하기

  1. 음악 알고리즘 추천 평점 중 가장 높은 빈도는 3점
  2. 음악 청취 시간대 중 가장 높은 빈도는 '저녁' 시간대

즉, 주로 듣는 청취시간대인 저녁과 밤 시간대에 맞춤형 추천 서비스를  강화해야 한다.

--> 높은 빈도를 가진 청취시간대에 맞춤형 추천 시스템을 강화하면 자연스럽게 추천 알고리즘에 대한 만족도가 올라갈 것이며,

결과적으로 10대들의 유입을 기대할 수 있을 것이다.

 

마지막으로, 각자 데이터 분석 결과를 피피티에 적고 이제 마무리 인사이트 도출만 남았다.

주말동안 인사이트 도출에 대해서 생각해야 할 부분이다! 


다른 사람들이 본다면 쉬운 프로젝트네 라고 생각할 수도 있겠지만 나한테 있어서 주제를 정한다거나 데이터 분석을 하는 것 자체가 어려웠다. 하지만 어려운 만큼 여기까지 해낼 수 있어서도 뿌듯하다. 아직 모든 데이터를 합쳐서 인사이트 도출까지는 못했지만 주말동안 열심히 생각을 해봐야 할 것 같다. 나중에 데이터 분석가로 성장해있다면 이 글을 보면 생각이 새록 새록 날 것 같다 ㅋㅋㅋ
다음 TIL은 인사이트 도출을 위한 나의 생각들에 대해 정리를 해보겠다!