이전 내용
[파이썬] 프로젝트 : 대시보드 웹 페이지 구축하기 - 2
이전 내용 [파이썬] 프로젝트 : 대시보드 웹 페이지 구축하기 - 1프로젝트 개요 2차 프로젝트를 시작하게 되었다.이번에 해야할 프로젝트는 데이터를 이용한 대시보드 웹 페이지를 구축하는
puppy-foot-it.tistory.com
데이터시각화
2. 캠페인별 방문자, 참여자
이번에는 캠페인 데이터를 기준으로 데이터분석 및 시각화를 진행해 보려고 한다.
진행했던 캠페인의 항목은 아래와 같다.
'업사이클링 마켓', '커뮤니티 청소 활동', '워크숍 개최', '홍보 부스 운영', '재활용 품목 수집 이벤트', '재활용 아트 전시', '게임 및 퀴즈'
- 월간 캠페인별 방문자수
전체 데이터를 이벤트 종류별, 날짜 기준으로 방문자수, 참여자수로 각각 합계가 집계된 데이터를 생성하고, 이를 월 단위로 집계하여 다시 각 캠페인별 방문자 수를 합산시킨다.
그리고 이를 토대로 라인 차트를 그린다.
# 데이터 집계 및 병합
off_df_ev = off_df.groupby(['이벤트 종류', '날짜']).agg({'방문자수': 'sum', '참여자수': 'sum'}).reset_index()
# 컬럼 이름 변경
off_df_ev.rename(columns={'방문자수': 'VISITORS', '참여자수': 'PART', '날짜': 'DATE', '이벤트 종류': 'CAMP'}, inplace=True)
# 날짜를 datetime으로 형변환
off_df_ev['DATE'] = pd.to_datetime(off_df_ev['DATE'])
# 참여율 칼럼 추가
off_df_ev['P_Ratio'] = (off_df_ev['PART'] / off_df_ev['VISITORS']) * 100
# 'DATE'를 월 단위로 그룹화하고 각 캠페인별 방문자 수를 합산
monthly_visit_ev = off_df_ev.groupby(['CAMP', pd.Grouper(key='DATE', freq='M')])['VISITORS'].sum().reset_index()
# 시각화
plt.figure(figsize=(12, 9))
sns.lineplot(data=monthly_visit_ev, x='DATE', y='VISITORS', hue='CAMP', palette='Set1')
# 그래프 꾸미기
plt.legend(loc='upper center', ncol=4, bbox_to_anchor=(0.5, 1))
plt.title('월간 캠페인별 방문자수')
plt.xlabel('날짜')
plt.ylabel('수')
plt.xticks(rotation=45)
plt.grid(True)
plt.tight_layout()
plt.show()

- 월간 캠페인별 참여자수
# 'DATE'를 월 단위로 그룹화하고 각 캠페인별 방문자 수를 합산
monthly_part_ev = off_df_ev.groupby(['CAMP', pd.Grouper(key='DATE', freq='M')])['PART'].sum().reset_index()
# 시각화
plt.figure(figsize=(12, 9))
# Seaborn으로 라인 플롯 생성
sns.lineplot(data=monthly_part_ev, x='DATE', y='PART', hue='CAMP', palette='Set1')
# 그래프 꾸미기
plt.legend(loc='upper center', ncol=4, bbox_to_anchor=(0.5, 1))
plt.title('월간 캠페인별 참여자수') # 제목 추가
plt.xlabel('날짜') # x축 라벨 추가
plt.ylabel('수') # y축 라벨 추가
plt.xticks(rotation=45) # x축 날짜 라벨 기울리기
plt.grid(True) # 배경 그리드 추가로 가독성 향상
plt.tight_layout() # 레이아웃 조정
plt.show() # 그래프 출력

- 캠페인별 방문율 (파이차트)
# 데이터 집계
vis_ev = off_df_ev.groupby(['CAMP'])['VISITORS'].sum().reset_index()
labels = vis_ev['CAMP'].unique()
explode = [0.1 for _ in range(len(labels))] # 모든 섹터를 약간 부풀리기
# 색상 팔레트 설정
colors = sns.color_palette("Set2", len(labels))
plt.pie(data = vis_ev, x='VISITORS', labels=labels, autopct='%.1f%%',startangle=260,
colors=colors, explode=explode, shadow=True)
plt.title("캠페인별 방문율")
plt.show()

- 캠페인별 참여율 (파이차트)
# 데이터 집계
part_ev = off_df_ev.groupby(['CAMP'])['PART'].sum().reset_index()
labels = part_ev['CAMP'].unique()
explode = [0.1 for _ in range(len(labels))] # 모든 섹터를 약간 부풀리기
# 색상 팔레트 설정
colors = sns.color_palette("Set1", len(labels))
plt.pie(data = part_ev, x='PART', labels=labels, autopct='%.1f%%',startangle=260,
colors=colors, explode=explode, shadow=True)
plt.title("캠페인별 참여율")
plt.show()

