출처: https://astrocosmos.tistory.com/202 [ASTROCOSMOS:티스토리] '분류 전체보기' 카테고리의 글 목록 (12 Page) :: 하나둘셋넷
728x90

SQL IS_NULL] NULL 처리하기

 

 

-- 코드를 입력하세요
SELECT ANIMAL_TYPE, IFNULL(NAME, 'No name') AS NAME, SEX_UPON_INTAKE
    FROM ANIMAL_INS
    ORDER BY ANIMAL_ID;

 

 

728x90
728x90

SQL GROUP BY] 즐겨찾기가 가장 많은 식당 정보 출력하기

 

1] FOOD_TYPE 별로 가장 인기가 많은 MAX(FAVORITES) 테이블 만들기

SELECT FOOD_TYPE, MAX(FAVORITES) AS MaxFavorites
        FROM REST_INFO
        GROUP BY FOOD_TYPE

 

 

(1) FROM REST_INFO

(2) GROUP BY FOOD_TYPE

 

 

2] 기존 테이블과 INNER JOIN

-- 코드를 입력하세요
SELECT r.FOOD_TYPE, r.REST_ID, r.REST_NAME, r.FAVORITES
    FROM REST_INFO r
    INNER JOIN(
        
        SELECT FOOD_TYPE, MAX(FAVORITES) AS MaxFavorites
        FROM REST_INFO
        GROUP BY FOOD_TYPE
        
    ) AS max_res ON r.FOOD_TYPE = max_res.FOOD_TYPE 
                    AND r.FAVORITES = max_res.MaxFavorites
    ORDER BY r.FOOD_TYPE DESC;

 

 

(1) FOOD_TYPE이 같고, 기존 테이블 FAVORITES =  최대값 테이블 MaxFavorites 같도록 합친다.

 

주의

-- 코드를 입력하세요
SELECT r.FOOD_TYPE, r.REST_ID, r.REST_NAME, MAX(r.FAVORITES)
    FROM REST_INFO r    
    GROUP BY r.FOOD_TYPE

 

GROUP BY에 속하지 않은 모든 컬럼은 집계 함수 내에 있어야 한다.

 

728x90
728x90

python 기법] 파일 읽고 쓰기

 

홈 디렉토리 확인, 작업 디렉토리 확인, 디렉토리 내용 확인

# 홈 디렉토리 확인
from pathlib import Path

print(Path.home())

# 작업 디렉토리 확인
from pathlib import Path

print(Path.cwd())

# 디렉토리 내용 확인
from pathlib import Path

files = Path.cwd().glob('*')
for f in files:
    print(f)

 

기본적인 파일 읽고 쓰기

파일 쓰기

# 파일 열기
f = open('MyFile.txt', 'w')

# 파일 쓰기
f.write('안녕하세요?\n')

# 파일 닫기
f.close()

 

디렉토리 만들기

# 디렉토리 만들기
Path('Files').mkdir(exist_ok=True)

 

파일 열기, 쓰기, 닫기

# 파일 열기
f = open('Files/MyFile.txt', 'w')

# 파일 쓰기
f.write('모두들 안녕하세요?\n')

# 파일 닫기
f.close()

 

파일 읽기

# 파일 열기
f = open('MyFile.txt', 'r')

# 내용 읽기
print(f.read())

# 파일 닫기
f.close()

 

경로 지정해서 읽기

# 파일 열기
f = open('Files/MyFile.txt', 'r')

# 내용 읽기
print(f.read())

# 파일 닫기
f.close()

 

파일 내용 추가

# 파일 열기
f = open('MyFile.txt', 'a')

# 내용 추가
f.write('만나서 반갑습니다!')

# 파일 닫기
f.close()

 

x 모드, 같은 파일이 있으면 오류 발생

# 파일 열기 
f = open('MyFile.txt', 'x')

# 내용 쓰기
f.write('만나서 반갑습니다!')

# 파일 닫기
f.close()

 

# 오류 핸들링
try: 
    f = open('MyFile.txt', 'x')
    f.write('만나서 반갑습니다!')
    f.close()
except FileExistsError:     #  이미 파일이 있으면
    print('같은 이름의 파일이 있습니다.')
else:                       # 그렇지 않으면
    print('파일 쓰기 성공했습니다.')
finally:                    # 마무리
    print('수고하셨습니다.')

 

 

 

파일 다루기 실습

 

python 파일 만들기

# 파일 열기
f = open('Python.txt', 'w')

 

내용 입력

# 내용 쓰기
f.write('''<파이썬과 나>  
시인: 홍길동''')

# 파일 닫기
f.close()

 

내용 추가

