728x90
반응형
안녕하세요!
이 프로젝트에서는 버스교통카드 데이터를 전처리하고 시각화하여 도시의 교통 패턴 및 특징을 파악해보려고 합니다. 버스카드 데이터에는 다양한 정보가 담겨 있으며, 이를 분석함으로써 도시의 교통 이용 패턴, 인기 정류장, 시간대별 이용량 등을 확인할 수 있을 것입니다.
전처리 작업을 통해 데이터를 깔끔하게 정리하고, 시각화를 통해 통계적인 패턴이나 관계를 살펴볼 예정입니다. 이를 통해 도시 교통에 대한 통찰력을 얻는데 도움이 될 것이라 기대합니다.
프로젝트를 통해 쌓인 경험과 발견한 흥미로운 사실들을 공유하며 함께 성장해보도록 하겠습니다. 시작해봅시다!
In [224]:
## 라이브러리 정의하기
import pandas as pd
In [225]:
### 사용할 데이터 읽어오기
# 데이터 프레임 변수명 : 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))
842608
In [226]:
df_bus_card_tot.head(1)
Out[226]:
승차시각 | 하차시각 | 승객연령 | 환승여부 | 추가운임여부 | 승차정류장 | 하차정류장 | 버스내체류시간(분) | 기준년도 | 기준월 | 기준일 | 기준시간 | 기준시간(분) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2020-01-02 05:10:49 | 2020-01-02 05:18:44 | 일반 | N | N | 양덕차고지 | 동부초등학교 | 7.92 | 2020 | 1 | 2 | 5 | 10 |
In [227]:
df_bus_card_tot.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 842608 entries, 0 to 842607
Data columns (total 13 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 승차시각 842608 non-null object
1 하차시각 842608 non-null object
2 승객연령 841683 non-null object
3 환승여부 842608 non-null object
4 추가운임여부 842608 non-null object
5 승차정류장 842608 non-null object
6 하차정류장 842608 non-null object
7 버스내체류시간(분) 842608 non-null float64
8 기준년도 842608 non-null int64
9 기준월 842608 non-null int64
10 기준일 842608 non-null int64
11 기준시간 842608 non-null int64
12 기준시간(분) 842608 non-null int64
dtypes: float64(1), int64(5), object(7)
memory usage: 83.6+ MB
In [228]:
df_bus_card_tot.describe()
Out[228]:
버스내체류시간(분) | 기준년도 | 기준월 | 기준일 | 기준시간 | 기준시간(분) | |
---|---|---|---|---|---|---|
count | 842608.000000 | 842608.0 | 842608.000000 | 842608.000000 | 842608.000000 | 842608.000000 |
mean | 16.737849 | 2020.0 | 1.597461 | 14.198309 | 13.474835 | 29.137839 |
std | 12.423396 | 0.0 | 0.679274 | 8.488398 | 4.213562 | 17.291947 |
min | 0.020000 | 2020.0 | 1.000000 | 1.000000 | 0.000000 | 0.000000 |
25% | 7.830000 | 2020.0 | 1.000000 | 7.000000 | 10.000000 | 14.000000 |
50% | 13.700000 | 2020.0 | 1.000000 | 13.000000 | 13.000000 | 29.000000 |
75% | 22.220000 | 2020.0 | 2.000000 | 21.000000 | 17.000000 | 44.000000 |
max | 89.980000 | 2020.0 | 3.000000 | 31.000000 | 23.000000 | 59.000000 |
In [229]:
### 데이터 라이브러리
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")
# plt.rd("font", family = "AppleGothic")
### 그래프 내에 마이너스 표시- 기호 적용하기
plt.rcParams["axes.unicode_minus"] = False
기준월 및 기준일자별 버스 이용량 시각화 분석¶
In [230]:
### 사용할 컬럼: 기준월 , 기준일, 승객연령
# - 사용할 집계함수 : count
# 히트맵 , 컬러맵
# 이용량 집계를 위한 함수 : pivot_table() 데이터 그래프를 표를 그릴 것이다. -> 히트맵 시각화 시 데이터 생성
# 사용할 그래프: 히트맵(hitmap)\
# 데이터 count 집계하기
# -y축: index
# x축: columns
# value
# aggfunc
# 집계 count (승객연령)
df_pivot=df_bus_card_tot.pivot_table(index = "기준월",
columns = "기준일",
values = "승객연령",
aggfunc = "count")
df_pivot
Out[230]:
기준일 | 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 |
3 rows × 31 columns
결측치 (NaN)처리하기¶
In [231]:
### 모든 결측치(NaN)는 0으로 대체하기
df_pivot=df_pivot.fillna(0)
df_pivot
Out[231]:
기준일 | 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 | 0.0 | 0.0 |
3 | 2399.0 | 6538.0 | 5691.0 | 5976.0 | 5828.0 | 6150.0 | 4111.0 | 2826.0 | 6879.0 | 5336.0 | ... | 0.0 | 0.0 | 0.0 | 131.0 | 2889.0 | 4976.0 | 3868.0 | 1241.0 | 5143.0 | 2487.0 |
3 rows × 31 columns
히트맵 시각화¶
In [210]:
### 그래프 전체너비, 높이 설정
plt.figure(figsize=(20,10))
# 그래프 제목넣기
plt.title("기준일 및 기준일자별 버스 이용량 분석")
### 히트맵 그리기: 히트맵은 seaborn 라이브러리에 있습니다
# annot : False는 집계값 숨기기, True는 집계값 보이기
# fmt: ".0f"는 소수점 1까지의 보이기
# cmap : 분석 색상그림
#
# rocket_r
sns.heatmap(df_pivot, annot = True, fmt=".0f", cmap="cividis")
# cmap="rocket_r" 파이썬 히트맵 종류 컬러맵
# 그래프 보여주기
plt.show()
"""
-1~3월 까지의 이용량을 분석한 결과 1월에 가장많은 이용량을 나타내고 있으며, 2월에서 3월로 가면서 이용량이 점진적으로 줄어들고 있는것으로 확인됨
-줄어드는 이유는 포항시의 특성상 외부에서 관광객의 유입에 따라 버스를 이용하는 사람들이 많을 것으로 예상됨
-이에따라, 포항시 관광객에 대한 데이터를 수집하여 해당 년월에 대한 데이터를 비교 분석해 볼 필요성이 있음
"""
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[210], line 5
2 plt.figure(figsize=(20,10))
4 # 그래프 제목넣기
----> 5 plt.title("기준일 및 기준일자별 버스 이용량 분석")
7 ### 히트맵 그리기: 히트맵은 seaborn 라이브러리에 있습니다
8 # annot : False는 집계값 숨기기, True는 집계값 보이기
9 # fmt: ".0f"는 소수점 1까지의 보이기
10 # cmap : 분석 색상그림
11 #
12 # rocket_r
14 sns.heatmap(df_pivot, annot = True, fmt=".0f", cmap="cividis")
TypeError: 'str' object is not callable
<Figure size 2000x1000 with 0 Axes>
기준일 및 기준시간별 버스 이용량 시각화 분석¶
In [232]:
df_pivot2=df_bus_card_tot.pivot_table(index = "기준일",
columns = "기준시간",
values = "승객연령",
aggfunc = "count")
df_pivot2=df_pivot2.fillna(0)
df_pivot2
df_pivot2
#0~5시까지는 버스운행시간이 아닙니다라고 명시할것#
Out[232]:
기준시간 | 0 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
기준일 | ||||||||||||||||||||
1 | 0.0 | 215.0 | 613.0 | 877.0 | 1417.0 | 1393.0 | 1518.0 | 1671.0 | 1811.0 | 1800.0 | 1825.0 | 1883.0 | 1668.0 | 1702.0 | 1476.0 | 1114.0 | 949.0 | 876.0 | 620.0 | 137.0 |
2 | 0.0 | 200.0 | 683.0 | 1422.0 | 2099.0 | 2133.0 | 2117.0 | 2293.0 | 2291.0 | 2416.0 | 2412.0 | 2532.0 | 2293.0 | 2240.0 | 1888.0 | 1201.0 | 1083.0 | 1009.0 | 762.0 | 151.0 |
3 | 0.0 | 281.0 | 890.0 | 1987.0 | 2629.0 | 2626.0 | 2668.0 | 2783.0 | 2694.0 | 2933.0 | 2903.0 | 3084.0 | 2918.0 | 2722.0 | 2404.0 | 1388.0 | 1130.0 | 1091.0 | 802.0 | 178.0 |
4 | 0.0 | 259.0 | 906.0 | 1799.0 | 2245.0 | 2222.0 | 2366.0 | 2460.0 | 2643.0 | 2602.0 | 2517.0 | 2643.0 | 2633.0 | 2511.0 | 1995.0 | 1224.0 | 1086.0 | 1014.0 | 712.0 | 157.0 |
5 | 0.0 | 240.0 | 759.0 | 1440.0 | 1919.0 | 1959.0 | 2046.0 | 2138.0 | 2237.0 | 2337.0 | 2357.0 | 2454.0 | 2308.0 | 2212.0 | 1893.0 | 1162.0 | 1026.0 | 997.0 | 654.0 | 107.0 |
6 | 0.0 | 272.0 | 959.0 | 2057.0 | 2676.0 | 2619.0 | 2423.0 | 2673.0 | 2606.0 | 2746.0 | 2890.0 | 2860.0 | 2639.0 | 2498.0 | 2071.0 | 1211.0 | 1034.0 | 901.0 | 719.0 | 146.0 |
7 | 0.0 | 234.0 | 823.0 | 1684.0 | 2294.0 | 2315.0 | 2281.0 | 2369.0 | 2310.0 | 2371.0 | 2507.0 | 2508.0 | 2444.0 | 2407.0 | 2049.0 | 1245.0 | 1054.0 | 1031.0 | 724.0 | 142.0 |
8 | 0.0 | 213.0 | 643.0 | 1334.0 | 1851.0 | 1875.0 | 1980.0 | 2174.0 | 2253.0 | 2296.0 | 2359.0 | 2389.0 | 2265.0 | 2236.0 | 1942.0 | 1186.0 | 1073.0 | 1026.0 | 722.0 | 152.0 |
9 | 0.0 | 234.0 | 718.0 | 1534.0 | 2042.0 | 2161.0 | 2161.0 | 2249.0 | 2365.0 | 2439.0 | 2517.0 | 2599.0 | 2432.0 | 2297.0 | 2000.0 | 1219.0 | 1116.0 | 1053.0 | 662.0 | 157.0 |
10 | 0.0 | 246.0 | 839.0 | 1990.0 | 2559.0 | 2582.0 | 2680.0 | 2911.0 | 2871.0 | 3015.0 | 3016.0 | 2987.0 | 2826.0 | 2703.0 | 2484.0 | 1460.0 | 1142.0 | 1115.0 | 801.0 | 186.0 |
11 | 0.0 | 252.0 | 800.0 | 1807.0 | 2359.0 | 2465.0 | 2606.0 | 2707.0 | 2761.0 | 2739.0 | 2703.0 | 2937.0 | 2646.0 | 2627.0 | 2187.0 | 1279.0 | 1101.0 | 1050.0 | 749.0 | 152.0 |
12 | 0.0 | 233.0 | 749.0 | 1481.0 | 1942.0 | 1922.0 | 2060.0 | 1969.0 | 2072.0 | 2084.0 | 2192.0 | 2287.0 | 2145.0 | 2221.0 | 1907.0 | 1198.0 | 960.0 | 965.0 | 728.0 | 144.0 |
13 | 0.0 | 255.0 | 906.0 | 1978.0 | 2693.0 | 2924.0 | 2886.0 | 3024.0 | 2908.0 | 3156.0 | 2971.0 | 3204.0 | 2884.0 | 2810.0 | 2505.0 | 1320.0 | 1208.0 | 1081.0 | 797.0 | 155.0 |
14 | 0.0 | 192.0 | 714.0 | 1596.0 | 2227.0 | 2244.0 | 2233.0 | 2434.0 | 2507.0 | 2480.0 | 2604.0 | 2548.0 | 2485.0 | 2416.0 | 2281.0 | 1231.0 | 1043.0 | 988.0 | 722.0 | 146.0 |
15 | 1.0 | 194.0 | 554.0 | 1266.0 | 1830.0 | 1994.0 | 2047.0 | 2333.0 | 2281.0 | 2373.0 | 2259.0 | 2337.0 | 2198.0 | 2209.0 | 1783.0 | 1072.0 | 960.0 | 897.0 | 682.0 | 131.0 |
16 | 0.0 | 138.0 | 478.0 | 1065.0 | 1505.0 | 1609.0 | 1727.0 | 1802.0 | 1812.0 | 1957.0 | 1935.0 | 1921.0 | 1860.0 | 1882.0 | 1531.0 | 973.0 | 950.0 | 849.0 | 611.0 | 119.0 |
17 | 0.0 | 179.0 | 670.0 | 1523.0 | 2180.0 | 2265.0 | 2161.0 | 2365.0 | 2369.0 | 2392.0 | 2448.0 | 2600.0 | 2377.0 | 2186.0 | 1929.0 | 1061.0 | 933.0 | 918.0 | 626.0 | 114.0 |
18 | 0.0 | 178.0 | 522.0 | 1170.0 | 1677.0 | 1736.0 | 1742.0 | 1881.0 | 2149.0 | 2146.0 | 2061.0 | 2088.0 | 1934.0 | 1865.0 | 1707.0 | 1090.0 | 881.0 | 912.0 | 624.0 | 144.0 |
19 | 0.0 | 164.0 | 497.0 | 1075.0 | 1522.0 | 1459.0 | 1564.0 | 1666.0 | 1853.0 | 1923.0 | 1845.0 | 2079.0 | 1836.0 | 1791.0 | 1526.0 | 980.0 | 828.0 | 809.0 | 550.0 | 113.0 |
20 | 0.0 | 194.0 | 664.0 | 1522.0 | 2122.0 | 2204.0 | 2260.0 | 2416.0 | 2385.0 | 2328.0 | 2366.0 | 2330.0 | 2097.0 | 2095.0 | 1759.0 | 949.0 | 822.0 | 749.0 | 551.0 | 120.0 |
21 | 0.0 | 174.0 | 642.0 | 1478.0 | 1954.0 | 1969.0 | 1931.0 | 1865.0 | 1925.0 | 1911.0 | 2018.0 | 2024.0 | 1836.0 | 1843.0 | 1668.0 | 921.0 | 830.0 | 727.0 | 537.0 | 131.0 |
22 | 0.0 | 169.0 | 518.0 | 1202.0 | 1566.0 | 1711.0 | 1642.0 | 1861.0 | 1896.0 | 1811.0 | 1773.0 | 1740.0 | 1613.0 | 1508.0 | 1351.0 | 749.0 | 615.0 | 631.0 | 434.0 | 93.0 |
23 | 0.0 | 132.0 | 408.0 | 870.0 | 1205.0 | 1310.0 | 1345.0 | 1449.0 | 1552.0 | 1705.0 | 1614.0 | 1693.0 | 1550.0 | 1393.0 | 1206.0 | 919.0 | 670.0 | 644.0 | 510.0 | 122.0 |
24 | 0.0 | 163.0 | 437.0 | 875.0 | 1004.0 | 1105.0 | 1126.0 | 1029.0 | 1056.0 | 1159.0 | 1191.0 | 1215.0 | 1041.0 | 971.0 | 863.0 | 586.0 | 455.0 | 375.0 | 315.0 | 78.0 |
25 | 0.0 | 71.0 | 311.0 | 526.0 | 594.0 | 591.0 | 583.0 | 658.0 | 693.0 | 729.0 | 776.0 | 813.0 | 844.0 | 731.0 | 736.0 | 535.0 | 540.0 | 403.0 | 302.0 | 87.0 |
26 | 0.0 | 125.0 | 388.0 | 671.0 | 867.0 | 858.0 | 976.0 | 969.0 | 1070.0 | 1256.0 | 1312.0 | 1365.0 | 1331.0 | 1248.0 | 1215.0 | 713.0 | 604.0 | 527.0 | 406.0 | 102.0 |
27 | 0.0 | 157.0 | 458.0 | 824.0 | 1066.0 | 1040.0 | 968.0 | 1075.0 | 1058.0 | 1074.0 | 1324.0 | 1281.0 | 1200.0 | 1154.0 | 1037.0 | 628.0 | 586.0 | 491.0 | 361.0 | 79.0 |
28 | 0.0 | 200.0 | 614.0 | 1173.0 | 1581.0 | 1577.0 | 1514.0 | 1538.0 | 1734.0 | 1818.0 | 1817.0 | 2057.0 | 1884.0 | 1745.0 | 1583.0 | 866.0 | 770.0 | 752.0 | 492.0 | 105.0 |
29 | 0.0 | 146.0 | 467.0 | 1087.0 | 1421.0 | 1502.0 | 1481.0 | 1541.0 | 1669.0 | 1753.0 | 1672.0 | 1614.0 | 1475.0 | 1338.0 | 1238.0 | 741.0 | 689.0 | 670.0 | 417.0 | 111.0 |
30 | 0.0 | 84.0 | 321.0 | 804.0 | 1060.0 | 1163.0 | 1571.0 | 1638.0 | 1592.0 | 1574.0 | 1703.0 | 1879.0 | 1785.0 | 1724.0 | 1510.0 | 776.0 | 694.0 | 607.0 | 452.0 | 74.0 |
31 | 0.0 | 121.0 | 403.0 | 856.0 | 1140.0 | 1157.0 | 1176.0 | 1225.0 | 1409.0 | 1468.0 | 1416.0 | 1673.0 | 1512.0 | 1466.0 | 1227.0 | 736.0 | 617.0 | 565.0 | 421.0 | 85.0 |
In [233]:
plt.figure(figsize=(20,10))
# 그래프 제목넣기
plt.title("기준일 및 기준일자별 버스 이용량 분석")
### 히트맵 그리기: 히트맵은 seaborn 라이브러리에 있습니다
# annot : False는 집계값 숨기기, True는 집계값 보이기
# fmt: ".0f"는 소수점 1까지의 보이기
# cmap : 분석 색상그림
#
# rocket_r
sns.heatmap(df_pivot2, annot = True, fmt=".0f", cmap="coolwarm")
# cmap="rocket_r" 파이썬 히트맵 종류 컬러맵
# 그래프 보여주기
plt.show()
"""
-버스 이용량에 대한 분석결과,
-일반적으로 출/퇴근 시간에 많아야 할 버스이용량이 , 포항시의 경우 오후 시간대에 이용량이 밀집되어 있음
-특히 오후 1시 3시에 높은 이용량을 나타내고 있음
- 이는 출/퇴근 시간에 자가 차량을 이용하는 사람이 많을 수도 있다는 예상을 할 수 있으며,
-인구 분포가 노령인구가 많기에 오후에 이용자가 많을 수도 있음
-따라서 포항시 인구현황 데이터, 경제활동 인구 분석을 통해 비교 분석이 가능할 것으로 예상됨
-또한 해당 이용량이 높은 시간대에 노선을 확인하여 특성 확인도 필요할 것으로 예상됨
"""
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[233], line 4
1 plt.figure(figsize=(20,10))
3 # 그래프 제목넣기
----> 4 plt.title("기준일 및 기준일자별 버스 이용량 분석")
6 ### 히트맵 그리기: 히트맵은 seaborn 라이브러리에 있습니다
7 # annot : False는 집계값 숨기기, True는 집계값 보이기
8 # fmt: ".0f"는 소수점 1까지의 보이기
9 # cmap : 분석 색상그림
10 #
11 # rocket_r
13 sns.heatmap(df_pivot2, annot = True, fmt=".0f", cmap="coolwarm")
TypeError: 'str' object is not callable
<Figure size 2000x1000 with 0 Axes>
In [ ]:
df_bus_card_tot["승객연령"].unique()
기준시간/ 기준시간(분)¶
In [ ]:
#기준시간, 기준분별
df_pivot3=df_bus_card_tot.pivot_table(index = "기준시간",
columns = "기준시간(분)",
values = "승객연령",
aggfunc = "count")
df_pivot3=df_pivot3.fillna(0)
df_pivot3
plt.figure(figsize=(20,10))
# 그래프 제목넣기
plt.title("기준시간 및 기준시간(분) 버스 이용량 분석")
sns.heatmap(df_pivot3, annot = True, fmt=".0f", cmap="coolwarm")
# cmap="rocket_r" 파이썬 히트맵 종류 컬러맵
# 그래프 보여주기
plt.show()
"""
-버스 이용량에 대한 분석결과,
-일반적으로 출/퇴근 시간에 많아야 할 버스이용량이 , 포항시의 경우 오후 시간대에 이용량이 밀집되어 있음
-아침 7시 30분부터 이용량이 많아지고 우후 6시 40분 이후로 줄어든다.
-특히 오후 3시에 높은 이용량을 나타내고 있음
- 이는 출/퇴근 시간에 자가 차량을 이용하는 사람이 많을 수도 있다는 예상을 할 수 있으며,
-인구 분포가 노령인구가 많기에 오후에 이용자가 많을 수도 있음
-따라서 포항시 인구현황 데이터, 경제활동 인구 분석을 통해 비교 분석이 가능할 것으로 예상됨
-또한 해당 이용량이 높은 시간대에 노선을 확인하여 특성 확인도 필요할 것으로 예상됨
// 출근시간대의 버스이용량을 볼 때 ㅇ오전 7시 55분 ~ 8시 10분사이에 이용량이 많은것으로 보이며 퇴근 시간대의 경우에는 오후 6시 ~6시20분까지 이용량이
많은 것으로 보임
- 특히 오후 3시간 20분까지 버스이용량이 매우 크게 나타나고 있음
- 오후 시간대 이용자에 대한 추가 확인은 필요할 것으로 보임
"""
기준일 및 시간별 버스내체류시간 (분) 시각화 분석¶
In [ ]:
#기준시간, 기준분별
df_pivot4=df_bus_card_tot.pivot_table(index = "기준일",
columns = "기준시간",
values = "버스내체류시간(분)",
aggfunc = "mean")
df_pivot4=df_pivot4.fillna(0)
df_pivot4
plt.figure(figsize=(20,10))
# 그래프 제목넣기
plt.title("기준일 및 시간별 버스내체류시간 (분) 시각화 분석")
heatmap= sns.heatmap(df_pivot4, annot = True, fmt=".3f", cmap="coolwarm")
# 분석에서는 소수점 세자리 까지 쓴다.
# plt.show()
heatmap_variable = heatmap.get_figure()
"""
- 오후 5시에 체류시간이 제일 많은 편,
- 매달 1일에도 체류시간이 많음
- 퇴근 시간이 끝나는 7시 무렵부터 체류시간이 줄어드는 것으로 보임
매월 1일에 장거리 이용자가 다소 분포하고 있으며
-오전 5시부터 8시를 전후로 장거리 이용자가 증가하고 있음
-오후 5시에 장거리 이용자가 매우 많게 나타남
이는 포항시 주변 상권(경제활동인구)의 출/퇴근 시간의 영향을 받을 수 도 있을 것으로 예상됨
_7시 이후로는 장거리 이용자는 보편적으로 나타나고 있으며
위에서 분석한 기준일 및 시간별 이용량 분석에서 확인한 바와 같이 7시 이후의 버스 이용량도 급격하게 줄어드는 것으로 보아,
저녁 시간 버스이용이 현저히 낮은 것으로 여겨짐
장거리 이용자가 많은 시간대에 급행버스의 도입에 대한 추가 확인은 필요할 것으로 여겨짐
"""
#분석가는 결정을 하는 것이 아니라 요청을 받아 분석을 할 때는 분석의견을 준다.
In [ ]:
heatmap_variable
시간대 및 승객연령별 버스 내 체류 시간 (분) 시각화 (막대그래프)¶
In [213]:
df_temp=pd.DataFrame()
### 필요한 데이터: 기준시간 ,승객연령, 버스내 체류시간(분)
# df_temp=df_bus_card_tot[["기준시간","승객연령","버스내체류시간(분)"]]
df_temp["기준시간"]= df_bus_card_tot["기준시간"]
df_temp["승객구분"]= df_bus_card_tot["승객연령"]
df_temp["버스내체류시간(분)"]= df_bus_card_tot["버스내체류시간(분)"]
df_temp
Out[213]:
기준시간 | 승객구분 | 버스내체류시간(분) | |
---|---|---|---|
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 |
842608 rows × 3 columns
In [214]:
## 승객 빈도 확인하기
df_temp["승객구분"].value_counts()
Out[214]:
승객구분
일반 772599
청소년 59037
어린이 10047
Name: count, dtype: int64
In [215]:
### 그룹화 하기
df_temp2 = df_temp.groupby(["기준시간","승객구분"],as_index=False).sum()
df_temp2=df_temp2.sort_values(by=["버스내체류시간(분)"], ascending=False)
df_temp2
Out[215]:
기준시간 | 승객구분 | 버스내체류시간(분) | |
---|---|---|---|
32 | 15 | 일반 | 1056674.44 |
29 | 14 | 일반 | 1040204.89 |
26 | 13 | 일반 | 1031291.25 |
23 | 12 | 일반 | 983094.10 |
20 | 11 | 일반 | 981817.91 |
38 | 17 | 일반 | 975528.48 |
35 | 16 | 일반 | 951082.64 |
17 | 10 | 일반 | 942751.68 |
14 | 9 | 일반 | 938277.61 |
11 | 8 | 일반 | 910769.28 |
41 | 18 | 일반 | 796108.03 |
8 | 7 | 일반 | 648023.50 |
44 | 19 | 일반 | 416206.32 |
47 | 20 | 일반 | 341758.21 |
50 | 21 | 일반 | 299263.68 |
5 | 6 | 일반 | 286988.34 |
53 | 22 | 일반 | 200354.69 |
39 | 17 | 청소년 | 98164.80 |
2 | 5 | 일반 | 94647.44 |
36 | 16 | 청소년 | 90185.74 |
27 | 13 | 청소년 | 87390.24 |
33 | 15 | 청소년 | 83217.81 |
24 | 12 | 청소년 | 80840.85 |
30 | 14 | 청소년 | 77838.57 |
42 | 18 | 청소년 | 73397.19 |
21 | 11 | 청소년 | 63054.02 |
18 | 10 | 청소년 | 50939.20 |
45 | 19 | 청소년 | 44732.34 |
15 | 9 | 청소년 | 42069.05 |
12 | 8 | 청소년 | 39688.02 |
9 | 7 | 청소년 | 38780.76 |
48 | 20 | 청소년 | 38437.69 |
51 | 21 | 청소년 | 37287.53 |
56 | 23 | 일반 | 37165.81 |
54 | 22 | 청소년 | 24907.53 |
25 | 13 | 어린이 | 16687.73 |
28 | 14 | 어린이 | 16344.69 |
34 | 16 | 어린이 | 15597.86 |
22 | 12 | 어린이 | 14847.81 |
37 | 17 | 어린이 | 14540.63 |
31 | 15 | 어린이 | 14266.86 |
6 | 6 | 청소년 | 13881.18 |
19 | 11 | 어린이 | 12646.40 |
16 | 10 | 어린이 | 10425.02 |
40 | 18 | 어린이 | 10214.98 |
13 | 9 | 어린이 | 8834.51 |
10 | 8 | 어린이 | 7341.05 |
43 | 19 | 어린이 | 6316.64 |
46 | 20 | 어린이 | 5174.41 |
7 | 7 | 어린이 | 3520.94 |
49 | 21 | 어린이 | 3404.90 |
3 | 5 | 청소년 | 2897.19 |
52 | 22 | 어린이 | 2636.52 |
57 | 23 | 청소년 | 2493.28 |
4 | 6 | 어린이 | 712.77 |
55 | 23 | 어린이 | 154.96 |
1 | 5 | 어린이 | 152.12 |
0 | 0 | 일반 | 12.93 |
In [216]:
#### groupby 이후의 head()의역할
# 그룹단위로 조회됨
# head(1): 각 그룹의 첫번째 값을 조회시켜줍니다.
df_temp2.head(1)
Out[216]:
기준시간 | 승객구분 | 버스내체류시간(분) | |
---|---|---|---|
32 | 15 | 일반 | 1056674.44 |
In [217]:
### 데이터의 행과 열을 교환하는 법
df_temp2.transpose()
Out[217]:
32 | 29 | 26 | 23 | 20 | 38 | 35 | 17 | 14 | 11 | ... | 46 | 7 | 49 | 3 | 52 | 57 | 4 | 55 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
기준시간 | 15 | 14 | 13 | 12 | 11 | 17 | 16 | 10 | 9 | 8 | ... | 20 | 7 | 21 | 5 | 22 | 23 | 6 | 23 | 5 | 0 |
승객구분 | 일반 | 일반 | 일반 | 일반 | 일반 | 일반 | 일반 | 일반 | 일반 | 일반 | ... | 어린이 | 어린이 | 어린이 | 청소년 | 어린이 | 청소년 | 어린이 | 어린이 | 어린이 | 일반 |
버스내체류시간(분) | 1056674.44 | 1040204.89 | 1031291.25 | 983094.1 | 981817.91 | 975528.48 | 951082.64 | 942751.68 | 938277.61 | 910769.28 | ... | 5174.41 | 3520.94 | 3404.9 | 2897.19 | 2636.52 | 2493.28 | 712.77 | 154.96 | 152.12 | 12.93 |
3 rows × 58 columns
그래프 시각화 하기¶
In [218]:
fig = plt.figure(figsize=(25,10))
# plt.title("시간 및 승객 구분별 버스내 체류시간(분단위) 분석")
### hue : x축 및 y축을 기준을 비교할 대상 컬럼 지정(범주형 데이터를 보통사용) 빈도
sns.barplot(x="기준시간", y="버스내체류시간(분)", hue="승객구분", data = df_temp2)
plt.show()
In [219]:
### 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은 막대의 너비를 축소하는 비율을 나타냅니다.
shrink=0.6)
plt.show()
In [220]:
"""
구간 (승차정류장~하차정류장) 까지의 버스내 체류시간을 이용하여
체류시간이 많은 구간을 확인하기
"""
Out[220]:
'\n구간 (승차정류장~하차정류장) 까지의 버스내 체류시간을 이용하여\n체류시간이 많은 구간을 확인하기\n'
In [221]:
### 구간 (승차정류장- 하차 정류장 )별 버스내 체류시간분 , sum() , 그룹화 하기
## 내립차순 정렬
### 상위 30개 추출
In [222]:
df_temp3=pd.DataFrame()
# df_temp3["승차정류장"]= df_bus_card_tot["승차정류장"]
# df_temp3["하차정류장"]= df_bus_card_tot["하차정류장"]
df_temp3["구간"]= (df_bus_card_tot["승차정류장"]+"->"+df_bus_card_tot["하차정류장"])
df_temp3["버스내체류시간(분)"]= df_bus_card_tot["버스내체류시간(분)"]
df_temp3.head(30)
Out[222]:
구간 | 버스내체류시간(분) | |
---|---|---|
0 | 양덕차고지->동부초등학교 | 7.92 |
1 | 문덕사거리->새마을금고해도지점 | 32.18 |
2 | 문덕사거리->성우오토모티브 | 3.68 |
3 | 부영사랑3차->오거리 | 34.48 |
4 | 문덕온천->용덕사거리 | 4.48 |
5 | 법원검찰청->죽도시장 | 22.90 |
6 | 삼성쉐르빌->북부시장/채움병원 | 17.30 |
7 | 두호동주민센터->죽도시장 | 7.58 |
8 | 장량휴먼시아->두호초등학교 | 10.72 |
9 | 풍림아이원->중앙상가 | 18.68 |
10 | 대궁꿈마을 아파트->새마을금고해도지점 | 23.83 |
11 | 남광하우스토리->환호여중 | 3.83 |
12 | 영일고등학교->시외버스터미널 | 7.87 |
13 | 장량5단지->죽도시장 | 19.05 |
14 | 오천환승센터->용덕사거리 | 3.15 |
15 | 동해빌라->형산로터리 | 6.80 |
16 | 대송교회->단지주유소 | 6.92 |
17 | 대송초등학교->송림초등학교 | 16.88 |
18 | 남부경찰서->시외버스터미널 | 4.08 |
19 | 용덕사거리->대해시장 | 16.67 |
20 | 장성초등학교->죽도시장 | 12.93 |
21 | 장성초등학교->북부시장/채움병원 | 8.95 |
22 | 해병대서문->죽도시장 | 22.23 |
23 | 두호초등학교->중앙상가 | 10.87 |
24 | 시외버스터미널->홈플러스 | 3.33 |
25 | 형산시장->동일교회 | 0.58 |
26 | 동해빌라->시외버스터미널 | 10.67 |
27 | 동해빌라->고속버스터미널 | 15.47 |
28 | 환호해맞이그린빌->시외버스터미널 | 16.83 |
29 | 장흥동사거리->남부경찰서 | 7.18 |
In [223]:
###승하차 정류장별 체류시간 그룹화하기
df_temp3 = df_temp3.groupby(["구간"],as_index=False).sum()
df_temp3=df_temp3.sort_values(by=["버스내체류시간(분)"], ascending=False)
df_temp3
Out[223]:
구간 | 버스내체류시간(분) | |
---|---|---|
14059 | 시외버스터미널->죽도시장 | 107186.11 |
27379 | 흥해환승센터->죽도시장 | 66116.34 |
27385 | 흥해환승센터->중앙상가 | 48417.60 |
21204 | 죽도시장->흥해환승센터 | 44503.33 |
13820 | 시외버스터미널->구룡포환승센터 | 41560.22 |
... | ... | ... |
4376 | 노당1리->노당1리 | 0.17 |
4359 | 노당 화룡사->노당 화룡사 | 0.17 |
16195 | 영보빌라->영보빌라 | 0.17 |
1049 | 감포진성숯불가든->감포진성숯불가든 | 0.17 |
19613 | 장기->장기파출소 | 0.10 |
27437 rows × 2 columns
In [ ]:
fig = plt.figure(figsize=(10,10))
# plt.title("시간 및 승객 구분별 버스내 체류시간(분단위) 분석")
### hue : x축 및 y축을 기준을 비교할 대상 컬럼 지정(범주형 데이터를 보통사용) 빈도
sns.barplot(x="버스내체류시간(분)", y="승차정류장", hue="승차정류장", data = df_temp3.head(30))
plt.show()
선그래프 시각화하기¶
In [212]:
plt.figure(figsize=(12,4))
# plt.title("승하차정류장별 버스내 체류시간 분석")
## 선그래프
plt.plot(df_temp3.head(30)["구간"],df_temp3.head(30)["버스내체류시간(분)"])
# x축 및 y축 제목 넣기
plt.xlabel("승하차정류장")
plt.ylabel("버스내체류시간(분)")
## x축의 값의 기울기를 이용하여 조정하기
# -xticks(): x축을 컨트롤하는 함수
plt.xticks(rotation=90)
#격자선표시하기
plt.grid(True)
plt.show()
In [ ]:
728x90
반응형
'파이썬' 카테고리의 다른 글
수집한 영화 데이터 전처리 및 시각화 (4) | 2023.12.04 |
---|---|
영화 데이터 수집 웹 크롤링 (2) | 2023.12.04 |
전체파일 통합하기 (1) | 2023.11.30 |
데이터 전처리 연습 (2) | 2023.11.29 |
판다스를 활용한 데이터 전처리 (1) | 2023.11.28 |