Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

TIL

2021-04-02(금) : 데이터 분석 본문

2021/일일 기록

2021-04-02(금) : 데이터 분석

ililillllllliilli 2021. 4. 2. 23:02

20210402(금)



1. 학습 날짜 : 20210402(금)


2. 학습 시간 :


3. 학습 주제 : 모두의 데이터분석


4. 동료 학습 방법 : 개인


5. 학습 목표 : 데이터분석 책


6. 학습 내용 :


0. 실제 코딩에 사용한 시간 :

6시간

 

오늘 목표

  • 모두의 데이터 분석 ~140
  • 동네 인구 구조의 시각화
  • ~ 대중교통 데이터 시각화

한 지역의 인구 데이터 시각화


import csv
import matplotlib.pyplot as plt

f = open('..\\age.csv')
data = csv.reader(f)

age_data = []

for row in data :
    if '동탄2동' in row[0] :
        for i in range(0, 100) :
            age_data.append(int(row[i + 3]))

plt.style.use('ggplot')
plt.plot(age_data)
plt.show()
image-20210402142232310

동탄 2동의 연령대 :

10대와 그 부모 나이인 40~50대 연령대가 많으며, 30대와 50대 중후반 연령층의 인구가 비슷하다.



파이썬으로 입력 데이터 받아 특정 동의 인구 데이터를 시각화하기


ㅁValueError                                Traceback (most recent call last)
<ipython-input-20-15a6576a16fa> in <module>
     10     if county in row[0] :
     11         for i in range(0, 100) :
---> 12             age_data.append(int(row[i + 3]))
     13 
     14 plt.style.use('ggplot')

ValueError: invalid literal for int() with base 10: '1,053'

특정 데이터를 뽑으려고 했더니, thousands separator 때문에, 숫자를 int형으로 바꿀 수 없었다.

따라서, string의 replace()로 comma를 제거해준 뒤, 동탄1동의 연령별 인구데이터를 시각화했다.

image-20210402143256435

matplotlib의 언어 깨짐 현상

C:\Users\\AppData\Roaming\Python\Python38\site-packages\matplotlib\textpath.py:65: RuntimeWarning: Glyph 46041 missing from current font.
  font.set_text(s, 0.0, flags=LOAD_NO_HINTING)
image-20210402144106425

위와 같이 한글이 깨져서, 라이브러리의 다른 언어 지원 함수를 사용했다.

plt.rc('font', family='Malgun Gothic')



막대그래프로 표현한 동탄2동의 인구데이터

image-20210402150330496
image-20210402152843831

데이터의 시각화에는 성공했지만, 데이터로 얻을 수 있는 정보는 없었다.

단순 연습을 위한 과정이었다.



제주도의 남녀 비율은?


image-20210402163339143

제주도 전체 남성의 비율이 약 (50.18 - 49.82)정도로 더 많다.

경기도는 어떨까

image-20210402163522678

경기도 지역의 남녀 성별 비율 역시 남성이 조금 더 많았다.


전체 연령 분포가 아닌 제주특별자치도의 연령별 인구의 차이는 어떨까?

COUNTY_NUM = 1
SUM_NUM = 2
MAN_NUM = 101
GIRL_NUM = 101

for row in data :
    if province in row[0] :
        for column in row[COUNTY_NUM + SUM_NUM : COUNTY_NUM + MAN_NUM + SUM_NUM] :
            m_pop.append(int(column.replace(',','')))
        for column in row[COUNTY_NUM + MAN_NUM + SUM_NUM * 2 : ] :
            w_pop.append(int(column.replace(',','')))
        break
image-20210402165332135
image-20210402170418255

제주도의 60대 이전에는 남성 인구가 더 많고, 60대를 넘어가면 여성인구가 더 많아짐을 알 수 있었다.



산점도로 제주특별자치도의 인구 시각화하기


산점도란?

산점도란 2개의 연속형 변수 간의 관계를 보기 위하여 직교좌표의 평면에 관측점을 찍어 자료를 표시 하는 통계 그래프입니다. 각 측정값은 두 변수를 의미하는 (x, y)의 점으로 나타냅니다.

두 변수간 상관관계를 알기 위해 사용하는 통계자료임을 알 수 있는데, 이를 통해 x에 대한 y의 상관관계를 시각화할 수 있겠다.

image-20210402171945264image-20210402172001473
import csv

f = open('..\\gender.csv')
data = csv.reader(f)
m = []
f = []
name = input('city')
for row in data :
    if name in row[0] :
        for i in range(3, 104) :
            m.append(int(row[i].replace(',', '')))
            f.append(int(row[i + 103].replace(',', '')))
        break

import matplotlib.pyplot as plt 
plt.scatter(m, f, c=range(101), alpha=0.5, cmap='jet')
    # c : color 범위, alpha: 투명도
plt.colorbar()
plt.plot(range(max(m)), range(max(m)), 'g') 
    # range(max(m)) : 읽은 연령대의 최댓값만큼 y=x그래프를 그린다.(추세선)
plt.show()
image-20210402213800970

코드에 약간 더 수정을 가해서

image-20210402213722998

위 그래프를 만들었다.


데이터의 추출은 쉬웠으나, 데이터의 시각화를 위해 필요한 함수를 설계하는 방법에 대해서 책이 예제를 통해 설명해주고 있다.