데이터 시각화
3. 각 지역의 캠페인별 누적 막대그래프
이번에는 각 지역의 캠페인별 방문자수와 참여자수를 각각 누적 막대그래프로 시각화해 본다.
# 데이터 집계 및 병합
off_df_ct_ev = off_df.groupby(['이벤트 종류', '날짜', '지역']).agg({'방문자수': 'sum', '참여자수': 'sum'}).reset_index()
# 컬럼 이름 변경
off_df_ct_ev.rename(columns={'지역': 'CITY', '방문자수': 'VISITORS', '참여자수': 'PART', '날짜': 'DATE', '이벤트 종류': 'CAMP'}, inplace=True)
# 날짜를 datetime으로 형변환
off_df_ct_ev['DATE'] = pd.to_datetime(off_df_ct_ev['DATE'])
# 참여율 칼럼 추가
off_df_ct_ev['P_Ratio'] = (off_df_ct_ev['PART'] / off_df_ct_ev['VISITORS']) * 100
# 'DATE'를 월 단위로 그룹화하고 각 지역별 방문자 수를 합산
monthly_visit_ct_ev = off_df_ct_ev.groupby(['CITY', 'CAMP', pd.Grouper(key='DATE', freq='M')])['VISITORS'].sum().reset_index()
# 그래프를 그릴 수 있도록 데이터 피벗
pivoted_data = monthly_visit_ct_ev.pivot_table(index='CITY', columns='CAMP', values='VISITORS', fill_value=0)
# 누적 막대그래프 생성
plt.figure(figsize=(10, 5))
# 각 캠페인별로 누적 막대 그래프를 그리기 위한 시작 지점
bottom_values = pd.Series([0] * pivoted_data.shape[0], index=pivoted_data.index)
# 각 캠페인별로 누적 값 추가
for camp in pivoted_data.columns:
plt.bar(pivoted_data.index, pivoted_data[camp], bottom=bottom_values, label=camp)
bottom_values += pivoted_data[camp]
# 그래프 꾸미기
plt.title('캠페인누적 방문자수') # 제목 추가
plt.xlabel('지역') # x축 라벨 추가
plt.ylabel('누적 방문자수') # y축 라벨 추가
plt.legend(title='캠페인', loc='best', bbox_to_anchor=(1, 1),
ncol=1, fontsize=10) # 범례 설정
plt.xticks(rotation=45) # x축 라벨 회전
plt.tight_layout(rect=[0, 0, 0.85, 1]) # 레이아웃 조정하여 그래프 안쪽 공간 늘리기
plt.show() # 그래프 출력

- 각 지역의 캠페인별 누적 참여자수 누적 막대 그래프
# 'DATE'를 월 단위로 그룹화하고 각 지역별 참여자 수를 합산
monthly_part_ct_ev = off_df_ct_ev.groupby(['CITY', 'CAMP', pd.Grouper(key='DATE', freq='M')])['PART'].sum().reset_index()
# 그래프를 그릴 수 있도록 데이터 피벗
pivoted_data = monthly_part_ct_ev.pivot_table(index='CITY', columns='CAMP', values='PART', fill_value=0)
# 누적 막대그래프 생성
plt.figure(figsize=(10, 5))
# 각 캠페인별로 누적 막대 그래프를 그리기 위한 시작 지점
bottom_values = pd.Series([0] * pivoted_data.shape[0], index=pivoted_data.index)
# 각 캠페인별로 누적 값 추가
for camp in pivoted_data.columns:
plt.bar(pivoted_data.index, pivoted_data[camp], bottom=bottom_values, label=camp)
bottom_values += pivoted_data[camp]
# 그래프 꾸미기
plt.title('캠페인누적 참여자수') # 제목 추가
plt.xlabel('지역') # x축 라벨 추가
plt.ylabel('누적 참여자수') # y축 라벨 추가
plt.legend(title='캠페인', loc='best', bbox_to_anchor=(1, 1), ncol=1, fontsize=10) # 범례 설정
plt.xticks(rotation=45) # x축 라벨 회전
plt.tight_layout(rect=[0, 0, 0.85, 1]) # 레이아웃 조정하여 그래프 안쪽 공간 늘리기
plt.show() # 그래프 출력

다음에는 연령대별, 성별에 따른 분석을 해본다.
다음 내용
[파이썬] 프로젝트 : 대시보드 웹 페이지 구축하기 - 4
이전 내용 [파이썬] 프로젝트 : 대시보드 웹 페이지 구축하기 - 3이전 내용 [파이썬] 프로젝트 : 대시보드 웹 페이지 구축하기 - 2이전 내용 [파이썬] 프로젝트 : 대시보드 웹 페이지 구축하기 -
puppy-foot-it.tistory.com
'[파이썬 Projects] > <파이썬 데이터 분석>' 카테고리의 다른 글
[파이썬] 프로젝트 : 웹 페이지 구축 - 4 (데이터 시각화) (0) | 2025.03.20 |
---|---|
[파이썬] 프로젝트 : 웹 페이지 구축 - 2 (데이터 전처리, 시각화) (0) | 2025.03.20 |
[파이썬] 프로젝트 : 웹 페이지 구축 - 1 (가상데이터 생성) (0) | 2025.03.14 |
[파이썬] 자연어 처리 (NLP) - 네이버 뉴스 텍스트 분석(2) (0) | 2024.08.21 |
[워드클라우드] 코로나 뉴스 기사 (feat.주사기 마스킹) (2) | 2024.08.19 |