인사말

안녕하세요~!

월요일이 다시 찾아왔습니다 😂

이번 주부터는 확연한 겨울 같은 날씨가 되었네요

감기 조심하세요!

비염도 조심하시구요 ㅠㅠ

저는 아침부터 비염 때문에 목도 따갑고 코도 간지러워서

마스크 끼고 활동했답니다 😢

오늘의 일정
오전(09:00 ~ 13:00) 09:00 ~ 09:50 코드카타 2문제 풀기
10:00 ~ 10:15 팀 회의 및 코드카타 리뷰
10:15 ~13:00 머신러닝 강의 듣기 및 실습
오후(14:00 ~ 18:00) 14:00 ~ 16:00 통계학 Zoom 실시간 강의 듣기
16:00 ~ 18:00 머신러닝 강의 듣기 및 실습
저녁(19:30 ~ 21:00) 19:30 ~ 20:00 팀 저녁 회의
20:00 ~ 20:50 프로그래머스 4일차 문제 풀기
20:50 ~ 21:00 TIL 제출

요약

  1. 코드 카타 문제 풀이
    1. 두 수의 차
    2. 두 수의 곱
  2. 머신러닝 결측값 처리
    1. 제거
    2. 대체
  3. 프로그래머스 4문제 풀이

 


오전 (09:00 ~ 13:00)

오늘부터 시작되는 코드 카타!

문제를 두 개 풀어주고 팀원분들과 대화 및 회의를 진행 해주었어요

<두 수의 차>

def solution(num1, num2):
    answer = num1 - num2
    return answer

두 수의 차를 구해야 하니까 

연산 함수인 - 를 써서 해결해주었답니다 😋

 

<두 수의 곱>

def solution(num1, num2):
    answer = num1 * num2
    return answer

이번에는 곱을 구하는 거기 때문에

곱하기의 연산 기호인 *를 써서 풀어주었습니다 😋

하루를 문제로 시작하니까 재밌고 좋네요 ㅎㅎ

 

(10:15 ~ 13:00) 머신러닝 강의 듣기 및 실습

결측값 처리하는 실습을 해보았어요

이제 시작점인 건데, 결괏값이 잘 나와가지고

기분이 좋았던 거 있죠? 😋

사람은, 단순해야 행복함을 잘 느낄 수 있게 되는 거 같아요

 

<결측값 처리 방법 3가지>

종류 설명 함수 함수 설명
제거
결측값이 포함된 행 또는 열을 제거 df.dropped_rows
= df.dropna()
결측값이 포함된 제거
df_dropped_cols
= df.dropna(axis=1)
결측값이 포함된 제거
대체
결측값을 특정 값으로 대체 df_filled
= df.fillna(0)
결측값을 0으로 대체
df_filled_mean
= df.fillna(df.mean())
결측값을 각 열의 평균값으로 대체
df_filled_median
= df.fillna(df.median())
결측값을 각 열의 중간값으로 대체
df_filled_mode
= df.fillna(df.mode().iloc[0])
결측값을 각 열의 최빈값으로 대체
예측
머신러닝 모델을 사용하여 결측값을 예측 from sklearn.linear_model
import LinearRegression
 
df_with_na
= df[df['column_with_na'].isnull()]
df_without_na
= df[df['column_with_na'].notnull()]
결측값이 있는 열과 없는 열 분리
model = LinearRegression()
model.fit(df_without_na[['feature1', 'feature2']],
df_without_na['column_with_na'])
회귀 모델 학습
predicted_values
= model.predict(df_with_na[['feature1', 'feature2']])
결측값 예측
df.loc[df['column_with_na'].isnull(), 'column_with_na']
= predicted_values
예측된 값으로 결측값 대체

 

세 가지 다 해보았어요

<결측값 제거>

data = {
    'A': [1, 2, np.nan, 4, 5, 100, 1, 2, 2, 4, '1', '2', '3', '4', '5', 10, 20, 30, 40, 50],
    'B': [5, np.nan, np.nan, 8, 10, 60, 10, 20, 20, 40, '10', '20', '30', '40', '50', 5, 4, 3, 2, 1],
    'C': [1, 2, 3, 4, 5, 5, 100, 200, 200, 400, 100, 200, 300, 400, 500, 1, 2, 3, 4, 5],
    'D': [np.nan, np.nan, 3, 3, 3, 5, 5, 5, 5, 5, np.nan, np.nan, np.nan, np.nan, np.nan, 2, 3, 4, 5, 6],
    'category_column': [np.nan]*10 + ['A', 'B', 'A', 'C', 'B'] + [np.nan]*5,
    'value_column': [np.nan]*10 + [1, 2, 3, 4, 5] + [np.nan]*5,
    'target': [np.nan]*15 + [1, 0, 1, 0, 1]
    }

