본문 바로가기

TIL

[240214] 파이차트: 기준값 추가 / 막대그래프: X축 이름 및 간격 변경

* 자료 출처: Kaggle - Google Analytics Customer Revenue Prediction

 

1. 문제 배경

- 평균세션시간별 방문자수 비중을 파이 차트로 시각화 필요

└ 평균세션시간이 0인 비중이 94%, 나머지 시간은 각 비중이 현저히 낮아 특정 기준 이하 값은 합계하여 '기타' 항목 처리 

- 막대그래프에서 X축 이름과 간격 별도 지정 

 

2. 파이차트

- 평균세션시간이 0인 비중이 94%로, 나머지 시간대는 항목이 많고, 비중이 미비하여 합계 값으로 표기 필요 

- 1) 전체 수치에서 백분율을 구하고, 2) 기준치에 따라 일부는 sum 적용하여 파이차트용 데이터프레임 생성

## 평균세션시간별 비중
# df_avg_session_time가 유저별 평균세션시간이 저장된 변수  

# 평균세션시간이 0인 경우가 전체의 93.5%
each_session_time = df_avg_session_time.value_counts()
sum_session_time = df_avg_session_time.value_counts().sum()
pct_session_time = each_session_time / sum_session_time

df_pct_session_time = pct_session_time.reset_index()
df_pct_session_time.columns = ['avg_session_time', 'percentage']
df_pct_session_time

# 0.02% 이하는 모두 합쳐서 etc로 표기 
threshold = 0.0002
# 기준치보다 적은 %는 sum처리  
etc_values = df_pct_session_time[df_pct_session_time['percentage'] < threshold]
etc_total = etc_values['percentage'].sum()
# 기준치보다 큰 %만 새로운 데이터프레임으로 지정 
df_pct_session = df_pct_session_time[df_pct_session_time['percentage'] >= threshold]
# 새로운 데이터 프레임에서 etc 값 새로운 행에 추가 
# 파이썬은 0부터 시작하므로 len(df_pct_session)을 넣으면, 현재에서 1개 열 추가된 영역 지정
df_pct_session.loc[len(df_pct_session)] = ['etc', etc_total]
df_pct_session

# 파이 그래프 그리기 
plt.figure(figsize=(5, 5))
plt.pie(df_pct_session['percentage'], labels=df_pct_session['avg_session_time'], autopct='%1.1f%%')
plt.title('Percentage of Avg session time')
plt.show()

 

- 디바이스별 매출액 합계 (강조 값 explode 추가)

# 디바이스별 매출액 비중(%) 
device_psum_pct = (device_psum / device_psum.sum()).reset_index()

# 각 범주에 들어갈 라벨과 값, 색상, 강조할 값 지정
labels = ['desktop', 'mobile', 'tablet']
sizes = device_psum['totals.transactionRevenue']
colors = ['skyblue', 'lightblue', 'silver']
explode = (0.03, 0, 0)  # 특정 부분 강조를 위한 설정

# 파이 차트 그리기
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
        autopct='%1.1f%%', shadow=False, startangle=140)
plt.title('Device Aevenue Percentage')

 

3. 막대그래프

- 막대그래프의 x축의 간격과 이름은 xticks()와 range() 함수를 활용 

# 디바이스별 개수, 구매수, 매출액
device_cnt = pd.DataFrame(df['device.deviceCategory'].value_counts())
device_pcont = pd.DataFrame(df.groupby('device.deviceCategory')['totals.transactionRevenue'].count())
device_psum =pd.DataFrame(df.groupby('device.deviceCategory')['totals.transactionRevenue'].sum())

# 각 수치 데이터프레임으로 병합
device_df = pd.concat([device_cnt, device_pcont, device_psum], axis=1).reset_index()
device_df.columns  = ['device', 'count', 'pcont', 'psum']
device_df

 

# 전환율 생성
deviece_cvr = device_df['pcont']  / device_df['count'] 

# 막대그래프 그리기 
sns.barplot(deviece_cvr)
plt.title('Device CVR')
plt.xticks(range(0,3), ['desktop', 'mobile', 'tablet'])
plt.xlabels('Device CVR')