데이터 사이언스 단계

  1. 문제 정의하기
  2. 데이터 모으기
  3. 데이터 다듬기
  4. 데이터 분석하기
  5. 데이터 시각화 및 커뮤니케이션

문제 정의하기

해결하고자 하는 문제를 정의

이 단계에서는 해결하고자 하는 게 무엇인지, 언제까지 어떤 결과물을 얻을 것인지, 어떤 방식으로 데이터를 활용할 것인지 등을 설정

  • 목표 설정
  • 기간 설정
  • 평가 방법 설정
  • 필요한 데이터 설정

데이터 모으기

필요한 데이터를 모을 수 있는 방법 탐구

누군가 이미 모아 놓은 데이터를 그대로 사용할 수도 있고, 공공 기관 등에서 배포한 자료를 찾아 볼 수도 있고, 혹은 웹사이트에서 직접 데이터를 수집 가능

  • 웹 크롤링
  • 자료 모으기
  • 파일 읽고 쓰기

데이터 다듬기

데이터의 퀄리티를 높여서 의미 있는 분석이 가능하게끔 수정

“쓰레기를 넣으면 쓰레기가 나온다(garbage in, garbage out)”

  • 데이터 관찰하기
  • 데이터 오류 제거
  • 데이터 정리하기

데이터 분석하기

준비된 데이터로부터 의미 분석

  • 데이터 파악하기
  • 데이터 변형하기
  • 통계 분석
  • 인사이트 발견
  • 의미 도출

커뮤니케이션

분석 결과를 다른 사람들에게 전달

어떤 문제를 해결하려 했는지, 어떻게 데이터를 모았는지, 어떤 방식으로 어떤 인사이트를 얻었는지 등을 다른 사람들에게 전달

  • 다양한 시각화
  • 커뮤니케이션
  • 리포트

1. 숫자 3개 뽑기

모범 답안

from random import randint


def generate_numbers():
    numbers = []

    while len(numbers) < 3:
        num = randint(0, 9)
        if num not in numbers:
            numbers.append(num)

    print("0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.\n")
    return numbers

 

2. 숫자 예측하기

모범 답안

def take_guess():
    print("숫자 3개를 하나씩 차례대로 입력하세요.")

    new_guess = []
    while len(new_guess) < 3:
        new_num = int(input("{}번째 숫자를 입력하세요: ".format(len(new_guess) + 1)))

        if new_num < 0 or new_num > 9:
            print("범위를 벗어나는 숫자입니다. 다시 입력하세요.")
        elif new_num in new_guess:
            print("중복되는 숫자입니다. 다시 입력하세요.")
        else:
            new_guess.append(new_num)

    return new_guess

3. 점수 계산

모범 답안

def get_score(guesses, solution):
    strike_count = 0
    ball_count = 0

    for i in range(3):
        if guesses[i] == solution[i]:
            strike_count += 1
        elif guesses[i] in solution:
            ball_count += 1

    return strike_count, ball_count

# 테스트 코드
s_1, b_1 = get_score([2, 7, 4], [2, 4, 7])
print(s_1, b_1)

s_2, b_2 = get_score([7, 2, 4], [2, 4, 7])
print(s_2, b_2)

s_3, b_3 = get_score([0, 4, 7], [2, 4, 7])
print(s_3, b_3)

s_4, b_4 = get_score([2, 4, 7], [2, 4, 7])
print(s_4, b_4)

4. 완성본

모범 답안

from random import randint


def generate_numbers():
    numbers = []

    while len(numbers) < 3:
        new_number = randint(0, 9)
        if new_number not in numbers:
            numbers.append(new_number)

    return numbers


def take_guess():
    new_guess = []
    while len(new_guess) < 3:
        num = int(input("{}번째 수를 입력하세요: ".format(len(new_guess) + 1)))

        if num < 0 or num > 9:
            print("0에서 9까지의 수를 입력해 주세요!")
        elif num in new_guess:
            print("중복되는 숫자입니다. 다시 입력하세요.")
        else:
            new_guess.append(num)

    return new_guess


def get_score(guesses, solution):
    strike_count = 0
    ball_count = 0

    for i in range(3):
        if guesses[i] == solution[i]:
            strike_count += 1
        elif guesses[i] in solution:
            ball_count += 1

    return strike_count, ball_count


