728x90
반응형
SMALL
728x90
반응형
SMALL

지난 포스팅에 이어서 계속 CCTV 데이터와 인구 현황 데이터를 합치고 분석해 봅시다.

CCTV_Seoul 데이터 프레임과 pop_Seoul 데이터 프레임 합친다


연도별 데이터는 이제 별 의미가 없기 때문에 삭제하겠습니다.
row 행 데이터를 삭제할 때는 drop() 함수를 사용했었지만, column열 데이터(세로줄)를 삭제할 때는 del 키워드를 사용합니다.

숫자로 인덱스를 구분하는 것보다, unique 한 구별 데이터를 인덱스로 만들어 주는 것이 더 보기 좋습니다.

이러한 습관은 추후에 시각화에도 도움이 됩니다.
set_index 함수를 사용해서 인덱스를 변경할 수 있습니다.

어떤 데이터끼리 비교하는 것이 좋을까?

다양한 접근은 아직은 어려우나, 인구수의 어떤 데이터를 이용해서 CCTV를 비교할지를 결정 지어 주어야 합니다.
비교해 볼 수 있는 데이터는 고령자 비율, 외국인 비율, 인구수로 생각해볼 수 있는데, 어떠한 데이터를 CCTV와 비교할지를 결정 지어 줘야 할지를 결정짓는 것이 상관계수 입니다.
상관계수의 절댓값이 클 수록 두 데이터는 긴밀한 관계를 갖는다고 생각 해 볼 수 있습니다.
상관계수에는 다음과 같은 법칙이 적용됩니다.

  • 상관계수 절대값이 0.1 이하면 무시해야 하는 상관관계
  • 상관계수 절대값이 0.3 이하면 약한 상관관계
  • 상관계수 절대값이 0.7 이하면 뚜렷한 상관관계

상관계수 계산은 매우 어려우나 numpy 모듈의 corrcoef 함수를 이용하면 손쉽게 데이터끼리의 상관관계를 파악할 수 있습니다.

고령자 비율과 소계의 상관계수 구하기

기준 대각선(좌상-우하)을 제외한 나머지 데이터들만 확인하면 됩니다.

계속 이어서 상관 계수를 구해 보겠습니다.

외국인 비율과 소계의 상관계수 구하기
인구수와 소계의 상관계수 구하기

상관계수 분석 결과 고령자 비율과 외국인 비율은 각각 0.2, 0.1 정도로 상관관계가 거의 없다고 판단이 됩니다.
하지만, 인구수와 비교해봤을 때 0.3 이상으로써 약한 상관관계가 존재한다고 말할 수 있을 것 같습니다.

 

그렇다면 CCTV와 인구수의 관계를 조금 더 들여다보겠습니다.

위의 두 데이터를 표로만 보면 대체 뭘 의미하는지 모르겠죠?

따라서 다음 포스팅부터 시각화에 대한 이야기를 해보겠습니다.

728x90
반응형
LIST
728x90
반응형
SMALL

이번 포스팅은 서울시 CCTV data와 인구현황 data를 분석해 보도록 하겠습니다.

csv와 excel data를 불러오도록 하겠습니다.

 

pandas 모듈 import 하기

복습 차 칼럼 이름명도 다시 바꿔보겠습니다.

서울시 인구 현황 excel파일 읽어오기


본격적으로 시작해 보겠습니다. 먼저 서울시 CCTV 데이터입니다.

먼저 구별 CCTV 데이터에서 CCTV의 개수를 의미하는 소계로 정렬해 보겠습니다.

간단하게 정리해본모습입니다.

도봉구 < 마포구 < 송파구 < 중랑구 < 중구 순으로 CCTV가 제일 없다는 것을 확인할 수 있는데요,
추후 구별 범죄율 분석을 진행할 때 다시 확인하겠지만 강남 3구 중 하나인 송파구의 CCTV가 가장 적은 구 중 하나라는 것을 확인할 수 있습니다.
하지만 송파구는 결코 범죄율이 낮지 않은 구이지만, CCTV가 적은 구 중 하나라는 사실만 알고 넘어갑시다

이어서 CCTV 개수가 가장 높은 순으로 내림차순을 진행해 보겠습니다.

