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

이번 포스팅에서는 범죄 데이터 분석을 Seaborn을 이용하여 시각화로 나타내 보도록 하겠습니다.

 

우선, 한글이 깨지는것을 방지하기 위해 폰트 이슈부터 해결하겠습니다. 

이어서 바로 그래프도 보겠습니다.

상관관계를 아주 손쉽게 시각화해서 보여주고 있습니다.

잠시 분석을 해보면

  • 강도 - 폭력
  • 살인 - 폭력
  • 강도 - 살인

전부다 양의 상관 관계를 갖는다는 것이 확인됩니다.

즉 예를 들어 강도를 기준으로 한다면 폭력과 살인이 많이 일어난다는 이야기가 됩니다.

다음은 CCTV와 살인, 강도에 대한 그래프를 확인해보겠습니다.

 

위의 시각화 데이터를 보면 분명히 인구수가 증가할수록 범죄가 증가하는 것이 확인됩니다.

특히 살인은 매우 많이 일어나는 것이 확인되네요
또한 CCTV와 살인은 상관관계가 낮아 보입니다.( 그래프의 기울기 확인 )

하지만 CCTV가 없을 때 살인사건이 많이 일어나는 것이 확인됩니다.

다음은 인구수와 살인 및 폭력 검거율을 확인해보겠습니다.

이번 분석은 음의 상관관계를 의미합니다. 인구수가 많아질수록 폭력 검거율은 줄어들고, CCTV가 많아질수록 검거율도 낮아지네요??

다음은 heatmap을 이용해서 전체 검거율을 확인해보겠습니다.

이때 검거 항목 최고값을 100으로 한정 해 놓고 계산하겠습니다.

결과를 보니 절도 검거율은 다른 검거율에 비해서 매우 낮다고 볼 수 있겠습니다.

그래프의 하단으로 갈수록 검거율이 낮아지는데, 강남 3구 중 하나인 서초구가 보입니다.
검거율이 우수한 지역은 도봉구, 광진구, 성동구가 있네요.

이어서 정규화된 발생 건수로 확인해 보겠습니다.

발생 건수로는 강남구, 양천구, 영등포구가 범죄 발생 건수가 높게 나타납니다. (그리고 송파구와 서초구도 높네요)

 

이번 포스팅에서는 앞서 정리한 데이터를 Seaborn을 사용하여 시각화로 나타내 보았습니다. 시각화 분석이 조금 더 한눈에 들어오는 것 같죠? Seaborn을 활용하면 더욱 다양하고 예쁘게 시각화를 할 수 있습니다. 

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

이번 포스팅에서는 좀 더 편리하게 시각화하기 위해  Seaborn에 대하여 알아보도록 하겠습니다.

우선, Seaborn은 matplotlib을 기반으로 만들어져 통계 데이터 시각화에 최적화된 인기 라이브러리

Seaborn을 활용하면 시각화가 쉬워 집니다

사실 외울게 많습니다...ㅠㅠ

먼저 터미널이나 명령 프롬프트에서pip install seaborn을 입력하여 seaborn 모듈을 설치합니다.

Seaborn 은 좀 더 예쁘게 시각화할 수 있도록 도와줍니다.


간단한 비교를 위해 seaborn을 사용하지 않고 matplot만 사용하여 그래프를 그려 보겠습니다.

기초적인 시각화도 예쁘지만 이번엔 seaborn을 활용해서 여러 가지 스타일을 지정해 보겠습니다.

seaborn을 사용할 때 반드시 matplotlib 모듈도 같이 import 되어 있어야 합니다.

Seaborn에 있는 몇 가지 연습 데이터셋을 사용해 보도록 하겠습니다.

먼저 요일별 점심, 저녁, 흡연 여부와 식사 금액과 팁을 정리한 데이터입니다.

위 데이터는 단순히 요일별 매출을 시각화해본 그래프입니다.

이것만으로도 충분히 시각화가 쉬워지지만, hue라는 옵션을 이용하면 또 다른 데이터를 이용해서 데이터를 구분해 볼 수 있습니다.

위의 그래프를 확인해보면 흡연자가 더 결제범위가 큰 것이 확인됩니다

이번엔 약간 다른 스타일의 그래프를 그려 보겠습니다.

결제 금액과 종업원에게 주는 팁에 대한 회귀 분석 시각화입니다.
lmplot을 활용하면 간단하게 데이터 분석이 가능합니다.

