1.5 데이터분포 탐색하기
데이터 분포를 탐색할 수 있는 시각화 그래프 : 상자그림(box plot),도수분포표,히스토그램, 밀도그림
1) 백분위수와 상자그림
* 백분위수 : 크기가 있는 값들로 이뤄진 자료를 (일반적으로 작은 것부터)순서대로 나열했을 때 백분율로 나타낸 특정 위치의 값
tips['tip'].quantile([0.05,0.25,0.5,0.75,0.95])
# tip에 대한 백분위수
# 5% 1.44, 25%(Q1) 2, 50%(Q2) 2.9, 75%(Q3) 3.56, 95%(상위5%) 5.19
# 백분위수를 boxplot으로 표현하기
ax = (tips['tip']).plot.box()
ax.set_ylabel('tip')
# 약 6보다 크면 이상치 = 3.56+(3.56-2)*1.5
2) 도수분포표와 히스토그램
도수분포표 : 어떤 구간(빈, bin)에 해당하는 수치 데이터 값들의 빈도를 나타내는 기록
-> 범위를 동일한 크기의 구간으로 나눈 다음, 각 구간마다 몇 개의 변숫값이 존재하는지를 보여줌
히스토그램 : X축은 구간들을, Y축은 빈도수를 나타내는 도수테이블의 그림(막대그래프와 다름)
-> 그래프에 빈 구간들이 있을 수 있다, 구간을 동일한 크기를 갖는다
파이썬 함수
Pandas.cut() : 연속적인 수치 데이터를 명확한 구간으로 나누어 범주화
- 첫 번째 인자: 나누고자 하는 숫자값을 포함하는 배열
- bins: 나누고자 하는 방식을 지정하는 인자
- 양의 정수를 입력하면 데이터를 균등한 구간으로 나눕니다.
- 리스트를 입력하면 사용자가 직접 구간을 지정할 수 있습니다.
- labels: 각 구간에 대한 레이블을 지정할 수 있습니다.
- right: 구간의 경계를 오른쪽으로 포함할지 여부를 지정합니다.
# tip데이터를 10개 구간으로 나눔
binnedtip = pd.DataFrame(pd.cut(tips['tip'],bins = 10))
binnedtip.sort_values(by='tip',ascending=True).value_counts()
#히스토그램으로 표현
ax = tips['tip'].plot.hist(bins=10,figsize = (10,4))
ax.set_xlabel('tip')
* (1.9, 2.8] : 1.9보다 크고(초과) 2.8까지의(이하) 범위
* (1.9, 2.8): 1.9 초과 2.8 미만
* [1.9, 2.8]: 1.9 이상 2.8 이하
TIP의 범위 : 10-1 =9, 9를 10개의 구간으로 나구기 위해서는 각 구간의 크기는 0.9가 되어야 한다
상위 구간에 갈 수록 범위에 포함되는 데이터 개수가 감소한다
TIP의 왜도 : 양의 왜도(오른쪽 꼬리)
- 양의 왜도(Positive Skewness):
- 분포의 오른쪽 꼬리가 길어 분포가 오른쪽으로 치우쳐 있습니다.
- 평균이 중앙값보다 크고, 중앙값이 최빈값보다 작습니다.
- 음의 왜도(Negative Skewness):
- 분포의 왼쪽 꼬리가 길어 분포가 왼쪽으로 치우쳐 있습니다.
- 평균이 중앙값보다 작고, 중앙값이 최빈값보다 큽니다.
- 0에 가까운 왜도:
- 분포가 대칭적이며 정규분포와 유사합니다.
- 평균, 중앙값, 최빈값이 서로 비슷합니다.
3) 밀도 그림과 추정
밀도그램 : 데이터 분포를 연속된 선으로 보여줌
커널밀도추정 : 커널 밀도 추정(Kernel density estimation, KDE)은 통계학에서 확률 밀도 추정을 위해 커널 평활화를 적용한 것이다. 즉, 커널을 가중치로 기반으로 랜덤 변수의 확률 밀도 함수를 추정하는 비모수적 방법
히스토그램과의 차이점 : Y축 값의단위, 밀도그림을 데이터의 개수가 아닌 비율로 표시, 밀도 곡선아래의 총면적은 1이고, 구간의 개수 대신 X축의 두 점 사이의 곡선 아래 면적을 계산
# 밀도 그래프 그리기
ax2 = tips['tip'].plot.hist(density = True, xlim=[0,10], bins =range(1,10))
tips['tip'].plot.density(ax=ax2) #동일한 그래프에 추가될 수 있도록 축인수(ax)제공
ax2.set_xlabel('TIP')
히스토그램 | 밀도그래프 |
🎈 주요개념
- 도수 히스토그램은 Y축에 획수를 X축에 변숫값들을 표시하고 데이터의 분포를 볼 수 있다
- 도수분포표는 히스토그램에 보이는 횟수들을 표 형태로 나타낸 것
- 상자그림에서 상자의 위와 아래 부분은 각각 75%, 25%,백분위수를 의미
- 밀도그림은 히스토그림의 부드러운 버전
1.6 이진데이터와 범주 데이터 탐색하기
최빈값 mode : 데이터에서 가장 자주 등장하는 범주, 값
기댓닶 expected value : 범주에 해당하는 어떤 수치가 있을때, 범주의 출현확률(probability)에 따른 평균
막대도표 : 각 범주의 빈도수 혹은 비율을 막대로 그린 그림
-> X축 : 범주, Y축 : 범주에 해당하는 데이터의 비율, 횟수
파이그림 : 각 범주의 빈도수 혹은 비율을 원의 부채꼴 모양으로 나타낸 그림
1) 막대그래프
X축은 변수(time컬럼)의 서로다른 범주들은 나타냄 -> dinner, lunch(순차적X)
히스토그램은 막대들이 서로 붙어있고 중간이 틈이 있으면 해당 값이 존재하지 않는것,
막대그래프는 서로 떨어져 있음
times = pd.DataFrame(tips['time'].value_counts())
times
# 막대그래프
ax = times.plot.bar(figsize = (4,4), legend = True)
ax.set_xlabel('time')
ax.set_ylabel('count')
#파이차트
ax = times.plot.pie(figsize = (4,4),subplots=True)
도수분포표 | 막대그래프(개수) | 파이차트(비율) -> 잘 사용X |
2) 최빈값
범주형 데이터에서는 사용되지만, 수치형 데이터에는 잘 사용하지 않음
3) 기댓값
범주형 데이터 중, 각 범주에 해당하는 수치형 변수들이 존재하는 경우가 있다
*가중평균과 비슷 -> 주관적인 평가에 따른 미래의 기댓값과 각 확률의 가중치 만큼 모두 더한 값
** 활용도 : 새로운 사업 인수에 따른 5년간의 기대수익
예) Tip데이터에서 식사 인원수(1~6까지 범주형)의 기댓값 구하기
각 결괏값 X 발생확률 -> 모든값 더하기
EX = (1*0.02) + (2*0.64) + (3*0.16) + (4*0.15) + (5*0.05) + (6*0.02)
식사 인원수의 기댓값 = 2.75(명)
4) 확률
상황이 수없이 반복될 경우 사건이 발생할 확율의 비율
🎈 주요개념
- 범주형 데이터는 보통 비율로 요약, 막대그래프로 시각화
- 범주란 전혀다른 집합(남자, 여자 등) 정도를 나타내는 요인변수의 수준(고,중,저), 구간별로 나눈 수치 증
- 기댓값은 어떤 값과 그 값이 일어날 확률을 서로 곱해 더한값, 주로 요인변수의 수준을 요약하는데 사용
- *요인변수 = 범주형 변수, 이산형 변수
1.7 상관관계
상관계수 correlation coefficient(-1~1) : 수치적 변수들간에 어떤 관계가 있는지를 나타내기 위해 사용되는 측정량
상관행렬 : 행과 열이 변수들을 의마하는 표, 각 셀은 그 행과 열에 해당하는 변수들 간의 상관관계를 의미
산점도 scatterplot :x축과 y축이 서로 다른 두 개의 변수를 나타내는 도표
(피어슨)상관계수 구하기 : 두 변수사이의 상관관계를 항상 같은 척도에 놓고 추정하는 것,
변수1과 변수2 각각의 평균으로부터의 편차들을 서로 곱한 값들의 평균을 각 변수의 표준편차의 곱으로 나눠준 것
#TIP수치형 데이터의 상관관계 시각화
tips_cor = tips[['total_bill','tip','size']]
sns.heatmap(tips_cor.corr(),annot=True, fmt = '.2f', vmin=-1, vmax=1,
cmap = sns.diverging_palette(20,220,as_cmap =True))
# cmap: 히트맵의 색상 팔레트를 지정, 'YlOrRd', 'Blues', 'Greens' 등의 값
# fmt: 셀 값 표시 형식, '.2f'는 소수점 2자리
# vmin=-1, vmax=1 : 히트맵의 생상범위 -1~1
# total_bill과 tip의산점도
ax = tips.plot.scatter(x = 'total_bill', y='tip', figsize = (4,4))
ax.set_xlabel('total_bill')
ax.set_ylabel('tip')
상관계수의 시각화 | 산점도(tip과 total bill의 상관계수는 0.68 |
1) 산점도
X축 Y축은 각각의 변수들을 의마하고, 그래프 각 한점은 하나의 레코드를 의미
🎈 주요개념
- 상관계수는 두 변수 사이에 서로 어떤 관계가 있는지 측정
- 두 변수가 서로 같이 높아지고 낮아질때 양의 상관관계가 있다고 함
- 두 변수가 높아질때 다른 변수는 낮아지면 음의 상관관계가 있다고 함
- 상관계수는 표준화된 측정지표로 항상 값이 -1 ~ 1 사이
- 상관계수가 0일떼 아무런 상관성이 없다는 것, 데이터가 랜덤일 경우 상관계수가 유연히 강하게 나올 수도 있음
1.8 두 개 이상의 변수 탐색하기
일변량분석 :한번에 하나의 변수를 분석 (예, 평균, 분산)
이변량분석 : 한번에 두 변수 비교(상관분석)
다변량변수 : 한번에 셋 이상의 변수를 분석
분할표 : 두가지 이상의 범주형 변수의 빈도수를 기록한 표
육각형구간 : 두 변수를 육각형 모양의 구간으로 나눈 그림
-> 데이터가 너무 많아 산점도로 표현하기 어려울 때
-> 점으로 표시하는 대신 기록값을 육각형모양의 구간들로 나누고 각 구간에 포함된 기록값의 개수에 따라 색으로 표현
등고 도표 : 지도상에 같은 높이의 지점을 등고선으로 나타내는 것처럼 두 변수의 밀도를 동고선으로 표시한 도표
바이올린 도표 : 상자그림 + 밀도
1) 육각형 구간과 등고선(수치형 변수-수치형변수)
# total_bill과 tip의 육각형 구간 도표
# gridsize 매개변수는 hexbin 그래프의 격자 크기 결정
# sharex 매개변수는 여러 개의 subplot을 생성할 때 x축을 공유할지 여부 결정(sharex=True로 설정하면 모든 subplot이 동일한 x축 범위)
ax = tips.plot.hexbin(x = 'total_bill', y='tip', gridsize =30, sharex =False ,figsize = (4,4))
ax.set_xlabel('total_bill')
ax.set_ylabel('tip')
# total_bill과 tip의 등고션 도표
fig,ax = plt.subplots(figsize=(4,4))
ax = sns.kdeplot(data = tips, x = 'total_bill', y='tip', ax=ax)
ax.set_xlabel('total_bill')
ax.set_ylabel('tip')
육각형 구간 | 등고션 |
면접질문
Q. 최빈값은 무엇인가요 ?
주어진 데이터에서 가장 자주 발생하는 값을 말합니다.
Q. 중앙값은 무엇인가요?
데이터의 중간에 있는 값으로, 상위애서 절반 혹은 하위에서 절반에 위피하는 값