EDA-서울시 CCTV 현황 데이터 분석 1

BlackLabel·2023년 10월 18일
0

EDA, 크롤링 기초 

목록 보기
3/13

서울시 CCTV 현황 분석 데이터 읽기

Pandas

  • Python에서 R만큼의 강력한 데이터 핸들링 성능을 제공하는 모듈
  • 단일 프로세스에서는 최대 효율
  • 코딩 가능하고 응용 가능한 엑셀로 받아들여도 됨
  • 누군가는 스테로이드를 맞은 엑셀로 표현함
import pandas as pd

. : 현재 디렉터리

Pandas에서 엑셀 및 텍스트 파일 읽기

CCTV_Seoul = pd.read_csv('파일 경로', encoding='utf-8')
CCTV_Seoul.head() 
  • read_csv: csv 파일을 읽는 명령
  • 한글이 포함되어 있을 경우 encoding='utf-8' 옵션을 사용
  • head(n) : 위에서부터 n개(default:5개) 출력
  • tail(n) : head의 반대로 아래에서부터 n개(default:5개) 출력
  • .. : 부모 디렉터리
  • . : 현재 디렉터리

  • pandas DataFrame 구조 - index : 행, column : 열, value : 값

column 조회

CCTV_Seoul.columns # column 전체를 list형태로 반환
CCTV_Seoul.columns[0] # column 0번째

column 이름 변경

CCTV_Seoul.rename(columns={CCTV_Seoul.columns[0]:'구별'}, inplace=True)

  • inplace 옵션 : 작업을 진행한 데이터를 새 데이터로 반환할 지 현재 데이터에 적용할지 설정
    -False : 작업한 데이터 반환
    -True : 작업한 데이터 현재 데이터에 적용(업데이트)

Pandas에서 엑셀 및 텍스트 파일 읽기2

pop_Seoul = pd.read_excel('파일 경로', header=2, usecols = 'B,D,G,J,N')

  • read_excel : 엑셀 파일을 읽는 명령
  • 엑셀을 열어 형식부터 확인한다
  • header : 자료를 읽기 시작할 행을 지정
  • usecols : 읽어올 엑셀의 컬럼을 지정(엑셀의 컬럼은 A,B,C,D,.. 등 영어로 이루어져있다.)

column 이름 변경2 (알아보기 쉽게)

pop_Seoul.rename(
	columns={
    	pop_Seoul.columns[0]:'구별',
        pop_Seoul.columns[1]:'인구수',
        pop_Seoul.columns[2]:'한국인',
        pop_Seoul.columns[3]:'외국인',
        pop_Seoul.columns[4]:'고령자'
    },
    inplace=True
)

  • 자료를 읽어올 때 header를 통해 인덱스 2번째부터 읽어왔기 때문에 각 컬럼을 손수 바꿔주는 절차가 필요했다

Pandas 기초

import pandas as pd
import numpy as np
  • 통상적으로 pandas는 pd로, numpy는 np로 import 한다

Series

s = pd.Series([1,3,5,np.nan,6,8])

  • pandas의 데이터형을 구성하는 기본
  • 가장 간단한 데이터형
  • index와 value로 이루어져 있다
  • 계산을 위해 한 가지 데이터 타입만 가지는게 좋다
  • list 데이터형태
  • dtype 옵션을 통해 데이터 형 변환 가능 (dtype=np.float64 -> float으로 변환)
# 딕셔너리
pd.Series({"Key":"Value"})

  • 딕셔너리로 인덱스 값을 지정할 수 있다.

date_range

dates = pd.date_range('20130101', periods=6) # 6일

  • 날짜(시간)를 이용할 수 있다
  • period 옵션을 통해 기간을 정할 수 있다

DataFrame

df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=['A','B','C','D'])

  • Pandas에서 가장 많이 사용되는 데이터형이다
    + value, index, columns로 구성
  • index와 columns를 지정하면 된다
  • np.random.randn(6,4) : 6행 4열 데이터에 난수를 생성
df.index

df.columns