CCTV가 제일 많은 곳은 강남구 > 양천구 > 서초구 > 은평구 > 용산구가 순서로 확인됩니다.

이어서 3년간 CCTV 증가율을 구해서 3년간 CCTV가 제일 많이 증가한 구를 구해 보겠습니다.

 

최근 3년 치 CCTV 개수(2014~2016년) 더하고 2013년 이전 CCTV개수로 나누고 100 곱해서 증가율 구하기

결과를 보면 최근 3년간의 CCTV가 2013년 이전 대비 가장 많이 증가한 곳은

종로구 > 도봉구 > 마포구 > 노원구 > 강동구 순이라는 것을 알 수 있습니다.

 


이번에는 서울시 인구 데이터를 다뤄보겠습니다.

먼저 데이터를 다시 한번 확인해 보죠

0번 인덱스에 위치한 합계는 별로 필요 없는 데이터입니다. (구별 데이터가 중요하기 때문입니다.)
따라서 데이터 삭제 명령어를 이용해 보겠습니다. 

drop() 함수를 이용해 원하는 데이터를 삭제시킬 수 있습니다.

0번 인덱스에 위치하던 합계가 잘 삭제된 것이 확인됩니다.
이어서 지역구의 이름을 의미하는 '구별' 컬럼이 유일한 컬럼(unique column)인지 확인해 봐야 할 것 같습니다.
이유는 혹시라도 중복된 구가 있으면 해당하는 구를 유일하게 만들어 데이터로써 무결하게 사용해야 하기 때문입니다.

unique() 함수를 활용해 해당 컬럼의 데이터가 데이터 프레임에서 한번 이상 나타나 있는지 확인해 봅시다.

이를 유니크 조사라고 합니다

다 잘 나온 것 같지만 문제는 제일 마지막에 nan이 있는 것이 확인됩니다.

nan데이터가 어디에 있는지 확인해 봅시다.

이때 사용할 수 있는 함수는 isnull() 입니다.

26번 인덱스의 데이터가 전부다 NaN인 것이 확인했습니다.

합계처럼 저희에겐 필요 없는 데이터가 될 것 같습니다.
왜냐 하면 우리는 값이 있는 것들만 활용할 예정이기 때문입니다.

값이 없는 26번 인덱스의 데이터는 drop()으로 삭제하겠습니다.

이제부터 본격적으로 구별 전체 인구를 활용해서 먼저 '외국인 비율'과 '고령자 비율'을 계산해 보겠습니다.

각종 기준을 토대로 정렬해서 데이터를 정렬만 해보겠습니다.
지금부터 정렬할 기준들은 다음과 같습니다.
인구수, 외국인, 외국인 비율, 고령자, 고령자 비율

여기까지는 그냥 컬럼 다루기와 정렬하는 연습일까?

열심히 외국인 비율 및 고령자 비율 만들고 그다음 정렬하는 코드도 다시 한번 실습해 보았습니다.
사실 여기까지는 정말 연습 이긴 합니다만

여기에서도 아주 간단하게 데이터를 분석할 수 있습니다.

  1. 인구수가 제일 많은 5 지역은 송파구, 강서구, 강남구, 노원구, 관악구 순입니다.
  2. 외국인이 제일 많은 5 지역은 영등포구, 구로구, 금천구, 관악구, 동대문구 순입니다.
  3. 하지만 외국인 비율이 제일 많은 5 지역은 영등포구, 금천구, 구로구, 중구, 용산구로 외국인 인구수와는 약간 다릅니다.
  4. 고령자가 제일 많은 5 지역은 강서구, 송파구, 은평구, 노원구, 관악구 순입니다.
  5. 하지만 고령자 비율이 제일 많은 5 지역은 강북구, 종로구, 중구, 용산구, 서대문구 순입니다.

이를 토대로 우리가 알 수 있는 것은 무엇일까요?

아직 데이터를 시각화하거나 하는 과정은 하지 않았지만, 몇 가지 생각은 해 볼 수 있을 것 같습니다.

  1. 인구수가 제일 많은 지역은 송파구이지만, 영등포구가 제일 외국인이 많다. 그리고 그 근처라고 할 수 있는 구로구, 금천구 등도 굉장히 외국인이 많다.
  2. 송파구는 고령자가 제일 많지만 고령자의 비율이 높지 않은 것이 확인된다.
    하지만 강북구, 종로구, 중구, 용산구, 서대문구 같은 경우는 인구수 대비 고령자 비율이 많기 때문에 추후 고령화가 우려된다.

