temp/실습

데이터 분석 실전연습: 날짜데이터(따릉이)

시송 2025. 1. 8. 09:09

1. all code of bike file processing

더보기
import pandas as pd
import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import folium

bikes_temp = {}         #빈 데이터 프레임

for i in range(1, 7):
    bikes_temp[i] = pd.read_csv(f'data/bike_rent_{i}.csv', encoding='cp949', parse_dates=['대여일시'])

bikes = pd.concat(bikes_temp, ignore_index=True)

pd.options.display.float_format = '{:.2f}'.format

bikes['일자'] = bikes['대여일시'].dt.day
bikes['대여시간대'] = bikes['대여일시'].dt.hour
#bikes['분'] = bikes['대여일시'].dt.minute
bikes['요일'] = bikes['대여일시'].dt.dayofweek.apply(lambda i: '월화수목금토일'[i])
bikes['주말구분'] = bikes['대여일시'].dt.dayofweek.apply(lambda x: '평일' if x < 5 else '주말')

bike_shop = pd.read_csv('data/bike_shop.csv', encoding='cp949')

bike_gu = bike_shop[['구분','대여소번호','대여소명','위도','경도']]
bikes = pd.merge(bikes, bike_gu, left_on='대여 대여소번호', right_on='대여소번호')

bikes.drop(columns=['대여소번호', '대여소명'], axis=1, inplace=True)

bikes.rename(columns={'구분':'대여구', '위도':'대여점위도', '경도':'대여점경도'}, inplace=True)

 

1) csv 파일 가져오기

bike_imsi = pd.read_csv('bike_rent_1.csv', encoding='cp949', parse_dates=['대여일시'])  #parse_dates: 시간으로 다루고 싶은 컬럼
bikes_temp = pd.concat([temp1, temp2, temp3, temp4, temp5, temp6])        #빈 데이터 프레임

bikes_temp = {} #빈 dict 프레임에 추가 {n:df.csv
for i in range(6):
    bikes_temp[i] = pd.read_csv(f'bike_rent_{i+1}.csv', encoding='cp949', parse_dates=['대여일시']) # csv에도 f-string 적용가능
#ignore_index 기존 인덱스를 무시하고 다시 순서를 0부터 정한다.
bikes = pd.concat(bikes_temp, ignore_index=True) #value만 연결
  • read_csv('파일명.csv', encoding='cp949): 한글코드 오류 방지
  • 함수 안에 인자도 f-string 사용 가능

 

2) 날짜-요일 변환

bikes['일자'] = bikes['대여일시'].dt.day
bikes['대여시간대'] = bikes['대여일시'].dt.hour
bikes['요일'] = bikes['대여일시'].dt.dayofweek

#0
weeks = {0:'월', 1:'화', 2:'수', 3:'목', 4:'금', 5:'토', 6:'일'}
bikes['요일'] = bikes['요일'].map(weeks) #key-value와 형태가 비슷하다.

#1
week = ['월', '화', '수','목', '금', '토', '일']
bikes['대여일시'].dt.dayofweek.apply(lambda x: week[x])
#2
bikes['대여일시'].dt.dayofweek.apply(lambda i: '월화수목금토일'[i])


if bikes['요일'] in ['토', '일']:
    bikes['주말구분'] = '주말'
else:
    bikes['주말구분'] = '평일'
  • dt.day
  • dt.hour
  • dt.dayofweek : int로 변환(0~6)

 

  • map( dict{key:value} ) : key를 value로 변환
  • list[n]의 list는 결국 특정 list(type.list)를 받아오는 변수이다. 이는 스트링도 마찬가지
    • '가나다'[1], [1,2,3,4][1] 모두 잘 작동한다.

 

3) left/right join by merge

# bikes 데이터 프레임에 bike_gu 데이터프레임 합치기, 기준은 대여소 번호
bikes = pd.merge(bikes,bike_gu, left_on='대여 대여소번호', right_on='대여소번호' )

 

 

4) ect.

pd.options.display.float_format = '{:.2f}'.format # 지수 삭제

bikes.describe(include=['object', 'datetime64']) #특정 dtype도 포함

# 프레임의 행 확인하기
bikes.shape[0]
#프레임의 열 확인하기
bikes.shape[1]

 

 

2. 시각화

pivot table(index= , columns= , values= 매개변수, aggfunc= 적용할 연산)

hourly_dayofweek_ride = bikes.pivot_table(index='대여시간대', columns='요일',values='자전거번호', aggfunc='count')

 

1) plt.plot

import matplotlib.pyplot as plt

plt.rc('font', family='Malgun Gothic', size=15)

plt.title('한글 폰트 테스트')

plt.plot([1,2,3,4])
plt.xlabel('시간')
plt.ylabel('거리')

plt.show()

 

# weekdays_hourly_ride를 이용하여 대여시간대 X 주말이용건수 선그래프 그리기
weekdays_hourly_ride.plot(kind='line', title='대여시간대 X 주말여부 이용건수', figsize=(15, 4))

# weekdays_hourly_ride를 이용하여 대여시간대 X 주말이용건수 막대그래프 그리기
weekdays_hourly_ride.plot(kind='bar', title='대여시간대 X 주말여부 이용건수', figsize=(15, 4))

 

# 구별자전거이용건수 수평막대그래프 그리기
구별자전거이용건수.plot(kind='barh', figsize=(15, 8), title='대여구별 자전거 이용건수')

 

2) sns.countplot

plt.figure(figsize=(10,4))
sns.countplot(data=bikes, x='요일', hue='요일', order =['월', '화', '수', '목', '금', '토', '일'] )
plt.show()

3) sns.heatmap

plt.figure(figsize=(10,8))
sns.heatmap(data=hourly_dayofweek_ride, annot=True, fmt='d' )

4) sns.boxplot

plt.figure(figsize=(10,8))
sns.boxplot(data=)

3. folium

import json
with open('data/seoul.json','r', encoding='utf-8') as f:
    서울시지도 = json.load(f)
    
lat = bikes['대여점위도'].mean()
lon = bikes['대여점경도'].mean()

map1 = folium.Map(location=[lat, lon], zoom_start=11)

folium.Choropleth(geo_data=서울시지도, 
                  data=구별자전거이용건수, 
                  columns=['대여구', '자전거번호'],
                  key_on='feature.properties.name', 
                  fill_color='YlGnBu').add_to(map1)
                  
folium.Marker(location=[위도, 경도], popup=대여점명).add_to(map1)