df. values

  • df의 index, columns, values 조회

info

df.info()

  • DataFrame의 기본 정보 확인
  • 각 컬럼의 크기와 데이터형태 등을 확인하는 경우가 많다

describe

df.describe()

  • DataFrame의 통계적 기본 정보를 확인
  • 컬럼별 개수, 평균, 편차, 최소, 최대, 1/4지점, 2/4지점, 3/4지점

sort_values

df.sort_values(by='B',ascending=False)

  • 데이터 정렬 : sort_values(by=컬럼, ascending=Bool)

ascending = True : 오름차순
ascending = False : 내림차순

slice

df[0:3] # 0부터 3까지
df['20130102':'20130104'] # 인텍스 이름으로 설정 가능(끝 포함)

  • 특정 행 읽기 :df[n:m]
  • [n:m] : n부터 m-1까지
  • 인덱스나 컬럼의 이름으로 slice하는 경우 끝을 포함

loc

# loc['행','열']
df.loc[:,['A','B']] 

df.loc['20130102':'20130104',['A','B']]

  • loc[행, 열] : location
  • index명, column명을 이용해 행과 열을 선택하는 함수
  • 이름으로도 사용 가능
  • Pandas의 보편적인 slice 옵션
  • ":" = 모든

iloc

df.iloc[3] # 인덱스 3에 해당하는 행의 데이터들

df.iloc[3:5, 0:2] # 행 3~4, 열 0~1 에 해당하는 데이터들
df.iloc[[1,2,4],[0,2]] # 행 1,2,4 열 0, 2 에 해당하는 데이터들

df.iloc[:,1:3] # 모든 행에 1~2열에 해당하는 데이터들

  • iloc[행, 열] : index명, column명 대신 인덱스를 활용하여 행과 열을 선택하는 함수
  • 번호로만 접근

조건문

df[df['A'] > 0] # df에서 df의 A행중 0보다 큰 값이 포함된 행만 반환

df[df > 0] # 전체적으로 0보다 큰 값만 반환 0보다 작으면 Nan처리

df['E'].isin(['two','four']) # df의 E에 있으면 True, 없으면 False
df[df['E'].isin(['two','four'])] # True인 행 데이터를 반환

  • 조건을 통해 원하는 값을 출력하는 것이 일반적 : df[조건]
  • NaN : Not a Number

  • 컬럼값 추가 : df[컬럼명]=[값]
  • 기존 컬럼이 없으면 추가하고 있다면 변경
  • isin() : 특정 요소가 있는지 확인

특정 컬럼 제거

del df['E']
  • del df["컬럼"] : 컬럼 삭제

  • drop("컬럼 또는 인덱스", axis = 값) : axis 값에 따라 행 또는 열 삭제
    axis = 0 : 가로
    axis = 1 : 세로
    (기본 axis는 0)

apply

df.apply(np.cumsum) # np.cumsum은 누적합

  • apply() : 원하는 계산 수행
    sum : 합, mean : 평균, min : 최소값, max : 최대값
    numpy의 기능도 사용 가능
  • apply(np.cumsum) : 각 컬럼 값 누적합

CCTV 데이터와 인구현황 데이터 훑어보기

가장 CCTV를 적게 보유한 구

CCTV_Seoul.sort_values(by='소계',ascending=True).head()

가장 CCTV를 많이 보유한 구

CCTV_Seoul.sort_values(by='소계',ascending=False).head()

최근 3년간 CCTV 증가율

CCTV_Seoul['최근 증가율'] = (CCTV_Seoul['2016년'] + CCTV_Seoul['2015년'] + CCTV_Seoul['2014년']) / CCTV_Seoul['2013년도 이전'] * 100

CCTV_Seoul.sort_values(by='최근 증가율', ascending=False).head()

  • 기존 컬럼이 없으면 추가, 있으면 수정

인구현황 데이터 훑어보기

서울시 인구 데이터 확인

pop_Seoul.head()

인구 데이터 정리

