고유한 순서나 계층 없이 그룹이나 레이블로 분류할 수 있는 데이터
TIP) 숫자가 고유한 순서나 순위가 없는 범주나 레이블을 나타내는 경우를 찾아보자
ex)
색상: 빨강, 파랑, 녹색, 노랑
성별: 남성, 여성, 논바이너리
요리의 종류: 이탈리아, 중국, 멕시코, 인도
pd.crosstab ( 변수1, 변수2, normalize=True or False) : normalize = 비율
숫자 값을 나타내는 데이터를 말하며, 순서를 지정하고 산술 연산을 수행할 수 있습니다.
세는게 의미 x = 수치데이터. 나이, 체중 등 숫자로 표현 가능한 데이터
연속 데이터와 불연속 데이터의 두 가지 하위 범주로 더 나눌 수 있습니다.
ex)
온도: 32.5°C, 21.4°C, -10.3°C
키: 175.3cm, 162.6cm, 190.8cm
시간: 3.2초, 15.8분, 12.6시간
ex)
한 반 학생 수: 25, 30, 40
나이: 20, 25, 30
판매 품목 수: 5, 10, 15
에러: Cannot convert non-finite values (NA or inf) to integer
deck 순서 있음
# 중간값으로 NaN 채워주자
titanic['age'] = titanic['age'].fillna(titanic['age'].median())
# 그리고 int로 변환
titanic['age'] = titanic['age'].astype(int)
df.컬럼명.value_counts() or df[‘컬럼명’].value_counts()
titanic.sex.value_counts()
titanic.survived.value_counts(normalize=True)
# 정규화 normalize=True를 하면 백분율로 나온다!
출발도시 n
fare age 빼고는 nominal.
사망자의 숫자가 중요할때는 바 그래프
사망자가 훨 많다라는걸 보여줄 때는 파이 그래프
sample링 시드를 같은걸 주면 랜덤하지 않게 추출 ㄱㄴ
df.sample(n=추출 개수,frac=추출 비율, replace=중복추출여부, random_state=랜덤시드, ignore_index=새로 인덱스 부여 여부)
특정 기준이나 구조 없이 모집단에서 개인을 무작위로 선택하는 것을 포함합니다.
모집단이 동질적이며 모든 개인이 선택될 기회가 동일하다고 가정합니다.
train_data, test_data = train_test_split(데이터, test_size=0.1, random_state=1, stratify=필드)
stratify 는 층화 샘플링에 사용할 데이터 세트의 열을 지정
- 왜?
- 모델은 새로운 데이터로 일반화하는 것이 아니라 훈련 데이터의 특정 패턴과 노이즈를 학습훈련하는것.
따라서 새로운 데이터에서는 제대로 수행되지 않을 수 있기 때문에 훈련 80퍼, 테스트 20퍼로 나누는 관례.
- 예제 문제 80 퍼 풀고 모의고사로 새로운 문제 실전감 익히는 느낌!
데이터 확대, 개인 정보 보호 데이터 공유, 테스트 및 검증 목적을 위한 합성 데이터 생성에 널리 사용
기술 통계 보기
quantile(0.99) 99 등의 것은 얼마냐
저기 오른쪽 아웃라이어가 아닌 젤 큰 값은
경계선 보다는 작으면서 제일 큰 값을 나타냄
titanic['embark_town'] = pd.Categorical(titanic.embark_town, categories=["Southampton", "Cherbourg"])
30 개 이하의 샘플 : st.t.interval(alpha=신뢰구간, df=샘플 갯수-1, loc=평균, scale=평균오차)
# t 분포 기반. 표본 크기가 작거나 모집단 표준 편차를 알 수 없는 경우에 적합
30 개 이상 : st.norm.interval(alpha=0.95, loc=np.mean(data), scale=st.sem(data))
import scipy.stats as st
import numpy as np
sample1=titanic.sample (n=30)
sample2=titanic.sample (frac=0.6)
print ("sample1:", np.mean(sample1.fare), st.t.interval(alpha=0.95, df=len(sample1)-1, loc=np.mean(sample1.fare), scale=st.sem(sample1.fare)))
print ("sample2:", np.mean(sample2.fare), st.norm.interval(alpha=0.95, loc=np.mean(sample2.fare), scale=st.sem(sample2.fare)))
print ("population:", np.mean(titanic.fare))
2개의 평균이 있을 때, 샘플에서는 평균이 차이가 나는데 실제 모집단에서도 차이가 날지 분석
가설 검정
예
- pvalue < 0.05 이면 영가설 기각 (아니면 영가설이 맞음)
st.ttest_1samp (sample2.fare, 20) # 샘플 집단의 배 삯 평균은 20 #모집단의 샘플2 평균이 20일 확률!
from scipy.stats import chisquare
chisquare ([10, 12, 13, 5])
# 결과값 pvalue=0.283이 나옴. 원래는 균등 분포인데, 샘플에서만 우연히 이렇게 차이나왔을 가능성 28%
# 샘플이 커지면
chisquare ([100, 120, 130, 50 ] )
# 결과값 pvalue=2.826e^-8 나옴. 원래는 균등 분포인데, 이렇게 큰 샘플에서 우연히 이렇게 차이가 많이 나게 나올 가능성 0.000002 % => 통계적으로 유의미한 차이를 보인다.
# 사용예시 그냥 돌리면됨.
num_class=sample2["class"].value_counts()
print (chisquare (num_class))
# 샘플의 개수가 커야 의미가 항상 있음.