# 파일 열기
f = open('Python.txt', 'a')

# 내용 추가
f.write('''
어느날 
파이썬이 나에게 왔다.
많이 낯설었다.
지금은 나와 하나가 되었다.
파이썬이 나고,
내가 파이썬이다.''')

# 파일 닫기
f.close()

 

ㆍ f = open('Python.txt', 'a')에서 'a'는 파일을 "추가 모드(append mode)"로 열기 위한 파일 모드

 

writelines()

# 파일 여러 줄 쓰기
hello = ['안녕하세요?\n', '만나서 반갑습니다!\n', '우리 사이좋게 잘 지내요.\n']
f = open('MyFile.txt', 'w')
f.writelines(hello)
f.close()

 

내용 확인

# 파일 읽기
f =  open('MyFile.txt', 'r') 
print(f.read())
f.close()

 

readlines()

# 파일 한 번에 읽기
f = open('MyFile.txt', 'r')
result = f.readlines()
f.close()

# 내용 확인
print(result)
# 반복문으로 한 행씩 표시
for txt in result:
    print(txt, end='')

 

readline()

ㆍ 행 단위로 읽기

# 파일 읽기
f = open('MyFile.txt', 'r')

# 내용 읽기
print(f.readline(), end='')
print(f.readline(), end='')
print(f.readline(), end='')

# 파일 닫기
f.close()

 

ㆍ 반복문을 이용해 모든 행 읽기

# 파일 읽기
f = open('MyFile.txt', 'r')
result = f.readline()

# 반복문으로 한 행씩 읽어 표시
while result:
    print(result, end='')
    result = f.readline()

# 파일 닫기
f.close()

 

 

728x90

'Python 기법' 카테고리의 다른 글

python 기법] 워드 클라우드  (1) 2023.12.03
python 기법] 이메일  (0) 2023.11.29
728x90

python 기법] 워드 클라우드

 

텍스트 전처리

ㆍ 파일 읽기, 내용 확인

# 파일 읽기
file = open('Dream.txt', 'r', encoding='UTF-8')
text = file.read() 
file.close()

# 확인(100 글자만)
text[:100]

 

ㆍ split() 메소드를 이용하여 단어 단위로 잘라 리스트 형태로 만들기

# 공백을 구분자로 하여 단어 단위로 자르기
wordList = text.split()

# 확인(10 개만)
wordList[:10]

 

 

단어별 빈도수 계산하여 딕셔너리에 저장

# 중복 단어 제거
worduniq = set(wordList)

# 딕셔너리 선언
wordCount = {}

# 단어별 개수 저장
for w in worduniq:
    wordCount[w] = wordList.count(w)

# 제외 대상 조사 
del_word = ['the','a','is','are', 'not','of','on','that','this','and','be','to', 'from']

# 제외하기
for w in del_word:
    if w in wordCount:
        del wordCount[w]

 

 

워드 클라우드 그리기

# 패키지 설치
!pip install wordcloud

# 라이브러리 불러오기
import matplotlib.pyplot as plt
from wordcloud import WordCloud
%config InlineBackend.figure_format='retina'

# 워드 클라우드 만들기
wordcloud = WordCloud(font_path = 'C:/Windiws/fonts/HMKMRHD.TTF', 
                      width=2000,
                      height=1000,
                     # colormap='Blues'
                      background_color='white').generate_from_frequencies(wordCount)

# 표시하기
plt.figure(figsize=(12, 6))
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()

 

불필요한 단어나 조사 추가 제거

# 제외 대상 조사
del_word = ['for','But','into','So', 'which','by','as','With','am','was','when','who', 'an', 'has', 'in']

# 제외하기
for w in del_word:
    if w in wordCount:
        del wordCount[w]

 

워드 클라우드 그리기

# 워드 클라우드 만들기
wordcloud = WordCloud(font_path = 'C:/Windiws/fonts/HMKMRHD.TTF',
                      width=2000, 
                      height=1000, 
                      background_color='white').generate_from_frequencies(wordCount)

# 표시하기
plt.figure(figsize=(12, 6))
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()
728x90
728x90

데이터 전처리 가변수화] one-hot encoding, pd.get_dummies

one-hot encoding

 

- 원-핫 인코딩(One-Hot Encoding):

각 범주를 독립된 열로 나타내며, 해당 범주에 속하는 경우 1, 그렇지 않은 경우 0으로 표시

예를 들어, '색상'이라는 특성이 '빨강', '파랑', '초록' 세 가지 범주를 가질 때, 원-핫 인코딩은 이를 세 개의 열로 변환합니다 ('빨강', '파랑', '초록'). 각 열은 해당 색상이면 1, 아니면 0으로 표시됩니다.

 

