도찐개찐

[데이터 분석] 01. 통계와 데이터 본문

PYTHON/데이터분석

[데이터 분석] 01. 통계와 데이터

도개진 2023. 1. 2. 12:14

통계

  • 분석하고자 하는 집단과 관련해 조사나 실험의 결과로 얻는 자료 또는 이의 요약된 형태를 의미
  • 통계학 : 좀더 효과적인 의사결정을 할 수 있도록 수치자료를 수집,정리,표현,분석하는 학문
  • 통계는 항상 반례 가능성을 가지고 있음
  • 관련 통계 분야 : 사회과학통계, 자연과학통계, 수학학통계

통계학의 유형

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