[017 - ①] 서울시 CCTV 현황 분석 / EDA·웹 크롤링·파이썬 프로그래밍

이연희·2023년 8월 28일

Chapter
1. 데이터읽기
(1) Jupyter Notebook 이용하기
(2) VScode 이용하기
2. Pandas 기초
(1) Series
(2) DataFrame

앞으로 진행되는 수업은 하나의 주제를 가지고 직접 프로젝트 형식처럼 데이터 분석을 같이 해보면서, 이론공부와 실습이 이루어진다.

이제부터 진행되는 데이터 분석의 주제는 '서울시 자치구 연도별 cctv 설치 현황'이다. 원데이터의 출처는 서울시 열린데이터 광장이다. 시기별로 새로 데이터가 업데이트 되지만, 우리가 사용하는 데이터는 기관에서 당시 교육하는 시기의 데이터를 얻어서 사용했다는 것을 미리 알린다.
참고로 데이터는 이전 시간에 만들어둔 폴더 ds_study > data 안에 위치시켰다. (코드파일을 저장하기 위해 ds_study > source_code또한 만들어 주었다.)

1. 데이터 읽기

(1) Jupyter Notebook 이용하기

miniconda를 이용해 분석에 사용할 ds_study 환경을 활성화한 다음, ds_study폴더 안으로 디렉토리 경로를 이동시킨 다음, jupyter notebook을 열어주었다.

프로그램이 구글 페이지에 열리면 코드를 작성하기 위해서 source_code파일 안에서 파이썬 파일을 연다.

데이터는 pandas패키지를 불러와서 읽는다. pandas패키지는 간단하게 pd로 부르겠다.

1) 연도별 자치구 CCTV 현황(csv파일 읽기)

패키지를 이용해서 csv파일을 불러온다. 불러올 데이터는 자치구의 연도별 cctv개수와 합계이다. read_csv()함수를 이용해서 불러올 수 있는데, 만약 한글을 출력할 수 없을 경우 encoding="utf-8" 옵션을 넣어주면 된다.

자료를 간단하게 읽어본다. head()함수를 이용하면 상위 5개의 데이터를 불러오고, tail()함수를 사용하면 하위 5개의 데이터를 출력해준다. 만약 5개가 아닌 n개의 데이터를 출력하고 싶다면, ()안에 원하는 숫자 n을 넣어주면 된다.

다음으로는 columns을 확인해보자.

파일명.columns

를 이용하면 컬럼명을 리스트 형태로 반환하고, 그 중 원하는 컬럼명을 출력하고 싶다면 인덱스 번호를 이용하면 된다.

이때, 첫번째 컬럼명이 적절하지 않다고 판단, rename()함수를 이용해서 컬럼명을 직접 지정해준다.

하지만, 이렇게만 코드를 입력한다면 이건 일회성 출력물이다. 확인해보자.

원본 컬럼명을 아예 변경하고 싶다면, rename()함수안에 inplace=True옵션을 넣어주면 된다.

2) 2017년 자치구별 인구현황(xls파일 읽기)

다음은 xls파일을 읽어보자. 이번에 읽어볼 데이터는 '2017년 자치구별 인구현황'이다. 엑셀파일을 읽을 때에는 read_excel()함수를 이용한다.

그런데 표가 깔끔하지 못하다. 원본데이터를 살펴보니 데이터 상단 컬럼의 형식이 이러하다.

데이터 형태를 정리해준다. 헤드 부분을 잘라주고, 사용할 컬럼위치만 불러온다.

헤드를 자르는 과정에서 컬럼명이 정보를 제대로 알지 못하게 이름하게 되었으므로, 앞서 했던 것처럼 컬럼명을 지정해준다.

.
.

(2) VScode 이용하기

jupyter notebook으로 실행한 작업 몇 가지를 VScode로도 확인해 보자.
우선 miniconda를 이용해서 Vscode를 열어준다.
참고로 디렉토리 주소를 설정할 때,

cd .

