IT/Data 분석

[용인시 종량제봉투]분석 1회차

송시 2023. 3. 12. 02:11
728x90

요즘 데이터 분석과 머신 러닝등에 관심을 기울이고 있다.

 

수학이나 통계적인 부분이 내겐 쉽지 않기에 몇번이고 포기했었는데 살면서 언젠가 어느곳에선가 사용하게 될 것 같다는 생각이 들어서

 

요즘 짧게 짧게 공부를 해오고 있다.

 

문득 아주 작게나마 연습을 위해 기록을 해야겠다는 생각에 공공 데이터 홈페이지를 방문하여 내 눈에 뛴 것을 선택 했다.

 

"용인도시공사_종량제 봉투 판매업소 현황"

 

정말 특별히 의미있는 것은 아니겠지만 저 곳에서 어떤 의미를 찾을 수 있을까를 추론하려고 하니 콩팥이 설렌다.

 

데이터를 다운로드 받고 판다스로 읽어오려는데 맥북이라 그런가 역시나 인코딩 관련 에러가 발생한다

>>> 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동 주민은 판매하는 편의점을 모를때 도대체 어디에서 구매하는 걸까?

 

등등의 가설과 데이터를 토대로 정답을 구해보려는 나 자신을 발견할 수 있었다. 콩팥이 뛴다.

 

빅데이터의 시대에서 데이터를 우리가 필요한 정보로 바꿀 수 있다면 그것은 매우 콩팥이 뛰는 일일 것이다.

728x90

'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