
기초 프로젝트
정신없이 프로젝트를 마치고 과정에 대한 정리만 하고 넘어가기에는
사용했던 코드들이나 내용들이 휘발될 것 같아 코드들만 정리.
from google.colab import drive
drive.mount('/content/drive')
# 라이브러리 불러오기
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 데이터 불러오기
df = pd.read_excel("/content/drive/MyDrive/bootcamp/basicproject/data/Spotify_data.xlsx")
df.head(3)
# 시각화 관련 폰트 깨짐 문제 해결
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf # 폰트 설치
import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic')
plt.rcParams['axes.unicode_minus'] =False # 기본 폰트 설정
# 실행 후에도 오류문구 발생 시
# 런타임 - 세션 다시 실행 후 다시 시도
# 데이터 크기 확인
df.shape
# 컬럼 확인
df.columns
# 데이터 정보 확인
df.info()
# 결측치 확인
print(df.isnull().sum())
# 결측치가 존재하는 컬럼 조회
nullcols = [col for col in df.columns if df[col].isnull().any()]
print(nullcols)
# 결측치가 있는 컬럼 데이터 기초 통계 확인
df[nullcols].describe(include = "object")
# NaN 값은 실제로는 None 의 값을 가짐
# 설문에 응답하지 않은 데이터로 "N" 으로 대치
df = df.fillna(str("N"))
print(df.isnull().sum())
df
# 데이터 기초 통계 확인 (범주형 데이터)
df.describe(include = "object")
# 결측치 대치 파일 저장
# df.to_csv("spotify(fillna).csv", index = False)
# df.to_excel("spotify(fillna).xlsx", index = False)
# 데이터 불러오기
df = pd.read_csv("/content/drive/MyDrive/bootcamp/basicproject/data/spotyfi(fillna).csv")
# 각 컬럼별 값 확인
for i in df.columns:
print(df[i].value_counts(), "\n", "-----")
# 이용기간에 따른 선호하는 청취 컨텐츠 교차분석 히트맵, 시각화
crosstab = pd.crosstab(df['spotify_usage_period'], df["preferred_listening_content"])
sns.heatmap(crosstab, annot=True, fmt="d", cmap = "Blues")
plt.show()
# 유료, 무료 이용자별 선호하는 청취 컨텐츠
genre_by_usage_period = df.groupby('spotify_subscription_plan')['preferred_listening_content'].value_counts()
genre_by_usage_period
# 이용기간에 따른 음악 청취 방법
expl_by_usage_period = df.groupby('spotify_usage_period')['music_expl_method'].value_counts()
expl_by_usage_period
# 이용기간에 따른 음악 추천 시스템 만족도
rate_by_usage_period = df.groupby('spotify_usage_period')['music_recc_rating'].value_counts()
rate_by_usage_period
# 음악 추천 시스템 만족도에 따른 선호하는 청취 컨텐츠 교차분석, 히트맵 시각화
crosstab = pd.crosstab(df['music_recc_rating'], df["preferred_listening_content"])
sns.heatmap(crosstab, annot=True, fmt="d", cmap = "Blues")
plt.show()
# 선호하는 청취 컨텐츠 기준 모든 컬럼과 교차분석하기
for column in df.columns:
if column != 'preferred_listening_content':
crosstab_result = pd.crosstab(df['preferred_listening_content'], df[column])
print(f"교차 분석 - {column} 칼럼:")
print(crosstab_result)
print("\n")
# 교차 분석 결과를 히트맵으로 시각화하는 함수
def visualize_crosstab(crosstab_result):
plt.figure(figsize=(6, 4))
sns.heatmap(crosstab_result, annot=True, fmt="d", cmap = "Blues")
plt.show()
# 선호하는 청취 컨텐츠 컬럼 기준 df의 모든 컬럼에 대해 교차 분석을 수행하고 시각화
for column in df.columns:
if column != 'preferred_listening_content':
crosstab_result = pd.crosstab(df['preferred_listening_content'], df[column])
print(f"교차 분석 - {column} 칼럼:")
visualize_crosstab(crosstab_result)
# 교차 분석 결과를 히트맵으로 시각화하는 함수 생성
def visualize_crosstab(crosstab_result):
plt.figure(figsize=(6, 4))
sns.heatmap(crosstab_result, annot=True, fmt="d", cmap = "Blues")
plt.show()
# 음악 추천 시스템 만족도 컬럼 기준 df의 모든 컬럼에 대해 교차 분석을 수행하고 시각화
for column in df.columns:
if column != 'music_recc_rating':
crosstab_result = pd.crosstab(df['music_recc_rating'], df[column])
print(f"교차 분석 - {column} 칼럼:")
visualize_crosstab(crosstab_result)
# 중복되는 데이터가 존재하는 컬럼의 고유값 출력
columns_to_encode = ['spotify_listening_device', 'music_Influencial_mood', 'music_lis_frequency', 'music_expl_method']
dup = [df[i].unique() for i in columns_to_encode]
# 딕셔너리 생성
unique_values_dict = dict(zip(columns_to_encode, dup))
# 딕셔너리를 데이터프레임으로 변환
unique_values_df = pd.DataFrame(dict([(k, pd.Series(v)) for k, v in unique_values_dict.items()]))
# 데이터프레임 출력
unique_values_df
# 데이터프레임 정렬 (열 별로 개별 정렬)
sorted_df = unique_values_df.apply(lambda x: x.sort_values().reset_index(drop=True))
# 데이터프레임 출력
sorted_df
# <One-Hot Encoding 처리> 대상컬럼 4종 : 데이터 내 중복 선택으로 인해 각 선택지를 칼럼화하여 중복 제거하기
columns_to_encode = ['spotify_listening_device', 'music_Influencial_mood', 'music_lis_frequency', 'music_expl_method']
for column in columns_to_encode:
df_temp = df[column].str.split(',').apply(lambda x: [i.strip() for i in x]) # 문자열을 쉼표로 분리하고, 각 문자열의 앞뒤 공백 제거
df_encoded = df_temp.apply(lambda x: pd.Series([1] * len(x), index=x)).fillna(0, downcast='infer') # 새로운 데이터프레임 생성(원본 보존 목적)
df = pd.concat([df.iloc[:, :df.columns.get_loc(column)+1], df_encoded, df.iloc[:, df.columns.get_loc(column)+1:]], axis=1) # 해당 컬럼 이후 위치에 concat처리
df.drop('', axis=1, inplace=True) # 공백 컬럼 삭제
df.info()
# 원-핫 인코딩 결과 확인
df.head()
# 필터링 (유료 구독의사가 있고 음악 추천 시스템 만족도가 높은(4점 이상) 이용자)
filtered = df[(df['music_recc_rating'] > 3) & (df['premium_sub_willingness'] == 'Yes')]
# 무료 플랜 이용자 중 구독 의사가 있는 사람
# filtered = df[(df['spotify_subscription_plan'] == 'Free (ad-supported)') & (df['premium_sub_willingness'] == 'Yes')]
crosstab = pd.crosstab(filtered['music_recc_rating'], filtered["preferred_listening_content"])
sns.heatmap(crosstab, annot=True, fmt="d", cmap = "Reds")
plt.show()
# 교차 분석 결과를 히트맵으로 시각화하는 함수 생성
def visualize_crosstab(crosstab_result):
plt.figure(figsize=(6, 4))
sns.heatmap(crosstab_result, annot=True, fmt="d", cmap = "Blues")
plt.show()
# 탐색 목적 : 추천 시스템에 대한 만족도가 높고 구독 의향이 있는 고객의 행동패턴 분석
# 필터링
filtered = df[(df['music_recc_rating'] > 3) & (df['premium_sub_willingness'] == 'Yes')]
# df의 모든 컬럼에 대해 교차 분석을 수행하고 시각화
for column in df.columns:
if column != 'music_recc_rating':
crosstab_result = pd.crosstab(filtered['music_recc_rating'], filtered[column])
print(f"교차 분석 - {column} 칼럼:")
visualize_crosstab(crosstab_result)
# 교차 분석 결과를 히트맵으로 시각화하는 함수
def visualize_crosstab(ax, crosstab_result, title):
sns.heatmap(crosstab_result, annot=True, fmt="d", cmap="Purples", ax=ax)
ax.set_title(title)
# 탐색 목적 : 유료 구독 의사가 있는 무료 플랜 사용자의 행동 데이터 시각화
# 필터링 (무료 이용자 중 추천 시스템에 대한 만족도가 높고(4점 이상), 유료 구독 의사가 있는 사용자)
free = df[df['spotify_subscription_plan'] == 'Free (ad-supported)']
# filtered = free[(free['music_recc_rating'] > 3) & (free['premium_sub_willingness'] == 'Yes')]
# 무료 이용자의 모든 컬럼에 대해 교차 분석을 수행하고 시각화
columns_to_analyze = [col for col in free.columns if col != 'preferred_listening_content']
num_columns = len(columns_to_analyze)
# 서브플롯을 위한 설정
fig, axes = plt.subplots(nrows=5, ncols=5, figsize=(30, 30))
axes = axes.flatten()
for i, column in enumerate(columns_to_analyze):
if i >= len(axes):
break
crosstab_result = pd.crosstab(free['preferred_listening_content'], free[column])
visualize_crosstab(axes[i], crosstab_result, f"{column} 칼럼")
# 나머지 빈 서브플롯 숨기기
for j in range(i+1, len(axes)):
fig.delaxes(axes[j])
plt.tight_layout()
plt.show()
# 연관 규칙 분석 시도
# 데이터 불러오기
# df = pd.read_csv("/content/drive/MyDrive/bootcamp/basicproject/data/spotyfi(fillna).csv")
# 연관 규칙 학습
# from mlxtend.frequent_patterns import apriori
# from mlxtend.frequent_patterns import association_rules
# 데이터를 원-핫 인코딩 형태로 변환
# df_encoded = pd.get_dummies(df, columns=df.columns)
# 지지도
# frequent_itemsets = apriori(df_encoded, min_support=0.1, use_colnames=True)
# 신뢰도
# rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.5)
# rules.head() # support 상관관계
# 연관 규칙 분석 결과 확인
# display(rules)
# 유료, 무료 이용자로 그룹바이 (그룹화) 후 각 칼럼들과 비교, 값 그래프 생성
list_groupby = ['spotify_usage_period', 'premium_sub_willingness', 'preffered_premium_plan', 'preferred_listening_content', 'fav_music_genre', 'music_time_slot','music_recc_rating','pod_lis_frequency', 'fav_pod_genre', 'preffered_pod_format', 'pod_host_preference', 'preffered_pod_duration','pod_variety_satisfaction']
for i in list_groupby:
grouped_genre = df.groupby(['spotify_subscription_plan', i]).size().unstack(fill_value=0)
grouped_genre = grouped_genre.reset_index()
melted_df_genre = grouped_genre.melt(id_vars='spotify_subscription_plan', var_name=i, value_name='count')
plt.figure(figsize=(5, 3))
sns.barplot(data=melted_df_genre, x=i, y='count', hue='spotify_subscription_plan')
print(melted_df_genre)
# 유료 이용자와 무료 이용자로 데이터 분리
premium = df[df['spotify_subscription_plan'] == 'Premium (paid subscription)']
free = df[df['spotify_subscription_plan'] == 'Free (ad-supported)']
# 유료, 무료 이용자 데이터 크기 확인
premium.shape, free.shape
# 교차 분석 결과를 히트맵으로 시각화하는 함수
def visualize_crosstab(crosstab_result):
plt.figure(figsize=(5, 3))
sns.heatmap(crosstab_result, annot=True, fmt="d", cmap = "Greens")
plt.show()
# 탐색 목적 : 유료 구독 의사가 있는 무료 플랜 사용자의 행동 데이터 시각화
# 필터링 (무료 이용자 중 추천 시스템에 대한 만족도가 높은(4점 이상) 사용자)
# filtered = free[free['music_recc_rating'] > 3]
# 필터링 (무료 이용자 중 추천 시스템에 대한 만족도가 높고(4점 이상), 유료 구독 의사가 있는 사용자)
filtered = free[(free['music_recc_rating'] > 3) & (free['premium_sub_willingness'] == 'Yes')]
# 무료 이용자의 모든 컬럼에 대해 교차 분석을 수행하고 시각화
for column in free.columns:
if column != 'music_recc_rating':
crosstab_result = pd.crosstab(filtered['music_recc_rating'], filtered[column])
print(f"교차 분석 - {column} 칼럼:")
visualize_crosstab(crosstab_result)
# 교차 분석 결과를 히트맵으로 시각화하는 함수
def visualize_crosstab(crosstab_result):
plt.figure(figsize=(5, 3))
sns.heatmap(crosstab_result, annot=True, fmt="d", cmap = "Greens")
plt.show()
# 탐색 목적 : 유료 구독 의사가 있는 무료 플랜 사용자의 행동 데이터 시각화
# 필터링 (유료 이용자 중 추천 시스템에 대한 만족도가 높은(4점 이상) 사용자)
# filtered = premium[premium['music_recc_rating'] > 3]
# 필터링 (유료 이용자 중 유료 구독 의사가 있는 사용자)
filtered = premium[premium['premium_sub_willingness'] == 'Yes']
# 유료 이용자의 모든 컬럼에 대해 교차 분석을 수행하고 시각화
# for column in premium.columns:
# if column != 'music_recc_rating':
# crosstab_result = pd.crosstab(filtered['music_recc_rating'], filtered[column])
# print(f"교차 분석 - {column} 칼럼:")
# visualize_crosstab(crosstab_result)
crosstab_result = pd.crosstab(filtered['music_recc_rating'], filtered[column])
print(f"교차 분석 - {column} 칼럼:")
visualize_crosstab(crosstab_result)
# 유료, 무료 이용자의 선호하는 청취 콘텐츠 (카운트)
# 유료 이용자와 무료 이용자로 데이터 분리
premium = df[df['spotify_subscription_plan'] == 'Premium (paid subscription)']
free = df[df['spotify_subscription_plan'] == 'Free (ad-supported)']
# 유료 이용자와 무료 이용자의 선호 청취 컨텐츠 카운트 변수 생성
premium_content_counts = premium['preferred_listening_content'].value_counts()
free_content_counts = free['preferred_listening_content'].value_counts()
# 시각화를 위한 데이터 프레임 생성
comp = pd.DataFrame({
'Premium Users': premium_content_counts,
'Free Users': free_content_counts
}).fillna(0)
# 데이터 크기 내림차순으로 컬럼 정렬
comp_sorted = comp.loc[comp.sum(axis=1).sort_values(ascending=False).index]
# 색상 정하기
colors = ['#1DB954', '#909090']
# 바그래프 시각화
comp_sorted.plot(kind='bar', figsize=(8, 6), color = colors)
plt.title('Preferred Listening Content: Premium vs Free Users')
plt.xlabel('Content Type')
plt.ylabel('Count')
plt.xticks(rotation=0)
plt.legend()
plt.show()
# 여행 count
# 'spotify_subscription_plan' 열의 값이 'FREE'인 행을 df_free에 저장
df_free = df[df['spotify_subscription_plan'] == 'Free (ad-supported)']
# 'spotify_subscription_plan' 열의 값이 'premium'인 행을 df_premium에 저장
df_premium = df[df['spotify_subscription_plan'] == 'Premium (paid subscription)']
data1=df_premium #premium맴버쉽 사용중music_lis_frequency 칼럼의 합
music_lis_frequency_premium = data1[['While Traveling','Study Hours' ,'leisure time','Office hours','Workout session']].sum()
music_lis_frequency_premium
data2=df_free #free맴버쉽 사용중music_lis_frequency 칼럼의 합
music_lis_frequency_free = data2[['While Traveling','Study Hours' ,'leisure time','Office hours','Workout session']].sum()
music_lis_frequency_free
data=df_premium #premium맴버쉽 사용중feel칼럼의합
feel_premium = data[['Sadness or melancholy','Social gatherings or parties' ,'Relaxation and stress relief','Uplifting and motivational']].sum()
feel_premium
data=df_free #free맴버쉽 사용중feel칼럼의합
feel_free = data[['Sadness or melancholy','Social gatherings or parties' ,'Relaxation and stress relief','Uplifting and motivational']].sum()
feel_free
#백분위로 계산하기
total_premium = music_lis_frequency_premium.sum()
total_free = music_lis_frequency_free.sum()
music_lis_frequency_premium_pct = music_lis_frequency_premium
music_lis_frequency_free_pct = music_lis_frequency_free
import matplotlib.pyplot as plt
import numpy as np
# 데이터프레임 'music_lis_frequency_free'와 'music_lis_frequency_premium' 백분위 비교 차트 생성
# 데이터 정렬 ★
music_lis_frequency_premium_pct = music_lis_frequency_premium_pct.sort_values(ascending=False)
music_lis_frequency_free_pct = music_lis_frequency_free_pct.sort_values(ascending=False)
x = np.arange(len(music_lis_frequency_premium_pct)) # 막대 그래프의 x축 좌표
width = 0.4 # 막대 그래프의 너비
fig, ax = plt.subplots(figsize=(10, 6))
# 프리미엄 회원 데이터 그리기 (색상 변경) ★
# ax.bar(x - width/2, music_lis_frequency_premium_pct, width, label='Premium Members', color='#23D950')
colors = ['#77DFA9' if (x < max(music_lis_frequency_premium_pct)) else '#1DB954' for x in music_lis_frequency_premium_pct] # #1DB954: 스포티파이 컬러
ax.bar(x - width/2, music_lis_frequency_premium_pct, width, label='Premium Members', color=colors)
# 무료 회원 데이터 그리기 (색상 변경) ★
# ax.bar(x + width/2, music_lis_frequency_free_pct, width, label='Free Members', color='#F2F2F2')
colors = ['#909090' if (x < max(music_lis_frequency_free_pct)) else '#000000' for x in music_lis_frequency_free_pct]
ax.bar(x + width/2, music_lis_frequency_free_pct, width, label='Free Members', color=colors)
# 그래프 제목 및 축 라벨 설정
ax.set_title('Music Listening Frequency by Membership Type (count)')
ax.set_xlabel('Category')
ax.set_ylabel('Listening Frequency')
ax.set_xticks(x)
# ax.set_xticklabels(['While Traveling', 'Study Hours', 'Leisure Time', 'Office Hours', 'Workout Session'])
ax.set_xticklabels(music_lis_frequency_premium_pct.index) # x축 라벨을 정렬된 순서로 변경 ★
# 범례 표시
ax.legend()
# 그래프 출력
plt.show()
# 데이터프레임 'feel_free'와 'feel_premium' 백분위 비교 차트 생성
plt.figure(figsize=(10, 6))
x = np.arange(len(feel_free.index))
# 백분위 계산
feel_premium_pct = feel_premium
feel_free_pct = feel_free
# 차트2_Comparison of Feelings in Free and Premium Data
# 데이터 정렬 (내림차순) ★
feel_premium_pct = feel_premium_pct.sort_values(ascending=False)
feel_free_pct = feel_free_pct.sort_values(ascending=False)
# 막대그래프 위치 조정
bar_width = 0.4
# 프리미엄 회원 데이터 그리기 (색상 변경)
colors = ['#77DFA9' if (x < max(feel_premium_pct)) else '#1DB954' for x in feel_premium_pct]
plt.bar(x - bar_width/2, feel_premium_pct, width=bar_width, label='Premium Members', color=colors)
# 무료 회원 데이터 그리기 (색상 변경)
colors = ['#909090' if (x < max(feel_free_pct)) else '#000000' for x in feel_free_pct]
plt.bar(x + bar_width/2, feel_free_pct, width=bar_width, label='Free Members', color=colors)
plt.xticks(x, feel_free_pct.index) # ★
plt.legend()
plt.title('Comparison of Feelings in Free and Premium Data (count)')
plt.xlabel('Feelings')
plt.ylabel('Percentage')
plt.show()
# 유료, 무료 이용자의 선호하는 청취 콘텐츠 (비율)
# 유료 이용자와 무료 이용자로 데이터 분리
premium = df[df['spotify_subscription_plan'] == 'Premium (paid subscription)']
free = df[df['spotify_subscription_plan'] == 'Free (ad-supported)']
# 유료 이용자와 무료 이용자의 선호 청취 컨텐츠 비율 변수 생성 (normalize : 정규화)
premium_content_counts_pro = premium['preferred_listening_content'].value_counts(normalize=True)
free_content_counts_pro = free['preferred_listening_content'].value_counts(normalize=True)
# 시각화를 위한 데이터 프레임 생성
comp = pd.DataFrame({
'Premium Users': premium_content_counts_pro,
'Free Users': free_content_counts_pro
}).fillna(0)
# 데이터 크기 내림차순으로 컬럼 정렬
comp_sorted = comp.loc[:, comp.sum().sort_values(ascending=False).index]
# 색상 정하기
colors = ['#1DB954', '#909090']
# 바그래프 시각화
comp_sorted.plot(kind='bar', figsize=(8, 6), color = colors)
plt.title('Preferred Listening Content: Premium vs Free Users')
plt.xlabel('Content Type')
plt.ylabel('Proportion')
plt.xticks(rotation=0)
plt.legend()
plt.show()
# 유료, 무료 이용자의 선호하는 청취 콘텐츠 (비율, 가로 그래프 + 총 비율)
# 유료 이용자와 무료 이용자로 데이터 분리
premium = df[df['spotify_subscription_plan'] == 'Premium (paid subscription)']
free = df[df['spotify_subscription_plan'] == 'Free (ad-supported)']
# 유료 이용자와 무료 이용자의 선호 청취 콘텐츠 비율 변수 생성 (normalize : 정규화)
premium_content_counts_pro = premium['preferred_listening_content'].value_counts(normalize=True)
free_content_counts_pro = free['preferred_listening_content'].value_counts(normalize=True)
# 시각화를 위한 데이터 프레임 생성
comp = pd.DataFrame({
'Premium': premium_content_counts_pro * 100,
'Free': free_content_counts_pro * 100
}).fillna(0)
# 색상 정하기
# colors1 = ['#77DFA9' if (x < max(premium_content_counts_pro)) else '#1DB954' for x in premium_content_counts_pro]
# colors2 = ['#909090' if (x < max(free_content_counts_pro)) else '#000000' for x in free_content_counts_pro]
colors = ['#909090','#1DB954']
# 바그래프 시각화
gragh = comp.T.plot(kind='barh', stacked=True, figsize=(10, 6), color=colors)
plt.title('Preferred Listening Content: Premium vs Free')
plt.xlabel('Proportion')
plt.ylabel('')
plt.legend(['Music', 'Podcast'])
# for i in gragh.containers:
# gragh.bar_label(i, fmt='%.f', label_type='center', color = 'Black')
plt.show()
# 유료, 무료 이용자의 선호하는 팟캐스트 장르 (카운트)
# 유료 이용자와 무료 이용자로 데이터 분리
# premium = df[(df['spotify_subscription_plan'] == 'Premium (paid subscription)') & (df['pod_lis_frequency'] != "Never")]
free = df[(df['spotify_subscription_plan'] == 'Free (ad-supported)') & (df['pod_lis_frequency'] != "Never")]
# 유료 이용자와 무료 이용자의 선호 청취 팟캐스트 장르 카운트 변수 생성
# premium_pod_counts = premium['fav_pod_genre'].value_counts().head(4)
free_pod_counts = free['fav_pod_genre'].value_counts().head(5)
# 시각화를 위한 데이터 프레임 생성
comp = pd.DataFrame({
# 'Premium Users': premium_pod_counts,
'Free Users': free_pod_counts
}).fillna(0)
# 데이터 크기 내림차순으로 컬럼 정렬
comp_sorted = comp.loc[comp.sum(axis=1).sort_values(ascending=False).index]
# 색상 정하기
colors = ['#909090']
# '#1DB954',
# 바그래프 시각화
comp_sorted.plot(kind='bar', figsize=(8, 6), color = colors)
plt.title('(Top5) Preferred pod Genre : Premium vs Free Users')
plt.xlabel('Genre')
plt.ylabel('Count')
plt.xticks(rotation=0)
plt.legend()
plt.show()
# 유료, 무료 이용자의 선호하는 팟캐스트 장르 (비율)
# 유료 이용자와 무료 이용자로 데이터 분리
# premium = df[(df['spotify_subscription_plan'] == 'Premium (paid subscription)') & (df['pod_lis_frequency'] != "Never")]
free = df[(df['spotify_subscription_plan'] == 'Free (ad-supported)') & (df['pod_lis_frequency'] != "Never")]
# 유료 이용자와 무료 이용자의 선호 청취 팟캐스트 장르 비율 변수 생성 (normalize : 정규화)
# premium_pod_counts = premium['fav_pod_genre'].value_counts(normalize=True).head(5)
free_pod_counts = free['fav_pod_genre'].value_counts(normalize=True).head(5)
# 시각화를 위한 데이터 프레임 생성
comp = pd.DataFrame({
# 'Premium Users': premium_pod_counts * 100,
'Free Users': free_pod_counts * 100
}).fillna(0)
# 데이터 크기 내림차순으로 컬럼 정렬
comp_sorted = comp.loc[comp.sum(axis=1).sort_values(ascending=False).index]
# 색상 정하기
colors = ['#909090']
# 바그래프 시각화
comp_sorted.plot(kind='bar', figsize=(8, 6), color = colors)
plt.title('[Free Users] Preferred Pod Genre', size = 15)
plt.xlabel('Genre')
plt.ylabel('Proportion')
plt.xticks(rotation=0)
plt.legend()
plt.show()
# 유료, 무료 이용자의 선호하는 팟캐스트 장르 (비율)
# 유료 이용자와 무료 이용자로 데이터 분리
# premium = df[(df['spotify_subscription_plan'] == 'Premium (paid subscription)') & (df['pod_lis_frequency'] != "Never")]
free = df[(df['spotify_subscription_plan'] == 'Free (ad-supported)') & (df['pod_lis_frequency'] != "Never")]
# 유료 이용자와 무료 이용자의 선호 청취 팟캐스트 장르 비율 변수 생성 (normalize : 정규화)
# premium_pod_counts = premium['fav_pod_genre'].value_counts(normalize=True).head(5)
free_pod_counts = free['preffered_pod_duration'].value_counts(normalize=True).head(5)
# 시각화를 위한 데이터 프레임 생성
comp = pd.DataFrame({
# 'Premium Users': premium_pod_counts * 100,
'Free Users': free_pod_counts * 100
}).fillna(0)
# 데이터 크기 내림차순으로 컬럼 정렬
comp_sorted = comp.loc[comp.sum(axis=1).sort_values(ascending=False).index]
# 색상 정하기
colors = ['#909090']
# 바그래프 시각화
comp_sorted.plot(kind='bar', figsize=(8, 6), color = colors)
plt.title('[Free Users] Preffered Pod Duration', size = 15)
plt.xlabel('Duration')
plt.ylabel('Proportion')
plt.xticks(rotation=0)
plt.legend()
plt.show()
# 'spotify_subscription_plan' 열의 값이 'FREE'인 행을 df_free에 저장
df_free = df[df['spotify_subscription_plan'] == 'Free (ad-supported)']
# 'spotify_subscription_plan' 열의 값이 'premium'인 행을 df_premium에 저장
df_premium = df[df['spotify_subscription_plan'] == 'Premium (paid subscription)']
data1=df_premium #premium맴버쉽 사용중music_lis_frequency 칼럼의 합
music_lis_frequency_premium = data1[['While Traveling','Study Hours' ,'leisure time','Office hours','Workout session']].sum()
print(music_lis_frequency_premium)
data2=df_free #free맴버쉽 사용중music_lis_frequency 칼럼의 합
music_lis_frequency_free = data2[['While Traveling','Study Hours' ,'leisure time','Office hours','Workout session']].sum()
music_lis_frequency_free
data=df_premium #premium맴버쉽 사용중feel칼럼의합
feel_premium = data[['Sadness or melancholy','Social gatherings or parties' ,'Relaxation and stress relief','Uplifting and motivational']].sum()
feel_premium
data=df_free #free맴버쉽 사용중feel칼럼의합
feel_free = data[['Sadness or melancholy','Social gatherings or parties' ,'Relaxation and stress relief','Uplifting and motivational']].sum()
feel_free
#백분위로 계산하기
total_premium = music_lis_frequency_premium.sum()
total_free = music_lis_frequency_free.sum()
print(total_premium)
music_lis_frequency_premium_pct = music_lis_frequency_premium / total_premium * 100
music_lis_frequency_free_pct = music_lis_frequency_free / total_free * 100
import matplotlib.pyplot as plt
import numpy as np
# 데이터프레임 'music_lis_frequency_free'와 'music_lis_frequency_premium' 백분위 비교 차트 생성
# 데이터 정렬 ★
music_lis_frequency_premium_pct = music_lis_frequency_premium_pct.sort_values(ascending=False)
music_lis_frequency_free_pct = music_lis_frequency_free_pct.sort_values(ascending=False)
x = np.arange(len(music_lis_frequency_premium_pct)) # 막대 그래프의 x축 좌표
width = 0.4 # 막대 그래프의 너비
fig, ax = plt.subplots(figsize=(10, 6))
# 프리미엄 회원 데이터 그리기 (색상 변경) ★
# ax.bar(x - width/2, music_lis_frequency_premium_pct, width, label='Premium Members', color='#23D950')
colors = ['#77DFA9' if (x < max(music_lis_frequency_premium_pct)) else '#1DB954' for x in music_lis_frequency_premium_pct] # #1DB954: 스포티파이 컬러
ax.bar(x - width/2, music_lis_frequency_premium_pct, width, label='Premium Members', color=colors)
# 무료 회원 데이터 그리기 (색상 변경) ★
# ax.bar(x + width/2, music_lis_frequency_free_pct, width, label='Free Members', color='#F2F2F2')
colors = ['#F2F2F2' if (x < max(music_lis_frequency_free_pct)) else '#000000' for x in music_lis_frequency_free_pct]
ax.bar(x + width/2, music_lis_frequency_free_pct, width, label='Free Members', color=colors)
# 그래프 제목 및 축 라벨 설정
ax.set_title('Music Listening Frequency by Membership Type (Percentage)')
ax.set_xlabel('Category')
ax.set_ylabel('Listening Frequency (%)')
ax.set_xticks(x)
# ax.set_xticklabels(['While Traveling', 'Study Hours', 'Leisure Time', 'Office Hours', 'Workout Session'])
ax.set_xticklabels(music_lis_frequency_premium_pct.index) # x축 라벨을 정렬된 순서로 변경 ★
# 범례 표시
ax.legend()
# 그래프 출력
plt.show()
# 데이터프레임 'feel_free'와 'feel_premium' 백분위 비교 차트 생성
plt.figure(figsize=(10, 6))
x = np.arange(len(feel_free.index))
# 백분위 계산
feel_premium_pct = feel_premium / feel_premium.sum() * 100
feel_free_pct = feel_free / feel_free.sum() * 100
# 차트2_Comparison of Feelings in Free and Premium Data
# 데이터 정렬 (내림차순) ★
feel_premium_pct = feel_premium_pct.sort_values(ascending=False)
feel_free_pct = feel_free_pct.sort_values(ascending=False)
# 막대그래프 위치 조정
bar_width = 0.4
# 프리미엄 회원 데이터 그리기 (색상 변경)
colors = ['#77DFA9' if (x < max(feel_premium_pct)) else '#1DB954' for x in feel_premium_pct]
plt.bar(x - bar_width/2, feel_premium_pct, width=bar_width, label='Premium Members', color=colors)
# 무료 회원 데이터 그리기 (색상 변경)
colors = ['#F2F2F2' if (x < max(feel_free_pct)) else '#000000' for x in feel_free_pct]
plt.bar(x + bar_width/2, feel_free_pct, width=bar_width, label='Free Members', color=colors)
plt.xticks(x, feel_free_pct.index) # ★
plt.legend()
plt.title('Comparison of Feelings in Free and Premium Data (Percentage)')
plt.xlabel('Feelings')
plt.ylabel('Percentage (%)')
plt.show()
참고 :
# pygwalkwer 설치
# !pip install pygwalker
# import pygwalker as pyg
# pyg.walk(free)