판다와의 고급 랭글링

토마스 보젠, 2020년 9월

이 연습은 9장을 보완합니다.

연습

1.

이 연습 연습 세트에서는 정보는 아름답다에서 수집 및 컴파일된 실제 비밀번호(실제 데이터 유출에서 사용 가능)로 구성된 멋진 데이터세트를 살펴보겠습니다. R의 Tidy Tuesday 프로젝트. 이러한 비밀번호는 사용을 피해야 하는 일반적인(“잘못된”) 비밀번호입니다! 하지만 우리는 이 데이터 세트를 사용하여 정규식 기술을 연습할 것입니다.

’pd’라는 별칭을 사용하여 팬더를 가져오는 것부터 시작해 보겠습니다.

# Your answer here.

2.

데이터세트에는 다음과 같은 열이 있습니다.

변수 클래스 설명
순위 정수 공개된 비밀번호 데이터베이스의 인기도
비밀번호 str 비밀번호의 실제 텍스트
범주 str 비밀번호는 어떤 카테고리에 속하나요?
부동 소수점 온라인 추측으로 문제를 풀 시간
time_unit str 값과 일치시킬 시간 단위
offline_crack_sec 플로트 단 몇 초 만에 오프라인 크랙 완료
순위_alt 정수 2위
강도 정수 강도 = 비밀번호 품질은 10이 가장 높고 1이 가장 낮습니다. 이는 일반적으로 잘못된 비밀번호와 관련이 있다는 점에 유의하세요.
글꼴_크기 정수 KIB용 그래픽을 만드는 데 사용됨

이 연습에서는 password, valuetime_unit 열에만 관심이 있으므로 이 두 열만 다음 URL에서 df라는 데이터 프레임으로 가져옵니다: https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-01-14/passwords.csv

# Your answer here.

3.

온라인 비밀번호 공격은 누군가가 귀하의 계정에 액세스하기 위해 매우 많은 수의 사용자 이름/비밀번호 조합을 시도하여 귀하의 계정을 해킹하려고 시도하는 것입니다. 데이터세트의 각 ‘비밀번호’에 대해 ’값’ 열에는 ‘온라인 비밀번호 공격’으로 계정을 해킹하는 데 걸리는 예상 시간이 표시됩니다. ’time_unit’ 열에는 해당 시간 값의 단위(예: 시간, 일, 연도 등)가 표시됩니다.

각 비밀번호에 대한 “온라인 비밀번호 추측 시간”을 더 쉽게 비교할 수 있도록 ’값’이 동일한 단위이면 훨씬 더 좋을 것입니다. 따라서 첫 번째 작업은 모든 값을 시간 단위로 변환하는 것입니다(아래에 제공한 변환 단위를 가정합니다. 예를 들어 1일은 24시간, 1주는 168시간 등).

units = {
    "seconds": 1 / 3600,
    "minutes": 1 / 60,
    "days": 24,
    "weeks": 168,
    "months": 720,
    "years": 8760,
}
# Your answer here.

4.

’123’으로 시작하는 비밀번호는 몇 개입니까?

# Your answer here.

5.

’123’으로 시작하는 비밀번호를 해독하는 데 필요한 평균 시간(시간)은 얼마입니까? 이는 데이터 세트에 있는 모든 비밀번호의 평균과 어떻게 비교됩니까?

# Your answer here.

6.

숫자가 포함되지 않은 비밀번호는 몇 개입니까?

# Your answer here.

7.

숫자가 하나 이상 포함된 비밀번호는 몇 개입니까?

# Your answer here.

8.

숫자가 포함되지 않은 비밀번호와 하나 이상의 숫자가 포함된 비밀번호 사이에 온라인 크래킹 시간에 뚜렷한 차이가 있습니까?

# Your answer here.

9.

다음 구두점 [.!?\\-] 중 하나 이상을 포함하는 비밀번호는 몇 개입니까? (힌트: 이 데이터 세트에는 약한 비밀번호가 포함되어 있다는 것을 기억하세요…)

# Your answer here.

10.

데이터 세트에서 온라인 추측을 통해 해독하는 데 가장 짧은 시간이 걸린 비밀번호는 무엇입니까? 어느 것이 가장 오래 걸렸나요?

# Your answer here.



솔루션

1.

이 연습 연습 세트에서는 정보는 아름답다에서 수집 및 컴파일된 실제 비밀번호(실제 데이터 유출에서 사용 가능)로 구성된 멋진 데이터세트를 살펴보겠습니다. R의 Tidy Tuesday 프로젝트. 이러한 비밀번호는 사용을 피해야 하는 일반적인(“잘못된”) 비밀번호입니다! 하지만 우리는 이 데이터 세트를 사용하여 정규식 기술을 연습할 것입니다.

’pd’라는 별칭을 사용하여 팬더를 가져오는 것부터 시작해 보겠습니다.

import pandas as pd

2.

데이터세트에는 다음과 같은 열이 있습니다.

변수 클래스 설명
순위 정수 공개된 비밀번호 데이터베이스의 인기도
비밀번호 str 비밀번호의 실제 텍스트
범주 str 비밀번호는 어떤 카테고리에 속하나요?
부동 소수점 온라인 추측으로 문제를 풀 시간
time_unit str 값과 일치시킬 시간 단위
offline_crack_sec 플로트 단 몇 초 만에 오프라인 크랙 완료
순위_alt 정수 2위
강도 정수 강도 = 비밀번호 품질은 10이 가장 높고 1이 가장 낮습니다. 이는 일반적으로 잘못된 비밀번호와 관련이 있다는 점에 유의하세요.
글꼴_크기 정수 KIB용 그래픽을 만드는 데 사용됨

