TIL
2021-04-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()

동탄 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동의 연령별 인구데이터를 시각화했다.

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)

위와 같이 한글이 깨져서, 라이브러리의 다른 언어 지원 함수를 사용했다.
plt.rc('font', family='Malgun Gothic')
막대그래프로 표현한 동탄2동의 인구데이터


데이터의 시각화에는 성공했지만, 데이터로 얻을 수 있는 정보는 없었다.
단순 연습을 위한 과정이었다.
제주도의 남녀 비율은?

제주도 전체 남성의 비율이 약 (50.18 - 49.82)정도로 더 많다.
경기도는 어떨까

경기도 지역의 남녀 성별 비율 역시 남성이 조금 더 많았다.
전체 연령 분포가 아닌 제주특별자치도의 연령별 인구의 차이는 어떨까?
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


제주도의 60대 이전에는 남성 인구가 더 많고, 60대를 넘어가면 여성인구가 더 많아짐을 알 수 있었다.
산점도로 제주특별자치도의 인구 시각화하기
산점도란?
산점도란 2개의 연속형 변수 간의 관계를 보기 위하여 직교좌표의 평면에 관측점을 찍어 자료를 표시 하는 통계 그래프입니다. 각 측정값은 두 변수를 의미하는 (x, y)의 점으로 나타냅니다.
두 변수간 상관관계를 알기 위해 사용하는 통계자료임을 알 수 있는데, 이를 통해 x에 대한 y의 상관관계를 시각화할 수 있겠다.


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()

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

위 그래프를 만들었다.
데이터의 추출은 쉬웠으나, 데이터의 시각화를 위해 필요한 함수를 설계하는 방법에 대해서 책이 예제를 통해 설명해주고 있다.
scatter plot 를 봤을 땐,
위 꺾은선 그래프에서 보기 애매했던 정보들을 더 잘 볼수 있게 되었다.
예를 들어, 제주 지역은 100~60대까지는 여성인구 수가 더 많으며, 50대 ~ 까지는 남성인구 수가 더 많았다.
또, 그에 특정 연령대의 인구 수도 bubble chart로 표현도 해서 그 연령대의 인구 수도 시각화 할 수 있게 되었다.
유무임승차 데이터 분석
사용한 데이터 : 2021년 01월 교통카드 통계자료
https://pay.tmoney.co.kr/ncs/pct/ugd/ReadTrcrStstDtl.dev?useYm=202101&rgtDtm=20210203094931
디코딩 오류
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로 저장.

무척이나 간단한 데이터 정제이긴 하지만.. 이와 같은 작업을 데이터 정제라고 한다.
유임 승차 비율이 가장 높은 역은?
유임승차 비율 == 유임승차/(유임승차 + 무임승차)(단위: 명) 로 정의한다.
#-*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 |