📌Q1. 연령대별 허리둘레에 대한 기술통계를 구하려고 합니다. 다음 제공되는 딕셔너리를 통해 연령대코드(5세단위)를 "연령대"로 만들고 아래와 같은 기술통계값을 구해주세요!
age_code = {1: '0~4세',
2: '5~9세',
3: '10~14세',
4: '15~19세',
5: '20~24세',
6: '25~29세',
7: '30~34세',
8: '35~39세',
9: '40~44세',
10: '45~49세',
11: '50~54세',
12: '55~59세',
13: '60~64세',
14: '65~69세',
15: '70~74세',
16: '75~79세',
17: '80~84세',
18: '85세+'}
# df 자체를 바꿔버리면 나머지 문제를 푸는 데에 지장이 있어서 copy 해서 사용
df_01 = df.copy()
# 해당 column의 값들을 치환
df_01['연령대코드(5세단위)'] = df_01['연령대코드(5세단위)'].map(age_code)
# ANSWER
pd.pivot_table(df_01, index = '연령대코드(5세단위)', values = '허리둘레', aggfunc = ['describe' ])
📌Q2. "음주여부", "흡연상태", "연령대코드(5세단위)", "성별코드"에 대한 상관계수를 구하고 시각화 해주세요.
# 필요한 데이터만 가져 옴
columns = ['음주여부', '흡연상태', '연령대코드(5세단위)', '성별코드']
df_02 = df[columns]
# ANSWER
mask = np.triu(np.ones_like(df_corr, dtype=np))
plt.figure(figsize=(6, 5))
sns.heatmap(df_corr, annot=True, fmt='2.2f', cmap='spring', mask=mask, vmin=-1, vmax=1)
📌Q3. 흡연하는 사람과 음주하는 사람들의 수는 얼마나 차이가 있을까요?
columns = ['음주여부', '흡연상태']
df_03 = df[columns]
# df_03은 df에서 추출한 데이터프레임이고 이걸 그대로 아래에서 가공하려고 하면 데이터프레임의 일부분이라 오류가 발생함
# 그래서 .copy()로 복사본을 떠서 df_03에 재할당함
df_03 = df_03.copy()
# 흡연상태 문자열로 상태값 치환
smoke = {1 : "흡연안함", 2: "끊음", 3: "흡연중"}
df_03['흡연상태'] = df_03['흡연상태'].replace(smoke)
# 음주여부 문자열로 상태값 치환
drink = {0: "안마심", 1: "마심"}
df_03['음주여부'] = df_03['음주여부'].replace(drink)
# 수업에서는 '가입자일련번호(각 고유번호)'를 넣어서 values에 저걸 넣고 aggfunc=count를 해서 실습한 것 같음
# 찾아보니까 aggfunc=size도 있어서 이걸로 해 봤더니 됨!
# size는 NaN 값을 제외하고 true이거나 false인 값들을 세어준다고 함.
# ANSWER
df_03_pivot = pd.pivot_table(df_03, index='음주여부', columns='흡연상태', aggfunc='size')
df_03_pivot
# ANSWER
sns.countplot(data=df_03, x='흡연상태', hue='음주여부', palette='spring')
📌 Q4. 체중이 120Kg 이상인 데이터를 찾아 "총콜레스테롤", "감마지티피" 값을 음주여부에 따라 산점도로 시각화해주세요!
# 필요한 데이터만 가지고 옴
columns = ['체중(5Kg 단위)', '총콜레스테롤', '감마지티피', '음주여부', '흡연상태']
df_04 = df[columns]
df_04 = df_04.copy()
# 필요한 데이터에서 문제 조건에 맞는 데이터를 골라냄
df_04_over = df_04.loc[df_04['체중(5Kg 단위)'] >= 120, ['총콜레스테롤', '감마지티피', '음주여부', '체중(5Kg 단위)', '흡연상태']]
df_04_over.head()
# 체중이 120Kg 이상이고 흡연을 하지 않는 사람의 정보
df_04_over_smoke_1 = df_04.loc[(df_04['체중(5Kg 단위)'] >= 120) & (df_04['흡연상태'] == 1),
['총콜레스테롤', '감마지티피', '음주여부', '체중(5Kg 단위)', '흡연상태']]
# 체중이 120Kg 이상이고 흡연을 중단한 사람의 정보
df_04_over_smoke_2 = df_04.loc[(df_04['체중(5Kg 단위)'] >= 120) & (df_04['흡연상태'] == 2),
['총콜레스테롤', '감마지티피', '음주여부', '체중(5Kg 단위)', '흡연상태']]
# 체중이 120Kg 이상이고 흡연을 하는 사람의 정보
df_04_over_smoke_3 = df_04.loc[(df_04['체중(5Kg 단위)'] >= 120) & (df_04['흡연상태'] == 3),
['총콜레스테롤', '감마지티피', '음주여부', '체중(5Kg 단위)', '흡연상태']]
# 똑같은 값이 계속 들어가서 변수로 치환
x = '총콜레스테롤'
y = '감마지티피'
hue = '음주여부'
palette = 'spring'
height = 3
# ANSWER
# 문제랑 완전히 똑같지는 않지만 이것이 한계!
sns.lmplot(data=df_04_over_smoke_3, x=x, y=y, hue=hue, palette=palette, height=height)
plt.title('흡연=흡연중')
sns.lmplot(data=df_04_over_smoke_1, x=x, y=y, hue=hue, palette=palette, height=height)
plt.title('흡연=흡연 안 함')
sns.lmplot(data=df_04_over_smoke_2, x=x, y=y, hue=hue, palette=palette, height=height)
plt.title('흡연=끊음')
# 모르겠어서 GTP한테 물어봄
# 근데 이러면 css를 어떻게 하는지는? 모르겠다. GPT가 가르쳐준 방법은 lmplot 추가할 때 palette를 넣는 건데 이건 안 됨.
# 서브셋을 하나의 데이터프레임으로 통합
df_combined = pd.concat([
df_04_over_smoke_1.assign(흡연상태_설명='흡연 안 함'),
df_04_over_smoke_2.assign(흡연상태_설명='흡연 끊음'),
df_04_over_smoke_3.assign(흡연상태_설명='흡연 중')
])
# FacetGrid 생성
g = sns.FacetGrid(df_combined, col='흡연상태_설명', col_wrap=3, height=5, sharey=True)
# lmplot 추가
g.map_dataframe(sns.regplot, x='총콜레스테롤', y='감마지티피')
# 레전드 위치 조정 및 제목 설정
g.add_legend(title='음주 여부', bbox_to_anchor=(1.05, 1), loc='upper left')
g.set_titles(col_template="{col_name}")
g.set_axis_labels("총콜레스테롤", "감마지티피")
g.set(xlim=(df_combined['총콜레스테롤'].min(), df_combined['총콜레스테롤'].max()),
ylim=(df_combined['감마지티피'].min(), df_combined['감마지티피'].max()))
plt.tight_layout()
plt.show()
📌 Q5. 연령대별로 시력은 얼마나 차이가 날까요? 연령대, 성별 좌우 평균 시력을 시각화 해주세요!
# 필요한 데이터만 가지고 옴
columns = ['연령대코드(5세단위)', '시력(좌)', '시력(우)', '성별코드']
df_05 = df[columns]
df_05 = df_05.copy()
# 연령대코드를 문자열로 치환
df_05['연령대코드(5세단위)'] = df['연령대코드(5세단위)'].map(age_code)
fig, axes = plt.subplots(1, 2, figsize=(14, 6), sharey=True)
sns.barplot(data=df_05, x='시력(좌)', y='연령대코드(5세단위)', hue='성별코드', errorbar=None, palette='spring', ax=axes[0])
sns.barplot(data=df_05, x='시력(우)', y='연령대코드(5세단위)', hue='성별코드', errorbar=None, palette='spring', ax=axes[1])
plt.tight_layout()
plt.show()
우리 팀에 한 7-8명 있는 것 같은데 수료 조건이 가능한 사람이 나만 남았다...^^
홧팅...^^
나 자신...^^