일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- coursera
- 백준
- 데이터
- codingtest
- 머신러닝
- selenium
- 웹크롤링
- 추천시스템
- pytorch
- 웹스크래핑
- 추천 시스템
- 알고리즘
- Tensor
- 프로그래머스
- wordcloud
- recommendation system
- TF-IDF
- 코딩테스트
- Python
- 파이썬
- 협업 필터링
- 부스트캠프
- SGD
- 데이터 엔지니어링
- 코테
- 시각화
- 딥러닝
- Overfitting
- Cosine-similarity
- 분산 시스템
- Today
- Total
개발자식
[데이터 분석] Pandas, 통계 자료 분석 (1) 본문
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(['구 없음'])
'Data > Python' 카테고리의 다른 글
[데이터 분석] Seaborn, 통계 자료 분석 (4) (0) | 2022.03.24 |
---|---|
[데이터 분석] Pandas, 통계 자료 분석 (3) (0) | 2022.03.24 |
[데이터 분석] Pandas, 통계 자료 분석 (2) (0) | 2022.03.24 |
[데이터 분석] Python 데이터 분석 라이브러리, Pandas (0) | 2022.03.23 |
[멋사 AI SCHOOL] Part1. 함수, 파이썬 기능 _0321 (0) | 2022.03.22 |