도찐개찐
[데이터 분석] 01. 통계와 데이터 본문
통계
- 분석하고자 하는 집단과 관련해 조사나 실험의 결과로 얻는 자료 또는 이의 요약된 형태를 의미
- 통계학 : 좀더 효과적인 의사결정을 할 수 있도록 수치자료를 수집,정리,표현,분석하는 학문
- 통계는 항상 반례 가능성을 가지고 있음
- 관련 통계 분야 : 사회과학통계, 자연과학통계, 수학학통계
통계학의 유형
1. 기술통계학
- 자료중심 통계
- 수집한 데이터를 요약, 묘사, 설명하는 통계기법
- 그래프,표,수치를 이용해서 집단의 특성 파악
- 예) 대표값, 분산
2. 추론통계학
- 예측 중심 통계 (중요도높음)
- 수집된 데이터를 바탕으로 예측하는 통계기법
- 관측된 자료를 이용해서 모집단 특성 추측
- 모수통계
- 빈도분석
- 상관분석 ✩✩✩✩✩
- 세 집단이상 평균분석
- 회귀분석(!!!) ✩✩✩✩✩
- 비모수통계
- 적합도검증
- 변수간 상관분석
- 모수통계
자료의 종류
1. 질적자료
- 문자로 표현된 자료
- 명목자료 : 일반적인 범주형 데이터
ex) 남,여 - 순서자료 : 순서의 의미가 포함된 데이터
ex) 초등학교,중학교,고등학교,대학교
- 명목자료 : 일반적인 범주형 데이터
2. 양적자료
- 숫자로 표현된 자료
- 이산형 : 셈이 가능한 양적자료, 정수형데이터
- 연속형 : 셈이 불가능한 양적자료, 실수형 데이터
- 구간자료 : 양적자료를 구간별로 나누어 명목/순서의 의미를 포함시킨 데이터
ex) 수,우,미,양,가 - 비율자료 : 양적자료를 구간별로 나누어 서열/비율(산술)의 의미를 포함시킨 데이터
ex) 몸무게, 시간, 키
- 구간자료 : 양적자료를 구간별로 나누어 명목/순서의 의미를 포함시킨 데이터
데이터를 이해하는 마음가짐
- 데이터가 숲이라고 가정한다면
- 처음부터 숲의 나무를 보고 자세히 관찰한다기 보다는
- 개략적으로 숲의 모양을 보고 특징을 파악하고 나무를 관찰할 것!
- 데이터도 이런식의 접근방식을 사용해야 함
- 데이터의 특징이란
- 말로 표현하기 보다는 숫자로 표현하여야 하고
- 주로 평균,편차 등등을 활용하는데
- 이렇게 숫자로 데이터의 특징을 표현하는 과정을
요약summary
이라함
- 데이터 분석 순서
- 데이터를 처음 만나면
- 요약을 먼저하고 데이터의 특징을 파악해서
- 어떤 차이가 있는지 파악해서
- 데이터 분석방향을 설정할 것!
자료의 종류
- 질적자료 : 문자로 표현된 자료
- 명목자료 : 일반적인 범주형 데이터
ex) 남,여 - 순서자료 : 순서의 의미가 포함된 데이터
ex) 초등학교,중학교,고등학교,대학교 - 구간자료 : 양적자료를 구간별로 나누어 명목/순서의 의미를 포함시킨 데이터
ex) 수,우,미,양,가 - 비율자료 : 양적자료를 구간별로 나누어 서열/비율(산술)의 의미를 포함시킨 데이터
ex) 몸무게, 시간, 키
- 명목자료 : 일반적인 범주형 데이터
- 양적자료 : 숫자로 표현된 자료
- 이산형 : 셈이 가능한 양적자료, 정수형데이터
- 연속형 : 셈이 불가능한 양적자료, 실수형 데이터
기술통계 분석관점
1. 중심화경향
- 수집한 자료 전체를 대표하는 값이 무엇인지 나타내는 통계 (대표값)
- 평균 : 자료를 모두 더해서 전체 자료의 갯수로 나눈 값 (정량적 자료의 대표값)
- 중앙값 : 자료를 크기 순으로 정렬했을 때, 중앙에 위치하는 값 (순서자료의 대표값)
- 최빈값 : 수집한 데이터 중 그 빈도가 가장 많이 나타나는 데이터 (명목자료의 대표값)
2. 분산경향
- 데이터가 어떻게 분포되어 있는지 설명하는 통계치 범위
- 사분위수
- 분산
- 표준편차
# !pip3 install pandas numpy scipy
!conda install -y pandas numpy scipy
Collecting package metadata (current_repodata.json): done
Solving environment: done
## Package Plan ##
environment location: /opt/miniconda3
added / updated specs:
- numpy
- pandas
- scipy
The following packages will be downloaded:
package | build
---------------------------|-----------------
blas-1.0 | mkl 6 KB
bottleneck-1.3.5 | py39h7deecbd_0 115 KB
fftw-3.3.9 | h27cfd23_1 2.3 MB
intel-openmp-2021.4.0 | h06a4308_3561 4.2 MB
libgfortran-ng-11.2.0 | h00389a5_1 20 KB
libgfortran5-11.2.0 | h1234567_1 2.0 MB
mkl-2021.4.0 | h06a4308_640 142.6 MB
mkl-service-2.4.0 | py39h7f8727e_0 59 KB
mkl_fft-1.3.1 | py39hd3c417c_0 182 KB
mkl_random-1.2.2 | py39h51133e4_0 309 KB
numexpr-2.8.3 | py39h807cd23_0 124 KB
numpy-1.23.3 | py39h14f4228_1 10 KB
numpy-base-1.23.3 | py39h31eccc5_1 6.6 MB
pandas-1.4.4 | py39h6a678d5_0 9.8 MB
scipy-1.9.3 | py39h14f4228_0 22.2 MB
------------------------------------------------------------
Total: 190.7 MB
The following NEW packages will be INSTALLED:
blas pkgs/main/linux-64::blas-1.0-mkl None
bottleneck pkgs/main/linux-64::bottleneck-1.3.5-py39h7deecbd_0 None
fftw pkgs/main/linux-64::fftw-3.3.9-h27cfd23_1 None
intel-openmp pkgs/main/linux-64::intel-openmp-2021.4.0-h06a4308_3561 None
libgfortran-ng pkgs/main/linux-64::libgfortran-ng-11.2.0-h00389a5_1 None
libgfortran5 pkgs/main/linux-64::libgfortran5-11.2.0-h1234567_1 None
mkl pkgs/main/linux-64::mkl-2021.4.0-h06a4308_640 None
mkl-service pkgs/main/linux-64::mkl-service-2.4.0-py39h7f8727e_0 None
mkl_fft pkgs/main/linux-64::mkl_fft-1.3.1-py39hd3c417c_0 None
mkl_random pkgs/main/linux-64::mkl_random-1.2.2-py39h51133e4_0 None
numexpr pkgs/main/linux-64::numexpr-2.8.3-py39h807cd23_0 None
numpy pkgs/main/linux-64::numpy-1.23.3-py39h14f4228_1 None
numpy-base pkgs/main/linux-64::numpy-base-1.23.3-py39h31eccc5_1 None
pandas pkgs/main/linux-64::pandas-1.4.4-py39h6a678d5_0 None
scipy pkgs/main/linux-64::scipy-1.9.3-py39h14f4228_0 None
The following packages will be UPDATED:
ca-certificates conda-forge::ca-certificates-2022.9.2~ --> pkgs/main::ca-certificates-2022.10.11-h06a4308_0 None
The following packages will be SUPERSEDED by a higher-priority channel:
certifi conda-forge/noarch::certifi-2022.9.24~ --> pkgs/main/linux-64::certifi-2022.9.24-py39h06a4308_0 None
conda conda-forge::conda-22.9.0-py39hf3d152~ --> pkgs/main::conda-22.9.0-py39h06a4308_0 None
Downloading and Extracting Packages
libgfortran-ng-11.2. | 20 KB | ##################################### | 100%
mkl_fft-1.3.1 | 182 KB | ##################################### | 100%
scipy-1.9.3 | 22.2 MB | ##################################### | 100%
mkl_random-1.2.2 | 309 KB | ##################################### | 100%
pandas-1.4.4 | 9.8 MB | ##################################### | 100%
fftw-3.3.9 | 2.3 MB | ##################################### | 100%
blas-1.0 | 6 KB | ##################################### | 100%
libgfortran5-11.2.0 | 2.0 MB | ##################################### | 100%
mkl-service-2.4.0 | 59 KB | ##################################### | 100%
numpy-base-1.23.3 | 6.6 MB | ##################################### | 100%
numpy-1.23.3 | 10 KB | ##################################### | 100%
numexpr-2.8.3 | 124 KB | ##################################### | 100%
mkl-2021.4.0 | 142.6 MB | ##################################### | 100%
bottleneck-1.3.5 | 115 KB | ##################################### | 100%
intel-openmp-2021.4. | 4.2 MB | ##################################### | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
Retrieving notices: ...working... done
import numpy as np
import pandas as pd
import scipy.stats as sp
대표값
평균 : 중심 척도의 대표적인 통계값
- 평균은 유일하다
- 평균은 계산하기 쉽다
- 모든 측정값을 반영한다
- 단, 평균은 특이값(이상치)에 영향을 받는다
$ \bar x = {1 \over n} \sum x_i $
# numpy의 mean 함수 사용
nums1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,]
mean1 = sum(nums1) / len(nums1)
mean2 = np.mean(nums1)
print(mean1)
print(mean2)
5.5
5.5
# 조선조왕들의 평균 수명 조사
kings = [73,62,45,53,38,16,51,28,37,30,56,30,33,56,
66,54,40,33,59,36,82,48,44,22,32,67,52,]
print(len(kings))
mean = np.mean(kings)
print(mean)
27
46.03703703703704
# 대학원생의 평균 나이 조사
studs = [19,18,19,21,20,24,19,19,20,18,21,22,23,21,19,18,22,24,21,18,19,]
print(len(studs))
mean = np.mean(studs)
print(mean)
21
20.238095238095237
중앙값median
- 자료를 오름차순으로 나열한 후 가장 가운데 놓인 수
- 특이값의 영향을 받는 평균을 보완한 수치
- 자료 갯수가 짝수인 경우와 홀수인 경우 계산하는 방법이 다름
- 데이터의 개수 $n$이 홀수라면, $\frac{(n+1)}{2} $번째 데이터가 중앙값
- 데이터의 개수 $n$이 짝수라면, $\frac{n}{2}$번째 데이터와 $\frac{n}{2} + 1$번째 데이터의 평균이 중앙값
## 자료의 갯수가 홀수 일때의 중앙 값
nums2 = [1,2,3,4,5,6,7,8,9,]
pos = int((len(nums2) + 1) / 2) - 1
print(nums2[pos])
5
nums3 = [1,2,3,4,5,6,7,8,9,10,]
pos = int((len(nums3) + 1) / 2) - 1
print((nums3[pos] + nums3[pos + 1]) / 2)
5.5
# numby의 median함수 사용
print(np.median(nums2))
print(np.median(nums3))
5.0
5.5
# 조선조 왕들의 수명의 중앙값 조사
# 단, 정렬시 sorted(대상) 함수 사용
kings2 = sorted(kings)
print(np.median(kings2))
# kings.sort()
kings2_size = len(kings2)
pos = int((kings2_size + 1) / 2) - 1
if not kings2_size % 2:
print((kings2[pos] + kings2[pos + 1]) / 2)
else:
print(kings2[pos])
45.0
45
# 대학원생의 나이의 중앙값 조사
studs.sort()
print(np.median(studs))
20.0
사원들의 연봉의 평균, 중앙값
# pd.read_csv(대상, 인코딩, 헤더여부, 구분자)
emps = pd.read_csv('../data/employees.csv')
# pandas 객체에서 특정 컬럼을 지정하려면 : 객체명.컬럼명, 객체명['컬럼명']
emps_sal = list(emps['SALARY'])
emps_sal.sort()
print(np.mean(emps_sal))
print(np.median(emps_sal))
6461.8317757009345
6200.0
print(np.round(np.mean(emps['SALARY']), 2))
print(np.median(emps['SALARY']))
6461.83
6200.0
a = [86, 67, 91, 80, 78, 93, 69, 0]
b = [63, 54, 80, 91, 78, 86, 30, 93]
c = pd.Series(a)
d = pd.Series(b)
c, d
(0 86
1 67
2 91
3 80
4 78
5 93
6 69
7 0
dtype: int64,
0 63
1 54
2 80
3 91
4 78
5 86
6 30
7 93
dtype: int64)
# 2차원 배열인 데이터프레인 객체 생성
# DataFrame(dict구조) : 열 우선
sj = pd.DataFrame({'A반':a, 'B반':b})
print(np.mean(sj.A반), np.mean(sj.B반))
print(np.median(sj.A반), np.median(sj.B반))
print(sj.mean(), sj.median)
70.5 71.875
79.0 79.0
A반 70.500
B반 71.875
dtype: float64 <bound method NDFrame._add_numeric_operations.<locals>.median of A반 B반
0 86 63
1 67 54
2 91 80
3 80 91
4 78 78
5 93 86
6 69 30
7 0 93>
# 2차원배열인 데이터프레임 객체 생성
# DataFrame(data=배열구조, columns=컬럼명)
sj = pd.DataFrame(zip(a, b), columns=['A반', 'B반'])
sj
# sj = pd.DataFrame(data=np.array([a,b]), index=range(0, 8), columns=['A반', 'B반'])
# sj
A반 | B반 | |
---|---|---|
0 | 86 | 63 |
1 | 67 | 54 |
2 | 91 | 80 |
3 | 80 | 91 |
4 | 78 | 78 |
5 | 93 | 86 |
6 | 69 | 30 |
7 | 0 | 93 |
최빈값
- 데이터들 중에서 빈도수가 가장 큰 값
- 두번 이상 발생하는 자료 중에서 자주 나타나는 자료값
- 극단값에 전혀 영향을 받지 않음
- 존재하지 않거나 여러개 존재할 수 있음
# 조선조 왕들의 수명의 최빈값 조사
kings = [73,62,45,53,38,16,51,28,37,30,56,30,33,56,
66,54,40,33,59,36,82,48,44,22,32,67,52,]
mode = sp.mode(kings, keepdims=False)
print(mode.mode, mode.count)
kings_list = dict()
for king_age in kings:
if not kings_list.get(king_age) : kings_list[king_age] = []
kings_list[king_age].append(1)
kings_list = {k: len(v) for k, v in kings_list.items()}
max(kings_list, key=kings_list.get)
# max(kings_list, key=)
# max(, key=len)
30 2
30
# Pandas Series 객체의 mode
pd.Series(kings).mode()
0 30
1 33
2 56
dtype: int64
# DataFrame 객체의 value_counts 함수 사용
pd.DataFrame(kings).value_counts().head()
30 2
33 2
56 2
16 1
51 1
dtype: int64
# 대학원생들 나이의 최빈값 조사
studs = [19,18,19,21,20,24,19,19,20,18,21,22,23,21,19,18,22,24,21,18,19,]
s_mode = sp.mode(studs, keepdims=False)
print(s_mode)
print(pd.DataFrame(studs).mode())
print(pd.DataFrame(studs).value_counts())#.head(7))
ModeResult(mode=19, count=6)
0
0 19
19 6
18 4
21 4
20 2
22 2
24 2
23 1
dtype: int64
# 사원들의 직책, 부서번호 최빈값
emp_job = pd.DataFrame(emps.JOB_ID)
print(emp_job.value_counts().head(1))
print(emp_job.mode())
JOB_ID
SA_REP 30
dtype: int64
JOB_ID
0 SA_REP
# 교통사고 현황 데이터 기술 통계1
car = pd.read_csv('../data/car_accient2016.csv')
car_df = pd.DataFrame(car[['주야', '요일', '발생지시도', '발생지시군구', '사고유형_대분류', '법규위반_대분류', '도로형태_대분류']])
car_df.groupby(['발생지시군구'])['사고유형_대분류'].value_counts().head(50)
발생지시군구 사고유형_대분류
가평군 차대차 6
차량단독 6
차대사람 3
강남구 차대차 8
차대사람 3
차량단독 1
강동구 차대사람 11
차대차 4
차량단독 2
강릉시 차대사람 8
차대차 6
차량단독 5
강북구 차대사람 8
차대차 5
차량단독 2
강서구 차대사람 12
차대차 12
차량단독 4
강진군 차대차 5
차대사람 2
차량단독 2
강화군 차대차 7
차대사람 6
차량단독 1
거제시 차대차 11
차대사람 9
차량단독 6
거창군 차대차 8
차대사람 2
차량단독 2
경산시 차대사람 13
차대차 10
차량단독 6
경주시 차대차 28
차대사람 23
차량단독 6
계양구 차대사람 7
차대차 1
차량단독 1
고령군 차대차 4
차대사람 3
차량단독 2
고성군 차량단독 10
차대사람 9
차대차 7
고양시 차대차 22
차대사람 19
차량단독 9
고창군 차대사람 7
차대차 7
Name: 사고유형_대분류, dtype: int64
728x90
'PYTHON > 데이터분석' 카테고리의 다른 글
[데이터분석] 03. 데이터 시각화 (0) | 2023.01.02 |
---|---|
[데이터분석] 02. 통계와 데이터 (0) | 2023.01.02 |
[Python] 선형회귀 (2) | 2022.12.26 |
인공지능 개념 (0) | 2022.12.26 |
[Python] folium(지도시각화) (0) | 2022.12.26 |
Comments