ํ์ ์ค์ ํ ๋ช ์ด ๋ฏธ๊ตญ ๋ด์ UFO ์ถํ์ ๊ด์ฌ์ ๊ฐ๊ณ ์์ด ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ ๋ถ์์ ํด๋ณด๋ ๊ฒ ์ด๋ป๊ฒ ๋๊ณ ํ์ฌ ํฉ์ ์ธ๋ก ์ ๋ํ ๋ถ์์์ ๋ณ๊ฒฝํ๊ฒ ๋์๋ค.
๊ทธ๋ฆฌํ์ฌ ์ต์ข ์ ์ผ๋ก UFO ๋ฏธ๊ตญ ๊ด๊ด ํฌ์ด๋ฅผ ์ํ UFO ์ถ๋ชฐ ์ง์ญ ๋ฐ ํจํด ๋ฐ์ดํฐ ๋ถ์ ์ ์ฃผ์ ๋ก ์ ์ ํ๊ฒ ๋์๋ค.
๋ฐ์ดํฐ๋ National UFO Reporting Center์์ ์ฐพ์ ์ ์์๊ณ
ํ ํํ์ ์ ํ์ง ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ํฌ๋กค๋ง ํด์ฃผ๋ Instant Data Scraper๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์งํ์๋ค.
์ด ๊ณณ์๋ 1400๋
๋๋ถํฐ ํ์ฌ๊น์ง ๋ชฉ๊ฒฉ๋์๋ค๋ UFO ์ถ๋ชฐ ์ ๋ณด๊ฐ ๋ค์ด์์๋๋ฐ
์ฐ๋ฆฌ ํ์ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์ ๋์
์ด ๋์ค์ ์ผ๋ก ์์๋ 2000๋
~ 2022๋
๋ฐ์ดํฐ๋ค์
<nuforc์ Data bank์ UFO Report Index by Month>์์ ์์งํ์๋ค.
ํด๋น ์น์ ์ ๋ฐ์ดํฐ ์ผ๋ถ
ํ์ง๋ง ์ ์ฒ๋ฆฌ๋ ํผํด๊ฐ ์ ์๋ ์ผ์ด์์๊นโฆ
์ผ๋จ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ถ๋ฌ์จ๋ค.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค์ column๋ช ๋ค์ด ๋ฏธ์ณ ๋ ๋ฐ๊ธฐ ์์ํ๋ค.
total = pd.read_csv('/Users/sung/Desktop/Python/total_ufo.csv')
total.head()
๋ฐ๋ผ์ ์ปฌ๋ผ๋ช ์ ํ์ธํ๊ณ ๋ณ๊ฒฝํด์ฃผ๋ ์์ ์ ์งํํ์๋ค.
total.columns
>>>
Index(['Unnamed: 0.1', 'Unnamed: 0', 'tablescraper-selected-row',
'tablescraper-selected-row href', 'tablescraper-selected-row 2',
'tablescraper-selected-row 3', 'tablescraper-selected-row 4',
'tablescraper-selected-row 5', 'tablescraper-selected-row 6',
'tablescraper-selected-row 7', 'tablescraper-selected-row 8',
'tablescraper-selected-row 9'],
dtype='object')
total.columns = ['drop', 'drop', 'date_time','url','city','statecode','country','shape','duration','summary','posted','image']
total.head()
์์ ์ฒ๋ผ ์ปฌ๋ผ๋ช ์ด ๊น๋ํด์ง ๊ฒ์ ๋ณผ ์ ์๋ค!
ํ์ง๋ง ์ค๊ฐ์ค๊ฐ drop์ด๋ผ๋ ๊ฒ์ด ์๋๋ฐ ์ผ๋จ index๊ฐ ์ค๋ณต์ผ๋ก ๋ค์ด๊ฐ์๋ column๋ค์
์ญ์ ํ ๊ฒ์ด์๊ธฐ์ drop์ผ๋ก ํ๊ธฐํ์๋ค.
์ฌ๊ธฐ์ ์ถ๊ฐ๋ก ๋ฐ์ดํฐ ๋ถ์์ ์ ํฉํ์ง ์์ column๋ค์ ๊ฐ์ด ์ญ์ ํด์ฃผ๊ธฐ๋ก ํ์๋ค.
total = total.drop(['drop','drop','url','posted','image'], axis = 1, inplace = False)
total.head()
column๋ค์ด ๊น๋ํด์ง ๊ฒ์ ๋ณผ ์ ์๋ค!
- date_time: UFO๊ฐ ๋ชฉ๊ฒฉ๋ ์๊ฐ
- city: UFO๊ฐ ๋ชฉ๊ฒฉ๋ ๋์
- statecode: ๋ฏธ๊ตญ ์ฃผ๋ฅผ ๋ํ๋ด๋ ์ฝ๋
- country: ๋ชฉ๊ฒฉ๋ ๊ตญ๊ฐ
- shape: ๋ชฉ๊ฒฉ๋ UFO์ ๋ชจ์
- duration: UFO๊ฐ ๋ชฉ๊ฒฉ๋์ด ์ฌ๋ผ์ง๊ธฐ ์ ๊น์ง์ ์๊ฐ
- summary: UFO ๋ชฉ๊ฒฉ์๋ค์ ์ง์ ์์ฝ
์ผ๋จ column๋ค์ ์ ๋ฆฌํ ํ Null ๊ฐ์ด ์๋์ง ์ฐพ์๋ณด์๋ค.
total.isnull().sum()
>>>
date_time 0
city 3
statecode 16
country 0
shape 113
duration 263
summary 3312
dtype: int64
์๊ฐ๋ณด๋ค Null ๊ฐ์ด ๋ง์๋ค!
๊ทธ๋ฆฌํ์ฌ Null ๊ฐ์ ๋จ๊ตฌ๊ฑฐ๋ 0์ผ๋ก ์ฒ๋ฆฌํด์ผํ๋๋ฐ
์ฐ๋ฆฌ ๋ฐ์ดํฐ ํน์ฑ์ ๋ฌธ์์ด์ด ๋ง์๊ธฐ ๋๋ฌธ์ string์ผ๋ก ๋์ด์๋ ์ด ๊ฐ์ ์์๋ก โnullโ์ด๋ผ๊ณ
์ ์ ๊ฐ์ธ ์ด ๊ฐ์ โ0โ์ผ๋ก fillna
ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ ์ฒ๋ฆฌ ํด์ฃผ์๋ค.
total['city'] = total['city'].fillna('null')
total['statecode'] = total['statecode'].fillna('null')
total['shape'] = total['shape'].fillna('null')
total['duration'] = total['duration'].fillna(0)
total['summary'] = total['summary'].fillna('null')
# null๊ฐ์ด ์ฒ๋ฆฌ๋์๋์ง ํ์ธ
total.isnull().sum()
>>>
date_time 0
city 0
statecode 0
country 0
shape 0
duration 0
summary 0
dtype: int64
# null ํ
์คํธ๊ฐ ์ ๋ค์ด๊ฐ๋์ง๋ ํ์ธ
total[total['city'] == 'null']
์ด๋ก์จ Null ์ ์ฒ๋ฆฌ๊ฐ ์ ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
์ด์ ์๊ฐ์ ์ธ์ธํ๊ฒ ๋๋์ด ๊ด์ฐฐํ๊ธฐ ์ํ์ฌ date_time column์ ์ฐ๋ ์ ์๊ฐ์ผ๋ก ๋๋๊ธฐ๋ก ํ์๋ค.
ํ์ง๋ง ๋ง์ date_time์ด์ type์ ํ์ธํด๋ณด๋ datetime ํ์์ด ์๋ ํ ์คํธ์ ํ์์ด์๋ค!
pd.to_datetime
ํจ์๋ฅผ ์ด์ฉํ์ฌ data type์ ๋ฐ๊ฟ์ฃผ๊ณ ๊ฐ๊ฐ ๋
์ ์๊ฐ์ ์ถ์ถํ์ฌ ์ด์ ์ถ๊ฐํ์๋ค.
total['date_time'] = pd.to_datetime(total['date_time'], errors = 'coerce')
# ๋ณ๊ฒฝ ํ ์ ๋ณ๊ฒฝ๋์๋์ง ํ์ธ
total['date_time']
>>>
0 2000-01-31 22:21:00
1 2000-01-31 21:00:00
2 2000-01-30 23:15:00
3 2000-01-30 10:30:00
4 2000-01-29 13:00:00
...
119622 2022-06-01 03:36:00
119623 2022-06-01 03:00:00
119624 2022-06-01 01:19:00
119625 2022-06-01 00:01:00
119626 2022-06-01 00:00:00
Name: **date_time**, Length: 119627, dtype: datetime64[ns]
total['year'] = total['date_time'].dt.year
total['month'] = total['date_time'].dt.month
total['hour'] = total['date_time'].dt.hour
์๋ฆ๋ต๊ฒ ๋ณ๊ฒฝ๋์ด ์ถ๊ฐ ๋ ๊ฒ ๊ฐ์์ผ๋โฆ?!
์ฐ ์ ์๊ฐ์ float ํ์์ด ๋๋ฅผ ์ ๊ฒฝ์ฐ์ด๊ฒ ๋ง๋ค์๋ค.
int๋ก ๋ฐ๊พธ๋ ค๊ณ ํ์ผ๋ ๋ฐ๋์ง ์์ ์ค๋ฅ๋ฉ์ธ์ง๋ฅผ ๊ตฌ๊ธ๋ง ํด๋ณด๋
Null๊ฐ์ด ์์ผ๋ฉด ๋จ๋ ๋ฉ์ธ์ง๋ผ๊ณ ๋์ Null๊ฐ์ ๋ค์ ์ฐพ์๋ณด๋ ์์๋ค!!!
total['year'].isnull().sum()
>>>
2
2๊ฐ๊ฐ ์๋ค๊ณ ๋์์ Null ๊ฐ์ 0์ผ๋ก ์ฑ์ฐ๊ณ ๋ค์ ์๋ํ๋๋ฐ๋ ๋จนํ์ง ์์๋ค!!!!
total['year'].fillna(0)
>>>
0 2000.0
1 2000.0
2 2000.0
3 2000.0
4 2000.0
...
119622 2022.0
119623 2022.0
119624 2022.0
119625 2022.0
119626 2022.0
Name: year, Length: 119627, dtype: float64
total[total['year'].isnull()]
๊ทธ๋ ๊ฒ ๋ฏธ์คํฐ๋ฆฌ๋ง ๋จ๊ฒจ๋์ ์ฑ ๋๋ 2๊ฐ์ ์ด์ ๋จ๊ตฌ๊ธฐ๋ก ๊ฒฐ์ ํ์๊ณ ๊ฒฐ๊ตญ ์ฑ๊ณตํ์๋ค!
total['year'].dropna()
>>>
0 2000.0
1 2000.0
2 2000.0
3 2000.0
4 2000.0
...
119622 2022.0
119623 2022.0
119624 2022.0
119625 2022.0
119626 2022.0
Name: year, Length: 119625, dtype: float64 **# ๊ทธ๋์ ์ด row์ ๊ฐ์๋ 119625๊ฐ!**
# inplace = True๋ฅผ ํตํด ์๊ตฌ์ ์ผ๋ก ๋ฐ๊ฟ์ฃผ์๋ค.
****total.dropna(inplace = True)
# int๋ก ํ๋ณํ ๋ค์ ์๋!!
total['year'] = total['year'].astype('int')
# ์ฑ๊ณต!!!
total['year']
>>>
0 2000
1 2000
2 2000
3 2000
4 2000
...
119622 2022
119623 2022
119624 2022
119625 2022
119626 2022
Name: year, Length: 119625, dtype: int64
# ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก month, hour column๋ ์ ์ฒ๋ฆฌ๋ฅผ ์งํํด์ฃผ์๋ค.
total['month'] = total['month'].astype('int')
total['hour'] = total['hour'].astype('int')
total.head()
์ถ๊ฐ๋ก pandas์์ ์ง์ํ๋ dt.day_name
ํจ์๋ฅผ ํตํด ๊ฐ ์ผ์๋ณ ๋ ์ง๋ฅผ ์ถ๊ฐํ์๋ค.
usa['day_name'] = usa['date_time'].dt.day_name()
usa['day_name']
day_name = usa.groupby('day_name').count()
๊ทธ ๋ค์ ๋ฌธ์ ๋ ๋ฐ๋ก ๋ถ์์ ์ค์ํ ๋ถ๋ถ์ ์ฐจ์งํ๊ฒ ๋ duration ์ด์๋ค.
๋๊ฐ ๋ด๋ duration์ด ๋ค์ญ๋ ์ญํ ๊ฒ์ด ๋ณด์ด๊ธฐ ๋๋ฌธ์
๊ณผ์ ์ ์ ์ด๋ณด์๋ฉด ๋์ถฉ ์ด๋ ๋ค.
str.contatins
ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์ โsecโ, โminโ, โhourโ ์ด ํฌํจ๋๋ ํ ์ถ์ถ
str.contatins
ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ถ์ถํ ํ์ pd.concatํจ์๋ฅผ ์ด์ฉํ์ฌ
๋ฐ์ดํฐ ํ๋ ์ ํ์ผ๋ก ํฉ์นจ
str.replace
ํจ์๋ฅผ ๋ณํํ๊ณ ์ถ์ ๋จ์ด๋ฅผ ๋ณํ
์์
์ '๋ชจ๋๋ฐ๊พธ๊ธฐ' ๊ธฐ๋ฅ ํตํด ๋ถ์์ ํ์ ์๋ ๋ฌธ์์ด 1์ฐจ ์ ๊ฑฐ
(์: each, approx, about ๋ฑ 35๊ฐ)
๊ทธ ์ค ์ฒ๋ฆฌ๋ถ๊ฐ์ธ 16๊ฐ ๋ฌธ์์ด ๋ฐ ํน์๊ธฐํธ๋ ์๋์ด ํฌ์ง ์์ drop ์ํด
(~, ?, +/ ๋ฑ)
๋จ๊ณ๋ณ๋ก ์ ์ฅ ๋ฐ ์ฝ๊ธฐ ์ค, ๋ฐ๋ฆฐ ์ ๋ค์ ์ ๋ฆฌ
์ ๊ณผ์ ํ ์ด ๋จ์๋ก ๋ํ๋ด๊ธฐ ์ํด 60์ ์ผ๊ด์ ์ผ๋ก ๊ณฑํ์๋ค.
๊ณ ๋์ ์ ์ฒ๋ฆฌ๋ฅผ ๋๋ธ ํ ์ต์ข ๊ฒฐ๊ณผ๋ฌผ์ ์ด๋ฌํ๋ค.
usa.info()
>>>
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 85506 entries, 0 to 85505
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date_time 85506 non-null datetime64[ns]
1 city 85506 non-null object
2 statecode 85506 non-null object
3 country 85506 non-null object
4 shape 85506 non-null object
5 summary 85506 non-null object
6 year 85506 non-null int64
7 month 85506 non-null int64
8 hour 85506 non-null int64
9 duration_sec 85506 non-null int64
10 day 85506 non-null int64
11 day_name 85506 non-null object
dtypes: datetime64[ns](1), int64(5), object(6)
memory usage: 7.8+ MB
๊ทธ๋ผ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ถ์์ ์์ํด๋ณด์
usa['year'].value_counts()
>>>
2014 7072
2012 6230
2013 6201
2015 5551
2016 5001
2020 4998
2019 4479
2011 4224
2017 4069
2008 3803
2009 3466
2010 3400
2007 3319
2004 3087
2005 3074
2003 2761
2006 2748
2018 2583
2002 2263
2001 2247
2000 2123
2021 1998
2022 809
Name: year, dtype: int64
# ์ฐ๋๋ณ UFO Sighting Counting with using Countplot
plt.figure(figsize = (16, 10))
sns.countplot(data = usa, x = 'year', palette = 'pastel')
**Insight**
- 2014๋
์ ๊ฐ์ฅ ๋ง์ด ๋ณด์๊ณ 2021๋
์ ๊ฐ์ฅ ์ ๊ฒ ๋ณด์๋ค
- 2022๋
(์ฌํด)์ ์์ง ๋ค ์ง๋์ง ์์์์ผ๋ก ๊ฐ์๊ฐ ๊ฐ์ฅ ์ ์ ์ ๋ฐ์ ์๋ค!
usa['month'].value_counts()
>>>
7 9877
8 8569
10 8512
9 8162
11 7403
6 6979
12 6394
5 6193
1 6175
4 6143
3 5883
2 5216
Name: month, dtype: int64
# ์๋ณ UFO Sighting Counting with using Countplot
plt.figure(figsize = (16, 10))
sns.countplot(data = usa, x = 'month', palette = 'Set1')
**Insight**
- 7์์ ๊ฐ์ฅ ๋ง์ด ๋ฐ๊ฒฌ๋์๊ณ 2์์ ๊ฐ์ฅ ์ ๊ฒ ๋ฐ๊ฒฌ๋์๋ค.
- Why? โ ์ฌ๋ฆ์ ๋ฐ์ ์์ฃผ ๋๊ฐ๊ณ ๊ฒจ์ธ์๋ ์ง์๋ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ์ดํฐ ์ถ์ฒ : ๊ธฐ์์ฒญ ์๋ฃ๊ฐ๋ฐฉํฌํธ
๊ธฐ์์๋ฃ๊ฐ๋ฐฉํฌํธ[๋ฐ์ดํฐ:๊ธฐ์๊ด์ธก:์ธ๊ณ๊ธฐ์์ ๋ฌธ(GTS):์ง์(SYNOP):์๋ฃ]
๋ฏธ๊ตญ UFO ๋ฐ๊ฒฌ ๊ฑด ์ TOP5 ์ฃผ ๊ธฐ์ ๋ฐ์ดํฐ
2000๋ ๋ถํฐ 2022๋ 6์๊น์ง
์ผ๋ณ ๊ธฐ์ ๋ฐ์ดํฐ(๊ธฐ์จ, ๊ฐ์๋, ํ์, ์ต๋, ๊ธฐ์)๋ฅผ ์๋ณ ํ๊ท ์ผ๋ก ๋ฐ์ดํฐ ์ ์
์๊ด๊ณ์๋ -1 ~ 1๊น์ง์ ๋ฒ์๋ฅผ ๊ฐ์ง๋ฉฐ 0.3 ๋ถํฐ ์๊ด๊ด๊ณ๊ฐ ์๋ค๊ณ ํ๋จํ๋ค.
๋ํ ๊ทธ ์ค์์ ๋๋ถ์ ์๋ถ์ ๋ํ์ ์ธ ์ฃผ๋ฅผ ํ๋์ฉ ๊ผฝ์ ๋ถ์ํด๋ณด์๋ค.
# ๋๋ถ: **๋ด์ ์ฃผ**
sns.heatmap(corr_NE,
cmap = 'RdYlBu_r',
annot = True, # ์ค์ ๊ฐ์ ํ์ํ๋ค
linewidths=.5, # ๊ฒฝ๊ณ๋ฉด ์ค์ ์ผ๋ก ๊ตฌ๋ถํ๊ธฐ
cbar_kws={"shrink": .5},# ์ปฌ๋ฌ๋ฐ ํฌ๊ธฐ ์ ๋ฐ์ผ๋ก ์ค์ด๊ธฐ
vmin = -1,vmax = 1 # ์ปฌ๋ฌ๋ฐ ๋ฒ์ -1 ~ 1
)
**Insight**
- ๋ด์์ ์๋ณ ํ๊ท ๊ธฐ์จ(temperature)๊ณผ ์๋ณ UFO๋ฅผ ๋ฐ๊ฒฌํ ๊ฑด์(count)์ ์๊ด๊ณ์๊ฐ
0.37๋ก ์ฝํ ์์ ์๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
# ์๋ถ: **์ผ๋ฆฌํฌ๋์ ์ฃผ**
sns.heatmap(corr_CA,
cmap = 'RdYlBu_r',
annot = True, # ์ค์ ๊ฐ์ ํ์ํ๋ค
linewidths=.5, # ๊ฒฝ๊ณ๋ฉด ์ค์ ์ผ๋ก ๊ตฌ๋ถํ๊ธฐ
cbar_kws={"shrink": .5},# ์ปฌ๋ฌ๋ฐ ํฌ๊ธฐ ์ ๋ฐ์ผ๋ก ์ค์ด๊ธฐ
vmin = -1,vmax = 1 # ์ปฌ๋ฌ๋ฐ ๋ฒ์ -1 ~ 1
)
**Insight**
- ์บ๋ฆฌํฌ๋์ ์ฃผ์ ์๋ณ ํ๊ท ๊ธฐ์จ(temperature)๊ณผ ์๋ณ UFO๋ฅผ ๋ฐ๊ฒฌํ ๊ฑด์(count)์
์๊ด๊ณ์๊ฐ 0.39๋ก ์ฝํ ์์ ์๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- ์๋ณ ํ์๊ณผ ์๋ณ UFO๋ฅผ ๋ฐ๊ฒฌํ ๊ฑด์์ ์๊ด๊ณ์๊ฐ -0.38๋ก ์ฝํ ์์ ์๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
usa['day'].value_counts()
>>>
4 3834
15 3797
1 3781
20 2873
5 2839
7 2818
10 2805
12 2795
19 2774
24 2768
14 2745
3 2745
18 2722
25 2722
8 2718
22 2716
16 2687
11 2684
13 2682
17 2677
6 2651
23 2643
28 2633
21 2555
27 2524
2 2522
9 2495
26 2479
30 2467
29 2411
31 1944
Name: day, dtype: int64
# ์ผ๋ณ UFO Sighting Counting with using Countplot
plt.figure(figsize = (16, 10))
sns.countplot(data = usa, x = 'day', palette = 'muted')
**Insight**
- 4์ผ, 15์ผ, 1์ผ ์์ผ๋ก ๋ง์ด ๋ณผ ์ ์๋ค.
usa['day_name'].value_counts()
>>>
Saturday 15945
Friday 12459
Sunday 12327
Thursday 11831
Wednesday 11536
Tuesday 10909
Monday 10499
Name: day_name, dtype: int64
# ์์ผ๋ณ UFO Sighting Counting wiht using Countplot
plt.figure(figsize = (16, 10))
sns.countplot(data = usa, x = 'day_name', palette = 'Paired')
**Insight**
- ํ ์์ผ์ด ๊ฐ์ฅ ๋ง๊ณ ์์์ผ์ด ๊ฐ์ฅ ์ ๋ค
usa['hour'].value_counts()
21 12970
22 11538
20 9877
23 7817
19 6722
18 4524
0 4511
1 2992
17 2747
5 2096
2 2085
3 1995
4 1693
16 1671
6 1661
15 1360
12 1270
10 1263
14 1244
11 1231
13 1158
9 1097
7 1055
8 929
Name: hour, dtype: int64
usa[(usa['hour'] > 6) & (usa['hour'] < 21)]
**Insight**
- ์ด 85,506 ๊ฑด ์ค 36,148๊ฑด์ ๋บ 49,358 ๊ฑด, ์ฝ 57%๊ฐ 21์์์ 5์๊น์ง ๋ฐ๊ฒฌ๋์๋ค.
# ์๊ฐ๋๋ณ UFO Sighting Counting with using Countplot
plt.figure(figsize = (16, 10))
sns.countplot(data = usa, x = 'hour')
**Insight**
- ์ฃผ๋ก 21์ ์ดํ๋ถํฐ 23์๊น์ง ๋ง์ด ๋ถํฌ๋์ด์์์ ๋ณผ ์ ์๋ค.
usa['statecode'].value_counts().head()
>>>
CA 10745
FL 5581
WA 4499
TX 3716
NY 3672
Name: statecode, dtype: int64
# State ๋ณ Counting with using Countplot
plt.figure(figsize = (16, 10))
sns.countplot(data = usa, x = 'statecode', palette = 'colorblind', order = usa['statecode'].value_counts().index)
**Insight**
- ์บ๋ฆฌํฌ๋์, ํ๋ก๋ฆฌ๋ค, ์์ฑํด, ํ
์ฌ์ค, ๋ด์ ์ฃผ ์์ผ๋ก ๋ง์ด ๋ณด์ธ ๊ฒ์ ์ ์ ์๋ค.
usa['shape'].value_counts().head()
>>>
Light 19163
Circle 9658
Triangle 8089
Fireball 6846
Sphere 6046
Name: shape, dtype: int64
# shape๋ณ UFO sighting Counting wiht using Countplot
plt.figure(figsize = (18, 12))
sns.countplot(data = usa, x = 'shape', palette = 'muted', order = usa['shape'].value_counts().index)
**Insight**
- ๋น ๋ชจ์, ์ ๋ชจ์, ์ผ๊ฐํ ๋ชจ์, ๋ถ๊ฝ๋ชจ์, ์ฐฝ ๋ชจ์ ์์ผ๋ก ๋ง์ด ๋ฐ๊ฒฌ๋์์์ ๋ณผ ์ ์๋ค.
์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๋ง๋ค์ด๋ณด๋ shape์ duration_sec์ ๊ฐ๋ค์ด ๋๋ฌด ๋ค์ํ์ฌ
๋ฐ๊ณผ ๊ฐ์ด boxplot์ด๋ violinplot์ผ๋ก ๋ถํฌ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ํ๋ค์๋ค.
๊ณ ๋ก, duration_sec์ ๋ฒ์๋ฅผ ์กฐ์ ํด์ค ํ์๊ฐ ์๋ค๊ณ ํ๋จํ๋ค.
๊ทธ๋ฆฌํ์ฌ ์์๋ก 120์ด ๋ฏธ๋ง์ผ๋ก ์ ํํด๋ดค๋ค.
under_2min = usa[usa['duration_sec'] < 120]
์ฑ๊ณต์ ์ผ๋ก ์ฌ์ ์ ํ ๋ค์ boxplot์ ๊ทธ๋ ค๋ณด์๋๋ฐ ์ฌ์ ํ ๋ถํฌ๋ฅผ ํฌ๊ฒ ๋ณด๊ธฐ ํ๋ค์๋ค.
ํ์ง๋ง ์ด๋ก์จ 60์ด ๋ฏธ๋ง์ ๊ฐ๋ค์ด ๋ง์ ๊ฒ์ ์ ์ ์์๋ค.
์ข ๋ ๋ถํฌ๋๋ฅผ ๋ณด๊ธฐ ์ฌ์ด violinplot์ผ๋ก๋ ๊ทธ๋ ค๋ณด์๋ค.
plt.figure(figsize = (18, 12))
sns.violinplot(data = under_2min, x = 'shape', y = 'duration_sec')
**Insight**
- 30์ด ๋ฏธ๋ง์ ์๊ฐ ์๋์ ์ผ๋ก ๋ง์ง๋ง 60์ด๋ ์๊ทผํ ๋ง์ ๊ฒ์ ๋ณผ ์ ์๋ค.
- Why? โ UFO ์์ฌ๋ฌผ์ฒด๋ ์์๊ฐ์ ์ง๋๊ฐ๊ธฐ ๋๋ฌธ์ ๋๋ต์ ์ธ ์๊ฐ์ 1๋ถ์ผ๋ก ๋ง์ด ๋ํ๋ธ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
์ด๋ฅผ ํ ๋๋ก duration_sec๋ฅผ 70์ด ๋ฏธ๋ง์ผ๋ก ์ ํํ๊ณ ๋ค์ Violinplot์ ๊ทธ๋ ค๋ณด์๋ค.
under_70sec = usa[usa['duration_sec'] < 70]
plt.figure(figsize = (18, 18))
sns.violinplot(data = under_70sec, x = 'shape', y = 'duration_sec')
โ ์ข ๋ ๋ณด๊ธฐ ์ฝ๊ฒ violinplot์ด ๊ทธ๋ ค์ง ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด์ 70์ด ๋ฏธ๋ง์์ ๊ฐ ์ด๋ง๋ค ์ฌ๋๋ค์ด ๋ณธ ํ์๋ ์ผ๋ง๋ ๋ ๊น?
plt.figure(figsize = (18, 12))
sns.countplot(data = under_70sec, y = 'duration_sec', palette = 'Set2',
order = under_70sec['duration_sec'].value_counts().index)
**Insight**
- ์ด๊ฒ์ผ๋ก๋ ์ฌ๋๋ค์ด 10 15 20 30 60์ด ๋ฑ ์ ํํ๋ ์๊ฐ ๊ฐ๋
์ ๋ฐ๋ผ ๋๋ตํ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๊ฒ์ ๋ณผ ์ ์๋ค.
- ๋น์ฐํ๊ฒ ์ง๋ง? ufo๋ฅผ ๋ณด์์ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์๊ฐ์ ์ฐ ์ฌ๋์ด ๊ฑฐ์ ์๋ค๋ ๊ฒ์ผ๋ก ์๊ฐํ๋ค.
๊ฐ ์ด๋ง๋ค ํด๋นํ๋ ๋น์ค์ด ์ด๋ป๊ฒ ๋๋์ง ๋ณด๊ธฐ ์ํ violinplot์ ๊ทธ๋ ค๋ณด์๋ค.
plt.figure(figsize = (8, 4))
sns.violinplot(data = under_70sec, x = 'duration_sec')
**Insight**
- ์ฝ 5์ด์ ๋๊ฐ ๊ฐ์ฅ ๋ง๊ณ 60์ด ์ ๋์๋ ๋ง์ ๊ฒ์ ๋ณผ ์ ์๋ค.
# ๋น ๋ชจ์์ ๋ํ summary๋ฅผ UFO ๋ชจ์์ผ๋ก wordclouding
lig_sum = usa[usa['shape'] == 'Light']['summary']
summ = lig_sum
mask = Image.open('/Users/sung/Downloads/ufo3.jpeg')
mask = np.array(mask)
wc = WordCloud(
background_color = 'white',
stopwords = stopwords,
mask = mask)
wc.generate(str(summ))
plt.figure(figsize = (8, 8))
plt.imshow(wc)
plt.axis('off')