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-03-30 : 데이터분석 본문

2021/일일 기록

2021-03-30 : 데이터분석

ililillllllliilli 2021. 3. 30. 00:27

20210329(월)



1. 학습 날짜 : 20210329(월)


2. 학습 시간 : 13:00 ~ 15:00, 16:00 ~ 21:00, 23:00 ~ 00:30


3. 학습 주제 : 모두의 데이터분석 - 데이터 시각화


4. 동료 학습 방법 : 개인


5. 학습 목표 : ~156pg


6. 학습 내용 :


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

N시간


진행 로그


vs코드 환경설정

github에 짰던 코드들을 올려 연습했던 코드들을 기록하고 싶었으나, jupyter notebook로는 내 cm 디렉토리에 접근을 할 수 가 없어, 브라우저에서 jupyter notebook를 사용하는 것이 아닌 vscode에 jupyter extension을 설치 한 뒤 사용할 수 있게 했다.

아래와 같이 python extension과, jupyter notebook extension 설치를 해줬다.


image-20210329040826373

jupyter notebook extension 의 vscode 환경설정

Open the command palette (Windows: Ctrl + Shift + P, iOS: Command + Shift + P) and select "Preferences: Open Settings (JSON)"
Add the following code to your JSON settings: "jupyter.experiments.optOutFrom": ["NativeNotebookEditor"],

설치를 했을 때 아래와 같은 우측 상단에 gui가 띄워진다.

image-20210329041132612

이후, matplotlib 모듈이 없다고 나왔기 때문에,

Traceback (most recent call last):
File "./plot_test.py", line 3, in <module>
  import matplotlib.pyplot as plt
ImportError: No module named matplotlib.pyplot

matplotlib 모듈을 pip3 install matplotlib 설치해줬으며,

설치중에 환경변수와 관련한 warning이 띄워졌기 때문에,

The script f2py.exe is installed in 'C:\Users\roaming\python\python38\site-packages (from matplotlib) (2.8.1)ing\Python\Python38\Scripts' which is not on PATH

환경변수 설정을 해줬다.


그 후에, 작동이 되는지 test 코드를 짜서 확인해봤다. 잘 작동한다.

image-20210329041601178



히스토그램 연습

히스토그램 연습을 위해 파이썬의 random 모듈의 randint를 사용해서 히스토그램을 만들었다.\

image-20210329042719521

독립시행 횟수를 10000번으로 늘렸을 때 결과다.

image-20210329042757039



히스토그램으로 서울의 날씨 데이터 분석

image-20210329043506553


데이터 분석

서울에서

  • 최고기온이 -10도 이하로 떨어졌던 횟수는 1940년부터 2021년까지 매우 적다.
  • 최고기온이 40도를 넘겼던 횟수도 매우 적다.

최고기온이 -10도 이하로 떨어졌던 횟수와 40도를 넘겼던 횟수를 실제로 count해보면,

import csv
import matplotlib.pyplot as plt

f = open('seoul.csv')
data = csv.reader(f)
next(data)
result = []
maxcount = 0
mincount = 0

for row in data :
    if row[-1] != '' :
        if float(row[-1]) <= -10.0 :
            mincount = mincount + 1
        if float(row[-1]) > 40.0 :
            maxcount = maxcount + 1
        result.append(float(row[-1]))

plt.hist(result, bins = 100)
plt.show()
print('maxcount: ', maxcount, ' ', 'mincount: ', mincount)

maxcount: 0 mincount: 65

로, 최고기온이 40도를 넘겼던 적이 없으며, -10도 이하로 떨어졌던 때는, 약 65회에 가깝다.

어...? 서울의 최고기온은 40도를 넘겼던 적이 있지 않았나? 싶엇는데, 서울 말고 다른 지역의 온도가 40도를 넘어갔었다. (대구, 부산 등 남부지역)


그러면, 서울의 최고기온과 최저기온을 둘 다 나타낸 뒤 데이터 시각화를 할 수도 있지 않은가.

image-20210329052224448


image-20210329052859879

같은 데이터를 봐도 상단의 꺾은선 그래프와, 히스토그램으로부터 알 수 있는 시각화 정보는 다르다. 히스토그램은 빈도수를, 꺾은선 그래프로부터는 온도의 변화를 알 수 있다.

