파이썬(Pandas) - 데이터 분석을 위한 오픈데이터 수집 및 데이터프레임 구조화

4 분 소요

Pandas를 통한 향상된 데이터 분석을 위한 데이터 프레임 병합

Pandas, 데이터를 전처리하고 병합하기 - merge()

이 예제에서는 pandas의 merge() 함수를 사용하여 데이터를 병합한다. 수집한 2가지 데이터를 병합하여 분석에 사용할 데이터를 만든다.

merge()

두 개의 데이터프레임을 합쳐주는 함수이다. 두 데이터프레임에서 공통된 컬럼을 기준으로 병합한다.

merge() 함수는 기본적으로 내부 조인(inner join)을 실행한다. 내부 조인은 두 데이터프레임에서 공통된 컬럼의 값이 일치하는 행만 병합하는 방식이다.

merge() 함수의 how 옵션을 사용하면 조인 방식을 변경할 수 있다.

  • how 옵션의 값으로 left, right, outer, inner를 사용할 수 있다.
    • left : 왼쪽 데이터프레임을 기준으로 병합
    • right : 오른쪽 데이터프레임을 기준으로 병합
    • outer : 양쪽 데이터프레임에 모두 존재하는 데이터만 병합
    • inner : 한쪽 데이터프레임에만 존재하는 데이터는 병합하지 않음

pivot_table() : 피벗 테이블 생성 함수

피벗 테이블을 생성하여, 데이터를 행과 열로 재구성한다.

import pandas as pd

seoul_starbucks = pd.read_excel('./data_output/seoul_starbucks.xlsx', header=0) #이 데이터는 앞에서 만든 데이터
seoul_starbucks.head()

# 스타벅스 주소 정보에서 시군구명 추출하고, '시군구명' 컬럼 추가
sgg_names = []
for address in seoul_starbucks['주소']:
    sgg = address.split()[1]
    sgg_names.append(sgg)
seoul_starbucks['시군구명'] = sgg_names
print("시군구 추가된 데이터 :: ", seoul_starbucks.head())
print("=============================================")
  • 출력 결과
    시군구 추가된 데이터 ::      
           매장명         위도          경도       매장타입                          주소       전화번호 시군구명
    0  역삼아레나빌딩  37.501087  127.043069  리저브 매장 2번     서울특별시 강남구 언주로 425 (역삼동)  1522-3232  강남구
    1   논현역사거리  37.510178  127.022223  리저브 매장 2번    서울특별시 강남구 강남대로 538 (논현동)  1522-3232  강남구
    2  신사역성일빌딩  37.513931  127.020606  리저브 매장 2번    서울특별시 강남구 강남대로 584 (논현동)  1522-3232  강남구
    3   국기원사거리  37.499517  127.031495  리저브 매장 2번    서울특별시 강남구 테헤란로 125 (역삼동)  1522-3232  강남구
    4  대치재경빌딩R  37.494668  127.062583  리저브 매장 2번  서울특별시 강남구 남부순환로 2947 (대치동)  1522-3232  강남구
    

엑셀 파일로 저장

seoul_starbucks.to_excel('./data_output/seoul_starbucks_list.xlsx', index=False)

스타벅스 분석 데이터 만들기

import pandas as pd

# 시군구 목록 데이터 불러오기
seoul_sgg = pd.read_excel('./api_files/seoul_sgg_list.xlsx', header=0)
print("시군구 데이터 :: ", seoul_sgg.head())  
print("=============================================")
  • 출력 결과
    시군구 데이터 ::    
    시군구코드  시군구명        위도         경도
    0  11320     도봉구     37.665861  127.031767
    1  11380     은평구     37.617612  126.922700
    2  11230   동대문구     37.583801  127.050700
    3  11590     동작구     37.496504  126.944307
    4  11545     금천구     37.460097  126.900155
    

서울시 스타벅스 매장 목록 데이터 불러오기

seoul_starbucks = pd.read_excel('./data_output/seoul_starbucks_list.xlsx')
print("스타벅스 데이터 :: ", seoul_starbucks.head())
print("=============================================")
        매장명         위도          경도       매장타입                          주소              전화번호 시군구명
0  역삼아레나빌딩  37.501087  127.043069  리저브 매장 2번     서울특별시 강남구 언주로 425 (역삼동)  1522-3232  강남구
1   논현역사거리  37.510178  127.022223  리저브 매장 2번    서울특별시 강남구 강남대로 538 (논현동)  1522-3232  강남구
2  신사역성일빌딩  37.513931  127.020606  리저브 매장 2번    서울특별시 강남구 강남대로 584 (논현동)  1522-3232  강남구
3   국기원사거리  37.499517  127.031495  리저브 매장 2번    서울특별시 강남구 테헤란로 125 (역삼동)  1522-3232  강남구
4  대치재경빌딩R  37.494668  127.062583  리저브 매장 2번  서울특별시 강남구 남부순환로 2947 (대치동)  1522-3232  강남구

시군구별 스타벅스 매장 수 세기

피벗 테이블로 시군구별 스타벅스 매장 수 세기 pivot_table() : 피벗 테이블 생성 함수 피벗 테이블은 데이터 열 중에서 두 개의 열을 각각 행 인덱스, 열 인덱스로 사용하여 데이터를 조회하여 펼쳐놓은 것 데이터 중에서 자신이 원하는 데이터만을 가지고 원하는 행과 열에 데이터를 배치하여 새로운 보고서를 만드는 기능이다.

