티스토리 뷰
출처 : 파이썬으로 데이터 주무르기 by 민형기
1단원 서울시 구별 CCTV현황 분석¶
- CCTV 현황과 인구 현황 데이터 구하기
- 파이썬에서 텍스트 파일과 엑셀 파일을 읽기 -pandas
- pandas 기초 익히기
- pandas를 이용해서 CCTV와 인구 현황 데이터 파악하기
- pandas 고급기능 - 두 DataFrame 병합하기
- CCTV 데이터와 인구 현황 데이터를 합치고 분석하기
- 파이썬의 대표 시각화 도구 - Matplotlib
- CCTV 현황 그래프로 분석하기
지난번에 1-3 pandas 기초 익히기까지(https://jfun.tistory.com/210) 다루었다. 지난번에 이어 오늘은 1-4 pandas를 이용해서 CCTV와 인구 현황 데이터 파악하기 부터 시작하겠다.
1-4 pandas 이용해서 CCTV와 인구 현황 데이터 파악하기¶
CCTV_Seoul.head()
# 소계로 정렬
CCTV_Seoul.sort_values(by='소계', ascending=True).head()
CCTV의 전체 개수가 가장 작은 구는 '도봉구', '마포구', '송파구', '중랑구', '중구'라는 것을 알 수 있다. 의아스러운 것은 강남 3구 중 하나인 송파구가 CCTV가 가장 적은 구 중 하나라는 것인데, 2장에서 보면 송파구는 범죄율이 결코 낮은 구가 아니다. 그런데 CCTV는 적네..
CCTV_Seoul.sort_values(by='소계', ascending=False).head()
CCTV의 전체 개수가 가장 많은 구는 '강남구', '양천구', '서초구', '은평구', '용산구'로 나타난다.
# 2014~2016 CCTV 증가율을 구해보자
# 증가율 = 2014~2016 CCTV수 / 2013년 이전 CCTV수
CCTV_Seoul['최근증가율'] = (CCTV_Seoul['2016년'] + CCTV_Seoul['2015년'] + CCTV_Seoul['2014년']) / CCTV_Seoul['2013년도 이전'] * 100
CCTV_Seoul.sort_values(by='최근증가율', ascending=False).head()
최근 3년간 CCTV가 그 이전 대비 많이 증가한 구는 '종로구', '도봉구', '마포구', '노원구', '강동구'라는 것도 알 수 있다.
# 서울시 인구 현황
pop_Seoul.head()
# 합계는 우리에게 필요가 없어 drop 시키기로 하자.
pop_Seoul.drop([0], inplace=True)
pop_Seoul.head()
# '구별'컬럼의 unique를 조사하여 어떤 '구'들이 있는지 확인해보자.
pop_Seoul['구별'].unique()
'구'들을 나열했더니 마지막에 nan 값이 보인다. 이 nan값이 row가 어떻게 되는지 찾아보자.
# isnull 명령어를 이용하여 NaN 데이터를 추출해보자.
pop_Seoul[pop_Seoul['구별'].isnull()]
# NaN에 해당하는 26번 row를 삭제해주자.
pop_Seoul.drop([26], inplace=True)
pop_Seoul.head()
# 구별 '외국인비율'과 '고령자비율'을 계산해보자.
pop_Seoul['외국인비율'] = pop_Seoul['외국인'] / pop_Seoul['인구수'] * 100
pop_Seoul['고령자비율'] = pop_Seoul['고령자'] / pop_Seoul['인구수'] * 100
pop_Seoul.head()
전체 '인구수', '외국인', '외국인 비율'로 각각 정렬해보자.
# 인구수 정렬
pop_Seoul.sort_values(by='인구수', ascending=False).head()
인구수가 많은 순은 '송파구', '강서구', '강남구', '노원구', '관악구' 순이라는 것을 알 수 있다.
# 외국인 수 정렬
pop_Seoul.sort_values(by='외국인', ascending=False).head()
외국인 숫자가 많은 구는 '영등포구', '구로구', '금천구', '관악구', '동대문 구'라는 것을 알 수 있다.
# 외국인 비율 정렬
pop_Seoul.sort_values(by='외국인비율', ascending=False).head()
외국인 비율이 높은 구는 '영등포구', '금천구', '구로구', '중구', '용산구'로 외국인 숫자와는 조금 바뀌는 것을 알 수 있다.
이제 고령자와 고령자 비율을 조사해보자
# 고령자 수 정렬
pop_Seoul.sort_values(by='고령자', ascending=False).head()
고령자가 많은 구는 '강서구', '송파구', '은평구', '노원구', '관악구'이다.
# 고령자 비율 정렬
pop_Seoul.sort_values(by='고령자비율', ascending=False).head()
고령자 비율이 높은 구는 '강북구', '종로구', '중구', '용산구', '서대문구'로 고령자 수의 순위와는 차이가 좀 많이 난다는 것을 알 수 있다.
1-5 pandas 고급 기능 - 두 DataFrame 병합하기¶
1-4에서 보면 데이터들을 간단히 확인해 보았는데, CCTV의 현황을 완전히 파악한 것 같지는 않다. 인구 대비 CCTV 현황 같은 내용을 확인하기 위해서는 두 가지 종류의 데이터를 병합해야 한다.
진도를 나가기 전에 pandas 고급 기능인 병합 을 배워보자
1) concat¶
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},
index=[8, 9, 10, 11])
df1
df2
df3
# 열방향으로 단순히 합치는 기능
result = pd.concat([df1, df2, df3])
result
# concat에 옵션을 넣어보자.
# key 옵션을 넣으면 다중 index가 되어 DataFrame별로 level을 형성한다.
result = pd.concat([df1, df2, df3], keys=['x', 'y', 'z'])
result
레벨은 다음과 같이 형성되어 있다.
result.index
result.index.get_level_values(0)
result.index.get_level_values(1)
# 새로운 DataFrame을 만들어 axis 옵션을 사용하여 concat시켜보자.
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
'C': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']},
index=[2, 3, 6, 7])
result = pd.concat([df1, df4], axis=1)
df1
df4
# axis=1을 주고 concat 시켰더니?!
result
df1의 index가 0, 1, 2, 3이고, df4의 index가 2, 3, 6, 7인데 concat 명령은 index를 기준으로 데이터를 합치기 때문에 위와 같이 표현된다. 그래서 값을 가질 수 없는 곳에는 NaN이 저장된다.
#concat의 join 옵션을 사용해보자.
result = pd.concat([df1, df4], axis=1, join='inner')
result
#concat의 join_axes 옵션을 사용해보자.
result = pd.concat([df1, df4], axis=1, join_axes=[df1.index])
result
# ignore_index=True 옵션을 사용해보자.
# index를 무시하고 합친 후 다시 index를 부여
result = pd.concat([df1, df4], ignore_index=True)
result
2) merge¶
left = pd.DataFrame({'key': ['k0', 'k4', 'k2', 'k3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['k0', 'k1', 'k2', 'k3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
left
right
# merge 명령에서 merge 기순을 설정하는 on 옵션으로 합치면 공통된 key에 대해서만 합치게 된다.
pd.merge(left, right, on='key')
# how 옵션을 사용하여 합치는 두 데이터를 한쪽 데이터를 기준으로 합칠 수도 있다.
# 왼쪽 기주운~
pd.merge(left, right, how='left', on='key')
# 오른쪽 기준~
pd.merge(left, right, how='right', on='key')
# how의 값을 outer로 하면 merge한 데이터 결과 모두를 가진다.
pd.merge(left, right, how='outer', on='key')
# outer와 반대의 옵션인 inner 옵션
pd.merge(left, right, how='inner', on='key')
'beginner > 파이썬 분석' 카테고리의 다른 글
| 서울시 범죄 현황 분석 -1 (0) | 2019.07.03 |
|---|---|
| 서울시 구별 CCTV 현황 분석 -3 (0) | 2019.06.29 |
| 서울시 구별 CCTV 현황 분석-1 (1) | 2019.06.27 |
| 맥주 추천시스템-데이터분할 (0) | 2019.04.23 |
| 맥주데이터 추천시스템_4/22 (0) | 2019.04.22 |