상단의 꺾은선 그래프로부터는, 기온 데이터가 방대하기 때문에 그래프가 조밀하게 표현되었고, 그 때문에 변화를 파악하기 어렵다.

같은 데이터를 사용하더라도, 얻고자 하는 정보에 따라 어떻게 정보의 시각화를 할 것인지가 달라져야한다.



데이터를 상자 그림으로 표현하기

import csv

f = open('..\seoul.csv')
data = csv.reader(f)
next(data)
result = []

aug = []
jan = []

for row in data :
    if row[-1] != '' :
        splitdata = row[0].split('-')[1]
        temp = float(row[-1])
        if splitdata == '08' :
            aug.append(temp)
        elif splitdata == '01' :
            jan.append(temp)

import matplotlib.pyplot as plt
plt.boxplot(aug)
plt.boxplot(jan)
plt.show()

image-20210329054606040


image-20210329054635164


리스트를 boxplot()에 넣었을 경우, 분리된 데이터로 시각화하는데,

12달의 데이터를 boxplot으로 시각화 할 수 있겠다.

import csv

f = open('..\seoul.csv')
data = csv.reader(f)
next(data)
monthtemp = []
for i in range(0,12) :
    monthtemp.append([])
print(len(monthtemp))
for row in data :
    if row[-1] != '' :
        splitdata = row[0].split('-')[1]
        monthtemp[int(splitdata) - 1].append(float(row[-1]))

import matplotlib.pyplot as plt
plt.boxplot(monthtemp)
plt.show()

image-20210329055506505

시각화한 데이터로 보았을 때, 1월이 기온의 변동폭이 가장 높아보이며,

1월의 기온이 대체적으로 낮고(median값을 기준으로 분석했을 때)

8월의 기온이 대체적으로 가장 높아보인다.


그럼 8월 중 가장 기온이 높았던 날짜는 언제일까?

image-20210329062528732



maxtemp, maxdate : 39.6 1 데이터 분석을 통해 얻어진 결과로,

1월에, 39.6도로 가장 높았던것을 알 수 있다.

더 정확하게는,

maxtemp, maxdate : 39.6 2018-08-01 에 최고기온을 찍었다는 것을 알 수 있었다. 그것도, 이상치값으로 표현되었다.


정확한 데이터는 데이터의 시각화가 아닌, 데이터의 파싱 후 비교를 통해 얻어질 수 있겠다.


기온 데이터로, 질문에 대한 답 찾아보기.

  • 2012년 ~ 2021년 중 더웠던 해는 언제인가?
  • 2012년 ~ 2021년 중 추웠던 해는 언제인가?
  • 2012년 ~ 2021년의 기온 변화 추이
  • 서울과 대구의 1년간 온도 차이.
    • 대구가 서울보다 더운가?
    • 서울이 대구보다 추운가?
  • 강원도와 서울의 1년간 온도 차이
    • 강원도가 서울보다 더운가
    • 강원도가 서울보다 추운가?
  • 내 생일은 보통 추웠는가?
  • 1940년대의 온도와 2020년의 온도를 비교했을 때, 지구온난화의 영향을 받아 기온이 올라갔는가?
  • 봄이 겨울보다 더 추운가..?



2012년 ~ 2021년 중 더웠던 해는 언제인가?

import matplotlib.pyplot as plt
import csv

daeguf = open('..\daegu.csv')
seoulf = open('..\seoul.csv')
data_d = csv.reader(daeguf)
data_s = csv.reader(seoulf)
next(data_d)
next(data_s)

arr_s = []
arr_d = []
zip_d_s = zip(data_d, data_s)
year = -1
month = -1

# 가장 더웠던 해는 언제인가?
for row_d, row_s in zip_d_s :
    year = int(row_d[0].split('-')[0])
    month = int(row_d[0].split('-')[1])
    if row_s[-1] != '' and row_d[-1] != '' \
        and year >= 2012 and month >= 5 and month <= 9 :
        arr_s.append(float(row_s[-1]))
        arr_d.append(float(row_d[-1]))

plt.figure(figsize = (10, 2))
plt.plot(row_d)
plt.show()
plt.figure(figsize = (10, 2))
plt.plot(row_s)
plt.show()

