Python
[데이터분석] 7. 1차원 데이터 분석
제이지연
2023. 6. 8. 23:46
In [2]:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib as plt
df = pd.read_csv("DataBreaches(2004-2021).csv", encoding='cp949')
df.head()
Out[2]:
Entity | Year | Records | Organization type | Method | |
---|---|---|---|---|---|
0 | 21st Century Oncology | 2016 | 2200000 | healthcare | hacked |
1 | 500px | 2020 | 14870304 | social networking | hacked |
2 | Accendo Insurance Co. | 2020 | 175350 | healthcare | poor security |
3 | Adobe Systems Incorporated | 2013 | 152000000 | tech | hacked |
4 | Adobe Inc. | 2019 | 7500000 | tech | poor security |
In [3]:
records = df['Records']
데이터 대푯값 지표¶
- 평균
- 중앙값
- 최빈값
평균값¶
- sum(전체/갯수)
- np.mean(--)
- df[].mean()
- 절사평균 : 평균 계산 시 일부 극단적인 값(아웃라이어 또는 극단치)를 제외하고 계산하는 방법
- 데이터의 극단적인 값이 평균에 미치는 영향을 완화
In [4]:
sum(records/len(df))
Out[4]:
45138367.95205479
In [11]:
np.mean(records)
Out[11]:
45138367.95205479
In [12]:
df['Records'].mean()
Out[12]:
45138367.95205479
중앙값
데이터를 크기 순서대로 나열할 때 정확히 중앙에 위치한 값
- 이상값에 영향을 덜 받음
- np.median()
In [5]:
records_11=df['Records'][:11]
records_11
Out[5]:
0 2200000
1 14870304
2 175350
3 152000000
4 7500000
5 4000000
6 75000
7 344579
8 320000000
9 20000
10 200000
Name: Records, dtype: int64
In [15]:
records_11=np.sort(records_11)
records_11
Out[15]:
array([ 20000, 75000, 175350, 200000, 344579, 2200000,
4000000, 7500000, 14870304, 152000000, 320000000], dtype=int64)
In [16]:
np.mean(records_11)
Out[16]:
45580475.72727273
In [17]:
np.median(records_11)
Out[17]:
2200000.0
최빈값
데이터에서 가장 많이 나타나는 값
- df.mode()
In [6]:
df['Year'].mode()
Out[6]:
0 2011
Name: Year, dtype: int64
In [10]:
#plt.figure()
sns.countplot(x=df['Year'],data=df)
Out[10]:
<Axes: xlabel='Year', ylabel='count'>
In [27]:
df['Records'].mode()
Out[27]:
0 1500000
Name: Records, dtype: int64
In [28]:
sns.histplot(df['Records'],bins=20)
Out[28]:
<AxesSubplot:xlabel='Records', ylabel='Count'>
데이터의 산포도 지표 - 분산, 표준편차, IQR¶
- 편차 : 각 데이터가 평균으로부터 떨어져 있는 정도
- 분산 : 산포도의 지표인 편차의 평균은 항상 0
- 모분산 : 모집단 전체의 데이터에 대한 분산
- 불편분산 : 표본 데이터에 대한 분산. 표본의 평균과 각 데이터 포인트 간의 차이를 제곱한 값의 평균으로 계산
- 표본분산 : 불편분산과 유사하지만, 표본의 크기에 대한 보정이 없는 추정치
- 표본 크기가 작을 경우 표본분산은 모분산의 추정치로서 부정확할 수 있다.
- 표준편차 : 분산에 제곱근을 취한 것
편차¶
- 편차 = 데이터 - 평균
In [32]:
mean = np.mean(records_11)
deviation = records_11 - mean
deviation
Out[32]:
array([-4.55604757e+07, -4.55054757e+07, -4.54051257e+07, -4.53804757e+07,
-4.52358967e+07, -4.33804757e+07, -4.15804757e+07, -3.80804757e+07,
-3.07101717e+07, 1.06419524e+08, 2.74419524e+08])
분산¶
- np.var()
In [33]:
np.mean(df['Year'])
Out[33]:
2013.599315068493
In [34]:
df['Year'].min()
Out[34]:
2004
In [35]:
df['Year'].max()
Out[35]:
2021
In [36]:
df['Year'].mode()
Out[36]:
0 2011
Name: Year, dtype: int64
In [37]:
df['Year'].median()
Out[37]:
2013.0
In [38]:
np.var(df['Year'])
Out[38]:
18.911369393882396
분산을 면적으로 이해 : 편차 제곱은 한 변의 길이가 편차인 정사각형의 면적으로 간주하면, 분산은 면적의 평균(편차^2/n-1)¶
표준편차¶
- np.sqrt(np.var()) : 분산을 제곱근한 것
- np.std()
In [39]:
np.sqrt(np.var(df['Records']))
Out[39]:
196599561.65935665
In [40]:
np.mean(df['Year'])
Out[40]:
2013.599315068493
In [41]:
df['Year'].min()
Out[41]:
2004
In [42]:
df['Year'].max()
Out[42]:
2021
In [43]:
df['Year'].mode()
Out[43]:
0 2011
Name: Year, dtype: int64
In [44]:
df['Year'].median()
Out[44]:
2013.0
In [45]:
np.std(df['Year'])
Out[45]:
4.348720431791678
표준편차와 6시그마¶
- 시그마 구간 : 평균 주위의 구간
- 데이터의 변동성을 고려하여 평균 주위에 얼마나 많은 데이터가 포함되는지를 알려준다.
In [46]:
np.mean(df['Records'])+3*np.std(df['Records'])
Out[46]:
634937052.9301248
In [47]:
len(df[df['Records']>np.mean(df['Records'])+3*np.std(df['Records'])])
Out[47]:
2
In [48]:
len(df[df['Records']>np.mean(df['Records'])-3*np.std(df['Records'])])
Out[48]:
292
데이터의 표준화¶
- 표준점수
- 상대적 결과가 다르므로 통일된 지표로 변환하는 표준화
- 데이터에서 평균을 빼고 표준편차로 나누는 작업
- 표준화된 데이터는 표준화 변량 혹은 Z 점수라고 함.
- 표준화된 데이터는 평균이 0, 표준편차가 1
- x-평균/표준편차
- 표준화는 평균과 표준편차를 조절해서 볼 수 있다.
1차원 데이터의 도수분포표¶
- 데이터의 분포 상태를 세부적으로 알고 싶을 때, 데이터가 취하는 값을 몇 개의 구간으로 나누고, 각 구간에 몇 개의 데이터가 들어가는지를 세는 방법
- 분할된 구간과 데이터의 갯수를 정리한 표가 도수분포표
- 계급 : 구간
- 도수 : 각 계급에 속한 학생 수
- 계급 폭 : 각 구간의 폭
- 계급값 : 각 계급을 대표하는 값으로, 계급의 중앙값을 이용
- 상대도수 : 전체 데이터에 대해서 해당 계급의 데이터가 차지하는 비율
- 누적 상대도수 : 해당 계급까지의 상대 도수의 합
- np.cumsum() : 주어진 배열의 누적 합을 계산
In [11]:
np.histogram(df['Year'], bins=9, range=(2004, 2022))
Out[11]:
(array([ 7, 18, 29, 52, 48, 36, 23, 47, 32], dtype=int64),
array([2004., 2006., 2008., 2010., 2012., 2014., 2016., 2018., 2020.,
2022.]))
In [25]:
freq,_=np.histogram(df['Year'], bins=9, range=(2004,2022))
In [26]:
freq_class=[f'{i}~{i+1}' for i in range(2004,2022,2)]
freq_class
Out[26]:
['2004~2005',
'2006~2007',
'2008~2009',
'2010~2011',
'2012~2013',
'2014~2015',
'2016~2017',
'2018~2019',
'2020~2021']
In [27]:
freq_dist_df = pd.DataFrame({'frequency':freq},index=pd.Index(freq_class,name='class'))
freq_dist_df
Out[27]:
frequency | |
---|---|
class | |
2004~2005 | 7 |
2006~2007 | 18 |
2008~2009 | 29 |
2010~2011 | 52 |
2012~2013 | 48 |
2014~2015 | 36 |
2016~2017 | 23 |
2018~2019 | 47 |
2020~2021 | 32 |
In [28]:
# 상대도수
rel_freq = freq/freq.sum()
rel_freq
Out[28]:
array([0.0239726 , 0.06164384, 0.09931507, 0.17808219, 0.16438356,
0.12328767, 0.07876712, 0.1609589 , 0.10958904])
In [29]:
#누적 상대도수
cum_rel_freq=np.cumsum(rel_freq)
cum_rel_freq
Out[29]:
array([0.0239726 , 0.08561644, 0.18493151, 0.3630137 , 0.52739726,
0.65068493, 0.72945205, 0.89041096, 1. ])
In [30]:
from IPython.core.display import display, HTML
display(HTML("<style>.container { width:90% !important; }</style>"))
#창 맞추기위함
C:\Users\shinjy\AppData\Local\Temp\ipykernel_25488\2516566662.py:1: DeprecationWarning: Importing display from IPython.core.display is deprecated since IPython 7.14, please import from IPython display
from IPython.core.display import display, HTML