scatter plot 를 봤을 땐,

위 꺾은선 그래프에서 보기 애매했던 정보들을 더 잘 볼수 있게 되었다.

예를 들어, 제주 지역은 100~60대까지는 여성인구 수가 더 많으며, 50대 ~ 까지는 남성인구 수가 더 많았다.

또, 그에 특정 연령대의 인구 수도 bubble chart로 표현도 해서 그 연령대의 인구 수도 시각화 할 수 있게 되었다.



유무임승차 데이터 분석

사용한 데이터 : 2021년 01월 교통카드 통계자료

https://pay.tmoney.co.kr/ncs/pct/ugd/ReadTrcrStstDtl.dev?useYm=202101&rgtDtm=20210203094931


디코딩 오류

해결 방법 : https://teddylee777.github.io/pandas/%EA%B3%B5%EA%B3%B5%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%95%9C%EA%B8%80%EA%B9%A8%EC%A7%90%ED%98%84%EC%83%81-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95\

UnicodeDecodeError:'cp949' codec can't decode byte 0xbd in position 784: illegal multibyte sequence

오류 발생 이유 :cp949 코덱으로 인코딩 된 파일을 읽어들일때 생김.

해결 방법 : open('파일경로.txt', 'rt', encoding='UTF8')

결과 :

['2021-01', '���ἱ', '213', '����', '59398', '58862', '20782', '20807']
['2021-01', '���ἱ', '214', '�뼺��', '6392', '5378', '3677', '3189']
['2021-01', '���ἱ', '215', 'û��', '19585', '19345', '9066', '9010']
['2021-01', '���ἱ', '216', '��õ', '3190', '2626', '2278', '2220']

처럼 파일이 깨져 보임.

cp949 로 인코딩된 파일을 utf-8로 읽으니 파일을 읽을 수는 있으나, 한글이 깨진다.

*해결 방법 : *엑셀에서 utf-8.csv로 인코딩해서 저장함.

결과 : 파일 자체의 한글이 깨짐

占쏙옙占쏙옙    호占쏙옙쏙옙    占쏙옙ID    占쏙옙占쏙옙철占쏙옙    占쏙옙占쌈쏙옙占쏙옙    占쏙옙占쏙옙占쏙옙占쏙옙    占쏙옙占쌈쏙옙占쏙옙    占쏙옙占쏙옙占쏙옙占쏙옙
21-Jan    1호占쏙옙    1    占쏙옙占쏙역    731660    678117    127534    118937
21-Jan    1호占쏙옙    10    占쏙옙占쏙옙占쏙옙    98645    105308    113919    115644
21-Jan    1호占쏙옙    2    占쏙옙청    371942    366139    46231    43433

최종 해결 방법 : 파일을 다시 받은 뒤, utf-8.csv로 저장.

image-20210402222942788

무척이나 간단한 데이터 정제이긴 하지만.. 이와 같은 작업을 데이터 정제라고 한다.



유임 승차 비율이 가장 높은 역은?

유임승차 비율 == 유임승차/(유임승차 + 무임승차)(단위: 명) 로 정의한다.


#-*coding:utf-8-*-
import csv

f = open('..\\public_t_utf.csv', 'r', encoding='utf-8')
data = csv.reader(f)

mx = 0
rate = 0
next(data)
for row in data :
    for i in range(4, 8) :
        row[i] = int(row[i])
    if row[4] != 0 and row[6] != 0 and (row[4] + row[6] > 10000):
        rate = row[4] / (row[4] + row[6])
        if rate > 0.94 :
            mx = rate
            print(row, '\t rate: ', round(rate, 2))

['2021-01', '2호선', '49', '홍대입구', 1000621, 1034537, 63651, 60858]      rate:  0.94
['2021-01', '경부선', '121', '서울역', 102009, 31498, 5341, 1367]      rate:  0.95
['2021-01', '9호선', '616', '여의도', 456918, 435503, 28847, 26631]      rate:  0.94
['2021-01', '공항철도 1호선', '643', '디지털미디어시티', 262910, 233827, 15303, 14382]      rate:  0.94
['2021-01', '공항철도 1호선', '644', '마곡나루(서울식물원)', 139676, 133259, 7376, 7104]      rate:  0.95
['2021-01', '공항철도 1호선', '645', '김포공항', 208250, 122793, 13053, 9137]      rate:  0.94
['2021-01', '공항철도 1호선', '648', '청라국제도시', 129360, 121701, 7321, 7000]      rate:  0.95
서울역 경부선 95.02

서울역, 경부선이 제일 유임승차 비율이 높다고 나왔다.


오늘은 여기까지.



학습에 도움된 사이트 :


주제 사이트
한글 깨짐 현상 해결 https://teddylee777.github.io/pandas/%EA%B3%B5%EA%B3%B5%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%95%9C%EA%B8%80%EA%B9%A8%EC%A7%90%ED%98%84%EC%83%81-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95

 

'2021 > 일일 기록' 카테고리의 다른 글

2021 05 24(월)  (0) 2021.05.24
2021-04-05 (월) : 데이터 분석  (0) 2021.04.06
2021-03-31(수) : 데이터분석, cub 진행 상황  (0) 2021.04.01
2021-03-30 : 데이터분석  (0) 2021.03.30
20210321(일) : cub 진행상황  (0) 2021.03.22
Comments