반응형
단원별 심화 연습 문제¶
In [1]:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import seaborn as sns
import glob
# set floating point formatting
pd.options.display.float_format = '{:,.1f}'.format
rental.csv
파일을 로드하여 다음의 지시사항에 맞는 시각화 그래프를 생성하고 출력합니다.
- date - 시간. 연-월-일 시:분:초 로 표현합니다. (가령 2011-01-01 00:00:00은 2011년 1월 1일 0시 0분 0초)
- businessday - 근무일. 1이면 근무일이며, 0이면 근무일이 아닙니다.
- holiday - 공휴일. 1이면 공휴일이며, 0이면 공휴일이 아닙니다.
- season - 계절. 봄, 여름, 가을, 겨울 순으로 표현합니다.
- weather - 날씨. 1 ~ 4 사이의 값을 가지며, 구체적으로는 다음과 같습니다.
- 1: 맑은 날씨
- 2: 약간의 안개와 구름이 끼어있는 날씨
- 3: 약간의 눈, 비가 오거나 천둥
- 4: 아주 많은 비가 오거나 우박
- humid - 습도
- wind - 풍속
- temp - 온도
- sense_temp - 체감 온도
- onetime - 비회원의 공유킥보드 대여량.
- membership - 멤버십에 가입한 회원의 공유킥보드 대여량.
- count - 총 공유킥보드 대여랑. 비회원(onetime)과 멤버십 회원(membership)이 대여한 총 공유킥보드 대여량
In [2]:
# 데이터셋
rental = pd.read_csv('/mnt/elice/dataset/rental.csv')
rental.head()
Out[2]:
date | businessday | holiday | season | weather | humid | wind | temp | sense_temp | onetime | membership | count | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2011-01-01 00:00:00 | 0 | 0 | 1 | 1 | 81 | 0.0 | 9.8 | 14.4 | 3 | 13 | 16 |
1 | 2011-01-01 01:00:00 | 0 | 0 | 1 | 1 | 80 | 0.0 | 9.0 | 13.6 | 8 | 32 | 40 |
2 | 2011-01-01 02:00:00 | 0 | 0 | 1 | 1 | 80 | 0.0 | 9.0 | 13.6 | 5 | 27 | 32 |
3 | 2011-01-01 03:00:00 | 0 | 0 | 1 | 1 | 75 | 0.0 | 9.8 | 14.4 | 3 | 10 | 13 |
4 | 2011-01-01 04:00:00 | 0 | 0 | 1 | 1 | 75 | 0.0 | 9.8 | 14.4 | 0 | 1 | 1 |
date
컬럼의 월별 temp
의 평균 온도를 bar 그래프로 생성합니다.
In [23]:
# 코드를 입력해 주세요
# date 컬럼을 datetime 형식으로 변환
rental['date'] = pd.to_datetime(rental['date'])
# date 컬럼에서 월을 추출하여 새로운 컬럼 생성
rental['month'] = rental['date'].dt.month
# 월별 temp의 평균 온도 계산
monthly_avg_temp = rental.groupby('month')['temp'].mean().reset_index()
# 바 그래프 생성
plt.bar(monthly_avg_temp['month'], monthly_avg_temp['temp'])
plt.show()
월별 temp
의 평균 온도를 bar 그래프로 생성하되, 연도별로 분할하여 생성합니다.
In [33]:
# 코드를 입력해 주세요
# date 컬럼에서 연도와 월을 추출하여 새로운 컬럼 생성
rental['year'] = rental['date'].dt.year
rental['month'] = rental['date'].dt.month
# 연도별, 월별 temp의 평균 온도 계산
monthly_avg_temp = rental.groupby(['year', 'month'])['temp'].mean().unstack()
# 막대 그래프 생성
fig, ax = plt.subplots(figsize=(12, 8))
width = 0.35 # 막대 폭
months = monthly_avg_temp.columns
# 막대를 그리기 위한 위치 설정
x = np.arange(len(months))
ax.bar(x - width/2, monthly_avg_temp.loc[2011], width, label='2011')
ax.bar(x + width/2, monthly_avg_temp.loc[2012], width, label='2012')
# 레이아웃 조정 및 그래프 출력
#plt.xticks(rotation=0)
#plt.tight_layout()
plt.show()
월별 count
를 연도별로 비교 bar 그래프로 생성합니다.
In [37]:
# 코드를 입력해 주세요
# 연도별, 월별 count의 합계 계산
monthly_count = rental.groupby(['year', 'month'])['count'].sum().unstack()
# 막대 그래프 생성
fig, ax = plt.subplots(figsize=(10, 6))
width = 0.35 # 막대 폭
months = monthly_count.columns
# 막대를 그리기 위한 위치 설정
x = np.arange(len(months))
bars1 = ax.bar(x - width/2, monthly_count.loc[2011], width, label='2011')
bars2 = ax.bar(x + width/2, monthly_count.loc[2012], width, label='2012')
# 중지점 설정
ax.set_xticks(x)
ax.set_xticklabels(months)
# 레이아웃 조정 및 그래프 출력
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()
- 2011년도의 대여량(
count
)를 요일별 boxplot으로 시각화 합니다. - 동일하게 2012년도의 대여량(
count
)를 요일별 boxplot으로 시각화 하여 비교합니다.
In [40]:
# 코드를 입력해 주세요
# date 컬럼에서 연도와 요일을 추출하여 새로운 컬럼 생성
rental['year'] = rental['date'].dt.year
rental['weekday'] = rental['date'].dt.dayofweek
# date 컬럼에서 연도와 요일을 추출하여 새로운 컬럼 생성
rental['year'] = rental['date'].dt.year
rental['weekday'] = rental['date'].dt.dayofweek
# 2011년도와 2012년도 데이터 분리
rental_2011 = rental[rental['year'] == 2011]
rental_2012 = rental[rental['year'] == 2012]
# 박스플롯 생성
fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(12, 10), sharex=True)
# 색상 팔레트 설정
colors = sns.color_palette("Set3")
# 2011년도 요일별 대여량 박스플롯
sns.boxplot(x='weekday', y='count', data=rental_2011, ax=axes[0], palette=colors)
axes[0].set_title('2011 Yearly Rentals by Weekday')
axes[0].set_ylabel('Count')
axes[0].set_xlabel('')
# 2012년도 요일별 대여량 박스플롯
sns.boxplot(x='weekday', y='count', data=rental_2012, ax=axes[1], palette=colors)
axes[1].set_title('2012 Yearly Rentals by Weekday')
axes[1].set_ylabel('Count')
axes[1].set_xlabel('Weekday')
# 레이아웃 조정 및 그래프 출력
plt.tight_layout()
plt.show()
2011년도의 대여량(count
)을 시간대(hour
) / dayofweek
로 나누어 point plot
을 생성하세요
In [45]:
# 코드를 입력해 주세요
# date 컬럼에서 연도, 요일, 시간 추출하여 새로운 컬럼 생성
rental['year'] = rental['date'].dt.year
rental['dayofweek'] = rental['date'].dt.dayofweek
rental['hour'] = rental['date'].dt.hour
# 2011년도 데이터 필터링
rental_2011 = rental[rental['year'] == 2011]
# 포인트 플롯 생성
#plt.figure(figsize=(14, 8))
sns.pointplot(x='hour', y='count', hue='dayofweek', data=rental_2011)
#plt.legend(title='Day of Week', labels=['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'])
plt.tight_layout()
plt.show()
2012년도 데이터를 대상으로 month
를 인덱스, dayofweek
를 컬럼으로 갖는 wind
에 대한 피벗테이블을 완성 후 다음의 히트맵을 출력하세요
- hint. 컬러맵은 다음을 활용합니다.
cmap='coolwarm'
In [51]:
# 코드를 입력해 주세요
# date 컬럼에서 연도, 월, 요일 추출하여 새로운 컬럼 생성
rental['year'] = rental['date'].dt.year
rental['month'] = rental['date'].dt.month
rental['weekday'] = rental['date'].dt.dayofweek
# 2012년도 데이터 필터링
rental_2012 = rental[rental['year'] == 2012]
# 피벗 테이블 생성
pivot_table = rental_2012.pivot_table(values='wind', index='month', columns='weekday', aggfunc='mean')
# 히트맵 생성
plt.figure(figsize=(12, 8))
sns.heatmap(pivot_table, cmap='coolwarm', annot=True)
plt.xticks(ticks=[0.5 + i for i in range(7)], labels=['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'])
plt.show()