[이솦] 파이선으로 배우는 AI 기초 05
- 파이썬은 다양한 자료형을 제공하여 인터넷 및 인공지능에서 널리 사용된다.
- 리스트, 딕셔너리 같은 컨테이너 타입은 여러 값이나 데이터 타입을 저장할 수 있다.
- 파이썬을 활용한 로또 번호 추출 및 빈도 높은 번호 선정 실습을 통해 파일 처리 및 데이터 분석 기능을 배운다.
파이썬이 인터넷이나 인공지능에서 사용되는 이유는 파이썬이라는 언어에서 제공해주는 다양한 자료형있기 때문이다. 다루는 자료 중에는 정형 데이터 라는것이 있는데 정형 데이터는 엑셀처럼 어떤 파입의 데이터가 들어 있는지 쉽게 파악이 가능하다.
컨테이너 타입을 배워야 하는데, 정형데이터 러치시 리스트 같은 컨테이터를 활용하기 때문이다. 파이썬에서는 리스트, 딕셔너리등 강력한 자료형이 있어서 다양한 방법으로 활용이 가능하다.
컨테이너
컨테이너는 변수 하나에 여러 개가 들어 갈수 있는 자료형이다. 다만 놓을때 조건에 따라서 LIst, Tuple, Dictionary 형태로 나누어진다. 데이터는 같은 데이터도 가능하고 다른 데이터도 가능하다.
리스트
리스트는 여러 가지 자료를 저장할수 있는 목록이다. 리스트 안에 들어가는 여러 가지 자료는 요소 (element)라고 부른다. 숫자 문자열 불린의 기본 자료형 어려개를 하나의 리스트에 저장할수 있다.
리스트의 문법 적요소는 대괄호[] 요소를 나열하며 각 요소는 쉼표(,)로 구분한다.
member=["국밥", 29, '대갈장군', 170,95,45]
print(member)
print(type (member))
이렇게 여러개의 값을 넣을수 있다. ( 글자는 따옴표 신경 쓰자) 한가지 데이터만 넣으면 괜지만 어려개의 자료가 들어가면 문자열과 숫자를 잘 구별해 줘야 한다.
그런데 리스트에서 원하는 요소는 어떻게 찾을까? 리스트레서 특정 요소를 찾는 것을 인덱싱 (indexing)이라고 한다.
member=["국밥", 29, '대갈장군', 170,95,45]
print(member[0])
0은 순서를 말하며 모든 언어에서는 0번부터 세기 시작한다. 마지막 값은 -1로 센다.
member=["국밥", 29, '대갈장군', 170,95,45]
membber[-1]=44
print(member[5])
리스트에서 데이터를 수정도 가능한다.
리스트 슬라이싱
슬라이싱(slicing)을 활용하면 리스트에서 요소의 일부를 선택해서 새로운 리스트 형식으로 사용할수 있다. 범위를 선택하며 콜론: 을 사용한다.
member=["국밥",29, '대갈장군', 170,95,45]
print(member[1:2])
1:2 라고 하면 1은 시작이고 2는 끝이지만, 2는 포함되지 않는다. 값은 29가 나온다.
member=["국밥",29, '대갈장군', 170,95,45]
print(member[1:])
이렇게 뒤쪽을 비워두면 끝까지 나온다.
member=["국밥",29, '대갈장군', 170,95,45]
print(member[:-1])
이렇게 하면 처음부터 마지막을 제외한 것이 출력된다.
member=["국밥",29, '대갈장군', 170,95,45]
print(member[:])
이렇게 하면 전체가 출력된다.
함수활용
함수를 활용해서 리스트의 값을 추가 하거나 변경도 가능하다.
member1 =["국밥맨", 29, '대갈장군']
member2 = ["국밥맨", 6, '대갈장군', 120, 40, 22]
member1.append(170)
member1.extend([95,75])
print(member1)
member1.append(member2)
print(member1)
member1.insert(6,280)
print(member1)
append를 쓰면 리스트에 데이터가 추가 가능하다.
extend를 쓰면 리스트 전체를 추가 가능하다. list라서 대괄호[]쓴것을 주의하자
이렇게 한 리스트를 다른 리스트안에 넣을수도 있다. 다만 append로 넣은 리스트는 하나의 요소로 인식된다.
insert는 인덱싱과 데이터가 다 가능하며 이렇게 하면 6번째 위치에 280을 넣는 것이다.
list_num= [1, 6, 7, 4, 5, 2, 3, 9, 8]
list_str = ['순대국밥', '콩나물', '소국밥']
list_num.sort(reverse=True )
list_str.sort(reverse=True)
print(list_num)
print(list_str)
소팅도 가능하며 순서를 반대로 하는 것도 가능하다.
list_num= [1, 6, 7, 4, 5, 2, 3, 9, 8]
print(max(list_num))
print(min(list_num))
print(sum(list_num))
이런식으로 최대, 최소, 더해 주는것도 가능하다. 문자열을 적용이 안된다.
다차원 인덱싱
머신러닝에서는 텐서를 사용하는데 일종의 행렬이다. 다차원 인덱싱을 할수 있어야 한다.
만약 2차원 일때는 data[0][0]으로 표기한다.
실습
로또 번호를 정해진 것에서 만들기
import random
randint = random.randrange(0, 4)
num_lotto = ['01 04 11 15 30 45', '08 09 14 23 41 43', '04 05 17 18 20 34', '18 19 21 31 34 45']
랜덤 라이브러리를 불러와서 randrage라는 함수를 활용해서 0-3번까지의 리스트 중에서 랜덤으로 선택하게 하는 코드 입니다 .
이걸 조금더 응용해서 인터넷에서 검색하면 지금까지의 로또 숫자 엑셀 데이터를 구할수 있다. 이걸 cvs로 변환해서 불러와 보자
!pip install pandas
import pandas as pd
from collections import Counter
# CSV 파일 불러오기
file_path = '/content/lotto.csv' # 실제 CSV 파일 경로로 변경
df = pd.read_csv(file_path)
# 데이터 확인
print(df.head())
# 2번째부터 7번째 행의 데이터를 추출
subset_df = df.iloc[1:7, 1:7] # 2번째부터 7번째 행, 각 행의 6개 번호 추출
# 데이터를 리스트로 변환하여 각 번호의 출현 빈도 계산
numbers = subset_df.values.flatten()
number_freq = Counter(numbers)
# 가장 빈도가 높은 5개의 번호 선택
top_5_numbers = number_freq.most_common(5)
# 리스트 형식으로 변환
top_5_list = [int(num) for num, freq in top_5_numbers]
# 각 행의 6개 번호 셋트를 의미
number_sets = subset_df.values.tolist()
print("각 행의 6개 번호 셋트:", number_sets)
# 가장 빈도가 높은 5개의 번호
print("가장 빈도가 높은 5개의 번호:", top_5_list)
가장 빈도가 높은 번호를 5개를 추려보고 그중에서 골라 보는 식으로(또는 5게임을 하는것도..) 수정했습니다.
액셀에는 B열부터 G열까지 번호가 있었습니다. 이것을 cvs 로 변환해서 데이터를 불러 들이고 가장 높은 데이터를 불러와서 가장 높은 5개의 리스트를 만들고 출력하는 것입니다.
번호는 생략합니다. ㅎㅎ