Day09_Python_5‐7 핵심 - bonniekwon0721/Dataanalytics-study GitHub Wiki
18/FEB/2024
06 Pivot
데이터 처리와 분석에 있어서 다양한 방법으로 판다스(Pandas) 라이브러리의 기능을 활용하는 것을 보여줍니다.
데이터 타입 변환 및 열 삭제
-
Q83: 'First Tooltip' 열의 신뢰구간 표현을 제거하고, 'Indicator' 열을 삭제하는 작업을 수행합니다. 데이터 타입을 문자열로 변경한 후, 특정 문자('[')를 기준으로 문자열을 분리하고, 첫 번째 부분만을 유지합니다.
df['First Tooltip'].dtype df['First Tooltip'] = df['First Tooltip'].astype(str) df.drop('Indicator', axis=1, inplace=True) df['First Tooltip'] = df['First Tooltip'].str.split("[", expand=True)[0]
데이터 필터링
-
Q84: 년도가 2015년 이상이고, 'Dim1'이 'Both sexes'인 데이터를 필터링합니다.
target = df[(df.Period >= 2015) & (df.Dim1 == 'Both sexes')]
피벗 테이블 생성
-
Q85: 나라별 년도에 따른 'First Tooltip' 값을 재구조화하여 피벗 테이블을 생성합니다.
Ans = target.pivot(index='Location', columns='Period', values='First Tooltip') -
Q86: 'Dim1'에 따른 년도별 사망비율의 평균을 구하기 위해 피벗 테이블을 생성합니다. 이 과정에서 'First Tooltip' 열의 값을 수치형으로 변환합니다.
df['First Tooltip'] = pd.to_numeric(df['First Tooltip'], errors='coerce') Ans = df.pivot_table(index='Dim1', columns='Period', values='First Tooltip', aggfunc='mean')
특정 조건에 맞는 데이터 추출
-
Q87: 'Country' 열이 'KOR'(한국)인 데이터만을 필터링합니다.
kr = df[df['Country'] == 'KOR']
연도별 메달 수 계산
-
Q88: 한국 올림픽 메달리스트 데이터에서 연도별로 메달의 종류(금, 은, 동)에 따른 갯수를 계산합니다.
Ans = kr.pivot_table(index='Year', columns='Medal', aggfunc='size').fillna(0)
스포츠 종류 및 성별에 따른 데이터 계산
-
Q89: 스포츠 종류별로 성별 수를 계산합니다.
Ans = df.pivot_table(index='Sport', columns='Gender', aggfunc='size')
종목별 메달 수 계산
-
Q90: 종목별로 메달 수를 계산합니다.
Ans = df.pivot_table(index='Discipline', columns='Medal', aggfunc='size')
07 Merge, Concat
여기에는 **concat**과 merge 함수 사용이 포함되며, 각각의 문제를 통해 이들 함수의 다양한 활용 방법을 살펴봅니다.
데이터 나누기 및 합치기
-
Q91:
pd.concat을 사용하여 데이터프레임 합치기 (수직 결합) total = pd.concat([df1, df2], axis=0)total = pd.concat([df1, df2], axis=0)pd.concat함수를 사용해df1과df2데이터프레임을 수직 방향(axis=0)으로 합칩니다. 이는 두 데이터프레임을 위아래로 결합하는 것을 의미합니다.
내부 조인과 외부 조인
-
Q92:
pd.concat을 사용하여 내부 조인Ans = pd.concat([df3, df4], join='inner')join='inner'옵션을 사용해 **df3**과 **df4**의 공통 열만을 기준으로 합칩니다. 이는 두 데이터프레임의 교집합을 결합하는 내부 조인에 해당합니다. -
Q93:
pd.concat을 사용하여 외부 조인 (모든 컬럼 포함)Ans = pd.concat([df3, df4], join='outer').fillna(0)join='outer'옵션을 사용해 **df3**과 **df4**를 합치며, 모든 열을 포함시킵니다. 결측치는 **0**으로 채웁니다. 이는 외부 조인에 해당하며, 두 데이터프레임의 합집합을 결합합니다.
merge 함수를 이용한 데이터프레임 결합
-
Q94:
merge함수를 사용한 내부 조인Ans = pd.merge(df5, df6, on='Algeria', how='inner''Algeria' 열을 키로 사용하여 **
df5**와 **df6**을 내부 조인합니다. 이는 두 데이터프레임에 공통적으로 존재하는 키 값에 대해서만 행을 결합합니다. -
Q95:
merge함수를 사용한 외부 조인 (합집합)Ans = pd.merge(df5, df6, on='Algeria', how='outer').fillna(0)'Algeria' 열을 키로 사용하여 **
df5**와 **df6**을 외부 조인합니다. 모든 키 값을 포함시키며, 결측치는 **0**으로 채웁니다. 이는 두 데이터프레임의 합집합에 해당하는 행을 결합합니다.
요약
Pandas의 **concat**과 merge 함수를 사용하여 데이터프레임을 다양한 방식으로 합치는 방법을 탐구합니다. concat 함수는 주로 수직(행 방향) 또는 수평(열 방향) 결합에 사용되며, merge 함수는 SQL 스타일의 조인을 수행하여 더 복잡한 데이터 결합 요구사항을 해결할 수 있습니다. 각 함수의 join 파라미터는 결합할 때 고려할 열 또는 행의 종류(내부 조인, 외부 조인 등)를 결정하는 데 사용됩니다.
09 Series & DataFrame
데이터의 기술통계를 살펴보고, 데이터를 그룹화하여 집계하는 다양한 방법을 다룹니다.
기본 데이터 탐색
-
Q96. 상위 10개의 행 출력
Ans = df.head(10)head함수를 사용하여 데이터프레임의 상위 10개 행을 출력합니다.
데이터 정제
-
Q97. 'Unnamed: 0'과 'Id' 열 제거
df2 = df['Name', 'Year', 'Gender', 'State', 'Count'](/bonniekwon0721/Dataanalytics-study/wiki/'Name',-'Year',-'Gender',-'State',-'Count')특정 열을 제외하고 데이터프레임을 생성합니다. 이 방식은 필요한 열만 선택하여 새로운 데이터프레임을 만드는 권장 방법입니다.
데이터 분석 및 집계
-
Q98. 데이터셋 내 남성과 여성 이름의 수 비교
df['Gender'].value_counts()value_counts함수를 사용하여 'Gender' 열의 값별 개수를 계산합니다. -
Q99. 이름별로 'Count' 합계 구하기 및 상위 5개 출력
names = pd.DataFrame(df.groupby('Name')['Count'].sum()) names.sort_values(by=['Count'], ascending=False).head(5)groupby와sum함수를 사용하여 이름별로 'Count'의 합계를 구하고, 합계가 가장 큰 상위 5개의 이름을 출력합니다.
고유값 및 최빈값 분석
-
Q100. 서로 다른 이름의 총 개수
df['Name'].nunique()nunique함수를 사용하여 'Name' 열의 고유값 개수를 계산합니다. -
Q100-2. 가장 많이 등장한 이름
names[names.Count == names.Count.max()]names데이터프레임에서 'Count' 값이 최대인 행을 찾습니다.
집계 함수 활용
-
Q101. 가장 적게 등장한 이름의 개수
len(names[names.Count == names.Count.min()])'Count' 값이 최소인 이름의 개수를 계산합니다.
-
Q102. 중앙값을 가진 이름
names[names.Count == names.Count.median()]'Count'의 중앙값을 가진 이름을 찾습니다.
기술통계 계산
-
Q103. 'Count'의 표준편차 및 기타 통계량 계산
names.Count.std() names.Count.describe()'Count' 열의 표준편차와 기타 통계량(평균, 최소, 최대, 사분위수 등)을 계산합니다.
-
Q104. 'names' 데이터프레임의 기술통계 요약
names.describe()describe함수를 사용하여 'names' 데이터프레임의 'Count' 열에 대한 기술통계 요약을 출력합니다. 이 함수는 평균, 표준편차, 최소값, 최대값, 사분위수 등을 포함한 요약 통계를 제공합니다.
10 Visualization
다양한 데이터 시각화 기법을 활용하여 정보를 시각적으로 표현하는 방법에 대해 배웁니다. 사용된 데이터는 식당에서의 손님 정보를 담고 있으며, 시각화를 통해 데이터 안의 패턴, 관계, 이상치 등을 탐색합니다.
기본 데이터 처리 및 시각화 준비
-
Q114: 불필요한 'Unnamed: 0' 열을 제거합니다.
del df['Unnamed: 0'] -
Q115:
total_bill에 대한 히스토그램을 그려, 청구 금액의 분포를 시각화합니다. 이는 식당의 청구 금액 범위와 빈도를 파악하는 데 유용합니다.t = sns.histplot(df.total_bill); t.set(xlabel='Value', ylabel='Frequency', title="Total Bill");
고급 시각화
-
Q116:
total_bill과tip간의 관계를 살펴보기 위한jointplot을 그립니다. 이는 두 변수 간의 상관관계와 각 변수의 분포를 함께 보여줍니다.sns.jointplot(x="total_bill", y="tip", data=df) -
Q117: 데이터셋 내 모든 연속 변수 간의 관계를 시각화하는
pairplot을 생성합니다. 이는 변수 간의 상관관계를 한눈에 파악할 수 있게 해줍니다.sns.pairplot(df);
특정 조건에 따른 시각화
-
Q118:
day에 따른total_bill의 관계를 보여주는stripplot을 그립니다. 이는 요일별 청구 금액의 분포를 비교하는 데 도움을 줍니다.sns.stripplot(x="day", y="total_bill", hue="day", data=df); -
Q119:
day와time에 따라total_bill의 관계를 보여주는boxplot을 그립니다. 박스 플롯을 통해 중앙값, 사분위수, 이상치 등을 쉽게 파악할 수 있습니다.sns.boxplot(x="day", y="total_bill", hue="time", data=df);
FacetGrid 활용
-
Q121: 점심(
Lunch)과 저녁(Dinner)을 기준으로 한tip의 분포를 비교하는 히스토그램을FacetGrid를 사용하여 생성합니다.g = sns.FacetGrid(df, col="time") g.map(plt.hist, "tip") -
Q121-2: 남성과 여성을 대상으로 한
total_bill과tip간의 관계를 나타내는 산점도 그래프를FacetGrid를 사용하여 생성합니다. 흡연 여부에 따른 색상 구분을 포함합니다.g = sns.FacetGrid(df, col="sex", hue="smoker") g.map(plt.scatter, "total_bill", "tip", alpha=.7) g.add_legend();
추가 시각화
-
Q123:
Sex에 따른 비율을 나타내는 파이 차트를 생성합니다. 이를 통해 남성과 여성의 비율을 시각적으로 비교할 수 있습니다.males = (df['Sex'] == 'male').sum() females = (df['Sex'] == 'female').sum() proportions = [males, females] plt.pie( proportions, labels = ['Males', 'Females'], shadow = False, colors = ['lightblue', 'lightpink'], explode = (0.15 , 0), startangle = 90, autopct = '%1.1f%%' ) plt.axis('equal') plt.title("Sex portion") plt.tight_layout() plt.show() -
Q124:
Age와Fare간의 관계를 성별에 따라 색상 구분하여 나타내는 산점도를 그립니다. 이를 통해 연령대별 지불 요금과 성별 패턴을 확인할 수 있습니다.lm = sns.lmplot(x='Age', y='Fare', data=df, hue='Sex', fit_reg=False) lm.set(title='Fare x Age') -
Q125: 지불한 요금(
Fare)에 대한 히스토그램을 생성하여, 요금의 분포를 파악합니다. 다양한 요금 구간의 빈도를 확인할 수 있습니다.import numpy as np df2 = df.Fare.sort_values(ascending = False) binsVal = np.arange(0,600,10) binsVal plt.hist(df2, bins = binsVal) plt.xlabel('Fare') plt.ylabel('Frequncy') plt.title('Fare Payed Histogram') plt.show()
시각화는 데이터의 다양한 측면을 탐색하고, 특정 변수 간의 관계나 분포를 파악하기 위한 강력한 도구를 제공합니다. Seaborn과 Matplotlib 라이브러리를 활용하여 복잡한 데이터셋에서 유용한 인사이트를 시각적으로 도출할 수 있음을 보여줍니다.
11 Deleting
데이터 처리 과정에서 필요한 다양한 삭제 및 수정 작업에 대해 배웁니다. 데이터프레임의 컬럼 이름 변경, 결측치(NaN) 처리, 특정 컬럼이나 행의 삭제, 인덱스 재설정 등의 작업을 포함합니다.
컬럼 이름 변경 및 결측치 처리
-
Q126: 데이터프레임의 컬럼 이름을 변경합니다.
df.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class'] -
Q127: 각 컬럼별 결측치(NaN)의 존재 유무를 확인합니다.
df.isnull().sum() -
Q127-2: 'petal_length' 컬럼의 일부 행을 NaN으로 변경합니다.
df.iloc[9:29, 2] = np.nan -
Q128: NaN 값을 1로 채워 넣습니다.
df.petal_length.fillna(1, inplace=True)
컬럼 및 행 삭제, 인덱스 재설정
-
Q129: 'class' 컬럼을 삭제합니다.
df = df['sepal_length', 'sepal_width', 'petal_length', 'petal_width'](/bonniekwon0721/Dataanalytics-study/wiki/'sepal_length',-'sepal_width',-'petal_length',-'petal_width') -
Q130: 처음 3개의 행을 모두 NaN으로 변경합니다.
df.iloc[:3, :] = np.nan -
Q131: NaN 값을 포함하는 행을 삭제합니다.
df = df.dropna(how='any') -
Q132: 인덱스를 0부터 시작하도록 재설정합니다.
df = df.reset_index(drop=True)
이 과정은 데이터를 전처리하고, 분석하기 전에 필요한 사전 작업들을 포함합니다. 데이터프레임의 컬럼 이름 변경은 데이터의 이해를 돕고, 결측치 처리는 분석의 정확성을 높입니다. 특정 컬럼이나 행을 삭제하는 작업은 불필요한 데이터를 제거하여 분석의 효율성을 증가시키며, 인덱스를 재설정하는 것은 데이터의 접근성을 개선합니다. 이러한 기본적인 데이터 처리 기법들은 데이터 분석의 기초를 이루며, 분석 과정에서 반드시 필요한 단계입니다.
Studied from 제로베이스 데이터 분석 스쿨