본문 바로가기

Data Analysis/공공 데이터

[공공 데이터] 따릉이 데이터 분석 3 (EDA / 시각화 / 리뷰)

728x90

이전 내용은 아래 글에서 확인 하실 수 있습니다.

[Data Analysis/공공 데이터] - [공공 데이터] 따릉이 데이터 분석 1 (데이터 확인 / 질문하기)

 

[공공 데이터] 따릉이 데이터 분석 1 (데이터 확인 / 질문하기)

따릉이 데이터 분석 데이터 출처 : https://data.seoul.go.kr/dataList/datasetList.do 서울 열린데이터 광장에서 제공하는 서울시 공공자전거 이용현황 데이터 - Data 1 : 서울특별시 공공자전거 대..

sks8410.tistory.com

[Data Analysis/공공 데이터] - [공공 데이터] 따릉이 데이터 분석 2 (데이터 전처리)

 

[공공 데이터] 따릉이 데이터 분석 2 (데이터 전처리)

이전 내용은 아래 글에서 확인 하실 수 있습니다. [Data Analysis/공공 데이터] - [공공 데이터] 따릉이 데이터 분석 1 (데이터 확인 / 질문하기) [공공 데이터] 따릉이 데이터 분석 1 (데이터 확인 / 질

sks8410.tistory.com

4. EDA & Visualization

4-1 이동거리 / 평균 사용시간이 높은 대여소는?

# 평균 이동거리가 큰 순서대로 대여소명 확인

bike_3_moving = bike_3.groupby("대여소명_new")["이동거리"].mean().reset_index().sort_values(by = "이동거리", ascending = False)

bike_3_moving.head()

 

 

# 평균 이동거리가 큰 대여소 top20 시각화

bike_3_moving_top20 = bike_3_moving.head(20).sort_values(by = "이동거리", ascending = True)

fig = px.bar(bike_3_moving_top20, y = "대여소명_new", x = "이동거리",
             orientation = "h",             
             color = "이동거리"
            )             

fig.update_layout(
    title = dict(
        text = "<b>평균 이동거리가 큰 대여소 top20</b>",
        font_size = 20
    ),
    
    yaxis = dict(
        title = "대여소명"
    )
)

fig.show()

 

 

# 평균 사용시간이 많은 순서대로 대여소명 확인

bike_3_time = bike_3.groupby("대여소명_new")["사용시간"].mean().reset_index().sort_values(by = "사용시간", ascending = False)

bike_3_time.head()

 

 

# 평균 사용시간이 많은 대여소 top20 시각화

bike_3_time_top20 = bike_3_time.head(20).sort_values(by = "사용시간", ascending = True)

fig = px.bar(bike_3_time_top20, x = "사용시간", y = "대여소명_new", orientation = "h", color = "사용시간")

fig.update_layout(
    title = dict(
        text = "<b>평균 사용시간이 많은 대여소 Top20</b>",
        font_size = 20
    ),
    
    yaxis = dict(
        title = "대여소명"
    ),
    
    template = "plotly_white"
)

fig.show()

4-2 운동량과 이동거리의 상관관계?

# 운동량과 이동거리의 상관관계 시각화

f, ax = plt.subplots(1, 1, figsize = (18, 8))

sns.scatterplot(data = bike_3, x = "이동거리", y = "운동량")

ax.set_xlim(-10000, 150000) # x 축 범위 조정
ax.set_title("운동량과 이동거리 상관관계", size = 20)

plt.show()

  • 이동거리가 많을수록 운동량도 많다는 것을 알 수 있습니다.
# 성별 / 연령대별 이동거리와 운동량의 상관관계 시각화 (runtime = 16 sec)

import time # runtime 시간 측정

start = time.time() # 시작 시간

f, ax = plt.subplots(1, 2, figsize = (18, 8))

sns.scatterplot(data = bike_3, x = "이동거리", y = "운동량", hue = "성별", ax = ax[0])
ax[0].set_xlim(-10000, 150000) # x 축 범위 조정
ax[0].set_title("운동량과 이동거리 상관관계(성별)", size = 20)

sns.scatterplot(data = bike_3, x = "이동거리", y = "운동량", hue = "연령대코드", ax = ax[1])
ax[1].set_xlim(-10000, 150000) # x 축 범위 조정
ax[1].set_title("운동량과 이동거리 상관관계(연령대)", size = 20)

plt.show()

end = time.time() # 종료 시간
print("runtime:", end - start) # runtime 출력

  • 남성이 여성보다 이동거리가 많을수록 운동량이 많으며, 주로 20대가 이동거리 대비 운동량이 많습니다.

 4-3 따릉이를 가장 많이 이용하는 성별은?

# 따릉이를 가장 많이 이용하는 성별 확인

bike_3["성별"].value_counts()

 

 

# 따릉이를 가장 많이 이용하는 성별 시각화

bike_3_sex = bike_3["성별"].value_counts().reset_index()
bike_3_sex.columns = ["성별", "이용 수"]

fig = px.bar(bike_3_sex, x = "성별", y = "이용 수", color = "성별")

fig.update_layout(
    title = dict(
        text = "<b>성별에 따른 따릉이 이용 수</b>",
        font_size = 20
    ),
    showlegend = False
)

fig.show()

  • 남성이 여성보다 따릉이를 더 많이 이용하고 있습니다.

4-3-1 일별 / 성별에 따른 따릉이 사용시간 확인

# bike_3 데이터의 대여일자 컬럼을 연/월/일로 구분

bike_3["대여일자_연"] = bike_3["대여일자"].dt.year
bike_3["대여일자_월"] = bike_3["대여일자"].dt.month
bike_3["대여일자_일"] = bike_3["대여일자"].dt.day

bike_3.head()

 

 

# 일별 / 성별 사용시간 확인

bike_3_hour = pd.pivot_table(data = bike_3,
                             index = "대여일자_일",
                             columns = "성별",
                             values = "사용시간",
                             aggfunc = "sum")

bike_3_hour.head()

 

 

# 일별 / 성별 사용시간 시각화

layout = dict(
    title = dict(
        text = "<b>일별 / 성별에 따른 따릉이 사용시간</b>",
        font_size = 20
    ),
    
    xaxis = dict(
        title = "대여일",
        dtick = 1
    ),
    
    yaxis = dict(
        title = "사용시간"
    ),    
    
    template = "plotly_white"
)

bike_3_hour.iplot(kind = "line", layout = layout)

4-4 따릉이를 가장 많이 이용하는 연령대는?

# 따릉이를 가장 많이 이용하는 연령대 확인

bike_3["연령대코드"].value_counts()

 

 

# 따릉이를 가장 많이 이용하는 연령대 시각화

bike_3_age = bike_3["연령대코드"].value_counts().reset_index()
bike_3_age.columns = ["연령대", "이용 수"]

fig = px.bar(bike_3_age, x = "연령대", y = "이용 수", color = "연령대")

fig.update_layout(
    title = dict(
        text = "<b>연령대에 따른 따릉이 이용 수</b>",
        font_size = 20
    ),
    showlegend = False
)

fig.show()

  • 20대가 가장 따릉이를 많이 사용하고 30대 > 40대 순으로 따릉이를 많이 사용하고 있습니다.

4-4-1 일별 / 연령대별에 따른 따릉이 사용시간 확인

# 일별 / 연령대별 사용시간 확인

bike_3_age_hour = pd.pivot_table(data = bike_3,
                             index = "대여일자_일",
                             columns = "연령대코드",
                             values = "사용시간",
                             aggfunc = "sum")

bike_3_age_hour.head()

 

 

# 일별 / 연령대별 사용시간 시각화

layout = dict(
    title = dict(
        text = "<b>일별 / 연령대에 따른 따릉이 사용시간</b>",
        font_size = 20
    ),
    
    xaxis = dict(
        title = "대여일",
        dtick = 1
    ),
    
    yaxis = dict(
        title = "사용시간"
    ),    
    
    #template = "plotly_white"
)

bike_3_age_hour.iplot(kind = "line", layout = layout)

4-5 서울시 구별로 거치대 개수와 대여건수는?

# lcd 거치대와 qr 거치대 수 합하기

bike_1["총거치대수"] = bike_1["거치대수lcd"] + bike_1["거치대수qr"]

print(bike_1.shape)
bike_1.head()

 

 

# 자치구별 거치대 수 확인

bike_1_region = bike_1.groupby("자치구")["총거치대수"].sum().reset_index()
bike_1_region = bike_1_region.set_index("자치구")

bike_1_region.sort_values(by = "총거치대수", ascending = False).head()

 

 

# folium 으로 서울 지도위에 거치대 수 분포 확인

import json
import folium

geo_path = "data/skorea_municipalities_geo_simple.json" # json 파일 위치
geo_str = json.load(open(geo_path, encoding = "utf-8"))

bike_1_map = folium.Map(location = [37.5502, 126.982], zoom_start = 11, tiles = "Stamen Toner")
# location = 서울 위치
# tiles = "OpenStreetMap", "Stamen Terrain"

bike_1_map.choropleth(
    geo_data = geo_str,
    data = bike_1_region["총거치대수"],
    columns = ["자치구", "총거치대수"],
    fill_color = "YlGnBu",
    key_on = "feature.properties.name",
    legend_name = "자치구별 따릉이 총 거치대 수"
)

bike_1_map

 

 

# 대여소번호를 수치형 데이터로 변경

bike_1["대여소번호"] = pd.to_numeric(bike_1["대여소번호"])
bike_2["대여소번호"] = pd.to_numeric(bike_2["대여소번호"])

bike_1.info()

 

 

# 대여소명에 자치구 붙이기

bike_merge = pd.merge(bike_1, bike_2, left_on = "대여소번호", right_on = "대여소번호")

bike_merge.head()

 

 

# 필요한 컬럼만 사용

bike_merge_1 = bike_merge[["대여소번호", "대여소명_x", "자치구", "총거치대수", "대여일자/월", "대여건수"]]

bike_merge_1.head()

 

 

# 202001 데이터만 사용

bike_merge_1 = bike_merge_1[bike_merge_1["대여일자/월"] == 202101]

bike_merge_1.head()

 

 

# 자치구별 대여건수 확인

bike_merge_1 = bike_merge_1.groupby("자치구")["대여건수"].sum().reset_index()
bike_merge_1 = bike_merge_1.set_index("자치구")

bike_merge_1.sort_values(by = "대여건수", ascending = False).head()

 

 

# 지도에 자치구별 대여건수 나타내기

bike_merge_1_map = folium.Map(location = [37.5502, 126.982], zoom_start = 11, tiles = "OpenStreetMap")
# location = 서울 위치
# tiles = "OpenStreetMap", "Stamen Terrain"

bike_merge_1_map.choropleth(
    geo_data = geo_str,
    data = bike_merge_1["대여건수"],
    columns = ["자치구", "대여건수"],
    fill_color = "PuRd",
    key_on = "feature.properties.name",
    legend_name = "자치구별 따릉이 대여건수"
)

bike_merge_1_map

5. Review

1. 이동거리 / 평균 사용시간이 높은 대여소는?
    - 이동거리가 가장 많은 대여소는 석수역1번출구 앞(SK주유소) 대여소이다.
    - 평균 사용시간이 높은 대여소는 IBK기업은행 석수역 지점 앞 대여소이다.

2. 운동량과 이동거리의 상관관계?
    - 이동거리가 많을수록 운동량도 많아지며, 주로 남성이 여성보다 같은 이동거리에서 운동량이 더 많은 경향을

      나타낸다.
    - 주로 20대가 동일한 이동거리에서 다른 나이대보다 운동량이 더 많은 경향을 나타낸다.

3. 따릉이를 가장 많이 이용하는 성별은?
    - 남성이 여성보다 따릉이를 더 많이 이용한다.

4. 따릉이를 가장 많이 이용하는 연령대는?
    - 20대 > 30대 > 40대 > 50대 > 10대 > 60대 > 70대 순으로 따릉이를 많이 이용한다.

5. 서울시 구별로 거치대 개수와 대여건수는?
    - 거치대수와 대여건수 모두 강서구가 가장 많다.

728x90