을 입력하면 현재 코드로,

cd ..

으로 .을 한 번 더 입력하면 한 단계의 상위 폴더로 이동한다.
환경과 디렉토리 주소 설정한 다음 'code'를 입력해서 VScode를 열어준다.

source_code파일 안에 코드파일을 만들어 준 다음, 마찬가지로 pandas패키지를 불러온 다음, csv파일을 열어주었다.

컬럼명을 확인한 다음, 첫 번째 컬럼명을 바꿔주는 작업까지 진행해보자.
(그 이후는 jupyter notebook과 동일하므로 생략함)

.
.
.
.

오늘까지 python 작업을 pycharm, jupyter notebooks, VScode로 해봤다.
개인적으로 이번에 새로 배운 프로그램이 pycharm보다 좋았던 것은 코드를 하나씩 실행해서 결과물을 코드 밑에 즉각 출력해준다는 점이었다.
좀 더 가벼운 느낌도 든다. miniconda를 통해서 환경하고 디렉토리를 설정해서 프로그램을 실행해야한다는 점은 좀 귀찮고, 아직은 익숙지 않아서 불편하지만 그래도 차근차근 열심히 배워나가자!
.
.
.
.

2. Pandas 기초

오늘 강의에서 맨 처음 불러왔던 Pandas패키지에 대해 조금더 알아보자.
데이터 핸들링의 성능이 좋은 엑셀이라는 설명을 들었다. 코딩이 가능한 응용성 좋은 엑셀이라고. 누군가가 '스테로이드를 맞은 엑셀'이라고 했다는데(ㅋㅋㅋㅋ) 꽤나 강력할 것 같다.
패키지는 Series클래스와 DataFrame 클래스를 제공한다. Series클래스는 일차형의 데이터 형태라면, DataFrame은 행과 열로 이루어진 표 형태의 데이터를 다룰 수 있게 해준다.
.
.

(1) Series

index와 value로 이루어져 있으며, 내장되어 있는 데이터들은 한 가지 타입만 가질 수 있다. Series 객체를 불러오기 전에 먼저 모듈을 가져온다.
Pandas 패키지를 가져오면서 numpy 패키지로 함께 불러온다. numpy는 수학,과학 연산을 위한 패키지로, padndas가 numpy를 바탕으로 만들어졌다고 한다.

import pandas as pd
import numpy as np

.

pd.Series()

와 같은 코드로 series데이터를 만들 수 있다.

리스트 형태의 데이터를 넣어서 series데이터를 만들 수 있다.

pd.Series([1,2,3,4])

만약의 데이터들의 타입을 변경하고 싶다면, 'dtype=' 옵션을 통해 변경할 수 있다.

pd.Series([1,2,3,4], dtype=np.float64)  #float형태로 변환
pd.Series([1,2,3,4], dtype=str)			#str데이터로 변환

array와 dictionary형태를 인자로 받아서 Series데이터를 만들어줄 수 있다.

pd.Series(np.array([1,2,3]))
pd.Series({"key":"Value"})

만약에 데이터 타입이 숫자형인 데이터에 문자형 타입의 데이터를 넣어서 갱신하면 데이터 타입이 전부 문자형으로 바뀌게 되므로, 주의해야 한다.

Pandas 패키지는 날짜 데이터도 다룰 수 있는데, 이때 시작데이터를 기준으로 'periods=n'을 옵션으로 넣어주면 n일까지의 원하는 기간만큼 출력할 수 있다.

.
.

(2) DataFrame

1) DataFrame 데이터 만들기

앞에서 DataFrame은 행과 열로 이루어진 마치 표와 같은 형태라고 설명했다.
정확하게는 index,column,value로 이루어져 있다고 할 수 있다.
간단하게 DataFrame 데이터를 반들어 보자.

첫번째로 표준정규분표에서 샘플링한 난수를 생성해서, 만들어 보았다.

data = np.random.randn(6,4)    
data