결과 :

image-20210329093618327


결론 도출 실패

이런 결과가 도출된 이유 추론 :

대구의 기온데이터와 서울의 기온데이터의 개수가 다르기 때문에, zip_d_s = zip(data_d, data_s) 이 제대로 이루어지지 않은 것으로 보인다.

zip()의 arguement의 length 가 다를 경우

In the above example, we defined three iterators of different lengths. The first elements of all of them are joined together. Similarly, the second elements of all of them are joined together.

But there is no third element in the iterator y; therefore\, the third elements of remaining iterators are not included in the output object.



그렇기 때문에, 일단 데이터의 수정을 했다.

서울은 데이터가 1907년부터 시작, 대구는 1940년부터 시작하기 때문에,

서울의 데이터를 1940년부터 시작하게 1907~1939년까지의 데이터를 제외시켰다.

그래도, 서울의 데이터가 대구의 데이터보다 약 29672 - 29241 개 만큼 적었다. 이 상태로도 zip()을 사용하기에는 무리가 있다고 생각했다.

따라서, 두 객체의 데이터 개수를 맞춰 한번에 for문을 돌리기 보다는, 아예 루프 두개를 돌려서, 2012년부터 데이터를 각각 list에 넣은 뒤 , 비교하기로 했다.



결론 도출 실패

import matplotlib.pyplot as plt
import csv

daeguf = open('..\daegu.csv')
seoulf = open('..\seoul.csv')
data_d = csv.reader(daeguf)
data_s = csv.reader(seoulf)
next(data_d)
next(data_s)

arr_s = []
arr_d = []

year = -1
month = -1
for row in data_d :
    year = int(row[0].split('-')[0])
    month = int(row[0].split('-')[1])
    if row[-1] != '' and year >= 2012 and month >= 6 and month <= 9 :
        arr_d.append(float(row[-1]))

for row in data_s :
    year = int(row[0].split('-')[0])
    month = int(row[0].split('-')[1])
    if row[-1] != '' and year >= 2012 and month >= 6 and month <= 9 :
        arr_s.append(float(row[-1]))

print(len(arr_d), ' ', len(arr_s))

두 데이터를 2012년부터 2021년까지 각각을 arr_d, arr_s 배열에 넣어준 뒤, 비교하려고 했으나,
arr_darr_s의 길이가 1097 1098로 달랐다.

결론 도출 실패 이유 : 데이터의 시작과 끝이 각각 2012 01 01, 2021 03 27 로 같았으나,
대구의 데이터가 하나 통째로 빠져있던지, 대구의 최고기온 데이터가 ''로, 아예 빠져있는 상태인것 같다.



실제로 확인해보니,

    if \
        year >= 2012 and month <= 9 and month >= 6 :
        len_d += 1

일때는 1098개,


    if row[-1] != '' and \
        year >= 2012 and month <= 9 and month >= 6 :
        len_d += 1

일때는 1097개가 나온 것으로 보아, 총 데이터의 개수는 같으나, ''로 구성된 데이터가 존재해서, 차이가 발생했다.


string의 비교는 하지 않고 문제를 해결하려고 했는데, 이 방법밖에는 없는 것 같다.

두 데이터 셋의 날짜 칼럼을 비교한 뒤, 두 날짜 칼럼이 같다면, 각각의 데이터셋을 list에 넣는 방법이 있겠다.

이렇게 할 경우, 연산량이 많아질 수 있으나, 정확한 데이터의 비교를 위해서는 문자열의 비교하는 방법이 가장 적절해보인다.


Iterator를 복사하다

iterator는 복사가 가능할 때도 있고, 복사가 가능하지 않을 때도 있다.

itertools를 사용했을 땐, copy가 가능하지만, 그렇지 않을 때는, iterator의 구성에 따라 복사유효함이 달라진다.


방법은 iterator를 두개씩 만들어서, 각각의 length를 구한 다음, length가 큰 iterator만큼 반복하면서 string으로 날짜를 비교해가면서, 두 데이터셋의 날짜가 같다면, list에 append하는 방법밖에는 없을 것 같다.



import matplotlib.pyplot as plt
import csv

