DATA Python

jen·2021년 11월 25일
0

DATA

목록 보기
2/2

1급

1. 주어진 데이터의 가장 많은 결측치가 있는 변수의 결측치는 몇 개 인가?

(출력 예시: 1)

import pandas as pd
df = pd.read_csv("./OTT_service_program_list.csv")
df.head(2)

def solution():
    print(df.isnull().sum().max())

2. country 변수를 참고하여 가장 많은 국가에 서비스된 프로그램의 경우 몇 개의 국가에 서비스 되었는가?

※ 참고로 영화 Scandal in Sorrento는 Italy, France 두 나라에 서비스되었다.
※ country 변수의 결측치는 제외하고 분석을 실시하시오.
(출력 예시: 1)

import pandas as pd
df = pd.read_csv("./OTT_service_program_list.csv")
df_q2 = df.loc[df["country"].notna(), ].reset_index(drop = True).copy()
ser = df_q2["country"].str.split(",").apply(len)
def solution():
    print(ser.value_counts().index.max())

3. type이 "TV Show"인 프로그램의 서비스 국가 중 가장 많은 프로그램이 서비스 되는 국가가 차지하는 비율을 반올림하여 소수점 셋째 자리까지 출력하시오.

※ 서비스 국가는 country 변수를 참고한다.
※ A 프로그램과 B 프로그램의 서비스 국가가 각각 "Korea", "Korea, Italy, Finland"인 경우 "Korea의 비중은 0.5이다.
※ 필요시 결측치를 제거하고 계산한다.
(출력 예시: 0.123)

import pandas as pd
df = pd.read_csv("./OTT_service_program_list.csv")
df_q3 = df.loc[df["type"] == "TV Show", ].reset_index(drop = True).copy()
ser_rate = df_q3["country"].str.split(",", expand = True).melt()["value"].dropna()
ser_rate = ser_rate.value_counts(normalize = True)

def solution():
    print(ser_rate.round(3).max())

4. duration과 year_release를 참고하여 2019년도와 2020년도에 공개된 프로그램의 컨텐츠 길이가 유의미하게 다른지 t-검정을 활용하여 알아보고자 한다. 검정 결과의 p-value를 반올림하여 소수 셋째 자리까지 출력하시오.

※ 단, type이 "Movie"인 프로그램에 대해서만 분석한다.
※ scipy의 t-검정 관련 함수를 사용하시오.
※ 두 집단의 분산은 서로 다르다고 가정한다.
(출력 예시: 0.123)

import pandas as pd
from scipy.stats import ttest_ind

df = pd.read_csv("./OTT_service_program_list.csv")
df_q4 = df.loc[df["type"] == "Movie", ].reset_index(drop = True).copy()
ser_min = df_q4["duration"].str.replace(pat = "[^0-9]", repl = "", regex = True).astype("int")
df_q4["min"] = ser_min

stat, p = ttest_ind(df_q4.loc[df_q4["year_release"] == 2019, "min"],
                    df_q4.loc[df_q4["year_release"] == 2020, "min"],
                    equal_var = False)

def solution():
    print(round(p, 3))

5. 특정 프로그램의 OTT 서비스 추가일 변수인 date_added를 참고하여 연도와 추가된 컨텐츠의 개수를 활용하여 선형회귀분석을 실시하고 수정된 결정계수를 반올림하여 소수점 셋째 자리까지 출력하시오.

※ 단, statsmodels의 ols() 함수를 사용하시오.
(출력 예시: 0.123)

import pandas as pd
df = pd.read_csv("./OTT_service_program_list.csv")
ser_date = df["date_added"].str.replace(pat = "^ ", repl = "", regex = True)
ser_date = pd.to_datetime(ser_date, format = "%B %d, %Y")
ser_year = ser_date.dt.year
df_year_cnt = ser_year.value_counts().reset_index()
df_year_cnt.head()

from statsmodels.formula.api import ols
model = ols("date_added ~ index", data = df_year_cnt).fit()

def solution():
    print(round(model.rsquared_adj, 3))

6. 무성의 응답 데이터를 파악하고 향후 분석에저 제외하고자 한다. 성별(gender), 교육 수준(edu_level), 재직 회사 규모(comp_size) 항목이 모두 결측값인 행 개수를 출력하시오.

(출력 예시: 1)

import pandas as pd
df = pd.read_csv("./HR_survey_10k.csv")

def solution():
    print(sum(df["gender"].isna() & df["edu_level"].isna() & df["comp_size"]))

7. 회사 규모가 클수록 직업 훈련시간이 길 것이라는 가설을 새웠다. 회사 규모인 comp_size 변수와 직업 훈련시간 변수인 training_hr 변수간 Spearman 상관계수를 구하고 반올림하여 소수점 셋째 자리까지 출력하시오.

