데이터분석 교통데이터 시각화
import pandas as pd
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)
데이터를 다룰땐 결측치와 이상치(기초통계)를 확인해야한다. 해당 자료는 이상이 없으니 우선 넘어가자.(글이 길어진다)
데이터를 시각화하기위한 기본적인것들을 임포트해준다.
### 시각화 라이브러리 matplotlib는 둔탁한 시각화 seaborn은 파스텔톤의 부드러운 시각화
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
### 그래프 내에 한글이 포함된 경우 폰트 처리가 필요함.
# - 한글 깨짐 방지를 위해
### 폰트 환경설정 라이브러리
from matplotlib import font_manager, rc
### 운영체제 확인을 위한 라이브러리
# import platform
plt.rc("font", family = "Malgun Gothic")
### Mac
# plt.rc("font", family = "AppleGothic")
### 그래프 내에 마이너스(-) 표시 기호 적용하기
plt.rcParams["axes.unicode_minus"] = False
또한 임포트 이후 기본적인 설정을해준다. 글씨체는 맑은고딕으로 했고, 플로팅 시 유니코드 마이너스 기호를 올바르게 표시하도록 하는 설정이다.
기준월 및 기준일자별 버스 이용량 시각화 분석
### 사용할 컬럼 : 기준월, 기준일, 승객연령
# - 사용할 집계함수 : count
# - heat map을 사용할건데, 데이터가 x축1 y축1 데이터표시할것 1 해서 3개가 필요하다.
# - 이용량 집계를 위한 함수 : pivot_table() → 히트맵 시각화시 데이터 생성
# - 사용할 크래프 : 히트맵(heatmap)
### 데이터 count 집계하기
# - y축 : index
# - x축 : columns
# - 집계 : count(승객연령)
df_pivot = df_bus_card_tot.pivot_table(index = "기준월",
columns = "기준일",
values = "승객연령",
aggfunc = "count")
df_pivot
결측치(NaN) 처리하기
# 모든 결측치(NaN)은 0으로 대체하기
df_pivot = df_pivot.fillna(0)
df_pivot
히트맵 시각화
파이썬의 시각화는 레이어를 쌓아서 위에서 보는방식이다. 즉 여러겹으로 겹쳐서 보여주되, 우리는 결과물만 보는 방식이기때문에 순서에 맞게 잘 해야한다.
# 그래프 전체 너비, 높이 설정
plt.figure(figsize=(20,10))
# 그래프 제목 넣기
plt.title("기준월 및 기준일자별 버스 이용량 분석")
# - annot : False는 집계값 숨기기, True는 집계값 보이기
# - fmt : .0f 소숫점 0자리까지 보이기
# - cmap : 컬러 색상 그룹
sns.heatmap(df_pivot, annot = True, fmt=".0f", cmap="rocket_r")
### 그래프 보여줘~~~
plt.show()
이런식으로 시각화가 완료된다. 이후에는 본인의 해석도 달아줘야한다.
(해석)
2020년 1월 24일부터 27일까지 설날로 확인됨.
- 1월~3월까지의 이용량을 분석한 결과 1월에 가장 많은 이용량을 나타내고 있으며,
2월에서 3월로 가면서 이용량이 점진적으로 감소하는 것으로 확인 됨.
- 감소 이유는 포항시의 특성상 외부 관광객의 유입에 따라 버스 이용객이 결정되기 때문일것으로 예상 됨.
- 이에 포항시 관광객 데이터를 수집하여 2020년 해당 년월에 대한 데이터를 비교 분석해 볼 필요성이 있음.
기준일 및 기준시간별 버스 이용량 시각화 분석
df_pivot = df_bus_card_tot.pivot_table(index = "기준일",
columns = "기준시간",
values = "승객연령",
aggfunc = "count")
df_pivot
# 12시는 버스운행시간 마지막인것으로 예상 됨.
df_pivot = df_pivot.fillna(0)
df_pivot
plt.figure(figsize=(20,10))
## 그래프 제목 넣기
plt.title("기준일 및 기준시간별 버스 이용량 분석")
## 히트맵 그리기 : 히트맵은 seaborn 라이브러리에 있습니다. python heatmap cmap 구글검색 종류
# - annot : False는 집계값 숨기기, True는 집계값 보이기
# - fmt : .0f 소숫점 0자리까지 보이기
# - cmap : 컬러 색상 그룹
sns.heatmap(df_pivot, annot = True, fmt=".0f", cmap="rocket_r")
## 그래프 보여주기
plt.show()
해석
- 버스 이용량에 대한 분석 결과,
- 일반적으로 출/퇴근 시간에 많아야 할 버스 이용량이, 포항시의 경우 오후시간대에 밀집 돼있음.
- 특히, 오후 1시, 3시에 높은 이용량을 나타내고 있음.
- 이는 출/퇴근 시간에 자가 차량을 이용하는 사람이 많을 수도 있다는 예상을 할 수 있으며,
노령인구가 많은지 인구분포를 확인해야 할 필요가 있어보임.
- 따라서, 포항시 인구현황 데이터, 경제활동인구 분석을 통해 비교 분석이 가능할 것으로 예상 됨.
- 또한, 해당 이용량이 많은 시간대의 노선을 확인하여 특성 확인도 필요할 것으로 보임.
시간대 및 승객연령별 버스내체류시간(분) 시각화(막대그래프)
df_temp = pd.DataFrame()
df_temp["기준시간"] = df_bus_card_tot["기준시간"]
df_temp["승객구분"] = df_bus_card_tot["승객연령"]
df_temp["버스내체류시간"] = df_bus_card_tot["버스내체류시간(분)"]
df_temp
우선 이 세가지를 뽑아낸다.
# 그룹화 하기
# - groupby 이후는 그룹별로 분류하는데 head의 경우는
# - 그룹단위로 조회됨
# - head(1) : 각 그룹의 첫번째 값을 조회시켜 줍니다.
df_temp2 = df_temp.groupby(["기준시간","승객구분"], as_index = False).sum()
df_temp2 = df_temp2.sort_values(by=["버스내체류시간"], ascending = False)
df_temp2
이후 그룹화한다. 그리고 transpose()를 이용하여 행과 열을 뒤집는다.
df_temp2.transpose()
fig = plt.figure(figsize=(25,10))
plt.title("시간 및 승객구분별 버스내 체류시간(분단위) 분석")
### hue : x축 및 y축을 기준으로 비교할 대상 컬럼 지정.(범주형 데이터를 보통 사용) (빈도 분석시 사용방식)
sns.barplot(x = "기준시간", y = "버스내체류시간", hue = "승객구분", data = df_temp2)
plt.show()
그리고 barplot을 이용하여 그래프를 그려주면..!
또는
# 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()
이런 방식을 이용하면
이런 그래프도 나온다.