데이터 분석 트랙 34일차 (25.03.31.) TIL
- 통계학 기초 1강 개인 정리
- 파이썬 <문법> 종합 : 부가기능들
- 통계학 기초 1강 개인정리
1. 기술통계 vs 추론통계
1.1. 기술 통계
- 정의 : 데이터를 요약하고 설명하는 통계의 방식
- 자주 사용되는 통계 값
A. "평균"(Mean) : 산술적 대표값(중간)
B. "중앙값"(Median) : 실제 데이터 상의 대표값 데이터 값(중간)
C. "분산"(Variance) : 평균과 데이터들 사이의 흩어진 정도 [분산의 값이 클수록 흩어진 정도가 크다]
# sum((데이터 값1-평균)**2)/len(데이터의 수)
D. "표준편차"(Standard Deviation) : 평균과 데이터들 사이의 흩어진 정도 [데이터의 변동성! 원래 데이터 값과 동일 단위]
1.2. 추론 통계
- 정의 : 표본을 통한 모집단의 "특성 추정", "가설 검정"
- 주로 사용되는 용어
A. 신뢰구간(Confidence Interval)
- 정의 : 모집단의 평균이 특정 범위 내에 있을 것이라는 확률을 의미! # 이 구간 내에 대부분의 값들이 위치한다!
- 일반적으로 95% 신뢰구간이 사용된다.
B. 가설 검정(Hypothesis Testing)
- 정의 : 모집단에 대한 가설을 검증하기 위해 사용
- 흔히 사용되는 가설 검정 방식
B.a. 귀무가설(H0) : 검증하고자 하는 내용이 틀렸음을 나타내는 가설 ("~~는 변화가 없을 것이다.")
cf) p-value : 관찰된 데이터가 귀무가설과 양립하는 정도를 0에서 1 사이의 수치로 표현한 것.
# 작을수록 그 정도가 약하다! 특정 값(0.05 혹은 0.01등등) 보다 작을 경우 귀무가설을 기각하는 것이 관례이지만 여러 문제가 있다. 출처) Wikipedia - "유의 확률"
B.b. 대립가설(H1) : 가설로 주장하고자 하는 바를 증명해낸다 ("~~는 변화한다")
2. 기초적인 통계 분석 방법
2.1. 위치 추정 : 데이터의 중심을 확인하는 방법
- Numpy 라이브러리를 활용한 mean()함수와 median()함수를 주로 사용.
2.2. 변이 추정 : 데이터들이 서로 얼마나 다른지 확인하는 방법 # 변동성확인!
- Numpy 라이브러리의 "var()"[분산함수], "std()"[표준편차함수], "max()-min()"[범위(range)] 등을 주로 사용.
2.3. 데이터 분포 탐색 : 데이터 값들의 대략적인 형세를 확인
a. 히스토그램 : "수치데이터"에서 데이터 값을 임의의 범위로 나눈 뒤 그 범위에 해당하는 값이 몇 개 있는지 확인!
# plt.hist(나타낼 값이 담긴 변수, bins=범위로 나눌 개수)
b. 상자 그림 : 데이터 분포를 시각적으로 표현하는 대표적인 방법으로 박스의 각 끝은 75, 25분위의 값이며 박스 내에 그어진 선은 중앙값(median)을 의미한다.
# plt.boxplot(나타낼 값이 담긴 변수)
2.4. 이진 데이터와 범주 데이터의 탐색
- "수치형 + 범주형 데이터" 혹은 "범주형 데이터"로 구성된 데이터들이 서로 얼마나 다른지 확인하는 방법
- 주로 자주 등장한 데이터값(최빈값) 혹은 그 값의 개수로 사용되며 "파이차트", "막대그래프"로 표현된다.
2.5. 상관관계
- 두 변수간의 관계를 측정하는 방법으로 -1 혹은 1에 가까울수록 강한 상관관계가 있다.
- 흔히 -0.7~-1, 0.7~1까지를 "강한 상관관계", -0.5 혹은 0.5를 "중간 정도의 상관관계", -0.3, 0.3을 "미미한 상관관계", 0은 "무관한 관계"로 고려한다.
- "plt.scatter()"함수와 같은 산점도 그래프를 주로 사용한다.
cf) 상관관계 산점도 제작시 등장하는 np.corrcoef()함수 뒤에 붙는 [0,1]의 의미
A = [값1, 값2, 값3, .....]
B = [값a, 값b, 값c, .....]
C = np np.corrcoef(A, B)[0,1]
# 변수 C에 A와 B의 상관관계를 계산하는 np의 라이브러리 함수를 사용하고 그 값 중에서 0행1열의 값을 가져오겠다.
# 즉, "A와 B의 상관관계"에 해당하는 '상관계수'의 값을 C에 담는다는 뜻 [0,0], [1,1]은 자기 자신과의 관계를 의미하는 상관계수 값이기에 사용하지 않는다.
cf) 인과관계 vs 상관관계 : 상관관계는 두 변수 간에 어떠한 관계, 연관성이 있다는 것을 의미한다. 하지만 인과관계는" X라는 변수가 Y라는 변수를 변화"시키는 명확한 의미관계를 갖는다. Y가 X를 변화시키는 지에 대해서는 의미범위를 벗어나기에 명확한 인과를 말할 수 없다. 즉, X이면 Y라고 말할 수 있지만 Y이면 X라고 말할 수 없는 관계인 것!
# 법칙 수준의 강력한 의미관계이지만 그것을 증명하기 위해선 엄밀하고 까다로운 조건을 거쳐서 증명해야한다!
2.6. 두 개 이상의 변수 탐색
- "다변량 분석" : 여러 변수 간의 관계를 분석하는 방법 # 3개 이상의 변수의 관계를 분석하는 방법!
- 흔히 seaborn 라이브러리의 "sns.pairplot(파악 대상이 담긴 변수)"함수, pandas 라이브러리의 "파악대상.corr()"함수[상관관계 연산 함수]를 사용하여 나타내며 "sns.heatmap(파악대상.corr())"를 사용해 히트맵으로 그릴 수 있다.
- 파이썬 <문법> 종합 : 부가기능들
1. 파일 불러오기
1.1. 파일 확장자 : CSV(.csv), Excel(.xls | .xlsx), Json(.json), 텍스트 파일(.txt | .dat)
1.2. 파일 불러오기 : pandas 라이브러리의 "read_확장자명('파일명.확장자')"함수를 사용!
ex.
# 만일 구글 코랩 사용시 from google.colab import drive
drive.mount('/content/drive')
# 를 사용하여 파일을 드라이브 한 뒤 파일 경로를 사용 아래의 판다스 라이브러리 함수를 이용하여 파일을 불러온다.
import pandas as pd
df = pd.read_csv('파일명.csv')
pd.read_excel('파일명.xlsx')
pd.read_json('파일명.json')
pd.read_csv('파일명.csv')
1.3. 파일 저장하기 : ".to_확장자()"를 사용하여 파일을 저장한다. 이때 "CSV와 Excel", "json", "텍스트파일"의 저장 형식이 다르다.
ex 1) CSV, Excel로 저장
df = pd.DataFrame(데이터 프레임으로 저장할 데이터)
csv_file_path = '/content/저장할 파일 경로/저장할 파일명.csv'
혹은
excel_file_path = '/content/저장할 파일 경로/저장할 파일명.xlsx'
df.to_csv(csv_file_path, index=False)
혹은
df.to_excel(escel_file_path, index=False)
cf) "index=False"를 하는 이유는 파일을 저장할 때 별도의 인덱스를 저장하지 않겠다는 의미 True로 할 시 파일을 불러올 때 쓸모없는 index가 늘어난다. 파일을 불러올 때 별도로 처리하는 방법도 있다.
ex 2) JSON파일
data = {키와 벨류의 딕셔너리}
json_file_path = '/content/sample_data/data.json'
with open(json_file_path, 'w') as jsonfile:
json.dump(data, jsonfile, indent=4)
ex 3) 텍스트파일
data = {키와 벨류의 딕셔너리}
text_file_path = '/content/sample_data/data.txt'
with open(text_file_path, 'w') as textfile:
for key, item in data.items():
textfile.write(str(key) + " : " + str(item) + '\n')
# csv, 엑셀, 제이슨 모두 판다스와 json을 호출한 다음에 저장한다. 하지만 텍스트파일과 제이슨파일은 각각 제이슨파일과 텍스트파일을 열어 제이슨 파일 저장형식 혹은 반복문을 통한 기입을 통해 저장해야 한다.
2. 라이브러리
- 종류
A. pandas : 데이터 조작, 분석을 위한 라이브러리
B. numpy : 과학적 계산을 위한 라이브러리, 다차원 배열 및 행렬 연산을 지원
C. matplotlib : 데이터 시각화 라이브러리
D. seaborn : matplotlib 기반으로 한 통계용 데이터 시각화 라이브러리
E. scikit-learn : 머신 러닝 알고리즘을 사용할 수 있는 라이브러리, "분류", "회귀", "군집화", "차원 축소"등의 다양한 머신 러닝 기법 제공
F. statsmodels : 통계 분석을 위한 라이브러리 "회귀 분석", "시계열 분석", "비모수 통계" 등
G. scipy : 과학기술 및 수학 연산 라이브러리 "선형대수", "최적화", "통계 분석" 등의 기능
H. tensorflow : 딥러닝 및 기계 학습 목적 오픈 소스 라이브러리 "그래프 기반 연산을 통한 수치 계산", "신경망 구축 및 학습 가능"
I. pytorch : 딥러닝 목적 오픈소스 라이브러리 "동적 계산 그래프 사용", "신경망 구축 및 학습 가능"
3. 포맷팅(formatting)
- 정의 : 문자와 변수를 연산자 없이 한 번에 출력 가능
- 대표적으로 "f-string"이 있다.
- 사용법 : print(f"내용1 {변수1} 내용2")
- 다른 형태의 포맷팅 형식
a. format함수 : print( "내용1 {} 내용2".format(변수1))
b. 이전에 사용하던 포맷팅 방식 : print("내용1 %d 내용2" % (변수1)) # 변수를 넣을 위치에 %로 표시, 어떤 타입의 변수를 넣을 것인지 작성(숫자=d, 문자=s)
4. 리스트 컴프리헨션
- 정의 : 리스트를 간결하게 생성하는 방법
- 반복문과 조건문을 사용한 리스트 생성 시에 사용한다.
- 데이터 처리 및 변환에 유용하게 활용
- 기본형태 : 조건 for 조건을 적용할 반복 수행 대상 내의 요소 in 반복수행할 대상 if 조건문 #if 조건문은 안 넣어도 된다.
ex.
# 제곱 리스트 생성
squares = [x**2 for x in range(1, 11)]
# 리스트 중 짝수만 선택 후 제곱 리스트 생성
even_ squares = [x**2 for x in range(1, 11) if x % 2 == 0]
# 문자열 리스트에서 각 문자열의 길이를 저장한 리스트 생성
words = ["apple", "banana", "grape", "orange"]
word_lengths = [len(word) for word in words]
5. lambda
- 정의 : 익명 함수로 임시적으로 간결한 내용의 함수를 사용해야 할 때 사용하는 함수
구분 | lambda | def |
선언(정의)방식 | lambda x:x와 x에 적용할 조건, x의 요소들이 들어있는 대상(리스트) | def 함수명 |
# 즉 일반 함수는 이름이 있지만, 람다는 간단 표현식만 가질 뿐 이름이 없음! 이름없는 함수를 사용할 때 쓰는 것! 임시적! | ||
구조 | 한 줄, 간단한 표현식 | 여러 줄의 코드블록 |
사용 영역 | 한 번만 사용되거나, 임시로 필요한 경우에만 사용 | 어디서나 함수 이름을 호출! |
사용법 | 함수를 매개변수로 받거나, 함수를 반환하는 고차함수! 함수형 프로그래밍에서 사용 | 함수명 호출 (&인수값 입력!) |
- 종류
A. "filter(조건 함수, 반복 가능 데이터)" : 파이썬 내장 함수로 여러 개의 데이터로부터 조건 충족하는 데이터 추출 시 사용
ex.
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 출력: [2, 4, 6, 8, 10]
B. "map(조건 함수, 반복 가능 데이터)" : 파이썬 내장 함수, 여러 값을 받아 각각의 값에 함수를 적용한 결과를 반환
ex.
numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(squared_numbers) # 출력: [1, 4, 9, 16, 25]
6. split 메서드
- 정의 : 문자열 혹은 시퀸스 타입 데이터를 여러 개의 요소로 분리할 때 사용하는 메서드
- 형태 : "분할할 데이터.split(분할 기준 만일 없을 시 문자열의 경우 하나하나 분리하여 출력)"
- ".join()"을 통해 분할된 요소를 합칠 수 있음.
ex) split
data = "apple,banana,grape,orange"
fruits = data.split(',')
print(fruits) # 출력: ['apple', 'banana', 'grape', 'orange']
ex) join
words = ['Hello,', 'how', 'are', 'you', 'doing', 'today?']
sentence = ' '.join(words)
print(sentence) # 출력: Hello, how are you doing today?