# 여기서부터 게임 시작!
ANSWER = generate_numbers()
tries = 0

while True:
    user_guess = take_guess()
    s, b = get_score(user_guess, ANSWER)

    print("{}S {}B\n".format(s, b))
    tries += 1

    if s == 3:
        break

print("축하합니다. {}번 만에 세 숫자의 값과 위치를 모두 맞추셨습니다.".format(tries))
 

 

- 번호 뽑기

모범 답안

from random import randint


def generate_numbers(n):
    numbers = []

    while len(numbers) < n:
        num = randint(1, 45)
        if num not in numbers:
            numbers.append(num)

    return numbers

# 테스트 코드
print(generate_numbers(6))

- 당첨 번호 뽑기

모범 답안

from random import randint


def generate_numbers(n):
    numbers = []

    while len(numbers) < n:
        num = randint(1, 45)
        if num not in numbers:
            numbers.append(num)

    return numbers

def draw_winning_numbers():
    winning_numbers = generate_numbers(7)
    return sorted(winning_numbers[:6]) + winning_numbers[6:]

- 겹치는 번호 개수 

1. 모법답안

from random import randint
def count_matching_numbers(numbers, winning_numbers):
    count = 0
    for num in numbers:
        if num in winning_numbers:
            count = count + 1
    return count
# 테스트 코드
print(count_matching_numbers([2, 7, 11, 14, 25, 40], [2, 11, 13, 14, 30, 35]))
print(count_matching_numbers([2, 7, 11, 14, 25, 40], [14]))

2. set 모듈

def count_matching_numbers(list_1, list_2):
    same_numbers = set(list_1)&set(list_2)
    return len(same_numbers)

# 테스트
print(count_matching_numbers([2, 7, 11, 14, 25, 40], [2, 11, 13, 14, 30, 35]))
print(count_matching_numbers([2, 7, 11, 14, 25, 40], [14]))

3. set 모듈 intersection 함수

def count_matching_numbers(list_1, list_2):
    # set모듈 intersection 함수
    same_numbers = list(set(list_1).intersection(list_2))
    print(set(list_1))
    return len(same_numbers)
    
print(count_matching_numbers([2, 7, 11, 14, 25, 40], [2, 11, 13, 14, 30, 35]))
print(count_matching_numbers([2, 7, 11, 14, 25, 40], [14]))

- 당첨금 확인

모범 답안

from random import randint


def count_matching_numbers(numbers, winning_numbers):
    count = 0

    for num in numbers:
        if num in winning_numbers:
            count = count + 1

    return count


def check(numbers, winning_numbers):
    count = count_matching_numbers(numbers, winning_numbers[:6])
    bonus_count = count_matching_numbers(numbers, winning_numbers[6:])

    if count == 6:
        return 1000000000
    elif count == 5 and bonus_count == 1:
        return 50000000
    elif count == 5:
        return 1000000
    elif count == 4:
        return 50000
    elif count == 3:
        return 5000
    else:
        return 0


print(check([2, 4, 11, 14, 25, 40], [4, 12, 14, 28, 40, 41, 6]))
print(check([2, 4, 11, 14, 25, 40], [2, 4, 10, 11, 14, 40, 25]))

1. 단어장 만들기

with open('vocabulary.txt', 'w') as f:
    while True:
        english_word = input('영어 단어를 입력하세요: ')    
        if english_word == 'q':
            break
        
        korean_word = input('한국어 뜻을 입력하세요: ')
        if korean_word == 'q':
            break
        
        f.write('{}: {}\n'.format(english_word, korean_word))

2. 단어 퀴즈

 

모범 답안

with open('vocabulary.txt', 'r') as f:
    for line in f:
        data = line.strip().split(": ")
        english_word, korean_word = data[0], data[1]
        
        # 유저 입력값 받기
        guess = input("{}: ".format(korean_word))
        
        # 정답 확인하기
        if guess == english_word:
            print("맞았습니다!\n")
        else:
            print("아쉽습니다. 정답은 {}입니다.\n".format(english_word))

3. 랜덤 퀴즈

모범 답안

import random

# 사전 만들기
vocab = {}
with open('vocabulary.txt', 'r') as f:
    for line in f:
        data = line.strip().split(": ")
        english_word, korean_word = data[0], data[1]
        vocab[english_word] = korean_word

# 목록 가져오기
keys = list(vocab.keys())

