15주차 목 1130(데이터베이스_수집_가공_2) :: newb

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 15주차 목 1130(데이터베이스_수집_가공_2)
    광주인력개발원 일일포스팅(메모장) 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
    반응형
Designed by Tistory.