요즘 데이터 분석과 머신 러닝등에 관심을 기울이고 있다.
수학이나 통계적인 부분이 내겐 쉽지 않기에 몇번이고 포기했었는데 살면서 언젠가 어느곳에선가 사용하게 될 것 같다는 생각이 들어서
요즘 짧게 짧게 공부를 해오고 있다.
문득 아주 작게나마 연습을 위해 기록을 해야겠다는 생각에 공공 데이터 홈페이지를 방문하여 내 눈에 뛴 것을 선택 했다.
"용인도시공사_종량제 봉투 판매업소 현황"
정말 특별히 의미있는 것은 아니겠지만 저 곳에서 어떤 의미를 찾을 수 있을까를 추론하려고 하니 콩팥이 설렌다.
데이터를 다운로드 받고 판다스로 읽어오려는데 맥북이라 그런가 역시나 인코딩 관련 에러가 발생한다
>>> import pandas as pd
>>> pd.DataFrame('yongin.csv')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/rew/Downloads/venv/lib/python3.7/site-packages/pandas/core/frame.py", line 730, in __init__
raise ValueError("DataFrame constructor not properly called!")
ValueError: DataFrame constructor not properly called!
>>> df_yongin = pd.read_csv('yongin.csv')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
생략
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 0: invalid start byte
>>> df_yongin = pd.read_csv('yongin.csv',encoding='cp949')
UTF-8 로 처리해보고자 하였으나, 한글 전용 cp949 로만 성공할 수 있었다.
>>> df_yongin.shape
(1922, 8)
>>> df_yongin.ndim
2
8개의 행을 갖고 있고 1922개의 열 정보를 갖고 있는 2차원 행렬이다.
>>> df_yongin.columns
Index(['거래처명', '행정동', '법정동', '관리지역', '주소', '상세주소', '등록일', '지정번호'], dtype='object')
각 행의 이름은 행정동,법정동,관리지역,지정번호 등의 내용을 정확히 알 순 없지만 대충 느낌적으로 온다.
>>> df_yongin.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1922 entries, 0 to 1921
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 거래처명 1922 non-null object
1 행정동 1922 non-null object
2 법정동 1922 non-null object
3 관리지역 1922 non-null object
4 주소 1922 non-null object
5 상세주소 1182 non-null object
6 등록일 1804 non-null object
7 지정번호 1921 non-null float64
dtypes: float64(1), object(7)
memory usage: 120.2+ KB
지정번호만 float64 형태를 갖고 있다.
머신러닝 보다는 간단한 분석을 하고자 하기에 그대로 object 형태로 사용해본다.
결측치가 대충 보인다
>>> df_yongin.isna().sum()
거래처명 0
행정동 0
법정동 0
관리지역 0
주소 0
상세주소 740
등록일 118
지정번호 1
dtype: int64
>>> '{:.0f}%'.format(720/1922 * 100)
'37%'
절반에는 못 미치지만 상세주소는 매우 높은 결측지를 갖고 있다.
상세주소의 경우는 활용하기 어렵겠지만 문득 결측치가 가장 많이 발생한 관리지역 또는 행정동은 어디일까? 와 같은 분석을 해봐도 재밌겠다는 생각이 문든 든다.
1. 행정동과 법정동이 서로 다른 경우의 거래처명은?
>>> df_yongin[df_yongin['행정동'] != df_yongin['법정동']]['거래처명'].count()
849
>>> df_yongin[df_yongin['행정동'] != df_yongin['법정동']]['거래처명'].head(2)
134 세븐일레븐 백옥대로점
434 (ND)마트
Name: 거래처명, dtype: object
2. 지정번호가 없는 행의 시리얼 정보는?
>>> df_yongin[df_yongin.isna()['지정번호']]
거래처명 행정동 법정동 관리지역 주소 상세주소 등록일 지정번호
1373 롯데마트 수지점 보정동 보정동 기흥구 "상세주소 작가가 임의 삭제함" NaN 2012-05-21 NaN
3. 가장 많은 판매 장소가 있는 행정동 5 곳과 가장 적은 곳 5곳은 ?
>>> df_yongin.groupby('행정동').count()['거래처명'].sort_values(ascending=False).head(5)
행정동
중앙동 110
포곡읍 102
신갈동 93
구갈동 92
동백동 83
>>> df_yongin.groupby('행정동').count()['거래처명'].sort_values(ascending=False).tail(5)
행정동
원천동 3
역삼동 2
영덕동 1
죽전3동 1
상현3동 1
4. 각 구 별 거래처 갯수는?
>>> df_yongin.groupby('관리지역')['거래처명'].count()
관리지역
기흥구 746
수지구 425
처인구 751
5. 거래처가 중복 된 경우가 있을까?
>>> df_yongin['거래처명'].count() - df_yongin['거래처명'].nunique()
88
** 거래처명이 동일한 경우의 수가 총 88개 가 있다. 그런데 거래처와 동일주소를 토대로 중복 여부를 보다 더 정확하게 확인할 수 있다.
예를 들어 아래와 같이 우리마트, 한국유통등이 서로 다른 주소에 있는 것 처럼 말이다.
>>> df_yongin.groupby('거래처명')['거래처명'].count().sort_values(ascending=False)
거래처명
우리마트 7
한국유통 4
싱싱마트 4
농민마트 4
인정마트 4
>>> df_yongin.query('거래처명 == "우리마트"')
거래처명 행정동 법정동 관리지역 주소 상세주소 등록일 지정번호
324 우리마트 원삼면 원삼면 처인구 "상세주소 작가가 임의 삭제함" NaN 2008-01-01 52769.0
505 우리마트 중앙동 김량장동 처인구 "상세주소 작가가 임의 삭제함" 2008-11-27 82100.0
726 우리마트 동부동 마평동 처인구 "상세주소 작가가 임의 삭제함" NaN 2016-02-23 112722.0
727 우리마트 동부동 마평동 처인구 "상세주소 작가가 임의 삭제함" NaN 2020-07-31 112740.0
1436 우리마트 상하동 상하동 기흥구 "상세주소 작가가 임의 삭제함" 2017-06-26 194048.0
1841 우리마트 동천동 동천동 수지구 "상세주소 작가가 임의 삭제함" NaN 2014-01-24 241390.0
1895 우리마트 보라동 보라동 기흥구 "상세주소 작가가 임의 삭제함" 2017-01-09 143996.0
물론 개중에는 진짜 주소가 동일한 경우가 있는 것 같은데 이때는 등록일이 다르기에 중복의 상호명이 있는 경우가 있었다.
또한 추가 확인은 하지 않았지만 주소+상세주소는 동일하나 거래처명이 변경된 경우도 있을 수 있다.
이를 토대로 실제 물리적인 판매 장소의 갯수는 관리지역, 주소, 상세 주소를 기반으로 갯수를 파악해야 할 것 같다.
오늘은 밤이 늦었으니 이정도로 정리해보고자 한다.
재미있었던 것은 이 데이터 분석을 통해서 다른 정보 까지 함께 유추해볼 수 있었다.
종량제 봉투를 한곳에서만 판매하는 상현3동이 뭐하는 곳인가 궁금해서 지도를 보니 상현3동의 50% 이상이 사람이 살지 않는 산이라는 사실을 알게 되었다.
그런데 그 나머지 50% 정도는 역세권인데다 대단지의 아파트가 있는 곳이다.
그럼에도 불구하고 단 한 곳의 편의점에서 종량제 봉투를 판매하고 있었다.
추가로 궁금해서 구글을 통해 상현동 종량제봉투 라고 쳤을 때 21년도 쯤의 누군가의 질문 게시글이긴 한데
근처에 판매하는 곳이 없어서 어디에서 구할 수 있는지를 묻는 질문이였다.
이 분석을 통해 여러 다양한 가설을 해볼 수 있었다.
마트가 없나?
편의점이 없나?
상현3동 주민은 판매하는 편의점을 모를때 도대체 어디에서 구매하는 걸까?
등등의 가설과 데이터를 토대로 정답을 구해보려는 나 자신을 발견할 수 있었다. 콩팥이 뛴다.
빅데이터의 시대에서 데이터를 우리가 필요한 정보로 바꿀 수 있다면 그것은 매우 콩팥이 뛰는 일일 것이다.
'IT > Data 분석' 카테고리의 다른 글
[우주선 생존] 분석 5회차 (0) | 2023.04.02 |
---|---|
[우주선 생존] 분석 4회차 (0) | 2023.03.28 |
[우주선 생존] 분석 3회차 (0) | 2023.03.26 |
[우주선 생존] 분석 2회차 (0) | 2023.03.25 |
[우주선 생존] 분석 1회차 (0) | 2023.03.23 |