23ํ
Contents
23ํ#
Attention
์บ๊ธ์ ์
๋ก๋๋ ๋ค๋ฅธ ๋ถ๋ค ์ฝ๋ ๋ณด๋ฌ๊ฐ๊ธฐ
๋ฐ์ดํฐ์
๋งํฌ
๋ฌธ์ ์ค๋ฅ, ์ฝ๋์ค๋ฅ ๋๊ธ๋ก ํผ๋๋ฐฑ์ฃผ์ธ์
๊ธฐ๊ณํ์ต(50์ )#
Attention
1๋ฒ
์จ,์ต๋,์กฐ๋,CO2๋๋์ ๋ฐ๋ฅธ ๊ฐ์ค์ ์ฌ์ฉ์ ๋ฌด ํ๋ณ
์ข
์๋ณ์ Occupancy, 0: ๋น์ด์์ , 1: ์ฌ์ฉ์ค
๋ฐ์ดํฐ ์ถ์ฒ : https://archive.ics.uci.edu/ml/datasets/Occupancy+Detection+
data Url : https://raw.githubusercontent.com/Datamanim/datarepo/main/adp/p1/problem1.csv
import pandas as pd
df =pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/adp/p1/problem1.csv')
df.head()
date | Temperature | Humidity | Light | CO2 | HumidityRatio | Occupancy | |
---|---|---|---|---|---|---|---|
0 | 2015-02-02 14:19:59 | 23.7180 | 26.290 | 578.400000 | 760.40 | 0.004773 | 1 |
1 | 2015-02-02 14:22:00 | 23.7225 | 26.125 | 493.750000 | 774.75 | 0.004744 | 1 |
2 | 2015-02-02 14:23:00 | 23.7540 | 26.200 | 488.600000 | 779.00 | 0.004767 | 1 |
3 | 2015-02-02 14:23:59 | 23.7600 | 26.260 | 568.666667 | 790.00 | 0.004779 | 1 |
4 | 2015-02-02 14:25:59 | 23.7540 | 26.290 | 509.000000 | 797.00 | 0.004783 | 1 |
1-1๋ฒ
๋ฐ์ดํฐ EDA ์ํ ํ, ๋ถ์๊ฐ ์ ์ฅ์์ ์๋ฏธ์๋ ํ์
import pandas as pd
print(df.info())
print('''
๊ฒฐ์ธก์น๊ฐ ์ผ๋ถ ์กด์ฌํ๋ฉฐ ๋ฐ์ดํฐ ํ์
์ date์ปฌ๋ผ์ ์ ์ธํ๊ณ ๋ชจ๋ floatํ์์ด๋ค.
''')
display(df.isnull().sum())
print()
print(df[df.CO2.isnull()].date.values)
print('\n๊ฒฐ์ธก์น๋ CO2 ์ปฌ๋ผ์๋ง ์กด์ฌํ๋ค. ๊ฒฐ์ธก์น์ ๋ฐ์ดํฐ๋ ์ฐ์์ ์ผ๋ก ์กด์ฌํ๋ ๊ฒ์ด ์๋๋ค.')
import seaborn as sns
import matplotlib.pyplot as plt
sns.pairplot(df)
plt.show()
for v in df.select_dtypes(include='float'):
target = df[v].dropna()
plt.boxplot(target)
plt.title(v)
plt.show()
print('''
Humidity, HumidityRatio์ปฌ๋ผ์ ๋์ ์๊ด๊ด๊ณ๋ฅผ ๋ณด์ด๋ฉฐ, ๋ ์ปฌ๋ผ์ ์ ์ธํ ๋๋จธ์ง ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ์ด์์น๊ฐ ์๋์ ์ผ๋ก ๋ง์ด ์กด์ฌํ๋ค
''')
display(df[df.Light <0].shape)
display(df.describe())
print('''
Light์ปฌ๋ผ์ ๊ฒฝ์ฐ -99์ธ ๊ฐ์ด 50๊ฐ ์กด์ฌํ๋ค.
''')
df['date'] = pd.to_datetime(df['date'])
timedeltas = df['date'].diff().dt.seconds.dropna()
display(timedeltas.describe())
print()
print('''
75%์ ๋ฐ์ดํฐ๊ฐ ์ฐ์ํ๋ ๋ฐ์ดํฐ ์ฌ์ด์ 61์ด ์ด๋ด์ ์๊ฐ ์ฐจ์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ฐ์๋ ๋ฐ์ดํฐ๊ฐ์ ์ต๋ ์๊ฐ์ฐจ์ด๋ 25680์ด๋ก ๋๋ต 7์๊ฐ ์ฐจ์ด๊ฐ ์กด์ฌํ๋ค.
์๊ณ์ด ๋ฐ์ดํฐ๋ก ๋ฐ์ดํฐ๋ฅผ ํด์ํ ๊ฒฝ์ฐ ์ด ์ฌ์ด ์๊ฐ๋ค์ ๊ฒฐ์ธก์น๋ก ๋ณผ์ ์๋ค
''')
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 17910 entries, 0 to 17909
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 17910 non-null object
1 Temperature 17910 non-null float64
2 Humidity 17910 non-null float64
3 Light 17910 non-null float64
4 CO2 17889 non-null float64
5 HumidityRatio 17910 non-null float64
6 Occupancy 17910 non-null int64
dtypes: float64(5), int64(1), object(1)
memory usage: 979.6+ KB
None
๊ฒฐ์ธก์น๊ฐ ์ผ๋ถ ์กด์ฌํ๋ฉฐ ๋ฐ์ดํฐ ํ์
์ date์ปฌ๋ผ์ ์ ์ธํ๊ณ ๋ชจ๋ floatํ์์ด๋ค.
date 0
Temperature 0
Humidity 0
Light 0
CO2 21
HumidityRatio 0
Occupancy 0
dtype: int64
['2015-02-03 19:09:59' '2015-02-03 19:31:00' '2015-02-04 18:08:00'
'2015-02-05 06:08:00' '2015-02-05 16:09:59' '2015-02-08 08:06:00'
'2015-02-08 11:54:00' '2015-02-08 20:58:59' '2015-02-09 06:04:59'
'2015-02-09 07:31:00' '2015-02-09 07:49:00' '2015-02-10 07:53:59'
'2015-02-12 00:34:00' '2015-02-12 10:53:00' '2015-02-12 15:04:00'
'2015-02-12 20:38:00' '2015-02-13 22:53:59' '2015-02-15 16:41:59'
'2015-02-16 00:53:59' '2015-02-17 01:56:00' '2015-02-18 06:20:00']
๊ฒฐ์ธก์น๋ CO2 ์ปฌ๋ผ์๋ง ์กด์ฌํ๋ค. ๊ฒฐ์ธก์น์ ๋ฐ์ดํฐ๋ ์ฐ์์ ์ผ๋ก ์กด์ฌํ๋ ๊ฒ์ด ์๋๋ค.
Humidity, HumidityRatio์ปฌ๋ผ์ ๋์ ์๊ด๊ด๊ณ๋ฅผ ๋ณด์ด๋ฉฐ, ๋ ์ปฌ๋ผ์ ์ ์ธํ ๋๋จธ์ง ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ์ด์์น๊ฐ ์๋์ ์ผ๋ก ๋ง์ด ์กด์ฌํ๋ค
(50, 7)
Temperature | Humidity | Light | CO2 | HumidityRatio | Occupancy | |
---|---|---|---|---|---|---|
count | 17910.000000 | 17910.000000 | 17910.000000 | 17889.000000 | 17910.000000 | 17910.000000 |
mean | 20.749036 | 27.589163 | 78.157369 | 647.700865 | 0.004175 | 0.117253 |
std | 0.994012 | 5.043595 | 168.574068 | 285.997340 | 0.000755 | 0.321730 |
min | 19.000000 | 16.745000 | -99.000000 | 412.750000 | 0.002674 | 0.000000 |
25% | 20.100000 | 24.390000 | 0.000000 | 453.000000 | 0.003702 | 0.000000 |
50% | 20.600000 | 27.200000 | 0.000000 | 532.666667 | 0.004222 | 0.000000 |
75% | 21.200000 | 31.290000 | 22.000000 | 722.000000 | 0.004790 | 0.000000 |
max | 24.408333 | 39.500000 | 1581.000000 | 2076.500000 | 0.006461 | 1.000000 |
Light์ปฌ๋ผ์ ๊ฒฝ์ฐ -99์ธ ๊ฐ์ด 50๊ฐ ์กด์ฌํ๋ค.
count 17909.000000
mean 71.357474
std 241.363584
min 59.000000
25% 60.000000
50% 60.000000
75% 61.000000
max 25680.000000
Name: date, dtype: float64
75%์ ๋ฐ์ดํฐ๊ฐ ์ฐ์ํ๋ ๋ฐ์ดํฐ ์ฌ์ด์ 61์ด ์ด๋ด์ ์๊ฐ ์ฐจ์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ฐ์๋ ๋ฐ์ดํฐ๊ฐ์ ์ต๋ ์๊ฐ์ฐจ์ด๋ 25680์ด๋ก ๋๋ต 7์๊ฐ ์ฐจ์ด๊ฐ ์กด์ฌํ๋ค.
์๊ณ์ด ๋ฐ์ดํฐ๋ก ๋ฐ์ดํฐ๋ฅผ ํด์ํ ๊ฒฝ์ฐ ์ด ์ฌ์ด ์๊ฐ๋ค์ ๊ฒฐ์ธก์น๋ก ๋ณผ์ ์๋ค
1-2๋ฒ
๊ฒฐ์ธก์น๋ฅผ ๋์ฒดํ๋ ๋ฐฉ์ ์ ํํ๊ณ ๊ทผ๊ฑฐ์ ์, ๋์ฒด ์ํ
print('''
CO2 ์ปฌ๋ผ์ nan๊ฐ์ผ๋ก ๋น์ด์๋ ๋ฐ์ดํฐ๋ ์ง์ , ์งํ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํด์ Occupancy๊ฐ์ด ๋ณํํ์ง ์๊ฑฐ๋,
date๊ฐ์ด 3๋ถ์ด๋ด๋ก ์ฐ์ํ๋ ๋ฐ์ดํฐ๋ผ๊ณ ํ๋ค๋ฉด ์ง์ CO2๊ฐ์ผ๋ก ๋์ฒด ํ๋ค.
์์ ๋ ๊ธฐ์ค์ ํด๋นํ๋ค๋ฉด ๋ชจ๋ CO2์ ๊ฒฐ์ธก์น๋ฅผ ๋์ฒด ํ ์ ์๊ณ ๋ฐ์ดํฐ์ ํ์ง์ ์์ ์ํค์ง ์๋ค๊ณ ํ๋จ ํ ์ ์๋ค
''')
for value in df[df.CO2.isnull()].index:
target = df.iloc[value-1:value+2]
difftime = target['date'].diff().dt.seconds.dropna()
if target.Occupancy.nunique() ==1 and len(difftime[difftime>180]) ==0:
df.loc[value,'CO2'] =df.loc[value-1].CO2
display(df.isnull().sum())
CO2 ์ปฌ๋ผ์ nan๊ฐ์ผ๋ก ๋น์ด์๋ ๋ฐ์ดํฐ๋ ์ง์ , ์งํ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํด์ Occupancy๊ฐ์ด ๋ณํํ์ง ์๊ฑฐ๋,
date๊ฐ์ด 3๋ถ์ด๋ด๋ก ์ฐ์ํ๋ ๋ฐ์ดํฐ๋ผ๊ณ ํ๋ค๋ฉด ์ง์ CO2๊ฐ์ผ๋ก ๋์ฒด ํ๋ค.
์์ ๋ ๊ธฐ์ค์ ํด๋นํ๋ค๋ฉด ๋ชจ๋ CO2์ ๊ฒฐ์ธก์น๋ฅผ ๋์ฒด ํ ์ ์๊ณ ๋ฐ์ดํฐ์ ํ์ง์ ์์ ์ํค์ง ์๋ค๊ณ ํ๋จ ํ ์ ์๋ค
date 0
Temperature 0
Humidity 0
Light 0
CO2 0
HumidityRatio 0
Occupancy 0
dtype: int64
1-3๋ฒ
์ถ๊ฐ์ ์ผ๋ก ๋ฐ์ดํฐ์ ์ง ๋ฐ ํ์ง๊ด๋ฆฌ๋ฅผ ํฅ์์ํฌ๋งํ ๋ด์ฉ ์์ฑ
print('''
Light ์ปฌ๋ผ์ -99๋ ์์ธ๊ฐ์ ๋ํด ์์ ๊ฐ์ ์
๋ ฅํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. -99๋ฅผ ์ ์ธํ ์ปฌ๋ผ์ ์ต์๊ฐ์ธ 0์ผ๋ก ๋์ฒดํ๋ค. ํ๊ท ์ ์ผ๋ก ์๊ฐ์ 1๋ถ ๊ฐ๊ฒฉ์ ๋ฐ์ดํฐ์ด๋ค.
ํ์ง๋ง ์ต๋ 7์๊ฐ์ ๊ณต๋ฐฑ์ด ์กด์ฌํ๋ค. ์ด๋ฅผ ๋ณด๊ฐ ํด์ฃผ๋ ๊ฒ๋ ๋ฐฉ๋ฒ ์ผ์ ์์ง๋ง,์๊ณ์ด ๋ชจ๋ธ์ ์ฌ์ฉํ์ง ์์ ๊ฒ์ด๊ธฐ์ ๋ณด๊ฐ์ ๋ฐ๋ก ํด์ฃผ์ง ์๊ณ ๋ชจ๋ธ๋ง์ ์งํํ๋ค.
''')
df.loc[df.Light ==-99,'Light'] = 0
Light ์ปฌ๋ผ์ -99๋ ์์ธ๊ฐ์ ๋ํด ์์ ๊ฐ์ ์
๋ ฅํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. -99๋ฅผ ์ ์ธํ ์ปฌ๋ผ์ ์ต์๊ฐ์ธ 0์ผ๋ก ๋์ฒดํ๋ค. ํ๊ท ์ ์ผ๋ก ์๊ฐ์ 1๋ถ ๊ฐ๊ฒฉ์ ๋ฐ์ดํฐ์ด๋ค.
ํ์ง๋ง ์ต๋ 7์๊ฐ์ ๊ณต๋ฐฑ์ด ์กด์ฌํ๋ค. ์ด๋ฅผ ๋ณด๊ฐ ํด์ฃผ๋ ๊ฒ๋ ๋ฐฉ๋ฒ ์ผ์ ์์ง๋ง,์๊ณ์ด ๋ชจ๋ธ์ ์ฌ์ฉํ์ง ์์ ๊ฒ์ด๊ธฐ์ ๋ณด๊ฐ์ ๋ฐ๋ก ํด์ฃผ์ง ์๊ณ ๋ชจ๋ธ๋ง์ ์งํํ๋ค.
2-1๋ฒ
๋ฐ์ดํฐ์ ๋ถ๊ท ํ์ด ์๋์ง ํ์ธ, ๋ถ๊ท ํ ํ๋จ ๊ทผ๊ฑฐ ์์ฑ
plt.figure(figsize=(15,4))
plt.scatter(df['date'],df['Occupancy'].astype('str'),s=0.03)
plt.show()
df.Occupancy.value_counts()
print('''
Occupancy ์ ๊ฒฝ์ฐ 7:1์ ๋น์จ๋ก ๋ฐ์ดํฐ ๋ถ๊ท ํ์ด ์กด์ฌํ๋ค.
์์ ๊ทธ๋ํ์์ ๋ณด๋ฉด 2์ 7์ผ~9์ผ , 2์ 14~16์ผ๊น์ง๋ ๊ฐ์ค์ด ๋น์ด์๋ค. ์ด์ฒ๋ผ ๊ฐ์ค์ด ๋น์ด์์ง ์๋ ๊ฒฝ์ฐ ๋ณด๋ค ๋น์ด์๋ ๊ฒฝ์ฐ๊ฐ ๋ ๋ง๊ธฐ์ ๋ถ๊ท ํ์ด ์กด์ฌํ๋ค
''')
Occupancy ์ ๊ฒฝ์ฐ 7:1์ ๋น์จ๋ก ๋ฐ์ดํฐ ๋ถ๊ท ํ์ด ์กด์ฌํ๋ค.
์์ ๊ทธ๋ํ์์ ๋ณด๋ฉด 2์ 7์ผ~9์ผ , 2์ 14~16์ผ๊น์ง๋ ๊ฐ์ค์ด ๋น์ด์๋ค. ์ด์ฒ๋ผ ๊ฐ์ค์ด ๋น์ด์์ง ์๋ ๊ฒฝ์ฐ ๋ณด๋ค ๋น์ด์๋ ๊ฒฝ์ฐ๊ฐ ๋ ๋ง๊ธฐ์ ๋ถ๊ท ํ์ด ์กด์ฌํ๋ค
2-2๋ฒ
์ค๋ฒ์ํ๋ง ๋ฐฉ๋ฒ๋ค ์ค 2๊ฐ ์ ํํ๊ณ ์ฅ๋จ์ ๋ฑ ์ ์ ์ด์ ์ ์
print('''*๋๋ค์ค๋ฒ์ํ๋ง*
์์ ํด๋์ค ๋ฐ์ดํฐ์ค ๋๋ค์ํ๋งํ์ฌ ๋ค์ ํด๋์ค ๋ฐ์ดํฐ ์ซ์์ ๋ง์ถ๋ ๋ฐฉ์
์ฅ์ : ๋ฐ์ดํฐ ๋ถ๊ท ํ ๋ฌธ์ ํด๊ฒฐ
๋จ์ : ์ข
์๋ณ์์ ๋ํ ๊ณ ๋ ค์์ด ์ค๋ณต ์์ฑ, overfitting์ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌ
*SMOTE*
์์ ํด๋์ค ๋ฐ์ดํฐ์ ๊ทธ ๋ฐ์ดํฐ์์ ๊ฐ์ฅ ๊ฐ๊น์ด k๊ฐ์ ์์ ํด๋์ค ๋ฐ์ดํฐ ์ค ๋ฌด์์๋ก ์ ํ๋ ๋ฐ์ดํฐ ์ฌ์ด์ ์ง์ ์์ ๊ฐ์์ ์์ ํด๋์ค ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
์ฅ์ : ๋ฐ์ดํฐ ๋ถ๊ท ํ ๋ฌธ์ ํด๊ฒฐ, ๋ฐ์ดํฐ ๋ถํฌ๋ฅผ ๊ณ ๋ คํ ์ค๋ณต์๋ ๋ฐ์ดํฐ ์์ฑ
๋จ์ : ๊ณ ์ฐจ์ ๋ฐ์ดํฐ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค
''')
*๋๋ค์ค๋ฒ์ํ๋ง*
์์ ํด๋์ค ๋ฐ์ดํฐ์ค ๋๋ค์ํ๋งํ์ฌ ๋ค์ ํด๋์ค ๋ฐ์ดํฐ ์ซ์์ ๋ง์ถ๋ ๋ฐฉ์
์ฅ์ : ๋ฐ์ดํฐ ๋ถ๊ท ํ ๋ฌธ์ ํด๊ฒฐ
๋จ์ : ์ข
์๋ณ์์ ๋ํ ๊ณ ๋ ค์์ด ์ค๋ณต ์์ฑ, overfitting์ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌ
*SMOTE*
์์ ํด๋์ค ๋ฐ์ดํฐ์ ๊ทธ ๋ฐ์ดํฐ์์ ๊ฐ์ฅ ๊ฐ๊น์ด k๊ฐ์ ์์ ํด๋์ค ๋ฐ์ดํฐ ์ค ๋ฌด์์๋ก ์ ํ๋ ๋ฐ์ดํฐ ์ฌ์ด์ ์ง์ ์์ ๊ฐ์์ ์์ ํด๋์ค ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
์ฅ์ : ๋ฐ์ดํฐ ๋ถ๊ท ํ ๋ฌธ์ ํด๊ฒฐ, ๋ฐ์ดํฐ ๋ถํฌ๋ฅผ ๊ณ ๋ คํ ์ค๋ณต์๋ ๋ฐ์ดํฐ ์์ฑ
๋จ์ : ๊ณ ์ฐจ์ ๋ฐ์ดํฐ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค
2-3๋ฒ
์ค๋ฒ์ํ๋ง ์ํ ๋ฐ ๊ฒฐ๊ณผ, ์ ๋์๋ค๋ ๊ฒ์ ํ๋จํด๋ผ
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')
# train,test ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ๊ณ train ๋ฐ์ดํฐ์ ๋ํด์๋ง ์ค๋ฒ ์ํ๋ง์ ์งํํ๋ค
X =df.drop(columns=['Occupancy'])
y =df['Occupancy']
X_train , X_test , y_train, y_test = train_test_split(X,y,stratify=y,random_state=43,test_size=0.35)
from imblearn.over_sampling import RandomOverSampler,SMOTE
#datetime ํํ๋ก๋ ์ํ๋ง ํ ์ ์๊ธฐ์ timestamps ํ์์ผ๋ก ๋ฐ๊ฟ์ ์ํ๋ง์ ์งํํ๋ค
X_train.loc[:,'datetime'] = X_train['date'].view('int') // 10**9
X_test.loc[:,'datetime'] = X_test['date'].view('int') // 10**9
from sklearn.preprocessing import StandardScaler
X_imb = X_train.drop(columns = ['date']).reset_index(drop=True).copy()
y_imb = y_train.reset_index(drop=True).copy()
X_samp, y_samp = RandomOverSampler(random_state=2022).fit_resample(X_imb,y_imb)
total = pd.concat([X_samp,y_samp],axis=1)
total['date'] = pd.to_datetime(total['datetime'], unit='s')
SMOTE_X_samp, SMOTE_y_samp = SMOTE(random_state=2022).fit_resample(X_imb,y_imb)
SMOTE_total = pd.concat([SMOTE_X_samp,SMOTE_y_samp],axis=1)
SMOTE_total['date'] = pd.to_datetime(SMOTE_total['datetime'], unit='s')
plt.figure(figsize=(15,4))
plt.title('RandomSampling')
plt.scatter(total['date'],total['Occupancy'].astype('str'),s=0.03)
plt.show()
plt.figure(figsize=(15,4))
plt.title('SMOTE')
plt.scatter(SMOTE_total['date'],SMOTE_total['Occupancy'].astype('str'),s=0.03)
plt.show()
print('''
RandomSampling ๋๋น SMOTE์์ ์ข ๋ ๋ค์ํ ์ฐจ์์ ์ํ์ด ์์ฑ๋จ์ ๋ณผ์ ์๋ค. (02-18์ผ ๋ถ๊ทผ)
''')
RandomSampling ๋๋น SMOTE์์ ์ข ๋ ๋ค์ํ ์ฐจ์์ ์ํ์ด ์์ฑ๋จ์ ๋ณผ์ ์๋ค. (02-18์ผ ๋ถ๊ทผ)
3-1๋ฒ
์๋์ธก๋ฉด, ์ ํ๋์ธก๋ฉด ๋ชจ๋ธ 1๊ฐ์ฉ ์ ํ, ์ ํ ์ด์ ๋ ๊ธฐ์
print('''
์ด์ง ๋ถ๋ฅ ๋ฌธ์ ์ด๋ค.
์๋์ธก๋ฉด์์๋ linear regression,
์ ํ๋ ์ธก๋ฉด์์๋ randomforest classifier๋ฅผ ์ ํํ์ฌ ๋ถ์์ ์งํํ๊ฒ ๋ค
''')
์ด์ง ๋ถ๋ฅ ๋ฌธ์ ์ด๋ค.
์๋์ธก๋ฉด์์๋ linear regression,
์ ํ๋ ์ธก๋ฉด์์๋ randomforest classifier๋ฅผ ์ ํํ์ฌ ๋ถ์์ ์งํํ๊ฒ ๋ค
3-2๋ฒ
์์์ ์ค๋ฒ์ํ๋ง ํ ๋ฐ์ดํฐ 2๊ฐ, ์ค๋ฒ์ํ๋ง ํ๊ธฐ ์ ๋ฐ์ดํฐ 1๊ฐ์ ๋ํด ๋ชจ๋ธ 2๊ฐ๋ฅผ ์ ์ฉํ๊ณ ์ฑ๋ฅ ๋ณด์ฌ์ฃผ๊ธฐ
import time
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score
from sklearn.preprocessing import MinMaxScaler
# ๋ถํ์ ์ปฌ๋ผ์ ๊ฑฐ ๋ฐ ์ค์ผ์ผ๋ง
if 'date' in X_train.columns:
X_train = X_train.drop(columns=['date'])
if 'date' in X_test.columns:
X_test = X_test.drop(columns=['date'])
result_auc_train = []
result_auc_test = []
result_time = []
for train_X,trainy in [(X_train,y_train),(X_samp, y_samp),(SMOTE_X_samp, SMOTE_y_samp)]:
trainX = train_X.copy()
testX = X_test.copy()
sc = MinMaxScaler()
trainX = sc.fit_transform(trainX)
testX = sc.transform(testX)
lrstart = time.time()
lr =LogisticRegression()
lr.fit(trainX,trainy)
lrend = time.time() - lrstart
pred_lr = lr.predict(testX)
auc_lr_train = roc_auc_score(trainy,lr.predict(trainX))
auc_lr = roc_auc_score(y_test,pred_lr)
rfstart = time.time()
rf =RandomForestClassifier()
rf.fit(trainX,trainy)
rfend = time.time() - rfstart
pred_rf = rf.predict(testX)
auc_rf_train = roc_auc_score(trainy,rf.predict(trainX))
auc_rf = roc_auc_score(y_test,pred_rf)
result_auc_test.append([auc_lr,auc_rf])
result_time.append([lrend,rfend])
result_auc_train.append([auc_lr_train,auc_rf_train])
#logistic regression ๊ณผ randomforest ๋ถ๋ฅ๊ธฐ๋ฅผ ์ํ๋ง๋ฐฉ์์ ๋ฐ๋ฅธ ํ์ต์ ์ ํ๋์ ๋ชจ๋ธ ํ์ต ์๊ฐ์ ๋ํด์ ํ๊ฐํ๋ค.
print('ํ๋ จ์
๋ชจ๋ธ auc ๊ฒฐ๊ณผ')
result_auc_trains = pd.DataFrame(result_auc_train)
result_auc_trains.index = ['raw','randomSampling','SMOTE']
result_auc_trains.columns = ['logistic','randomforest']
display(result_auc_trains)
print('ํ
์คํธ์
๋ชจ๋ธ auc ๊ฒฐ๊ณผ')
result_auc_tests = pd.DataFrame(result_auc_test)
result_auc_tests.index = ['raw','randomSampling','SMOTE']
result_auc_tests.columns = ['logistic','randomforest']
display(result_auc_tests)
print('๋ชจ๋ธ ํ์ต์๊ฐ (sec)')
result_times = pd.DataFrame(result_time)
result_times.index = ['raw','randomSampling','SMOTE']
result_times.columns = ['logistic','randomforest']
result_times
ํ๋ จ์
๋ชจ๋ธ auc ๊ฒฐ๊ณผ
logistic | randomforest | |
---|---|---|
raw | 0.987030 | 1.0 |
randomSampling | 0.989879 | 1.0 |
SMOTE | 0.991096 | 1.0 |
ํ
์คํธ์
๋ชจ๋ธ auc ๊ฒฐ๊ณผ
logistic | randomforest | |
---|---|---|
raw | 0.988823 | 0.984997 |
randomSampling | 0.987016 | 0.988807 |
SMOTE | 0.987107 | 0.990125 |
๋ชจ๋ธ ํ์ต์๊ฐ (sec)
logistic | randomforest | |
---|---|---|
raw | 0.034435 | 0.662965 |
randomSampling | 0.053179 | 1.137727 |
SMOTE | 0.051847 | 1.589572 |
3-3๋ฒ
์ ์์ธก๊ฒฐ๊ณผ ์ฌ์ฉํด์ ์ค๋ฒ์ํ๋ง์ด ๋ฏธ์น ์ํฅ์ ๋ํด ์์ฑํ๋ผ
print('''
logistic regression์ ๊ฒฝ์ฐ ํ์ต์๊ฐ์ random forest์ ๋นํด ๋ฎ๊ฒ ๋์์ง๋ง ๋ชจ๋ธ ์ฑ๋ฅ์ ๊ฒฝ์ฐ train์
์ ๊ฒฝ์ฐ ๋ชจ๋ ๋ฎ๊ฒ ๋์์ผ๋ฉฐ test์
์ ๊ฒฝ์ฐ ์
์ํ๋ง์ ํ์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ์ฑ๋ฅ์ด ๋ฎ๊ฒ ๋์๋ค.
randomforest์ ๊ฒฝ์ฐ ํ์ต ๋ชจ๋ธ์ ๊ฒฝ์ฐ auc๊ฐ์ด 1๋ก ์ค๋ฒํผํ
๋๋ค. test์
์ ๋ํด์๋ raw , randomSampling, SMOTE ์์๋ก auc๊ฐ์ด ์ฆ๊ฐํ๋๊ฒ์ ํ์ธ ํ ์ ์๋ค
''')
logistic regression์ ๊ฒฝ์ฐ ํ์ต์๊ฐ์ random forest์ ๋นํด ๋ฎ๊ฒ ๋์์ง๋ง ๋ชจ๋ธ ์ฑ๋ฅ์ ๊ฒฝ์ฐ train์
์ ๊ฒฝ์ฐ ๋ชจ๋ ๋ฎ๊ฒ ๋์์ผ๋ฉฐ test์
์ ๊ฒฝ์ฐ ์
์ํ๋ง์ ํ์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ์ฑ๋ฅ์ด ๋ฎ๊ฒ ๋์๋ค.
randomforest์ ๊ฒฝ์ฐ ํ์ต ๋ชจ๋ธ์ ๊ฒฝ์ฐ auc๊ฐ์ด 1๋ก ์ค๋ฒํผํ
๋๋ค. test์
์ ๋ํด์๋ raw , randomSampling, SMOTE ์์๋ก auc๊ฐ์ด ์ฆ๊ฐํ๋๊ฒ์ ํ์ธ ํ ์ ์๋ค
ํต๊ณ๋ถ์(50์ )#
Attention
2๋ฒ
๊ณต์ฅ์์๋ ์ง๊ณต๊ด ์๋ช
์ด 1๋ง ์๊ฐ์ด๋ผ๊ณ ์ฃผ์ฅํ์ฌ ํ์ง๊ด๋ฆฌํ์์ 12๊ฐ ์ํ์ ๋ฝ์์ ์ ์์์ค 5%์์ ๋ถํธ ๊ฒ์ ํ์์ค
data Url : https://raw.githubusercontent.com/Datamanim/datarepo/main/adp/p1/problem2.csv
import pandas as pd
df =pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/adp/p1/problem2.csv')
df.head()
name | life span | |
---|---|---|
0 | sample1 | 10000 |
1 | sample2 | 9000 |
2 | sample3 | 9500 |
3 | sample4 | 10000 |
4 | sample5 | 10000 |
1๋ฒ
๊ท๋ฌด๊ฐ์ค, ์ฐ๊ตฌ๊ฐ์ค ์ธ์ฐ๊ธฐ
print('''
๊ท๋ฌด๊ฐ์ค : ๋ฐ์ดํฐ์ ์ค์์๋ 1๋ง ์๊ฐ์ด๋ค
์ฐ๊ตฌ๊ฐ์ค : ๋ฐ์ดํฐ์ ์ค์์๋ 1๋ง ์๊ฐ์ด ์๋๋ค''')
๊ท๋ฌด๊ฐ์ค : ๋ฐ์ดํฐ์ ์ค์์๋ 1๋ง ์๊ฐ์ด๋ค
์ฐ๊ตฌ๊ฐ์ค : ๋ฐ์ดํฐ์ ์ค์์๋ 1๋ง ์๊ฐ์ด ์๋๋ค
2๋ฒ
์ ํจํ ๋ฐ์ดํฐ์ ๊ฐ์๋?
print('์ค์์์ ๋์ผํ ๊ฐ๋ค์ ์์ ๋ถํธ ๊ฒ์ ์์ ๋ถํ์ํ ๋ฐ์ดํฐ์ด๋ค. ๊ทธ ์ซ์๋ : ',df[df['life span']==10000].shape[0])
df_fillter = df[df['life span'] != 10000]
์ค์์์ ๋์ผํ ๊ฐ๋ค์ ์์ ๋ถํธ ๊ฒ์ ์์ ๋ถํ์ํ ๋ฐ์ดํฐ์ด๋ค. ๊ทธ ์ซ์๋ : 4
3๋ฒ
๊ฒ์ ํต๊ณ๋ ๋ฐ ์ฐ๊ตฌ๊ฐ์ค ์ฑํ ์ฌ๋ถ๋ฅผ ์์ฑํ๋ผ
from scipy.stats import wilcoxon
static, pvalue = wilcoxon(df_fillter['life span']-10000)
print('๊ฒ์ ํต๊ณ๋์ ',static,'์ด๋ค. pvalue๋ ',pvalue,'๋ก 5% ์ ์ ์์ค์์ ๊ท๋ฌด๊ฐ์ค์ ๊ธฐ๊ฐํ ์ ์๋ค. ์ฐ๊ตฌ๊ฐ์ค์ ์ฑํํ์ง ์๋๋ค. ')
๊ฒ์ ํต๊ณ๋์ 8.5 ์ด๋ค. pvalue๋ 0.1953125 ๋ก 5% ์ ์ ์์ค์์ ๊ท๋ฌด๊ฐ์ค์ ๊ธฐ๊ฐํ ์ ์๋ค. ์ฐ๊ตฌ๊ฐ์ค์ ์ฑํํ์ง ์๋๋ค.
Attention
3๋ฒ
์ฝ๋ก๋ ์๊ณ์ด ๋ฐ์ดํฐ
์ผ์/๊ตญ๊ฐ๋ช
/ํ์ง์์
๋ฐ์ดํฐ ์ถ์ฒ(ํ์ฒ๋ฆฌ๊ณผ์ ๋ฏธํฌํจ) :https://www.kaggle.com/antgoldbloom/covid19panels?select=country_panel.csv
๋ฐ์ดํฐ url : https://raw.githubusercontent.com/Datamanim/datarepo/main/adp/p1/problem3_covid2.csv
import pandas as pd
df =pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/adp/p1/problem3_covid2.csv')
df.head()
location | date | new_cases | |
---|---|---|---|
0 | Austria | 2021-01-01 | 2096.0 |
1 | Austria | 2021-01-02 | 1391.0 |
2 | Austria | 2021-01-03 | 1466.0 |
3 | Austria | 2021-01-04 | 1642.0 |
4 | Austria | 2021-01-05 | 2311.0 |
1๋ฒ
๋ฐ์ดํฐ๋ ์ผ์๋ณ ๊ฐ ๋๋ผ์ ์ผ์ผ ํ์ง์์๋ฅผ ๋ํ๋ธ๋ค. ๊ฐ ๋๋ผ์ ์ผ์๋ณ ๋์ ํ์ง์ ์๋ฅผ ๋ํ๋ด๋ ๋ฐ์ดํฐ ํ๋ ์์ ์์ฑํ๋ผ
target = df.groupby(['location','date']).sum().groupby(level=0).cumsum()
target.columns = ['cumulative sum']
target = target.reset_index()
target
location | date | cumulative sum | |
---|---|---|---|
0 | Austria | 2021-01-01 | 2096.0 |
1 | Austria | 2021-01-02 | 3487.0 |
2 | Austria | 2021-01-03 | 4953.0 |
3 | Austria | 2021-01-04 | 6595.0 |
4 | Austria | 2021-01-05 | 8906.0 |
... | ... | ... | ... |
11890 | Vanuatu | 2021-10-28 | 5.0 |
11891 | Vanuatu | 2021-10-29 | 5.0 |
11892 | Vanuatu | 2021-10-30 | 5.0 |
11893 | Vanuatu | 2021-10-31 | 5.0 |
11894 | Vanuatu | 2021-11-01 | 5.0 |
11895 rows ร 3 columns
2๋ฒ
1์์ ๊ตฌํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ ๋๋ผ๋ณ๋ก acf๊ฐ์ ๊ตฌํ๊ณ (lag๋ 50๊ฐ๊น์ง ๊ตฌํ๊ณ ์ฒซ๋ฒ์งธ ๊ฐ์ ์ ์ธํ๋ผ) ๊ตญ๊ฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ํด๋ฆฌ๋์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ํด๋ฌ์คํฐ๋ง์ ์งํ ํ ๊ณ์ธต์ ๊ตฐ์ง ๋ถ์์ ์ํด ๋ด๋๋ก๊ทธ๋จ ์์ฑํ๋ผ
from scipy.spatial import distance
import statsmodels.api as sm
import numpy as np
name =[]
for lo in target.location.unique():
v = sm.tsa.stattools.acf(target[target.location==lo]['cumulative sum'], nlags=50, fft=False)
name.append([lo]+list(v[1:]))
v = pd.DataFrame(name)
import seaborn as sns
import scipy
import matplotlib.pyplot as plt
import scipy.cluster.hierarchy as sch
data =v.set_index(0)
label = np.array(data.index)
datav = data.values
fig = plt.figure(figsize=(17,10))
ax3 = fig.add_subplot(1,1,1)
dend3 = sch.linkage(datav, method='average', metric='euclidean')
cutoff = 0.3*max(dend3[:,2])
dend_res3 = sch.dendrogram(dend3, color_threshold=cutoff)
ax3.set_xticklabels(label[dend_res3['leaves']], minor=False)
plt.show()
Attention
4๋ฒ
์๋ ์ด๋ฏธ์ง์ ๊ฐ์ ํ๊ณผ๋ณ ํ์ ๋ถํฌ ์ธ์์ ํ๊ฐ ์๋ค. ํ๊ณผ์ ์ฑ์ ์ด ๊ด๊ณ์๋์ง๋ฅผ ๊ฒ์ ํ๋ผ
1๋ฒ
๊ท๋ฌด๊ฐ์ค, ์ฐ๊ตฌ๊ฐ์ค ์ธ์ฐ๊ธฐ
print('''
๊ท๋ฌด๊ฐ์ค : ํ๊ณผ์ ์ฑ์ ์ ๊ด๋ จ์ด ์๋ค (๋
๋ฆฝ์ด๋ค)
์ฐ๊ตฌ๊ฐ์ค : ํ๊ณผ์ ์ฑ์ ์ ๊ด๋ จ์ด ์๋ค (๋
๋ฆฝ์ด ์๋๋ค)
''')
๊ท๋ฌด๊ฐ์ค : ํ๊ณผ์ ์ฑ์ ์ ๊ด๋ จ์ด ์๋ค (๋
๋ฆฝ์ด๋ค)
์ฐ๊ตฌ๊ฐ์ค : ํ๊ณผ์ ์ฑ์ ์ ๊ด๋ จ์ด ์๋ค (๋
๋ฆฝ์ด ์๋๋ค)
2๋ฒ
ํ๊ณผ์ ์ฑ์ ์ด ๋ ๋ฆฝ์ผ ๊ฒฝ์ฐ์ ๊ธฐ๋๊ฐ์ ๊ตฌํ์์ค
df = pd.DataFrame({'์ฌํ๊ณผํ':[15,60,24],'์์ฐ๊ณผํ':[25,69,5],'๊ณตํ':[10,77,13]})
df.index = ['1.5-2.5','2.5-3.5','3.5-4.5']
from scipy.stats import chi2_contingency,fisher_exact
chi2 , p ,dof, expected = chi2_contingency(df)
print(expected)
[[16.61073826 16.61073826 16.77852349]
[68.43624161 68.43624161 69.12751678]
[13.95302013 13.95302013 14.09395973]]
3๋ฒ
๊ฒ์ ํต๊ณ๋ ๊ตฌํ๊ณ ์ฐ๊ตฌ๊ฐ์ค์ ์ฑํ์ฌ๋ถ ์์ฑ
print(p)
# ์นด์ด ์ ๊ณฑ ๊ฒ์ ์ p-value๋ 0.00018๋ก ๊ท๋ฌด๊ฐ์ค์ ๊ธฐ๊ฐํ๋ค. ํ๊ณผ์ ์ฑ์ ์ ๊ด๋ จ์ด ์๋ค.
# ๋ง์ฝ 5๋ณด๋ค ์์ ์
์ด 20%๊ฐ ๋์ด๊ฐ๋ฏ๋ก(75%) ํผ์
์ ์ ํ๊ฒ์ ์ ์ฌ์ฉ ํด์ผํ๋ค. #print(fisher_exact(df))
0.00018822647762421383