적절한 상관계수를 확인할 때 사용하기 좋은 lmplot

회기 분석은 간단하게 말해서 예전에 그려봤던 상관계수라고 보시면 될 것 같습니다.
일전에 상관계수를 데이터와 데이터 사이에 상관 정도를 구해서 분석의 용도로 활용했는데, 회기 분석은 그 상관관계를 구하는 조금 더 정확한 방법이라고 보시면 될 것 같습니다.
즉, 위의 그래프에서 제시하는 결제금액에 따른 적절한 팁 액수를 확인할 수 있다는 것입니다.

결론적으로 "total_bill과 tip은 양의 상관관계를 갖는다"라고 이야기합니다.( total_bill이 많아질수록 tip이 많아지는 걸 알 수 있습니다)
또한 유효한 범위까지 그림으로 그려주는 것이 확인됩니다.

hue를 이용해서 흡연자로 비교해 보겠습니다.

lmplot 시각화도 hue옵션을 가질 수 있고, palette 옵션을 이용해 색상도 지정해 주었습니다.

다음은 연도 및 월별 항공기 승객수를 기록한 데이터입니다

연도 및 월별 항공기 승객수로 구분하기 위해 pivot_table을 활용하겠습니다.

값 별 수치를 색상으로! heatmap을 사용하여 데이터 확인하기

heatmap을 활용하면 수치 별 시각화를 정말 쉽게 확인할 수 있습니다.

일전 데이터를 보고 pivot을 활용한다면 heatmap으로 데이터를 확인해보세요!

각 항목별 비교로 확인해 보기 pairplot

머신러닝에서 많이 사용되는 아이리스 꽃에 대한 데이터입니다. 각각의 데이터가 의미하는 바는 다음과 같습니다.

  • Species : 붓꽃의 종. setosa, versicolor, virginica 세 가지 값 중 하나
  • Sepal.Width : 꽃받침의 너비
  • Sepal.Length : 꽃받침의 길이
  • Petal.Width : 꽃잎의 너비
  • Petal.Length : 꽃잎의 길이

아주 간단하게 데이터 분석이 가능해집니다.

아이리스 예제는 인공지능 머신러닝에서 매우 중요하게 다뤄지는 예제입니다.

지금까지

다음 포스팅에서는 이전의 범죄 데이터를 활용하여 시각화 분석을 해보도록 하겠습니다.

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

이번 포스팅에서는 지난 포스팅에 이어서 pivot 테이블을 활용한 범죄 데이터 정리를 해보도록 하겠습니다.

 

csv 파일을 불러오는 방법은 아래 포스팅에서 더욱 자세하게 설명을 해두었으니 참고하시면 됩니다~!

https://yuja-k.tistory.com/4

 

[Python] Pandas를 활용한 파이썬에서 csv, excel 파일 읽어오기

이번 포스팅에서는 Pandas를 활용한 파이썬에서 csv, excel 파일 읽어오는 방법에 대해서 알아보도록 하겠습니다. pandas를 이용해 csv 파일을 불러오기 위해서는 아래와 같이 pandas를 먼저 import 해야

yuja-k.tistory.com

우선, 저장해둔 범죄 데이터.CSV 를 불러오도록 하겠습니다.

pandas의 pivot table을 사용하여, 데이터를 구별하고 정리할 수 있을 것 같습니다.
이때, 우리가 원하는 것은 구별 범죄 발생 횟수 검거 횟수의 합이기 때문에 이전 포스팅에서 배운 aggfunc=np.sum도 사용해야 합니다.

 

aggfunc=np.sum에 대한 설명은 아래 포스팅을 참고하시면 됩니다~!

https://yuja-k.tistory.com/11

 

[Python] pivot_table을 활용해 원하는 기준 만들기

이번 포스팅에서는 pandas의 pivot_table을 활용해 원하는 기준을 만들어 보도록 하겠습니다. pivot table을 이용해 우리가 할 수 있는 것? pivot 테이블의 가장 큰 목

yuja-k.tistory.com

aggfunc=np.sum을 활용하여 매우 손쉽게 데이터가 정리 되었습니다!

다음은 범죄에 대한 검거율을 계산 해보겠습니다.
검거 횟수 / 범죄 발생 횟수 * 100을 해주면 검거율을 구할 수 있습니다.