일단 데이터 값이 되어줄 정보를 넣어주고요

# Nan이 있는 행 삭제하기
df_dropped_rows = df.dropna()
print(df_dropped_rows)
Columns: [A, B, C, D, category_column, value_column, target]
Index: []

결괏값이 이렇게 나왔어요

행을 하나하나 다시 봤는데

NaN가 없는 행이 없더라구요,,?

강의 내용과는 다른 결괏값이 나와서 동공지진 일어났어요

 

이어서 열도 삭제 해보았습니다

# Nan이 있는 열 삭제하기
df_dropped_cols = df.dropna(axis=1)
print(df_dropped_cols)

여기서 열은 .dropna(axis=1)만 추가해주면 되더라구요

결괏값도 잘 나온 걸 확인할 수 있었습니다 ㅎㅎ

 

제거 방법을 쓰면 데이터가 많이 날아가기 때문에

제거를 쓰기 보다는 대체랑 예측을 많이 쓴다고 합니다!

확실히 제거를 해버리니까

그 많던 자료가 싹- 사라졌네요 ㄷㄷ

 

<결측값 대체>

# 결측값을 0으로 대체
df_filled = df.fillna(0)

# 결측값을 각 열의 평균값으로 대체
df_filled_mean = df.fillna(df.mean())

# 결측값을 각 열의 중간값으로 대체
df_filled_median = df.fillna(df.median())

# 결측값을 각 열의 최빈값으로 대체
df_filled_mode = df.fillna(df.mode().iloc[0])

대체를 하는 경우는 데이터 타입을 봐야 된대요

평균값으로 대체할 거라고 해도

문자열로 돼 있으면 오류가 발생한다고 하더라구요

데이터 파일의 타입을 확인한 후에

적절한 코드로 대체 해주시면 되겠습니다!

이번 자료에는 0으로 채워주었습니다 히히

 

<결측값 예측>

from sklearn.linear_model import LinearRegression

# 결측값이 있는 열과 없는 열 분리
df_with_na = df[df['column_with_na'].isnull()]
df_without_na = df[df['column_with_na'].notnull()]

# 회귀 모델 학습
model = LinearRegression()
model.fit(df_without_na[['feature1', 'feature2']], df_without_na['column_with_na'])

# 결측값 예측
predicted_values = model.predict(df_with_na[['feature1', 'feature2']])

# 예측된 값으로 결측값 대체
df.loc[df['column_with_na'].isnull(), 'column_with_na'] = predicted_values

예측은 머신러닝으로 하는 거래서

실습으론 해보지 않았습니다

강사님도 하시는 걸 안 보여주셔서

저도 못해봤어요,, 😢


오후 ( 14 : 00 ~ 18 : 00 )

 

(14:00 ~ 16:00)

14시부터 16시까지는 통계학 Zoom 수업을 들었어요!

오랜만에 벡터랑 함수를 들으니까 반가웠어요

저의 나이 때는 행렬이 교육과정이 변경되면서

없어진 내용이었나 봐요,, 🤔

행렬이 나오면서 신기한 느낌이었어요

그래도 듣다보니까 이해가 가긴 하더라구요!

2x3 이랑 3x3의 구조를 곱할 때는

조금 버거워지기 시작했지만

다시 집중해서 보니까 이해가 가더라구요!

아직까진 머신러닝과 무슨 연관이 있는지는 깨닫지 못했어요

내일도 통계학 특강이 있을 예정이니,

꼼꼼히 집중해서 들어보려구요!

 

(16:00 ~ 17:00)

내일 해볼 이상치 처리 방법을 미리 보고 있었어요

음,, 강의를 보면서 따라 해보는 건 좋지만

말 그대로 따라해본다는 느낌이고,

머리로는 들어오지 않아서 걱정이에요

그래서 미리 강의 자료를 정독해서 이해하려 하는데

머신러닝에 대해서 개념이 자리 잡혀있진 않나봐요

연관이 있으니까 배운다는 건 알겠는데

음,, 딱 거기까지밖에 생각이 미치네요

머신러닝 다시 봐야겠어요

 

(17:00 ~ 18:00)

다른 교육생분들과 잠시 얘기를 나눈 후

저녁 먹으러 갔습니당 😋


저녁( 19 : 30 ~ 21 : 00)

팀 저녁 회의를 해준 후에 TIL 수정을 마친 후

