광주인력개발원 일일포스팅(메모장)
15주차 목 1130(데이터베이스_수집_가공_2)
Jumbo96
2023. 12. 4. 09:15
728x90
반응형
### 사용할 데이터 읽어들이기
# 데이터프레임 변수명 : df_bus_card_tot
df_bus_card_tot = pd.read_csv("./01_data/all/df_bus_card_tot.csv")
print("갯수 : ", len(df_bus_card_tot))
df_bus_card_tot.head(1)
승차시각 하차시각 승객연령 환승여부 추가운임여부 승차정류장 하차정류장 버스내체류시간(분) 기준년도 기준월 기준일 기준시간 기준시간(분)
0 2020-01-02 05:10:49 2020-01-02 05:18:44 일반 N N 양덕차고지 동부초등학교 7.92 2020 1 2 5 10
### 시각화 라이브러리
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
### 그래프 내에 한글이 포함된 경우 폰트 처리가 필요함
# - 한글 깨짐 방지
### 폰트 환경설정 라이브러리
from matplotlib import font_manager, rc
plt.rc("font", family = "malgun Gothic")
### 그래프 내에 마이너스(-) 표시 기호 적용하기
plt.rcParams["axes.unicode_minus"] = False
승차시각 하차시각 승객연령 환승여부 추가운임여부 승차정류장 하차정류장 버스내체류시간(분) 기준년도 기준월 기준일 기준시간 기준시간(분)
0 2020-01-02 05:10:49 2020-01-02 05:18:44 일반 N N 양덕차고지 동부초등학교 7.92 2020 1 2 5 10
기준월 및 기준일자별 버스 이용량 시각화 분석
### 사용할 컬럼 : 기준월, 기준일, 승객연령
# - 사용할 집계함수 : count
# - 이용량 집계를 위한 함수 : prvot_table() -> 히트맵 사걱화시 데이터 생성
# - 사용할 그래프 : 히트맵(hitmap)
### 데이터 count 집계하기
# - y축 : index
# - x축 : columns
# - 집계 : count(승객연령)
df_pivot = df_bus_card_tot.pivot_table(index = "기준월",
columns = "기준일",
values = "승객연령",
aggfunc = "count")
df_pivot
기준일 1 2 3 4 5 6 7 8 9 10 ... 22 23 24 25 26 27 28 29 30 31
기준월
1 9365.0 16164.0 16590.0 12530.0 9515.0 15474.0 12981.0 15785.0 16760.0 17495.0 ... 17229.0 17399.0 9112.0 5923.0 7770.0 5468.0 14464.0 16034.0 15868.0 16186.0
2 11801.0 8523.0 15830.0 15488.0 14902.0 14376.0 15700.0 11358.0 8316.0 15582.0 ... 5654.0 2898.0 5932.0 4469.0 5344.0 5417.0 5488.0 3757.0 NaN NaN
3 2399.0 6538.0 5691.0 5976.0 5828.0 6150.0 4111.0 2826.0 6879.0 5336.0 ... NaN NaN NaN 131.0 2889.0 4976.0 3868.0 1241.0 5143.0 2487.0
결측치(NaN) 처리하기
### 모든 결측치(NaN)는 0으로 대체하기
df_pivot.fillna(0)
df_pivot
기준일 1 2 3 4 5 6 7 8 9 10 ... 22 23 24 25 26 27 28 29 30 31
기준월
1 9365.0 16164.0 16590.0 12530.0 9515.0 15474.0 12981.0 15785.0 16760.0 17495.0 ... 17229.0 17399.0 9112.0 5923.0 7770.0 5468.0 14464.0 16034.0 15868.0 16186.0
2 11801.0 8523.0 15830.0 15488.0 14902.0 14376.0 15700.0 11358.0 8316.0 15582.0 ... 5654.0 2898.0 5932.0 4469.0 5344.0 5417.0 5488.0 3757.0 NaN NaN
3 2399.0 6538.0 5691.0 5976.0 5828.0 6150.0 4111.0 2826.0 6879.0 5336.0 ... NaN NaN NaN 131.0 2889.0 4976.0 3868.0 1241.0 5143.0 2487.0
히트맵(gitmap) 시각화
### 그래프 전체 너비, 높이 설정
plt.figure(figsize=(20, 10))
### 그래프 제목 넣기
plt.title("기준월 및 기준일자별 버스 이용량 분석")
### 히트맵 그리기 : 히트맵은 seaborn 라이브러리에 있습니다.
# - annot : False는 집계값 굼시기, True는 집계값 보이기
# - fmt : ".0f"는 소숫점 0자리까지 보이기 (분석에서는 보통 3자리 씀 .3f)
# - cmap : 컬러 색상그룹
sns.heatmap(df_pivot, annot=True, fmt=".0f", cmap="rocket_r")
### 그래프 표현
plt.show()
"""
(해석)
- 1월~3월까지의 이용량을 분석한 결과 1월에 가장많은 이용량을 나타내고 있으며,
2월에서 3월로 가면서 이용량이 점진적 줄어들고 있는것으로 확인됨
- 줄어드는 이유는 포항시의 특성상 외부에서 관광객의 유입에 따라,
버스를 이용하는 사람들이 많을 것으로 예상됨
- 이에 따라, 포항시 관광객에 대한 데이터를 수집하여 해당 년월에 대한 데이터를
비교 분석해볼 필요성이 있음
"""
기준일 및 기준시간별 버스 이용량 시각화 분석
### 데이터 count 집계하기
# - y축 : index
# - x축 : columns
# - 집계 : count(승객연령)
df_pivot = df_bus_card_tot.pivot_table(index = "기준일",
columns = "기준시간",
values = "승객연령",
aggfunc = "count")
df_pivot
### 결측치 처리하기
df_pivot.fillna(0)
plt.figure(figsize=(20, 10))
plt.title("기준일 및 기준시간별 버스 이용량 분석")
sns.heatmap(df_pivot, annot=True, fmt=".0f", cmap="rocket_r")
plt.show()
"""
(해석)
- 버스 이용량에 대한 분석결과,
- 일반적으로 출/퇴근 시간에 많아야할 버스이용량이, 포항시의 경우
오후 시간대에 이용량이 밀집되어 있음
- 특히, 오후 1시, 3시에 높은 이용량을 나타내고 있음
- 이는 출/퇴근 시간에 자가 차량을 이용한느 사람이 많을 수도 있다는 예상이 을 할 수 있으며,
인구 분포가 노령인구가 많기에 오후에 잉ㅇ자가 많은 수도 있을 수 있음
- 따라서, 포항시 인구현황 데이터, 경제활동인구 분석을 통해 비교 분석이 가능할 것으로 예상됨
- 또한, 해당 이용량이 높은 시간대에 노선을 확인하여 특성 확인도 필요할 것으로 예상됨
"""
기준시간 및 분별 버스 이용량 시각화 분석
### 데이터 count 집계하기
# - y축 : index
# - x축 : columns
# - 집계 : count(승객연령)
df_pivot = df_bus_card_tot.pivot_table(index = "기준시간",
columns = "기준시간(분)",
values = "승객연령",
aggfunc = "count")
df_pivot
### 결측치 처리하기
df_pivot.fillna(0)
plt.figure(figsize=(20, 10))
plt.title("기준시간 및 기준시간(분)별 버스 이용량 분석")
sns.heatmap(df_pivot, annot=True, fmt=".0f", cmap="rocket_r")
plt.show()
"""
(해석)
- 출/퇴근 시간대의 버스이용량을 볼 때 오전 7시 55분 ~ 8시 10분 사이에 이용량이 많은 것으로 보이며,
- 퇴근 시간대의 경우에는 오후 6시 ~ 6시 20분까지 이용량이 많은 것으로 보인다.
- 특히 오후 3시 20분까지 버스 이용량이 매우 크게 나타나고 있음
- 오후 시간대 이용자에 대한 추가 확인은 필요할 것으로 보임
"""
### 데이터 count 집계하기
# - y축 : index
# - x축 : columns
# - 집계 : count(승객연령)
df_pivot = df_bus_card_tot.pivot_table(index = "기준일",
columns = "기준시간",
values = "버스내체류시간(분)",
aggfunc = "mean")
df_pivot
### 결측치 처리하기
df_pivot.fillna(0)
plt.figure(figsize=(20, 10))
plt.title("가준일 및 시간별 버스내체류시간(분) 시각화 분석")
sns.heatmap(df_pivot, annot=True, fmt=".3f", cmap="rocket_r")
plt.show()
"""
(해석)
- 매월 1일 많은 사람들이 장거리버스를 이용며 05시에 유독이용량이 많은 이례적인 데이터를 보이며,
- 출근시간보다 퇴근시간에 버스이용량이 많은것을 볼 수 있다. 이를 바탕으로
- 다른 데이터를 추가적으로 봐야겠지만 회사의 출근버스나 다른 대중교통 이용 후 퇴근은 퇴근시간대의 대중교통(버스)로 할 경우도 예상됨
- 포항시의 주변 상권(경제활동인구)의 출/퇴근 시간의 영향을 받을 수도 있을 것으로 예상됨
- 7시 이후로는 장거리 이용자는 보편적으로 나타나고 있으며,
위에서 분석한 기준일 및 시간별 이용량 분석에서 확인한 바와 같이 7시 이후의 버스 이용량도 급격하게 줄어드는 것으로 보아,
저녁 시간 버스 이용이 현저이 낮은 것으로 여겨짐
- 장거리 이용자가 많은 시간대에 급행버스의 도입에 대한 추가 확인은 필요할 것으로 여겨짐
"""
시간대 및 승객연령별 버스내체류시간(분) 시각화(막대그래프)
### 필요한 데이터 : 기준시간, 승객연령, 버스내체류시간(분)
df_temp = pd.DataFrame()
df_temp["기준시간"] = df_bus_card_tot["기준시간"]
df_temp["승객구분"] = df_bus_card_tot["승객연령"]
df_temp["버스내체류시간"] = df_bus_card_tot["버스내체류시간(분)"]
df_temp
기준시간 승객구분 버스내체류시간
0 5 일반 7.92
1 5 일반 32.18
2 5 일반 3.68
3 5 일반 34.48
4 5 일반 4.48
... ... ... ...
842603 23 일반 5.07
842604 23 일반 4.05
842605 23 일반 7.67
842606 23 일반 11.35
842607 23 일반 7.42
그래프 시각화 하기
fig = plt.figure(figsize=(25,10))
plt.title("시간 및 승객구분별 버스내 체류시간(분단위) 분석")
### hue : x축 및 y축을 기준으로 비교할 대상 컬럼 지정(번주형 데이터를 보통 사용)
sns.barplot(x="기준시간", y="버스내체류시간", hue="승객구분", data=df_temp2)
plt.show()
### histplot 시각화 : 두개 그래프 조합 (밀도 그래프라고 칭하기도 합니다.)
plt.figure(figsize=(12,4))
plt.title("시간 및 승객구분별 버스내 체류시간(분단위) 분석")
sns.histplot(data = df_temp2,
x = "기준시간",
### 사용할 막대의 최대 갯수
bins = 30,
### 막대그래프 밀도 선그리기
kde = True,
### 범주 데이터
hue = "승객구분",
### 여러 범주를 하나의 막대에 표현하기
multiple = "stack",
### 비율로 표시
stat = "density",
### 막대 너비 : 0.6은 원본 100% 사이즈에서 60% 축소한 너비사이즈
shrink = 0.6)
plt.show()
승하차정류장별 버스내체류시간(분) 상위 30건 시각화 분석
df_bus_card_tot
### 구간(승차정류장 ~ 하차정류장)별 버스내체류시간(분) sum() (그룹화)하기
### - 내림차순 정렬
### - 상위 30개 추출
# df_temp3 = pd.DataFrame()
# df_temp3["승차정류장"] = df_bus_card_tot["승차정류장"]
# df_temp3["하차정류장"] = df_bus_card_tot["하차정류장"]
# df_temp3["버스내체류시간(분)"] = df_bus_card_tot["버스내체류시간(분)"]
# df_temp3
df_temp3 = pd.DataFrame()
df_temp3["승하차정류장"] = df_bus_card_tot["승차정류장"] + "-->"+ \
df_bus_card_tot["하차정류장"]
df_temp3["버스내체류시간"] = df_bus_card_tot["버스내체류시간(분)"]
df_temp3
# ### 그룹화 하기
# df_temp3 = df_temp.groupby(["승차정류장", "하차정류장"], as_index=False).sum()
# df_temp3 = df_temp3.sort_values(by=["버스내체류시간(분)"], ascending=False)
# df_temp3.head(30)
### 승하차정류장별 체류시간 그룹화하기
df_temp_gp = df_temp3.groupby(["승하차정류장"], as_index=False).sum()
df_temp_gp = df_temp_gp.sort_values(by=["버스내체류시간"], ascending=False)
### 상위 30건 추출하기
df_temp_30 = df_temp_gp.head(30)
df_temp_30
선그래프 시각화 하기
plt.figure(figsize=(12,4))
plt.title("승하차정류장별 버스내 체류시간 분석")
### 선그래프
plt.plot(df_temp_30["승하차정류장"], df_temp_30["버스내체류시간"])
### x축 및 y축 제목넣기
plt.xlabel("승하차정류장")
plt.ylabel("버스내체류시간(분)")
### x축의 값의 기울기를 이용하여 조정하기
# - xticks() : x축을 컨트롤하는 함수
plt.xticks(rotation=290)
### 격자선 표시하기
plt.grid(True)
plt.show()
"""
(해석)
- 시외버스터미널 --> 죽도시장으로 가는 노선에서 승하차가 많은 것으로 보인다.
노선 중이 많은지 종점에서 많이 내리는지 확인이 필요하다.
- 죽도시장을 종점으로 둔 버스가 많은 것으로 보이지만 종점에서 출발하는 버스는 데이터 확인이 필요하다.
-
"""
728x90
반응형