starbucks_sgg_count = seoul_starbucks.pivot_table(
                                                index='시군구명', #그룹화할 컬럼
                                                values='매장명', #결과에 포함할 컬럼
                                                aggfunc='count' #항목 수 세기
                                                ).rename(columns={'매장명':'스타벅스_매장수'}) #'매장명'을 '스타벅스_매장수'로 변경, rename(columns={'바꾸고 싶은 컬럼명':'바꿀 컬럼명'})

print("시군구별 스타벅스 매장 수 :: ", starbucks_sgg_count.head())
  • 출력 결과
    시군구별 스타벅스 매장 수 ::        
    시군구명  스타벅스_매장수
    강남구         88
    강동구         17
    강북구          6
    강서구         25
    관악구         12
    

병합 : merge() 함수 사용

서울시 시군구 목록 데이터와 시군구별 스타벅스 매장 수 데이터 병합

merge(데이더프레임1, 데이터프레임2, how=’left’, on=’기준컬럼명’)

  • how는 병합 방식을 지정한다.
  • how : left, right, outer, inner
  • left: 왼쪽 데이터프레임을 기준으로 병합
  • right: 오른쪽 데이터프레임을 기준으로 병합
  • outer : 양쪽 데이터프레임에 모두 존재하는 데이터만 병합
  • inner : 한쪽 데이터프레임에만 존재하는 데이터는 병합하지 않음
  • on : 기준이 되는 컬럼명
seoul_sgg = pd.merge(seoul_sgg, starbucks_sgg_count, how='left', on='시군구명')
print("seoul_sgg :: ", seoul_sgg.head())
  • 출력 결과
      시군구코드  시군구명         위도          경도  스타벅스_매장수
    0   11320       도봉구      37.665861  127.031767         6
    1   11380       은평구      37.617612  126.922700        13
    2   11230       동대문구    37.583801  127.050700        10
    3   11590       동작구      37.496504  126.944307        11
    4   11545       금천구      37.460097  126.900155        12
    

서울시 시군구별 인구 데이터 불러오기

seoul_sgg_pop = pd.read_excel('./data_output/sgg_pop.xlsx')
print("seoul_sgg_pop :: ", seoul_sgg_pop.head())
  • 출력 결과
    seoul_sgg_pop ::
    GIGAN SUM JACHIGU    SEDAE    GYE_1  NAMJA_1  YEOJA_1    GYE_2  NAMJA_2  YEOJA_2   GYE_3  NAMJA_3  YEOJA_3  SEDAEDANGINGU  N_65SEISANGGORYEONGJA
    0  2023 1/4  합계      소계  4463385  9668008  4672170  4995838  9426404  4566299  4860105  241604   105871   135733           2.11                1690961
    1  2023 1/4  합계     종로구    72679   152212    72819    79393   141060    68170    72890   11152     4649     6503           1.94                  28265
    2  2023 1/4  합계      중구    63862   131390    63576    67814   120963    58699    62264   10427     4877     5550           1.89                  25353
    3  2023 1/4  합계     용산구   109735   232482   112608   119874   217756   104640   113116   14726     7968     6758           1.98                  39478
    4  2023 1/4  합계     성동구   133513   287240   139171   148069   280240   136233   144007    7000     2938     4062           2.10                  48238
    

서울시 시군구별 인구 데이터와 시군구별 스타벅스 매장 수 데이터 병합

seoul_sgg = pd.merge(seoul_sgg, seoul_sgg_pop, how='left', on='시군구명')
print("seoul_sgg :: ", seoul_sgg.head())
  • 출력 결과
    seoul_sgg :: 
      시군구코드  시군구명       위도        경도    스타벅스_매장수   주민등록인구
    0       11320    도봉구  37.665861  127.031767                6        312858
    1       11380    은평구  37.617612  126.922700               13        468766
    2       11230  동대문구  37.583801  127.050700               10        354884
    3       11590    동작구  37.496504  126.944307               11        390377
    4       11545    금천구  37.460097  126.900155               12        242467
    

서울시 시군구 목록 데이터에 서울시 시군구별 사업체 수 통계 데이터를 병합

seoul_sgg_biz = pd.read_excel('./data_output/sgg_biz.xlsx', header=0)
seoul_sgg = pd.merge(seoul_sgg, seoul_sgg_biz, how='left', on='시군구명')
print("seoul_sgg :: ", seoul_sgg.head())
  • 출력 결과
    seoul_sgg ::     
    시군구코드  시군구명         위도          경도  스타벅스_매장수  주민등록인구    종사자수   사업체수
    0  11320   도봉구       37.665861  127.031767               6       312858      79097     25391
    1  11380   은평구       37.617612  126.922700              13       468766     109031     36509
    2  11230  동대문구      37.583801  127.050700              10       354884     146383     42813
    3  11590   동작구       37.496504  126.944307              11       390377     109281     27915
    4  11545   금천구       37.460097  126.900155              12       242467     255449     47964
    

엑셀 파일로 저장

seoul_sgg.to_excel('./data_output/seoul_sgg_stat.xlsx', index=False)

댓글남기기