여기서! 검거율을 구했다면, 더 이상 검거 건수는 검거율로 대체할 수 있기 때문에 각종 범죄에 대한 검거 컬럼은 삭제합니다.

그런데 검거율이 100이 넘어버리는 곳도 있습니다. 왜냐하면, 전년도에 발생한 검거 건수도 포함되어서 그렇습니다.
그렇기 때문에 검거율이 100이 넘는 경우는 그냥 100으로 통일하겠습니다.

뒤에 붙은 발생이라는 단어도 삭제해 줍시다. 쉽게, rename 함수를 사용해서 바꿔보도록 하겠습니다.

데이터 표현을 위해 데이터를 다듬자! - 정규화(normalize)

데이터를 확인해 보면 강도와 살인 데이터는 2 자릿수 데이터지만, 절도와 폭력은 네 자릿수 데이터입니다.

숫자 자체로도 중요한 데이터지만, 각각의 범죄 발생 건수를 비슷한 범위에 놓고 비교하는 것이 편리할 때가 있습니다.
절도 1건이 살인 1건과 같지는 않습니다.

하지만, 각 항목의 최대 값을 1로 계산하여 그 비중 자체로 이야기하는 것이 쉽게 볼 수 있어, 데이터를 분석하기에도 편합니다. 
추후 범죄 발생 건수를 종합적으로 비교하기 위해 우리는 각 컬럼 별로 데이터를 정규화해보겠습니다.

머신러닝 모듈 사용하기 sklearn

파이썬의 머신러닝 모듈인 sklearn의 preprocessing 기능을 활용하면 손쉽게 최댓값과 최솟값을 비교하면서 정규화를 진행할 수 있습니다.

CCTV 데이터와 합쳐봅시다

1장에서 했었던 인구수와 CCTV의 관계를 다시 떠올려 봅시다. 1장에서 했었던 내용은 범죄와는 전혀 상관없는 내용이었습니다.
하지만 지금은 이야기가 달라졌죠. 구별 CCTV와 인구수를 가져와서 범죄율과 얼마나 상관성이 있는지 확인해보겠습니다.

다음은 모든 범죄에 대한 정규화된 발생 건수를 합쳐서 통합적인 범죄에 대한 관리까지 진행하겠습니다.
이전에서 정규화를 진행하였기 때문에 범죄에 대한 총합을 관리 하기가 매우 수월해졌습니다.(물론 범죄의 경중을 논하는 게 아닙니다)

마찬가지로 검거율도 통합하겠습니다. (추후 검거 평균을 내기 위해 사용합니다)

데이터를 모두 다 완성시켰습니다.

구별로 각종 범죄들이 정규화되어 있고, 범죄별 검거율 및 통합 검거율까지 완벽하게 들어갔습니다.

 

이번 포스팅을 통해서는 pivot 테이블을 활용하여, 범죄 데이터의 각 컬럼별로 데이터를 정규화를 통해 정리해보았습니다.

이제 시각화를 해볼 텐데, 다음 포스팅에서 Seaborn이라는 도구를 사용해서 분석해보도록 하겠습니다.

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

이번 포스팅에서는 pandas의 pivot_table을 활용해 원하는 기준을 만들어 보도록 하겠습니다.

pivot table을 이용해 우리가 할 수 있는 것?

pivot 테이블의 가장 큰 목적은 우리가 원하는 기준 을 만들어 활용한다는 것입니다.

컴퓨터 부품 판매 데이터를 예제로 사용해보겠습니다.

위의 데이터에서 가게명(Name)으로 정렬해서 확인하고 싶을 때 pivot_table을 활용할 수 있습니다.

Name이 인덱스가 되고, 나머지 값들은 기본적으로 평균값을 표현하게 됩니다.

여기서 인덱스는 이름 말고도 여러 개로 지정해 줄 수 있습니다.

특정 Value만 선택해서 계산을 할 수도 있습니다.

기본적으로 value 자체를 pivot_table로 합치면 평균이 됩니다만, aggfunc(집계 기능) 옵션을 활용하여 합계를 계산할 수도 있습니다.
numpy의 sum(np.sum) 함수를 지정하면 됩니다.

aggfunc를 적절히 이용하면 평균과 합계 등 여러 가지 데이터를 그럴싸하게 보여 줄 수도 있습니다.

