본문 바로가기
데이터분석/실습

04. 실습3 : 전국 도시공원 데이터

by 사라리24 2024. 5. 28.
SMALL

1. 전국 도시공원 데이터

  

 

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

 

  • 파일을 인코딩하면서 가져오기
 
 
 
        park=pd.read_csv('/content/drive/MyDrive/1. KDT/5. 데이터 분석/데이터/전국도시공원표준데이터.csv' encoding='ms949')
        park.head()
 
  

 

  • 'park' 데이터프레임 : 행과 열 갯수 확인
  
 
          park.shape
  
 

 

 

  • 한글 폰트 넣기
 
 
        !sudo apt-get install -y fonts-nanum
        !sudo fc-cache -fv
        !rm ~/.cache/matplotlib -rf
 
 
        plt.rc('font',family='NanumBarunDothic')
 
  
런타임 다시 실행

 

 

  • 표 확인하기
  
          park.info()
  
 

 

 

  • 표 확인 후, 불필요한 컬럼 삭제하기
 
 
          park.columns
 
          park.drop(columns=['공원보유시설(운동시설)','공원보유시설(유희시설)', '공원보유시설(편익시설)', '공원보유시설(교양시설)', '공원보유시설(기타시설)', '지정고시일', '관리기관명','Unnamed: 19'], inplace=True)
          park
 
 





 

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

 



2. boxplot

-  데이터의 분포를 시각화하는데 유용
- 주로 데이터의 중앙값(중위수, median)
   사분위수(Q1[25%], Q2[50%], Q3[75%], Q4[100%]), 이상치 등을 표현하는데 활용

 

  • bpxplot으로 이상치 데이터 확인
 
   
          sns.boxplot(y=park['위도'])
 
          sns.boxplot(y=park['경도'])
 
  
 


* 이상치 데이터가 있음

위도: 30 이상 데이터 = 이상치 / 경도: 132 이상 데이터 = 이상치

 

  • boxplot의 특징
  • 상자: Q1과 Q3 사이의 범위
  • 상자 내부 선 : Q2(중앙값)
  • 수염: 데이터의 최솟값과 최댓값, 아래 수염(Q1 - 1.5*IQR), 위쪽 수염(Q3 + 1.5 * 1QR)
  • IQR = Q3 - Q1, 데이터의 변동성을 평가하는데 사용
  • 수염을 벗어나는 값들은 이상치로 간주됨

 

 

  • 위도와 경도의 이상치로 판별되는 데이터를 확인
  
          # 위도와 경도의 이상치로 판별되는 데이터를 확인
          park.loc[(park['위도']<29)|(park['경도']>132)]
  
          # 에러 데이터로 담아주기
          park_loc_error = park.loc[(park['위도']<32)|(park['경도']>132)]
          park_loc_error
 
 

 

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

 

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

 

  •  '소재지도로명주소'에는 null이고 '소재지지번주소'는 있는 데이터 확인


 
        park.loc[park['소재지도로명주소'].isnull() & park['소재지지번주소'].notnull()]
 
 
  

 

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

 

 

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

 

 

  • '시도' 열에서 '강원도'가 '강원'으로 표시된 오류 데이터 확인
 
  
        park['시도'].value_counts()
 
  

 

 

  •  '강원'인 데이터 '강원도'로 변경
  
      
          # '시도'에 '강원'을 '강원도'로 변경
 
         park['시도'][park['시도']=='강원']='강원도' # 강사님 코드
 
          park['시도'].value_counts() # ai 코드
 
 

 

 

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

 

  • '시도' 열 확인 '강원
  
 
          park_sido = pd.DataFrame(park['시도'].value_counts())
          park_sido
 
  
 


'강원' 데이터가 '강원도'로 변경된 것을 확인할 수 있음

 

 

  • 전체 합계에 대한 비율 계산
 

          # value_counts(normalize=True) : 전체 합계에 대한 비율 계산

          park_sido_nomalize = pd.DataFrame(park['시도'].value_counts(normalize=True))
          park_sido_nomalize
 
  

 

 

  • 내림차순으로 정렬
  
 
          # value_counts(ascending=False) : 내림차순으로 정렬
          park_sido_ascending = pd.DataFrame(park['시도'].value_counts(ascending=False))
          park_sido_ascending
 
  

 

 

 

  • 시도별 합계 데이터(park_sido)와 비율 데이터(park_sido_normalize)를 병합
  
 
          # 시도별 합계 데이터(park_sido)와 비율 데이터(park_sido_normalize)를 병합
          pd.concat([park_sido, park_sido_normalize], axis=1)
 
 
  

 

 

  • 새로운 데이터 프레임 생성
 
 
          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))
            plt.xticks(rotation=45)
            sns.barplot(data=park_sido, x='시도', y='합계')
 
 
  

 

  • 그래프 돌리기
  
 
        plt.figure(figsize=(12, 8))
        sns.barplot(data=park_sido, x='합계', y='시도')