Categories PHP-MySQL

Viết hàm thông báo giá trị hiếm gặp trong bảng dữ liệu về năm sinh

Giá trị biệt lệ trong dữ liệu thường là giá trị cực đoan cả ở 2 khía cạnh tích cực và tiêu cực:

  • Nếu nó là thật, nó sẽ tiết lộ cho chúng ta thấy nhiều cái thú vị ở đời;
  • Nhưng trường hợp thứ hai cũng rất dễ xảy ra: giá trị quá khác biệt cũng thường là dữ liệu không chính xác;

Trong bài viết này, tôi sẽ viết hàm thống kê số lần lặp lại của năm sinh nào đó. Điều này sẽ cho chúng ta cái nhìn tổng quan về phổ phân tán dữ liệu trong một tệp dữ liệu lớn về năm sinh.

Mấy hàm PHP quan trọng được sử dụng đó là:

  • array_count_values để nhóm các dữ liệu giống nhau và đếm số lượng của nó;
  • Hàm thứ hai là sắp xếp mảng theo thứ tự value tăng dần (asort) hoặc giảm dần (arsort);
  • Trong trường hợp dữ liệu quá nhiều, khó quan sát, bạn có thể dùng thêm hàm array_slice để lựa chọn số lượng phần tử trong mảng mà bạn muốn, ví dụ array_slice ($m, 0, 50), sẽ lấy 50 phân tử, và nếu kết hợp với việc sắp xếp nữa thì dữ liệu sẽ dễ quan sát hơn nhiều.

Dữ liệu đầu vào là năm sinh đã được chuẩn hóa theo cấu trúc dd/mm/yyyy hoặc kể cả dữ liệu năm sinh chưa được chuẩn hóa nhưng việc tách năm được thực hiện chính xác.

Ví dụ đoạn mã mẫu của tôi:

    require 'database.php'; // tai database
    set_time_limit(600); // 10 phut, trong trường hợp phải tính toán nhiều 
   
    $query2="SELECT ngaythangnam FROM hoten"; // lấy thông tin ngày tháng năm từ cột ngaythangnam trong bảng họ tên
    $result2=$db->query($query2); 
    
    $arr2=array(); $i=0; //tạo mảng
    
    foreach ($result2 as $value2) {
        $ntn=$value2['ngay']; // lấy năm sinh
        
       $rea = '/^(0?[1-9]|[12]\d|3[01])[\/\-\.](0?[1-9]|[1][012])[\/\-\.](\d{2}|\d{4})$/';
       $kq=preg_match($rea, $ntn); // kiểm tra nhanh xem có khớp với mẫu chuẩn hay chưa
    
    if ($kq==1) {
        $exp=explode("/", $ntn); // tách dữ liệu ngày/tháng/năm thành 3 phần dựa trên dấu phân cách /
        
        $ns=$exp[2];
        $arr2[$i]=(int)$ns;
        $i++;
    ;}}
    
$m=array_count_values($arr2); // đếm các giá trị lặp lại và đưa vào mảng, nó có dạng key=>value, trong đó key là tên phần tử lặp lại, value chỉ số lần lặp lại
asort($m); // để sắp xếp theo thứ tự giảm dần, các phần tử ngoại lệ sẽ được nhìn thấy trước

foreach($m as $x => $x_value) { // xuất ra màn hình
echo "Năm: ".$x." Có số lần lặp lại là ".$x_value;
echo "</br>";
}

Kết quả xuất ra màn hình từ tệp dữ liệu của tôi nó như thế này:

Năm: 1900 Có số lần lặp lại là 1
Năm: 2207 Có số lần lặp lại là 1
Năm: 2209 Có số lần lặp lại là 1
Năm: 2014 Có số lần lặp lại là 1
Năm: 2100 Có số lần lặp lại là 1
Năm: 2208 Có số lần lặp lại là 1
Năm: 1997 Có số lần lặp lại là 1
Năm: 2099 Có số lần lặp lại là 1
Năm: 2088 Có số lần lặp lại là 1
Năm: 2002 Có số lần lặp lại là 2
Năm: 2012 Có số lần lặp lại là 2
Năm: 2000 Có số lần lặp lại là 3
Năm: 2013 Có số lần lặp lại là 3
Năm: 2015 Có số lần lặp lại là 3
Năm: 2018 Có số lần lặp lại là 4
Năm: 2003 Có số lần lặp lại là 11
Năm: 2001 Có số lần lặp lại là 13
Năm: 2016 Có số lần lặp lại là 22
Năm: 2004 Có số lần lặp lại là 73
Năm: 2017 Có số lần lặp lại là 73
Năm: 2005 Có số lần lặp lại là 310
Năm: 2006 Có số lần lặp lại là 1338
Năm: 2010 Có số lần lặp lại là 40733
Năm: 2007 Có số lần lặp lại là 47324
Năm: 2008 Có số lần lặp lại là 50059
Năm: 2009 Có số lần lặp lại là 51650
Năm: 2011 Có số lần lặp lại là 52201

Bạn cũng dễ dàng nhận ra sự tồn tại của các năm sinh sai đúng không?

Back to Top