※ 회사 규모는 "10-49"로 기록되어있는 경우 앞의 숫자를 따서 10명으로 간주한다.
(출력 예시: 0.123)

import pandas as pd
df = pd.read_csv("./HR_survey_10k.csv")
df_q2 = df[["comp_size", "training_hr"]].dropna().reset_index(drop = True)
df_q2["comp_size"].str.split("-", expand = True)
df_q2_bind = pd.concat([df_q2, df_q2["comp_size"].str.split("-", expand = True)],
                       axis = 1)
df_q2_bind[0] = df_q2_bind[0].astype("int")

def solution():
    print(round(df_q2_bind.corr(method = "spearman").iloc[0, 1], 3))

8. 경력과 직업 훈련 시간의 관계를 확인하기 위해 Kendall 순위 상관분석을 실시하고 p-value를 반올림하여 소수점 셋째 자리까지 기술하시오.

※ 결측치가 있는 행은 제거하고 분석을 실시하시오.
※ 경력이 1년 미만의 경우 0, 20년 초과의 경우 21로 변경하고 분석을 실시하시오.
※ scipy의 상관분석 관련 함수를 사용하시오.
(출력 예시: 0.123)

import pandas as pd
from scipy.stats import kendalltau
df = pd.read_csv("./HR_survey_10k.csv")
df_q3 = df[["exp", "training_hr"]].dropna().reset_index(drop = True).copy()
df_q3.loc[df_q3["exp"] == "<1",  "exp"] = 0
df_q3.loc[df_q3["exp"] == ">20", "exp"] = 21
df_q3["exp"] = df_q3["exp"].astype("int")
stat, p = kendalltau(df_q3["exp"], df_q3["training_hr"])

def solution():
    print(round(p, 3))

9. 교육 수준(edu_level) 변수와 성별(gender) 변수를 활용하여 대학교 이상의 학력과 성별간 관계가 있는지 카이제곱 검정을 통해서 알아보고자 한다. 검정결과 중에서 대학교 이상의 학력인 남성의 기대도수를 정수부분만 출력하시오.

※ 교육 수준 변수의 "Bachelor", "Masters", "PhD" 는 대학교 이상의 학력으로 한다.
※ 성별이 결측이거나 "Other"인 행은 모두 제거한다.
※ 교육 수준 변수가 결측인 경우 대학교 미만의 학력으로 간주한다.
(출력 예시: 1)

import pandas as pd
from scipy.stats import chi2_contingency
df = pd.read_csv("./HR_survey_10k.csv")

df_q4 = df[["edu_level", "gender"]].reset_index(drop = True).copy()
df_q4 = df_q4.loc[df_q4["gender"].notna(), ]
df_q4 = df_q4.loc[df_q4["gender"] != "Other", ]
df_q4.loc[df_q4["edu_level"].isna(), "edu_level"] = "mid"
df_q4["is_grad"] = df_q4["edu_level"].isin(["Bachelor", "Masters", "PhD"]) + 0
stat, p, dof, exp_v = chi2_contingency(pd.crosstab(df_q4["gender"], df_q4["is_grad"]))

def solution():
    print(int(exp_v[1, 1]))

10. 학력과 성별에 따른 경력의 평균을 이원 분산분석을 통해 알아보고자 한다. 분산분석 결과 중 독립변수간 교호작용항목의 p-value를 확인하고 이를 반올림하여 소수점 셋째 자리까지 출력하시오.

※ 성별이 결측이거나 "Other"인 행은 모두 제거한다.
※ 경력이 1년 미만의 경우 0, 20년 초과의 경우 21로 변경하고 분석을 실시하시오.
※ statsmodels의 ols()와 anova_lm() 함수를 사용하시오.
(출력 예시: 0.123)

import pandas as pd
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

df = pd.read_csv("./HR_survey_10k.csv")
df_q5 = df[["gender", "edu_level", "exp"]].dropna().reset_index(drop = True).copy()
df_q5 = df_q5.loc[df_q5["gender"] != "Other", ]
df_q5.loc[df_q5["exp"] == "<1",  "exp"] = 0
df_q5.loc[df_q5["exp"] == ">20", "exp"] = 21
df_q5["exp"] = df_q5["exp"].astype("int")
formula = "exp ~ edu_level * gender"
model = ols(formula, data = df_q5).fit()
model_sum = anova_lm(model)

def solution():
    print(round(model_sum.iloc[2, 4], 3))

2급

1. df 객체의 stn_1과 stn_2의 결측치를 제거한 후 df_not_na 객체에 저장하고 해당 객체의 row 개수를 출력하시오

import pandas as pd

df = pd.read_csv("./water_BOD.csv")
df_not_na = df.loc[df["stn_1"].notna() & df["stn_2"].notna(), ]