- 가변수화(Dummy Variable Encoding):

원-핫 인코딩과 유사하지만, 범주 중 하나를 기준(기준 범주)으로 삼아 그 범주를 제외한 나머지 범주에 대해서만 열을 생성

이 방법은 다중공선성(multicollinearity) 문제를 방지하기 위해 사용되며, 통계 모델링에서 자주 사용

예를 들어, 위와 같은 '색상' 특성에 대해 가변수화를 적용할 때, '빨강'을 기준으로 삼으면 '파랑'과 '초록'에 대해서만 열이 생성

 

 

 

pd.get_dummies 함수를 사용하여 drop_first=True 옵션을 설정한 경우, 이는 원-핫 인코딩을 수행하되 첫 번째 범주를 제외한 가변수화(dummy variable encoding)에 해당

 

cat_cols = ['ShelveLoc', 'Education', 'US', 'Urban']
x = pd.get_dummies(x, columns = cat_cols, drop_first = True)

728x90
728x90

jupyter 마크다운 색 설정

# <span style="font-style:italic; font-weight:bold;font-family:serif; font-size:1.5em;line-height:1.5em;color:rgba(255, 87, 51, 0.5);">최대 팀원 수, 수상자 수, 일일 제출횟수를 조정하는 것은 참여자 수를 늘리는 데에 유효한가?</span>

- font-style : normal, italic, oblique
- fontweight : normal, bold, bolder, lighter
- font-family : snas-serif, serif, cursive, fantasy
- font-size : 1em, 0.5em, 1.5em
- line-height : 1em, 0.5em, 1.5em
- color = : orange, red, blue, rgba(255, 87, 51, 0.5),hsl(12, 100%, 60%)

 

 

728x90
728x90

범주형 feature -> 수치형 target

 

카이제곱 검정, ttest, ANOVA 검정에서의 p_value의 의미 

 

  t-검정

 

- 귀무가설 : 집단의 평균 간에 차이가 없을 것이다.

- p-value < 0.05 : 귀무 가설 기각, 집단 간의 평균에 유의미한 차이가 있다.

 

  카이제곱 검정

 

- 귀무가설 : 두 집단의 빈도 분포가 독립적이다.

- p-value < 0.05 : 귀무 가설 기각, 두 집단의 빈도 분포가 독립적이지 않을 것이다.

 

  ANOVA 

 

- 귀무가설 : 집단(세 개 이상)의 평균 간에 차이가 없을 것이다.

- p-value < 0.05 : 귀무 가설 기각, 집단 간의 평균에 유의미한 차이가 있다.

 

 

(1) Gender

plt.figure(figsize = (15,8))
sns.barplot(x='Gender', y='Score_diff_total', data = base_data)
plt.grid()
plt.show()

 

 

## 범주 데이터 확인 : value_counts()
base_data['Gender'].value_counts()

 

 

## 평균 분석 : ttest_ind

t_male = base_data.loc[base_data['Gender']=='M', 'Score_diff_total']
t_female = base_data.loc[base_data['Gender']=='F', 'Score_diff_total']

spst.ttest_ind(t_male, t_female)

 

 

3-2-2) 학습목표

 

# 그래프 분석 : barplot

plt.figure(figsize = (15,8))
sns.barplot(x='학습목표', y='Score_diff_total', data = base_data)
plt.grid()
plt.show()

 

 

## 범주 데이터 확인 : value_counts()
base_data['학습목표'].value_counts()

## 분산 분석 : f_oneway

anova_1 = base_data.loc[base_data['학습목표']=='승진', 'Score_diff_total']
anova_2 = base_data.loc[base_data['학습목표']=='자기계발', 'Score_diff_total']
anova_3 = base_data.loc[base_data['학습목표']=='취업', 'Score_diff_total']

spst.f_oneway(anova_1, anova_2, anova_3)

 

 

3-2-3) 학습방법

 

## 그래프 분석 : barplot

plt.figure(figsize = (15,8))
sns.barplot(x='학습방법', y='Score_diff_total', data = base_data)
plt.grid()
plt.show()

 

 

## 범주 데이터 확인 : value_counts()
base_data['학습방법'].value_counts()

 

 

## 분산 분석 : f_oneway

anova_1 = base_data.loc[base_data['학습방법']=='온라인강의', 'Score_diff_total']
anova_2 = base_data.loc[base_data['학습방법']=='오프라인강의', 'Score_diff_total']
anova_3 = base_data.loc[base_data['학습방법']=='참고서', 'Score_diff_total']