같은 형식으로 데이터 분석이 가능하겠네요.

하지만 아직 CCTV와 인구수는 전혀 관련 없잖아요?

다음 포스팅부터 두 데이터를 병합해서 분석해 보겠습니다. 인구 대비 CCTV 현황을 분석 해 보겠습니다.
pandas 고급 사용법으로 이어서 넘어가도록 하겠습니다.

 

728x90
반응형
LIST
728x90
반응형
SMALL

이번 포스팅에서는 pandas의 기본 사용 방법에 대해서 이야기해보겠습니다.

 

파이썬 데이터 분석에는 pandas 사용 빈도가 매우 높습니다.

pandas는 기복적으로 python에서 데이터를 읽어와서 손쉽게 활용할 수 있게 해주는 모듈입니다.

이때 불러온 데이터를 데이터 프레임(Data Frame)이라고 합니다.

 

numpy - 통계 수식 등 수학에 많이 사용되는 라이브러리 -> pandas 와 numpy는 같이 쓰일 때가 많다.

Series는 pandas의 가장 기본적인 자료형입니다.

list 형태로 데이터를 구성하여 data frame을 간단하게 만들 수 있습니다.

pandas의 series 자료형은 파이썬의 리스트로 이루어진 여러 데이터를 한꺼번에 관리 할 수 있다.

날짜 데이터 생성하기

data_range() 함수를 이용하여 날짜를 생성/수정할 수도 있습니다.

시작할 기본 날짜를 지정하고 periods옵션을 이용해 며칠간의 데이터를 발생시킬 것인지 지정해 줄 수 있습니다.

2021/11/20 를 기준으로 5일간 날짜 설정하기

Data Frame 직접 생성하기

데이터 프레임을 직접 생성할 때 필요한 여러 가지 옵션들에 대해 간단히 정리하겠습니다.

첫 번째 인자에는 데이터 프레임을 채울 데이터가 입력됩니다.

iterable 자료구조로 만들어 낼 수 있습니다.(member를 하나씩 차례로 반환 가능한 object - list, str, tuple...)
index 옵션은 데이터 프레임의 인덱스로 지정할 값을 지정합니다.
columns 옵션은 데이터 프레임에서 사용할 컬럼들이 list 형태로 지정됩니다.

index 란 데이터 프레임의 행마다 순서대로 붙어있는 구분자를 의미합니다.

head() 함수를 사용하여 원하는 데이터만 확인할 수 있습니다.

데이터 프레임의 정보 확인하기

index : 데이터 프레임의 인덱스 확인


columns : 데이터 프레임의 컬럼 확인


values : 데이터 프레임의 내부 값 확인하기


info() : 데이터 프레임의 간단한 개요 확인하기

describe() : 통계적 개요 확인하기

데이터 개수 (count), 평균 (mean), 최솟값(min), 최댓값(max) 등

데이터 정렬(sort)

sort_values() 함수를 사용해 정렬을 할 수 있습니다.

이때 필요한 옵션은

by : 정렬 기준으로 삼을 컬럼을 지정
ascending : 내림차순(False), 오름차순(True) 지정

컬럼 Thu를 기준으로 데이터 프레임 정렬하기

데이터 선택 확인

Data Frame에 원하는 컬럼 이름을 넣으면 Series 형태로 해당 컬럼의 데이터가 보입니다.

컬럼 Wed의 Series 확인하기

슬라이스 기법을 활용해서 출력 데이터 범위 지정하기

slice( [ start : end : step ] )을 데이터 프레임에 적용하면 원하는 범위의 데이터를 손쉽게 확인할 수 있습니다.

오프셋 0번부터 1번까지의 행 표시하기

오프셋이 아닌 인덱스의 이름으로도 슬라이스가 가능합니다.

특정 위치의 데이터 확인하기 loc

