먼저 풀어보기
select payment_installments, count(order_id) order_count, min(payment_value) min_value, max(payment_value) max_value, avg(payment_value) avg_value
from olist_order_payments_dataset
where payment_type = 'credit_card'
group by payment_installments
정답
select payment_installments, count(distinct(order_id)) order_count, min(payment_value) min_value, max(payment_value) max_value, avg(payment_value) avg_value
from olist_order_payments_dataset
where payment_type = 'credit_card'
group by payment_installments
count(distinct())를 해줘야됨
1. 라이브러리 불러오기(시각화 및 한글폰트)
import seaborn as sns
from datetime import datetime
import pandas as pd
# ipynb Notebook에 경고 표시를 무시합니다.
import warnings
warnings.filterwarnings(action='ignore')
import matplotlib.pyplot as plt
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
plt.style.use("ggplot")
import matplotlib.font_manager as fm
fe = fm.FontEntry(fname = 'MaruBuri-Regular.otf', name = 'MaruBuri')
fm.fontManager.ttflist.insert(0, fe)
plt.rc('font', family='MaruBuri')
2. 데이터 로드
competition_info_df = pd.read_csv('./competition_info.csv')
participate_log_df = pd.read_csv('./participate_log.csv')
submission_log_df = pd.read_csv('./submission_log.csv')
talk_log_df = pd.read_csv('./talk_log.csv')
codeshare_log_df = pd.read_csv('./codeshare_log.csv')
4. AI 경진대회 정보 (competition_info.csv) 시각화
a. 수치형 변수 분포를 seaborn의 distplot함수를 통해 시각화 하고 분석해 봅시다
참여자 수: 대부분의 대회는 비교적 적은 수의 참가자를 가지고 있지만, 몇몇 대회는 매우 높은 참가자 수를 보여줍니다. 최대 팀원 수: 대부분의 대회는 작은 팀 크기를 가지고 있으며, 일부 대회는 큰 팀을 허용합니다. 수상자 수: 대부분의 대회는 소수의 수상자를 가집니다. 일일 제출횟수: 대부분의 대회는 낮은 일일 제출 횟수를 보이지만, 일부 대회는 매우 높은 제출 빈도를 가집니다. 대회 기간(일): 대회 기간은 다양하며, 일부 대회는 매우 긴 기간 동안 진행되었습니다.
- *b. 키워드를 추출하고 가장 많이 등장한 상위 10개 barplot으로 시각화 **
가장 많이 언급된 키워드는 대회의 주요 주제 및 기술 분야를 반영합니다. 예를 들어, "알고리즘", "정형", "회귀" 등이 자주 언급되었습니다.
# 날짜 관련 컬럼을 datetime 형식으로 변환합니다.
competition_info_df['시작시간'] = pd.to_datetime(competition_info_df['시작시간'])
competition_info_df['종료시간'] = pd.to_datetime(competition_info_df['종료시간'])
# 대회 기간을 일(day) 단위로 계산합니다. 종료시간에서 시작시간을 빼서 계산합니다.
competition_info_df['대회 기간(일)'] = (competition_info_df['종료시간'] - competition_info_df['시작시간']).dt.days
import matplotlib.pyplot as plt
import seaborn as sns
# 색상 팔레트 설정
sns.set_palette("pastel")
# 색상 리스트 (예: 파스텔 색상)
colors = sns.color_palette("pastel")
# Figure 생성
fig = plt.figure(figsize=(12, 8))
# 숫자형 특성의 분포 그리기
for i, feature in enumerate(numerical_features, 1):
ax = fig.add_subplot(2, 3, i)
sns.distplot(competition_info_df[feature], kde=True, bins=30, color=colors[i - 1])
ax.set_title(f'{feature} 분포', fontsize=14)
ax.set_xlabel(feature, fontsize=12)
ax.set_ylabel('빈도수', fontsize=12)
# 대회 키워드 상위 10개를 막대 그래프로 그리기
ax = fig.add_subplot(2, 3, 6)
sns.barplot(x=keyword_counts.values[:10], y=keyword_counts.index[:10], palette="pastel")
ax.set_title('대회 키워드 Top 10', fontsize=14)
ax.set_xlabel('빈도수', fontsize=12)
ax.set_ylabel('키워드', fontsize=12)
# 차트 간격 조정
plt.tight_layout()
# 그래프를 보여주고 저장
plt.show()
5. AI 경진대회 참가자수 정보 시각화
a. 2023년 전체 대회의 시간에 따른 총 참가자 수 변화:
첫 번째 그래프는 2023년 동안 매일의 총 참가자 수를 보여줍니다. 이를 통해 특정 기간에 대회 참가자 수가 어떻게 변화하는지 확인할 수 있습니다.
# Convert '일자' column to datetime
participate_log_df['일자'] = pd.to_datetime(participate_log_df['일자'])
# Plotting
plt.figure(figsize=(15, 6))
# 1. 시간에 따른 참가자 수의 변화
# Grouping data by date and summing the number of participants
daily_participants = participate_log_df.groupby('일자')['참가자 수'].sum()
plt.plot(daily_participants.index, daily_participants.values)
plt.title('시간에 따른 총 참가자 수 변화')
plt.xlabel('날짜')
plt.ylabel('참가자 수')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
6. 제출수 정보 시각화
a. 시간에 따른 총 제출 수의 변화:
첫 번째 그래프는 전체 기간 동안 날짜별로 총 제출 수의 변화를 보여줍니다. 이를 통해 특정 시기에 대회 참여와 제출 활동이 어떻게 변화하는지 확인할 수 있습니다.
- *b. 특정 대회의 제출 수 추이 (대회 시작 후 경과일 기준):
두 번째 그래프는 선택된 몇 개의 대회에 대한 대회 시작 후 경과일별 제출 수의 변화를 보여줍니다. 각 대회의 제출 패턴을 비교하면서 대회의 인기와 참가자들의 활동 패턴을 이해할 수 있습니다.
# '일자' 칼럼을 datetime 형식으로 변환합니다.
submission_log_df['일자'] = pd.to_datetime(submission_log_df['일자'])
# 각 대회의 시작일을 찾기 위해, 각 대회별로 가장 빠른 날짜를 찾습니다.
competition_start_dates = submission_log_df.groupby('ID')['일자'].min()
# 각 로그의 일자에서 해당 대회의 시작일을 빼서 경과일을 계산합니다.
# 이는 각 제출이 대회 시작 후 몇 번째 날에 이루어졌는지 나타냅니다.
submission_log_df['경과일'] = submission_log_df.apply(lambda row: (row['일자'] - competition_start_dates[row['ID']]).days, axis=1)
# 시각화를 위한 설정
plt.figure(figsize=(15, 12))
# 1. 시간에 따른 총 제출 수의 변화
# 날짜별로 데이터를 그룹화하고, 각 날짜의 제출 수를 합산합니다.
daily_submissions = submission_log_df.groupby('일자')['제출 수'].sum()
plt.subplot(2, 1, 1) # 첫 번째 그래프 위치 지정
plt.plot(daily_submissions.index, daily_submissions.values) # 날짜별 총 제출 수 그래프
plt.title('시간에 따른 총 제출 수 변화') # 그래프 제목
plt.xlabel('날짜') # x축 레이블
plt.ylabel('제출 수') # y축 레이블
plt.xticks(rotation=45) # x축 레이블 회전
# 2. 특정 대회의 제출 수 추이 (대회 시작 후 경과일 기준)
plt.subplot(2, 1, 2) # 두 번째 그래프 위치 지정
sample_competitions = ['ID_126', 'ID_131', 'ID_147'] # 특정 샘플 대회 선정
for comp_id in sample_competitions:
comp_data = submission_log_df[submission_log_df['ID'] == comp_id]
plt.plot(comp_data['경과일'], comp_data['제출 수'], label=comp_id) # 각 대회별 경과일에 따른 제출 수 그래프
plt.title('특정 대회의 경과일에 따른 제출 수 추이') # 그래프 제목
plt.xlabel('대회 시작 후 경과일') # x축 레이블
plt.ylabel('제출 수') # y축 레이블
plt.legend() # 범례 표시
plt.tight_layout() # 그래프 레이아웃 조정
plt.show() # 그래프 표시
7. 토크 관련 정보 시각화
a. 상관관계 히트맵:
토크 수, 댓글 수, 조회 수, 공유 수, 좋아요 수 간의 상관관계를 보여주는 히트맵입니다. 이를 통해 서로 어떤 변수들이 긴밀하게 관련되어 있는지 파악할 수 있습니다.
b. 시간에 따른 토론 활동 트렌드:
일자별로 평균된 토크 수, 댓글 수 등의 트렌드를 나타내는 라인 그래프입니다. 이 그래프는 시간이 지남에 따라 토론 활동이 어떻게 변화하는지 보여줍니다.
# '일자' 칼럼을 datetime 형식으로 변환합니다.
talk_log_df['일자'] = pd.to_datetime(talk_log_df['일자'])
# 상관관계 히트맵 생성
correlation_matrix = talk_log_df[['토크 수', '댓글 수', '조회 수', '공유 수', '좋아요 수']].corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('토론 활동 간의 상관관계')
plt.show()
# 시간에 따른 활동 트렌드 분석
daily_activity_trends = talk_log_df.groupby('일자').mean()[['토크 수', '댓글 수', '조회 수', '공유 수', '좋아요 수']]
# 서브플롯 분리하여 시각화
fig, ax1 = plt.subplots(figsize=(15, 6))
# 조회 수를 별도의 서브플롯에 표시
ax1.plot(daily_activity_trends.index, daily_activity_trends['조회 수'], color='blue', label='조회 수')
ax1.set_title('시간에 따른 토론 활동 트렌드')
ax1.set_xlabel('날짜')
ax1.set_ylabel('조회 수', color='blue')
ax1.tick_params(axis='y', labelcolor='blue')
ax1.legend(loc='upper left')
# 나머지 항목을 다른 서브플롯에 표시
ax2 = ax1.twinx() # x축을 공유하는 두 번째 축
ax2.set_ylabel('활동 수', color='green')
for column in daily_activity_trends.columns.drop('조회 수'):
ax2.plot(daily_activity_trends.index, daily_activity_trends[column], label=column)
ax2.tick_params(axis='y', labelcolor='green')
ax2.legend(loc='upper right')
plt.xticks(rotation=45)
plt.show()
👉 Q1. 시간 활동에 따른 활동 트렌드 분석시. mean() 뒤에 [[]]붙는 이유? [[]]가 앞에 와야되는거 아닌가?
👉 A1. Phython3에서는 [[]]가 앞에 와야되는게 맞는듯
👉 Q2. 활동수에 대한 정의? 언제 함??
👉 A2. 활동수에 대한 정의가 아니라 조회수에 대한 걸 ax1에 나머지를 활동수로 ax2로 만들어줌
'SQL' 카테고리의 다른 글
고급 SQL 실습 - 웹 접속 및 사용 분석 (0) | 2024.03.20 |
---|---|
SQL - Join & Group by (0) | 2024.03.20 |
Programmers 문제풀이 3 (0) | 2024.03.18 |
Programmers 문제풀이2 (0) | 2024.03.17 |
Programmers 문제풀이 1 (0) | 2024.03.16 |