pivot table은 언제 써야 할까요?

pivot 테이블 자체는 그리 큰 비중을 차지하지는 않습니다. 하지만 원하는 데이터를 구해내기 위해서 조건문과 반복문을 생각하면 어떻게 될까요?
꽤나 머리 아픈 작업이 될 것 같습니다. 일일이 다 코드로 원하는 데이터를 구해내기보다, pivot table을 사용하여 원하는 데이터를 어떻게 뽑아낼지 테스트해 보고, 구현하는 연습이 많이 필요합니다.

 

다음 포스팅에는 pivot 테이블을 활용한 범죄 데이터 정리를 해보도록 하겠습니다.

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

이번  포스팅에서는 앞서 분석한 CCTV 현황을 그래프로 분석을 해도 록 하겠습니다.

드디어 CCTV현황을 그래프로!

드디어 matplotlib를 이용해 데이터를 시각화해 줄 수 있지만, 아직 한글 처리 문제가 남아있습니다. 기본적으로 matplot은 한글 폰트를 지원하지 않기 때문에 matplotlib의 폰트부터 변경시켜 보겠습니다. 순서는 다음과 같습니다.

  1. platform 모듈 임포트 하기
    • OS를 구분 해 줄 수 있습니다.
  2. matplotlib 모듈 임포트 하기
    • 시각화를 하기 위함이겠죠?
  3. OS를 구분하여 폰트를 각각 설정해 줍니다.

폰트 설정이 끝났으면 다시 한번 결과를 확인해보겠습니다.

pandas 데이터에 바로 plot 명령을 이용해 데이터를 바로 그려 볼 수 있습니다.

예쁘고 쉬운 보기를 위해서 정렬을 해보도록 하겠습니다!

이제! 시각화가 되었으니 다시 한번 분석을 해보도록 하겠습니다. 이번엔 비율입니다!

먼저 시각화가 되어있는 그래프를 보면 CCTV 개수 자체는 강남구가 월등하게 많은 것을 할 수 있습니다.. 또한 가장 CCTV가 많이 없는 그룹도 알 수 있죠? 이어서 인구 대비 CCTV 비율을 계산해보도록 하겠습니다. 간단하게 소계 / 인구 * 100을 하면 될 것 같습니다.

인구수 대비 CCTV 수는 용산구와 종로구가 제일 많은 것을 알 수 있습니다. 송파구는 여전히 인구수로 비교하나, 소계로 비교하나 최하위권을 차지하고 있는 것을 확일 할 수 있습니다.

 

어느 정도 분석은 된 것 같지만 조금 더 자세히 시각화를 해보도록 하겠습니다. scatter를 활용해 보도록 합시다!

표시한 데이터를 대표할 수 있는 직선을 하나 그려보도록 하겠습니다.

직선의 용도는 인구수가 많아질수록 CCTV의 설치량은 많이 지는 것을 한눈에 알아볼 수 있게 해 줍니다. ( 방금 전의 비율과는 무관합니다~!)

그리고 지금 그려보는 직선은 인구별 CCTV에 대한 기준이 된다고 보시면 됩니다.

이제 이 그래프의 직선은 구별 CCTV의 기준값이 됩니다. 이때, 우리가 기준으로 삼을 수 있는 조선은 이 직선에 가장 근접한 점을 찾아보면 됩니다.

 

확인을 해보니 대략 300,000만 명의 인구수일 때, 1,100개의 CCTV가 기준이 된다!라고 볼 수 있습니다.

그렇다면 이 직선을 기준으로 해서 멀리 떨어져 있다는 것은 비정상적으로 많다/ 적다 라는 것입니다.

  • 직선보다 위에 있을수록 CCTV가 인구수에 비해 과하게 설치가 되었다
  • 직선보다 아래 있을수록 CCTV가 인구수에 비해 부족하다

직선과 멀리 떨어질수록 생산도 다르게 표현해주고, 기준점에서 많이 벗어난 구의 이름을 표시해 보도록 하겠습니다.

따라서 직선과의 오차를 구하는 코드를 작성하고, 오차가 큰 순으로 데이처를 정렬해서 그래프를 그려보도록 하겠습니다.

결론

직선을 기준으로, 위에 있는 강남구, 양천구, 서초구, 은평구, 용산구는 서울시 전체의 지역의 일반적인 경향보다 CCTV가 많이 설치되어있습니다.