이 연습에서는 password, valuetime_unit 열에만 관심이 있으므로 이 두 열만 다음 URL에서 df라는 데이터 프레임으로 가져옵니다: https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-01-14/passwords.csv

df = pd.read_csv(
    "https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-01-14/passwords.csv",
    usecols=["password", "value", "time_unit"],
    skipfooter=7,
    engine="python",
)
df.head()
password value time_unit
0 password 6.91 years
1 123456 18.52 minutes
2 12345678 1.29 days
3 1234 11.11 seconds
4 qwerty 3.72 days

3.

온라인 비밀번호 공격은 누군가가 귀하의 계정에 액세스하기 위해 매우 많은 수의 사용자 이름/비밀번호 조합을 시도하여 귀하의 계정을 해킹하려고 시도하는 것입니다. 데이터세트의 각 ‘비밀번호’에 대해 ’값’ 열에는 ‘온라인 비밀번호 공격’으로 계정을 해킹하는 데 걸리는 예상 시간이 표시됩니다. ’time_unit’ 열에는 해당 시간 값의 단위(예: 시간, 일, 연도 등)가 표시됩니다.

각 비밀번호에 대한 “온라인 비밀번호 추측 시간”을 더 쉽게 비교할 수 있도록 ’값’이 동일한 단위이면 훨씬 더 좋을 것입니다. 따라서 첫 번째 작업은 모든 값을 시간 단위로 변환하는 것입니다(아래에 제공한 변환 단위를 가정합니다. 예를 들어 1일은 24시간, 1주는 168시간 등).

units = {
    "seconds": 1 / 3600,
    "minutes": 1 / 60,
    "days": 24,
    "weeks": 168,
    "months": 720,
    "years": 8760,
}

for key, val in units.items():
    df.loc[df["time_unit"] == key, "value"] *= val

df["time_unit"] = "hours"
df.head()
password value time_unit
0 password 60531.600000 hours
1 123456 0.308667 hours
2 12345678 30.960000 hours
3 1234 0.003086 hours
4 qwerty 89.280000 hours

4.

’123’으로 시작하는 비밀번호는 몇 개입니까?

df["password"].str.contains(r"^123").sum()
9

5.

’123’으로 시작하는 비밀번호를 해독하는 데 필요한 평균 시간(시간)은 얼마입니까? 이는 데이터 세트에 있는 모든 비밀번호의 평균과 어떻게 비교됩니까?

print(
    f"Avg. time to crack passwords beginning with 123: {df[df['password'].str.contains(r'^123')]['value'].mean():.0f} hrs"
)
print(f"Avg. time to crack for all passwords in dataset: {df['value'].mean():.0f} hrs")
Avg. time to crack passwords beginning with 123: 107 hrs
Avg. time to crack for all passwords in dataset: 13918 hrs

6.

숫자가 포함되지 않은 비밀번호는 몇 개입니까?

df[df["password"].str.contains(r"^[^0-9]*$")].head()
password value time_unit
0 password 60531.60 hours
4 qwerty 89.28 hours
6 dragon 89.28 hours
7 baseball 60531.60 hours
8 football 60531.60 hours

7.

숫자가 하나 이상 포함된 비밀번호는 몇 개입니까?

df[df["password"].str.contains(r".*[0-9].*")].head()
password value time_unit
1 123456 0.308667 hours
2 12345678 30.960000 hours
3 1234 0.003086 hours
5 12345 0.030833 hours
11 696969 0.308667 hours

8.

숫자가 포함되지 않은 비밀번호와 하나 이상의 숫자가 포함된 비밀번호 사이에 온라인 크래킹 시간에 뚜렷한 차이가 있습니까?

print(
    f"        Avg. time to crack passwords without a number: {df[df['password'].str.contains(r'^[^0-9]*$')]['value'].mean():.0f} hrs"
)
print(
    f"Avg. time to crack passwords with at least one number: {df[df['password'].str.contains(r'.*[0-9].*')]['value'].mean():.0f} hrs"
)
        Avg. time to crack passwords without a number: 8095 hrs
Avg. time to crack passwords with at least one number: 62005 hrs

9.

다음 구두점 [.!?\\-] 중 하나 이상을 포함하는 비밀번호는 몇 개입니까? (힌트: 이 데이터 세트에는 약한 비밀번호가 포함되어 있다는 것을 기억하세요…)

df[df["password"].str.contains(r"[.!?\\-]")]
password value time_unit

10.

데이터 세트에서 온라인 추측을 통해 해독하는 데 가장 짧은 시간이 걸린 비밀번호는 무엇입니까? 어느 것이 가장 오래 걸렸나요?

df.query("value == value.min()")
password value time_unit
3 1234 0.003086 hours
19 2000 0.003086 hours
44 6969 0.003086 hours
76 1111 0.003086 hours
276 5150 0.003086 hours
314 2112 0.003086 hours
315 1212 0.003086 hours
324 7777 0.003086 hours
371 2222 0.003086 hours
373 4444 0.003086 hours
429 1313 0.003086 hours
df.query("value == value.max()")
password value time_unit
25 trustno1 808285.2 hours
335 rush2112 808285.2 hours
405 jordan23 808285.2 hours
499 passw0rd 808285.2 hours