# 문제 내기
while True:
    # 랜덤한 문제 받아오기
    index = random.randint(0, len(keys) - 1)
    english_word = keys[index]
    korean_word = vocab[english_word]
    
    # 유저 입력값 받기
    guess = input("{}: ".format(korean_word))
    
    # 프로그램 끝내기
    if guess == 'q':
        break
    
    # 정답 확인하기
    if guess == english_word:
        print("정답입니다!\n")
    else:
        print("틀렸습니다. 정답은 {}입니다.\n".format(english_word))

'자동제어 > Python for robotics' 카테고리의 다른 글

숫자야구  (0) 2023.02.19
로또 시뮬레이션  (0) 2023.02.19
평균매출구하기(파일열기 모듈, strip, split 함수)  (0) 2023.02.19
숫자맞히기 게임  (0) 2023.02.19
datetime 모듈  (1) 2023.02.19
with open('data/chicken.txt','r') as f:
    margin = {}
    for line in f:
        margin_list = line.strip().split(': ')
        margin[margin_list[0]] = margin_list[1]
    total_margin = 0
    avg_margin = 0
    cnt = 0
    for i in margin.keys():
        total_margin += int(margin[i])
        cnt+=1
    print(total_margin/cnt)

모범 답안

with open('data/chicken.txt', 'r') as f:
    total_revenue = 0
    total_days = 0
    
    for line in f:
        data = line.strip().split(": ")
        revenue = int(data[1])  # 그날의 매출

        total_revenue += revenue
        total_days += 1

    print(total_revenue / total_days)

 

'자동제어 > Python for robotics' 카테고리의 다른 글

로또 시뮬레이션  (0) 2023.02.19
단어장 만들기(with open(), input(), break, .write()), 단어 퀴즈, 랜덤퀴즈  (0) 2023.02.19
숫자맞히기 게임  (0) 2023.02.19
datetime 모듈  (1) 2023.02.19
random 모듈  (0) 2023.02.19

1. 미완성

import random

# 여기에 코드를 작성하세요
random_num = random.randint(1, 20)
for i in range(4):
    guess = int(input(f'기회가 {4-i}번 남았습니다. 1-20 사이의 숫자를 맞혀 보세요:'))
    if guess != random_num:
        continue
    print(f'축하합니다. {4-i}번만에 숫자를 맞히셧습니다.')

모범 답안

import random

# 상수 정의
ANSWER = random.randint(1, 20)
NUM_TRIES = 4

# 변수 정의
guess = -1
tries = 0

while guess != ANSWER and tries < NUM_TRIES:
    guess = int(input("기회가 {}번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: ".format(NUM_TRIES - tries)))
    tries += 1    
    
    if ANSWER > guess:
        print("Up")
    elif ANSWER < guess:
        print("Down")

if guess == ANSWER:
    print("축하합니다. {}번 만에 숫자를 맞히셨습니다.".format(tries))
else:
    print("아쉽습니다. 정답은 {}입니다.".format(ANSWER))

3. 오류 예외 처리

다음은 try문에 else절을 사용한 간단한 예제

try:
    age=int(input('나이를 입력하세요: '))
except:
    print('입력이 정확하지 않습니다.')
else:
    if age <= 18:
        print('미성년자는 출입금지입니다.')
    else:
        print('환영합니다.')

만약 '나이를 입력하세요:' 라는 질문에 숫자가 아닌 다른 값을 입력하면 오류가 발생하여 '입력이 정확하지 않습니다.'라는 문장을 출력. 오류가 없을 경우에만 else절이 수행

4. break 활용

import random

correct = random.randint(1, 20)
cnt = 4

while cnt > 0:
    number = int(input(f'기회가 {cnt}번 남았습니다. 1-20 사이의 숫자를 맞혀보세요.'))
    if number == correct:
        print(f'축하합니다. {5-cnt}번 만에 숫자를 맞히셨습니다.')
        break
    elif number < correct and 1 <= number <=20:
        print('up')
        cnt -= 1
    elif number > correct and 1 <= number <=20:
        print('down')
        cnt -= 1
    else:
        print('올바르지 않은 값입니다.1-20 사이의 정수를 입력하세요.')
    if cnt == 0:
        print(f'아쉽군요. 정답은 {correct}입니다. 다시 도전하세요.')

 

 

+ Recent posts