Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- programmablesearchengine
- chatGPT
- 비지도학습
- 챗gpt
- 판다스
- 머신러닝
- 랭체인
- NLP
- OpenAIAPI
- Python
- 파이토치기본
- 딥러닝
- python 정렬
- sklearn
- pandas
- fastapi #파이썬웹개발
- deeplearning
- 사이킷런
- 파이토치
- langchain
- MachineLearning
- 자연어분석
- fastapi #python웹개발
- HTML
- 파이썬웹개발
- 파이썬
- 판다스 데이터정렬
- fastapi
- konlpy
- pytorch
Archives
- Today
- Total
Data Navigator
[sklearn, statsmodels] Linear Regression 한국 환경 공단 실내 공기질 분석 본문
Machine Learning, Deep Learning
[sklearn, statsmodels] Linear Regression 한국 환경 공단 실내 공기질 분석
코딩하고분석하는돌스 2021. 1. 28. 22:50
한국 환경 공단 실내 공기질 분석¶
In [26]:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
In [27]:
import xlrd
In [ ]:
엑셀 데이터로드¶
In [28]:
df = pd.read_excel("last_amb_hour_time.xls")
In [29]:
df.head()
Out[29]:
Unnamed: 0 | Unnamed: 1 | Unnamed: 2 | Unnamed: 3 | Unnamed: 4 | Unnamed: 5 | Unnamed: 6 | Unnamed: 7 | Unnamed: 8 | Unnamed: 9 | Unnamed: 10 | Unnamed: 11 | Unnamed: 12 | Unnamed: 13 | Unnamed: 14 | Unnamed: 15 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 중구 ( 서울 중구 덕수궁길 15 시청서소문별관 3동 ) | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2 | 날짜 | 통합대기환경지수 | NaN | NaN | PM10 | NaN | PM2.5 | NaN | 오존 | NaN | 이산화질소 | NaN | 일산화탄소 | NaN | 아황산가스 | NaN |
3 | (년-월-일:시) | NaN | NaN | NaN | (㎍/㎥) | NaN | (㎍/㎥) | NaN | (ppm) | NaN | (ppm) | NaN | (ppm) | NaN | (ppm) | NaN |
4 | NaN | 주오염물질 | 등급 | 지수 | 등급 | 24시간 | 등급 | 24시간 | 등급 | 1시간 | 등급 | 1시간 | 등급 | 1시간 | 등급 | 1시간 |
컬럼명 3번째 줄에 있으므로 컬럼명 변경¶
In [30]:
df.columns
Out[30]:
Index(['Unnamed: 0', 'Unnamed: 1', 'Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4',
'Unnamed: 5', 'Unnamed: 6', 'Unnamed: 7', 'Unnamed: 8', 'Unnamed: 9',
'Unnamed: 10', 'Unnamed: 11', 'Unnamed: 12', 'Unnamed: 13',
'Unnamed: 14', 'Unnamed: 15'],
dtype='object')
In [31]:
df.columns = ['date', 'main_polut_meteial', 'Trate', 'Tpoint', 'PM10_level', 'PM10_rate', 'PM2.5_level', 'PM2.5_rate', 'Ozone_level', 'Ozone_rate', 'NO2_level', 'NO2_rate', 'co_level', 'co_rate', 'SO2_level', 'SO2_rate']
In [32]:
df.head(10)
Out[32]:
date | main_polut_meteial | Trate | Tpoint | PM10_level | PM10_rate | PM2.5_level | PM2.5_rate | Ozone_level | Ozone_rate | NO2_level | NO2_rate | co_level | co_rate | SO2_level | SO2_rate | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 중구 ( 서울 중구 덕수궁길 15 시청서소문별관 3동 ) | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2 | 날짜 | 통합대기환경지수 | NaN | NaN | PM10 | NaN | PM2.5 | NaN | 오존 | NaN | 이산화질소 | NaN | 일산화탄소 | NaN | 아황산가스 | NaN |
3 | (년-월-일:시) | NaN | NaN | NaN | (㎍/㎥) | NaN | (㎍/㎥) | NaN | (ppm) | NaN | (ppm) | NaN | (ppm) | NaN | (ppm) | NaN |
4 | NaN | 주오염물질 | 등급 | 지수 | 등급 | 24시간 | 등급 | 24시간 | 등급 | 1시간 | 등급 | 1시간 | 등급 | 1시간 | 등급 | 1시간 |
5 | 2021-01-28:13 | PM10 | 보통 | 64 | 좋음 | 44 | 좋음 | 18 | 보통 | 0.031 | 좋음 | 0.012 | 좋음 | 0.5 | 좋음 | 0.003 |
6 | 2021-01-28:12 | NaN | 보통 | NaN | NaN | 49 | NaN | 20 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
7 | 2021-01-28:11 | 이산화질소 | 보통 | 76 | 보통 | 47 | 보통 | 19 | 좋음 | 0.004 | 보통 | 0.046 | 좋음 | 0.8 | 좋음 | 0.004 |
8 | 2021-01-28:10 | 이산화질소 | 보통 | 86 | 보통 | 43 | 보통 | 17 | 좋음 | 0.004 | 보통 | 0.052 | 좋음 | 0.7 | 좋음 | 0.004 |
9 | 2021-01-28:09 | 이산화질소 | 보통 | 100 | 보통 | 40 | 보통 | 16 | 좋음 | 0.003 | 보통 | 0.060 | 좋음 | 0.8 | 좋음 | 0.005 |
위에서 4번째 줄까지는 필요가 없으므로 5번째부터 가져옴¶
In [33]:
df = df[5:]
In [34]:
df.head(10)
Out[34]:
date | main_polut_meteial | Trate | Tpoint | PM10_level | PM10_rate | PM2.5_level | PM2.5_rate | Ozone_level | Ozone_rate | NO2_level | NO2_rate | co_level | co_rate | SO2_level | SO2_rate | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
5 | 2021-01-28:13 | PM10 | 보통 | 64 | 좋음 | 44 | 좋음 | 18 | 보통 | 0.031 | 좋음 | 0.012 | 좋음 | 0.5 | 좋음 | 0.003 |
6 | 2021-01-28:12 | NaN | 보통 | NaN | NaN | 49 | NaN | 20 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
7 | 2021-01-28:11 | 이산화질소 | 보통 | 76 | 보통 | 47 | 보통 | 19 | 좋음 | 0.004 | 보통 | 0.046 | 좋음 | 0.8 | 좋음 | 0.004 |
8 | 2021-01-28:10 | 이산화질소 | 보통 | 86 | 보통 | 43 | 보통 | 17 | 좋음 | 0.004 | 보통 | 0.052 | 좋음 | 0.7 | 좋음 | 0.004 |
9 | 2021-01-28:09 | 이산화질소 | 보통 | 100 | 보통 | 40 | 보통 | 16 | 좋음 | 0.003 | 보통 | 0.060 | 좋음 | 0.8 | 좋음 | 0.005 |
10 | 2021-01-28:08 | 이산화질소 | 보통 | 100 | 보통 | 40 | 보통 | 16 | 좋음 | 0.002 | 보통 | 0.060 | 좋음 | 0.8 | 좋음 | 0.004 |
11 | 2021-01-28:07 | 이산화질소 | 보통 | 90 | 보통 | 39 | 보통 | 16 | 좋음 | 0.002 | 보통 | 0.054 | 좋음 | 0.7 | 좋음 | 0.004 |
12 | 2021-01-28:06 | 이산화질소 | 보통 | 86 | 보통 | 38 | 보통 | 16 | 좋음 | 0.002 | 보통 | 0.052 | 좋음 | 0.7 | 좋음 | 0.004 |
13 | 2021-01-28:05 | 이산화질소 | 좋음 | 86 | 보통 | 37 | 보통 | 15 | 좋음 | 0.002 | 보통 | 0.052 | 좋음 | 0.7 | 좋음 | 0.003 |
14 | 2021-01-28:04 | 이산화질소 | 좋음 | 88 | 보통 | 36 | 보통 | 15 | 좋음 | 0.002 | 보통 | 0.053 | 좋음 | 0.7 | 좋음 | 0.004 |
In [35]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1093 entries, 5 to 1097
Data columns (total 16 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 1093 non-null object
1 main_polut_meteial 1073 non-null object
2 Trate 1075 non-null object
3 Tpoint 1073 non-null object
4 PM10_level 1088 non-null object
5 PM10_rate 1082 non-null object
6 PM2.5_level 1082 non-null object
7 PM2.5_rate 1075 non-null object
8 Ozone_level 1089 non-null object
9 Ozone_rate 1089 non-null object
10 NO2_level 1089 non-null object
11 NO2_rate 1089 non-null object
12 co_level 1089 non-null object
13 co_rate 1089 non-null object
14 SO2_level 1089 non-null object
15 SO2_rate 1089 non-null object
dtypes: object(16)
memory usage: 136.8+ KB
총 1093행중에서 데이터가 없는 행들이 보임¶
In [36]:
df.describe()
Out[36]:
date | main_polut_meteial | Trate | Tpoint | PM10_level | PM10_rate | PM2.5_level | PM2.5_rate | Ozone_level | Ozone_rate | NO2_level | NO2_rate | co_level | co_rate | SO2_level | SO2_rate | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 1093 | 1073 | 1075 | 1073 | 1088 | 1082 | 1082 | 1075 | 1089 | 1089 | 1089 | 1089 | 1089 | 1089 | 1089 | 1089 |
unique | 1093 | 4 | 3 | 118 | 4 | 99 | 4 | 55 | 2 | 36 | 3 | 73 | 1 | 12 | 1 | 5 |
top | 2021-01-24:13 | PM2.5 | 보통 | 50 | 보통 | 30 | 보통 | 14 | 좋음 | 0.002 | 좋음 | 0.013 | 좋음 | 0.4 | 좋음 | 0.003 |
freq | 1 | 446 | 466 | 55 | 588 | 48 | 450 | 83 | 1022 | 155 | 543 | 45 | 1089 | 347 | 1089 | 562 |
숫자로 되어 있어야 할 데이터들을 숫자로 변환¶
In [37]:
tonumeric = ['Tpoint','PM10_rate', 'PM2.5_rate', 'Ozone_rate','NO2_rate', 'co_rate', 'SO2_rate']
for culs in tonumeric:
df[culs] = pd.to_numeric(df[culs])
In [38]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1093 entries, 5 to 1097
Data columns (total 16 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 1093 non-null object
1 main_polut_meteial 1073 non-null object
2 Trate 1075 non-null object
3 Tpoint 1073 non-null float64
4 PM10_level 1088 non-null object
5 PM10_rate 1082 non-null float64
6 PM2.5_level 1082 non-null object
7 PM2.5_rate 1075 non-null float64
8 Ozone_level 1089 non-null object
9 Ozone_rate 1089 non-null float64
10 NO2_level 1089 non-null object
11 NO2_rate 1089 non-null float64
12 co_level 1089 non-null object
13 co_rate 1089 non-null float64
14 SO2_level 1089 non-null object
15 SO2_rate 1089 non-null float64
dtypes: float64(7), object(9)
memory usage: 136.8+ KB
In [39]:
df.describe()
Out[39]:
Tpoint | PM10_rate | PM2.5_rate | Ozone_rate | NO2_rate | co_rate | SO2_rate | |
---|---|---|---|---|---|---|---|
count | 1073.000000 | 1082.000000 | 1075.000000 | 1089.000000 | 1089.000000 | 1089.000000 | 1089.000000 |
mean | 83.179870 | 43.501848 | 22.950698 | 0.014852 | 0.032819 | 0.602020 | 0.003334 |
std | 39.656881 | 20.727751 | 11.963180 | 0.010461 | 0.018864 | 0.231673 | 0.000766 |
min | 37.000000 | 7.000000 | 4.000000 | 0.002000 | 0.006000 | 0.300000 | 0.002000 |
25% | 52.000000 | 28.000000 | 14.000000 | 0.003000 | 0.015000 | 0.400000 | 0.003000 |
50% | 77.000000 | 38.000000 | 19.000000 | 0.016000 | 0.031000 | 0.500000 | 0.003000 |
75% | 100.000000 | 56.000000 | 29.000000 | 0.024000 | 0.050000 | 0.800000 | 0.004000 |
max | 265.000000 | 141.000000 | 59.000000 | 0.037000 | 0.080000 | 1.400000 | 0.006000 |
describe()를 통해 본 결과 PM10과 PM2.5에서 min~25%, 75%~max 값의 격차가 크게 나타남¶
In [40]:
sns.distplot(df['Tpoint'])
d:\ProgramData\Anaconda3\envs\mdai\lib\site-packages\seaborn\distributions.py:2557: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms).
warnings.warn(msg, FutureWarning)
Out[40]:
<AxesSubplot:xlabel='Tpoint', ylabel='Density'>
In [41]:
sns.distplot(df['PM10_rate'])
d:\ProgramData\Anaconda3\envs\mdai\lib\site-packages\seaborn\distributions.py:2557: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms).
warnings.warn(msg, FutureWarning)
Out[41]:
<AxesSubplot:xlabel='PM10_rate', ylabel='Density'>
In [42]:
sns.distplot(df['PM2.5_rate'])
d:\ProgramData\Anaconda3\envs\mdai\lib\site-packages\seaborn\distributions.py:2557: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms).
warnings.warn(msg, FutureWarning)
Out[42]:
<AxesSubplot:xlabel='PM2.5_rate', ylabel='Density'>
distplot으로 살펴본 결과 데이터가 오른쪽으로 꼬리가 길고 좌측에 집중된 모습을 보임¶
In [43]:
df2 = df[['Trate','Tpoint','PM10_rate','PM2.5_rate','Ozone_rate','NO2_rate','co_rate','SO2_rate']]
숫자형 데이터와 좋음, 보통, 나쁨 으로 나누어진 컬럼만 가져와 df2로 저장¶
In [44]:
df2
Out[44]:
Trate | Tpoint | PM10_rate | PM2.5_rate | Ozone_rate | NO2_rate | co_rate | SO2_rate | |
---|---|---|---|---|---|---|---|---|
5 | 보통 | 64.0 | 44.0 | 18.0 | 0.031 | 0.012 | 0.5 | 0.003 |
6 | 보통 | NaN | 49.0 | 20.0 | NaN | NaN | NaN | NaN |
7 | 보통 | 76.0 | 47.0 | 19.0 | 0.004 | 0.046 | 0.8 | 0.004 |
8 | 보통 | 86.0 | 43.0 | 17.0 | 0.004 | 0.052 | 0.7 | 0.004 |
9 | 보통 | 100.0 | 40.0 | 16.0 | 0.003 | 0.060 | 0.8 | 0.005 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
1093 | 좋음 | 53.0 | 33.0 | 14.0 | 0.021 | 0.009 | 0.4 | 0.003 |
1094 | 좋음 | 51.0 | 31.0 | 14.0 | 0.022 | 0.009 | 0.4 | 0.003 |
1095 | 좋음 | 50.0 | 30.0 | 14.0 | 0.023 | 0.008 | 0.4 | 0.003 |
1096 | 좋음 | 50.0 | 29.0 | 15.0 | 0.024 | 0.008 | 0.4 | 0.003 |
1097 | 보통 | 51.0 | 30.0 | 16.0 | 0.024 | 0.010 | 0.4 | 0.002 |
1093 rows × 8 columns
In [45]:
df2.isna().sum()
Out[45]:
Trate 18
Tpoint 20
PM10_rate 11
PM2.5_rate 18
Ozone_rate 4
NO2_rate 4
co_rate 4
SO2_rate 4
dtype: int64
결측치 확인결과 가장 많은 항목이 20개¶
In [46]:
df2[df2['Tpoint'].isna() == True]
Out[46]:
Trate | Tpoint | PM10_rate | PM2.5_rate | Ozone_rate | NO2_rate | co_rate | SO2_rate | |
---|---|---|---|---|---|---|---|---|
6 | 보통 | NaN | 49.0 | 20.0 | NaN | NaN | NaN | NaN |
55 | NaN | NaN | 52.0 | NaN | 0.003 | 0.061 | 0.9 | 0.004 |
56 | NaN | NaN | 48.0 | NaN | 0.003 | 0.055 | 0.7 | 0.004 |
57 | NaN | NaN | 44.0 | NaN | 0.003 | 0.055 | 0.8 | 0.004 |
219 | NaN | NaN | NaN | NaN | 0.011 | 0.035 | 0.5 | 0.002 |
220 | NaN | NaN | NaN | NaN | 0.010 | 0.037 | 0.5 | 0.003 |
221 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
222 | NaN | NaN | 37.0 | NaN | NaN | NaN | NaN | NaN |
499 | NaN | NaN | 27.0 | NaN | 0.022 | 0.012 | 0.4 | 0.003 |
500 | NaN | NaN | 27.0 | NaN | 0.021 | 0.013 | 0.4 | 0.003 |
501 | NaN | NaN | 27.0 | NaN | 0.021 | 0.014 | 0.4 | 0.003 |
648 | NaN | NaN | NaN | NaN | 0.024 | 0.020 | 0.4 | 0.003 |
649 | NaN | NaN | NaN | NaN | 0.029 | 0.015 | 0.4 | 0.003 |
650 | NaN | NaN | NaN | NaN | 0.027 | 0.018 | 0.4 | 0.003 |
651 | NaN | NaN | NaN | NaN | 0.024 | 0.020 | 0.4 | 0.003 |
652 | NaN | NaN | NaN | NaN | 0.020 | 0.025 | 0.4 | 0.003 |
653 | NaN | NaN | NaN | NaN | 0.018 | 0.026 | 0.4 | 0.004 |
654 | NaN | NaN | NaN | NaN | 0.013 | 0.032 | 0.5 | 0.004 |
655 | NaN | NaN | NaN | NaN | 0.010 | 0.038 | 0.7 | 0.003 |
990 | 보통 | NaN | 48.0 | 27.0 | NaN | NaN | NaN | NaN |
Tpoint가 NaN인 경우 다른 변수의 측정치가 적은 경우가 많고 전체 데이터에서 비중이 적으므로 드롭¶
In [47]:
df2 = df2.drop(df2[df2['Tpoint'].isna() == True].index)
In [48]:
df2.isna().sum()
Out[48]:
Trate 0
Tpoint 0
PM10_rate 0
PM2.5_rate 0
Ozone_rate 0
NO2_rate 0
co_rate 0
SO2_rate 0
dtype: int64
결측치 0¶
In [50]:
df2.head(10)
Out[50]:
Trate | Tpoint | PM10_rate | PM2.5_rate | Ozone_rate | NO2_rate | co_rate | SO2_rate | |
---|---|---|---|---|---|---|---|---|
5 | 보통 | 64.0 | 44.0 | 18.0 | 0.031 | 0.012 | 0.5 | 0.003 |
7 | 보통 | 76.0 | 47.0 | 19.0 | 0.004 | 0.046 | 0.8 | 0.004 |
8 | 보통 | 86.0 | 43.0 | 17.0 | 0.004 | 0.052 | 0.7 | 0.004 |
9 | 보통 | 100.0 | 40.0 | 16.0 | 0.003 | 0.060 | 0.8 | 0.005 |
10 | 보통 | 100.0 | 40.0 | 16.0 | 0.002 | 0.060 | 0.8 | 0.004 |
11 | 보통 | 90.0 | 39.0 | 16.0 | 0.002 | 0.054 | 0.7 | 0.004 |
12 | 보통 | 86.0 | 38.0 | 16.0 | 0.002 | 0.052 | 0.7 | 0.004 |
13 | 좋음 | 86.0 | 37.0 | 15.0 | 0.002 | 0.052 | 0.7 | 0.003 |
14 | 좋음 | 88.0 | 36.0 | 15.0 | 0.002 | 0.053 | 0.7 | 0.004 |
15 | 좋음 | 88.0 | 36.0 | 14.0 | 0.002 | 0.053 | 0.7 | 0.004 |
In [ ]:
In [51]:
df2['Trate'].nunique()
Out[51]:
3
Trate의 좋음, 보통, 나쁨을 숫자형 데이터로 변환¶
In [30]:
df2
Out[30]:
Trate | Tpoint | PM10_rate | PM2.5_rate | Ozone_rate | NO2_rate | co_rate | SO2_rate | |
---|---|---|---|---|---|---|---|---|
5 | 보통 | 64.0 | 44.0 | 18.0 | 0.031 | 0.012 | 0.5 | 0.003 |
7 | 보통 | 76.0 | 47.0 | 19.0 | 0.004 | 0.046 | 0.8 | 0.004 |
8 | 보통 | 86.0 | 43.0 | 17.0 | 0.004 | 0.052 | 0.7 | 0.004 |
9 | 보통 | 100.0 | 40.0 | 16.0 | 0.003 | 0.060 | 0.8 | 0.005 |
10 | 보통 | 100.0 | 40.0 | 16.0 | 0.002 | 0.060 | 0.8 | 0.004 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
1093 | 좋음 | 53.0 | 33.0 | 14.0 | 0.021 | 0.009 | 0.4 | 0.003 |
1094 | 좋음 | 51.0 | 31.0 | 14.0 | 0.022 | 0.009 | 0.4 | 0.003 |
1095 | 좋음 | 50.0 | 30.0 | 14.0 | 0.023 | 0.008 | 0.4 | 0.003 |
1096 | 좋음 | 50.0 | 29.0 | 15.0 | 0.024 | 0.008 | 0.4 | 0.003 |
1097 | 보통 | 51.0 | 30.0 | 16.0 | 0.024 | 0.010 | 0.4 | 0.002 |
1073 rows × 8 columns
In [52]:
def aircon(x):
if x == "좋음":
return 3
elif x == "보통":
return 2
else:
return 1
In [53]:
df2['Trate'] = df2['Trate'].apply(lambda x: aircon(x))
df2
Out[53]:
Trate | Tpoint | PM10_rate | PM2.5_rate | Ozone_rate | NO2_rate | co_rate | SO2_rate | |
---|---|---|---|---|---|---|---|---|
5 | 2 | 64.0 | 44.0 | 18.0 | 0.031 | 0.012 | 0.5 | 0.003 |
7 | 2 | 76.0 | 47.0 | 19.0 | 0.004 | 0.046 | 0.8 | 0.004 |
8 | 2 | 86.0 | 43.0 | 17.0 | 0.004 | 0.052 | 0.7 | 0.004 |
9 | 2 | 100.0 | 40.0 | 16.0 | 0.003 | 0.060 | 0.8 | 0.005 |
10 | 2 | 100.0 | 40.0 | 16.0 | 0.002 | 0.060 | 0.8 | 0.004 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
1093 | 3 | 53.0 | 33.0 | 14.0 | 0.021 | 0.009 | 0.4 | 0.003 |
1094 | 3 | 51.0 | 31.0 | 14.0 | 0.022 | 0.009 | 0.4 | 0.003 |
1095 | 3 | 50.0 | 30.0 | 14.0 | 0.023 | 0.008 | 0.4 | 0.003 |
1096 | 3 | 50.0 | 29.0 | 15.0 | 0.024 | 0.008 | 0.4 | 0.003 |
1097 | 2 | 51.0 | 30.0 | 16.0 | 0.024 | 0.010 | 0.4 | 0.002 |
1073 rows × 8 columns
In [ ]:
회귀 분석을 위한 데이터 스케일 표준화¶
사이킷런의 MinMaxScaler를 사용해 표준화¶
In [54]:
from sklearn.preprocessing import MinMaxScaler
In [55]:
minmax = MinMaxScaler()
In [56]:
minmax.fit(df2)
Out[56]:
MinMaxScaler()
In [57]:
scaled_df2 = minmax.transform(df2)
In [58]:
scaled_df2 = pd.DataFrame(scaled_df2, columns=df2.columns )
scaled_df2
Out[58]:
Trate | Tpoint | PM10_rate | PM2.5_rate | Ozone_rate | NO2_rate | co_rate | SO2_rate | |
---|---|---|---|---|---|---|---|---|
0 | 0.5 | 0.118421 | 0.276119 | 0.254545 | 0.828571 | 0.081081 | 0.181818 | 0.25 |
1 | 0.5 | 0.171053 | 0.298507 | 0.272727 | 0.057143 | 0.540541 | 0.454545 | 0.50 |
2 | 0.5 | 0.214912 | 0.268657 | 0.236364 | 0.057143 | 0.621622 | 0.363636 | 0.50 |
3 | 0.5 | 0.276316 | 0.246269 | 0.218182 | 0.028571 | 0.729730 | 0.454545 | 0.75 |
4 | 0.5 | 0.276316 | 0.246269 | 0.218182 | 0.000000 | 0.729730 | 0.454545 | 0.50 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
1068 | 1.0 | 0.070175 | 0.194030 | 0.181818 | 0.542857 | 0.040541 | 0.090909 | 0.25 |
1069 | 1.0 | 0.061404 | 0.179104 | 0.181818 | 0.571429 | 0.040541 | 0.090909 | 0.25 |
1070 | 1.0 | 0.057018 | 0.171642 | 0.181818 | 0.600000 | 0.027027 | 0.090909 | 0.25 |
1071 | 1.0 | 0.057018 | 0.164179 | 0.200000 | 0.628571 | 0.027027 | 0.090909 | 0.25 |
1072 | 0.5 | 0.061404 | 0.171642 | 0.218182 | 0.628571 | 0.054054 | 0.090909 | 0.00 |
1073 rows × 8 columns
In [ ]:
표준화시킨 데이터들 간의 상관관계 분석¶
In [59]:
scaled_df2.corr()
Out[59]:
Trate | Tpoint | PM10_rate | PM2.5_rate | Ozone_rate | NO2_rate | co_rate | SO2_rate | |
---|---|---|---|---|---|---|---|---|
Trate | 1.000000 | -0.786374 | -0.754406 | -0.909379 | 0.370978 | -0.507507 | -0.597464 | -0.508166 |
Tpoint | -0.786374 | 1.000000 | 0.870082 | 0.872194 | -0.406723 | 0.567549 | 0.633562 | 0.524198 |
PM10_rate | -0.754406 | 0.870082 | 1.000000 | 0.832987 | -0.280292 | 0.401140 | 0.487527 | 0.473272 |
PM2.5_rate | -0.909379 | 0.872194 | 0.832987 | 1.000000 | -0.347455 | 0.493997 | 0.598621 | 0.511121 |
Ozone_rate | 0.370978 | -0.406723 | -0.280292 | -0.347455 | 1.000000 | -0.896647 | -0.753455 | -0.296354 |
NO2_rate | -0.507507 | 0.567549 | 0.401140 | 0.493997 | -0.896647 | 1.000000 | 0.861168 | 0.505932 |
co_rate | -0.597464 | 0.633562 | 0.487527 | 0.598621 | -0.753455 | 0.861168 | 1.000000 | 0.533946 |
SO2_rate | -0.508166 | 0.524198 | 0.473272 | 0.511121 | -0.296354 | 0.505932 | 0.533946 | 1.000000 |
In [60]:
plt.figure(figsize=(15,10))
sns.heatmap(scaled_df2.corr(), annot=True, cmap="coolwarm")
Out[60]:
<AxesSubplot:>
Heatmap으로 살펴본 결과 Tpoint, PM10_rate, PM2.5_rate 의 상관관계가 높음¶
In [62]:
X = scaled_df2.drop(['Trate', 'Tpoint'], axis=1)
y = scaled_df2['Tpoint']
In [65]:
X
Out[65]:
PM10_rate | PM2.5_rate | Ozone_rate | NO2_rate | co_rate | SO2_rate | |
---|---|---|---|---|---|---|
0 | 0.276119 | 0.254545 | 0.828571 | 0.081081 | 0.181818 | 0.25 |
1 | 0.298507 | 0.272727 | 0.057143 | 0.540541 | 0.454545 | 0.50 |
2 | 0.268657 | 0.236364 | 0.057143 | 0.621622 | 0.363636 | 0.50 |
3 | 0.246269 | 0.218182 | 0.028571 | 0.729730 | 0.454545 | 0.75 |
4 | 0.246269 | 0.218182 | 0.000000 | 0.729730 | 0.454545 | 0.50 |
... | ... | ... | ... | ... | ... | ... |
1068 | 0.194030 | 0.181818 | 0.542857 | 0.040541 | 0.090909 | 0.25 |
1069 | 0.179104 | 0.181818 | 0.571429 | 0.040541 | 0.090909 | 0.25 |
1070 | 0.171642 | 0.181818 | 0.600000 | 0.027027 | 0.090909 | 0.25 |
1071 | 0.164179 | 0.200000 | 0.628571 | 0.027027 | 0.090909 | 0.25 |
1072 | 0.171642 | 0.218182 | 0.628571 | 0.054054 | 0.090909 | 0.00 |
1073 rows × 6 columns
In [66]:
y
Out[66]:
0 0.118421
1 0.171053
2 0.214912
3 0.276316
4 0.276316
...
1068 0.070175
1069 0.061404
1070 0.057018
1071 0.057018
1072 0.061404
Name: Tpoint, Length: 1073, dtype: float64
In [75]:
from sklearn.model_selection import train_test_split
In [76]:
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.2, random_state=100)
In [77]:
X_train
Out[77]:
PM10_rate | PM2.5_rate | Ozone_rate | NO2_rate | co_rate | SO2_rate | |
---|---|---|---|---|---|---|
265 | 0.126866 | 0.181818 | 0.628571 | 0.094595 | 0.090909 | 0.25 |
341 | 0.947761 | 0.618182 | 0.314286 | 0.351351 | 0.363636 | 0.50 |
171 | 0.365672 | 0.436364 | 0.028571 | 0.635135 | 0.272727 | 0.50 |
474 | 0.149254 | 0.145455 | 0.685714 | 0.067568 | 0.090909 | 0.25 |
800 | 0.179104 | 0.218182 | 0.514286 | 0.243243 | 0.090909 | 0.75 |
... | ... | ... | ... | ... | ... | ... |
802 | 0.171642 | 0.218182 | 0.428571 | 0.243243 | 0.181818 | 0.50 |
53 | 0.298507 | 0.381818 | 0.000000 | 0.810811 | 0.727273 | 0.75 |
350 | 0.776119 | 0.890909 | 0.485714 | 0.405405 | 0.272727 | 0.75 |
79 | 0.074627 | 0.127273 | 0.000000 | 0.648649 | 0.454545 | 0.25 |
792 | 0.171642 | 0.163636 | 0.714286 | 0.189189 | 0.090909 | 0.25 |
858 rows × 6 columns
In [78]:
X_test
Out[78]:
PM10_rate | PM2.5_rate | Ozone_rate | NO2_rate | co_rate | SO2_rate | |
---|---|---|---|---|---|---|
433 | 0.164179 | 0.236364 | 0.114286 | 0.378378 | 0.363636 | 0.50 |
30 | 0.343284 | 0.454545 | 0.571429 | 0.202703 | 0.272727 | 0.25 |
880 | 0.291045 | 0.436364 | 0.000000 | 0.797297 | 0.636364 | 0.50 |
225 | 0.253731 | 0.218182 | 0.742857 | 0.121622 | 0.090909 | 0.25 |
740 | 0.440299 | 0.527273 | 0.142857 | 0.608108 | 0.363636 | 0.50 |
... | ... | ... | ... | ... | ... | ... |
710 | 0.417910 | 0.672727 | 0.028571 | 0.635135 | 0.454545 | 0.25 |
623 | 0.164179 | 0.218182 | 0.685714 | 0.108108 | 0.090909 | 0.25 |
976 | 0.186567 | 0.272727 | 0.000000 | 0.608108 | 0.272727 | 0.50 |
709 | 0.425373 | 0.690909 | 0.028571 | 0.635135 | 0.545455 | 0.25 |
842 | 0.514925 | 0.909091 | 0.914286 | 0.324324 | 0.272727 | 0.75 |
215 rows × 6 columns
In [79]:
y_train
Out[79]:
265 0.043860
341 1.000000
171 0.223684
474 0.035088
800 0.061404
...
802 0.061404
53 0.302632
350 0.785088
79 0.232456
792 0.057018
Name: Tpoint, Length: 858, dtype: float64
In [80]:
y_test
Out[80]:
433 0.083333
30 0.210526
880 0.298246
225 0.105263
740 0.254386
...
710 0.364035
623 0.061404
976 0.210526
709 0.381579
842 0.583333
Name: Tpoint, Length: 215, dtype: float64
In [49]:
#!pip install statsmodels
In [ ]:
statsmodels.api에 있는 OLS 함수를 사용하여 다중회귀분석 실시¶
In [81]:
import statsmodels.api as sm
In [82]:
model = sm.OLS(y_train, X_train)
In [83]:
model = model.fit()
In [84]:
model.summary()
Out[84]:
Dep. Variable: | Tpoint | R-squared (uncentered): | 0.930 |
---|---|---|---|
Model: | OLS | Adj. R-squared (uncentered): | 0.930 |
Method: | Least Squares | F-statistic: | 1899. |
Date: | Thu, 28 Jan 2021 | Prob (F-statistic): | 0.00 |
Time: | 22:33:23 | Log-Likelihood: | 1051.5 |
No. Observations: | 858 | AIC: | -2091. |
Df Residuals: | 852 | BIC: | -2063. |
Df Model: | 6 | ||
Covariance Type: | nonrobust |
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
PM10_rate | 0.5058 | 0.028 | 18.384 | 0.000 | 0.452 | 0.560 |
PM2.5_rate | 0.3015 | 0.022 | 13.665 | 0.000 | 0.258 | 0.345 |
Ozone_rate | -0.1077 | 0.008 | -13.986 | 0.000 | -0.123 | -0.093 |
NO2_rate | -0.0288 | 0.019 | -1.513 | 0.131 | -0.066 | 0.009 |
co_rate | 0.0334 | 0.025 | 1.357 | 0.175 | -0.015 | 0.082 |
SO2_rate | 0.0214 | 0.016 | 1.302 | 0.193 | -0.011 | 0.054 |
Omnibus: | 265.859 | Durbin-Watson: | 2.114 |
---|---|---|---|
Prob(Omnibus): | 0.000 | Jarque-Bera (JB): | 752.600 |
Skew: | 1.561 | Prob(JB): | 3.76e-164 |
Kurtosis: | 6.362 | Cond. No. | 11.8 |
Notes:
[1] R² is computed without centering (uncentered) since the model does not contain a constant.
[2] Standard Errors assume that the covariance matrix of the errors is correctly specified.
회귀식으로 X_test 데이터 예측¶
In [86]:
pred = model.predict(X_test)
pred
Out[86]:
433 0.153958
30 0.257756
880 0.287803
225 0.118986
740 0.371648
...
710 0.413401
623 0.080233
976 0.178912
709 0.425695
842 0.451884
Length: 215, dtype: float64
In [87]:
y_test
Out[87]:
433 0.083333
30 0.210526
880 0.298246
225 0.105263
740 0.254386
...
710 0.364035
623 0.061404
976 0.210526
709 0.381579
842 0.583333
Name: Tpoint, Length: 215, dtype: float64
예측값과 실제값의 차이를 보기 위해 mean_squared_error을 사용해 확인¶
In [88]:
from sklearn.metrics import mean_squared_error
In [89]:
mean_squared_error(y_test, pred)
Out[89]:
0.004507524166997418
In [ ]:
산포도 그래프로 시각화¶
In [90]:
plt.figure(figsize=(10,10))
sns.scatterplot(x=y_test, y=pred)
Out[90]:
<AxesSubplot:xlabel='Tpoint'>
In [ ]:
In [ ]:
'Machine Learning, Deep Learning' 카테고리의 다른 글
[PyTorch] 파이토치 기본 조작 - Tensor 만들기, .matmul, .mul, 브로드캐스팅, mean(), sum(), max(), agrmax() (0) | 2021.02.08 |
---|---|
[sklearn, KMeans] Kmeans Clustering 을 활용한 데이터 기반 고객 분류 (0) | 2021.02.01 |
[sklearn] KNN(K Nearlist Neighbors) 알고리즘을 이용하여 고객이탈 예측하기 (0) | 2021.01.27 |
[sklearn, NLP] 상품 리뷰 분석 NLP, Count Vectorizer, Naive Bayes Classifier (0) | 2021.01.24 |
[sklearn] Logistic Regression을 활용한 소비자 광고 반응률 예측 (0) | 2021.01.22 |