spst.f_oneway(anova_1, anova_2, anova_3)

 

 

  3-2-4) 강의 학습 교재 유형

 

## 그래프 분석 : barplot

plt.figure(figsize = (15,8))
sns.barplot(x='강의 학습 교재 유형', y='Score_diff_total', data = base_data)
plt.grid()
plt.show()

 

 

 

## 범주 데이터 확인 : value_counts()
base_data['강의 학습 교재 유형'].value_counts()

 

 

## 분산 분석 : f_oneway

anova_1 = base_data.loc[base_data['강의 학습 교재 유형']=='일반적인 영어 텍스트 기반 교재', 'Score_diff_total']
anova_2 = base_data.loc[base_data['강의 학습 교재 유형']=='영상 교재', 'Score_diff_total']
anova_3 = base_data.loc[base_data['강의 학습 교재 유형']=='뉴스/이슈 기반 교재', 'Score_diff_total']
anova_4 = base_data.loc[base_data['강의 학습 교재 유형']=='비즈니스 시뮬레이션(Role Play)', 'Score_diff_total']

spst.f_oneway(anova_1, anova_2, anova_3, anova_4)

 

 

 3-2-6) 취약분야 인지 여부

 

## 그래프 분석 : barplot

plt.figure(figsize = (15,8))
sns.barplot(x='취약분야 인지 여부', y='Score_diff_total', data = base_data)
plt.grid()
plt.show()

 

 

## 범주 데이터 확인 : value_counts()

base_data['취약분야 인지 여부'].value_counts()

 

## 평균 분석 : ttest_ind

t_yes = base_data.loc[base_data['취약분야 인지 여부']=='알고 있음', 'Score_diff_total']
t_no = base_data.loc[base_data['취약분야 인지 여부']=='알고 있지 않음', 'Score_diff_total']

spst.ttest_ind(t_yes, t_no)

 

 

728x90
728x90

피어슨 상관계수, regplot

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

import scipy.stats as spst   

target = '등록차량수'

for feature in analyze_features:

    print(f"[{feature}] 통계 분석 및 그래프 분석")

    # 통계 분석 : 통계 분석

    print("   ***** 통계 분석 *****")
    result = spst.pearsonr(data[feature], data[target])
    print(feature, " vs ", target, " 상관 분석: ", spst.pearsonr(data[feature], data[target]))
    
    if result[1] > 0.05:
        print(f"통계분석 결과 : {feature}는 등록차량수에 영향을 주지 않는다")
    else:
        print(f"통계분석 결과 : {feature}는 등록차량수에 영향을 준다")

    # 그래프 분석 : regplot

    # plt.figure(figsize = (12,8))
    print("   ***** 그래프 분석 *****")
    sns.regplot(x = feature, y= target, data = data)
    plt.grid()
    plt.show()
    
    print("")
    print("-"*50)

 

 

heatmap

 

## 각 컬럼간 상관계수에 대한 heatmap 그래프 분석

plt.figure(figsize = (20,12))
sns.heatmap(data[col_num].corr(),cmap="PiYG", annot=True)
plt.show()

 

728x90
728x90

시각화 matplotlib] plt.bar, plt.barh

 

plt.bar

 

import matplotlib.pyplot as plt
%config InlineBackend.figure_format='retina'

plt.figure(figsize=(6,4))
plt.bar(x=tmp['AgeGrp'], height=tmp['Survived'])
plt.xlabel('AgeGrp')
plt.ylabel('Survived')
plt.ylim(0,1)
plt.show()

 

 

plt.bar, plt.xticks(rotation = 숫자)

 

plt.figure(figsize = [20,15])
plt.bar(x = df_participate['월별'], height = df_participate['참가자 수'])
plt.xticks(rotation =45 )
plt.show()

 

plt.barh

 

gongong

 

 

import pandas as pd
import matplotlib.pyplot as plt
gongong = pd.read_csv('한국건강가정진흥원_다문화가족 이중언어코치 지역별 현황_20220831.csv', encoding = 'CP949')

# 한글 폰트를 설정하자
plt.rc('font', family='Malgun Gothic') # For Windows
plt.rc('axes', unicode_minus=False)
plt.rcParams['font.family']

# 인덱스가 한글이기 때문에 가로 막대로 출력하는 것이 더 가시적이다.
plt.barh(y=gongong['지역'].astype(str), width = gongong['합계 : 이중언어코치 인원(명)'], color = ['C4'], alpha = 0.7, 
         label = ' 인원(명)')
plt.xticks(list(range(0,21,2)))
plt.title('이중언어코치의 수')


plt.legend()
plt.show()

 

 

728x90

+ Recent posts