프로그래머스 4일차 문제를 풀어보았어용

 

<피자 나눠먹기 (1)>

def solution(n):
    if n % 7 == 0:
        answer = n/7
    elif n % 7 != 0:
        answer = n/7 +1
    return int(answer)

주어진 피자 한 판에 7조각이 있으니까

딱맞아 떨어지면 피자 한 판이 더 필요할 일이 없죠

근데 7조각으로 나눴을 때 나머지가 생긴다면

피자 한 조각이 더 필요할 테니까

한 판 더 시켜야겠죠~?

이렇게 끝내고 나면 쉬운 거를

문제 풀 땐 왜 이리 생각 안 나고 막막한 건지!!!

너무 열받아요!!!!! 😫

 

<피자 나누기 (2)>

def solution(n):
    pizza_piece = 6
    
    while True:
        if pizza_piece % n != 0:
            pizza_piece = pizza_piece +6

        elif pizza_piece % n == 0:
            answer = pizza_piece/6
            break
    return int(answer)

이제는 피자가 6조각이구요 사람 수만 바껴요

그럼 6조각을 고정으로 사람 수에 알맞게

늘려줘야겠죠?

def solution(n):
    pizza_piece = 6

그래서 피자 조각은 6개로 할당 해주구요

    while True:
        if pizza_piece % n != 0:
            pizza_piece = pizza_piece +6

만약

피자 조각을 사람 수로 나누었을 때

딱맞아 떨어지지 않으면!?!?!?

기존에 있던 6조각에다가 한 판을 더 추가해줘야죠

피자 조각을 기준으로 삼았기 때문에 +6을 해줍니다 😎

        elif pizza_piece % n == 0:
            answer = pizza_piece/6
            break
    return int(answer)

자 이제 다른 조건도 봐야죠

이전에는 6조각으로 나누어지지 않으면이었으니까

이번엔 딱맞아 떨어지는 조건으로 주고

break를 넣어주었습니다

왜냐!?

n은 100까지라는 범위가 주어졌구요

6으로 나누었을 때 딱맞아 떨어지는 것도

100 안에서 한계가 있잖아요

게다가 while문이라서 멈추어줄 함수가 필요하답니당 😋

 

<피자 나누기 (3)>

def solution(slice, n):
    1 < slice < 11
    
    if n % slice != 0:
        answer = 1
    else:
        answer = 0
    
    return answer + n // slice

이번에는 피자를 2조각 ~ 10조각으로만 잘라준대요

그 잘리는 조각을 slice로 이름 지어줬구요

마찬가지로 사람 수는 n으로 할당되었습니다

    if n % slice != 0:
        answer = 1
    else:
        answer = 0

앞서 slice의 값은 계속 변하죠?

원하는 조각 수로 잘라준다고 했으니까요

그렇기 때문에 사람 수에다가 조각 수를 나누어줍니다

이 나눈 값에 나머지가 생긴다면

피자 수가 부족하다는 말이니까 한 판 더 추가시켜야 합니다

여기서 answer은 피자 한 판을 의미합니다

else로는 나누었을 때 0이 되는 애들은

한 판을 추가할 필요가 없으니까 answer = 0으로 둘게요

    return answer + n // slice

그리고 최종적으로

n // slice 사람 수에다가 조각만큼 나누었을 때의 몫을 구해줘요

왜냐구요?

그래야 몇 판 먹었는지 알 수 있거든요 😄

거기에다가 answer 값을 더해주면

원하는 결괏값이 나온답니당

 

return n // slice + (1 if n % slice != 0 else 0)

구석에서 TIL 작성하면서 다시 재검토 중이었는데

다른 동기분들이 오셔서 알려주고 가셨어요 🤣

삼항 연산자로는 이렇게 코드를 완성한다고 하네요

 

<배열의 평균값>

def solution(numbers):
    
    answer = sum(numbers) / len(numbers)
    return answer

파이썬에는 평균을 구하는 함수가 없어서

이렇게 구해주시면 됩니다 :)

끝끝!!

캬~~~


마무리

오늘 늦게까지 했어요!! (현재시각 23:23)

오늘 해야 할 거를 내일로 미루지 않아서 기분이 좋아요 히히

한 번 미루기 시작하면 계속 밀리기 때문에!!

오늘 내로 끝내서 기분 좋습니다 아주 만족스러워요 🤑

문제 풀 수 있도록 도와주신 주변분들,,

감삼다,, (넙죽넙죽) 덕분에 살아가네요 히히

오늘 할 일 끝!!

감사합니다~ 😁

+ Recent posts