그리고 송파구, 강서구, 중랑구, 마포구, 도봉구는 일반적인 경향보다 CCTV가 적게 설치된 지역입니다.

특히,

  • 강남구는 월등히 많은 CCTV를 보유하고 있다
  • 송파구는 매우 적은 CCTV를 보유하고 있다

라고 결론을 내릴 수 있습니다.

어려우셨나요? 사실 scatter그래프를 이용해서 분석 한 내용은 정말 고급스러운(어려운) 내용입니다.

다음 포스팅에서는 pandas의 pivot_table을 활용해 원하는 기준 만들기를 해보도록 하겠습니다.

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

이번 포스팅에서는 Matplotlib를 활용한 데이터 시각화에 대해서 이야기해보겠습니다.

 

파이썬의 대표적 데이터 시각화 모듈 - Matplotlib

많은 내용들이 Matplotlib 모듈에 포함되어 있지만, 우리는 주로 pyplot이라는 시각화 도구를 제일 많이 사용합니다.

먼저 import 부터 하겠습니다.

pyplot 함수 불러와서 plt로 앨리어스

아주 간단하게 그래프를 그려 보았습니다.

plot 함수에는 그래프에 표현될 데이터들이 들어가고, 각 x축과 y축은 임의로 지정되어서 숫자가 표시됩니다.
조금 더 복잡하게 삼각함수 그래프를 그려보겠습니다. 물론 numpy를 활용합니다.

figsize: 그림 크기

각종 옵션으로 grid나 x축, y축 라벨을 붙여 그래프에 대한 설명을 시각화할 수 있습니다.

두 개 이상의 그래프를 비교하여 시각화를 해줄 수도 있습니다. (plot만 더 추가)

범례 옵션도 plot 함수에 추가 해주면 범례 표현도 가능합니다.

오른쪽 상단에 표기

또한 lw 옵션을 이용해 선의 굵기를 지정할 수 있고, color 옵션으로 색상도 지정 가능합니다

다른 모양 그래프로 더 알아보겠습니다.

linstyle 옵션으로 선의 모양도 지정할 수 있습니다.

dotted : 점, dahsed : 끊어진 선

데이터가 실제 존재하는 곳에 점을 찍어 줄 수도 있습니다.
marker 옵션을 이용해 점을 찍고, markerfacecolor 옵션을 이용해 색상을, markersize 옵션으로 크기를 지정할 수 있습니다.

scatter를 사용하면 점 그래프가 됩니다.

scatter로 점 그래프 그리기

scatter에서는 마커의 크기를 s 옵션으로 조절합니다.
c 옵션(색상)으로 color map까지 만들어 낼 수 있습니다.

numpy의 랜덤 함수를 이용해서 그래프를 그려 보겠습니다.
loc 옵션으로 평균을, scale 옵션으로 표준 편차를 조절할 수 있습니다.

위의 그래프를 boxplot으로 표현할 수도 있습니다.

boxplot은 나중에 더 자세히 살펴볼 수 있습니다.

2021/02/03 - [Programming/Python] - [Python]Data Visualisation # 시각화 기초 (Plot, Bar)

 

[Python]Data Visualisation # 시각화 기초 (Plot, Bar)

데이터를 분석하기에 앞서, 데이터를 시각화해서 보는 것은 데이터를 이해하는데 필수적인 요소라고 생각합니다. 이번 포스팅에서는 파이썬 기반 시각화 라이브러리인 matplotlib에 대해서 알아

yuja-k.tistory.com

더 많은 옵션 변경을 알고 싶다면 시각화 기초 편을 참고하는 것을 추천합니다.

지금까지 Matplotlib를 활용한 데이터 시각화에 대하여 알아보았고 다음 블로그에서는 CCTV 현황 그래프로 분석해보도록 하겠습니다.

728x90
반응형
LIST
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

지난 포스팅에 이어 이번 포스팅은 Pandas 고급 사용법인 두 데이터를 병합하는 방법에 대하여 알아보겠습니다.

 

서로 다른 두 데이터 프레임을 병합해 보겠습니다.

병합을 통해 우리가 원하는 형태의 데이터 프레임을 만들 수 있습니다.

먼저 알아볼 병합 방식인 concat은 데이터를 기준 키(key) 없이 단순히 인덱스나 컬럼을 기준으로 병합을 진행해 줍니다.