특정 위치(location)의 데이터만 확인하고 싶을 때는 loc 함수를 사용할 수 있습니다.
loc 함수는 데이터 분석에서 정말 많이 이용되는 함수입니다.
첫 번째 인자는 행(row)을 뜻하고, 두 번째 인자는 열(column)을 뜻합니다.

 

dates 변수의 첫 번째 값을 활용해 해당하는 위치의 값 보기

직접 날짜를 지정해서 해당 날짜의 데이터를 확인하기

loc를 이용해 Mon, Wed 컬럼의 데이터들만 확인해 보겠습니다

이번에는 행에다가도 범위를 지정해 보겠습니다

물론 날짜를 직접 지정해 볼 수도 있습니다

또는, 인덱스를 생성할 때 정의했던 변수를 사용해 볼 수도 있습니다

dates[0]의 Mon, Tue 컬럼 확인. 컬럼을 리스트로 넣지 않으면 값만 확인 할 수 있습니다.

loc는 데이터의 값을 사용, iloc은 행과 열의 번호를 이용할 수 있습니다.

데이터 프레임이 가지고 있는 정확한 행, 열 이름을 정확히 모를 때는 번호(오프셋)를 사용해서 범위를 지정할 수 있습니다.

컬럼 선택을 다음과 같이도 할 수 있습니다.

데이터를 복사할 때는 copy() 함수를 사용

파이썬은 모두 객체죠?

할당과 복사를 다시 떠올려 보세요.

' = ' 만 사용하면 기존 객체가 변수에 할당됩니다.
따라서 copy() 메소드를 활용해 복사를 해야 합니다.

데이터 존재 유무 판단할 때는 isin 함수를 사용

현재 다루고 있는 데이터 프레임에 데이터가 존재하는지, 존재하지 않는지 True, False로 구분할 수 있습니다.
추후 데이터 분석 시에 조건으로써 활용될 수 있습니다.

df2 에서 row별 two와 four가 존재 하는지 판단하기

isin을 조건으로써 활용하여 조건에 맞는 데이터만 가지고 와 보겠습니다

'Fri' column에 'one'과 'two'가 존재하는 row만 가져오기

데이터 프레임에서 간단한 통계 형태로 데이터를 확인할 때는 apply() 함수를 활용

numpy 모듈과 같이 사용하면 간단하게 여러 통계적 데이터를 확인할 수 있습니다.

꼭 numpy 모듈이 아니더라도 우리가 직접 람다 함수를 만들어서 결과물을 확인 할 수도 있습니다.

최댓값 - 최솟값 ( 데이터들의 거리 ) 구하기

 

파이썬 데이터 분석을 위한 데이터 프레임을 pandas를 사용하여 간단하게 활용해보았습니다.

다음 포스팅에서 본격적으로 데이터 분석을 시작해 보겠습니다.

CCTV와 서울시 인구현황 예제로 시작하겠습니다

728x90
반응형
LIST
728x90
반응형
SMALL

pandas는 dataframe을 주로 다루기 위한 라이브러리이며, dataframe을 자유롭게 가공할 수 있습니다.

 

이번 포스팅에서는 파이썬을 활용한 데이터 분석에서 가장많이 활용되는 Data Analysis Library인 pandas에 대해서 알아보도록 하겠습니다. (DataFrame 생성, 정제 및 준비, 삭제, Data 내보내기)

 

pandas는 크게 세가지의 자료구조를 지원하고 있습니다.

1차원 자료구조인 Series, 2차원 자료구조인 DataFrame, 그리고 3차원 자료구조인 Panel을 지원하는데 그 중, 2차원 자료구조로 행과 열이 있는 테이블 데이타(Tabular Data)를 공부해 봅시다.

 

  • Data 분석을 위한 lib

  • DataFrame Create

  • CRUD in Dataframe

CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말이다.

사용자 인터페이스가 갖추어야 할 기능(정보의 참조/검색/갱신)을 가리키는 용어로서도 사용된다.

주로 Database 에서 사용되는 말이지만, 생각해보면 입력된 데이터로부터 어떤 처리과정을 거쳐도 CRUD는 다 적용되는것 같아서 저는 모든 프로그밍 언어를 배울때 중요한 기본기로 봅니다.

 

# CREATE

# READ

# UPDATE

# READ

# DELETE