pop_Seoul.drop([0],axis=0,inplace=True)

  • 합계 데이터 삭제
  • axis : 1이 열, 0이 행(default:0)

unique

pop_Seoul['구별'].unique()

  • unique 함수 : 중복 제외 데이터 확인 가능(중복 없이 반환)
    데이터 양이 많아지면 초반 검증을 위해 사용

외국인과 고령자 비율

pop_Seoul['외국인비율'] = pop_Seoul['외국인'] / pop_Seoul['인구수'] * 100
pop_Seoul['고령자비율'] = pop_Seoul['고령자'] / pop_Seoul['인구수'] * 100

인구수 기준 정렬

pop_Seoul.sort_values(['인구수'],ascending=False).head()

외국인 기준 정렬

pop_Seoul.sort_values(['외국인'],ascending=False).head()

고령자 기준 정렬

pop_Seoul.sort_values(by='고령자',ascending=False).head()

고령자비율 기준 정렬

pop_Seoul.sort_values(by='고령자비율',ascending=False).head()

Pandas 데이터 합치기(병합)

데이터 병합 기초

  • pd.concat()
  • pd.join()
  • pd.merge()

merge 연습

merge를 이용해 데이터 병합

  • DataFrame끼리 병합이 빈번하므로 꼬이지않게 주의
  • 두 데이터 프레임에서 컬럼이나 인덱스를 기준으로 병합
  • 기준이 되는 컬럼이나 인덱스를 키라고 한다
  • 기준이 되는 키 값은 두 데이터 프레임에 모두 포함되어 있어야한다.
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'],
    }
)

  • merge(df1, df2, on = '컬럼') : df1, df2를 '컬럼'을 기준으로 병합
    on의 칼럼을 기준으로 공통된 값을 가지는 경우만 병합

  • merge(df1, df2, how="df1", on = '컬럼'):
    how의 df1에 on의 컬럼을 기준으로 df2 병합
    df2의 값이 없는 경우 NaN을 추가

  • merge(df1, df2, how="outer", on = '컬럼'):
    df1, df2의 모든 데이터를 on의 컬럼을 기준으로 병합
    값이 없는 경우 NaN을 추가

  • merge(df1, df2, how="inner", on = '컬럼'):
    기본적인 동작과 동일하게 값이 두 df에 있는 경우만 병합

CCTV, 인구 데이터 merge를 이용해서 병합하기

data_result = pd.merge(CCTV_Seoul, pop_Seoul, on='구별')

  • 컬럼 : 구별을 이용하여 병합
    두 데이터 프레임에서 해당 컬럼은 일치하므로 how를 사용하지 않아도 된다.

필요없는 컬럼 제거

data_result.drop(['2013년도 이전','2014년','2015년','2016년'], axis=1,inplace=True)

index 설정

data_result.set_index('구별', inplace=True)

인덱스 변경

  • 기본 인덱스는 행 번호로 구성
  • 인덱스는 중복값이 없어야 한다.(unique 명령으로 확인)
  • 현재 데이터에서는 구별 컬럼이 unique이므로 해당 컬럼으로 인덱스 변경
  • set_index : 인덱스 재지정다

상관관계

  • 한 데이터가 증가할 때 다른 데이터가 증가하느냐 혹은 감소하느냐
  • 0.2 이하 : 상관관계가 없거나 무시해도 좋은 수준
  • 0.4 이하 : 약한 상관관계
  • 0.6 이상 : 강한 상관관계
  • 절댓값 1이 가장 큰 수
  • 상관관계가 있다고 인관관계가 있는 것은 아니다
data_result.corr()
  • corr() : correlation의 축약형으로 상관관계를 계산하는 함수
    Pandas에서 상관관계를 계산하는 함수
    상관계수를 조사해 0.2 이상의 데이터를 비교

CCTV 비율

data_result['CCTV비율'] = data_result['소계'] / data_result['인구수'] * 100
data_result.sort_values(by='CCTV비율',ascending=False).head()

  • CCTV 비율 높은 순 정렬
profile
+database

0개의 댓글