위의 데이터가 잘 확인 됐다면 단순히 열 방향(칼럼 기준)으로 합쳐 보겠습니다.
다른 옵션을 부여하지 않으면 자동으로 열 방향으로 병합됩니다.

특별히 keys 옵션을 활용하면 합쳐진 데이터 별 인덱스를 새로 부여할 수 있습니다.
인덱스가 왼쪽에 위치할수록 깊이가 얕습니다. 이 때 인덱스의 깊이를 level 이라고 합니다.

level을 확인해 보겠습니다.

 

레벨에 따른 인덱스 확인하기 -> level = 0
레벨에 따른 인덱스 확인하기 -> level = 1

서로 다른 인덱스와 컬럼을 가진 데이터 프레임을 합쳐 보겠습니다.

df1도 확인 해 볼까요?

axis 옵션을 이용하면 행 (row - 가로방향) 기준 또는 열 (column - 세로 방향) 기준을 설정해 줄 수 있습니다.

 

  • axis가 0이면 세로 병합 - 컬럼 기준
  • axis가 1이면 가로 병합 - 인덱스 기준

axis가 1이기 때문에 가로(row)로 병합이 되는 것이 확인이 됩니다.
문제는 NaN 데이터의 존재입니다.

각 데이터 프레림별 해당하는 인덱스에 알맞은 데이터가 존재하지 않기 때문에 표현할 수 없는 값은 NaN으로 표기됩니다.

예를 들어 df1은 원래 인덱스 6번이 없었는데 concat에 의해 병합되면서 인덱스가 부여가 되었습니다.

하지만, 6번 인덱스에 표현할 값이 없기 때문이고, 2번 인덱스에는 표현할 값이 있기 때문에 NaN 으로 처리되지 않습니다.

마찬가지로 df4는 인덱스 0번과 1번에 데이터가 없었기 때문에 데이터가 NaN으로 처리되고 있는 것입니다.

concat에 join='inner' 옵션을 부여하면 서로 공통적인 인덱스를 가진 행만 병합이 됩니다.

따라서 공통 인덱스가 아닌 행은 버리게 됩니다.

df1, df4의 공통 인덱스인 2번과 3번만 병합 되었습니다.

join_axes 옵션을 이용하면 기준 데이터 프레임의 인덱스를 지정해줄 수도 있습니다.
이는 합쳐지는 데이터 프레임에 기준 데이터 프레임과 동일한 인덱스가 없으면 해당 row는 버립니다.

기존 인덱스를 무시하고 합쳐지고 나서 새로운 인덱스를 부여하려면ignore_index=True 옵션을 사용하면 됩니다.
이번엔 세로 방향(row)으로 합쳐 보겠습니다.

 

key가 되는 데이터를 기준으로 합쳐주는 merge

concat은 두 개의 데이터 프레임에 공통된 key가 되는 컬럼이 없을 때 사용할 수 있으나, merge는 두 개의 데이터 프레임에 공통으로 묶어 줄 수 있는 key값이 있을 때 사용 할 수 있습니다.

이제부터 공통으로 존재하는 칼럼인 key를 기준으로 merge 기준을 설정하는 on 옵션을 사용하여 공통된 key에 대해서만 합치게 만들어 보겠습니다.

서로 동시에 같이 존재하는 키값인 K0, K2, K3만 합쳐진다. 서로간에 없는 키값에 대한 row는 버린다

how 옵션을 활용하여 기준이 되는 데이터 프레임을 지정할 수도 있습니다.

left 데이터 프레임이 기준이 된다. right에는 없는 K4에 대한 값은 NaN 처리
right 데이터 프레임이 기준이 된다. left에는 없는 K1에 대한 값은 NaN 처리

merge 했을 때 키값이 없더라도 일단 행을 채우고 싶다면(합집합처럼)how='outer'를 사용할 수 있습니다.
참고로, how='inner' 옵션은 첫 번째 merge처럼 공통된 키값에 대한 요소만을 갖습니다.

여기까지 Pandas의 고급 사용법 중 하나인 서로 다른 두 데이터 프레임을 병합해 보았습니다.

다음 포스팅부터는 이어서 CCTV 데이터와 인구현황 데이터를 합치고 분석해보도록 하겠습니다.

728x90
반응형
LIST

+ Recent posts