# READ

  • 키값 or 연속적인 키값을 도출하기

===== 구분선 은 보기 편하시길바라며 ... 햏

  • df.head() / df.tail() -> sample data 출력하기

보기의 예제는 data의 크기가 작아서 한눈에 보기가 쉽지만, big data를 가져오면 10000개가 넘는 row를 가진 dataframe들이 많습니다. 그때, 가장 기본적으로 확인해야하는것이 sample data를 출력하여 data가 가진 정보를 분석하는 것입니다.

  • df = pd.DataFrame(c).T 전치행렬, 컬럼명 변경

     

     

.T (전치 행렬) 를 사용하지 않는 경우 columns 의 갯수를 맞춰주면된다

Pandas를 이용한 DATA 내보내기

  • DataFrame 생성하여 쉼표로 구분된 형식의 새로운csv파일 만들기

print(df)
print(db)

  • 파일을 생성하는 방법

숫자를 수로 사용 - 파일을 분리 혹은 수정본을 위해 구분하여 사용합니다.

 

숫자 순차를 사용하는 이유 - 외부에 있는 파일을 읽을떄 일반적으로 많이 사용합니다.

 

for문을 사용하면 여러개의 파일을 한번에 생선할 수 있다.

 

  • 파일을 생성하지 않고 Test

sys 모듈 : python interpreter 와 관련된 정보와 기능을 제공
sys 모듈을 통해 파일생성을 하지 않고 data를 볼수있다.

 

  • ...,None,... 사이에 None 값 replace

NULL값 대신 다른 문자나 숫자로 대체도 가능하다

  • DataFrame 안에 값이 없을 경우

NaN 값으로 대체되어 출력


DATA 정제 및 준비

  • 결측데이터 여부 확인

  • 결측데이터가 있을때 결측치 채우기

df.to_csv(sys.stdout, na_rep='호랑이') 파일내보내기시 결측값 대처하기

  • 누락된 데이터 골라내기

  • 데이터 변형

  • 데이터 치환

728x90
반응형
LIST
728x90
반응형
SMALL

데이터를 분석하기에 앞서, 데이터를 시각화해서 보는 것은 데이터를 이해하는데 필수적인 요소라고 생각합니다.

 

이번 포스팅에서는 파이썬 기반 시각화 라이브러리인 matplotlib에 대해서 알아보도록 하겠습니다.

 

matplotlib은 다양한 데이터를 많은 방법으로 그래프를 만들고 변화를 줄 수 있도록 하는 파이썬 라이브러리입니다.

 

matplotlib을 사용하기 위해서는 먼저 아래와 같이 matplotlib을 설치하고 import를 해주어야 합니다.

 

  • matplotlib 환경 설정

         File → setting → matplotlib install을 해주면 준비 완료!

 

  • import matplotlib 하는 3가지 방법

  개인적으로, 3번째 방법이 좋은 가독성을 만들어준다고 생각합니다

  • plot 의 종류

  • Graph title

그래프 제목을 'Tiger'로 바꿔보자

  • Data List

인수값을 한개만 입력하면 ( [list 형식] or (tuple 형식)... ) y축의 값으로 설정된다. 

  • Plot 인수값 plt.plot( [y 축], [x 축] )

        ** 주의 **

        인수값이 맞지 않을 경우 >> ValueError: x and y must have same first dimension, but have shapes (5,) and (4,)

        인수값의 차원은 맞춰주어야 한다.

  • Graph grid

    격자의 순서는 show()에서 적용되기 때문에 show() 입력 전엔 꼭 적어야 한다

가독성을 위해 고정틀은 주로 상단에 적어준다 (like title, grid..)

         plt.grid() 의 default 값은 false입니다. 그러므로, True값은 꼭 입력해 주어야 한다.

  • x label y label 지정하기

X축은 'tiger', Y축은 'lion'으로 차트 축 제목을 만들어보자.

  • range를 사용한 인수값

    range 를 가용하여 시작과 끝 값을 설정할 수 있지만, 인수 길이는 같도록 주의해야 합니다.

  • Line colour

line 색상을 다양하게 변경해보자

  • Graph range with Line colour

range 범위값을 이용한 y x 값의 2개의 line 색을 다르게 나타내보자

  • Graph tick mark

 