numpy 패키지를 이용해서 샘플링했는데, 이 때 작성한 인자들 중 앞의 6은 행의 개수, 4는 열의 개수를 말한다.

value값 뿐만 아니라, index와 column의 값도 지정할 수가 있다.

# pd.DataFrame(value, index, column)
df = df.DataFrame(data, index=dates, columns["A","B","C","D])
df

value는 바로 위에서 샘플링한 data데이터를, index값은 Series데이터의 날짜 파트에서 만든 데이터를, column 값은 직접 리스트 형태를 넣어서 지정해주었다.

2) DataFrame 정보 탐색

DataFrame의 정보를 탐색할 수 있는 방법에는 여러가지가 있다.
먼저, 이전 시간에 사용했던 head()와 tail()함수를 통해서 상위 5개와 하위 5개 데이터들을 출력할 수 있다. (인자로 특정 숫자 n을 넣으면 n개 출력 가능)

또한, index, columns,values들만 따로 모아서 리스트 형태로 반환하기도 한다.

그밖에도 info()함수를 이용해서 데이터프레임의 기본정보를 확인하거나, describ()함수를 통해서 기술통계량도 살펴볼 수 있다.

.
.

3) DataFrame 데이터 정렬

sort_value()를 응용해서 원하는 데이터를 기준으로 오름차순 정렬이나 내림차순 정렬을 할 수 있다.
sor_value(by=정렬기준, ascending=True) 이때 정렬기준은 잡아줘야하지만 ascending=True는 함수의 디폴트 값으로 내림차순을 원한다면 False로 옵션을 선택해준다.

하지만 이것은 일회적인 정렬로써, 원본데이터를 확인해보면 다시 원래의 값을 출력한다. 따라서 이때에도 옵션으로 'inplace=True'를 넣어주면 원본데이터에까지 영향을 미치게 된다.


.
.

4) DataFrame 데이터 선택

데이터프레임에서 원하는 데이터만을 선택해서 출력할 수 있다.
먼저 컬럼명을 불러서 출력해보자.

df["A"]      # 컬럼A선택
df.A

이와 같이 불러올 수 있는데, 주의해야 할 점은 df.A와 같은 형식은 컬럼명이 숫자형이라면 출력이 불가능하다. (숫자형태의 문자형 타입이어도 불가능하다.)

두 개 이상의 컬럼을 불러올 수 있는데, 이 때 컬럼명을 리스트 형태에 담아서 불러와야 한다.

offset index를 활용할 수 있다. 이는 인덱스나 컬럼명으로 슬라이스하는 경우를 말한다.

loc() 함수로 특정 행,열을 선택하기도 한다.

iloc() 함수를 사용할 수도 있는데, iloc는 사용자가 지정한 인덱스가 아닌, 컴퓨터가 인식하는 인덱스 값으로 선택된다.


조건을 넣어서 boolean값을 출력한 다음 True값을 출력하는 데이터를 선택하는 방법도 있다.


.
.

5) DataFrame 컬럼 추가 및 삭제

먼저 기존 데이터프레임에서 컬럼을 추가해보자.
만약 데이터 값이 존재하지 않다면, 데이터를 추가하게 되고, 이미 존재한다면 업데이트하게 된다.

특정 컬럼을 삭제하는 방법에는 두 가지가 있는데,
del 명령어를 사용하는 것과 drop()함수를 사용하는 것이다.
방금 만든 "E"컬럼을 del명령어를 이용해서 삭제해 보자.

다음으로는, drop()을 이용해서 "D" 컬럼을 삭제해보자. 이때 조심해야 할 것은 drop()함수는 axis=0을 디폴트 값으로 가지고 있는데, 이는 행을 가리킨다. 따라서 컬럼을 삭제하고 싶다면 'axis=1'을 넣어서 기준을 컬럼으로 설정해야 한다.

"20230906"행도 삭제해보자. 이 때 'axis=0'은 생략할 수 있다.

.
.
.
.

profile
안녕하세요, 데이터 공부를 하고 있습니다.

0개의 댓글