개발자식

[데이터 분석] Pandas, 통계 자료 분석 (1) 본문

Data/Python

[데이터 분석] Pandas, 통계 자료 분석 (1)

밍츠 2022. 3. 23. 23:53

0. 준비

목표 : 서울시 범죄현황 통계자료 분석

데이터 출처 : 공공데이터포털 

-> 찾아보니 똑같은 제목의 자료는 없다. (비슷한 것은 많음)

-> 공공데이터 모양이 종종 바뀌어 이때마다 대응해줘야 한다. 

+ 결측치가 존재한다면 경찰서에 문의

 

생각해볼 점

Q. 5대 범죄(강간, 강도, 살인, 절도, 폭력)이 많이 발생할 수 있는 특징이 무엇이 있을까?

 

데이터로 찾아볼 것들

  • 서울에서 5대 범죄가 가장 많이 일어나는 곳은?
  • 서울에서 인구수 대비 5대 범죄가 가장 많이 일어나는 곳은?
  • 서울에서 5대 범죄의 검거율이 제일 높은 곳은?

 

1. 데이터 입력 및 전처리

 

1. 필요한 라이브러리 선언

import numpy as np
import pandas as pd

2. 엑셀 파일 읽기

df = pd.read_excel('관서별 5대범죄 발생 및 검거.xlsx')
df

3. 데이터 정보 확인

df.head() #데이터 위에서 5개
df.tail() #데이터 아래에서 5개

df.describe()
df.info()

 

df.describe() 결과 :

-> df에서 1번째 행인 관서명 "계" 때문에 describe()값이 최대값이 커져 평균이 높아지고, 표준편차가 커지는 등으로 데이터를 파악하기 어렵다.

 

해결 : 관서명 "계"를 제외한 describe

df[df["관서명"]!="계"].describe() #판단의 기준은 열, 필터링의 결과는 전체 행

#df["관서명"]!="계" 결과는 Series로 관서명이 "계"인 열 제외하고 True 반환

-> 살인(발생)이 0인 관서가 있다. 

-> 절도와 폭력의 단위는 천단위까지 존재한다. 표준편차가 크다 

 

4. 경찰서를 구별로 정리하기

police_to_gu = {'서대문서': '서대문구', '수서서': '강남구', '강서서': '강서구', '서초서': '서초구',
                '서부서': '은평구', '중부서': '중구', '종로서': '종로구', '남대문서': '중구',
                '혜화서': '종로구', '용산서': '용산구', '성북서': '성북구', '동대문서': '동대문구',
                '마포서': '마포구', '영등포서': '영등포구', '성동서': '성동구', '동작서': '동작구',
                '광진서': '광진구', '강북서': '강북구', '금천서': '금천구', '중랑서': '중랑구',
                '강남서': '강남구', '관악서': '관악구', '강동서': '강동구', '종암서': '성북구', 
                '구로서': '구로구', '양천서': '양천구', '송파서': '송파구', '노원서': '노원구', 
                '방배서': '서초구', '은평서': '은평구', '도봉서': '도봉구'}

 

Dictionary의 get() 메소드

  • 키로 값을 가져오라고 하는 경우 딕셔너리에 존재하지 않는 값을 넣을시 KeyError 발생
  • get(x) 함수는 x라는 key에 대응하는 value를 돌려준다.
    • value가 없을 경우 정해둔 값을 대신 가져오라고 할 수 있다.

 

5. 관서명으로 구별로 분류

5-1. '구별'열 만들기

df['구별'] = df['관서명'].apply(lambda x: police_to_gu.get(x, '구 없음'))
df.head()

-> police_to_gu에서 관서명(key)에 대응하는 value를 돌려준다.

-> apply 함수를 이용하여 관서명을 열방향으로 x에 들어간다.

-> lambda 함수에서 :를 기준으로 왼쪽은 input, 오른쪽은 output이다

 

apply(함수, axis=0 or 1)

  • - axis 0은 열, 1은 행 (기본값 : axis=0)
df.apply(np.square) #모든 열에 제곱값을 구해준다
df.apply(np.sum) #열별 데이터의 합
df.apply(np.sum,axis=1) #행별 데이터 합

 

df.apply(lambda x:np.square(x) if x.name in ['A','B'] else x) #열 이름이 A,B인 경우에만 함수를 적용한다.
df.apply(lambda x:np.square(x) if (x.name+1)%2==0 else x,axis=1) #짝수번째 행만 함수를 적용한다.

-> 조건 외의 경우 반드시 else 문으로 리턴해줘야 한다.

 

5-2. '구별'열로 인덱스 만들기

 

pivot_table 활용

gu_df=pd.pivot-table(df,index="구별",aggfunc=np.sum)

'구별' 열에서 중부서 -> 중구, 남대문서 -> 중구 와 같이 중복되는 데이터가 존재하여 pivot_table를 활용한다.

-> 구별 발생 건수 데이터를 원하기 때문에 sum을 활용한다

 

+ 데이터가 1:1 이였다면

df.set_index('구별', inplace=True) #강제로 인덱스 설정

+ 인덱스 재설정

df.reset_index(inplace=True)

 

5-3. "구 없음" 행 삭제

gu_df = gu_df.drop(['구 없음'])

 

Comments