데이터분석

(10) 데이터분석_전국 도시공원 데이터 프로젝트

빠스무 2023. 6. 15. 16:44
728x90

각 명령어를 사용하기 위해 import를 시켜준다

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

csv파일을 읽어온다.

park = pd.read_csv('/content/drive/MyDrive/study/데이터분석/전국도시공원표준데이터 (1).csv', encoding = 'ms949')
park.head()

그래프에 한글을 적기위한 코드이다 나눔체를 넣어준다.

!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
plt.rc('font', family='NanumBarunGothic')

park 데이터의 정보

park 데이터의 결측치를 계산한다.

park.isnull().sum()

park.columns

park의 컬럼명을 사용할 컬럼만 남겨준다.

park.drop(columns = ['공원보유시설(운동시설)', '공원보유시설(유희시설)', '공원보유시설(편익시설)', '공원보유시설(교양시설)',
       '공원보유시설(기타시설)', '지정고시일', '관리기관명','Unnamed: 19'],inplace = True)

park.plot.scatter(x='경도', y='위도', figsize=(8,10), grid=True)

sns.boxplot(y=park['위도'])

sns.boxplot(y=park['경도'])

# 위도와 경도가 잘 못 입력된 데이터를 확인
park.loc[(park['위도']<32) | (park['경도'] > 132)]

# 위도와 경도가 잘 못 입력된 데이터를 확인
park_loc_error = park.loc[(park['위도']<32) | (park['경도'] > 132)]
 
park = park.loc[(park['위도']>32) | (park['경도'] < 132)]
park.shape

# ' 공원면적비율' 파생변수 만들기
# sqrt(공원면적) * 0.01
park['공원면적비율'] = park['공원면적'].apply(lambda x: np.sqrt(x) * 0.01)

# '도로명주소'는 입력되지 않고. '지번 주소'만 입력된 데이터를 확인
park.loc[park['소재지도로명주소'].isnull() & park['소재지지번주소'].notnull()]

# '도로명주소'와 '지번 주소'가 모두 입력된 데이터를 확인
park.loc[park['소재지도로명주소'].notnull() & park['소재지지번주소'].notnull()]

# '도로명주소'와 '지번 주소'가 모두 입력되지 않은 데이터를 확인
park.loc[park['소재지도로명주소'].isnull() & park['소재지지번주소'].isnull()]

# '도로명주소'가 입력되지 않은 데이터를 지번 주소로 대신 채움
park['소재지도로명주소'].fillna(park['소재지지번주소'], inplace=True )
park.head()

# split(' ', expand = True): 데이터 프레임으로 해당 데이터가 분리되고 인덱싱과 슬라이싱이 가능
#     0         1     2        3
# 부산광역시 강서구 구랑동 1199-7
park['소재지도로명주소'].str.split(' ', expand = True)

# '도로명주소'에서 '시도'만 추출하여 '시도'파생변수 만들기
park['시도'] = park['소재지도로명주소'].str.split(' ', expand = True)[0]

park['시도'].value_counts()

# '시도'에 '강원'을 '강원도'로 변경
park['시도'][park['시도'] == '강원'] = '강원도'

plt.figure(figsize=(8,10))
sns.scatterplot(data = park, x='경도',y='위도', hue='시도')

park_sido = pd.DataFrame(park['시도'].value_counts())

# value_counts(normalize = True): 전체 합계에 대한 비율
park_sido_normalize = pd.DataFrame(park['시도'].value_counts(normalize = True))
park_sido_normalize

# value_counts(ascending = True): 전체 합계에 대한 비율
park_sido_ascending = pd.DataFrame(park['시도'].value_counts(ascending = True))
park_sido_ascending

park_sido = park_sido.merge(park_sido_normalize, left_index = True, right_index = True).reset_index()
park_sido

park_sido.columns = ['시도','합계','평균']
park_sido

plt.figure(figsize=(12, 8))
sns.barplot(data=park_sido, x='합계', y='시도')