내일배움캠프/TIL

[TIL]250116_파이썬 베이직 4회차 복습, 개인과제 문제6

dydatablog 2025. 1. 16. 21:15

FACTS :

  • ✅ 오전 SQL 코드카타 1문
  • ✅ 오전 파이썬 베이직 라이브세션 복습
  • 🔺 오후 통계학 라이브세션 복습 → 통계학 개념 정리 → ~ing
  • ✅ 오후 개인과제 문제6
  • [ ] 오후 파이썬 300제
  • [ ] 오후 머신러닝 VOD강의 심화 1주차

FEELINGS : 처음으로 QCC가 끝나고 팀원들끼리 각자 푼 코드를 공유해봤는데 다 못 풀거나 틀린 답이더라도 공유하면서 여러가지 방법론이나 어떻게 해결할 수 있을지 찾아주는 과정이 의미있었다. 그동안 나는 완벽하고 정답인 코드가 아니면 공유하는게 부끄러웠는데 어디선가 본 것처럼 창피함을 견뎌내야 성장한다는 말이 어떤것인지 체감하게된 날이었다.

⭐️부끄러움을 견디고 많은 사람과 공유해가면서 보완해야할 부분을 찾아야겠다.

 

- FINDINGS :

[SQL] 참고가 됐던 주석 처리 내용 :

  • -- 조회: 컬럼이름
    -- 조건: 리뷰를 가장 많이 작성한 회원들, 
    -- 정렬: 리뷰작성일 asc, 리뷰 텍스트 asc

[DBeaver 단축키] Ctrl + \ : 결과값 새로운 탭에서 실행 (※ commend 아님 주의)

[DBeaver]  Ctrl + \  : 결과값 새로운 탭에서 실행

 


파이썬 베이직 4회차 복습

문제1

1. Iris 데이터셋을 불러옵니다.
2. sepal_length가 평균보다 큰 데이터와 평균보다 작은 데이터를 각각 필터링하여 두 개의 데이터프레임을 만드세요.
3. 새로운 열 category를 추가하여 각 행이 'above_average'인지 'below_average'인지 표시하세요.
4. 위 두 데이터프레임을 concat을 사용하여 하나로 합칩니다. 
(category가 above_average인 데이터 프레임 → category가 below_average인 데이터프레임 순서)
5. 최종 데이터프레임 concat_df의 50, 120번째 행을 출력하세요.

* `조건` : concat을 사용할 때, ignore_index=True 옵션을 추가하여 인덱스를 재설정하세요.


2번에서 각각 데이터프레임을 만든다는 부분이 이해가 잘 안가서 if 조건문을 써서 3번을 먼저 해보려고했다.

# Iris 데이터셋 로드
iris = sns.load_dataset("iris")

# sepal_length가 평균보다 큰 데이터와 평균보다 작은 데이터를 각각 필터링하여 두 개의 데이터프레임을 만드세요.-> ??

# sepal_length의 평균
len_mean = iris['sepal_length'].mean().round(1) 

# 각 행이 평균보다 큰지 판단하여 return하는 함수
def com(length):
    if length > len_mean:
        return 'above_average'
    else:
        return 'below_average'

# 위 함수 결과를 새로운 컬럼에 표시
iris['category'] = iris['sepal_length'].apply(com)
iris

# 최종 데이터프레임 출력
print(iris.iloc[50])
print(iris.iloc[120])

그런데 이렇게 풀어버리니까 4,5번 조건을 수행하지 않게 되고... 결과값도 달라지기 때문에 다시 처음부터...

# 정답 코드
# Iris 데이터셋 로드
iris = sns.load_dataset("iris")

# sepal_length의 평균
len_mean = iris['sepal_length'].mean()

# sepal_length가 평균보다 큰 데이터와 평균보다 작은 데이터를 각각 필터링하여 두 개의 데이터프레임을 만드세요.
#  평균보다 큰 데이터프레임
above_average = iris[iris['sepal_length'] > len_mean]
#  평균보다 작은 데이터프레임
below_average = iris[iris['sepal_length'] < len_mean]

#새로운 열 category를 추가하여 각 행이 'above_average'인지 'below_average'인지 표시
above_average['category'] = "above_average"
below_average['category'] = "below_average"

# category가 above_average인 데이터 프레임 → category가 below_average인 데이터프레임 순서로 합치기
# `조건` : concat을 사용할 때, ignore_index=True 옵션을 추가하여 인덱스를 재설정하세요.
concat_df = pd.concat([above_average, below_average], ignore_index=True)
concat_df

# 최종 데이터프레임 출력
print(concat_df.iloc[50])
print(concat_df.iloc[120])

‼️헷갈리는 것 주의!! :

  • concat([데이터프레임, 데이터프레임]) -> [ ] 잊지말기!!
  • pd.concat([above_average, below_average], ignore_index=True) - []안에 데이터프레임 작성, axis = 0 기본 값, ignore_index 사용

 

문제2

Iris 데이터셋과 새로운 데이터프레임을 활용하여 다음을 수행하세요:

- 1) Iris 데이터셋을 불러옵니다.

- 2) species별 평균 petal_length와 평균 petal_width를 계산하여 새로운 데이터프레임 species_avg를 만드세요. reset_index()를 사용하여, index를 재지정하세요.

- 3) 데이터프레임의 열 이름은 species, avg_petal_length, avg_petal_width로 지정합니다. species_avg와 원래의 Iris 데이터셋을 merge를 사용해 species를 기준으로 병합하세요.

- 4) 최종 데이터프레임 concat_df의 10, 50, 120번째 행을 출력하세요.

* 힌트 - groupby()와 mean()을 사용하여 그룹별 평균을 계산하세요. - merge에서 on 인자를 사용해 공통 열(species)을 기준으로 병합하세요.

# 문제2
# Iris 데이터셋 로드
iris = sns.load_dataset("iris")

#species별 평균 petal_length와 평균 petal_width를 계산하여 새로운 데이터프레임 species_avg생성 
# reset_index()를 사용하여 index를 재지정
species_avg = iris.groupby('species')[['petal_length','petal_width']].mean().reset_index()
#데이터프레임의 열 이름은 species, avg_petal_length, avg_petal_width로 지정
species_avg = species_avg.rename(columns= {'petal_length':'avg_petal_length','petal_width':'avg_petal_width'})
species_avg
#species_avg와 원래의 Iris 데이터셋을 merge를 사용해 species를 기준으로 병합
merged_df = pd.merge(iris, species_avg, on= 'species')
merged_df

# 결과 출력
print(merged_df.iloc[10])
print(merged_df.iloc[50])
print(merged_df.iloc[120])

 

#정답 코드
import seaborn as sns
import pandas as pd

# Iris 데이터셋 로드
iris = sns.load_dataset("iris")

# species별 평균 petal_length와 petal_width 계산
species_avg = iris.groupby("species")[["petal_length", "petal_width"]].mean().reset_index()
species_avg.rename(columns={"petal_length": "avg_petal_length", 
							"petal_width": "avg_petal_width"}, inplace=True)

# 원래 데이터셋과 병합
merged_df = pd.merge(iris, species_avg, on="species")

# 정답 출력
print(merged_df.iloc[10])
print(merged_df.iloc[50])
print(merged_df.iloc[120])

‼️헷갈리는 것 주의!! :

  • .rename()에서 {”old_column”:”new_column”}의 형태 / inplace=True로 원본 데이터 바꿔주기
  • iris.groupby("species")[["petal_length", "petal_width"]].mean().reset_index() - reset_index()의 사용
  • -> 안했을 경우 species가 인덱스 값이 되어버려서 뒤에서 species를 컬럼값으로 가져오려고 할 때 에러가 남.

 

.reset_index 안했을 시

 

reset_index 했을 시

 


문제6 : 중심극한정리(CLT)

- `numpy.choice` 함수를 이용하여 각 분포 평균을 내고 이를 500번 반복하여 표본 평균을 생성해 봅시다. (ex `bionmial_data` 에서 30개씩 뽑아 500번 반복)
- 표본의 평균들을 히스토그램으로 시각화여 정규분포를 따르는지 확인해봅시다.
- 변수
- `num_samples` : 표본추출할 횟수
- `sample_means`: 딕셔너리 자료형으로 **Binomal**, **Uniform**, **Normal** 의 Key값을 가지며 해당하는 values들은 각 30개씩 복원추출하여 뽑은 샘플의 평균 값을 저장. 이를 총 500번 진행

 

num_samples = 500
sample_means = {
    "Binomial": [],
    "Uniform": [],
    "Normal": []
}

for i in range(num_samples): # 500번 동안 반복
    binomial_rand = np.random.choice(binomial_data, size= 30) #bionmial_data에서 무작위 30개 추출
    binomial_mean = binomial_rand.mean()
    sample_means["Binomial"].append(binomial_mean)

    uniform_rand = np.random.choice(uniform_data, size= 30) #uniform_data에서 무작위 30개 추출
    uniform_mean =  uniform_rand.mean()
    sample_means["Uniform"].append(uniform_mean)

    normal_rand = np.random.choice(normal_data, size= 30) #normal_data에서 무작위 30개 추출
    normal_mean = normal_rand.mean()
    sample_means["Normal"].append(normal_mean)

# sample_means

# 시각화
plt.figure(figsize=(15, 5))

plt.subplot(131)
plt.hist(sample_means["Binomial"], color='blue', bins=20)
plt.title("Sample Mean Distribution (Binomial)")
plt.xlabel("Mean Value")
plt.ylabel("Frequency")

plt.subplot(132)
plt.hist(sample_means["Uniform"], color='green', bins=20)
plt.title("Sample Mean Distribution (Uniform)")
plt.xlabel("Mean Value")
plt.ylabel("Frequency")

plt.subplot(133)
plt.hist(sample_means["Normal"], color='red', bins=20)
plt.title("Sample Mean Distribution (Normal)")
plt.xlabel("Mean Value")
plt.ylabel("Frequency")

출력 결과