daeguf = open('..\daegu.csv')
seoulf = open('..\seoul.csv')
data_d = csv.reader(daeguf)
data_s = csv.reader(seoulf)
next(data_d)
next(data_s)
len_d = 0
len_s = 0

year = -1
month = -1
for row in data_d :
    year = int(row[0].split('-')[0])
    month = int(row[0].split('-')[1])
    if row[-1] != '' and \
        year >= 2012 and month <= 9 and month >= 6 :
        len_d += 1

for row in data_s :
    year = int(row[0].split('-')[0])
    month = int(row[0].split('-')[1])
    if row[-1] != '' and \
        year >= 2012 and month <= 9 and month >= 6:
        len_s += 1
max_len = max(len_d, len_s)
print(len_d)
print(len_s)
print(max_len)

두 데이터 셋의 날짜를 맞춰주는데 성공했다.

1097   [29.0, 27.1, 30.7, 30.2, 37, ..] 
1097   [23.3, 22.9, 22.6, 21.2, 17.6 ..]

둘이 같은 날짜인지 아직 모르기 때문에, 날짜까지 list에 저장해주도록 한다.



참고로, 2013년 9월 30일의 최고기온 정보가 빠져있었다. 관련해서 혹시 대규모 정전이 있었다던가 싶어서 찾아보았지만, 그건 아니었다.

ㅎㅎ..



import matplotlib.pyplot as plt
import csv
import sys

daeguf = open('..\daegu.csv')
seoulf = open('..\seoul.csv')

data_d = csv.reader(daeguf)
data_s = csv.reader(seoulf)
next(data_d)
next(data_s)

arr_d = []
arr_s = []

final_d = []
final_s = []

year = -1
month = -1

for row in data_d : 
    year = int(row[0].split('-')[0])
    month = int(row[0].split('-')[1])
    if year >= 2012 and month >= 6 and month <= 9 :
        if row[-1] == '' :
            row[-1] = '40'
        arr_d.append(row)

for row in data_s : 
    year = int(row[0].split('-')[0])
    month = int(row[0].split('-')[1])
    if year >= 2012 and month >= 6 and month <= 9 :
        if row[-1] == '' :
            row[-1] = '40'
        arr_s.append(row)

for row in arr_d :
    final_d.append(float(row[-1]))

for row in arr_s :
    final_s.append(float(row[-1]))
plt.plot(final_d)
plt.show()
plt.plot(final_s)
plt.show()

위 코드로, 비교하는 날짜도 맞추어 주었지만, 정작 꺾은선 그래프로 어느 지역이 더 더웠는지는 알 수 없었다.

image-20210330000655097

두 자료의 비교가 가능했을것이라고 생각했었으나, 그래프가 많이 조밀하다 보니, 서울과 대구, 둘 중 어느 곳이 더 더웠는지에 대한 비교를 하지 못했다.

그러나, box plot으로는 비교가 가능하다.

image-20210330000827864

서울 boxplot의 40 이상치는, 최고기온의 데이터가 없을 때 40으로 설정되게 해놓았기 때문에, 해당 이상치는 무시해도 된다. 아직, 파이썬 iterator의 조작이 익숙하지 않아, 데이터가 없는 파트를 거르지 못했다.


2012 ~ 2020년의 여름까지는 적어도 대구가 더 더웠던 것으로 판명되었다.

적어도 median값은 대구가 서울보다 더 크다.

또, 여름 서울의 기온 변화는 급격히 더워졌다 급격히 낮아진것으로 보이며, 그 외에는 기온변화가 커보이지 않는다.

그래프로는, "얼마나" 더 더웠는가를 아는것은 불가능하다.


2012년 ~ 2021년의 겨울에는 서울과 대구, 어떤 지역이 더 추웠는가?

image-20210330002058026


medain값도 그렇고, 굳이 median 값을 보지 않더라도 서울이 훨씬 더 추웠다는 것을 알 수 있으며, 적어도 대구는 -15도 이하로 떨어진 적이 없었다.

서울은, ''도 이상치로 -20이 되게 설정해놓았지만, -20 이하로 떨어진 적이 몇번 있어보인다.

사실, 이렇게 boxplot으로 비교할 것이었으면, 대구와 서울의 데이터 셋 간 개수를 맞추어줄 필요가 있었나 싶다.


오늘은 여기까지..


Comments