def solution():
    print(len(df_not_na))

2. df 객체의 BOD 변수의 제 99 백분위수를 반올림하여 소수점 둘째 자리까지 출력하시오.

import pandas as pd
df = pd.read_csv("./water_BOD.csv")

def solution():
    print(df["BOD"].quantile(0.99).round(2))

3. 1번 관측소(stn_1)와 2번 관측소(stn_2)의 Pearson's 상관계수를 구하고 그 값을 반올림하여 소수점 둘째 자리까지 출력하시오.

※ 필요시 각 변수의 결측치를 제거하고 상관계수를 산출하시오

import pandas as pd
df = pd.read_csv("./water_BOD.csv")
df_corr = df[["stn_1", "stn_2"]].corr()

def solution():
    print(round(df_corr.iloc[0, 1], 2))

4. df 객체의 BOD변수를 종속변수로 하고 1번 관측소(stn_1)와 2번 관측소(stn_2) 데이터를 독립변수로 하여 다중선형회귀를 실시하고 결정계수를 반올림하여 소수점 둘째 자리까지 표기하시오.

※ statsmodels.formula.api의 ols() 함수를 활용하여 다중선형회귀를 실시하시오.
※ 필요시 각 변수의 결측치를 제거하고 분석을 실시하시오.

import pandas as pd
df = pd.read_csv("./water_BOD.csv")

from statsmodels.formula.api import ols

df_not_na = df.loc[df["stn_1"].notna() & df["stn_2"].notna(), ]
model_2 = ols("BOD ~ stn_1 + stn_2", data = df_not_na).fit()

def solution():
    print(round(model_2.rsquared, 2))

5. 타국으로 인구 유출이 일어나지만 전년 대비 인구가 증가한 국가는 몇 개 인가?

※ Migrants 변수와 NetChange를 참고하며 음수는 감소 또는 유출을 뜻한다.

import pandas as pd
df = pd.read_csv("./asia_countries_population_2020.csv")

def solution():
    print(sum((df["Migrants"] < 0) & (df["NetChange"] > 0)))

6. 도회지의 인구 비율(UrbanPop)이 50이하인 국가와 그렇지 않은 국가의 중위 나이(MedAge)는 유의미한 차이가 있는지 독립 2표본 t-검정으로 확인하고, 검정 결과의 p-value를 반올림하여 소수점 넷째 자리까지 출력하시오.

※ 가설검정시 별도의 값 지정이 없는 인자는 기본값을 사용하시오.
※ scipy.stats의 ttest_ind() 함수를 활용하시오.

import pandas as pd
df = pd.read_csv("./asia_countries_population_2020.csv")

from scipy.stats import ttest_ind
stat, p = ttest_ind(df.loc[df["UrbanPop"] <= 50, "MedAge"],
                    df.loc[df["UrbanPop"]  > 50, "MedAge"])

def solution():
    print(round(p, 4))

7. 각 국가의 인구(Population)와 국토 면적(LandArea) 정보를 활용하여 인구밀도(인구/면적)를 계산하고 가장 인구 밀도가 높은 국가의 인구밀도를 출력하시오.

※ asia_countries_population_2020.csv 파일과 asia_countries_territory_2020.csv 파일에 공통으로 기록된 국가의 정보만 활용하시오.
※ 인구밀도는 정수부분만 출력하시오.

import pandas as pd
df_pop = pd.read_csv("./asia_countries_population_2020.csv")
df_land = pd.read_csv("./asia_countries_territory_2020.csv")

df_join = df_pop.merge(df_land, left_on = "Country", right_on = "Country", how = "inner")
df_join["density"] = df_join["Population"] / df_join["LandArea"]

def solution():
    print(int(df_join["density"].max()))

8. 각 나라의 인구 정보를 기반으로 계층적 군집분석을 실시하고자 한다. 가장 큰 군집에 속하는 국가의 수는?

※ 군집분석시 별도의 값 지정이 없는 인자는 기본값을 사용하시오.
※ 군집 개수는 5개로 지정하고 국가명을 제외한 모든 변수를 사용하시오.
※ 결측치가 있는 경우 이를 제거하고 실시하시오.
※ sklearn.cluster의 AgglomerativeClustering 함수를 사용하시오.

import pandas as pd
df = pd.read_csv("./asia_countries_population_2020.csv")
df_not_na = df.dropna().reset_index(drop = True)

from sklearn.cluster import AgglomerativeClustering
model = AgglomerativeClustering(n_clusters = 5).fit(X = df_not_na.drop("Country", axis = 1))
df_not_na["cluster"] = model.labels_

def solution():
    print(df_not_na["cluster"].value_counts().max())

0개의 댓글