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()
<결과 값>
③ 데이터 분석 결과
청취 시간대와 평점을 고려한 맞춤형 추천 서비스 강화하기
- 음악 알고리즘 추천 평점 중 가장 높은 빈도는 3점
- 음악 청취 시간대 중 가장 높은 빈도는 '저녁' 시간대
즉, 주로 듣는 청취시간대인 저녁과 밤 시간대에 맞춤형 추천 서비스를 강화해야 한다.
--> 높은 빈도를 가진 청취시간대에 맞춤형 추천 시스템을 강화하면 자연스럽게 추천 알고리즘에 대한 만족도가 올라갈 것이며,
결과적으로 10대들의 유입을 기대할 수 있을 것이다.
마지막으로, 각자 데이터 분석 결과를 피피티에 적고 이제 마무리 인사이트 도출만 남았다.
주말동안 인사이트 도출에 대해서 생각해야 할 부분이다!
다른 사람들이 본다면 쉬운 프로젝트네 라고 생각할 수도 있겠지만 나한테 있어서 주제를 정한다거나 데이터 분석을 하는 것 자체가 어려웠다. 하지만 어려운 만큼 여기까지 해낼 수 있어서도 뿌듯하다. 아직 모든 데이터를 합쳐서 인사이트 도출까지는 못했지만 주말동안 열심히 생각을 해봐야 할 것 같다. 나중에 데이터 분석가로 성장해있다면 이 글을 보면 생각이 새록 새록 날 것 같다 ㅋㅋㅋ
다음 TIL은 인사이트 도출을 위한 나의 생각들에 대해 정리를 해보겠다!
'Project' 카테고리의 다른 글
[심화 프로젝트] 이커머스 주간 판매량 예측3 (0) | 2024.08.30 |
---|---|
[심화 프로젝트] 이커머스 주간 판매량 예측2 (1) | 2024.08.28 |
[기초 프로젝트] END! + 피드백 (0) | 2024.07.29 |
[기초 프로젝트] DAY 2 (0) | 2024.07.25 |
[기초 프로젝트] START! (10) | 2024.07.24 |