위와 같은 tick mark를 사용할때는  .-  혹은   - v- 와같이 뒤에 '-'를 붙여사용 합니다.

., ov^<> w1234 sp*hH+xDd로 예시를 봅시다.

k 는 key 값이며 인덱스 번호를 나타내며, v 는 value 값으로 문자열을 나타낸다.
선에 대한 다양한 tick mark를 표현

  • Graph Line Style

  • Graph line detail Style

    선 색깔 굵기 스타일, 마커 종류 크기, 마커 선 색 굵기, 마커 내부 색을 바꿀 수도 있습니다.

무엇을 변경해도 제가 만든표보다 예쁘게 만들수 있으니 다르게 변경도 해보기

  • Graph x/y 축 유효 범위

    plt. x/y lim(start, end)을 사용하여 x축과 y축의 값을 지정할 수 있습니다.

x축 y축의 값의 범위를 지정해보자

  • x / y ticks ( x, y의 눈금자 표시 범위 )

범위설정을 range를 사용하여 지정해주자

  • x / y ticks with rotation

    길이가 긴 범례의 경우, tick 값의 각도를 회전시키면 더욱 보기가 좋습니다.

rotation값을 원하는대로 바꾸면서 돌려보자

  • 인수값, 범례의 label 명과 legend 위치 지정하기

범례의 위치를 바꿔보자

위의 범례의 위치에 따른 값을 사용하여 데이터에 맞도록 설정할 수 있습니다.

오른쪽 하단 = 4

  • 배경 색상

    colour : 0-255까지 사용 가능합니다. 각 색상당 (명도를 나타냄)
    • # 10진수 255를 이용 / 16 진수를 이용 / 비례 값 ex) 0.0(0) - 1.0(255)

  • 출력 그래프 (Window) 창 크기 조절

    figure ( figsize= )를 이용하여 표가 나타나는 window 창의 크기를 조절할 수 있습니다.

colab / jupyter 의 경우 <Figure size 460.8x345.6 with 0 Axes> 로 출력

  • plot 그래프를 여러 개 나타내는 것

    subplot ( plot 가로 값, 세로 값, 창 순번의 위치 값 )
    • 단, 그래프가 겹쳐지지 않게끔 조절해주어야 합니다.

  • y 축 2개 사용 (나이에 따른 age와 height)

    twinx()를 사용하여 y축의 값을 추가할 수 있습니다.

  • Capture 결괏값을 저장할 때 그림파일로 바로 저장하기

        gcf() 를 통해 Figure 객체를 얻어 사용합니다. (변수값부터 얻어 사용)

        그다음, fig.savefig('파일명')으로 파일을 저장합니다.

  • Bar chart ( bar )

bar차트로 나타내보자

  • Horizontal Bar chart ( barh )

  • align = 'center' / 'edge'

    차트의 축(=눈금선) 위치를 가운데 또는 끝에 맞출 수 있습니다.

잘 모르겠죠? rotation = 90 로 회전시켜 정확한 위치를 확인하기

  • Bar 차트 속성

ctrl+b를 통해 bar의 default 값을 알 수 있습니다.

또는, 오른쪽 마우스+GO to..+declaration or usages

 

확인해보면, 아래와 같은 순서로 default값들이 나열되므로, 원하는 값으로 맞춰서 사용하면 간략하고 쉽게 나타낼 수 있습니다.

 

# x, height, width = 0.8, bottom = None(기준값의 밑바닥), *, align = 'center' 속성 사용, data = None, ** kwargs 가변 인수 값 처리):

# alpha = 막대 색깔과 배경과 섞이는 정도를 의미합니다. <- alpha blending 

지금까지 간단하게 matplotlib를 이용하여 기본 그래프를 그리는 방법에 대해서 알아보았습니다.
모든 코드를 외우려 하지 말고 표현하고자 하는 의미를 알아두고 응용부터 시작해 봅시다.

위의 모든 default값을 외우고 있는 사람은 거의 없고 다들 한마음 한뜻으로 찾아본다고 조심스럽게 생각합니다.

저는 외우지 못해서 기록하기 위한 Yuja_smoothie의 노트였습니다~!

728x90
반응형
LIST

+ Recent posts