본문 바로가기

데이터 분석 학습

[모두의 데이터분석 With 파이썬] Unit.03 리뷰 / 데이터 전처리

2. 2022.03.23 - [데이터 분석 학습] - [모두의 데이터분석 With 파이썬] Unit.02 리뷰 / 주피터, 코랩

1. 2022.03.23 - [데이터 분석 학습] - [모두의 데이터분석 With 파이썬] Unit.01 리뷰 / CSV, 아나콘다, 크롬

 

 

Unit. 03 서울이 가장 더웠던 날은 언제였을까?

최종 결과값인 날짜를 검색했을 때 나온 사진... 떼죽음이라니

이번 장에서 가장 중요한 부분은 데이터를 읽고 전처리하는 과정이다.

 

특히 값이 없는 데이터 수치를 말하는 '결측치'를 어떻게 처리하는지 집중해서 보아야한다.

 

이제 우리는 데이터에게 질문을 해야한다.

질문을 한다는 것은 우리의 인지능력에 맞는 형태로 데이터의 가공방향을 결정한다는 것이다.

 

이번 유닛의 질문은 다음과 같다.

 

'서울의 최고 기온이 가장 높았던 날은 언제였고, 몇 도였는가?'

 

이 질문을 데이터에게 하는 과정은 다음과 같이 정리할 수 있다.

  1. 데이터를 읽어온다.
  2. 순차적으로 최고 기온을 확인한다
  3. 최고 기온이 가장 높았던 날짜의 데이터를 저장한다.
  4. 최종 데이터를 출력한다.

이걸 파이썬 코드로 번역해보자.

 

1. 데이터를 읽어온다

#1. 데이터를 읽어온다.
import csv 
f = open('/content/drive/MyDrive/Python Study/모두의 데이터 분석 with 파이썬/seoul.csv', encoding='cp949') 
data = csv.reader(f)
header = next(data) 
for row in data:
  print(row)
f.close()

 

그런데 보면 기온 데이터는 숫자데이터가 아닌 작은따옴표('')으로 구성된 '문자열 데이터'다. 데이터를 다루기 위해서는 '숫자데이터'가 필요하다. 값을 비교하거나 크기를 비교하기 위해, 기온 데이터는 소수점이 있는 실수(float) 데이터로 변환시켜야 한다. 

 

 

 

#1. 데이터를 읽어온다. + 데이터를 값으로 읽을 수 있게 숫자데이터로 처리한다.
import csv 
f = open('/content/drive/MyDrive/Python Study/모두의 데이터 분석 with 파이썬/seoul.csv', encoding='cp949') 
data = csv.reader(f)
header = next(data) 
for row in data:
  row[-1] = float(row[-1]) #마지막 행을 실수 형태로 변환, 그런데 여기서 오류날걸?
  print(row)
f.close()

코드를 보면 마지막 행 row[-1]을 float() 함수를 이용해 실수로 변환했다.

 

ValueError: could not convert string to float:

 

그러나 오류가 발생한다! 마지막 행에 값이 없는 부분이 존재하기 때문이다. 이를 '결측치'라고 하는데 아주 깨끗한 데이터가 아닌 이상 모든 데이터들이 마찬가지로 이런 결측치가 발생한다.

 

결측치를 처리하는 방법을 '결측치를 보간한다'라고 이야기 한다. 방법은 매우 다양하지만, 데이터를 보는 목적에 위배되지 않는 것이라면 가장 간단한게 좋다. 우리는 최고 기온을 확인하고자 함으로 결측치에는 최고기온이 될 수 없는 값을 인위적으로 넣어 계산해주자

import csv 
f = open('/content/drive/MyDrive/Python Study/모두의 데이터 분석 with 파이썬/seoul.csv', encoding='cp949') 
data = csv.reader(f)
header = next(data) 
for row in data:
  if row[-1] == '' : # 만약 행의 마지막 데이터가 빈 문자열이라면 :
    row[-1] = -999 # -999를 넣어준다.
  row[-1] =float(row[-1])
  print(row)
f.close()

 

결과값: ['2018-09-13', '108', '23.5', '20.3', 28.3] ['2018-09-14', '108', '23.5', '20.3', 26.8] ['2018-09-15', '108', '23.3', '21', 26.0]

 

if 구문을 활용해 마지막 행의 값이 비어있으면, -999도를 넣어주는 것으로 지정해준 뒤 이전과 같이 마지막 행을 실수형태로 바꿔주면 된다. 결과값을 보니 마지막 행이 실수값으로 잘 변환된 것을 확인 할 수 있다. (''작은 따옴표가 없어졌다!)

 

2~4. 데이터 확인하고 저장하고 출력한다

이제 최고기온을 확인하기 위한 '탐색'과 '비교'를 진행해보자.

우선 '최고 기온'을 저장할 변수(max_temp)와 '최고 기온의 가장 높은 날의 날짜'를 저장할 변수(max_date)를 만들어 준다. 그리고 지정한 값이 현재 행의 최고 기온 값보다 크면 '최고 기온 날짜 업데이트' '최고 기온 값 업데이트' 형태로 만들어주자

 

import csv 
max_temp = -999 #최고 기온 값을 저장할 변수, 여기서는 초깃값을 -999로 일단 지정, 어차피 나중에 최신값으로 업데이트 될 거니까 상관 없다.
max_date = '' #최고 기온이 가장 높았던 날짜를 저장할 변수, 문자열 값으로 저장되어 있음으로 작은따옴표를 둘러싸준 빈 문자열 형태로 설정.
f = open('/content/drive/MyDrive/Python Study/모두의 데이터 분석 with 파이썬/seoul.csv', encoding='cp949') 
data = csv.reader(f)
header = next(data) 
for row in data:
  if row[-1] == '' : 
    row[-1] = -999 
  row[-1] =float(row[-1])
#2. 순차적으로 최고 기온을 확인한다.
#3. 최고 기온이 가장 높았던 날짜의 데이터를 저장한다.
  if max_temp < row[-1]: #만약 max_temp가 임의의 행의 마지막 열보다 작으면  
    max_date = row[0] #max_date를 임의의 행 첫 번째 열 데이터로 업데이트 
    max_temp = row[-1] #max_temp를 임의의 행 마지막 열 데이터로 업데이트
f.close()
#4. 최종 데이터를 출력한다.
print(max_date, max_temp)
print('기상 관측 이래 서울의 최고 기온이 가장 높았건 날은',max_date+'(으)로,',max_temp,'도 였습니다.')

결과값: 2018-08-01 39.6 기상 관측 이래 서울의 최고 기온이 가장 높았건 날은 2018-08-01(으)로, 39.6 도 였습니다.

 

자세한 설명은 코드 내부에 설명을 적어놓았다.