Python
[python 실습] python을 이용한 데이터 분석 및 시각화 실습
갓지이
2023. 3. 9. 19:51
1. 서울시 코로나19 확진자 동선 추이¶
데이터 준비하기¶
In [2]:
import pandas as pd
import matplotlib.pyplot as plt
폰트 및 언어 확인하기¶
In [42]:
plt.plot([1,2,3],[4,5,6])
plt.title('그래프')
plt.show()
In [41]:
# 그래프를 노트북 안에 그리기 위해 설정
%matplotlib inline
# 필요한 패키지와 라이브러리 가져온다.
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
# 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
mpl.rcParams['axes.unicode_minus'] = False
# 폰트 지정하기
plt.rcParams['font.family'] = 'Apple SD Gothic Neo'
In [5]:
# 폰트 확인하기
[f.name for f in fm.fontManager.ttflist if 'Gothic' in f.name]
Out[5]:
['Apple SD Gothic Neo',
'AppleGothic',
'Hiragino Maru Gothic Pro',
'Noto Sans Gothic']
- 데이터 수집
https://data.seoul.go.kr/dataList/1/literacyView.do
파일을 utf-8로 변환하여 사용
데이터 불러오기¶
In [6]:
df = pd.read_csv('data/서울시 코로나19 확진자 현황.csv', low_memory=False)
In [7]:
df
Out[7]:
연번 | 확진일 | 환자번호 | 국적 | 환자정보 | 지역 | 여행력 | 접촉력 | 조치사항 | 상태 | 이동경로 | 등록일 | 수정일 | 노출여부 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 99550 | 2021-09-28 | NaN | NaN | NaN | 기타 | NaN | 감염경로 조사중 | NaN | - | NaN | 2021-09-29 10:54 | 2021-09-29 10:54 | Y |
1 | 99549 | 2021-09-28 | NaN | NaN | NaN | 기타 | NaN | 감염경로 조사중 | NaN | - | NaN | 2021-09-29 10:54 | 2021-09-29 10:54 | Y |
2 | 99548 | 2021-09-28 | NaN | NaN | NaN | 기타 | NaN | 감염경로 조사중 | NaN | - | NaN | 2021-09-29 10:54 | 2021-09-29 10:54 | Y |
3 | 99547 | 2021-09-28 | NaN | NaN | NaN | 기타 | NaN | 감염경로 조사중 | NaN | - | NaN | 2021-09-29 10:54 | 2021-09-29 10:54 | Y |
4 | 99546 | 2021-09-28 | NaN | NaN | NaN | 기타 | NaN | 감염경로 조사중 | NaN | - | NaN | 2021-09-29 10:54 | 2021-09-29 10:54 | Y |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
99545 | 5 | 2020-01-31 | NaN | NaN | NaN | 성북구 | NaN | 기타 확진자 접촉 | NaN | 퇴원 | NaN | 2021-05-27 11:08 | 2021-05-27 11:08 | Y |
99546 | 4 | 2020-01-30 | NaN | NaN | NaN | 마포구 | 중국 | 해외유입 | NaN | 퇴원 | NaN | 2021-05-27 11:08 | 2021-05-27 11:08 | Y |
99547 | 3 | 2020-01-30 | NaN | NaN | NaN | 종로구 | NaN | 종로구 집단발병 | NaN | 퇴원 | NaN | 2021-05-27 11:08 | 2021-05-27 11:08 | Y |
99548 | 2 | 2020-01-30 | NaN | NaN | NaN | 중랑구 | 중국 | 해외유입 | NaN | 퇴원 | NaN | 2021-05-27 11:08 | 2021-05-27 11:08 | Y |
99549 | 1 | 2020-01-24 | NaN | NaN | NaN | 강서구 | 중국 | 해외유입 | NaN | 퇴원 | NaN | 2021-05-27 11:08 | 2021-05-27 11:08 | Y |
99550 rows × 14 columns
데이터 확인 및 전처리¶
컬럼별 데이터 확인¶
In [8]:
df['환자정보'].unique
# 환자번호, 국적, 환자정보, 조치사항은 모두 null
Out[8]:
<bound method Series.unique of 0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
..
99545 NaN
99546 NaN
99547 NaN
99548 NaN
99549 NaN
Name: 환자정보, Length: 99550, dtype: float64>
불필요한 컬럼 삭제¶
In [9]:
df.drop(columns=['환자번호','국적','환자정보','조치사항','이동경로','등록일','수정일','노출여부'], inplace=True)
In [10]:
df
Out[10]:
연번 | 확진일 | 지역 | 여행력 | 접촉력 | 상태 | |
---|---|---|---|---|---|---|
0 | 99550 | 2021-09-28 | 기타 | NaN | 감염경로 조사중 | - |
1 | 99549 | 2021-09-28 | 기타 | NaN | 감염경로 조사중 | - |
2 | 99548 | 2021-09-28 | 기타 | NaN | 감염경로 조사중 | - |
3 | 99547 | 2021-09-28 | 기타 | NaN | 감염경로 조사중 | - |
4 | 99546 | 2021-09-28 | 기타 | NaN | 감염경로 조사중 | - |
... | ... | ... | ... | ... | ... | ... |
99545 | 5 | 2020-01-31 | 성북구 | NaN | 기타 확진자 접촉 | 퇴원 |
99546 | 4 | 2020-01-30 | 마포구 | 중국 | 해외유입 | 퇴원 |
99547 | 3 | 2020-01-30 | 종로구 | NaN | 종로구 집단발병 | 퇴원 |
99548 | 2 | 2020-01-30 | 중랑구 | 중국 | 해외유입 | 퇴원 |
99549 | 1 | 2020-01-24 | 강서구 | 중국 | 해외유입 | 퇴원 |
99550 rows × 6 columns
자료형 변환¶
In [11]:
# 자료형 확인
df.dtypes
Out[11]:
연번 int64
확진일 object
지역 object
여행력 object
접촉력 object
상태 object
dtype: object
In [12]:
# 확진일 --> datetime
df['확진일'] = pd.to_datetime(df['확진일'])
In [13]:
df.dtypes
Out[13]:
연번 int64
확진일 datetime64[ns]
지역 object
여행력 object
접촉력 object
상태 object
dtype: object
In [14]:
# 지역의 공백 제거
df['지역'].nunique()
Out[14]:
29
In [15]:
df['지역'].unique()
Out[15]:
array(['기타', '영등포구', '관악구', '서대문구', '송파구', '동대문구', '성동구', '중랑구', '타시도',
'종로구', '도봉구', '용산구', '마포구', '구로구', '동작구', '강동구', '중구', '노원구',
'양천구', '강서구', '은평구', '성북구', '광진구', '금천구', '강북구', '강남구', '서초구',
'타시도 ', ' 성북구'], dtype=object)
In [16]:
df['지역'] = df['지역'].str.strip()
In [17]:
df['지역'].nunique()
Out[17]:
27
In [18]:
df['지역'].unique()
Out[18]:
array(['기타', '영등포구', '관악구', '서대문구', '송파구', '동대문구', '성동구', '중랑구', '타시도',
'종로구', '도봉구', '용산구', '마포구', '구로구', '동작구', '강동구', '중구', '노원구',
'양천구', '강서구', '은평구', '성북구', '광진구', '금천구', '강북구', '강남구', '서초구'],
dtype=object)
In [19]:
# 지역, 상태 --> category (지역의 공백 제거)
df['지역'] = df['지역'].astype('category')
In [20]:
df.dtypes
Out[20]:
연번 int64
확진일 datetime64[ns]
지역 category
여행력 object
접촉력 object
상태 object
dtype: object
In [21]:
# 정보
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 99550 entries, 0 to 99549
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 연번 99550 non-null int64
1 확진일 99550 non-null datetime64[ns]
2 지역 99550 non-null category
3 여행력 1717 non-null object
4 접촉력 99550 non-null object
5 상태 99550 non-null object
dtypes: category(1), datetime64[ns](1), int64(1), object(3)
memory usage: 3.9+ MB
결측치 분석¶
In [22]:
df.isnull().sum()
Out[22]:
연번 0
확진일 0
지역 0
여행력 97833
접촉력 0
상태 0
dtype: int64
In [23]:
df
Out[23]:
연번 | 확진일 | 지역 | 여행력 | 접촉력 | 상태 | |
---|---|---|---|---|---|---|
0 | 99550 | 2021-09-28 | 기타 | NaN | 감염경로 조사중 | - |
1 | 99549 | 2021-09-28 | 기타 | NaN | 감염경로 조사중 | - |
2 | 99548 | 2021-09-28 | 기타 | NaN | 감염경로 조사중 | - |
3 | 99547 | 2021-09-28 | 기타 | NaN | 감염경로 조사중 | - |
4 | 99546 | 2021-09-28 | 기타 | NaN | 감염경로 조사중 | - |
... | ... | ... | ... | ... | ... | ... |
99545 | 5 | 2020-01-31 | 성북구 | NaN | 기타 확진자 접촉 | 퇴원 |
99546 | 4 | 2020-01-30 | 마포구 | 중국 | 해외유입 | 퇴원 |
99547 | 3 | 2020-01-30 | 종로구 | NaN | 종로구 집단발병 | 퇴원 |
99548 | 2 | 2020-01-30 | 중랑구 | 중국 | 해외유입 | 퇴원 |
99549 | 1 | 2020-01-24 | 강서구 | 중국 | 해외유입 | 퇴원 |
99550 rows × 6 columns
구 별 확진자 동향¶
확진일-구별 확진자수 집계¶
피봇테이블 만들기¶
In [24]:
df_gu = pd.pivot_table(df, index='확진일', columns='지역', values='연번', aggfunc='count', margins=True)
df_gu
Out[24]:
지역 | 강남구 | 강동구 | 강북구 | 강서구 | 관악구 | 광진구 | 구로구 | 금천구 | 기타 | 노원구 | ... | 송파구 | 양천구 | 영등포구 | 용산구 | 은평구 | 종로구 | 중구 | 중랑구 | 타시도 | All |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
확진일 | |||||||||||||||||||||
2020-01-24 00:00:00 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
2020-01-30 00:00:00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 3 |
2020-01-31 00:00:00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 3 |
2020-02-02 00:00:00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
2020-02-05 00:00:00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2021-09-25 00:00:00 | 37 | 41 | 42 | 48 | 37 | 34 | 31 | 39 | 0 | 27 | ... | 88 | 20 | 35 | 32 | 31 | 31 | 24 | 35 | 31 | 928 |
2021-09-26 00:00:00 | 43 | 17 | 27 | 29 | 37 | 37 | 72 | 19 | 0 | 25 | ... | 55 | 12 | 40 | 13 | 38 | 33 | 27 | 26 | 32 | 778 |
2021-09-27 00:00:00 | 50 | 29 | 20 | 50 | 23 | 34 | 58 | 16 | 0 | 37 | ... | 58 | 27 | 41 | 28 | 17 | 20 | 22 | 18 | 63 | 842 |
2021-09-28 00:00:00 | 45 | 51 | 25 | 41 | 48 | 36 | 55 | 31 | 65 | 29 | ... | 68 | 27 | 43 | 24 | 47 | 23 | 37 | 26 | 43 | 1054 |
All | 6926 | 3782 | 2606 | 4447 | 5418 | 3486 | 4168 | 2064 | 2321 | 3932 | ... | 6356 | 3291 | 4463 | 2705 | 4284 | 1617 | 1708 | 3729 | 4715 | 99550 |
583 rows × 28 columns
서울시 일별 추가확진자 동향¶
In [26]:
s_date = df_gu['All'][:-1]
s_date
Out[26]:
확진일
2020-01-24 1
2020-01-30 3
2020-01-31 3
2020-02-02 1
2020-02-05 2
...
2021-09-24 1222
2021-09-25 928
2021-09-26 778
2021-09-27 842
2021-09-28 1054
Name: All, Length: 582, dtype: int64
In [27]:
# 서울시 일별 추가확진자가 많았던 순으로 보기
s_date.sort_values(ascending=False)
Out[27]:
확진일
2021-09-24 1222
2021-09-28 1054
2021-09-25 928
2021-09-23 905
2021-09-27 842
...
2020-04-24 1
2020-04-30 1
2020-05-01 1
2020-05-17 1
2020-01-24 1
Name: All, Length: 582, dtype: int64
In [28]:
# 서울시 일별 추가확진자 시각화
x = s_date.index
y = s_date.values
plt.plot(x,y)
plt.title('서울시 일별 추가확진자(2021.09.28)')
plt.xlabel('확진일')
plt.ylabel('추가확진자수')
plt.xticks(rotation=45)
plt.show()
서울시 구별 누적확진자 비교¶
In [29]:
# 서울시 구별 누적확진자 많은 순으로 보기
s_gu = df_gu.loc['All'][:-1] # 마지막 행, 전체 합계는 제외
s_gu = s_gu.sort_values(ascending=False) # 내림차순
s_gu
Out[29]:
지역
강남구 6926
송파구 6356
관악구 5418
타시도 4715
영등포구 4463
강서구 4447
은평구 4284
서초구 4284
구로구 4168
동작구 4120
노원구 3932
강동구 3782
성북구 3779
중랑구 3729
마포구 3726
동대문구 3487
광진구 3486
양천구 3291
성동구 2839
용산구 2705
서대문구 2692
강북구 2606
도봉구 2605
기타 2321
금천구 2064
중구 1708
종로구 1617
Name: All, dtype: int64
In [28]:
# 서울시 구별 누적확진자 많은 순으로 시각화
x = s_gu.index
y = s_gu.values
plt.figure(figsize=(10,7)) # 그래프 사이즈 조정
plt.title('서울시 구별 누적확진자(2021.09.28)', size=20)
plt.barh(x,y)
plt.show()
최근일 기준 지역별 추가확진자¶
In [30]:
df_gu
Out[30]:
지역 | 강남구 | 강동구 | 강북구 | 강서구 | 관악구 | 광진구 | 구로구 | 금천구 | 기타 | 노원구 | ... | 송파구 | 양천구 | 영등포구 | 용산구 | 은평구 | 종로구 | 중구 | 중랑구 | 타시도 | All |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
확진일 | |||||||||||||||||||||
2020-01-24 00:00:00 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
2020-01-30 00:00:00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 3 |
2020-01-31 00:00:00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 3 |
2020-02-02 00:00:00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
2020-02-05 00:00:00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2021-09-25 00:00:00 | 37 | 41 | 42 | 48 | 37 | 34 | 31 | 39 | 0 | 27 | ... | 88 | 20 | 35 | 32 | 31 | 31 | 24 | 35 | 31 | 928 |
2021-09-26 00:00:00 | 43 | 17 | 27 | 29 | 37 | 37 | 72 | 19 | 0 | 25 | ... | 55 | 12 | 40 | 13 | 38 | 33 | 27 | 26 | 32 | 778 |
2021-09-27 00:00:00 | 50 | 29 | 20 | 50 | 23 | 34 | 58 | 16 | 0 | 37 | ... | 58 | 27 | 41 | 28 | 17 | 20 | 22 | 18 | 63 | 842 |
2021-09-28 00:00:00 | 45 | 51 | 25 | 41 | 48 | 36 | 55 | 31 | 65 | 29 | ... | 68 | 27 | 43 | 24 | 47 | 23 | 37 | 26 | 43 | 1054 |
All | 6926 | 3782 | 2606 | 4447 | 5418 | 3486 | 4168 | 2064 | 2321 | 3932 | ... | 6356 | 3291 | 4463 | 2705 | 4284 | 1617 | 1708 | 3729 | 4715 | 99550 |
583 rows × 28 columns
In [33]:
s_gu = df_gu.iloc[-2][:-1] # 9월 28일자 데이터
s_gu = s_gu.sort_values(ascending=False)
In [34]:
x = s_gu.index
y = s_gu.values
plt.figure(figsize=(10,7))
plt.barh(x,y)
plt.show()
접촉력에 따른 확진 분석¶
접촉력에 따른 확진 건수 best10¶
In [35]:
df['접촉력'].value_counts()[:10].to_frame()
Out[35]:
접촉력 | |
---|---|
기타 확진자 접촉 | 37943 |
감염경로 조사중 | 31964 |
타시도 확진자 접촉 | 4244 |
해외유입 | 1729 |
동부구치소 관련 | 1175 |
병원 및 요양시설 | 988 |
송파구 소재 시장 관련(?21.9.) | 659 |
성북구 사랑제일교회 관련 | 641 |
중구 소재 시장 관련(?21.9.) | 277 |
강서구 교회 관련 | 246 |
최근월 접촉력에 따른 확진 건수 best10¶
- 2021-09
In [36]:
df[(df['확진일'].dt.year==2021)&(df['확진일'].dt.month==9)]['접촉력'].value_counts()[:10].to_frame()
Out[36]:
접촉력 | |
---|---|
감염경로 조사중 | 8117 |
기타 확진자 접촉 | 8088 |
송파구 소재 시장 관련(?21.9.) | 658 |
타시도 확진자 접촉 | 587 |
중구 소재 시장 관련(?21.9.) | 277 |
병원 및 요양시설 | 186 |
해외유입 | 122 |
용산구 소재 병원 관련(?21.9.) | 77 |
동대문구 소재 시장 관련 | 44 |
강서구 소재 시장 관련 | 44 |
데이터 수집 및 전처리¶
In [1]:
import pandas as pd
In [45]:
# 그래프를 노트북 안에 그리기 위해 설정
%matplotlib inline
# 필요한 패키지와 라이브러리 가져온다.
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
# 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
mpl.rcParams['axes.unicode_minus'] = False
# 폰트 지정하기
plt.rcParams['font.family'] = 'Apple SD Gothic Neo'
2021년 공공자전거 대여이력 정보¶
데이터프레임 생성/확인¶
In [46]:
df1 = pd.read_csv('data/공공자전거 대여이력 정보_2021.01.csv', encoding='cp949', low_memory=False)
df2 = pd.read_csv('data/공공자전거 대여이력 정보_2021.02.csv', encoding='cp949', low_memory=False)
df3 = pd.read_csv('data/공공자전거 대여이력 정보_2021.03.csv', encoding='cp949', low_memory=False)
df4 = pd.read_csv('data/공공자전거 대여이력 정보_2021.04.csv', encoding='cp949', low_memory=False)
df5 = pd.read_csv('data/공공자전거 대여이력 정보_2021.05.csv', encoding='cp949', low_memory=False)
df6 = pd.read_csv('data/공공자전거 대여이력 정보_2021.06.csv', encoding='cp949', low_memory=False)
In [48]:
df1.head(1)
Out[48]:
자전거번호 | 대여일시 | 대여 대여소번호 | 대여 대여소명 | 대여거치대 | 반납일시 | 반납대여소번호 | 반납대여소명 | 반납거치대 | 이용시간 | 이용거리 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | SPB-53145 | 2021-01-02 20:50:36 | 3 | 중랑센터 | 0 | 2021-01-02 21:15:41 | 668 | 서울축산농협(장안지점) | 0 | 25 | 0.0 |
데이터 연결/확인¶
- concat
In [49]:
# concat 하나의 데이터 프레임으로 합치기
df = pd.concat([df1,df2,df3,df4,df5,df6])
In [52]:
# head
df.head(1)
Out[52]:
자전거번호 | 대여일시 | 대여 대여소번호 | 대여 대여소명 | 대여거치대 | 반납일시 | 반납대여소번호 | 반납대여소명 | 반납거치대 | 이용시간 | 이용거리 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | SPB-53145 | 2021-01-02 20:50:36 | 3 | 중랑센터 | 0 | 2021-01-02 21:15:41 | 668 | 서울축산농협(장안지점) | 0 | 25.0 | 0.0 |
In [53]:
#tail
df.tail(1)
Out[53]:
자전거번호 | 대여일시 | 대여 대여소번호 | 대여 대여소명 | 대여거치대 | 반납일시 | 반납대여소번호 | 반납대여소명 | 반납거치대 | 이용시간 | 이용거리 | |
---|---|---|---|---|---|---|---|---|---|---|---|
3445943 | SPB-52274 | 2021-06-30 22:12:10 | 2220 | 반포본동 주민센터 앞 | 0 | 2021-07-01 04:55:30 | 02526 | 반포경남쇼핑 앞 | 0 | 403.0 | 4541.22 |
In [54]:
# 데이터 크기
df.shape
Out[54]:
(13613873, 11)
In [55]:
# 데이터 정보(사용메모리)
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 13613873 entries, 0 to 3445943
Data columns (total 11 columns):
# Column Dtype
--- ------ -----
0 자전거번호 object
1 대여일시 object
2 대여 대여소번호 int64
3 대여 대여소명 object
4 대여거치대 object
5 반납일시 object
6 반납대여소번호 object
7 반납대여소명 object
8 반납거치대 int64
9 이용시간 float64
10 이용거리 float64
dtypes: float64(2), int64(2), object(7)
memory usage: 1.2+ GB
데이터 전처리¶
불필요한 컬럼 제거¶
In [56]:
# 자전거번호, 대여거치대, 반납거치대 제거
df.drop(columns=['자전거번호', '대여거치대', '반납거치대'], inplace=True)
In [57]:
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 13613873 entries, 0 to 3445943
Data columns (total 8 columns):
# Column Dtype
--- ------ -----
0 대여일시 object
1 대여 대여소번호 int64
2 대여 대여소명 object
3 반납일시 object
4 반납대여소번호 object
5 반납대여소명 object
6 이용시간 float64
7 이용거리 float64
dtypes: float64(2), int64(1), object(5)
memory usage: 934.8+ MB
자료형 확인/변경¶
In [58]:
# 자료형 확인
df.dtypes
Out[58]:
대여일시 object
대여 대여소번호 int64
대여 대여소명 object
반납일시 object
반납대여소번호 object
반납대여소명 object
이용시간 float64
이용거리 float64
dtype: object
In [59]:
# 카테고리형으로 변경 : 대여 대여소번호, 반납대여소번호
df['대여 대여소번호'] = df['대여 대여소번호'].astype('category')
df['반납대여소번호'] = df['반납대여소번호'].astype('category')
In [60]:
df.dtypes
Out[60]:
대여일시 object
대여 대여소번호 category
대여 대여소명 object
반납일시 object
반납대여소번호 category
반납대여소명 object
이용시간 float64
이용거리 float64
dtype: object
In [61]:
# 메모리 용량 확인
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 13613873 entries, 0 to 3445943
Data columns (total 8 columns):
# Column Dtype
--- ------ -----
0 대여일시 object
1 대여 대여소번호 category
2 대여 대여소명 object
3 반납일시 object
4 반납대여소번호 category
5 반납대여소명 object
6 이용시간 float64
7 이용거리 float64
dtypes: category(2), float64(2), object(4)
memory usage: 779.2+ MB
In [62]:
df
Out[62]:
대여일시 | 대여 대여소번호 | 대여 대여소명 | 반납일시 | 반납대여소번호 | 반납대여소명 | 이용시간 | 이용거리 | |
---|---|---|---|---|---|---|---|---|
0 | 2021-01-02 20:50:36 | 3 | 중랑센터 | 2021-01-02 21:15:41 | 668 | 서울축산농협(장안지점) | 25.0 | 0.00 |
1 | 2021-01-04 16:02:12 | 3 | 중랑센터 | 2021-01-04 16:17:06 | 668 | 서울축산농협(장안지점) | 14.0 | 0.00 |
2 | 2021-01-13 21:02:05 | 3 | 중랑센터 | 2021-01-13 21:14:04 | 668 | 서울축산농협(장안지점) | 11.0 | 1853.99 |
3 | 2021-01-14 21:02:55 | 3 | 중랑센터 | 2021-01-14 21:13:41 | 668 | 서울축산농협(장안지점) | 10.0 | 0.00 |
4 | 2021-01-18 18:02:08 | 3 | 중랑센터 | 2021-01-18 18:15:22 | 540 | 군자역 7번출구 베스트샵 앞 | 13.0 | 2291.05 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
3445939 | 2021-06-30 22:44:14 | 152 | 마포구민체육센터 앞 | 2021-07-01 04:48:33 | 00126 | 서강대 후문 옆 | 364.0 | 10153.36 |
3445940 | 2021-06-30 22:45:19 | 152 | 마포구민체육센터 앞 | 2021-07-01 04:52:25 | 00437 | 대흥역 1번출구 | 367.0 | 10100.71 |
3445941 | 2021-06-30 22:43:43 | 152 | 마포구민체육센터 앞 | 2021-07-01 04:52:27 | 00437 | 대흥역 1번출구 | 368.0 | 430.00 |
3445942 | 2021-06-30 22:11:14 | 2220 | 반포본동 주민센터 앞 | 2021-07-01 04:55:29 | 02526 | 반포경남쇼핑 앞 | 404.0 | 0.00 |
3445943 | 2021-06-30 22:12:10 | 2220 | 반포본동 주민센터 앞 | 2021-07-01 04:55:30 | 02526 | 반포경남쇼핑 앞 | 403.0 | 4541.22 |
13613873 rows × 8 columns
In [63]:
# datetime형으로 변경 : 대여일시,반납일시
df['대여일시'] = pd.to_datetime(df['대여일시'])
In [64]:
df['반납일시'] = pd.to_datetime(df['반납일시'], errors='coerce')
In [65]:
# 자료형 변경 확인
df.dtypes
Out[65]:
대여일시 datetime64[ns]
대여 대여소번호 category
대여 대여소명 object
반납일시 datetime64[ns]
반납대여소번호 category
반납대여소명 object
이용시간 float64
이용거리 float64
dtype: object
결측치 확인/처리¶
In [66]:
# 결측치 확인
df.isnull().sum()
Out[66]:
대여일시 0
대여 대여소번호 0
대여 대여소명 0
반납일시 123
반납대여소번호 0
반납대여소명 0
이용시간 0
이용거리 269
dtype: int64
In [67]:
# 결측치 제거
df.dropna(inplace=True)
In [68]:
# 결측치 확인
df.isnull().sum()
Out[68]:
대여일시 0
대여 대여소번호 0
대여 대여소명 0
반납일시 0
반납대여소번호 0
반납대여소명 0
이용시간 0
이용거리 0
dtype: int64
일별 이용 현황¶
대여날짜 컬럼 추가¶
- date
In [69]:
df['대여날짜'] = df['대여일시'].dt.date
In [70]:
df
Out[70]:
대여일시 | 대여 대여소번호 | 대여 대여소명 | 반납일시 | 반납대여소번호 | 반납대여소명 | 이용시간 | 이용거리 | 대여날짜 | |
---|---|---|---|---|---|---|---|---|---|
0 | 2021-01-02 20:50:36 | 3 | 중랑센터 | 2021-01-02 21:15:41 | 668 | 서울축산농협(장안지점) | 25.0 | 0.00 | 2021-01-02 |
1 | 2021-01-04 16:02:12 | 3 | 중랑센터 | 2021-01-04 16:17:06 | 668 | 서울축산농협(장안지점) | 14.0 | 0.00 | 2021-01-04 |
2 | 2021-01-13 21:02:05 | 3 | 중랑센터 | 2021-01-13 21:14:04 | 668 | 서울축산농협(장안지점) | 11.0 | 1853.99 | 2021-01-13 |
3 | 2021-01-14 21:02:55 | 3 | 중랑센터 | 2021-01-14 21:13:41 | 668 | 서울축산농협(장안지점) | 10.0 | 0.00 | 2021-01-14 |
4 | 2021-01-18 18:02:08 | 3 | 중랑센터 | 2021-01-18 18:15:22 | 540 | 군자역 7번출구 베스트샵 앞 | 13.0 | 2291.05 | 2021-01-18 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
3445939 | 2021-06-30 22:44:14 | 152 | 마포구민체육센터 앞 | 2021-07-01 04:48:33 | 00126 | 서강대 후문 옆 | 364.0 | 10153.36 | 2021-06-30 |
3445940 | 2021-06-30 22:45:19 | 152 | 마포구민체육센터 앞 | 2021-07-01 04:52:25 | 00437 | 대흥역 1번출구 | 367.0 | 10100.71 | 2021-06-30 |
3445941 | 2021-06-30 22:43:43 | 152 | 마포구민체육센터 앞 | 2021-07-01 04:52:27 | 00437 | 대흥역 1번출구 | 368.0 | 430.00 | 2021-06-30 |
3445942 | 2021-06-30 22:11:14 | 2220 | 반포본동 주민센터 앞 | 2021-07-01 04:55:29 | 02526 | 반포경남쇼핑 앞 | 404.0 | 0.00 | 2021-06-30 |
3445943 | 2021-06-30 22:12:10 | 2220 | 반포본동 주민센터 앞 | 2021-07-01 04:55:30 | 02526 | 반포경남쇼핑 앞 | 403.0 | 4541.22 | 2021-06-30 |
13613604 rows × 9 columns
대여날짜 별 대여 건수¶
- groupby
- to_frame
In [71]:
# 대여날짜 별 대여건수 추출
df_count = df.groupby('대여날짜').대여일시.count().to_frame()
In [72]:
# 대여날짜 별 대여건수 시각화
df_count.columns=['대여건수']
In [74]:
# 시간에 따른 변화를 보이기 위해 꺾은선 그래프 사용
plt.plot(df_count.index, df_count.values)
plt.title('서울시 공공자전거 대여 날짜 별 대여건수')
plt.show()
대여날짜 별 이용시간¶
- groupby
- to_frame
In [75]:
# 대여날짜 별 이용시간 추출
df_time = df.groupby('대여날짜')['이용시간'].sum().to_frame()
In [76]:
# 대여날짜 별 이용시간 시각화
plt.plot(df_time.index, df_time['이용시간'])
plt.title('서울시 공공자전거 대여 날짜 별 이용시간')
plt.show()
대여날짜 별 이용 거리¶
In [77]:
# 대여날짜 별 이용거리 추출
df_distance = df.groupby('대여날짜')['이용거리'].sum().to_frame()
In [78]:
# 대여날짜 별 이용거리 시각화
plt.plot(df_distance.index, df_distance['이용거리'])
plt.title('서울시 공공자전거 대여 날짜 별 이용거리')
plt.show()
데이터프레임 합치기¶
In [32]:
df_date = pd.concat([df_time,df_distance,df_count], axis=1)
df_date
Out[32]:
이용시간 | 이용거리 | 대여건수 | |
---|---|---|---|
대여날짜 | |||
2021-01-01 | 692309.0 | 4.613529e+07 | 22119 |
2021-01-02 | 686580.0 | 4.409618e+07 | 23463 |
2021-01-03 | 609571.0 | 4.059830e+07 | 21656 |
2021-01-04 | 750721.0 | 5.249645e+07 | 32732 |
2021-01-05 | 610227.0 | 6.944856e+07 | 28819 |
... | ... | ... | ... |
2021-06-26 | 3168288.0 | 3.635015e+08 | 105414 |
2021-06-27 | 2706168.0 | 3.078146e+08 | 92486 |
2021-06-28 | 2405249.0 | 2.828124e+08 | 105882 |
2021-06-29 | 2530020.0 | 3.031029e+08 | 111436 |
2021-06-30 | 2950342.0 | 3.395277e+08 | 121632 |
181 rows × 3 columns
시간대별 대여/반납 현황¶
대여시간, 반납시간 컬럼 추가¶
In [79]:
df['대여시간'] = df['대여일시'].dt.hour
In [80]:
df['반납시간'] = df['반납일시'].dt.hour
In [81]:
df.dtypes
Out[81]:
대여일시 datetime64[ns]
대여 대여소번호 category
대여 대여소명 object
반납일시 datetime64[ns]
반납대여소번호 category
반납대여소명 object
이용시간 float64
이용거리 float64
대여날짜 object
대여시간 int64
반납시간 int64
dtype: object
시간대별 대여/반납 현황¶
In [82]:
df
Out[82]:
대여일시 | 대여 대여소번호 | 대여 대여소명 | 반납일시 | 반납대여소번호 | 반납대여소명 | 이용시간 | 이용거리 | 대여날짜 | 대여시간 | 반납시간 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2021-01-02 20:50:36 | 3 | 중랑센터 | 2021-01-02 21:15:41 | 668 | 서울축산농협(장안지점) | 25.0 | 0.00 | 2021-01-02 | 20 | 21 |
1 | 2021-01-04 16:02:12 | 3 | 중랑센터 | 2021-01-04 16:17:06 | 668 | 서울축산농협(장안지점) | 14.0 | 0.00 | 2021-01-04 | 16 | 16 |
2 | 2021-01-13 21:02:05 | 3 | 중랑센터 | 2021-01-13 21:14:04 | 668 | 서울축산농협(장안지점) | 11.0 | 1853.99 | 2021-01-13 | 21 | 21 |
3 | 2021-01-14 21:02:55 | 3 | 중랑센터 | 2021-01-14 21:13:41 | 668 | 서울축산농협(장안지점) | 10.0 | 0.00 | 2021-01-14 | 21 | 21 |
4 | 2021-01-18 18:02:08 | 3 | 중랑센터 | 2021-01-18 18:15:22 | 540 | 군자역 7번출구 베스트샵 앞 | 13.0 | 2291.05 | 2021-01-18 | 18 | 18 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
3445939 | 2021-06-30 22:44:14 | 152 | 마포구민체육센터 앞 | 2021-07-01 04:48:33 | 00126 | 서강대 후문 옆 | 364.0 | 10153.36 | 2021-06-30 | 22 | 4 |
3445940 | 2021-06-30 22:45:19 | 152 | 마포구민체육센터 앞 | 2021-07-01 04:52:25 | 00437 | 대흥역 1번출구 | 367.0 | 10100.71 | 2021-06-30 | 22 | 4 |
3445941 | 2021-06-30 22:43:43 | 152 | 마포구민체육센터 앞 | 2021-07-01 04:52:27 | 00437 | 대흥역 1번출구 | 368.0 | 430.00 | 2021-06-30 | 22 | 4 |
3445942 | 2021-06-30 22:11:14 | 2220 | 반포본동 주민센터 앞 | 2021-07-01 04:55:29 | 02526 | 반포경남쇼핑 앞 | 404.0 | 0.00 | 2021-06-30 | 22 | 4 |
3445943 | 2021-06-30 22:12:10 | 2220 | 반포본동 주민센터 앞 | 2021-07-01 04:55:30 | 02526 | 반포경남쇼핑 앞 | 403.0 | 4541.22 | 2021-06-30 | 22 | 4 |
13613604 rows × 11 columns
In [83]:
# 시간대별 대여현황
s_rental = df['대여시간'].value_counts()
s_rental
Out[83]:
18 1432779
17 1178279
19 984476
16 934211
20 825031
15 816040
8 808506
21 770378
14 725175
13 667237
22 643611
12 623065
11 537810
9 499995
7 486775
10 438084
23 341859
0 240025
6 188920
1 158905
2 103629
5 84713
3 68710
4 55391
Name: 대여시간, dtype: int64
In [85]:
# 시간대별 반납현황
s_return = df['반납시간'].value_counts()
s_return
Out[85]:
18 1437723
19 1125447
17 1097623
16 880629
20 864644
8 817076
21 812357
22 768302
15 749940
14 657826
13 628908
12 591577
9 499033
11 470053
23 447477
10 402350
7 389007
0 290169
1 190954
6 152003
2 125912
3 80243
5 73983
4 60368
Name: 반납시간, dtype: int64
시각화¶
In [87]:
# 시간대별 공공자전거 대여건수 시각화
s_rental = s_rental.sort_index()
s_rental
x = s_rental.index
y = s_rental.values
plt.bar(x,y)
plt.title('서울시 공공자전거 시간대별 대여 건수')
plt.xlabel('대여시간')
plt.ylabel('대여건수')
plt.show()
In [86]:
# 시간대별 공공자전거 반납건수 시각화
s_return = s_return.sort_index()
x = s_return.index
y = s_return.values
plt.bar(x,y,color='skyblue')
plt.title('서울시 공공자전거 시간대별 반납 건수')
plt.xlabel('반납시간')
plt.ylabel('반납건수')
plt.show()
대여소별 대여/반납 현황¶
대여소 현황¶
In [91]:
# 대여 대여소번호 갯수
df['대여 대여소번호']
Out[91]:
0 3
1 3
2 3
3 3
4 3
...
3445939 152
3445940 152
3445941 152
3445942 2220
3445943 2220
Name: 대여 대여소번호, Length: 13613604, dtype: category
Categories (2493, int64): [3, 5, 10, 101, ..., 9999, 88888, 99997, 99999]
In [92]:
# 반납대여소번호 갯수
df['반납대여소번호']
Out[92]:
0 668
1 668
2 668
3 668
4 540
...
3445939 126
3445940 437
3445941 437
3445942 2526
3445943 2526
Name: 반납대여소번호, Length: 13613604, dtype: object
In [93]:
# 반납대여소 번호 처리 (str형으로 변환)
df['반납대여소번호'] = df['반납대여소번호'].astype('str')
In [94]:
# 반납대여소 번호 처리 (왼쪽의 '0' 제거)
df['반납대여소번호'] = df['반납대여소번호'].str.lstrip('0')
In [95]:
# 반납대여소 번호 처리 (int형으로 변환)
df['반납대여소번호'] = df['반납대여소번호'].astype('int')
In [96]:
# 반납대여소 번호 처리 (category형으로 변환)
df['반납대여소번호'] = df['반납대여소번호'].astype('category')
In [97]:
df['반납대여소번호']
Out[97]:
0 668
1 668
2 668
3 668
4 540
...
3445939 126
3445940 437
3445941 437
3445942 2526
3445943 2526
Name: 반납대여소번호, Length: 13613604, dtype: category
Categories (2493, int64): [3, 5, 10, 101, ..., 9999, 88888, 99997, 99999]
대여건수가 가장 많은 대여소 best10¶
In [98]:
# value_counts
df[['대여 대여소번호','대여 대여소명']].value_counts()[:10].to_frame()
Out[98]:
0 | ||
---|---|---|
대여 대여소번호 | 대여 대여소명 | |
207 | 여의나루역 1번출구 앞 | 68994 |
502 | 뚝섬유원지역 1번출구 앞 | 68588 |
152 | 마포구민체육센터 앞 | 43535 |
2102 | 봉림교 교통섬 | 43368 |
1210 | 롯데월드타워(잠실역2번출구 쪽) | 37149 |
2715 | 마곡나루역 2번 출구 | 36988 |
2177 | 신대방역 2번 출구 | 31971 |
272 | 당산육갑문 | 31527 |
210 | IFC몰 | 31443 |
565 | 옥수역 3번출구 | 29811 |
반납건수가 가장 많은 대여소 best10¶
In [99]:
# value_counts
df[['반납대여소번호','반납대여소명']].value_counts()[:10].to_frame()
Out[99]:
0 | ||
---|---|---|
반납대여소번호 | 반납대여소명 | |
502 | 뚝섬유원지역 1번출구 앞 | 78958 |
207 | 여의나루역 1번출구 앞 | 68966 |
152 | 마포구민체육센터 앞 | 50607 |
2102 | 봉림교 교통섬 | 44572 |
1210 | 롯데월드타워(잠실역2번출구 쪽) | 37344 |
2715 | 마곡나루역 2번 출구 | 36876 |
272 | 당산육갑문 | 34276 |
210 | IFC몰 | 33758 |
2177 | 신대방역 2번 출구 | 33159 |
565 | 옥수역 3번출구 | 32381 |
여의나루역 1번출구 앞 대여소 이용현황¶
서브셋 만들기¶
In [101]:
df_207 = df[df['대여 대여소번호']==207]
df_207.head(1)
Out[101]:
대여일시 | 대여 대여소번호 | 대여 대여소명 | 반납일시 | 반납대여소번호 | 반납대여소명 | 이용시간 | 이용거리 | 대여날짜 | 대여시간 | 반납시간 | |
---|---|---|---|---|---|---|---|---|---|---|---|
45838 | 2021-01-01 01:05:49 | 207 | 여의나루역 1번출구 앞 | 2021-01-01 01:16:29 | 201 | 진미파라곤 앞 | 10.0 | 0.0 | 2021-01-01 | 1 | 1 |
반납 현황¶
In [102]:
# value_counts
df_207[['반납대여소번호','반납대여소명']].value_counts().to_frame()
Out[102]:
0 | ||
---|---|---|
반납대여소번호 | 반납대여소명 | |
207 | 여의나루역 1번출구 앞 | 18347 |
202 | 국민일보 앞 | 2006 |
222 | 시범아파트버스정류장 옆 | 1588 |
249 | 여의도중학교 옆 | 1525 |
272 | 당산육갑문 | 1269 |
... | ... | ... |
2414 | 도곡역 아카데미스위트 앞 | 1 |
669 | 청계한신휴플러스앞 삼거리 | 1 |
1661 | 당현천근린공원 | 1 |
1670 | 노원경찰서교차로 | 1 |
966 | 서울혁신파크1 | 1 |
1413 rows × 1 columns
요일별 대여현황¶
In [103]:
#요일컬럼 추가 : strftime('%a')
df_207['대여요일'] = df_207['대여일시'].dt.strftime('%a')
/var/folders/8p/2wvkdkrj1gv2lzj_57qr5xnc0000gn/T/ipykernel_9374/247132597.py:2: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df_207['대여요일'] = df_207['대여일시'].dt.strftime('%a')
In [104]:
# value_counts
df_207['대여요일'].value_counts()
Out[104]:
Sun 14454
Sat 10932
Wed 10755
Fri 9191
Mon 8391
Thu 8037
Tue 7235
Name: 대여요일, dtype: int64
이용시간 통계¶
In [105]:
# 이용시간 평균
df_207['이용시간'].mean()
Out[105]:
50.28551344300312
In [106]:
# 이용시간 최대
df_207['이용시간'].max()
Out[106]:
1268.0
In [107]:
# 이용시간 최소
df_207['이용시간'].min()
Out[107]:
1.0
In [108]:
# 전체데이터 이용시간 평균
df['이용시간'].mean()
Out[108]:
27.27823322905529
In [1]:
import pandas as pd
import matplotlib.pyplot as plt
In [109]:
# 그래프를 노트북 안에 그리기 위해 설정
%matplotlib inline
# 필요한 패키지와 라이브러리 가져온다.
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
# 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
mpl.rcParams['axes.unicode_minus'] = False
# 폰트 지정하기
plt.rcParams['font.family'] = 'Apple SD Gothic Neo'
데이터 수집¶
데이터프레임 생성¶
- csv 파일을 데이터프레임으로 만들기
- encoding='cp949'
In [110]:
df = pd.read_csv('data/생필품 농수축산물 가격 정보(2021년1월_6월).csv', encoding='cp949')
In [4]:
df
Out[4]:
일련번호 | 시장/마트 번호 | 시장/마트 이름 | 품목 번호 | 품목 이름 | 실판매규격 | 가격(원) | 년도-월 | 비고 | 시장유형 구분(시장/마트) 코드 | 시장유형 구분(시장/마트) 이름 | 자치구 코드 | 자치구 이름 | 점검일자 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1673336 | 2 | 신세계백화점 | 133 | 무(세척무) | 1개 | 2980 | 2021-06 | 국내산,세척무 | 2 | 대형마트 | 140000 | 중구 | 2021-06-24 |
1 | 1667985 | 228 | 방배종합시장 | 23 | 상추 | 1봉150g | 1500 | 2021-06 | 국내산 | 1 | 전통시장 | 650000 | 서초구 | 2021-06-24 |
2 | 1666935 | 1 | 통인시장 | 266 | 고등어(생물,국산) | 1마리 | 4000 | 2021-06 | 국내산,생물 | 1 | 전통시장 | 110000 | 종로구 | 2021-06-24 |
3 | 1671116 | 25 | 방학동도깨비시장 | 268 | 고등어(냉동,국산) | 350g | 2500 | 2021-06 | 국내산 | 1 | 전통시장 | 320000 | 도봉구 | 2021-06-24 |
4 | 1667066 | 6 | 이마트 용산점 | 171 | 달걀(10개) | 15구 | 5980 | 2021-06 | 낭이생생대란 | 2 | 대형마트 | 170000 | 용산구 | 2021-06-24 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
42694 | 1636118 | 226 | 롯데마트 구로점 | 171 | 달걀(10개) | 10개(600g) | 2990 | 2021-01 | 국내산,특란 | 2 | 대형마트 | 530000 | 구로구 | 2021-01-21 |
42695 | 1636108 | 226 | 롯데마트 구로점 | 27 | 배 | 1개 (600g) | 1590 | 2021-01 | 국내산,신고 | 2 | 대형마트 | 530000 | 구로구 | 2021-01-21 |
42696 | 1636114 | 226 | 롯데마트 구로점 | 312 | 애호박 | 1개 (300g) | 2790 | 2021-01 | 국내산,청원 | 2 | 대형마트 | 530000 | 구로구 | 2021-01-21 |
42697 | 1636113 | 226 | 롯데마트 구로점 | 22 | 오이 | 1개 (200g) | 1190 | 2021-01 | 국내산,백오이 | 2 | 대형마트 | 530000 | 구로구 | 2021-01-21 |
42698 | 1636121 | 226 | 롯데마트 구로점 | 302 | 명태 | 1마리(600g) | 1670 | 2021-01 | 수입산,코다리,냉동 | 2 | 대형마트 | 530000 | 구로구 | 2021-01-21 |
42699 rows × 14 columns
결측치 확인¶
In [111]:
df.isnull().sum()
Out[111]:
일련번호 0
시장/마트 번호 0
시장/마트 이름 0
품목 번호 0
품목 이름 0
실판매규격 0
가격(원) 0
년도-월 0
비고 274
시장유형 구분(시장/마트) 코드 0
시장유형 구분(시장/마트) 이름 0
자치구 코드 0
자치구 이름 0
점검일자 0
dtype: int64
자료형 확인¶
In [112]:
df.dtypes
Out[112]:
일련번호 int64
시장/마트 번호 int64
시장/마트 이름 object
품목 번호 int64
품목 이름 object
실판매규격 object
가격(원) int64
년도-월 object
비고 object
시장유형 구분(시장/마트) 코드 int64
시장유형 구분(시장/마트) 이름 object
자치구 코드 int64
자치구 이름 object
점검일자 object
dtype: object
데이터 확인¶
컬럼별 데이터 확인¶
In [113]:
df['시장/마트 번호'].nunique()
Out[113]:
102
시장/마트 목록¶
In [114]:
# 시장/마트 목록
df['시장/마트 이름'].nunique()
Out[114]:
102
In [115]:
df['시장/마트 이름'].unique()
Out[115]:
array(['신세계백화점', '방배종합시장', '통인시장', '방학동도깨비시장', '이마트 용산점', '용문시장',
'NC백화점 불광점', '관악신사시장(신림4동)', '영천시장', '고척근린시장', '이마트 여의도점',
'현대백화점 미아점', '롯데백화점', '이마트 가양점', '홈플러스 동대문점', '송화시장', '영등포전통시장',
'홈플러스 등촌점', '후암시장', '경동시장', '롯데마트 강변점', '롯데백화점 노원점', '롯데백화점 청량리점',
'홈플러스 영등포점', '우림시장', '청량리종합시장', '농협 하나로마트 용산점', '이마트 자양점',
'롯데백화점 미아점', '자양골목시장', '수유재래시장', '홈플러스 중계점', '금남시장', '인왕시장',
'원당종합시장', '목3동시장', '신영시장', '이마트 왕십리점', '뉴코아아울렛 강남점', '망원시장',
'마천중앙시장', '신세계백화점 강남점', '롯데백화점 영등포점', '남성시장', '마포농수산물시장',
'이마트 창동점', '공릉동 도깨비시장', '홈플러스 면목점', '이마트 청계점', '이마트 성수점',
'홈플러스 방학점', '이마트 역삼점', '남구로시장', '이마트 은평점', '뚝도시장', '롯데백화점 강남점',
'노룬산골목시장', '현대백화점 신촌점', '홈플러스 목동점', '태평백화점', '대조시장', '남문시장',
'광장시장', '대림중앙시장', '남대문시장', '하나로클럽 양재점', '현대시장', '상계중앙시장',
'농협하나로마트 신촌점', '이마트 신도림점', '신창시장', '롯데백화점 잠실점', '이마트 목동점',
'홈플러스 잠실점', '대림시장', '홈플러스 시흥점', '암사종합시장', '이마트 상봉점', '숭인시장',
'둔촌역전통시장', '홈플러스 월드컵점', '도곡시장', '신원시장(신림1동)', '돈암제일시장', '청담삼익시장',
'롯데백화점 관악점', '세이브 마트', '화곡본동시장', '롯데마트 서울역점', '방이시장', '장위골목시장',
'롯데슈퍼', '이마트 미아점', '이마트 명일점', '홈플러스 강동점', '서울중앙시장', '홈플러스 독산점',
'동원시장', '하나로클럽 미아점', 'NC백화점 신구로점', '이마트 에브리데이 창동점', '롯데마트 구로점'],
dtype=object)
In [116]:
# 시장/마트 목록
df_market = df[['시장/마트 번호','시장/마트 이름','자치구 이름','시장유형 구분(시장/마트) 이름']].drop_duplicates()
In [117]:
df_market
Out[117]:
시장/마트 번호 | 시장/마트 이름 | 자치구 이름 | 시장유형 구분(시장/마트) 이름 | |
---|---|---|---|---|
0 | 2 | 신세계백화점 | 중구 | 대형마트 |
1 | 228 | 방배종합시장 | 서초구 | 전통시장 |
2 | 1 | 통인시장 | 종로구 | 전통시장 |
3 | 25 | 방학동도깨비시장 | 도봉구 | 전통시장 |
4 | 6 | 이마트 용산점 | 용산구 | 대형마트 |
... | ... | ... | ... | ... |
5339 | 91 | 동원시장 | 중랑구 | 전통시장 |
5341 | 206 | 하나로클럽 미아점 | 강북구 | 대형마트 |
6609 | 227 | NC백화점 신구로점 | 구로구 | 대형마트 |
21043 | 225 | 이마트 에브리데이 창동점 | 도봉구 | 대형마트 |
42682 | 226 | 롯데마트 구로점 | 구로구 | 대형마트 |
102 rows × 4 columns
In [29]:
# 자치구 별 시장/마트 갯수
df_market['자치구 이름'].value_counts()
Out[29]:
중구 6
구로구 5
영등포구 5
도봉구 5
관악구 5
광진구 4
동대문구 4
강북구 4
강동구 4
용산구 4
양천구 4
서대문구 4
중랑구 4
노원구 4
강남구 4
성동구 4
은평구 4
서초구 4
금천구 4
성북구 4
송파구 4
마포구 4
강서구 4
동작구 2
종로구 2
Name: 자치구 이름, dtype: int64
In [120]:
# 자치구 이름으로 시장/마트 확인
df_market[df_market['자치구 이름']=='중구']
Out[120]:
시장/마트 번호 | 시장/마트 이름 | 자치구 이름 | 시장유형 구분(시장/마트) 이름 | |
---|---|---|---|---|
0 | 2 | 신세계백화점 | 중구 | 대형마트 |
21 | 56 | 롯데백화점 | 중구 | 대형마트 |
257 | 60 | 이마트 청계점 | 중구 | 대형마트 |
576 | 11 | 남대문시장 | 중구 | 전통시장 |
3799 | 8 | 롯데마트 서울역점 | 중구 | 대형마트 |
4920 | 199 | 서울중앙시장 | 중구 | 전통시장 |
품목 목록¶
In [121]:
# 품목 목록
df_items = df[['품목 번호','품목 이름']].drop_duplicates()
df_items = df_items.sort_values('품목 이름')
In [122]:
# 품목 이름 (30개씩 확인)
df_items[:30]
Out[122]:
품목 번호 | 품목 이름 | |
---|---|---|
222 | 13 | 고등어 |
135 | 304 | 고등어 |
15781 | 316 | 고등어(30cm,국산) |
1550 | 318 | 고등어(30cm,수입산) |
3 | 268 | 고등어(냉동,국산) |
4834 | 269 | 고등어(냉동,수입산) |
2 | 266 | 고등어(생물,국산) |
1341 | 267 | 고등어(생물,수입산) |
3984 | 314 | 냉동참조기(20cm,국산) |
3706 | 313 | 냉동참조기(20cm,수입) |
768 | 17 | 달걀 |
4 | 171 | 달걀(10개) |
860 | 321 | 달걀(15개) |
11 | 320 | 달걀(30개) |
18573 | 134 | 달걀(왕란) |
5280 | 181 | 달걀(왕란) |
45 | 18 | 닭고기 |
16 | 283 | 닭고기(육계) |
583 | 275 | 닭고기(중간) |
487 | 138 | 닭고기(토종닭) |
226 | 288 | 동태 |
53 | 285 | 돼지고기 |
1501 | 52 | 돼지고기(삼겹살) |
34 | 99 | 돼지고기(생삼겹살) |
22 | 202 | 돼지고기(생삼겹살) |
23 | 302 | 명태 |
555 | 315 | 명태(45cm,수입산) |
19167 | 263 | 명태(냉동,국산) |
54 | 264 | 명태(냉동,수입산) |
32 | 152 | 명태(러시아,냉동) |
In [123]:
df_items[30:60]
Out[123]:
품목 번호 | 품목 이름 | |
---|---|---|
2457 | 265 | 명태(생물,수입산) |
1019 | 184 | 명태(일본산,냉동) |
79 | 25 | 무 |
103 | 308 | 무(1kg) |
0 | 133 | 무(세척무) |
33 | 282 | 무(세척무) |
2432 | 274 | 무(세척무, 중) |
157 | 27 | 배 |
56 | 276 | 배(신고) |
4268 | 248 | 배(신고),중급(대) |
14 | 306 | 배(신고, 600g) |
1820 | 284 | 배(중품) |
15 | 26 | 배추 |
9 | 307 | 배추(2.5~3kg) |
1529 | 125 | 배추(국산) |
2466 | 175 | 배추(중간) |
1159 | 271 | 배추(중간) |
58 | 28 | 사과 |
446 | 50 | 사과(부사) |
4802 | 237 | 사과(부사),중급(대) |
4556 | 244 | 사과(부사),중급(대) |
12 | 305 | 사과(부사, 300g) |
1 | 23 | 상추 |
35 | 310 | 상추(100g) |
97 | 278 | 쇠고기 |
533 | 82 | 쇠고기(육우,불고기) |
8 | 58 | 쇠고기(한우,불고기) |
339 | 131 | 쇠고기(한우1등급) |
6 | 312 | 애호박 |
7 | 24 | 양파 |
In [124]:
df_items[60:]
Out[124]:
품목 번호 | 품목 이름 | |
---|---|---|
10 | 309 | 양파(1.5kg망) |
2191 | 272 | 양파(작은망) |
5 | 22 | 오이 |
21 | 311 | 오이(다다기) |
31 | 253 | 오징어 |
2620 | 54 | 오징어(냉동) |
441 | 256 | 오징어(냉동,국산) |
6813 | 257 | 오징어(냉동,수입산) |
36 | 254 | 오징어(생물,국산) |
2567 | 255 | 오징어(생물,수입산) |
19 | 303 | 조기 |
389 | 144 | 조기(국산,냉동) |
30 | 136 | 조기(국산,생물) |
114 | 259 | 조기(냉동,국산) |
177 | 260 | 조기(냉동,수입산) |
1479 | 258 | 조기(생물,국산) |
1397 | 261 | 조기(생물,수입산) |
5348 | 135 | 조기(중국산,생물) |
649 | 277 | 호박 |
18 | 119 | 호박(인큐베이터) |
1898 | 118 | 호박(인큐베이터),중간 |
자치구 목록¶
In [125]:
df_gu = df[['자치구 코드','자치구 이름']].drop_duplicates()
df_gu.shape
Out[125]:
(25, 2)
시장 유형¶
In [126]:
df_gubun = df[['시장유형 구분(시장/마트) 코드','시장유형 구분(시장/마트) 이름']].drop_duplicates()
df_gubun
Out[126]:
시장유형 구분(시장/마트) 코드 | 시장유형 구분(시장/마트) 이름 | |
---|---|---|
0 | 2 | 대형마트 |
1 | 1 | 전통시장 |
삼겹살 가격 분석¶
삼겹살 데이터¶
- 특정 문자열이 포함되어있는지 확인 : .str.contains(문자열)
In [127]:
# 2021-06 데이터 이용
df_sam = df[ (df['품목 이름'].str.contains('삼겹살')) & (df['년도-월']=='2021-06') & (df['실판매규격'].str.contains('600g')) ]
df_sam
Out[127]:
일련번호 | 시장/마트 번호 | 시장/마트 이름 | 품목 번호 | 품목 이름 | 실판매규격 | 가격(원) | 년도-월 | 비고 | 시장유형 구분(시장/마트) 코드 | 시장유형 구분(시장/마트) 이름 | 자치구 코드 | 자치구 이름 | 점검일자 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
22 | 1668431 | 16 | 현대백화점 미아점 | 202 | 돼지고기(생삼겹살) | 600g (100g 4,280원) | 25680 | 2021-06 | 선진포크 | 2 | 대형마트 | 290000 | 성북구 | 2021-06-24 |
47 | 1670116 | 98 | 롯데백화점 노원점 | 99 | 돼지고기(생삼겹살) | 600g | 26940 | 2021-06 | 한돈 | 2 | 대형마트 | 350000 | 노원구 | 2021-06-24 |
76 | 1674090 | 42 | 이마트 가양점 | 99 | 돼지고기(생삼겹살) | 600g | 15480 | 2021-06 | 국내산,생삼겹살 | 2 | 대형마트 | 500000 | 강서구 | 2021-06-24 |
86 | 1668834 | 42 | 이마트 가양점 | 99 | 돼지고기(생삼겹살) | 600g | 14880 | 2021-06 | 국내산,생삼겹살 | 2 | 대형마트 | 500000 | 강서구 | 2021-06-24 |
146 | 1667684 | 42 | 이마트 가양점 | 99 | 돼지고기(생삼겹살) | 600g | 14880 | 2021-06 | 국내산,생삼겹살 | 2 | 대형마트 | 500000 | 강서구 | 2021-06-24 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
6439 | 1668261 | 100 | 홈플러스 중계점 | 99 | 돼지고기(생삼겹살) | 600g | 22140 | 2021-06 | 한돈 | 2 | 대형마트 | 350000 | 노원구 | 2021-06-24 |
6514 | 1674124 | 40 | 홈플러스 등촌점 | 99 | 돼지고기(생삼겹살) | 600g | 14940 | 2021-06 | 국내산,생삼겹살 | 2 | 대형마트 | 500000 | 강서구 | 2021-06-24 |
6700 | 1671992 | 16 | 현대백화점 미아점 | 202 | 돼지고기(생삼겹살) | 600g (100g 4,280원) | 25680 | 2021-06 | 도드람 | 2 | 대형마트 | 290000 | 성북구 | 2021-06-24 |
6721 | 1670048 | 16 | 현대백화점 미아점 | 202 | 돼지고기(생삼겹살) | 600g (100g 4,280원) | 25680 | 2021-06 | 선진포크 | 2 | 대형마트 | 290000 | 성북구 | 2021-06-24 |
6763 | 1674900 | 16 | 현대백화점 미아점 | 202 | 돼지고기(생삼겹살) | 600g (100g 4,280원) | 25680 | 2021-06 | 선진포크 | 2 | 대형마트 | 290000 | 성북구 | 2021-06-24 |
224 rows × 14 columns
In [128]:
# 삼겹살 600g의 평균 가격은?
df_sam['가격(원)'].mean()
Out[128]:
16842.723214285714
In [129]:
# 삼겹살 600g의 최고 가격은?
df_sam['가격(원)'].max()
Out[129]:
35890
In [130]:
df_sam[df_sam['가격(원)']<5000]
Out[130]:
일련번호 | 시장/마트 번호 | 시장/마트 이름 | 품목 번호 | 품목 이름 | 실판매규격 | 가격(원) | 년도-월 | 비고 | 시장유형 구분(시장/마트) 코드 | 시장유형 구분(시장/마트) 이름 | 자치구 코드 | 자치구 이름 | 점검일자 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
3645 | 1667404 | 27 | 이마트 창동점 | 99 | 돼지고기(생삼겹살) | 600g | 2720 | 2021-06 | 국내산 | 2 | 대형마트 | 320000 | 도봉구 | 2021-06-24 |
4052 | 1667438 | 28 | 홈플러스 방학점 | 99 | 돼지고기(생삼겹살) | 600g | 1690 | 2021-06 | 국내산 | 2 | 대형마트 | 320000 | 도봉구 | 2021-06-24 |
In [133]:
# 삼겹살 600g의 최저 가격은?
df_sam['가격(원)'].min()
Out[133]:
1690
우리동네 삼겹살 가격¶
In [134]:
gu = input('구이름:')
구이름:송파구
In [135]:
# 우리구 삼겹살 가격
df_sam_gu = df_sam[df_sam['자치구 이름']==gu][['시장/마트 이름','품목 이름','실판매규격','가격(원)']].drop_duplicates()
df_sam_gu
Out[135]:
시장/마트 이름 | 품목 이름 | 실판매규격 | 가격(원) | |
---|---|---|---|---|
3711 | 마천중앙시장 | 돼지고기(생삼겹살) | 600g | 15000 |
3744 | 마천중앙시장 | 돼지고기(생삼겹살) | 600g | 12800 |
3811 | 방이시장 | 돼지고기(생삼겹살) | 600g | 12000 |
3855 | 방이시장 | 돼지고기(생삼겹살) | 600g | 17000 |
3956 | 롯데백화점 잠실점 | 돼지고기(생삼겹살) | 600g | 29880 |
4043 | 롯데백화점 잠실점 | 돼지고기(생삼겹살) | 600g | 35890 |
4145 | 홈플러스 잠실점 | 돼지고기(생삼겹살) | 600g | 12000 |
4158 | 홈플러스 잠실점 | 돼지고기(생삼겹살) | 600g | 11940 |
4198 | 홈플러스 잠실점 | 돼지고기(생삼겹살) | 600g | 19920 |
4217 | 홈플러스 잠실점 | 돼지고기(생삼겹살) | 600g | 10740 |
In [136]:
# 시각화
x = df_sam_gu['시장/마트 이름']
y = df_sam_gu['가격(원)']
plt.scatter(x,y)
plt.title(gu+' 삼겹살 가격')
plt.grid(True)
plt.show()
마트 지점별 삼겹살 가격¶
In [137]:
mart = input('시장/마트이름:')
시장/마트이름:백화점
In [138]:
# 마트 지점별 삼겹살 가격
df_sam_mart = df_sam[df_sam['시장/마트 이름'].str.contains(mart)][['시장/마트 이름','품목 이름','실판매규격','가격(원)']].drop_duplicates()
In [139]:
# 시각화
df_sam_mart
x = df_sam_mart['시장/마트 이름']
y = df_sam_mart['가격(원)']
plt.scatter(x,y)
plt.grid(True)
plt.title(mart+ ' 삼겹살 가격')
plt.xticks(rotation=45)
plt.show()
달걀 가격 분석¶
달걀 데이터¶
In [140]:
# 2021-06 데이터 이용
df_egg = df[(df['품목 이름'].str.contains('달걀')) & (df['년도-월']=='2021-06') & (df['실판매규격'].str.contains('30개')) & (df['가격(원)']>0)]
In [141]:
# 달걀 30구 평균 가격
df_egg['가격(원)'].mean()
Out[141]:
9442.334426229509
In [142]:
# 달걀 최고 가격
df_egg['가격(원)'].max()
Out[142]:
75000
In [143]:
df_egg[df_egg['가격(원)'] < 6000]
Out[143]:
일련번호 | 시장/마트 번호 | 시장/마트 이름 | 품목 번호 | 품목 이름 | 실판매규격 | 가격(원) | 년도-월 | 비고 | 시장유형 구분(시장/마트) 코드 | 시장유형 구분(시장/마트) 이름 | 자치구 코드 | 자치구 이름 | 점검일자 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1477 | 1669024 | 75 | 이마트 성수점 | 320 | 달걀(30개) | 30개 | 5520 | 2021-06 | 국내산신선한란 | 2 | 대형마트 | 200000 | 성동구 | 2021-06-24 |
In [144]:
# 달걀 최저 가격
df_egg['가격(원)'].min()
Out[144]:
5520
우리동네 달걀 가격¶
In [146]:
gu = input('구이름:')
구이름:중구
In [147]:
# 우리구 달걀 가격
df_egg_gu = df_egg[df_egg['자치구 이름']==gu][['시장/마트 이름','품목 이름','실판매규격','가격(원)']].drop_duplicates()
In [148]:
# 시각화
df_egg_gu.sort_values('가격(원)')
x = df_egg_gu['시장/마트 이름']
y = df_egg_gu['가격(원)']
plt.scatter(x,y)
plt.grid(True)
plt.title(gu+' 달걀가격(30구)')
plt.show()
마트 지점별 달걀 가격¶
In [152]:
gu = input('마트이름:')
마트이름:이마트
In [153]:
# 마트 지점별 달걀 가격
df_egg_mart = df_egg[df_egg['시장/마트 이름'].str.contains(gu)][['시장/마트 이름','품목 이름','실판매규격','가격(원)']].drop_duplicates()
In [154]:
# 시각화
x = df_egg_mart['시장/마트 이름']
y = df_egg_mart['가격(원)']
plt.scatter(x,y)
plt.xticks(rotation=45)
plt.grid(True)
plt.title(gu+' 달걀가격(30구)')
plt.show()
In [1]:
import pandas as pd
In [3]:
# 그래프를 노트북 안에 그리기 위해 설정
%matplotlib inline
# 필요한 패키지와 라이브러리 가져온다.
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
# 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
mpl.rcParams['axes.unicode_minus'] = False
# 폰트 지정하기
plt.rcParams['font.family'] = 'gulim'
데이터 확인 및 전처리¶
- 월별, 시간대별, 역별 지하철 승하차정보 데이터이다.
In [155]:
df = pd.read_csv('data/서울시 지하철 호선별 역별 시간대별 승하차 인원 정보.csv', encoding='cp949')
In [156]:
df.head()
Out[156]:
사용월 | 호선명 | 지하철역 | 04시-05시 승차인원 | 04시-05시 하차인원 | 05시-06시 승차인원 | 05시-06시 하차인원 | 06시-07시 승차인원 | 06시-07시 하차인원 | 07시-08시 승차인원 | ... | 23시-24시 하차인원 | 00시-01시 승차인원 | 00시-01시 하차인원 | 01시-02시 승차인원 | 01시-02시 하차인원 | 02시-03시 승차인원 | 02시-03시 하차인원 | 03시-04시 승차인원 | 03시-04시 하차인원 | 작업일자 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 202108 | 1호선 | 동대문 | 415 | 11 | 10380 | 1815 | 7880 | 5352 | 12037 | ... | 5983 | 7 | 1043 | 2 | 2 | 0 | 2 | 0 | 0 | 20210903 |
1 | 202108 | 1호선 | 동묘앞 | 84 | 3 | 2861 | 918 | 3286 | 4614 | 5128 | ... | 1759 | 4 | 827 | 0 | 0 | 0 | 0 | 0 | 0 | 20210903 |
2 | 202108 | 1호선 | 서울역 | 483 | 11 | 7963 | 5533 | 10871 | 31479 | 31643 | ... | 4968 | 21 | 444 | 1 | 1 | 0 | 0 | 0 | 0 | 20210903 |
3 | 202108 | 1호선 | 시청 | 6 | 0 | 1597 | 4399 | 2727 | 17957 | 5971 | ... | 822 | 3 | 72 | 0 | 2 | 0 | 0 | 0 | 0 | 20210903 |
4 | 202108 | 1호선 | 신설동 | 247 | 6 | 6828 | 2721 | 7333 | 9771 | 14821 | ... | 3747 | 15 | 390 | 0 | 0 | 0 | 0 | 0 | 0 | 20210903 |
5 rows × 52 columns
In [157]:
df.tail()
Out[157]:
사용월 | 호선명 | 지하철역 | 04시-05시 승차인원 | 04시-05시 하차인원 | 05시-06시 승차인원 | 05시-06시 하차인원 | 06시-07시 승차인원 | 06시-07시 하차인원 | 07시-08시 승차인원 | ... | 23시-24시 하차인원 | 00시-01시 승차인원 | 00시-01시 하차인원 | 01시-02시 승차인원 | 01시-02시 하차인원 | 02시-03시 승차인원 | 02시-03시 하차인원 | 03시-04시 승차인원 | 03시-04시 하차인원 | 작업일자 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
46547 | 201501 | 중앙선 | 운길산 | 0 | 0 | 177 | 56 | 642 | 403 | 1292 | ... | 633 | 3 | 222 | 0 | 0 | 0 | 0 | 0 | 0 | 20151223 |
46548 | 201501 | 중앙선 | 원덕 | 1 | 0 | 292 | 4 | 415 | 46 | 537 | ... | 383 | 3 | 157 | 0 | 0 | 0 | 0 | 0 | 0 | 20151223 |
46549 | 201501 | 중앙선 | 중랑 | 14 | 1 | 4929 | 424 | 8539 | 2084 | 22160 | ... | 6501 | 86 | 1617 | 0 | 0 | 0 | 0 | 0 | 0 | 20151223 |
46550 | 201501 | 중앙선 | 팔당 | 0 | 0 | 161 | 50 | 368 | 149 | 1227 | ... | 336 | 8 | 85 | 0 | 0 | 0 | 0 | 0 | 0 | 20151223 |
46551 | 201501 | 중앙선 | 회기 | 436 | 3 | 10929 | 3067 | 23317 | 10430 | 65043 | ... | 35702 | 767 | 9314 | 0 | 0 | 0 | 0 | 0 | 0 | 20151223 |
5 rows × 52 columns
데이터 크기¶
In [158]:
df.shape
Out[158]:
(46552, 52)
결측치 확인¶
In [159]:
df.isnull().sum()
Out[159]:
사용월 0
호선명 0
지하철역 0
04시-05시 승차인원 0
04시-05시 하차인원 0
05시-06시 승차인원 0
05시-06시 하차인원 0
06시-07시 승차인원 0
06시-07시 하차인원 0
07시-08시 승차인원 0
07시-08시 하차인원 0
08시-09시 승차인원 0
08시-09시 하차인원 0
09시-10시 승차인원 0
09시-10시 하차인원 0
10시-11시 승차인원 0
10시-11시 하차인원 0
11시-12시 승차인원 0
11시-12시 하차인원 0
12시-13시 승차인원 0
12시-13시 하차인원 0
13시-14시 승차인원 0
13시-14시 하차인원 0
14시-15시 승차인원 0
14시-15시 하차인원 0
15시-16시 승차인원 0
15시-16시 하차인원 0
16시-17시 승차인원 0
16시-17시 하차인원 0
17시-18시 승차인원 0
17시-18시 하차인원 0
18시-19시 승차인원 0
18시-19시 하차인원 0
19시-20시 승차인원 0
19시-20시 하차인원 0
20시-21시 승차인원 0
20시-21시 하차인원 0
21시-22시 승차인원 0
21시-22시 하차인원 0
22시-23시 승차인원 0
22시-23시 하차인원 0
23시-24시 승차인원 0
23시-24시 하차인원 0
00시-01시 승차인원 0
00시-01시 하차인원 0
01시-02시 승차인원 0
01시-02시 하차인원 0
02시-03시 승차인원 0
02시-03시 하차인원 0
03시-04시 승차인원 0
03시-04시 하차인원 0
작업일자 0
dtype: int64
컬럼별 데이터 확인¶
In [160]:
# 사용월
df['사용월'].unique()
Out[160]:
array([202108, 202107, 202106, 202105, 202104, 202103, 202102, 202101,
202012, 202011, 202010, 202009, 202008, 202007, 202006, 202005,
202004, 202003, 202002, 202001, 201912, 201911, 201910, 201909,
201908, 201907, 201906, 201905, 201904, 201903, 201902, 201901,
201812, 201811, 201810, 201809, 201808, 201807, 201806, 201805,
201804, 201803, 201802, 201801, 201712, 201711, 201710, 201709,
201708, 201707, 201706, 201705, 201704, 201703, 201702, 201701,
201612, 201611, 201610, 201609, 201608, 201607, 201606, 201605,
201604, 201603, 201602, 201601, 201512, 201511, 201510, 201509,
201508, 201507, 201506, 201505, 201504, 201503, 201502, 201501])
In [161]:
# 호선명
df['호선명'].unique()
Out[161]:
array(['1호선', '2호선', '3호선', '4호선', '5호선', '6호선', '7호선', '8호선', '9호선',
'9호선2~3단계', '경강선', '경부선', '경원선', '경의선', '경인선', '경춘선', '공항철도 1호선',
'과천선', '분당선', '수인선', '안산선', '우이신설선', '일산선', '장항선', '중앙선', '9호선2단계'],
dtype=object)
데이터 타입 확인 및 변경¶
In [162]:
df.dtypes
Out[162]:
사용월 int64
호선명 object
지하철역 object
04시-05시 승차인원 int64
04시-05시 하차인원 int64
05시-06시 승차인원 int64
05시-06시 하차인원 int64
06시-07시 승차인원 int64
06시-07시 하차인원 int64
07시-08시 승차인원 int64
07시-08시 하차인원 int64
08시-09시 승차인원 int64
08시-09시 하차인원 int64
09시-10시 승차인원 int64
09시-10시 하차인원 int64
10시-11시 승차인원 int64
10시-11시 하차인원 int64
11시-12시 승차인원 int64
11시-12시 하차인원 int64
12시-13시 승차인원 int64
12시-13시 하차인원 int64
13시-14시 승차인원 int64
13시-14시 하차인원 int64
14시-15시 승차인원 int64
14시-15시 하차인원 int64
15시-16시 승차인원 int64
15시-16시 하차인원 int64
16시-17시 승차인원 int64
16시-17시 하차인원 int64
17시-18시 승차인원 int64
17시-18시 하차인원 int64
18시-19시 승차인원 int64
18시-19시 하차인원 int64
19시-20시 승차인원 int64
19시-20시 하차인원 int64
20시-21시 승차인원 int64
20시-21시 하차인원 int64
21시-22시 승차인원 int64
21시-22시 하차인원 int64
22시-23시 승차인원 int64
22시-23시 하차인원 int64
23시-24시 승차인원 int64
23시-24시 하차인원 int64
00시-01시 승차인원 int64
00시-01시 하차인원 int64
01시-02시 승차인원 int64
01시-02시 하차인원 int64
02시-03시 승차인원 int64
02시-03시 하차인원 int64
03시-04시 승차인원 int64
03시-04시 하차인원 int64
작업일자 int64
dtype: object
In [163]:
df['사용월'] = df['사용월'].astype('str')
In [164]:
df.dtypes
Out[164]:
사용월 object
호선명 object
지하철역 object
04시-05시 승차인원 int64
04시-05시 하차인원 int64
05시-06시 승차인원 int64
05시-06시 하차인원 int64
06시-07시 승차인원 int64
06시-07시 하차인원 int64
07시-08시 승차인원 int64
07시-08시 하차인원 int64
08시-09시 승차인원 int64
08시-09시 하차인원 int64
09시-10시 승차인원 int64
09시-10시 하차인원 int64
10시-11시 승차인원 int64
10시-11시 하차인원 int64
11시-12시 승차인원 int64
11시-12시 하차인원 int64
12시-13시 승차인원 int64
12시-13시 하차인원 int64
13시-14시 승차인원 int64
13시-14시 하차인원 int64
14시-15시 승차인원 int64
14시-15시 하차인원 int64
15시-16시 승차인원 int64
15시-16시 하차인원 int64
16시-17시 승차인원 int64
16시-17시 하차인원 int64
17시-18시 승차인원 int64
17시-18시 하차인원 int64
18시-19시 승차인원 int64
18시-19시 하차인원 int64
19시-20시 승차인원 int64
19시-20시 하차인원 int64
20시-21시 승차인원 int64
20시-21시 하차인원 int64
21시-22시 승차인원 int64
21시-22시 하차인원 int64
22시-23시 승차인원 int64
22시-23시 하차인원 int64
23시-24시 승차인원 int64
23시-24시 하차인원 int64
00시-01시 승차인원 int64
00시-01시 하차인원 int64
01시-02시 승차인원 int64
01시-02시 하차인원 int64
02시-03시 승차인원 int64
02시-03시 하차인원 int64
03시-04시 승차인원 int64
03시-04시 하차인원 int64
작업일자 int64
dtype: object
불필요한 컬럼 삭제¶
In [165]:
df.drop(columns=['작업일자'], inplace=True)
승차/하차 테이블 분리¶
승차 테이블 만들기¶
In [166]:
df
Out[166]:
사용월 | 호선명 | 지하철역 | 04시-05시 승차인원 | 04시-05시 하차인원 | 05시-06시 승차인원 | 05시-06시 하차인원 | 06시-07시 승차인원 | 06시-07시 하차인원 | 07시-08시 승차인원 | ... | 23시-24시 승차인원 | 23시-24시 하차인원 | 00시-01시 승차인원 | 00시-01시 하차인원 | 01시-02시 승차인원 | 01시-02시 하차인원 | 02시-03시 승차인원 | 02시-03시 하차인원 | 03시-04시 승차인원 | 03시-04시 하차인원 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 202108 | 1호선 | 동대문 | 415 | 11 | 10380 | 1815 | 7880 | 5352 | 12037 | ... | 1633 | 5983 | 7 | 1043 | 2 | 2 | 0 | 2 | 0 | 0 |
1 | 202108 | 1호선 | 동묘앞 | 84 | 3 | 2861 | 918 | 3286 | 4614 | 5128 | ... | 577 | 1759 | 4 | 827 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 202108 | 1호선 | 서울역 | 483 | 11 | 7963 | 5533 | 10871 | 31479 | 31643 | ... | 7756 | 4968 | 21 | 444 | 1 | 1 | 0 | 0 | 0 | 0 |
3 | 202108 | 1호선 | 시청 | 6 | 0 | 1597 | 4399 | 2727 | 17957 | 5971 | ... | 2462 | 822 | 3 | 72 | 0 | 2 | 0 | 0 | 0 | 0 |
4 | 202108 | 1호선 | 신설동 | 247 | 6 | 6828 | 2721 | 7333 | 9771 | 14821 | ... | 1352 | 3747 | 15 | 390 | 0 | 0 | 0 | 0 | 0 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
46547 | 201501 | 중앙선 | 운길산 | 0 | 0 | 177 | 56 | 642 | 403 | 1292 | ... | 111 | 633 | 3 | 222 | 0 | 0 | 0 | 0 | 0 | 0 |
46548 | 201501 | 중앙선 | 원덕 | 1 | 0 | 292 | 4 | 415 | 46 | 537 | ... | 8 | 383 | 3 | 157 | 0 | 0 | 0 | 0 | 0 | 0 |
46549 | 201501 | 중앙선 | 중랑 | 14 | 1 | 4929 | 424 | 8539 | 2084 | 22160 | ... | 1619 | 6501 | 86 | 1617 | 0 | 0 | 0 | 0 | 0 | 0 |
46550 | 201501 | 중앙선 | 팔당 | 0 | 0 | 161 | 50 | 368 | 149 | 1227 | ... | 107 | 336 | 8 | 85 | 0 | 0 | 0 | 0 | 0 | 0 |
46551 | 201501 | 중앙선 | 회기 | 436 | 3 | 10929 | 3067 | 23317 | 10430 | 65043 | ... | 18205 | 35702 | 767 | 9314 | 0 | 0 | 0 | 0 | 0 | 0 |
46552 rows × 51 columns
In [167]:
# 공통 컬럼
df1 = df.iloc[:,:3]
# 승차 컬럼만 가져오기
df2 = df.iloc[:,3::2] # 두칸씩 띄어서 승차만 갖고 오기
df2.columns = df2.columns.str.split(' ').str[0]
In [168]:
# 공통컬럼과 승차컬럼 연결하기
df_in = pd.concat([df1,df2], axis=1)
df_in
Out[168]:
사용월 | 호선명 | 지하철역 | 04시-05시 | 05시-06시 | 06시-07시 | 07시-08시 | 08시-09시 | 09시-10시 | 10시-11시 | ... | 18시-19시 | 19시-20시 | 20시-21시 | 21시-22시 | 22시-23시 | 23시-24시 | 00시-01시 | 01시-02시 | 02시-03시 | 03시-04시 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 202108 | 1호선 | 동대문 | 415 | 10380 | 7880 | 12037 | 16637 | 15671 | 13922 | ... | 20332 | 13464 | 10336 | 9669 | 6514 | 1633 | 7 | 2 | 0 | 0 |
1 | 202108 | 1호선 | 동묘앞 | 84 | 2861 | 3286 | 5128 | 8066 | 7541 | 9130 | ... | 19551 | 8704 | 5031 | 4235 | 2678 | 577 | 4 | 0 | 0 | 0 |
2 | 202108 | 1호선 | 서울역 | 483 | 7963 | 10871 | 31643 | 49003 | 36383 | 35273 | ... | 152659 | 72119 | 47289 | 51106 | 27974 | 7756 | 21 | 1 | 0 | 0 |
3 | 202108 | 1호선 | 시청 | 6 | 1597 | 2727 | 5971 | 6884 | 7541 | 8328 | ... | 119064 | 41635 | 31787 | 27796 | 13739 | 2462 | 3 | 0 | 0 | 0 |
4 | 202108 | 1호선 | 신설동 | 247 | 6828 | 7333 | 14821 | 20523 | 14881 | 13551 | ... | 48482 | 18413 | 11610 | 9764 | 5955 | 1352 | 15 | 0 | 0 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
46547 | 201501 | 중앙선 | 운길산 | 0 | 177 | 642 | 1292 | 1479 | 1438 | 1408 | ... | 2304 | 1332 | 1002 | 942 | 270 | 111 | 3 | 0 | 0 | 0 |
46548 | 201501 | 중앙선 | 원덕 | 1 | 292 | 415 | 537 | 823 | 980 | 1025 | ... | 563 | 175 | 156 | 53 | 71 | 8 | 3 | 0 | 0 | 0 |
46549 | 201501 | 중앙선 | 중랑 | 14 | 4929 | 8539 | 22160 | 25792 | 14328 | 11117 | ... | 8399 | 6449 | 4652 | 3849 | 3062 | 1619 | 86 | 0 | 0 | 0 |
46550 | 201501 | 중앙선 | 팔당 | 0 | 161 | 368 | 1227 | 910 | 897 | 1009 | ... | 1617 | 845 | 492 | 420 | 309 | 107 | 8 | 0 | 0 | 0 |
46551 | 201501 | 중앙선 | 회기 | 436 | 10929 | 23317 | 65043 | 85473 | 54247 | 42703 | ... | 59218 | 38996 | 33754 | 34364 | 31606 | 18205 | 767 | 0 | 0 | 0 |
46552 rows × 27 columns
하차 테이블 만들기¶
In [169]:
# 공통 컬럼
df1 = df.iloc[:,:3]
# 하차 컬럼만 가져오기
df2 = df.iloc[:,4::2] # 두칸씩 띄어서 하차만 갖고 오기
df2.columns = df2.columns.str.split(' ').str[0]
In [170]:
# 공통컬럼과 하차컬럼 연결하기
df_out = pd.concat([df1,df2], axis=1)
df_out
Out[170]:
사용월 | 호선명 | 지하철역 | 04시-05시 | 05시-06시 | 06시-07시 | 07시-08시 | 08시-09시 | 09시-10시 | 10시-11시 | ... | 18시-19시 | 19시-20시 | 20시-21시 | 21시-22시 | 22시-23시 | 23시-24시 | 00시-01시 | 01시-02시 | 02시-03시 | 03시-04시 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 202108 | 1호선 | 동대문 | 11 | 1815 | 5352 | 9885 | 19783 | 19192 | 17298 | ... | 16304 | 15398 | 10356 | 8870 | 7191 | 5983 | 1043 | 2 | 2 | 0 |
1 | 202108 | 1호선 | 동묘앞 | 3 | 918 | 4614 | 8004 | 18779 | 15213 | 17602 | ... | 9210 | 5827 | 3835 | 3839 | 3706 | 1759 | 827 | 0 | 0 | 0 |
2 | 202108 | 1호선 | 서울역 | 11 | 5533 | 31479 | 73669 | 149249 | 94786 | 50691 | ... | 61655 | 38909 | 25080 | 21490 | 13638 | 4968 | 444 | 1 | 0 | 0 |
3 | 202108 | 1호선 | 시청 | 0 | 4399 | 17957 | 53669 | 141150 | 60972 | 24743 | ... | 11317 | 5636 | 3793 | 3501 | 2205 | 822 | 72 | 2 | 0 | 0 |
4 | 202108 | 1호선 | 신설동 | 6 | 2721 | 9771 | 21765 | 52910 | 28274 | 18729 | ... | 22904 | 15802 | 10231 | 9428 | 7268 | 3747 | 390 | 0 | 0 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
46547 | 201501 | 중앙선 | 운길산 | 0 | 56 | 403 | 675 | 1390 | 3270 | 3673 | ... | 1218 | 1457 | 769 | 760 | 775 | 633 | 222 | 0 | 0 | 0 |
46548 | 201501 | 중앙선 | 원덕 | 0 | 4 | 46 | 248 | 344 | 273 | 497 | ... | 721 | 714 | 612 | 404 | 339 | 383 | 157 | 0 | 0 | 0 |
46549 | 201501 | 중앙선 | 중랑 | 1 | 424 | 2084 | 3027 | 6573 | 6133 | 5605 | ... | 19547 | 21424 | 14362 | 11678 | 11060 | 6501 | 1617 | 0 | 0 | 0 |
46550 | 201501 | 중앙선 | 팔당 | 0 | 50 | 149 | 523 | 1151 | 2931 | 3932 | ... | 822 | 749 | 320 | 319 | 339 | 336 | 85 | 0 | 0 | 0 |
46551 | 201501 | 중앙선 | 회기 | 3 | 3067 | 10430 | 24473 | 59383 | 41911 | 35003 | ... | 76039 | 81870 | 53481 | 50706 | 49658 | 35702 | 9314 | 0 | 0 | 0 |
46552 rows × 27 columns
출퇴근시간 역별 승하차인원 분석¶
- 최근 월을 기준으로 한 승하차 데이터프레임 생성
In [171]:
df_in_202108 = df_in[df_in['사용월']=='202108']
df_out_202108 = df_out[df_out['사용월']=='202108']
In [172]:
df_out_202108
Out[172]:
사용월 | 호선명 | 지하철역 | 04시-05시 | 05시-06시 | 06시-07시 | 07시-08시 | 08시-09시 | 09시-10시 | 10시-11시 | ... | 18시-19시 | 19시-20시 | 20시-21시 | 21시-22시 | 22시-23시 | 23시-24시 | 00시-01시 | 01시-02시 | 02시-03시 | 03시-04시 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 202108 | 1호선 | 동대문 | 11 | 1815 | 5352 | 9885 | 19783 | 19192 | 17298 | ... | 16304 | 15398 | 10356 | 8870 | 7191 | 5983 | 1043 | 2 | 2 | 0 |
1 | 202108 | 1호선 | 동묘앞 | 3 | 918 | 4614 | 8004 | 18779 | 15213 | 17602 | ... | 9210 | 5827 | 3835 | 3839 | 3706 | 1759 | 827 | 0 | 0 | 0 |
2 | 202108 | 1호선 | 서울역 | 11 | 5533 | 31479 | 73669 | 149249 | 94786 | 50691 | ... | 61655 | 38909 | 25080 | 21490 | 13638 | 4968 | 444 | 1 | 0 | 0 |
3 | 202108 | 1호선 | 시청 | 0 | 4399 | 17957 | 53669 | 141150 | 60972 | 24743 | ... | 11317 | 5636 | 3793 | 3501 | 2205 | 822 | 72 | 2 | 0 | 0 |
4 | 202108 | 1호선 | 신설동 | 6 | 2721 | 9771 | 21765 | 52910 | 28274 | 18729 | ... | 22904 | 15802 | 10231 | 9428 | 7268 | 3747 | 390 | 0 | 0 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
602 | 202108 | 중앙선 | 원덕 | 0 | 1 | 261 | 477 | 613 | 522 | 665 | ... | 701 | 590 | 330 | 468 | 277 | 161 | 20 | 0 | 0 | 0 |
603 | 202108 | 중앙선 | 중랑 | 4 | 572 | 2261 | 2544 | 5744 | 4790 | 4282 | ... | 20675 | 13961 | 9480 | 7041 | 7106 | 2686 | 183 | 0 | 0 | 0 |
604 | 202108 | 중앙선 | 지평 | 0 | 0 | 0 | 298 | 58 | 3 | 422 | ... | 137 | 232 | 4 | 84 | 32 | 0 | 0 | 0 | 0 | 0 |
605 | 202108 | 중앙선 | 팔당 | 0 | 117 | 783 | 1603 | 2790 | 3084 | 3007 | ... | 1828 | 1148 | 734 | 488 | 333 | 211 | 0 | 0 | 0 | 0 |
606 | 202108 | 중앙선 | 회기 | 12 | 3419 | 10520 | 24212 | 40739 | 26807 | 23533 | ... | 62992 | 50037 | 30138 | 30912 | 31496 | 12009 | 1645 | 0 | 0 | 0 |
607 rows × 27 columns
- 출근시간에 가장 많은 사람이 승차하는 역은 어디일까? (08시-09시)
In [173]:
df_in_202108.nlargest(10,'08시-09시')[['지하철역','08시-09시']]
Out[173]:
지하철역 | 08시-09시 | |
---|---|---|
37 | 신림 | 267128 |
14 | 구로디지털단지 | 153411 |
28 | 서울대입구(관악구청) | 150090 |
83 | 연신내 | 132615 |
133 | 까치산 | 130443 |
52 | 잠실(송파구청) | 128005 |
175 | 화곡 | 121310 |
112 | 쌍문 | 112812 |
36 | 신도림 | 111452 |
35 | 신대방 | 110766 |
- 출근시간에 가장 많은 사람이 하차하는 역은 어디일까?(09시-10시)
In [174]:
df_out_202108.nlargest(10,'09시-10시')[['지하철역','09시-10시']]
Out[174]:
지하철역 | 09시-10시 | |
---|---|---|
10 | 강남 | 274355 |
43 | 역삼 | 226437 |
215 | 가산디지털단지 | 188412 |
30 | 선릉 | 178766 |
26 | 삼성(무역센터) | 172539 |
80 | 압구정 | 139283 |
31 | 성수 | 124935 |
78 | 신사 | 122905 |
13 | 교대(법원.검찰청) | 121163 |
14 | 구로디지털단지 | 121092 |
- 퇴근시간에 가장 많은 사람이 승차하는 역은 어디일까?(18시-19시)
In [175]:
df_in_202108.nlargest(10,'18시-19시')[['지하철역','18시-19시']]
Out[175]:
지하철역 | 18시-19시 | |
---|---|---|
10 | 강남 | 302398 |
215 | 가산디지털단지 | 283125 |
30 | 선릉 | 245318 |
43 | 역삼 | 239209 |
26 | 삼성(무역센터) | 230299 |
50 | 을지로입구 | 207093 |
31 | 성수 | 202624 |
14 | 구로디지털단지 | 192537 |
82 | 양재(서초구청) | 174296 |
128 | 광화문(세종문화회관) | 173772 |
- 퇴근시간에 가장 많은 사람이 하차하는 역은 어디일까?(19시-20시)
In [176]:
df_out_202108.nlargest(10,'19시-20시')[['지하철역','19시-20시']]
Out[176]:
지하철역 | 19시-20시 | |
---|---|---|
37 | 신림 | 182832 |
28 | 서울대입구(관악구청) | 121426 |
52 | 잠실(송파구청) | 116568 |
14 | 구로디지털단지 | 107520 |
83 | 연신내 | 103283 |
36 | 신도림 | 97759 |
109 | 수유(강북구청) | 93666 |
133 | 까치산 | 87948 |
112 | 쌍문 | 86631 |
438 | 부천 | 85018 |
강남역의 최근 시간대별 승하차정보 분석¶
강남역의 최근 승차정보 분석¶
In [178]:
# 강남역의 최근 승차 데이터 불러오기
df_gangnam_in = df_in_202108[df_in_202108['지하철역']=='강남'].iloc[:,3:]
df_gangnam_in
Out[178]:
04시-05시 | 05시-06시 | 06시-07시 | 07시-08시 | 08시-09시 | 09시-10시 | 10시-11시 | 11시-12시 | 12시-13시 | 13시-14시 | ... | 18시-19시 | 19시-20시 | 20시-21시 | 21시-22시 | 22시-23시 | 23시-24시 | 00시-01시 | 01시-02시 | 02시-03시 | 03시-04시 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
10 | 64 | 4993 | 14177 | 31783 | 50239 | 40611 | 44108 | 59573 | 75942 | 88926 | ... | 302398 | 178242 | 138452 | 157847 | 105997 | 12509 | 5 | 2 | 0 | 0 |
1 rows × 24 columns
In [179]:
# melt
df_gangnam_in = df_gangnam_in.melt()
In [180]:
# 컬럼명 변경
df_gangnam_in.columns=['시간대','승차건수']
df_gangnam_in.sort_values('승차건수')
Out[180]:
시간대 | 승차건수 | |
---|---|---|
23 | 03시-04시 | 0 |
22 | 02시-03시 | 0 |
21 | 01시-02시 | 2 |
20 | 00시-01시 | 5 |
0 | 04시-05시 | 64 |
1 | 05시-06시 | 4993 |
19 | 23시-24시 | 12509 |
2 | 06시-07시 | 14177 |
3 | 07시-08시 | 31783 |
5 | 09시-10시 | 40611 |
6 | 10시-11시 | 44108 |
4 | 08시-09시 | 50239 |
7 | 11시-12시 | 59573 |
8 | 12시-13시 | 75942 |
9 | 13시-14시 | 88926 |
10 | 14시-15시 | 97964 |
18 | 22시-23시 | 105997 |
11 | 15시-16시 | 120268 |
12 | 16시-17시 | 135621 |
16 | 20시-21시 | 138452 |
17 | 21시-22시 | 157847 |
15 | 19시-20시 | 178242 |
13 | 17시-18시 | 214990 |
14 | 18시-19시 | 302398 |
In [181]:
# 시간대별 승차인원 시각화하기
df_gangnam_in
plt.figure(figsize=(10,7))
plt.barh(df_gangnam_in['시간대'], df_gangnam_in['승차건수'])
plt.show()
강남역의 최근 하차 정보 분석¶
In [182]:
# 강남역의 최근 하차 데이터 불러오기
df_gangnam_out = df_out_202108[df_out_202108['지하철역']=='강남'].iloc[:,3:]
df_gangnam_out
Out[182]:
04시-05시 | 05시-06시 | 06시-07시 | 07시-08시 | 08시-09시 | 09시-10시 | 10시-11시 | 11시-12시 | 12시-13시 | 13시-14시 | ... | 18시-19시 | 19시-20시 | 20시-21시 | 21시-22시 | 22시-23시 | 23시-24시 | 00시-01시 | 01시-02시 | 02시-03시 | 03시-04시 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
10 | 4 | 10411 | 45059 | 129595 | 269877 | 274355 | 129744 | 99120 | 96644 | 115153 | ... | 125891 | 68747 | 34635 | 27783 | 21970 | 8377 | 15 | 1 | 0 | 0 |
1 rows × 24 columns
In [183]:
# melt
df_gangnam_out = df_gangnam_out.melt()
In [184]:
# 컬럼명 변경
df_gangnam_out.columns=['시간대','하차건수']
df_gangnam_out.sort_values('하차건수')
Out[184]:
시간대 | 하차건수 | |
---|---|---|
23 | 03시-04시 | 0 |
22 | 02시-03시 | 0 |
21 | 01시-02시 | 1 |
0 | 04시-05시 | 4 |
20 | 00시-01시 | 15 |
19 | 23시-24시 | 8377 |
1 | 05시-06시 | 10411 |
18 | 22시-23시 | 21970 |
17 | 21시-22시 | 27783 |
16 | 20시-21시 | 34635 |
2 | 06시-07시 | 45059 |
15 | 19시-20시 | 68747 |
12 | 16시-17시 | 83690 |
11 | 15시-16시 | 86770 |
10 | 14시-15시 | 94620 |
8 | 12시-13시 | 96644 |
13 | 17시-18시 | 96689 |
7 | 11시-12시 | 99120 |
9 | 13시-14시 | 115153 |
14 | 18시-19시 | 125891 |
3 | 07시-08시 | 129595 |
6 | 10시-11시 | 129744 |
4 | 08시-09시 | 269877 |
5 | 09시-10시 | 274355 |
In [185]:
# 시간대별 승차인원 시각화하기
df_gangnam_out
plt.figure(figsize=(10,7))
plt.barh(df_gangnam_out['시간대'], df_gangnam_out['하차건수'])
plt.show()
지하철 시간대별, 역별 이용현황 분석¶
시간대별 승차 현황¶
승차정보 집계 데이터 만들기¶
In [188]:
# df_in_202108카피하여 사용하기
df_in_202108_agg = df_in_202108.copy()
In [187]:
df_in_202108_agg
Out[187]:
사용월 | 호선명 | 지하철역 | 04시-05시 | 05시-06시 | 06시-07시 | 07시-08시 | 08시-09시 | 09시-10시 | 10시-11시 | ... | 18시-19시 | 19시-20시 | 20시-21시 | 21시-22시 | 22시-23시 | 23시-24시 | 00시-01시 | 01시-02시 | 02시-03시 | 03시-04시 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 202108 | 1호선 | 동대문 | 415 | 10380 | 7880 | 12037 | 16637 | 15671 | 13922 | ... | 20332 | 13464 | 10336 | 9669 | 6514 | 1633 | 7 | 2 | 0 | 0 |
1 | 202108 | 1호선 | 동묘앞 | 84 | 2861 | 3286 | 5128 | 8066 | 7541 | 9130 | ... | 19551 | 8704 | 5031 | 4235 | 2678 | 577 | 4 | 0 | 0 | 0 |
2 | 202108 | 1호선 | 서울역 | 483 | 7963 | 10871 | 31643 | 49003 | 36383 | 35273 | ... | 152659 | 72119 | 47289 | 51106 | 27974 | 7756 | 21 | 1 | 0 | 0 |
3 | 202108 | 1호선 | 시청 | 6 | 1597 | 2727 | 5971 | 6884 | 7541 | 8328 | ... | 119064 | 41635 | 31787 | 27796 | 13739 | 2462 | 3 | 0 | 0 | 0 |
4 | 202108 | 1호선 | 신설동 | 247 | 6828 | 7333 | 14821 | 20523 | 14881 | 13551 | ... | 48482 | 18413 | 11610 | 9764 | 5955 | 1352 | 15 | 0 | 0 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
602 | 202108 | 중앙선 | 원덕 | 72 | 277 | 689 | 643 | 883 | 755 | 661 | ... | 544 | 442 | 215 | 94 | 25 | 0 | 0 | 0 | 0 | 0 |
603 | 202108 | 중앙선 | 중랑 | 200 | 5961 | 8782 | 19739 | 18610 | 13213 | 8053 | ... | 6531 | 4213 | 2938 | 2513 | 1654 | 430 | 5 | 0 | 0 | 0 |
604 | 202108 | 중앙선 | 지평 | 0 | 1 | 2 | 347 | 218 | 18 | 325 | ... | 35 | 215 | 2 | 27 | 14 | 0 | 0 | 0 | 0 | 0 |
605 | 202108 | 중앙선 | 팔당 | 1 | 212 | 788 | 1261 | 1267 | 1123 | 1208 | ... | 2857 | 2067 | 2057 | 1927 | 559 | 56 | 0 | 0 | 0 | 0 |
606 | 202108 | 중앙선 | 회기 | 719 | 11133 | 18619 | 47471 | 59922 | 39563 | 31469 | ... | 38115 | 21128 | 17210 | 17437 | 13269 | 3634 | 63 | 0 | 0 | 0 |
607 rows × 27 columns
In [189]:
# 인덱스 변경('지하철역')
df_in_202108_agg.index = df_in_202108_agg['지하철역']
df_in_202108_agg
Out[189]:
사용월 | 호선명 | 지하철역 | 04시-05시 | 05시-06시 | 06시-07시 | 07시-08시 | 08시-09시 | 09시-10시 | 10시-11시 | ... | 18시-19시 | 19시-20시 | 20시-21시 | 21시-22시 | 22시-23시 | 23시-24시 | 00시-01시 | 01시-02시 | 02시-03시 | 03시-04시 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
지하철역 | |||||||||||||||||||||
동대문 | 202108 | 1호선 | 동대문 | 415 | 10380 | 7880 | 12037 | 16637 | 15671 | 13922 | ... | 20332 | 13464 | 10336 | 9669 | 6514 | 1633 | 7 | 2 | 0 | 0 |
동묘앞 | 202108 | 1호선 | 동묘앞 | 84 | 2861 | 3286 | 5128 | 8066 | 7541 | 9130 | ... | 19551 | 8704 | 5031 | 4235 | 2678 | 577 | 4 | 0 | 0 | 0 |
서울역 | 202108 | 1호선 | 서울역 | 483 | 7963 | 10871 | 31643 | 49003 | 36383 | 35273 | ... | 152659 | 72119 | 47289 | 51106 | 27974 | 7756 | 21 | 1 | 0 | 0 |
시청 | 202108 | 1호선 | 시청 | 6 | 1597 | 2727 | 5971 | 6884 | 7541 | 8328 | ... | 119064 | 41635 | 31787 | 27796 | 13739 | 2462 | 3 | 0 | 0 | 0 |
신설동 | 202108 | 1호선 | 신설동 | 247 | 6828 | 7333 | 14821 | 20523 | 14881 | 13551 | ... | 48482 | 18413 | 11610 | 9764 | 5955 | 1352 | 15 | 0 | 0 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
원덕 | 202108 | 중앙선 | 원덕 | 72 | 277 | 689 | 643 | 883 | 755 | 661 | ... | 544 | 442 | 215 | 94 | 25 | 0 | 0 | 0 | 0 | 0 |
중랑 | 202108 | 중앙선 | 중랑 | 200 | 5961 | 8782 | 19739 | 18610 | 13213 | 8053 | ... | 6531 | 4213 | 2938 | 2513 | 1654 | 430 | 5 | 0 | 0 | 0 |
지평 | 202108 | 중앙선 | 지평 | 0 | 1 | 2 | 347 | 218 | 18 | 325 | ... | 35 | 215 | 2 | 27 | 14 | 0 | 0 | 0 | 0 | 0 |
팔당 | 202108 | 중앙선 | 팔당 | 1 | 212 | 788 | 1261 | 1267 | 1123 | 1208 | ... | 2857 | 2067 | 2057 | 1927 | 559 | 56 | 0 | 0 | 0 | 0 |
회기 | 202108 | 중앙선 | 회기 | 719 | 11133 | 18619 | 47471 | 59922 | 39563 | 31469 | ... | 38115 | 21128 | 17210 | 17437 | 13269 | 3634 | 63 | 0 | 0 | 0 |
607 rows × 27 columns
In [190]:
# 컬럼 삭제('사용월','호선명','지하철역')
df_in_202108_agg.drop(columns= ['사용월','호선명','지하철역'], inplace=True)
In [191]:
# 행,열 합계
df_in_202108_agg.loc['sum'] = df_in_202108_agg.apply('sum', axis=0)
In [192]:
df_in_202108_agg['sum'] = df_in_202108_agg.apply('sum',axis=1)
In [193]:
df_in_202108_agg
Out[193]:
04시-05시 | 05시-06시 | 06시-07시 | 07시-08시 | 08시-09시 | 09시-10시 | 10시-11시 | 11시-12시 | 12시-13시 | 13시-14시 | ... | 19시-20시 | 20시-21시 | 21시-22시 | 22시-23시 | 23시-24시 | 00시-01시 | 01시-02시 | 02시-03시 | 03시-04시 | sum | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
지하철역 | |||||||||||||||||||||
동대문 | 415 | 10380 | 7880 | 12037 | 16637 | 15671 | 13922 | 15675 | 18244 | 19566 | ... | 13464 | 10336 | 9669 | 6514 | 1633 | 7 | 2 | 0 | 0 | 274678 |
동묘앞 | 84 | 2861 | 3286 | 5128 | 8066 | 7541 | 9130 | 13369 | 18112 | 21526 | ... | 8704 | 5031 | 4235 | 2678 | 577 | 4 | 0 | 0 | 0 | 229111 |
서울역 | 483 | 7963 | 10871 | 31643 | 49003 | 36383 | 35273 | 41477 | 48720 | 50740 | ... | 72119 | 47289 | 51106 | 27974 | 7756 | 21 | 1 | 0 | 0 | 938002 |
시청 | 6 | 1597 | 2727 | 5971 | 6884 | 7541 | 8328 | 12240 | 13561 | 15934 | ... | 41635 | 31787 | 27796 | 13739 | 2462 | 3 | 0 | 0 | 0 | 448993 |
신설동 | 247 | 6828 | 7333 | 14821 | 20523 | 14881 | 13551 | 15578 | 16289 | 17701 | ... | 18413 | 11610 | 9764 | 5955 | 1352 | 15 | 0 | 0 | 0 | 319277 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
중랑 | 200 | 5961 | 8782 | 19739 | 18610 | 13213 | 8053 | 7475 | 7112 | 7262 | ... | 4213 | 2938 | 2513 | 1654 | 430 | 5 | 0 | 0 | 0 | 139495 |
지평 | 0 | 1 | 2 | 347 | 218 | 18 | 325 | 2 | 4 | 65 | ... | 215 | 2 | 27 | 14 | 0 | 0 | 0 | 0 | 0 | 1852 |
팔당 | 1 | 212 | 788 | 1261 | 1267 | 1123 | 1208 | 1127 | 1339 | 1521 | ... | 2067 | 2057 | 1927 | 559 | 56 | 0 | 0 | 0 | 0 | 28424 |
회기 | 719 | 11133 | 18619 | 47471 | 59922 | 39563 | 31469 | 31674 | 33153 | 30224 | ... | 21128 | 17210 | 17437 | 13269 | 3634 | 63 | 0 | 0 | 0 | 560588 |
sum | 125592 | 2679895 | 5392644 | 13007398 | 14639529 | 8962001 | 6688112 | 6762631 | 7277223 | 7301932 | ... | 8671470 | 6611588 | 6032973 | 3852573 | 744365 | 6086 | 26 | 3 | 1 | 153448619 |
608 rows × 25 columns
시간대별 승차건수¶
In [194]:
s_in = df_in_202108_agg.loc['sum'][:-1].sort_values()
In [196]:
s_in = s_in.sort_index()
s_in
x = s_in.index
y = s_in.values
plt.bar(x,y)
plt.xticks(rotation=50)
plt.show()
지하철역별 승차건수¶
In [197]:
df_in_202108_agg['sum'][:-1].sort_values(ascending=False).to_frame()
Out[197]:
sum | |
---|---|
지하철역 | |
강남 | 1874711 |
잠실(송파구청) | 1539356 |
신림 | 1503604 |
구로디지털단지 | 1331304 |
홍대입구 | 1247932 |
... | ... |
창동 | 6 |
계양 | 5 |
지축 | 4 |
검암 | 4 |
신내 | 3 |
607 rows × 1 columns
시간대별 하차 현황¶
하차정보 집계 테이블 만들기¶
In [198]:
# df_out_202108카피하여 사용하기
df_out_202108_agg = df_out_202108.copy()
In [199]:
# 인덱스 변경('지하철역')
df_out_202108_agg.index = df_out_202108_agg['지하철역']
df_out_202108_agg
Out[199]:
사용월 | 호선명 | 지하철역 | 04시-05시 | 05시-06시 | 06시-07시 | 07시-08시 | 08시-09시 | 09시-10시 | 10시-11시 | ... | 18시-19시 | 19시-20시 | 20시-21시 | 21시-22시 | 22시-23시 | 23시-24시 | 00시-01시 | 01시-02시 | 02시-03시 | 03시-04시 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
지하철역 | |||||||||||||||||||||
동대문 | 202108 | 1호선 | 동대문 | 11 | 1815 | 5352 | 9885 | 19783 | 19192 | 17298 | ... | 16304 | 15398 | 10356 | 8870 | 7191 | 5983 | 1043 | 2 | 2 | 0 |
동묘앞 | 202108 | 1호선 | 동묘앞 | 3 | 918 | 4614 | 8004 | 18779 | 15213 | 17602 | ... | 9210 | 5827 | 3835 | 3839 | 3706 | 1759 | 827 | 0 | 0 | 0 |
서울역 | 202108 | 1호선 | 서울역 | 11 | 5533 | 31479 | 73669 | 149249 | 94786 | 50691 | ... | 61655 | 38909 | 25080 | 21490 | 13638 | 4968 | 444 | 1 | 0 | 0 |
시청 | 202108 | 1호선 | 시청 | 0 | 4399 | 17957 | 53669 | 141150 | 60972 | 24743 | ... | 11317 | 5636 | 3793 | 3501 | 2205 | 822 | 72 | 2 | 0 | 0 |
신설동 | 202108 | 1호선 | 신설동 | 6 | 2721 | 9771 | 21765 | 52910 | 28274 | 18729 | ... | 22904 | 15802 | 10231 | 9428 | 7268 | 3747 | 390 | 0 | 0 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
원덕 | 202108 | 중앙선 | 원덕 | 0 | 1 | 261 | 477 | 613 | 522 | 665 | ... | 701 | 590 | 330 | 468 | 277 | 161 | 20 | 0 | 0 | 0 |
중랑 | 202108 | 중앙선 | 중랑 | 4 | 572 | 2261 | 2544 | 5744 | 4790 | 4282 | ... | 20675 | 13961 | 9480 | 7041 | 7106 | 2686 | 183 | 0 | 0 | 0 |
지평 | 202108 | 중앙선 | 지평 | 0 | 0 | 0 | 298 | 58 | 3 | 422 | ... | 137 | 232 | 4 | 84 | 32 | 0 | 0 | 0 | 0 | 0 |
팔당 | 202108 | 중앙선 | 팔당 | 0 | 117 | 783 | 1603 | 2790 | 3084 | 3007 | ... | 1828 | 1148 | 734 | 488 | 333 | 211 | 0 | 0 | 0 | 0 |
회기 | 202108 | 중앙선 | 회기 | 12 | 3419 | 10520 | 24212 | 40739 | 26807 | 23533 | ... | 62992 | 50037 | 30138 | 30912 | 31496 | 12009 | 1645 | 0 | 0 | 0 |
607 rows × 27 columns
In [200]:
# 컬럼 삭제('사용월','호선명','지하철역')
df_out_202108_agg.drop(columns= ['사용월','호선명','지하철역'], inplace=True)
In [201]:
# 행,열 합계
df_out_202108_agg.loc['sum'] = df_out_202108_agg.apply('sum', axis=0)
In [202]:
df_out_202108_agg['sum'] = df_out_202108_agg.apply('sum', axis=1)
In [203]:
df_out_202108_agg
Out[203]:
04시-05시 | 05시-06시 | 06시-07시 | 07시-08시 | 08시-09시 | 09시-10시 | 10시-11시 | 11시-12시 | 12시-13시 | 13시-14시 | ... | 19시-20시 | 20시-21시 | 21시-22시 | 22시-23시 | 23시-24시 | 00시-01시 | 01시-02시 | 02시-03시 | 03시-04시 | sum | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
지하철역 | |||||||||||||||||||||
동대문 | 11 | 1815 | 5352 | 9885 | 19783 | 19192 | 17298 | 19346 | 19492 | 18295 | ... | 15398 | 10356 | 8870 | 7191 | 5983 | 1043 | 2 | 2 | 0 | 260656 |
동묘앞 | 3 | 918 | 4614 | 8004 | 18779 | 15213 | 17602 | 21823 | 23065 | 24178 | ... | 5827 | 3835 | 3839 | 3706 | 1759 | 827 | 0 | 0 | 0 | 235014 |
서울역 | 11 | 5533 | 31479 | 73669 | 149249 | 94786 | 50691 | 42942 | 46909 | 45564 | ... | 38909 | 25080 | 21490 | 13638 | 4968 | 444 | 1 | 0 | 0 | 893346 |
시청 | 0 | 4399 | 17957 | 53669 | 141150 | 60972 | 24743 | 22388 | 20191 | 18708 | ... | 5636 | 3793 | 3501 | 2205 | 822 | 72 | 2 | 0 | 0 | 442944 |
신설동 | 6 | 2721 | 9771 | 21765 | 52910 | 28274 | 18729 | 16195 | 16020 | 15974 | ... | 15802 | 10231 | 9428 | 7268 | 3747 | 390 | 0 | 0 | 0 | 316122 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
중랑 | 4 | 572 | 2261 | 2544 | 5744 | 4790 | 4282 | 4579 | 5208 | 5729 | ... | 13961 | 9480 | 7041 | 7106 | 2686 | 183 | 0 | 0 | 0 | 133345 |
지평 | 0 | 0 | 0 | 298 | 58 | 3 | 422 | 2 | 1 | 127 | ... | 232 | 4 | 84 | 32 | 0 | 0 | 0 | 0 | 0 | 2019 |
팔당 | 0 | 117 | 783 | 1603 | 2790 | 3084 | 3007 | 2377 | 2366 | 1598 | ... | 1148 | 734 | 488 | 333 | 211 | 0 | 0 | 0 | 0 | 28701 |
회기 | 12 | 3419 | 10520 | 24212 | 40739 | 26807 | 23533 | 21253 | 24327 | 27639 | ... | 50037 | 30138 | 30912 | 31496 | 12009 | 1645 | 0 | 0 | 0 | 547771 |
sum | 1644 | 706189 | 3603606 | 8042590 | 17604264 | 11402630 | 7146549 | 6666215 | 7062738 | 7449305 | ... | 12354319 | 7093483 | 6338999 | 5217987 | 2216218 | 214094 | 66 | 12 | 1 | 152911075 |
608 rows × 25 columns
시간대별 하차 건수¶
In [204]:
df_out_202108_agg.loc['sum'].sort_values()
Out[204]:
03시-04시 1
02시-03시 12
01시-02시 66
04시-05시 1644
00시-01시 214094
05시-06시 706189
23시-24시 2216218
06시-07시 3603606
22시-23시 5217987
21시-22시 6338999
11시-12시 6666215
12시-13시 7062738
20시-21시 7093483
10시-11시 7146549
14시-15시 7174578
13시-14시 7449305
15시-16시 7581218
07시-08시 8042590
16시-17시 8380236
17시-18시 10646691
09시-10시 11402630
19시-20시 12354319
18시-19시 16007443
08시-09시 17604264
sum 152911075
Name: sum, dtype: int64
지하철역별 하차건수¶
In [205]:
df_out_202108_agg['sum'][:-1].sort_values(ascending=False)[:10].to_frame()
Out[205]:
sum | |
---|---|
지하철역 | |
강남 | 1819150 |
잠실(송파구청) | 1514327 |
신림 | 1467939 |
구로디지털단지 | 1339493 |
홍대입구 | 1273453 |
역삼 | 1154897 |
서울대입구(관악구청) | 1105337 |
신도림 | 1082008 |
삼성(무역센터) | 1077253 |
선릉 | 1048553 |